From bf9eff90b9189013d0d824a2492d8a4252e363c6 Mon Sep 17 00:00:00 2001
From: HanLong <404402223@qq.com>
Date: Thu, 5 Feb 2026 22:03:46 +0800
Subject: [PATCH] =?UTF-8?q?feat:[=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86]PCR0?=
=?UTF-8?q?02?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../business/comps/template/comps/pcr/PCR002.vue | 223 ++++++++++++++++++---
.../comps/template/formConfig/PCRTableConfig.js | 9 +-
.../comps/template/mixins/templateMixin.js | 8 +-
src/views/business/resource/sj/comps/Bj.vue | 8 +-
4 files changed, 214 insertions(+), 34 deletions(-)
diff --git a/src/views/business/comps/template/comps/pcr/PCR002.vue b/src/views/business/comps/template/comps/pcr/PCR002.vue
index f0f2022..60c38b9 100644
--- a/src/views/business/comps/template/comps/pcr/PCR002.vue
+++ b/src/views/business/comps/template/comps/pcr/PCR002.vue
@@ -9,19 +9,25 @@
-
+
-
+
+
+
@@ -53,14 +61,15 @@ import TableList from "@/components/Template/Table";
import Step from "@/components/Template/Step";
import templateMixin from "../../mixins/templateMixin";
import CustomTable from '@/components/Template/CustomTable.vue';
-import { getLatestSn } from '@/api/template';
+import { getLatestSnArr } from '@/api/template';
import { EventBus } from "@/utils/eventBus";
import { uniqeResource } from "@/utils/calUnitTools";
-import { debounce } from 'lodash-es'
+import SelectReagentDialog from '../../dialog/SelectReagentDialog.vue';
import { getLadderColumnsConfig } from "../../formConfig/PCRTableConfig.js";
+import TableOpertaion from "@/components/Template/operation/TableOpertaion.vue"
export default {
- name: "PCR001",
- components: { BaseInfoFormPackage, LineLabel, TableList, Step, CustomTable },
+ name: "PCR002",
+ components: { BaseInfoFormPackage, LineLabel, TableList, Step, CustomTable, TableOpertaion, SelectReagentDialog },
mixins: [templateMixin],
props: {
fillType: {
@@ -70,7 +79,7 @@ export default {
},
computed: {
tableStepColumns() {
- return getLadderColumnsConfig(this);
+ return getLadderColumnsConfig(this, 'business_pcr_gzy');
},
// 配置条件
storageFormConfig() {
@@ -233,32 +242,118 @@ export default {
},
data() {
return {
- formData: {}
+ reagentType: null, // 1-表单 2-表格
+ formData: {},
+ currentSubKey: "",//当前点击的子项key
+ currentType: "",//当前点击的类型
+ currentRowIndex: "",//当前点击的行索引
};
},
mounted() {
const formData = this.getFormDataByTemplateData();
- if(this.fillType === "actFill"){
+ if (this.fillType === "actFill") {
this.getCode(formData);
}
},
methods: {
+ //更新记录
+ onSureModifyRecord(key) {
+ if (key === "subStartSolution") {//选择起始源溶液需要同步更新table的变更记录。
+ this.$refs.stepTableRef.updateRecords();
+ }
+ },
+ resetRecord() {
+ this.$refs.stepTableRef.resetRecord();
+ },
+ // 表单点击
+ handleFormClickable(obj) {
+ if (this.fillType === "preFill") {
+ return;
+ }
+ console.log(obj)
+ const subKey = obj.subKey;
+ if (subKey === "subStartSolution" || subKey === "subSolution") {//起始源溶液点击事件
+ this.$refs.selectReagentDialogRef.show(this.formData.id)
+ this.currentSubKey = subKey;
+ this.reagentType = 1;
+ }
+ },
+ //点击表格单元格
+ handleClickable(col, rowIndex) {
+ //本表单特殊字段
+ this.reagentType = 2
+
+ this.rowIndex = rowIndex
+ this.currentSubKey = col.prop;
+ console.log("clickable",rowIndex, col)
+ if(col.prop === "sjry"){
+ //调用对应弹窗的方法-多个点击的需要判断是哪个字段点击
+ this.$refs.selectReagentDialogRef.show(this.formData.id)
+ }
+ },
+ //选择试剂提交事件
+ onSelectReagentSubmit(code,row){
+ if(this.reagentType===1){
+ this.$refs.stepFormPackageRef.updateFormData(this.currentSubKey, code);
+ // 实际起始源溶液浓度:根据所选的起始溶液自动回显浓度
+ if(this.currentSubKey == 'subStartSolution') {
+ this.$refs.stepFormPackageRef.updateFormData("targetAcSolution", row.nd + row.nddw);
+ this.updateStepTableData(row);
+ }
+ }else{
+ this.$refs.stepTableRef.updateDataSourceByRowIndex(this.rowIndex,{
+ [this.currentSubKey]: code,
+ })
+ }
+ this.$refs.selectReagentDialogRef.onCancel()
+ },
+ //更新table数据
+ updateStepTableData(row) {
+ const { stepTableFormData = [] } = this.$refs.stepTableRef.getFilledFormData();
+
+ // 创建新的表格数据副本
+ const newStepTableData = JSON.parse(JSON.stringify(stepTableFormData));
+
+ // 遍历数据,按要求更新起始溶液编号
+ for (let i = 0; i < newStepTableData.length; i++) {
+ const item = newStepTableData[i];
+ if (i === 0) {
+ // 第一条记录的起始溶液编号是确认弹框带出来的,也就是row.code字段
+ newStepTableData[i].startSolutionCode = row.bh;
+ } else {
+ // 第二条的起始溶液编号是第一条数据里面的targetSolutionCode字段,
+ // 第三条的起始溶液编号是第二条数据里面的targetSolutionCode字段,以此类推
+ newStepTableData[i].startSolutionCode = newStepTableData[i - 1].targetSolutionCode + newStepTableData[i - 1].subTargetSolutionCode;
+ }
+ console.log(item, row, 'updateStepTableData')
+ const volResult = this.updateSjmbrynd(item, row.nd);
+ console.log(volResult, 'volResult')
+ if (!volResult) {
+ continue
+ }
+ item.actSolutionVolume = volResult.actVol;
+ item.actSolutionConcentration = volResult.actNd;
+ item.actSolutionExpire = row.sxr;
+ }
+ this.$refs.stepTableRef.updateDataSource(newStepTableData);
+ // 更新tableRef组件的数据
+ },
//获取目标溶液编号
- async getCode(v){
- const {stepTableFormData = []} = v;
- if(stepTableFormData && stepTableFormData.length>0 && !stepTableFormData[0].bhCode){
+ async getCode(v) {
+ const { stepTableFormData = [] } = v;
+ if (stepTableFormData && stepTableFormData.length > 0 && !stepTableFormData[0].bhCode) {
let postSn = []
- for(let i=0;i {
+ }).catch(() => {
+ })
+ .finally(() => {
+ })
+ },
+ startConfig(val) {
+ console.log("开始配置数据:" + JSON.stringify(val))
+ let postData = {
+ bh: val.rowData.bh + val.rowData.bhCode,
+ studyId: this.formData.studyId,
+ studyFormId: this.formData.id,
+ studySubjectId: this.formData.studySubjectId,
+ }
+ console.log("开始配置提交数据:" + JSON.stringify(postData))
+ sj_startConfiguration(postData).then(() => {
+ }).catch(() => {
+ })
+ .finally(() => {
+ })
+ },
+ subPackageSubmit(val) {
+ console.log("分装数据:" + JSON.stringify(val))
+ if (val.fzsj.fzList && val.fzsj.fzList.length > 0) {
+ let list = []
+ for (let i = 0; i < val.fzsj.fzList.length; i++) {
+ let item = val.fzsj.fzList[i]
+ list.push({
+ bh: val.fzsj.mybh + item.preCode,
+ kc: item.num,
+ kcdw: val.fzsj.dw,
+ })
+ }
+ let postData = {
+ studyId: this.formData.studyId,
+ studyFormId: this.formData.id,
+ studySubjectId: this.formData.studySubjectId,
+ bh: val.fzsj.mybh,
+ nd: val.rowData.hhwznd,
+ nddw: val.headerSelectFields.hhwzndUnit,
+ list: list
+ }
+ console.log("分装提交数据:" + JSON.stringify(postData))
+ sj_subpackage(postData).then(() => {
+ }).catch(() => {
+ })
+ .finally(() => {
+ })
+ }
+ },
}
};
diff --git a/src/views/business/comps/template/formConfig/PCRTableConfig.js b/src/views/business/comps/template/formConfig/PCRTableConfig.js
index 7745916..2963d11 100644
--- a/src/views/business/comps/template/formConfig/PCRTableConfig.js
+++ b/src/views/business/comps/template/formConfig/PCRTableConfig.js
@@ -1,15 +1,17 @@
// 阶梯配置表格列配置
-export const getLadderColumnsConfig = ($this) => {
+export const getLadderColumnsConfig = ($this, selectKey) => {
return [
{
label: 'template.pcr.pcr002.mbrybh',
prop: 'targetSolutionCode',
- bodyType: 'input',
+ bodyType: selectKey === '' ? 'input' : 'select',
+ bodyOptions: $this.getDictOptions(selectKey),
+ otherCode: 'bhOther',
bodySubType: 'span',
bodySubKey: 'subTargetSolutionCode',
bodyFillType: 'preFill',
width: 280,
- myCodeFields: ["targetSolutionCode", "subTargetSolutionCode"],//分装的母液编号字段
+ myCodeFields: ["targetSolutionCode", "bhOther", "subTargetSolutionCode"],//分装的母液编号字段
maxVolumeField: "actSolutionVolume",//分装的最大量字段
maxVolumeFieldUnit: "actSolutionVolumeUnit",//分装的最大量单位字段
},
@@ -17,6 +19,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.pcr.pcr002.qsrybh',
prop: 'startSolutionCode',
width: 280,
+ bodyDisabled: true,
bodyType: 'input',
bodyFillType: 'actFill',
bodyMaxlength: 10
diff --git a/src/views/business/comps/template/mixins/templateMixin.js b/src/views/business/comps/template/mixins/templateMixin.js
index 5bea18c..0ef1ebb 100644
--- a/src/views/business/comps/template/mixins/templateMixin.js
+++ b/src/views/business/comps/template/mixins/templateMixin.js
@@ -24,7 +24,8 @@ export default {
'business_sp_xzxytyx', //色谱-编号-选择性与特异性
'business_sp_zdybs', //色谱-编号-最大样本数
'business_sp_xskkx', //色谱-编号-稀释可靠性
- 'business_sp_cbydb' //色谱-编号-储备液对比
+ 'business_sp_cbydb', //色谱-编号-储备液对比
+ 'business_pcr_gzy', // PCR-编号-工作液
],
props: {
templateData: {
@@ -53,11 +54,11 @@ export default {
} = v
if (v.resource) {
//type 类型:1:试剂;3:给药制剂;5:麻精药;7:供试品
- //试验试剂信息 试剂
+ //试验试剂信息 试剂
this.resource = _.filter(JSON.parse(v.resource),function(o){
return o.type==1||o.elnType==1
})
- //试验物资信息 供试品、给药制剂
+ //试验物资信息 供试品、给药制剂
this.resourceWz =_.filter(JSON.parse(v.resource),function(o){
return o.type==3||o.type==7||o.elnType==3||o.elnType==7
})
@@ -380,6 +381,7 @@ export default {
//计算并更新实际目标溶液浓度 先计算实际目标溶液体积再计算实际目标溶液浓度
updateSjmbrynd(item, targetAcSolution) {
+ console.log(item, targetAcSolution, 'updateSjmbrynd')
//实际源溶液浓度÷(实际终体积÷源溶液加入体积);
const precision = item.actSolutionConcentrationPrecision || 0
const volPrecision = item.actSolutionVolumePrecision || 0
diff --git a/src/views/business/resource/sj/comps/Bj.vue b/src/views/business/resource/sj/comps/Bj.vue
index c578680..b2799a4 100644
--- a/src/views/business/resource/sj/comps/Bj.vue
+++ b/src/views/business/resource/sj/comps/Bj.vue
@@ -95,7 +95,7 @@