Browse Source

feat:[模板管理][update]

ouqian
luojie 1 month ago
parent
commit
8dcddacd5c
7 changed files with 278 additions and 133 deletions
  1. +99
    -71
      src/components/Template/BaseInfoFormPackage.vue
  2. +12
    -5
      src/utils/conConverter.js
  3. +25
    -0
      src/utils/conTools.js
  4. +131
    -48
      src/views/business/comps/template/comps/gsp/GSP015.vue
  5. +1
    -0
      src/views/business/comps/template/comps/sp/SP0021.vue
  6. +1
    -1
      src/views/business/comps/template/comps/sp/SP00456.vue
  7. +9
    -8
      src/views/business/comps/template/formConfig/gsp/gsp015.js

+ 99
- 71
src/components/Template/BaseInfoFormPackage.vue View File

@ -10,8 +10,7 @@
<div class="form-title">{{ $t(sItem.label) }}</div>
<HandleFormItem :field-item-label="fieldItemLabel" @blur="onBlur(key, $event)" :item="sItem"
v-model="formFields[key]" :field-key="prefixKey + '_' + key" @copy="onCopy(sItem, key)"
:error="errors[key]" @update:error="errors[key] = false"
:type="sItem.type"
:error="errors[key]" @update:error="errors[key] = false" :type="sItem.type"
:orange-bg="orangeBgFields[key]" />
</template>
</div>
@ -33,7 +32,7 @@
</div>
<div class="p-l-20">
<div v-show="isShowOther(formFields[key])">
<div class="form-title" >{{ sItem.otherLabel ? $t(sItem.otherLabel) :
<div class="form-title">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
$t("template.common.other") }}</div>
<div class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel"
@ -73,17 +72,18 @@
<div class="form-title" v-if="sItem.label">{{ $t(sItem.label) }}</div>
<div v-if="sItem.type === 'dateTime' || sItem.type === 'datePicker'" class="flex1">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
:type="sItem.type" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
:error="errors[key]" @update:error="errors[key] = false"
:type="sItem.type" :item="sItem" v-model="formFields[key]"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
</div>
<div v-else-if="sItem.type === 'select'" class = "flex flex1">
<div v-else-if="sItem.type === 'select'" class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
type="select" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
@change="(e, type) => onSelectChange(key, e, type)" :error="errors[key]"
@update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
<div v-show="isShowOther(formFields[key])" class="flex flex1 ml-10">
<div class="other-title" v-if="isShowOtherLabel(sItem)">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
<div class="other-title" v-if="isShowOtherLabel(sItem)">{{ sItem.otherLabel ?
$t(sItem.otherLabel) :
$t("template.common.other") }}</div>
<div class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel"
@ -95,16 +95,19 @@
</div>
</div>
</div>
<div v-else-if="sItem.type === 'input'||sItem.type === 'textarea' || sItem.type === 'inputNumber'" class="item-center">
<div v-else-if="sItem.type === 'input' || sItem.type === 'textarea' || sItem.type === 'inputNumber'"
class="item-center">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
@blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]"
:type="sItem.type"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
:ref="key" :orange-bg="orangeBgFields[key]" />
:type="sItem.type" @copy="onCopy(sItem, key)" :error="errors[key]"
@update:error="errors[key] = false" :ref="key" :orange-bg="orangeBgFields[key]" />
<span v-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
<HandleFormItem class="ml-10" v-else-if="sItem.subType === 'button'" type="button"
:item="getButtonItem(sItem)" :value="formFields[sItem.subKey]"
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data,sItem.subKey)" />
<HandleFormItem class="ml-10" v-else-if="sItem.thirdType === 'button'" type="button"
:item="getThirdButtonItem(sItem)" :value="formFields[sItem.thirdKey]"
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data,sItem.thirdKey)" />
</div>
<div v-else-if="sItem.type === 'clickable'" class="flex1">
@ -124,8 +127,7 @@
</div>
<!-- 勾选某些选项时出现其他输入框 -->
<div v-else-if="sItem.type === 'radioAndOther'" class="item-center"
:class="{'form-error-border': errors[key]}"
>
:class="{ 'form-error-border': errors[key] }">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
type="radio" :error="errors[key]" @update:error="errors[key] = false"
@change="(e, type) => onSelectChange(key, e, type)" :item="sItem"
@ -155,12 +157,14 @@
</template>
<div class="flex flex-wrap" v-else-if="item.type === 'explainItem'">
<div v-for="(sItem, key) in item.config" :key="key" class="explain-item">
<div v-if="sItem.type === 'input' || sItem.type === 'textarea' || sItem.type === 'inputNumber'" class="m-r-10">
<div v-if="sItem.type === 'input' || sItem.type === 'textarea' || sItem.type === 'inputNumber'"
class="m-r-10">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
:type="sItem.type" :item="sItem" style="width: auto;flex:1" :style = "{'width': sItem.formWidth ? sItem.formWidth + 'px' : 'auto'}" v-model="formFields[key]"
@copy="onCopy(sItem, key)" @change="(e, type) => onSelectChange(key, e, type)"
:error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
:type="sItem.type" :item="sItem" style="width: auto;flex:1"
:style="{ 'width': sItem.formWidth ? sItem.formWidth + 'px' : 'auto' }"
v-model="formFields[key]" @copy="onCopy(sItem, key)"
@change="(e, type) => onSelectChange(key, e, type)" :error="errors[key]"
@update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
</div>
<span v-else-if="sItem.type === 'span'" class="explain-title">{{ $t(sItem.label) }}</span>
</div>
@ -183,21 +187,22 @@
:error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
</div>
<div v-else-if="sItem.type === 'select' ||sItem.type === 'radio'" class="flex flex1">
<div v-else-if="sItem.type === 'select' || sItem.type === 'radio'" class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
:type="sItem.type" :item="sItem" style="width: auto;flex:1" v-model="formFields[key]"
@copy="onCopy(sItem, key)" @change="(e, type) => onSelectChange(key, e, type)"
@remoteMethod="(query)=>remoteMethod(query, sItem,key)"
:error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
<div v-show="isShowOther(formFields[key]) || isShowRadioSelect(formFields[key])" class="flex flex1 ml-10">
<div class="other-title" v-if="isShowOtherLabel(sItem) && isShowOther(formFields[key])">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
$t("template.common.other") }}</div>
@remoteMethod="(query) => remoteMethod(query, sItem, key)" :error="errors[key]"
@update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
<div v-show="isShowOther(formFields[key]) || isShowRadioSelect(formFields[key])"
class="flex flex1 ml-10">
<div class="other-title" v-if="isShowOtherLabel(sItem) && isShowOther(formFields[key])">
{{ sItem.otherLabel ? $t(sItem.otherLabel) :
$t("template.common.other") }}</div>
<div class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
:item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
:type = "isShowOther(formFields[key]) ? 'input' : 'select'"
:type="isShowOther(formFields[key]) ? 'input' : 'select'"
@copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
@update:error="errors[sItem.otherCode] = false"
:orange-bg="orangeBgFields[sItem.otherCode]" />
@ -206,10 +211,9 @@
</div>
<div v-else-if="sItem.type === 'input' || sItem.type === 'inputNumber'" class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
:type="sItem.type"
@blur="onBlur(key, $event)" class="flex1" :item="sItem" v-model="formFields[key]"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
:type="sItem.type" @blur="onBlur(key, $event)" class="flex1" :item="sItem"
v-model="formFields[key]" @copy="onCopy(sItem, key)" :error="errors[key]"
@update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
<HandleFormItem :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
@ -227,9 +231,12 @@
<div class="ml-10 item-span" v-else-if="sItem.subType === 'span'">{{
formFields[sItem.subKey] }}</div>
<span v-else-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
<HandleFormItem class="ml-10" v-else-if="sItem.subType === 'button'" type="button"
<div v-else-if="sItem.subType === 'button'">
<HandleFormItem class="ml-10" type="button"
:item="getButtonItem(sItem)" :value="formFields[sItem.subKey]"
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data,sItem.subKey)" />
</div>
<HandleFormItem :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
v-else-if="sItem.subType === 'clickable'" type="clickable"
@ -244,8 +251,14 @@
@onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, sItem.subKey, sItem)"
:error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
:value="formFields[sItem.subKey]" />
<div>
<HandleFormItem class="ml-10" v-if="sItem.thirdType === 'button'" type="button"
:item="getThirdButtonItem(sItem)" :value="formFields[sItem.thirdKey]"
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data,sItem.thirdKey)" />
</div>
<div v-show="isShowOther(formFields[sItem.subKey])" class="flex flex1 ml-10">
<div class="other-title" v-if="isShowOtherLabel(sItem)">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
<div class="other-title" v-if="isShowOtherLabel(sItem)">{{ sItem.otherLabel ?
$t(sItem.otherLabel) :
$t("template.common.other") }}</div>
<div class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel"
@ -310,47 +323,47 @@
<span v-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
<HandleFormItem :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
v-else-if="sItem.subType === 'input' || sItem.subType === 'inputNumber' || sItem.subType === 'select'" :type="sItem.subType" :item="getSubItem(sItem)"
v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
:error="errors[sItem.subKey]" @blur="onBlur(sItem.subKey, $event)"
@update:error="errors[sItem.subKey] = false"
v-else-if="sItem.subType === 'input' || sItem.subType === 'inputNumber' || sItem.subType === 'select'"
:type="sItem.subType" :item="getSubItem(sItem)" v-model="formFields[sItem.subKey]"
@copy="onCopy(sItem, key)" :error="errors[sItem.subKey]"
@blur="onBlur(sItem.subKey, $event)" @update:error="errors[sItem.subKey] = false"
:orange-bg="orangeBgFields[sItem.subKey]" />
<HandleFormItem :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + sItem.thirdKey" class="ml-10"
v-if="sItem.thirdType === 'select' || sItem.thirdType === 'input'" :type="sItem.thirdType" :item="getThirdItem(sItem)"
v-model="formFields[sItem.thirdKey]" @copy="onCopy(sItem, key)"
:error="errors[sItem.thirdKey]" @blur="onBlur(sItem.thirdKey, $event)"
@update:error="errors[sItem.thirdKey] = false"
v-if="sItem.thirdType === 'select' || sItem.thirdType === 'input'"
:type="sItem.thirdType" :item="getThirdItem(sItem)" v-model="formFields[sItem.thirdKey]"
@copy="onCopy(sItem, key)" :error="errors[sItem.thirdKey]"
@blur="onBlur(sItem.thirdKey, $event)" @update:error="errors[sItem.thirdKey] = false"
:orange-bg="orangeBgFields[sItem.thirdKey]" />
<HandleFormItem class="ml-10" v-if="sItem.fourthType === 'button'" type="button"
:item="getFourthButtonItem(sItem)" :value="formFields[sItem.fourthKey]"
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
:item="getFourthButtonItem(sItem)" :value="formFields[sItem.fourthKey]"
@clickButton="(e, val, data) => handleClickButton(e, sItem, val, data,sItem.fourthKey)" />
</div>
</div>
</div>
</template>
<template v-else-if="item.type === 'checkboxList'">
<div class="form-item " >
<div class="form-item ">
<div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
<div v-for="(sItem, key) in item.config" class="c-Item grid-container">
<div class="p-r-20 item-center" :class="sItem.span == 1 ? 'full-row' : ''">
<div class="form-title mr-20 checkboxList-title">{{ $t(sItem.label) }}</div>
<div class="flex flex1">
<HandleFormItem
v-if="sItem.type === 'checkboxTree'"
:field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
:type="sItem.type" :item="sItem" :value="formFields[key]"
@change="(e) => onAttachmentChange(key, e)"
<HandleFormItem v-if="sItem.type === 'checkboxTree'" :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + key" :type="sItem.type" :item="sItem"
:value="formFields[key]" @change="(e) => onAttachmentChange(key, e)"
:error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
<HandleFormItem v-else-if="sItem.type === 'textarea'" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
@blur="onBlur(key, $event)" type="textarea" :item="sItem" v-model="formFields[key]"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
<HandleFormItem v-else-if="sItem.type === 'textarea'" :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + key" @blur="onBlur(key, $event)" type="textarea"
:item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
:error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
<HandleFormItem v-else-if="sItem.type === 'input'" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
@blur="onBlur(key, $event)" type="input" :item="sItem" v-model="formFields[key]"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
<HandleFormItem v-else-if="sItem.type === 'input'" :field-item-label="fieldItemLabel"
:field-key="prefixKey + '_' + key" @blur="onBlur(key, $event)" type="input"
:item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
:error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
</div>
</div>
@ -414,23 +427,23 @@ export default {
};
},
methods: {
remoteMethod(query, sItem, key){
remoteMethod(query, sItem, key) {
this.$emit('remoteMethod', { query, sItem, key, formFields: this.formFields })
},
//radioselect
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;
}

+ 12
- 5
src/utils/conConverter.js View File

@ -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);
}

