| @ -1,372 +1,377 @@ | |||||
| import moment from 'moment' | import moment from 'moment' | ||||
| import { getLatestSn } from '@/api/template'; | import { getLatestSn } from '@/api/template'; | ||||
| import { sj_subpackage,sj_startConfiguration,sj_configurationCompleted } from '@/api/business/sj/sj'; | |||||
| import { sj_subpackage, sj_startConfiguration, sj_configurationCompleted } from '@/api/business/sj/sj'; | |||||
| export default { | export default { | ||||
| dicts: [ | |||||
| 'business_pztj', | |||||
| 'business_cctj', | |||||
| 'business_nddw', | |||||
| 'business_tjdw', | |||||
| 'business_yxqdw', | |||||
| 'business_rqcz', | |||||
| dicts: [ | |||||
| 'business_pztj', | |||||
| 'business_cctj', | |||||
| 'business_nddw', | |||||
| 'business_tjdw', | |||||
| 'business_yxqdw', | |||||
| 'business_rqcz', | |||||
| 'business_sp_jmdyzqdyp', //色谱-编号-准确度与精密度 | |||||
| 'business_sp_nbgzy', //色谱-编号-内标工作液 | |||||
| 'business_sp_zkgzy', //色谱-编号-质控工作液 | |||||
| 'business_sp_bqgzy', //色谱-编号-标曲工作液 | |||||
| 'business_sp_bzqxzkypzbb', //色谱-编号-标准曲线/质控样品制备表 | |||||
| 'business_sp_tqhsl', //色谱-编号-提取回收率 | |||||
| 'business_sp_qxwdx', //色谱-编号-全血稳定性 | |||||
| 'business_sp_cbyhgzywdx', //色谱-编号-储备液和工作液稳定性 | |||||
| 'business_sp_rxjzxy', //色谱-编号-溶血基质效应 | |||||
| 'business_sp_jzxy', //色谱-编号-基质效应 | |||||
| 'business_sp_xzxytyx', //色谱-编号-选择性与特异性 | |||||
| 'business_sp_zdybs', //色谱-编号-最大样本数 | |||||
| 'business_sp_xskkx', //色谱-编号-稀释可靠性 | |||||
| 'business_sp_cbydb' //色谱-编号-储备液对比 | |||||
| ], | |||||
| props: { | |||||
| templateData: { | |||||
| type: Object, | |||||
| default: () => {} | |||||
| } | |||||
| }, | |||||
| watch: { | |||||
| templateData: { | |||||
| immediate: true, | |||||
| deep: true, | |||||
| handler(v) { | |||||
| if (v) { | |||||
| const { | |||||
| studyId, | |||||
| studyMc, | |||||
| studySn, | |||||
| templateMc, | |||||
| templateMcEn, | |||||
| templateSn, | |||||
| startDate, | |||||
| bdmc, | |||||
| endDate, | |||||
| id | |||||
| } = v | |||||
| if (v.resource) { | |||||
| //试验试剂信息 | |||||
| this.resource = JSON.parse(v.resource) | |||||
| } | |||||
| if (v.bdnr) { | |||||
| this.formData = { | |||||
| ...JSON.parse(v.bdnr), | |||||
| studyId, | |||||
| studyMc, | |||||
| studySn, | |||||
| templateMc, | |||||
| templateMcEn, | |||||
| templateSn, | |||||
| startDate, | |||||
| bdmc, | |||||
| endDate, | |||||
| id | |||||
| } | |||||
| } else { | |||||
| this.formData = { | |||||
| studyId, | |||||
| studyMc, | |||||
| studySn, | |||||
| templateMc, | |||||
| templateMcEn, | |||||
| templateSn, | |||||
| startDate, | |||||
| bdmc, | |||||
| endDate, | |||||
| id | |||||
| } | |||||
| } | |||||
| const { effectivePeriod, effectivePeriodUnit, expireDate } = | |||||
| this.formData | |||||
| //实际填报的时候,如果有了开始时间,并且有有效周期,但是没有失效日,就计算失效日为开始时间+有效周期 | |||||
| if ( | |||||
| startDate && | |||||
| this.fillType === 'actFill' && | |||||
| effectivePeriod && | |||||
| effectivePeriodUnit && | |||||
| !expireDate | |||||
| ) { | |||||
| const start = moment(startDate) | |||||
| const unit = effectivePeriodUnit === '天' ? 'days' : 'hours' | |||||
| const end = start | |||||
| .add(Number(effectivePeriod), unit) | |||||
| .format('YYYY-MM-DD HH:mm:ss') | |||||
| this.formData = { ...this.formData, expireDate: end } | |||||
| } | |||||
| console.log(this.formData, 'formData from templateData') | |||||
| this.setTemplateData(v) | |||||
| } | |||||
| } | |||||
| } | |||||
| }, | |||||
| 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: { | |||||
| //开始配置 | |||||
| //postData: {bh: '123456'} | |||||
| async startConfigRequest (postData){ | |||||
| const res = await sj_startConfiguration(postData) | |||||
| if (res.code === 200) { | |||||
| this.$message.success('开始配置成功') | |||||
| } else { | |||||
| this.$message.error('开始配置失败') | |||||
| } | |||||
| }, | |||||
| //完成配置 | |||||
| async configCompleteRequest (postData){ | |||||
| const res = await sj_configurationCompleted(postData) | |||||
| if (res.code === 200) { | |||||
| this.$message.success('完成配置成功') | |||||
| } else { | |||||
| this.$message.error('完成配置失败') | |||||
| } | |||||
| }, | |||||
| //分装 | |||||
| async subPackageRequest (postData){ | |||||
| const res = await sj_subpackage(postData) | |||||
| if (res.code === 200) { | |||||
| this.$message.success('分装成功') | |||||
| } else { | |||||
| this.$message.error('分装失败') | |||||
| } | |||||
| }, | |||||
| //获取打印配置 | |||||
| getBasePrintConfig (data = {}){ | |||||
| const { printCode,type,row = {} } = data; | |||||
| const {stepStorageCondition,startDate,expireDate} = this.formData;; | |||||
| const { nickName, name } = this.$store.getters; | |||||
| const lang = this.$i18n.locale; | |||||
| const printConfig = { | |||||
| "品名":"暂时还不知道品名是哪个字段", | |||||
| "存储条件":stepStorageCondition, | |||||
| "配制日期":moment(startDate).format("YYYY-MM-DD"), | |||||
| "有效期至":moment(expireDate).format("YYYY-MM-DD HH:mm"), | |||||
| "配置者":lang === "zh_CN" ? nickName : name, | |||||
| //type==="subPackage"从分装打印过来的, | |||||
| //type==="row" 从列表上点过来的 | |||||
| "编号":type === "subPackage" ? printCode : (row.targetSolutionCode+row.subTargetSolutionCode), | |||||
| } | |||||
| return printConfig | |||||
| }, | |||||
| async getLatestSn(count = 1) { | |||||
| const res = await getLatestSn({ count }) | |||||
| if (res.code === 200) { | |||||
| return res.data | |||||
| } | |||||
| return null | |||||
| }, | |||||
| getResource() { | |||||
| return this.resource | |||||
| }, | |||||
| //根据ref数组获取直接formData | |||||
| getFilledFormDataByRefs(refArr = []) { | |||||
| let result = {} | |||||
| refArr.map((ref) => { | |||||
| const refData = this.$refs[ref]?.getFilledFormData() || {} | |||||
| for (const [key, value] of Object.entries(refData)) { | |||||
| let index = 0 | |||||
| // 如果当前键是可能重复的字段,且结果对象中已经存在该键,则添加索引后缀 | |||||
| if ( | |||||
| (key === 'headerSelectFields' || key === 'stepTableFormData') && | |||||
| result.hasOwnProperty(key) | |||||
| ) { | |||||
| // 为重复字段生成带索引的键名,从1开始(因为第一个组件不需要后缀) | |||||
| const newKey = `${key}_${++index}` | |||||
| result[newKey] = value | |||||
| } else { | |||||
| // 正常合并其他字段 | |||||
| result[key] = value | |||||
| } | |||||
| } | |||||
| }) | |||||
| 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) => { | |||||
| for (const [key, value] of Object.entries(item)) { | |||||
| let index = 0 | |||||
| // 如果当前键是可能重复的字段,且结果对象中已经存在该键,则添加索引后缀 | |||||
| if ( | |||||
| (key === 'headerSelectFields' || key === 'stepTableFormData') && | |||||
| result.hasOwnProperty(key) | |||||
| ) { | |||||
| // 为重复字段生成带索引的键名,从1开始(因为第一个组件不需要后缀) | |||||
| const newKey = `${key}_${++index}` | |||||
| result[newKey] = value | |||||
| } else { | |||||
| // 正常合并其他字段 | |||||
| result[key] = value | |||||
| } | |||||
| } | |||||
| }) | |||||
| return result | |||||
| } | |||||
| return false | |||||
| }, | |||||
| //试验配制条件options | |||||
| getDictOptions(dictType) { | |||||
| return this.dict.type[dictType] || [] | |||||
| }, | |||||
| 'business_sp_jmdyzqdyp', //色谱-编号-准确度与精密度 | |||||
| 'business_sp_nbgzy', //色谱-编号-内标工作液 | |||||
| 'business_sp_zkgzy', //色谱-编号-质控工作液 | |||||
| 'business_sp_bqgzy', //色谱-编号-标曲工作液 | |||||
| 'business_sp_bzqxzkypzbb', //色谱-编号-标准曲线/质控样品制备表 | |||||
| 'business_sp_tqhsl', //色谱-编号-提取回收率 | |||||
| 'business_sp_qxwdx', //色谱-编号-全血稳定性 | |||||
| 'business_sp_cbyhgzywdx', //色谱-编号-储备液和工作液稳定性 | |||||
| 'business_sp_rxjzxy', //色谱-编号-溶血基质效应 | |||||
| 'business_sp_jzxy', //色谱-编号-基质效应 | |||||
| 'business_sp_xzxytyx', //色谱-编号-选择性与特异性 | |||||
| 'business_sp_zdybs', //色谱-编号-最大样本数 | |||||
| 'business_sp_xskkx', //色谱-编号-稀释可靠性 | |||||
| 'business_sp_cbydb' //色谱-编号-储备液对比 | |||||
| ], | |||||
| props: { | |||||
| templateData: { | |||||
| type: Object, | |||||
| default: () => { } | |||||
| } | |||||
| }, | |||||
| watch: { | |||||
| templateData: { | |||||
| immediate: true, | |||||
| deep: true, | |||||
| handler(v) { | |||||
| if (v) { | |||||
| const { | |||||
| studyId, | |||||
| studyMc, | |||||
| studySn, | |||||
| templateMc, | |||||
| templateMcEn, | |||||
| templateSn, | |||||
| startDate, | |||||
| bdmc, | |||||
| endDate, | |||||
| id | |||||
| } = v | |||||
| if (v.resource) { | |||||
| //试验试剂信息 | |||||
| this.resource = JSON.parse(v.resource) | |||||
| } | |||||
| if (v.bdnr) { | |||||
| this.formData = { | |||||
| ...JSON.parse(v.bdnr), | |||||
| studyId, | |||||
| studyMc, | |||||
| studySn, | |||||
| templateMc, | |||||
| templateMcEn, | |||||
| templateSn, | |||||
| startDate, | |||||
| bdmc, | |||||
| endDate, | |||||
| id | |||||
| } | |||||
| } else { | |||||
| this.formData = { | |||||
| studyId, | |||||
| studyMc, | |||||
| studySn, | |||||
| templateMc, | |||||
| templateMcEn, | |||||
| templateSn, | |||||
| startDate, | |||||
| bdmc, | |||||
| endDate, | |||||
| id | |||||
| } | |||||
| } | |||||
| const { effectivePeriod, effectivePeriodUnit, expireDate } = | |||||
| this.formData | |||||
| //实际填报的时候,如果有了开始时间,并且有有效周期,但是没有失效日,就计算失效日为开始时间+有效周期 | |||||
| if ( | |||||
| startDate && | |||||
| this.fillType === 'actFill' && | |||||
| effectivePeriod && | |||||
| effectivePeriodUnit && | |||||
| !expireDate | |||||
| ) { | |||||
| const start = moment(startDate) | |||||
| const unit = effectivePeriodUnit === '天' ? 'days' : 'hours' | |||||
| const end = start | |||||
| .add(Number(effectivePeriod), unit) | |||||
| .format('YYYY-MM-DD HH:mm:ss') | |||||
| this.formData = { ...this.formData, expireDate: end } | |||||
| } | |||||
| console.log(this.formData, 'formData from templateData') | |||||
| this.setTemplateData(v) | |||||
| } | |||||
| } | |||||
| } | |||||
| }, | |||||
| 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: { | |||||
| //开始配置 | |||||
| //postData: {bh: '123456'} | |||||
| async startConfigRequest(postData) { | |||||
| const res = await sj_startConfiguration(postData) | |||||
| if (res.code === 200) { | |||||
| this.$message.success('开始配置成功') | |||||
| } else { | |||||
| this.$message.error('开始配置失败') | |||||
| } | |||||
| }, | |||||
| //完成配置 | |||||
| async configCompleteRequest(postData) { | |||||
| const res = await sj_configurationCompleted(postData) | |||||
| if (res.code === 200) { | |||||
| this.$message.success('完成配置成功') | |||||
| } else { | |||||
| this.$message.error('完成配置失败') | |||||
| } | |||||
| }, | |||||
| //分装 | |||||
| async subPackageRequest(postData) { | |||||
| const res = await sj_subpackage(postData) | |||||
| if (res.code === 200) { | |||||
| this.$message.success('分装成功') | |||||
| } else { | |||||
| this.$message.error('分装失败') | |||||
| } | |||||
| }, | |||||
| //获取打印配置 | |||||
| getBasePrintConfig(data = {}) { | |||||
| const { printCode, type, row = {} } = data; | |||||
| const { stepStorageCondition, startDate, expireDate } = this.formData;; | |||||
| const { nickName, name } = this.$store.getters; | |||||
| const lang = this.$i18n.locale; | |||||
| const printConfig = { | |||||
| "品名": "暂时还不知道品名是哪个字段", | |||||
| "存储条件": stepStorageCondition, | |||||
| "配制日期": moment(startDate).format("YYYY-MM-DD"), | |||||
| "有效期至": moment(expireDate).format("YYYY-MM-DD HH:mm"), | |||||
| "配置者": lang === "zh_CN" ? nickName : name, | |||||
| //type==="subPackage"从分装打印过来的, | |||||
| //type==="row" 从列表上点过来的 | |||||
| "编号": type === "subPackage" ? printCode : (row.targetSolutionCode + row.subTargetSolutionCode), | |||||
| } | |||||
| return printConfig | |||||
| }, | |||||
| async getLatestSn(count = 1) { | |||||
| const res = await getLatestSn({ count }) | |||||
| if (res.code === 200) { | |||||
| return res.data | |||||
| } | |||||
| return null | |||||
| }, | |||||
| getResource() { | |||||
| return this.resource | |||||
| }, | |||||
| //根据ref数组获取直接formData | |||||
| getFilledFormDataByRefs(refArr = []) { | |||||
| let result = {} | |||||
| refArr.map((ref) => { | |||||
| const refData = this.$refs[ref]?.getFilledFormData() || {} | |||||
| for (const [key, value] of Object.entries(refData)) { | |||||
| let index = 0 | |||||
| // 如果当前键是可能重复的字段,且结果对象中已经存在该键,则添加索引后缀 | |||||
| if ( | |||||
| (key === 'headerSelectFields' || key === 'stepTableFormData') && | |||||
| result.hasOwnProperty(key) | |||||
| ) { | |||||
| // 为重复字段生成带索引的键名,从1开始(因为第一个组件不需要后缀) | |||||
| const newKey = `${key}_${++index}` | |||||
| result[newKey] = value | |||||
| } else { | |||||
| // 正常合并其他字段 | |||||
| result[key] = value | |||||
| } | |||||
| } | |||||
| }) | |||||
| 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) => { | |||||
| for (const [key, value] of Object.entries(item)) { | |||||
| let index = 0 | |||||
| // 如果当前键是可能重复的字段,且结果对象中已经存在该键,则添加索引后缀 | |||||
| if ( | |||||
| (key === 'headerSelectFields' || key === 'stepTableFormData') && | |||||
| result.hasOwnProperty(key) | |||||
| ) { | |||||
| // 为重复字段生成带索引的键名,从1开始(因为第一个组件不需要后缀) | |||||
| const newKey = `${key}_${++index}` | |||||
| result[newKey] = value | |||||
| } else { | |||||
| // 正常合并其他字段 | |||||
| result[key] = value | |||||
| } | |||||
| } | |||||
| }) | |||||
| 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) | |||||
| }, | |||||
| 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 === '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) | |||||
| } | |||||
| } | |||||
| }, | |||||
| //统一处理blur事件,因为有效周期和过期日期是相关的,所以需要在有效周期失焦时更新过期日期 | |||||
| onHandleBlur(fields) { | |||||
| const { | |||||
| key, | |||||
| effectivePeriodUnit, | |||||
| effectivePeriod, | |||||
| codeSTD, | |||||
| targetStartSolution | |||||
| } = fields | |||||
| const { startDate } = this.formData | |||||
| 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) { | |||||
| const { actVol, actNd } = this.updateSjmbrynd(item, targetAcSolution); | |||||
| this.$refs.stepTableRef?.updateDataSourceByRowIndex(rowIndex, { actSolutionVolume: actVol }) | |||||
| this.$refs.stepTableRef?.updateDataSourceByRowIndex(rowIndex, { actSolutionConcentration: actNd }) | |||||
| } | |||||
| } | |||||
| }, | |||||
| //计算并更新实际目标溶液浓度 先计算实际目标溶液体积再计算实际目标溶液浓度 | |||||
| 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) | |||||
| console.log(actNd,targetAcSolution,actStartSolutionVolume,actVol, "actNd") | |||||
| item.actSolutionConcentration = actNd === 'Infinity' ? 0 : 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 }); | |||||
| } | |||||
| } | |||||
| } | |||||
| //计算并更新实际目标溶液浓度 先计算实际目标溶液体积再计算实际目标溶液浓度 | |||||
| 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) | |||||
| const nd = actNd === 'Infinity' ? 0 : actNd | |||||
| console.log(actNd, targetAcSolution, actStartSolutionVolume, actVol, "actNd") | |||||
| // item.actSolutionConcentration = actNd === 'Infinity' ? 0 : actNd | |||||
| return { actVol, actNd: nd } | |||||
| }, | |||||
| //更新起始溶液体积时,计算目标溶液预计浓度 | |||||
| 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 }); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||