华西海圻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.

358 lines
11 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 SP003 from "./comps/sp/SP003.vue";
  26. import SP00456 from "./comps/sp/SP00456.vue";
  27. import SP007 from "./comps/sp/SP007.vue";
  28. //色谱生物样品分析方法学样品制备表-10个类似
  29. import SP008 from "./comps/sp/SWYPFXFFXYPZBB/SP008.vue";
  30. import SP009 from "./comps/sp/SWYPFXFFXYPZBB/SP009.vue";
  31. import SP010 from "./comps/sp/SWYPFXFFXYPZBB/SP010.vue";
  32. import SP011 from "./comps/sp/SWYPFXFFXYPZBB/SP011.vue";
  33. import SP012 from "./comps/sp/SWYPFXFFXYPZBB/SP012.vue";
  34. import SP013 from "./comps/sp/SWYPFXFFXYPZBB/SP013.vue";
  35. import SP014 from "./comps/sp/SWYPFXFFXYPZBB/SP014.vue";
  36. import SP015 from "./comps/sp/SWYPFXFFXYPZBB/SP015.vue";
  37. import SP016 from "./comps/sp/SWYPFXFFXYPZBB/SP016.vue";
  38. import SP017 from "./comps/sp/SWYPFXFFXYPZBB/SP017.vue";
  39. import SP018 from "./comps/sp/SWYPFXFFXYPZBB/SP018.vue";
  40. import Demo from "./comps/sp/Demo.vue";
  41. //供试品
  42. import GSP002 from "./comps/gsp/GSP002.vue";
  43. import GSP003 from "./comps/gsp/GSP003.vue";
  44. import GSP004 from "./comps/gsp/GSP004.vue";
  45. import GSP010 from "./comps/gsp/GSP010.vue";
  46. //试验物质配制计划表/麻精药领取申请单/毒麻药品配制记录表
  47. import SYWZPZJHB from "./comps/gsp/SYWZPZJHB.vue";
  48. import MJYLQSQD from "./comps/gsp/MJYLQSQD.vue";
  49. import DMYPPZJLB from "./comps/gsp/DMYPPZJLB.vue";
  50. // PCR
  51. //PCR001-使用SP001
  52. import PCR002 from "./comps/pcr/PCR002.vue";
  53. import PCR003 from "./comps/pcr/PCR003.vue";
  54. import PCR004 from "./comps/pcr/PCR004.vue";
  55. //LBA
  56. // LBA001-使用SP001
  57. import LBA002 from "./comps/lba/LBA002.vue";
  58. import LBA003 from "./comps/lba/LBA003.vue";
  59. import LBA004 from "./comps/lba/LBA004.vue";
  60. import LBA006 from "./comps/lba/LBA006.vue";
  61. //ADA
  62. // ADA001-使用SP001
  63. // ADA002-使用LBA002
  64. // ADA003-使用LBA003
  65. // ADA004-使用LBA004
  66. // ADA006-使用LBA006
  67. //样品
  68. // YP001-使用SP001
  69. export default {
  70. name: "TemplateTable",
  71. components: {
  72. Demo,
  73. SubPackageDialog, TagPrintDialog, SelectReagentDialog, SelectInstrumentDialog, SelectMixReagentDialog, EditSign,
  74. //试验物质配制计划表/麻精药领取申请单/毒麻药品配制记录表
  75. MJYLQSQD, SYWZPZJHB, DMYPPZJLB,
  76. //供试品
  77. GSP002, GSP003, GSP004, GSP010,
  78. //色谱
  79. SP001, SP003, SP00456,SP007, SP008, SP009, SP010, SP011, SP012, SP013, SP014, SP015, SP016, SP017, SP018,
  80. // PCR
  81. PCR002,
  82. //LBA
  83. LBA002,
  84. LBA003,
  85. LBA004,
  86. LBA006
  87. },
  88. props: {
  89. sn: {
  90. type: String,
  91. default: '',
  92. },
  93. fillType: {
  94. type: String,
  95. default: 'preFill',
  96. },
  97. templateData: {
  98. type: Object,
  99. default: () => { },
  100. },
  101. emitName: {
  102. type: String,
  103. default: 'onModifyRecord',
  104. },
  105. },
  106. computed: {
  107. templateComponentMap() {
  108. if (!this.componentMap) {
  109. this.componentMap = {
  110. //色谱
  111. 'SP001': 'SP001',
  112. 'SP002': 'SP001',
  113. 'SP003': 'SP003',
  114. 'SP004': 'SP00456',
  115. 'SP005': 'SP00456',
  116. 'SP006': 'SP00456',
  117. 'SP007': 'SP007',
  118. 'SP008': 'SP008',
  119. 'SP009': 'SP009',
  120. 'SP010': 'SP010',
  121. 'SP011': 'SP011',
  122. 'SP012': 'SP012',
  123. 'SP013': 'SP013',
  124. 'SP014': 'SP014',
  125. 'SP015': 'SP015',
  126. 'SP016': 'SP016',
  127. 'SP017': 'SP017',
  128. 'SP018': 'SP018',
  129. //供试品
  130. 'GSP001': 'DMYPPZJLB',
  131. 'GSP002': 'GSP002',
  132. 'GSP003': 'GSP003',
  133. 'GSP004': 'GSP004',
  134. 'GSP006': 'GSP002',
  135. 'GSP008': 'GSP002',
  136. 'GSP010': 'GSP010',
  137. 'GSP012': 'GSP002',
  138. 'GSP013': 'GSP002',
  139. 'GSP014': 'GSP002',
  140. //试验物质配制计划表/麻精药领取申请单/毒麻药品配制记录表
  141. 'SYWZPZJHB': 'SYWZPZJHB',
  142. 'MJYLQSQD': 'MJYLQSQD',
  143. 'DMYPPZJLB': 'DMYPPZJLB',
  144. //PCR
  145. 'PCR001': 'SP001',
  146. 'PCR002': 'PCR002',
  147. 'PCR003': 'PCR003',
  148. 'PCR004': 'PCR004',
  149. //LBA
  150. 'LBA001': 'SP001',
  151. 'LBA002': 'LBA002',
  152. 'LBA003': 'LBA003',
  153. 'LBA004': 'LBA004',
  154. 'LBA006': 'LBA006',
  155. //ADA
  156. 'ADA001': 'SP001',
  157. 'ADA002': 'LBA002',
  158. 'ADA003': 'LBA003',
  159. 'ADA004': 'LBA004',
  160. 'ADA006': 'LBA006',
  161. //样品
  162. 'YP001': 'SP001',
  163. }
  164. }
  165. return this.componentMap || "Demo"
  166. }
  167. },
  168. watch: {
  169. sn: {
  170. immediate: true,
  171. handler(v) {
  172. console.log(v, "sn")
  173. }
  174. },
  175. templateData: {
  176. immediate: true,
  177. deep: true,
  178. handler(v) {
  179. if (v) {
  180. if (v.zdxgjl) {
  181. this.zdxgjl = JSON.parse(v.zdxgjl) || [];
  182. }
  183. if (v.fhyjjl) {
  184. this.fhyjjl = JSON.parse(v.fhyjjl) || [];
  185. }
  186. if (v.zdgxjl) {
  187. this.fieldCheckObj = JSON.parse(v.zdgxjl) || {};
  188. }
  189. }
  190. }
  191. }
  192. },
  193. provide() {
  194. return {
  195. //分发给子组件的fillType
  196. templateData: this.templateData,
  197. templateFillType: this.fillType,
  198. getZdxgjl: () => this.zdxgjl,
  199. getFhyjjl: () => this.fhyjjl,
  200. getFieldCheckObj: () => this.fieldCheckObj,
  201. //更新提交记录
  202. updateZdxgjl: (data) => {
  203. this.zdxgjl.unshift(data);
  204. },
  205. //更新复核意见记录
  206. updateFhyjjl: (data) => {
  207. this.fhyjjl.unshift(data);
  208. },
  209. //替换复核意见记录
  210. replaceFhyjjl: (data) => {
  211. this.fhyjjl = data;
  212. },
  213. //更新字段检查对象
  214. updateFieldCheckObj: (data) => {
  215. this.fieldCheckObj = { ...this.fieldCheckObj, ...data };
  216. },
  217. }
  218. },
  219. data() {
  220. return {
  221. info: {},
  222. zdxgjl: [],
  223. fhyjjl: [],
  224. fieldCheckObj: {},
  225. currentEditSignUuid: null, // 当前请求EditSign的HandleFormItem的uuid
  226. latestParams: {},//用于存储最新的params
  227. hasCustomTable: false,//是否有自定义表格
  228. };
  229. },
  230. created() {
  231. this.debouncedEmit = debounce(this.emitToParent, 100)
  232. },
  233. mounted() {
  234. EventBus.$on('onModifyRecord', this.handleModyfyRecord);
  235. //分装弹窗
  236. EventBus.$on("showSubPackageDialog", (data) => {
  237. this.$refs.subPackageDialogRef.show(data)
  238. })
  239. //标签打印弹窗
  240. EventBus.$on("showTagPrintDialog", (data) => {
  241. this.$refs.tagPrintDialogRef.show(data)
  242. })
  243. //选择仪器弹窗
  244. EventBus.$on("showSelectInstrumentDialog", (data) => {
  245. this.$refs.selectInstrumentDialogRef.show(data.studyFormId, data)
  246. })
  247. //选择试剂弹窗
  248. EventBus.$on("showSelectReagentDialog", (data) => {
  249. this.$refs.selectReagentDialogRef.show(data.studyFormId, data)
  250. })
  251. //选择试剂/供试品/给药制剂弹窗
  252. EventBus.$on("showSelectMixReagentDialog", (data) => {
  253. this.$refs.selectMixReagentDialogRef.show(data.studyFormId, data)
  254. })
  255. EventBus.$on("hideSelectMixReagentDialog", (data) => {
  256. this.$refs.selectMixReagentDialogRef.hide()
  257. })
  258. //显示电子签名弹窗
  259. EventBus.$on("showEditSignDialog", (data) => {
  260. this.currentEditSignUuid = data.uuid;
  261. this.$refs.editSignRef.show();
  262. })
  263. },
  264. beforeDestroy() {
  265. // 记得移除监听,避免内存泄漏
  266. EventBus.$off('onModifyRecord');
  267. EventBus.$off("showSubPackageDialog");
  268. EventBus.$off("showTagPrintDialog");
  269. EventBus.$off("showSelectReagentDialog");
  270. EventBus.$off("showSelectInstrumentDialog");
  271. EventBus.$off("showSelectMixReagentDialog");
  272. EventBus.$off("showEditSignDialog");
  273. EventBus.$off("hideSelectMixReagentDialog");
  274. this.debouncedEmit.cancel()
  275. },
  276. methods: {
  277. handleModyfyRecord(data) {
  278. const { source } = data;
  279. if (source === "customTable") {
  280. this.latestParams = data;
  281. // delete this.latestParams.source
  282. this.hasCustomTable = true
  283. // 取消之前的等待
  284. this.debouncedEmit.cancel()
  285. this.emitToParent()
  286. }else if(!source && !this.hasCustomTable){
  287. this.latestParams = data
  288. this.debouncedEmit()
  289. }
  290. },
  291. emitToParent() {
  292. if (this.latestParams) {
  293. console.log(this.latestParams,"this.latestParams")
  294. this.$emit(this.emitName, this.latestParams)
  295. }
  296. },
  297. // 处理电子签名取消事件
  298. handleEditSignCancel() {
  299. if (this.currentEditSignUuid) {
  300. EventBus.$emit('onEditSignCancel', { uuid: this.currentEditSignUuid });
  301. EventBus.$emit('onFormEditSignCancel', { uuid: this.currentEditSignUuid });
  302. this.currentEditSignUuid = null;
  303. }
  304. },
  305. // 处理电子签名确认回调事件
  306. handleEditSignCallback(data) {
  307. if (this.currentEditSignUuid) {
  308. EventBus.$emit('onEditSignCallback', { uuid: this.currentEditSignUuid, data });
  309. this.currentEditSignUuid = null;
  310. }
  311. },
  312. async getFormData() {
  313. if (this.fillType === "actFill") {
  314. //检查是否有未填写的复核意见
  315. const flag = this.fhyjjl.every((item) => !!item.content && !!item.reply)
  316. console.log(this.fhyjjl, flag, "flag")
  317. if (!flag) {
  318. this.$message.error("疑问项还未回复,请回复后再提交");
  319. return;
  320. }
  321. }
  322. return await this.$refs.templateComponent.getFormData();
  323. },
  324. getResource() {
  325. return this.$refs.templateComponent.getResource();
  326. },
  327. getYqResource() {
  328. return this.$refs.templateComponent.getYqResource();
  329. },
  330. getJcbList() {
  331. return this.$refs.templateComponent.getJcbList();
  332. },
  333. getFilledFormData() {
  334. return this.$refs.templateComponent.getFilledFormData();
  335. },
  336. getTemplateComponent() {
  337. return this.templateComponentMap[this.sn]
  338. },
  339. }
  340. };
  341. </script>
  342. <style rel="stylesheet/scss" lang="scss">
  343. .template-table {
  344. background: #fff;
  345. padding: 10px 10px;
  346. width: 100%;
  347. }
  348. </style>