From ad625bf3b10885d2b767a0e43ec12a888d87b66d Mon Sep 17 00:00:00 2001
From: luojie <125330818@qq.com>
Date: Tue, 10 Feb 2026 22:06:47 +0800
Subject: [PATCH] =?UTF-8?q?feat:[=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86][?=
=?UTF-8?q?=E7=83=A6=E4=BA=BA=E7=9A=84=E6=B5=93=E5=BA=A6=E8=AE=A1=E7=AE=97?=
=?UTF-8?q?=E5=92=8C=E5=8D=95=E4=BD=8D=E6=8D=A2=E7=AE=97]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/Template/BaseInfoFormPackage.vue | 12 +++++++-
src/components/Template/CustomTable.vue | 7 +++++
src/components/Template/HandleFormItem.vue | 32 +++++++++++++++++++++-
.../business/comps/template/TemplateTable.vue | 4 +++
.../business/comps/template/comps/sp/SP003.vue | 8 ++++--
.../business/comps/template/comps/sp/SP00456.vue | 8 ++++++
.../template/dialog/SelectMixReagentDialog.vue | 5 +++-
.../comps/template/mixins/templateMixin.js | 10 +++++++
8 files changed, 80 insertions(+), 6 deletions(-)
diff --git a/src/components/Template/BaseInfoFormPackage.vue b/src/components/Template/BaseInfoFormPackage.vue
index 5773b94..a22e75d 100644
--- a/src/components/Template/BaseInfoFormPackage.vue
+++ b/src/components/Template/BaseInfoFormPackage.vue
@@ -103,7 +103,9 @@
:item="sItem" :value="formFields[key]" />
- onBeforeReagentSubmit(data, callback,key)"
+ :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+key" :type="sItem.type"
sourceFrom = "baseInfoFormPackage"
:error="errors[key]" @update:error="errors[key] = false"
@onRegentSubmit="(data)=>onRegentSubmit(data,key,sItem)"
@@ -158,6 +160,7 @@
onBeforeReagentSubmit(data, callback,sItem.subKey)"
@onRegentSubmit="(data)=>onRegentSubmit(data,sItem.subKey,sItem)"
:error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
:value="formFields[sItem.subKey]" />
@@ -194,6 +197,7 @@
onBeforeReagentSubmit(data, callback,sItem.subKey)"
@onRegentSubmit="(data)=>onRegentSubmit(data,sItem.subKey,sItem)"
:item="getRegentItem(sItem,'subType')" :value="formFields[sItem.subKey]" />
@@ -208,6 +212,7 @@
class="flex flex1">
onBeforeReagentSubmit(data, callback,key)"
@onRegentSubmit="(data)=>onRegentSubmit(data,key,sItem)"
:field-key="prefixKey+'_'+key" :type="sItem.type"
:error="errors[key]" @update:error="errors[key] = false"
@@ -270,6 +275,11 @@ export default {
isRegent
};
},
+ methods: {
+ onBeforeReagentSubmit(data, callback, key) {
+ this.$emit('beforeReagentSubmit',{selectData:data, callback, key,formFields:this.formFields})
+ },
+ }
}
diff --git a/src/components/Template/CustomTable.vue b/src/components/Template/CustomTable.vue
index 3364b46..bd63a94 100644
--- a/src/components/Template/CustomTable.vue
+++ b/src/components/Template/CustomTable.vue
@@ -98,6 +98,7 @@
:item="getBodyItem(col, rowIndex)" :value="row[col.prop]"
:error="hasError(rowIndex, colIndex, col.prop)"
@onRegentSubmit="(data)=>onRegentSubmit(data,col, rowIndex, colIndex, row)"
+ @beforeReagentSubmit="(data, callback)=>onBeforeReagentSubmit(data, callback,col,row)"
@update:error="onErrorUpdate(rowIndex, colIndex, col.prop, $event)"
:orange-bg="hasOrangeBg(rowIndex, colIndex, col.prop)" />
@@ -331,6 +332,12 @@ export default {
}
this.$emit("clickable", col, rowIndex, row)
},
+ onBeforeReagentSubmit(data, callback, col, row){
+ if (this.templateFillType !== 'actFill') {
+ return
+ }
+ this.$emit("beforeReagentSubmit", {selectData:data, callback, key:col.prop, rowData:row})
+ },
onRegentSubmit(data, col, rowIndex, colIndex, row){
if (this.templateFillType !== 'actFill') {
return
diff --git a/src/components/Template/HandleFormItem.vue b/src/components/Template/HandleFormItem.vue
index d9c0c20..906307f 100644
--- a/src/components/Template/HandleFormItem.vue
+++ b/src/components/Template/HandleFormItem.vue
@@ -360,10 +360,40 @@ export default {
//试剂弹窗提交
onMixReagentSubmit(data) {
if (data.uuid !== this.uuid) return;
+
+ // 创建一个验证控制器,用于收集各级验证结果
+ const validationController = {
+ isPrevented: false,
+ errorMsg: '',
+ prevent(msg) {
+ this.isPrevented = true;
+ if (msg) this.errorMsg = msg;
+ }
+ };
+
+ // 触发自定义验证事件,让父组件判断是否满足需求
+ // 父组件可以通过validationController.prevent(msg)来阻止提交
+ this.$emit('beforeReagentSubmit', data, validationController);
+
+ // 检查是否被阻止
+ if (validationController.isPrevented) {
+ // 验证不通过,显示错误信息
+ if (validationController.errorMsg) {
+ this.$message.error(validationController.errorMsg);
+ }
+ return;
+ }
+
+ // 验证通过,继续执行
+ this.executeReagentSubmit(data);
+ },
+
+ // 执行试剂提交的共同逻辑
+ executeReagentSubmit(data) {
this.inputValue = data.selectedId;
this.selectRegentInfo = data;
+ EventBus.$emit("hideSelectMixReagentDialog");
this.onCommonHandleSaveRecord(this.inputValue);
- // this.inputValue = this.item.label;
},
//统一处理试剂/供试品等弹窗
onCommonHandleRegent(item, type) {
diff --git a/src/views/business/comps/template/TemplateTable.vue b/src/views/business/comps/template/TemplateTable.vue
index 7d696ed..8dd42d9 100644
--- a/src/views/business/comps/template/TemplateTable.vue
+++ b/src/views/business/comps/template/TemplateTable.vue
@@ -240,6 +240,9 @@ export default {
EventBus.$on("showSelectMixReagentDialog", (data) => {
this.$refs.selectMixReagentDialogRef.show(data.studyFormId, data)
})
+ EventBus.$on("hideSelectMixReagentDialog", (data) => {
+ this.$refs.selectMixReagentDialogRef.hide()
+ })
//显示电子签名弹窗
EventBus.$on("showEditSignDialog", (data) => {
this.currentEditSignUuid = data.uuid;
@@ -255,6 +258,7 @@ export default {
EventBus.$off("showSelectInstrumentDialog");
EventBus.$off("showSelectMixReagentDialog");
EventBus.$off("showEditSignDialog");
+ EventBus.$off("hideSelectMixReagentDialog");
this.debouncedEmit.cancel()
},
methods: {
diff --git a/src/views/business/comps/template/comps/sp/SP003.vue b/src/views/business/comps/template/comps/sp/SP003.vue
index 227ee77..e449508 100644
--- a/src/views/business/comps/template/comps/sp/SP003.vue
+++ b/src/views/business/comps/template/comps/sp/SP003.vue
@@ -16,7 +16,9 @@
onRegentSubmit('ladder', ladderIndex, e)"
+ @beforeReagentSubmit="(data) => onBeforeReagentSubmit(data,ladderIndex, ladderConfig)"
:ref="`ladderStepFormPackageRef_${ladderIndex}`" :formConfig="ladderStepFormConfig"
:formData="ladderConfig" :fieldItemLabel="$t('template.common.jtpz')"
:prefixKey="'ladder_' + ladderIndex" />
@@ -76,6 +77,7 @@
onHandleTableBlur('paralle', paralleIndex, e)"
:ref="`paralleStepTableRef_${paralleIndex}`" :showOperation="fillType === 'actFill' || fillType === 'preFill'"
:columns="paralleStepColumns"
+ @beforeReagentSubmit="(data) => onTableBeforeReagentSubmit(data, paralleIndex, paralleConfig)"
@onRegentSubmit="(data) => onTableRegentSubmit('paralle', paralleIndex, data)"
:formData="paralleConfig" :prefixKey="'paralle' + paralleIndex"
:fieldItemLabel="$t('template.common.pxpz')">
@@ -432,6 +434,12 @@ export default {
}
},
+ onTableBeforeReagentSubmit(data){
+ const {selectData, callback, key, rowData} = data;
+ if(key === "actStartSolutionCode" && !isCommonUnit(selectData.row.nddw,[rowData.targetStartSolutionConcentrationPrecision])){//选择起始源溶液需要同步更新table的变更记录。
+ callback.prevent('浓度单位与预制不符,请重新选择或申请废止并重新预制。');
+ }
+ },
//平行配置 table选择试剂确定弹窗
onTableRegentSubmit(type, configIndex, data) {
const { selectInfo, rowIndex, key, rowData } = data;
diff --git a/src/views/business/comps/template/dialog/SelectMixReagentDialog.vue b/src/views/business/comps/template/dialog/SelectMixReagentDialog.vue
index 5791b1c..595c6d3 100644
--- a/src/views/business/comps/template/dialog/SelectMixReagentDialog.vue
+++ b/src/views/business/comps/template/dialog/SelectMixReagentDialog.vue
@@ -119,6 +119,9 @@ export default {
this.handleShowTableInfo(type);
},
+ hide() {
+ this.visible = false;
+ },
handleOtherChange(val) {
this.otherChecked = val;
if (val) {//如果选中了其他,那么就清空选中的id
@@ -159,7 +162,7 @@ export default {
this.$emit('submit', selectedValue, row);
// 触发eventBus事件
EventBus.$emit("onMixReagentSubmit", { selectInfo, uuid: this.uuid, selectedId: selectedValue, row,selectType:this.selectType });
- this.visible = false;
+ // this.visible = false;
},
// 选择试剂时处理
handleSelect(code, row) {
diff --git a/src/views/business/comps/template/mixins/templateMixin.js b/src/views/business/comps/template/mixins/templateMixin.js
index ee7e696..87ba982 100644
--- a/src/views/business/comps/template/mixins/templateMixin.js
+++ b/src/views/business/comps/template/mixins/templateMixin.js
@@ -1,6 +1,7 @@
import moment from 'moment'
import { getLatestSn, getLatestSnArr } from '@/api/template';
import { isValueEmpty } from '@/utils/index';
+import { isCommonUnit } from "@/utils/conTools";
import { sj_subpackage, sj_startConfiguration, sj_configurationCompleted } from '@/api/business/sj/sj';
export default {
dicts: [
@@ -162,6 +163,15 @@ export default {
this.setTemplateData({})
},
methods: {
+ //试剂弹窗确认前
+ onBeforeReagentSubmit(data){
+ const {selectData, callback, key, formFields} = data;
+ const {subTargetStartSolution} = formFields;
+ //判断选择的浓度单位和预制的浓度单位是否一致
+ if(key === "subStartSolution" && !isCommonUnit(selectData.row.nddw,[subTargetStartSolution])){//选择起始源溶液需要同步更新table的变更记录。
+ callback.prevent('浓度单位与预制不符,请重新选择或申请废止并重新预制。');
+ }
+ },
getFormDataByTemplateData() {
let o = {};
const { bdnr } = this.templateData