import moment from 'moment'
|
|
import { getLatestSn } from '@/api/template';
|
|
import { sj_subpackage, sj_startConfiguration, sj_configurationCompleted } from '@/api/business/sj/sj';
|
|
export default {
|
|
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 {
|
|
studySubjectId,
|
|
studyId,
|
|
studyMc,
|
|
studySn,
|
|
templateMc,
|
|
templateMcEn,
|
|
templateSn,
|
|
startDate,
|
|
bdmc,
|
|
endDate,
|
|
id
|
|
} = v
|
|
if (v.resource) {
|
|
//试验试剂信息
|
|
this.resource = JSON.parse(v.resource)
|
|
}
|
|
if (v.yqResource) {
|
|
//仪器信息
|
|
this.yqResource = JSON.parse(v.yqResource)
|
|
}
|
|
if (v.bdnr) {
|
|
this.formData = {
|
|
...JSON.parse(v.bdnr),
|
|
studySubjectId,
|
|
studyId,
|
|
studyMc,
|
|
studySn,
|
|
templateMc,
|
|
templateMcEn,
|
|
templateSn,
|
|
startDate,
|
|
bdmc,
|
|
endDate,
|
|
id
|
|
}
|
|
} else {
|
|
this.formData = {
|
|
studySubjectId,
|
|
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: [], //试验试剂信息
|
|
yqResource: [], //仪器信息
|
|
yqResourceTmp: [], //仪器信息提交用
|
|
resourceTmp:[],//试验试剂信息提交用
|
|
sysjColumns: [
|
|
{ label: 'template.common.reagentName', prop: "mc" },//名称
|
|
{ label: 'template.common.reagentCode', prop: "bh" },//编号
|
|
{ label: 'template.common.reagentNo', prop: "ph" },//批号 试剂,供试品才有
|
|
{ label: 'template.common.concentration', prop: "nd" },//浓度
|
|
{ label: 'template.common.source', prop: "source" },//来源
|
|
{ label: 'template.common.reagentExpireDate', prop: "sxrq" },//失效日期
|
|
],
|
|
yqsColumns: [
|
|
{ label: 'template.common.instrumentName', prop: "mc" },//仪器名称
|
|
{ label: 'template.common.instrumentModel', prop: "xh" },//仪器型号
|
|
{ label: 'template.common.instrumentCode', prop: "bh" },//仪器编号
|
|
{ label: 'template.common.nextTestDate', prop: "jzrq" },//下次测试/校准/检定日期
|
|
],
|
|
}
|
|
},
|
|
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.resourceTmp
|
|
},
|
|
getYqResource() {
|
|
return this.yqResourceTmp
|
|
},
|
|
//根据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)
|
|
},
|
|
|
|
//统一处理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)
|
|
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 });
|
|
}
|
|
}
|
|
}
|
|
}
|