+ 25
- 0
src/utils/conTools.js View File

@ -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) {

+ 131
- 48
src/views/business/comps/template/comps/gsp/GSP015.vue View File

@ -8,16 +8,18 @@
<div class="content">
<BaseInfoFormPackage fieldItemLabel="template.common.baseInfo" label="template.common.baseInfo"
:ref="refConfig.baseInfoRef" :formConfig="baseInfoFormConfig" :formData="formData" />
<TableList label="template.common.gyzjInfo" :columns="gyzjColumns" :dataSource="resourceGyzj" />
<TableList label="template.common.gyzjInfo" :columns="gyzjColumns" :dataSource="resourceGyzj" />
<TableList label="template.common.sjInfo" :columns="sjColumns" :dataSource="resourceSj" />
<TableList label="template.common.instrumentInfo" :columns="yqColumns" :dataSource="yqResource" />
<LineLabel label="取样进样信息" />
<el-button class="mt-20" v-if="fillType === 'preFill'" type="primary" @click="onAdd">新增</el-button>
<el-button class="mt-20" v-if="fillType === 'actFill'" type="primary" @click="onExport">导出</el-button>
<el-button class="mt-20" v-if="fillType === 'preFill'" type="primary"
@click="onAdd('ybsmDataList')">新增</el-button>
<el-button class="mt-20" v-if="fillType === 'actFill'" type="primary"
@click="onExport">导出</el-button>
<div v-for="(item, index) in formData.ybsmDataList" :key="item.id" class="template-form-item">
<div class="config-header">
<div></div>
<el-popconfirm title="确认删除当前数据?" @confirm="deleteConfig(item)">
<el-popconfirm title="确认删除当前数据?" @confirm="deleteConfig(item, 'ybsmDataList')">
<el-button slot="reference" v-if="fillType === 'preFill'" type="text"
icon="el-icon-delete">{{
$t('template.common.deleteBtn')
@ -25,24 +27,22 @@
</el-popconfirm>
</div>
<BaseInfoFormPackage fieldItemLabel="取样进样信息" :ref="`ybsmFormPackageRef${index}`"
:formConfig="ybsmFormConfig" @blur="onHandleBlur" :formData="item" />
<CustomTable :ref="`ybsmTableRef${index}`" :columns="ybsmColumns"
prefix = "qy"
:showOperation="fillType === 'actFill' || fillType === 'preFill'" :showAddRow="fillType === 'preFill'"
@onAddRow="() => addTableRow(index)"
fieldItemLabel="取样进样信息"
:formData="item">
@clickButton="(e,d,key,formFields) => handleClickButton(e,d,key,formFields,index)"
:formConfig="ybsmFormConfig" :formData="item" />
<CustomTable :ref="`ybsmTableRef${index}`" :columns="ybsmColumns" prefix="qy"
:showOperation="fillType === 'actFill' || fillType === 'preFill'"
:showAddRow="fillType === 'preFill'" @onAddRow="() => addTableRow(index)"
fieldItemLabel="取样进样信息" :formData="item">
<template slot="operation" slot-scope="{ row, rowIndex, columns }">
<TableOpertaionDelete :row="row" :rowIndex="rowIndex" :columns="columns"
@deleteRow="() => deleteTableRow(rowIndex, index)">
</TableOpertaionDelete>
</template>
</CustomTable>
<CustomTable :ref="`jyTableRef${index}`" :columns="yjColumns"
prefix = "jy"
fieldItemLabel="取样进样信息"
:showOperation="fillType === 'actFill'" :showAddRow="false"
:formData="{stepTableFormData:item.jyStepTableFormData || [], headerSelectFields: item.jyHeaderSelectFields || {}}">
<CustomTable :ref="`jyTableRef${index}`" :columns="yjColumns" prefix="jy"
fieldItemLabel="取样进样信息" @blur="(e) => onHandleTableBlur(e, index, 'jyTableRef')"
:showOperation="fillType === 'actFill'" :showAddRow="false"
:formData="{ stepTableFormData: item.jyStepTableFormData || [], headerSelectFields: item.jyHeaderSelectFields || {} }">
<template slot="operation" slot-scope="{ row, rowIndex, columns }">
<TableOpertaionDelete :row="row" :rowIndex="rowIndex" :columns="columns"
@deleteRow="() => deleteTableRow(rowIndex, index)">
@ -51,8 +51,10 @@
</CustomTable>
</div>
<LineLabel label="二次稀释信息" />
<el-button class="mt-20" v-if="fillType === 'preFill'" type="primary" @click="onAdd('ecDataList')">新增</el-button>
<el-button class="mt-20" v-if="fillType === 'actFill'" type="primary" @click="onExport('ec')">导出</el-button>
<el-button class="mt-20" v-if="fillType === 'preFill'" type="primary"
@click="onAdd('ecDataList')">新增</el-button>
<el-button class="mt-20" v-if="fillType === 'actFill'" type="primary"
@click="onExport('ec')">导出</el-button>
<div v-for="(item, index) in formData.ecDataList" :key="item.id" class="template-form-item">
<div class="config-header">
<div></div>
@ -64,12 +66,11 @@
</el-popconfirm>
</div>
<BaseInfoFormPackage fieldItemLabel="二次稀释信息" :ref="`ecFormPackageRef${index}`"
:formConfig="ecFormConfig" @blur="onHandleBlur" :formData="item" />
<CustomTable :ref="`ecTableRef${index}`" :columns="yjColumns"
prefix = "ec"
fieldItemLabel="二次稀释信息"
:showOperation="fillType === 'preFill' ||fillType === 'actFill'"
:formData="item">
:formConfig="ecFormConfig" :formData="item" />
<CustomTable :ref="`ecTableRef${index}`" :columns="yjColumns" prefix="ec"
fieldItemLabel="二次稀释信息" @blur="(e) => onHandleTableBlur(e, index, 'ecTableRef')"
:showOperation="fillType === 'preFill' || fillType === 'actFill'"
@onAddRow="() => addEcTableRow(index, 'ecTableRef')" :formData="item">
<template slot="operation" slot-scope="{ row, rowIndex, columns }">
<TableOpertaionDelete :row="row" :rowIndex="rowIndex" :columns="columns"
@deleteRow="() => deleteTableRow(rowIndex, index)">
@ -77,7 +78,7 @@
</template>
</CustomTable>
</div>
<Step :ref="`stepRef`" :formData="formData.stepData || []"></Step>
<Step :ref="`stepRef`" :formData="formData.stepData || []"></Step>
<BaseInfoFormPackage fieldItemLabel="template.common.remark" label="template.common.remark"
:ref="refConfig.remarkRef" :formConfig="remarkConig" :formData="formData" />
@ -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;

+ 1
- 0
src/views/business/comps/template/comps/sp/SP0021.vue View File

@ -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);
},

+ 1
- 1
src/views/business/comps/template/comps/sp/SP00456.vue View File

@ -300,10 +300,10 @@ export default {
//
if (!this.formData[configType]) {
// formdatabug
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(),

+ 9
- 8
src/views/business/comps/template/formConfig/gsp/gsp015.js View File

@ -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",

Loading…
Cancel
Save