@@ -414,23 +427,23 @@ export default {
};
},
methods: {
- remoteMethod(query, sItem, key){
+ remoteMethod(query, sItem, key) {
this.$emit('remoteMethod', { query, sItem, key, formFields: this.formFields })
},
//是否显示radio后的select
- isShowRadioSelect(value){
- const arr = ["动物种属","细胞系"];
+ isShowRadioSelect(value) {
+ const arr = ["动物种属", "细胞系"];
return arr.includes(value)
},
onBeforeReagentSubmit(data, callback, key) {
this.$emit('beforeReagentSubmit', { selectData: data, callback, key, formFields: this.formFields })
},
// 点击按钮
- handleClickButton(e, item, val, data) {
- if(!item.isClearForm){
+ handleClickButton(e, item, val, data,key) {
+ if (!item.isClearForm) {
this.formFields[item.subKey] = val;
- }
- this.$emit("clickButton", item, data)
+ }
+ this.$emit("clickButton", item, data,key,this.formFields)
},
// 获取按钮项
getButtonItem(sItem) {
@@ -441,11 +454,21 @@ export default {
fillType: sItem.subFillType || sItem.fillType
}
},
+ // 获取按钮项
+ getThirdButtonItem(sItem) {
+ return {
+ ...sItem,
+ key: sItem.thirdKey,
+ disabled: sItem.thirdDisabled,
+ buttonName: sItem.thirdButtonName,
+ fillType: sItem.thirdFillType || sItem.fillType
+ }
+ },
getFourthButtonItem(sItem) {
return {
...sItem,
key: sItem.fourthKey,
- buttonName:sItem.fourthButtonName,
+ buttonName: sItem.fourthButtonName,
disabled: sItem.fourthDisabled,
fillType: sItem.fourthFillType || sItem.fillType
}
@@ -456,7 +479,7 @@ export default {
this.formFields[key] = e;
},
//是否显示其他输入框的标题
- isShowOtherLabel(sItem){
+ isShowOtherLabel(sItem) {
if (sItem.hasOwnProperty("showOtherLabel")) {
return sItem.showOtherLabel
}
@@ -548,22 +571,26 @@ export default {
.p-r-20 {
padding-right: 20px;
}
-.explain-title{
+
+.explain-title {
font-size: 14px;
font-weight: normal;
color: #606266;
padding-right: 10px;
}
-.explain-item{
+
+.explain-item {
display: flex;
align-items: center;
padding: 10px 0;
}
-.flex-wrap{
+
+.flex-wrap {
flex-wrap: wrap;
}
-.m-r-10{
+
+.m-r-10 {
margin-right: 10px;
}
@@ -649,7 +676,8 @@ export default {
border-radius: 4px;
border: 1px solid #ff5d5d;
}
-.checkboxList-title{
+
+.checkboxList-title {
width: 120px;
text-align: center;
}
diff --git a/src/utils/conConverter.js b/src/utils/conConverter.js
index 63bfea2..dcbb164 100644
--- a/src/utils/conConverter.js
+++ b/src/utils/conConverter.js
@@ -43,7 +43,8 @@ class ConcentrationConverter {
unitCategories = {
'mass': ['mg/mL', 'μg/mL', 'ug/mL', 'ng/mL', 'pg/mL', 'fg/mL', 'g/L', 'mg/L', 'μg/L'],
'mole': ['mol/mL', 'mol/L', 'mmol/L', 'μmol/L', 'umol/L', 'nmol/L', 'pmol/L', 'mmol/mL', 'μmol/mL'],
- 'activity': ['U/mL', 'IU/mL', 'U/L', 'IU/L']
+ 'activity': ['U/mL', 'IU/mL', 'U/L', 'IU/L'],
+ 'percent': ['%']
};
/**
@@ -100,12 +101,12 @@ class ConcentrationConverter {
let inputValue, inputUnit;
if (typeof value === 'string') {
- const match = value.toString().trim().match(/^([\d.]+(?:[eE][+-]?\d+)?)\s*([a-zA-Zμ/]+)$/);
+ const match = value.toString().trim().match(/^([\d.]+(?:[eE][+-]?\d+)?)(?:\s*([a-zA-Zμ/%]+))?$/);
if (!match) {
throw new Error(`输入格式错误: ${value}`);
}
inputValue = parseFloat(match[1]);
- inputUnit = this.normalizeUnit(match[2]);
+ inputUnit = match[2] ? this.normalizeUnit(match[2]) : '';
} else if (typeof value === 'number') {
inputValue = value;
inputUnit = ''; // 无量纲
@@ -124,12 +125,18 @@ class ConcentrationConverter {
return inputValue; // 相同单位,直接返回
}
- // 3. 验证单位类别
+ // 3. 检查是否为%单位
+ if (inputUnit === '%' || normalizedTargetUnit === '%') {
+ // %单位是单独的系列,不进行转换
+ throw new Error(`单位类别不匹配: ${inputUnit} 不能转换为 ${targetUnit}`);
+ }
+
+ // 4. 验证单位类别
if (!this.isSameCategory(inputUnit, normalizedTargetUnit)) {
throw new Error(`单位类别不匹配: ${inputUnit} 不能转换为 ${targetUnit}`);
}
- // 4. 执行转换
+ // 5. 执行转换
return this._convertValue(inputValue, inputUnit, normalizedTargetUnit);
}
diff --git a/src/utils/conTools.js b/src/utils/conTools.js
index da25f3a..b0b53f6 100644
--- a/src/utils/conTools.js
+++ b/src/utils/conTools.js
@@ -10,6 +10,11 @@ export const isCommonUnit = (startUnit, units) => {
return false;
}
+ // 检查是否为%单位
+ const isPercentUnit = (unit) => {
+ return unit.trim() === '%';
+ };
+
// 提取单位分子部分(斜杠前的部分)
const extractNumerator = (unit) => {
const normalizedUnit = unit
@@ -48,6 +53,26 @@ export const isCommonUnit = (startUnit, units) => {
return 'other';
};
+ // 检查基准单位是否为%单位
+ if (isPercentUnit(startUnit)) {
+ // 所有单位都必须是%
+ for (const unit of units) {
+ if (!isPercentUnit(unit)) {
+ console.log(`单位 ${unit} 不是%单位,与基准单位不同`);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // 检查所有单位是否有%单位
+ for (const unit of units) {
+ if (isPercentUnit(unit)) {
+ console.log(`单位 ${unit} 是%单位,与基准单位 ${startUnit} 不同`);
+ return false;
+ }
+ }
+
// 获取基准单位的分子类别
const startNumerator = extractNumerator(startUnit);
if (!startNumerator) {
diff --git a/src/views/business/comps/template/comps/gsp/GSP015.vue b/src/views/business/comps/template/comps/gsp/GSP015.vue
index c749b2b..8162e3b 100644
--- a/src/views/business/comps/template/comps/gsp/GSP015.vue
+++ b/src/views/business/comps/template/comps/gsp/GSP015.vue
@@ -8,16 +8,18 @@
-
+
-
新增
-
导出
+
新增
+
导出
-
新增
-
导出
+
新增
+
导出
-
+
@@ -99,7 +100,11 @@ import templateMixin from "../../mixins/templateMixin";
import CustomTable from '@/components/Template/CustomTable.vue';
import { uniqeResource } from "@/utils/calUnitTools";
import { getuuid, justUpdateFilledFormData } from "@/utils/index";
-import { getBaseInfoFormConfig, getRemarkFormConfig, getYbsmFormConfig, getQyTableColumns,getJyTableColumns,getEcFormConfig } from "../../formConfig/gsp/gsp015";
+import { isCommonUnit } from "@/utils/conTools";
+import { convertConcentration } from "@/utils/conConverter";//浓度单位转换
+import { volumeConverter } from "@/utils/volConverter";//体积单位转换
+import moment from "moment";//时间处理
+import { getBaseInfoFormConfig, getRemarkFormConfig, getYbsmFormConfig, getQyTableColumns, getJyTableColumns, getEcFormConfig } from "../../formConfig/gsp/gsp015";
const refConfig = {
baseInfoRef: "baseInfoRef",
remarkRef: "remarkRef",
@@ -137,7 +142,7 @@ export default {
ybsmColumns() {
return getQyTableColumns(this)
},
- //进样表格列
+ //进样表格列
yjColumns() {
return getJyTableColumns(this)
},
@@ -156,21 +161,82 @@ export default {
},
methods: {
+ handleClickButton(item,signData,key,formFields,index){
+ const {} = item;
+ const ref = this.$refs[`ybsmFormPackageRef${index}`][0];
+ if(key === "startButton"){
+ ref.updateFormData("qysj",moment().format("YYYY/MM/DD HH:mm:ss"),{ isUpdateRecord: true, signData })
+ }else if(key === "endButton"){
+ const qysj = formFields.qysj;
+ if(!qysj){
+ this.$message.error("请先记录开始时间");
+ return;
+ }
+ const subQysj = qysj.substr(0,19)
+ const endTime = moment().format("YYYY/MM/DD HH:mm:ss");
+ ref.updateFormData("qysj",`${subQysj} ~ ${endTime}`,{ isUpdateRecord: true, signData })
+ }
+ },
+ onHandleTableBlur(e, index, refName) {
+ if (this.fillType === 'preFill') {
+ return
+ }
+ const { colKey, headerSelectFields, item } = e;
+ //[标定体积,取样体积,进样体积,取样浓度]
+ const keys = ["bdtj", "qytj", "jytj", "qynd"];
+ if (keys.includes(colKey)) {
+ const { bdtj, qytj, jytj, qynd, xsbsxsd, sjjyndsd, ztjxsd, xsbs } = item;
+ const { bdtjdw, qytjdw, jytjdw, qynddw, ztjdw, sjjynddw } = headerSelectFields || {};
+
+ //将标定体积的单位转换成和终体积单位一致再计算;
+
+
+ if (!!bdtj && !!qytj) {
+ const transBdtj = volumeConverter.convert(bdtj + bdtjdw, ztjdw);//转换后的标定体积
+ const transQytj = volumeConverter.convert(qytj + qytjdw, ztjdw);//转换后的取样体积
+ //稀释倍数:标定体积 除以 取样体积
+ const bs = parseFloat((transBdtj / transQytj).toFixed(xsbsxsd));
+ item.xsbs = bs;
+
+ }
+ if (!!bdtj && !!jytj) {
+ const transBdtj = volumeConverter.convert(bdtj + bdtjdw, ztjdw);//转换后的标定体积
+ const transJytj = volumeConverter.convert(jytj + jytjdw, ztjdw);//转换后的进样体积
+ //终体积:标定体积 - 进样体积
+ const ztj = parseFloat((transBdtj - transJytj).toFixed(ztjxsd));
+ item.ztj = ztj;
+ }
+ if (!!qynd && !!xsbs) {
+ const transQynd = convertConcentration.convert(qynd + qynddw, sjjynddw);//转换后的取样浓度
+ //实际进样浓度:取样浓度 除以 稀释倍数
+ const sjjynd = parseFloat((transQynd / xsbs).toFixed(sjjyndsd));
+ item.sjjynd = sjjynd;
+ }
+
+ }
+ },
+ addEcTableRow(index, refName = "ecTableRef") {
+ this.$refs[`${refName + index}`][0].addRow({
+ xsbsxsd: 3,
+ ztjxsd: 3,
+ sjjyndsd: 3,
+ id: getuuid(),
+ })
+ this.justUpdateFilledFormData();
+ },
//新增样本说明表格行
addTableRow(index) {
- console.log(this.formData.ybsmDataList,"ybsmDataList")
this.$refs[`ybsmTableRef${index}`][0].addRow({
id: getuuid(),
})
- this.$refs[`jyTableRef${index}`][0].addRow({
- id: getuuid(),
- })
+ this.addEcTableRow(index, "jyTableRef");
+
+ },
+ onExport() {
+
},
- onExport() {
-
- },
//删除样本说明
- deleteConfig(item,type="ybsmDataList") {
+ deleteConfig(item, type = "ybsmDataList") {
if (this.formData[type].length > 1) {
const configIndex = this.formData[type].findIndex(config => config.id === item.id);
if (configIndex > -1) {
@@ -194,12 +260,13 @@ export default {
}
let defaultInfo = {
id: getuuid(),
- stepData: [],
}
+ this.formData = { ...this.formData, ...this.getFilledFormData() };
// 添加新的平行配制配置
this.formData[type].push(defaultInfo);
+ this.justUpdateFilledFormData();
},
-
+
// 删除表格行
deleteTableRow(rowIndex, index) {
this.$refs[`ybsmTableRef${index}`][0].deleteRow(rowIndex)
@@ -209,18 +276,19 @@ export default {
getFilledFormData() {
// 基础表单数据
const baseData = this.getFilledFormDataByRefs(compRefs);
- const ybsmDataList = this.formData.ybsmDataList.map((item, index) => {
+ const { ybsmDataList = [], ecDataList = [] } = this.formData
+ const yData = ybsmDataList.map((item, index) => {
const ybsmFormData = this.$refs[`ybsmFormPackageRef${index}`][0]?.getFilledFormData() || {};
const ybsmTableData = this.$refs[`ybsmTableRef${index}`][0]?.getFilledFormData() || [];
const jyTableData = this.$refs[`jyTableRef${index}`][0]?.getFilledFormData() || [];
return {
...ybsmFormData,
...ybsmTableData,
- jyStepTableFormData:jyTableData.stepTableFormData,
+ jyStepTableFormData: jyTableData.stepTableFormData,
jyHeaderSelectFields: jyTableData.headerSelectFields,
};
});
- const ecDataList = this.formData.ecDataList.map((item, index) => {
+ const eData = ecDataList.map((item, index) => {
const ecFormData = this.$refs[`ecFormPackageRef${index}`][0]?.getFilledFormData() || {};
const ecTableData = this.$refs[`ecTableRef${index}`][0]?.getFilledFormData() || [];
return {
@@ -230,15 +298,15 @@ export default {
});
return {
...baseData,
- ybsmDataList,
- ecDataList
+ ybsmDataList: yData,
+ ecDataList: eData
};
},
//获取填写完成的表单数据
async getFormData() {
-
+
const refs = [];
- const {ecDataList = [],ybsmDataList = []} = this.formData
+ const { ecDataList = [], ybsmDataList = [] } = this.getFilledFormData();
// 验证多个样本说明项
for (let index = 0; index < ybsmDataList.length; index++) {
@@ -252,9 +320,24 @@ export default {
refs.push(`ecFormPackageRef${index}`)
refs.push(`ecTableRef${index}`)
}
- // 基础表单验证
+ // 基础表单验证
let content = await this.validFormFields([...compRefs, ...refs]);
if (!content) return false;
+ if (!ybsmDataList.length) {
+ this.$message.error('请添加取样进样信息');
+ return false;
+ } else if (!ecDataList.length) {
+ this.$message.error('请添加二次稀释信息');
+ return false;
+ }
+ const diff1 = ybsmDataList.every(item => isCommonUnit(item.jyHeaderSelectFields.qynddw, [item.jyHeaderSelectFields.sjjynddw]));
+ const diff2 = ecDataList.every(item => isCommonUnit(item.headerSelectFields.qynddw, [item.headerSelectFields.sjjynddw]));
+ console.log(diff1, diff2, "dff")
+
+ if (!diff1 || !diff2) {
+ this.$message.error("取样浓度单位与实际进样浓度单位不符,请重新选择!");
+ return false;
+ }
// 获取所有数据
return this.getFilledFormData();
},
@@ -287,9 +370,9 @@ export default {
let allSjResource = [];
let allYqResource = [];
// 收集所有样本说明项的步骤资源
- const stepResource = this.$refs[`stepRef`]?.getStepResource() || { sjResource: [], yqResource: [] };
- allSjResource = [...allSjResource, ...(stepResource.sjResource || [])];
- allYqResource = [...allYqResource, ...(stepResource.yqResource || [])];
+ const stepResource = this.$refs[`stepRef`]?.getStepResource() || { sjResource: [], yqResource: [] };
+ allSjResource = [...allSjResource, ...(stepResource.sjResource || [])];
+ allYqResource = [...allYqResource, ...(stepResource.yqResource || [])];
this.resourceTmp = uniqeResource(tmpResource, allSjResource)
this.yqResourceTmp = allYqResource
return this.resourceTmp;
diff --git a/src/views/business/comps/template/comps/sp/SP0021.vue b/src/views/business/comps/template/comps/sp/SP0021.vue
index 03b33ef..5d6cd2c 100644
--- a/src/views/business/comps/template/comps/sp/SP0021.vue
+++ b/src/views/business/comps/template/comps/sp/SP0021.vue
@@ -154,6 +154,7 @@ export default {
const { ybsmDataList } = this.formData
defaultInfo.stepData = ybsmDataList[0]?.stepData || []
}
+ this.formData = { ...this.formData, ...this.getFilledFormData() };
// 添加新的平行配制配置
this.formData.ybsmDataList.push(defaultInfo);
},
diff --git a/src/views/business/comps/template/comps/sp/SP00456.vue b/src/views/business/comps/template/comps/sp/SP00456.vue
index 3542a5a..c06aa51 100644
--- a/src/views/business/comps/template/comps/sp/SP00456.vue
+++ b/src/views/business/comps/template/comps/sp/SP00456.vue
@@ -300,10 +300,10 @@ export default {
// 初始化平行配制配置列表
if (!this.formData[configType]) {
// 新增配置的时候,把最新的formdata重新赋值一份,避免选板数据丢失的bug。
- this.formData = { ...this.formData, ...this.getFilledFormData() };
this.$set(this.formData, configType, []);
// this.formData[configType] = [];
}
+ this.formData = { ...this.formData, ...this.getFilledFormData() };
// 添加新的平行配制配置
this.formData[configType].push({
id: getuuid(),
diff --git a/src/views/business/comps/template/formConfig/gsp/gsp015.js b/src/views/business/comps/template/formConfig/gsp/gsp015.js
index 7f213c9..95e22a2 100644
--- a/src/views/business/comps/template/formConfig/gsp/gsp015.js
+++ b/src/views/business/comps/template/formConfig/gsp/gsp015.js
@@ -84,7 +84,14 @@ export const getYbsmFormConfig = ($this) => {
label: '取样时间',
type: 'input',
fillType: 'actFill',
- maxlength: 50
+ maxlength: 50,
+ disabled: true,
+ subType:"button",
+ subKey: "startButton",
+ buttonName:"开始",
+ thirdType: 'button',
+ thirdKey: 'endButton',
+ thirdButtonName:"结束",
},
xsy: {
label: "template.sp.sp003.xsy",
@@ -109,8 +116,6 @@ export const getQyTableColumns = ($this) => {
width: 280,
bodyType: 'input',
bodyFillType: 'preFill',
- bodySubType: 'span',
- bodySubKey: 'qybhcode',
},
{
label: '制剂编号',
@@ -174,6 +179,7 @@ export const getQyTableColumns = ($this) => {
fillType: "preFill",
headerOptions: $this.getDictOptions('business_tjdw'),
bodyType: 'inputNumber',
+ bodyMaxlength:10,
bodyFillType: 'preFill',
headerSelectTo: 'sjqydw',
},
@@ -201,8 +207,6 @@ export const getJyTableColumns = ($this) => {
width: 280,
bodyType: 'input',
bodyFillType: 'preFill',
- bodySubType: 'span',
- bodySubKey: 'jybhcode',
},
{
label: '取样编号',
@@ -255,9 +259,6 @@ export const getJyTableColumns = ($this) => {
label: '稀释倍数',
prop: 'xsbs',
width: 280,
- headerSelectKey: 'jytjdw',
- fillType: "preFill",
- headerOptions: $this.getDictOptions('business_tjdw'),
bodyType: 'inputNumber',
bodyFillType: 'actFill',
bodySubType: "inputNumber",