华西海圻ELN前端工程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

290 lines
9.0 KiB

3 months ago
  1. <template>
  2. <div class="template-table">
  3. <component ref="templateComponent" :sn="sn" :is="getTemplateComponent()" :templateData="templateData"
  4. :fillType="fillType">
  5. </component>
  6. <SubPackageDialog ref="subPackageDialogRef"></SubPackageDialog>
  7. <TagPrintDialog ref="tagPrintDialogRef"></TagPrintDialog>
  8. <SelectReagentDialog ref="selectReagentDialogRef" />
  9. <SelectInstrumentDialog ref="selectInstrumentDialogRef" />
  10. <SelectMixReagentDialog ref="selectMixReagentDialogRef" />
  11. <EditSign ref="editSignRef" @cancel="handleEditSignCancel" @callback="handleEditSignCallback" />
  12. </div>
  13. </template>
  14. <script>
  15. import { EventBus } from "@/utils/eventBus";
  16. import { debounce } from 'lodash-es'
  17. import SubPackageDialog from "./dialog/SubPackageDialog.vue";//分装弹窗
  18. import TagPrintDialog from "./dialog/PrintTagDialog.vue";//标签打印弹窗
  19. import SelectReagentDialog from "./dialog/SelectReagentDialog.vue";//选择试剂弹窗
  20. import SelectInstrumentDialog from "./dialog/SelectInstrumentDialog.vue";//选择仪器弹窗
  21. import SelectMixReagentDialog from "./dialog/SelectMixReagentDialog.vue";//选择试剂/供试品/给药制剂弹窗
  22. import EditSign from "./dialog/EditSign.vue";//电子签名弹窗
  23. //色谱
  24. import SP001 from "./comps/sp/SP001.vue";
  25. import SP002 from "./comps/sp/SP002.vue";
  26. import SP003 from "./comps/sp/SP003.vue";
  27. import SP00456 from "./comps/sp/SP00456.vue";
  28. import SP007 from "./comps/sp/SP007.vue";
  29. //色谱生物样品分析方法学样品制备表-10个类似
  30. import SP008 from "./comps/sp/SWYPFXFFXYPZBB/SP008.vue";
  31. import SP009 from "./comps/sp/SWYPFXFFXYPZBB/SP009.vue";
  32. import SP010 from "./comps/sp/SWYPFXFFXYPZBB/SP010.vue";
  33. import SP011 from "./comps/sp/SWYPFXFFXYPZBB/SP011.vue";
  34. import SP012 from "./comps/sp/SWYPFXFFXYPZBB/SP012.vue";
  35. import SP013 from "./comps/sp/SWYPFXFFXYPZBB/SP013.vue";
  36. import SP014 from "./comps/sp/SWYPFXFFXYPZBB/SP014.vue";
  37. import SP015 from "./comps/sp/SWYPFXFFXYPZBB/SP015.vue";
  38. import SP016 from "./comps/sp/SWYPFXFFXYPZBB/SP016.vue";
  39. import SP017 from "./comps/sp/SWYPFXFFXYPZBB/SP017.vue";
  40. import SP018 from "./comps/sp/SWYPFXFFXYPZBB/SP018.vue";
  41. import Demo from "./comps/sp/Demo.vue";
  42. //供试品
  43. import SYWZPZJHB from "./comps/gsp/SYWZPZJHB.vue";
  44. import MJYLQSQD from "./comps/gsp/MJYLQSQD.vue";
  45. // PCR
  46. import PCR001 from "./comps/pcr/PCR001.vue";
  47. import PCR002 from "./comps/pcr/PCR002.vue";
  48. export default {
  49. name: "TemplateTable",
  50. components: {
  51. Demo,
  52. SubPackageDialog, TagPrintDialog, SelectReagentDialog, SelectInstrumentDialog, SelectMixReagentDialog, EditSign,
  53. //供试品
  54. MJYLQSQD, SYWZPZJHB,
  55. //色谱
  56. SP001, SP002, SP003, SP00456,SP007, SP008, SP009, SP010, SP011, SP012, SP013, SP014, SP015, SP016, SP017, SP018,
  57. // PCR
  58. PCR001, PCR002
  59. },
  60. props: {
  61. sn: {
  62. type: String,
  63. default: '',
  64. },
  65. fillType: {
  66. type: String,
  67. default: 'preFill',
  68. },
  69. templateData: {
  70. type: Object,
  71. default: () => { },
  72. },
  73. emitName: {
  74. type: String,
  75. default: 'onModifyRecord',
  76. },
  77. },
  78. computed: {
  79. templateComponentMap() {
  80. if (!this.componentMap) {
  81. this.componentMap = {
  82. //色谱
  83. 'SP001': 'SP001',
  84. 'SP002': 'SP002',
  85. 'SP003': 'SP003',
  86. 'SP004': 'SP00456',
  87. 'SP005': 'SP00456',
  88. 'SP006': 'SP00456',
  89. 'SP007': 'SP007',
  90. 'SP008': 'SP008',
  91. 'SP009': 'SP009',
  92. 'SP010': 'SP010',
  93. 'SP011': 'SP011',
  94. 'SP012': 'SP012',
  95. 'SP013': 'SP013',
  96. 'SP014': 'SP014',
  97. 'SP015': 'SP015',
  98. 'SP016': 'SP016',
  99. 'SP017': 'SP017',
  100. 'SP018': 'SP018',
  101. //供试品
  102. 'SYWZPZJHB': 'SYWZPZJHB',
  103. 'MJYLQSQD': 'MJYLQSQD',
  104. //PCR
  105. 'PCR001': 'PCR001',
  106. 'PCR002': 'PCR002'
  107. }
  108. }
  109. return this.componentMap || "Demo"
  110. }
  111. },
  112. watch: {
  113. sn: {
  114. immediate: true,
  115. handler(v) {
  116. console.log(v, "sn")
  117. }
  118. },
  119. templateData: {
  120. immediate: true,
  121. deep: true,
  122. handler(v) {
  123. if (v) {
  124. if (v.zdxgjl) {
  125. this.zdxgjl = JSON.parse(v.zdxgjl) || [];
  126. }
  127. if (v.fhyjjl) {
  128. this.fhyjjl = JSON.parse(v.fhyjjl) || [];
  129. }
  130. if (v.zdgxjl) {
  131. this.fieldCheckObj = JSON.parse(v.zdgxjl) || {};
  132. }
  133. }
  134. }
  135. }
  136. },
  137. provide() {
  138. return {
  139. //分发给子组件的fillType
  140. templateData: this.templateData,
  141. templateFillType: this.fillType,
  142. getZdxgjl: () => this.zdxgjl,
  143. getFhyjjl: () => this.fhyjjl,
  144. getFieldCheckObj: () => this.fieldCheckObj,
  145. //更新提交记录
  146. updateZdxgjl: (data) => {
  147. this.zdxgjl.unshift(data);
  148. },
  149. //更新复核意见记录
  150. updateFhyjjl: (data) => {
  151. this.fhyjjl.unshift(data);
  152. },
  153. //替换复核意见记录
  154. replaceFhyjjl: (data) => {
  155. this.fhyjjl = data;
  156. },
  157. //更新字段检查对象
  158. updateFieldCheckObj: (data) => {
  159. this.fieldCheckObj = { ...this.fieldCheckObj, ...data };
  160. },
  161. }
  162. },
  163. data() {
  164. return {
  165. info: {},
  166. zdxgjl: [],
  167. fhyjjl: [],
  168. fieldCheckObj: {},
  169. currentEditSignUuid: null, // 当前请求EditSign的HandleFormItem的uuid
  170. latestParams: {},//用于存储最新的params
  171. hasCustomTable: false,//是否有自定义表格
  172. };
  173. },
  174. created() {
  175. this.debouncedEmit = debounce(this.emitToParent, 100)
  176. },
  177. mounted() {
  178. EventBus.$on('onModifyRecord', this.handleModyfyRecord);
  179. //分装弹窗
  180. EventBus.$on("showSubPackageDialog", (data) => {
  181. this.$refs.subPackageDialogRef.show(data)
  182. })
  183. //标签打印弹窗
  184. EventBus.$on("showTagPrintDialog", (data) => {
  185. this.$refs.tagPrintDialogRef.show(data)
  186. })
  187. //选择仪器弹窗
  188. EventBus.$on("showSelectInstrumentDialog", (data) => {
  189. this.$refs.selectInstrumentDialogRef.show(data.studyFormId, data)
  190. })
  191. //选择试剂弹窗
  192. EventBus.$on("showSelectReagentDialog", (data) => {
  193. this.$refs.selectReagentDialogRef.show(data.studyFormId, data)
  194. })
  195. //选择试剂/供试品/给药制剂弹窗
  196. EventBus.$on("showSelectMixReagentDialog", (data) => {
  197. this.$refs.selectMixReagentDialogRef.show(data.studyFormId, data)
  198. })
  199. //显示电子签名弹窗
  200. EventBus.$on("showEditSignDialog", (data) => {
  201. this.currentEditSignUuid = data.uuid;
  202. this.$refs.editSignRef.show();
  203. })
  204. },
  205. beforeDestroy() {
  206. // 记得移除监听,避免内存泄漏
  207. EventBus.$off('onModifyRecord');
  208. EventBus.$off("showSubPackageDialog");
  209. EventBus.$off("showTagPrintDialog");
  210. EventBus.$off("showSelectReagentDialog");
  211. EventBus.$off("showSelectInstrumentDialog");
  212. EventBus.$off("showSelectMixReagentDialog");
  213. EventBus.$off("showEditSignDialog");
  214. this.debouncedEmit.cancel()
  215. },
  216. methods: {
  217. handleModyfyRecord(data) {
  218. const { source } = data;
  219. if (source === "customTable") {
  220. this.latestParams = data;
  221. // delete this.latestParams.source
  222. this.hasCustomTable = true
  223. // 取消之前的等待
  224. this.debouncedEmit.cancel()
  225. this.emitToParent()
  226. }else if(!source && !this.hasCustomTable){
  227. this.latestParams = data
  228. this.debouncedEmit()
  229. }
  230. },
  231. emitToParent() {
  232. if (this.latestParams) {
  233. console.log(this.latestParams,"this.latestParams")
  234. this.$emit(this.emitName, this.latestParams)
  235. }
  236. },
  237. // 处理电子签名取消事件
  238. handleEditSignCancel() {
  239. if (this.currentEditSignUuid) {
  240. EventBus.$emit('onEditSignCancel', { uuid: this.currentEditSignUuid });
  241. EventBus.$emit('onFormEditSignCancel', { uuid: this.currentEditSignUuid });
  242. this.currentEditSignUuid = null;
  243. }
  244. },
  245. // 处理电子签名确认回调事件
  246. handleEditSignCallback(data) {
  247. if (this.currentEditSignUuid) {
  248. EventBus.$emit('onEditSignCallback', { uuid: this.currentEditSignUuid, data });
  249. this.currentEditSignUuid = null;
  250. }
  251. },
  252. async getFormData() {
  253. if (this.fillType === "actFill") {
  254. //检查是否有未填写的复核意见
  255. const flag = this.fhyjjl.every((item) => !!item.content && !!item.reply)
  256. console.log(this.fhyjjl, flag, "flag")
  257. if (!flag) {
  258. this.$message.error("疑问项还未回复,请回复后再提交");
  259. return;
  260. }
  261. }
  262. return await this.$refs.templateComponent.getFormData();
  263. },
  264. getResource() {
  265. return this.$refs.templateComponent.getResource();
  266. },
  267. getYqResource() {
  268. return this.$refs.templateComponent.getYqResource();
  269. },
  270. getFilledFormData() {
  271. return this.$refs.templateComponent.getFilledFormData();
  272. },
  273. getTemplateComponent() {
  274. return this.templateComponentMap[this.sn]
  275. },
  276. }
  277. };
  278. </script>
  279. <style rel="stylesheet/scss" lang="scss">
  280. .template-table {
  281. background: #fff;
  282. padding: 10px 10px;
  283. width: 100%;
  284. }
  285. </style>