import moment from "moment"; export default { dicts: ['business_pztj', 'business_cctj', 'business_nddw', 'business_tjdw', 'business_yxqdw', 'business_rqcz', 'business_jmdyzqdyp'], props: { templateData: { type: Object, default: () => { }, }, }, watch: { templateData: { immediate: true, deep: true, handler(v) { if (v) { let n = { ...v }; this.formData =n; if(v.resource){//试验试剂信息 this.resource = JSON.parse(v.resource); } if (v.bdnr) { this.formData = { ...n, ...JSON.parse(v.bdnr) }; } console.log(v, "formData from templateData") this.setTemplateData(n); } } } }, data() { return { formData: {}, templateDetail: {}, resource: [],//试验试剂信息 sysjColumns: [ { label: "试剂名称", prop: "reagentName" }, { label: "编号", prop: "reagentCode" }, { label: "批号", prop: "reagentNo" }, { label: "浓度/含量/纯度", prop: "concentration" }, { label: "来源", prop: "source" }, { label: "失效日", prop: "expireDate" }, ], yqsColumns: [ { label: "仪器名称", prop: "instrumentName" }, { label: "仪器型号", prop: "instrumentModel" }, { label: "仪器编号", prop: "instrumentCode" }, { label: "下次测试/校准/检定日期", prop: "nextTestDate" }, ] } }, mounted() { }, unmounted() { this.setTemplateData({}); }, methods: { getResource() { return this.resource; }, //根据ref数组获取直接formData getFilledFormDataByRefs(refArr = []){ let result = {}; refArr.map(ref => { const refData = this.$refs[ref]?.getFilledFormData() || {}; result = { ...result, ...refData }; }); return result; }, //统一校验form表单是否填写 async validFormFields(refArr = []) { let result = {}; const refs = refArr.map(ref => { let refData = {}; if (this.$refs[ref][0]) { refData = this.$refs[ref][0]?.getFormData() || {}; } else { refData = this.$refs[ref]?.getFormData() || {}; } return refData; }); const validFormData = await Promise.all(refs).catch(err => { // this.$message.error(err); if (err.errorType && err.errorType === "step") { this.$message.error("请添加步骤"); return } this.$message.error("表单内容未填完,请填写后再提交"); }); if (validFormData) { validFormData.forEach(item => { result = { ...result, ...item } }) return result; } return false; }, //试验配制条件options getDictOptions(dictType) { return this.dict.type[dictType] || []; }, setTemplateData(data) { this.$store.commit('template/SET_TEMPLATE_DATA', data) }, //统一处理删除行 deleteRow(index) { this.$refs.stepTableRef.deleteRow(index); }, //统一处理blur事件,因为有效周期和过期日期是相关的,所以需要在有效周期失焦时更新过期日期 onHandleBlur(fields) { const { key, effectivePeriodUnit, effectivePeriod, codeSTD, targetStartSolution } = fields; const { startDate } = this.formData; if (key === "effectivePeriod") {//统一处理有效周期失焦,计算失效事件,保证字段名不能变 if(!startDate) return; const start = moment(startDate); const end = start.add(Number(effectivePeriod), effectivePeriodUnit).format("YYYY-MM-DD HH:mm:ss"); this.$refs.stepFormPackageRef.updateFormData("expireDate", end); } else if (key === "codeSTD") {//起始编号STD失焦时,更新stepDataSource const arr = Array.from({ length: codeSTD }, (item, index) => ({ actSolutionVolumePrecision: 3,//小数点精度默认为3 actSolutionConcentrationPrecision: 3,//小数点精度默认为3 targetDiluentVolumePrecision: 3,//小数点精度默认为3 targetStartSolutionVolumePrecision: 3,//小数点精度默认为3 targetSolutionCode: `STD${Number(codeSTD) - index}` })); this.$refs.stepTableRef.updateDataSource(arr); } else if (key === "targetStartSolution") {//起始溶液体积失焦时,更新目标溶液预计浓度 const arr = this.$refs.stepTableRef?.getDataSource(); arr.forEach((item, rowIndex) => { this.updateTargetStartSolutionVolume(rowIndex, item, targetStartSolution); }) } }, //统一处理table失焦事件 onHandleTableBlur(params) { const { rowIndex, colKey, value, item } = params; if (colKey === "targetSolutionVolume" || colKey === "targetSolutionConcentration" || colKey === "targetStartSolutionVolumePrecision" || colKey === "targetDiluentVolumePrecision") { const volume = this.$refs.stepFormPackageRef?.getFormDataByKey("targetStartSolution") || 0; if (volume) { this.updateTargetStartSolutionVolume(item, volume); } }else if(colKey === "actStartSolutionVolume" || colKey === "actDiluentVolume"){//实际起始溶液体积和实际目标溶液体积 const targetAcSolution = this.$refs.stepFormPackageRef?.getFormDataByKey("targetAcSolution") || 0;//获取实际起始溶液浓度 if(targetAcSolution){ this.updateSjmbrynd(item,targetAcSolution); } } }, //计算并更新实际目标溶液浓度 先计算实际目标溶液体积再计算实际目标溶液浓度 updateSjmbrynd(item,targetAcSolution){ //实际源溶液浓度÷(实际终体积÷源溶液加入体积); const precision = item.actSolutionConcentrationPrecision || 0; const volPrecision = item.actSolutionVolumePrecision || 0; //实际稀释液体积 const actDiluentVolume = item.actDiluentVolume || 0; const actStartSolutionVolume = item.actStartSolutionVolume || 0; //实际高源溶液加入体积+实际稀释液加入体积 const actVol = (Number(actStartSolutionVolume)+Number(actDiluentVolume)).toFixed(volPrecision); //实际目标溶液体积 item.actSolutionVolume = actVol; //实际目标溶液浓度 const actNd = (targetAcSolution / actStartSolutionVolume / actVol).toFixed(precision); item.actSolutionConcentration = actNd; }, //更新起始溶液体积时,计算目标溶液预计浓度 updateTargetStartSolutionVolume(item, volume) { const precision = item.targetStartSolutionVolumePrecision || 0; const concentration = item.targetSolutionConcentration || 0; const targetVolume = item.targetSolutionVolume || 0; //目标溶液预计浓度:(目标溶液预计体积 乘以 起始溶液浓度)除以 起始溶液体积 const result = ((concentration * targetVolume) / volume).toFixed(precision); item.targetStartSolutionVolume = result; // this.$refs.stepTableRef.updateDataSourceByRowIndex(rowIndex, { targetStartSolutionVolume: result }); if (targetVolume) { //预设稀释液体积:目标溶液预计体积 减去 源溶液预计体积; const precision1 = item.targetDiluentVolumePrecision || 0; const result1 = (targetVolume - result).toFixed(precision1); item.targetDiluentVolume = result1; // this.$refs.stepTableRef.updateDataSourceByRowIndex(rowIndex, { targetDiluentVolume: result1 }); } } }, }