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

542 lines
16 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/SP008.vue";
  30. import SP009 from "./comps/sp/SP009.vue";
  31. import SP0019 from "./comps/sp/SP0019.vue";
  32. import SP0020 from "./comps/sp/SP0020.vue";
  33. import SP0021 from "./comps/sp/SP0021.vue";
  34. import Demo from "./comps/sp/Demo.vue";
  35. //供试品
  36. import GSP001 from "./comps/gsp/GSP001.vue";
  37. import GSP002 from "./comps/gsp/GSP002.vue";
  38. import GSP003 from "./comps/gsp/GSP003.vue";
  39. import GSP004 from "./comps/gsp/GSP004.vue";
  40. import GSP005 from "./comps/gsp/GSP005.vue";
  41. import GSP009 from "./comps/gsp/GSP009.vue";
  42. import GSP010 from "./comps/gsp/GSP010.vue";
  43. import GSP015 from "./comps/gsp/GSP015.vue";
  44. //试验物质配制计划表/麻精药领取申请单/毒麻药品配制记录表
  45. import SYWZPZJHB from "./comps/gsp/SYWZPZJHB.vue";
  46. import MJYLQSQD from "./comps/gsp/MJYLQSQD.vue";
  47. import DMYPPZJLB from "./comps/gsp/DMYPPZJLB.vue";
  48. // PCR
  49. //PCR001-使用SP001
  50. import PCR002 from "./comps/pcr/PCR002.vue";
  51. import PCR003 from "./comps/pcr/PCR003.vue";
  52. import PCR004 from "./comps/pcr/PCR004.vue";
  53. import PCR005 from "./comps/pcr/PCR005.vue";
  54. import PCR007 from "./comps/pcr/PCR007.vue";
  55. import PCR008 from "./comps/pcr/PCR008.vue";
  56. import PCR009 from "./comps/pcr/PCR009.vue";
  57. import PCR010 from "./comps/pcr/PCR010.vue";
  58. import PCR011 from "./comps/pcr/PCR011.vue";
  59. import PCR012 from "./comps/pcr/PCR012.vue";
  60. //LBA
  61. // LBA001-使用SP001
  62. import LBA002 from "./comps/lba/LBA002.vue";
  63. import LBA003 from "./comps/lba/LBA003.vue";
  64. import LBA004 from "./comps/lba/LBA004.vue";
  65. // LBA005-使用SP456
  66. import LBA006 from "./comps/lba/LBA006.vue";
  67. // LBA007-使用SP456
  68. import LBA008 from "./comps/lba/LBA008.vue";
  69. //ADA
  70. // ADA001-使用SP001
  71. // ADA002-使用LBA002
  72. // ADA003-使用LBA003
  73. // ADA004-使用LBA004
  74. // ADA005-使用SP456
  75. // ADA006-使用LBA006
  76. // ADA007-使用SP456
  77. //样品
  78. // YP001-使用SP001
  79. import YP002 from "./comps/yp/YP002.vue";
  80. import YP003 from "./comps/yp/YP003.vue";
  81. import YP004 from "./comps/yp/YP004.vue";
  82. import YP005 from "./comps/yp/YP005.vue";
  83. //细胞
  84. import XB001 from "./comps/xb/XB001.vue";
  85. //动技
  86. import DJ001 from "./comps/dj/DJ001.vue";
  87. import DJ002 from "./comps/dj/DJ002.vue";
  88. import DJ003 from "./comps/dj/DJ003.vue";
  89. //病理
  90. import BL001 from "./comps/bl/BL001.vue";
  91. import BL002 from "./comps/bl/BL002.vue";
  92. //毒理
  93. // DL001-SYWZPZJHB
  94. // DL002-使用SP001
  95. import DL003 from './comps/dl/DL003.vue'
  96. import DL004 from './comps/dl/DL004.vue'
  97. import DL005 from './comps/dl/DL005.vue'
  98. import DL006 from './comps/dl/DL006.vue'
  99. import DL007 from './comps/dl/DL007.vue'
  100. import DL008 from './comps/dl/DL008.vue'
  101. import DL009 from './comps/dl/DL009.vue'
  102. import DL010 from './comps/dl/DL010.vue'
  103. import DL011 from './comps/dl/DL011.vue'
  104. import DL012 from './comps/dl/DL012.vue'
  105. import DL013 from './comps/dl/DL013.vue'
  106. import DL014 from './comps/dl/DL014.vue'
  107. import DL015 from './comps/dl/DL015.vue'
  108. import DL016 from "./comps/dl/DL016.vue";
  109. import DL017 from "./comps/dl/DL017.vue";
  110. import DL018 from "./comps/dl/DL018.vue";
  111. import DL019 from "./comps/dl/DL019.vue";
  112. import DL020 from "./comps/dl/DL020.vue";
  113. import DL021 from "./comps/dl/DL021.vue";
  114. import DL022 from "./comps/dl/DL022.vue";
  115. import DL023 from "./comps/dl/DL023.vue";
  116. import DL024 from "./comps/dl/DL024.vue";
  117. export default {
  118. name: "TemplateTable",
  119. components: {
  120. Demo,
  121. SubPackageDialog, TagPrintDialog, SelectReagentDialog, SelectInstrumentDialog, SelectMixReagentDialog, EditSign,
  122. //试验物质配制计划表/麻精药领取申请单/毒麻药品配制记录表
  123. MJYLQSQD, SYWZPZJHB, DMYPPZJLB,
  124. //供试品
  125. GSP001,GSP002, GSP003,GSP004,GSP005,GSP009, GSP010,GSP015,
  126. //色谱
  127. SP001, SP003, SP00456,SP007, SP008, SP009,SP0019,SP0020,SP0021,
  128. // PCR
  129. PCR002, PCR003, PCR004, PCR005,PCR007, PCR008, PCR009,PCR010, PCR011, PCR012,
  130. //LBA
  131. LBA002,
  132. LBA003,
  133. LBA004,
  134. LBA006,
  135. LBA008,
  136. //样品
  137. YP002,
  138. YP003,
  139. YP004,
  140. YP005,
  141. // 毒理
  142. DL003,
  143. DL004,
  144. DL005,
  145. DL006,
  146. DL007,
  147. DL008,
  148. DL009,
  149. DL010,
  150. DL011,
  151. DL012,
  152. DL013,
  153. DL014,
  154. DL015,
  155. DL016,
  156. DL017,
  157. DL018,
  158. DL019,
  159. DL020,
  160. DL021,
  161. DL022,
  162. DL023,
  163. DL024,
  164. //细胞
  165. XB001,
  166. //动技
  167. DJ001,
  168. DJ002,
  169. DJ003,
  170. //病理
  171. BL001,
  172. BL002
  173. },
  174. data() {
  175. return {
  176. componentMap: null,
  177. }
  178. },
  179. methods: {
  180. getTemplateComponent() {
  181. if (!this.sn) return 'Demo';
  182. let componentName = this.componentMap[this.sn] || 'Demo';
  183. return componentName;
  184. },
  185. handleEditSignCancel(e) {
  186. EventBus.$emit('edit-sign-cancel', e);
  187. },
  188. },
  189. props: {
  190. sn: {
  191. type: String,
  192. default: '',
  193. },
  194. fillType: {
  195. type: String,
  196. default: 'preFill',
  197. },
  198. templateData: {
  199. type: Object,
  200. default: () => { },
  201. },
  202. emitName: {
  203. type: String,
  204. default: 'onModifyRecord',
  205. },
  206. },
  207. computed: {
  208. templateComponentMap() {
  209. if (!this.componentMap) {
  210. this.componentMap = {
  211. //色谱
  212. 'SP001': 'SP001',
  213. 'SP002': 'SP001',
  214. 'SP003': 'SP003',
  215. 'SP004': 'SP00456',
  216. 'SP005': 'SP00456',
  217. 'SP006': 'SP00456',
  218. 'SP007': 'SP007',
  219. 'SP008': 'SP008',
  220. 'SP009': 'SP009',
  221. 'SP010': 'SP008',
  222. 'SP011': 'SP008',
  223. 'SP012': 'SP008',
  224. 'SP013': 'SP008',
  225. 'SP014': 'SP008',
  226. 'SP015': 'SP008',
  227. 'SP016': 'SP008',
  228. 'SP017': 'SP008',
  229. 'SP018': 'SP008',
  230. 'SP019': 'SP0019',
  231. 'SP020': 'SP0020',
  232. 'SP021': 'SP0021',
  233. //供试品
  234. 'GSP001': 'GSP001',
  235. 'GSP002': 'GSP002',
  236. 'GSP003': 'GSP003',
  237. 'GSP004': 'GSP004',
  238. 'GSP005': 'GSP005',
  239. 'GSP006': 'GSP002',
  240. 'GSP007': 'SP00456',
  241. 'GSP008': 'GSP002',
  242. 'GSP009': 'GSP009',
  243. 'GSP010': 'GSP010',
  244. 'GSP015': 'GSP015',
  245. 'GSP011': 'GSP009',
  246. 'GSP012': 'GSP002',
  247. 'GSP013': 'GSP002',
  248. 'GSP014': 'GSP002',
  249. //试验物质配制计划表/麻精药领取申请单/毒麻药品配制记录表
  250. 'SYWZPZJHB': 'SYWZPZJHB',
  251. 'MJYLQSQD': 'MJYLQSQD',
  252. 'DMYPPZJLB': 'DMYPPZJLB',
  253. //PCR
  254. 'PCR001': 'SP001',
  255. 'PCR002': 'SP00456',
  256. 'PCR003': 'SP00456',
  257. 'PCR004': 'SP00456',
  258. 'PCR005': 'PCR005',
  259. 'PCR006': 'SP0020',
  260. 'PCR007': 'PCR007',
  261. 'PCR008': 'PCR008',
  262. 'PCR009': 'PCR009',
  263. 'PCR010': 'PCR010',
  264. 'PCR011': 'PCR011',
  265. 'PCR012': 'PCR012',
  266. 'PCR013': 'SP00456',
  267. //LBA
  268. 'LBA001': 'SP001',
  269. 'LBA002': 'LBA002',
  270. 'LBA003': 'LBA003',
  271. 'LBA004': 'LBA004',
  272. 'LBA005': 'SP00456',
  273. 'LBA006': 'LBA006',
  274. 'LBA007': 'SP00456',
  275. 'LBA008': 'LBA008',
  276. //ADA
  277. 'ADA001': 'SP001',
  278. 'ADA002': 'LBA002',
  279. 'ADA003': 'LBA003',
  280. 'ADA004': 'LBA004',
  281. 'ADA005': 'SP00456',
  282. 'ADA006': 'LBA006',
  283. 'ADA007': 'SP00456',
  284. //样品
  285. 'YP001': 'SP001',
  286. 'YP002': 'YP002',
  287. 'YP003': 'YP003',
  288. 'YP004': 'YP004',
  289. 'YP005': 'YP005',
  290. //细胞
  291. 'XB001': 'XB001',
  292. //动技
  293. 'DJ001': 'DJ001',
  294. 'DJ002': 'DJ002',
  295. 'DJ003': 'DJ003',
  296. //病理
  297. 'BL001': 'BL001',
  298. 'BL002': 'BL002',
  299. //毒理
  300. //DL001-SYWZPZJHB
  301. 'DL002': 'SP001',
  302. 'DL003': 'DL003',
  303. 'DL004': 'DL004',
  304. 'DL005': 'DL005',
  305. 'DL006': 'DL006',
  306. 'DL007': 'DL007',
  307. 'DL008': 'DL008',
  308. 'DL009': 'DL009',
  309. 'DL010': 'DL010',
  310. 'DL011': 'DL011',
  311. 'DL012': 'DL012',
  312. 'DL013': 'DL013',
  313. 'DL014': 'DL014',
  314. 'DL015': 'DL015',
  315. 'DL016': 'DL016',
  316. 'DL017': 'DL017',
  317. 'DL018': 'DL018',
  318. 'DL019': 'DL019',
  319. 'DL020': 'DL020',
  320. 'DL021': 'DL021',
  321. 'DL022': 'DL022',
  322. 'DL023': 'DL023',
  323. 'DL024': 'DL024',
  324. }
  325. }
  326. return this.componentMap || "Demo"
  327. }
  328. },
  329. watch: {
  330. sn: {
  331. immediate: true,
  332. handler(v) {
  333. console.log(v, "sn")
  334. }
  335. },
  336. templateData: {
  337. immediate: true,
  338. deep: true,
  339. handler(v) {
  340. if (v) {
  341. if (v.zdxgjl) {
  342. this.zdxgjl = JSON.parse(v.zdxgjl) || [];
  343. }
  344. if (v.submittedCodes) {
  345. this.submittedCodes = JSON.parse(v.submittedCodes) || [];
  346. }
  347. if (v.fhyjjl) {
  348. this.fhyjjl = JSON.parse(v.fhyjjl) || [];
  349. }
  350. if (v.zdgxjl) {//qc勾选记录
  351. this.fieldCheckObj = JSON.parse(v.zdgxjl) || {};
  352. }
  353. }
  354. }
  355. }
  356. },
  357. provide() {
  358. return {
  359. //分发给子组件的fillType
  360. templateData: this.templateData,
  361. templateFillType: this.fillType,
  362. getZdxgjl: () => this.zdxgjl,
  363. getSubmittedCodes: () => this.submittedCodes,
  364. getFhyjjl: () => this.fhyjjl,
  365. getFieldCheckObj: () => this.fieldCheckObj,
  366. //更新提交记录
  367. updateZdxgjl: (data) => {
  368. this.zdxgjl.unshift(data);
  369. },
  370. //更新已提交数据的codes
  371. updateSubmittedCodes: (code) => {
  372. if(!this.submittedCodes.includes(code)){
  373. this.submittedCodes.unshift(code);
  374. return
  375. }
  376. },
  377. //更新复核意见记录
  378. updateFhyjjl: (data) => {
  379. this.fhyjjl.unshift(data);
  380. },
  381. //替换复核意见记录
  382. replaceFhyjjl: (data) => {
  383. this.fhyjjl = data;
  384. },
  385. //更新字段检查对象
  386. updateFieldCheckObj: (data) => {
  387. this.fieldCheckObj = { ...this.fieldCheckObj, ...data };
  388. },
  389. }
  390. },
  391. data() {
  392. return {
  393. info: {},
  394. zdxgjl: [],
  395. fhyjjl: [],
  396. fieldCheckObj: {},
  397. currentEditSignUuid: null, // 当前请求EditSign的HandleFormItem的uuid
  398. latestParams: {},//用于存储最新的params
  399. hasCustomTable: false,//是否有自定义表格
  400. submittedCodes: [],//用于记录已提交数据的codes
  401. };
  402. },
  403. created() {
  404. this.debouncedEmit = debounce(this.emitToParent, 100)
  405. },
  406. mounted() {
  407. EventBus.$on('onModifyRecord', this.handleModyfyRecord);
  408. //分装弹窗
  409. EventBus.$on("showSubPackageDialog", (data) => {
  410. this.$refs.subPackageDialogRef.show(data)
  411. })
  412. //标签打印弹窗
  413. EventBus.$on("showTagPrintDialog", (data) => {
  414. this.$refs.tagPrintDialogRef.show(data)
  415. })
  416. //选择仪器弹窗
  417. EventBus.$on("showSelectInstrumentDialog", (data) => {
  418. this.$refs.selectInstrumentDialogRef.show(data.studyFormId, data)
  419. })
  420. //选择试剂弹窗
  421. EventBus.$on("showSelectReagentDialog", (data) => {
  422. this.$refs.selectReagentDialogRef.show(data.studyFormId, data)
  423. })
  424. //选择试剂/供试品/给药制剂弹窗
  425. EventBus.$on("showSelectMixReagentDialog", (data) => {
  426. this.$refs.selectMixReagentDialogRef.show(data.studyFormId, data,this.templateData.studyId)
  427. })
  428. EventBus.$on("hideSelectMixReagentDialog", (data) => {
  429. this.$refs.selectMixReagentDialogRef.hide()
  430. })
  431. //显示电子签名弹窗
  432. EventBus.$on("showEditSignDialog", (data) => {
  433. this.currentEditSignUuid = data.uuid;
  434. this.$refs.editSignRef.show();
  435. })
  436. },
  437. beforeDestroy() {
  438. // 记得移除监听,避免内存泄漏
  439. EventBus.$off('onModifyRecord');
  440. EventBus.$off("showSubPackageDialog");
  441. EventBus.$off("showTagPrintDialog");
  442. EventBus.$off("showSelectReagentDialog");
  443. EventBus.$off("showSelectInstrumentDialog");
  444. EventBus.$off("showSelectMixReagentDialog");
  445. EventBus.$off("showEditSignDialog");
  446. EventBus.$off("hideSelectMixReagentDialog");
  447. this.debouncedEmit.cancel()
  448. },
  449. methods: {
  450. handleModyfyRecord(data) {
  451. const { source } = data;
  452. if (source === "customTable") {
  453. this.latestParams = data;
  454. // delete this.latestParams.source
  455. this.hasCustomTable = true
  456. // 取消之前的等待
  457. this.debouncedEmit.cancel()
  458. this.emitToParent()
  459. }else if(!source && !this.hasCustomTable){
  460. this.latestParams = data
  461. this.debouncedEmit()
  462. }
  463. },
  464. emitToParent() {
  465. if (this.latestParams) {
  466. console.log(this.latestParams,"this.latestParams")
  467. this.$emit(this.emitName, this.latestParams)
  468. }
  469. },
  470. // 处理电子签名取消事件
  471. handleEditSignCancel() {
  472. if (this.currentEditSignUuid) {
  473. EventBus.$emit('onEditSignCancel', { uuid: this.currentEditSignUuid });
  474. EventBus.$emit('onFormEditSignCancel', { uuid: this.currentEditSignUuid });
  475. this.currentEditSignUuid = null;
  476. }
  477. },
  478. // 处理电子签名确认回调事件
  479. handleEditSignCallback(data) {
  480. if (this.currentEditSignUuid) {
  481. EventBus.$emit('onEditSignCallback', { uuid: this.currentEditSignUuid, data });
  482. this.currentEditSignUuid = null;
  483. }
  484. },
  485. async getFormData() {
  486. if (this.fillType === "actFill") {
  487. //检查是否有未填写的复核意见
  488. const flag = this.fhyjjl.every((item) => !!item.content && !!item.reply)
  489. console.log(this.fhyjjl, flag, "flag")
  490. if (!flag) {
  491. this.$message.error("疑问项还未回复,请回复后再提交");
  492. return;
  493. }
  494. }
  495. return await this.$refs.templateComponent.getFormData();
  496. },
  497. getResource() {
  498. return this.$refs.templateComponent.getResource();
  499. },
  500. getYqResource() {
  501. return this.$refs.templateComponent.getYqResource();
  502. },
  503. getJcbList() {
  504. return this.$refs.templateComponent.getJcbList();
  505. },
  506. getXbxj() {
  507. return this.$refs.templateComponent.getXbxj();
  508. },
  509. getFilledFormData() {
  510. return this.$refs.templateComponent.getFilledFormData();
  511. },
  512. getTemplateComponent() {
  513. return this.templateComponentMap[this.sn]
  514. },
  515. }
  516. };
  517. </script>
  518. <style rel="stylesheet/scss" lang="scss">
  519. .template-table {
  520. background: #fff;
  521. padding: 10px 10px;
  522. width: 100%;
  523. }
  524. </style>