2 Commits

6 changed files with 131 additions and 197 deletions
Split View
  1. +35
    -16
      src/components/Template/BaseInfoFormPcakge.vue
  2. +16
    -1
      src/components/Template/CustomTable.vue
  3. +9
    -34
      src/components/Template/HandleFormItem.vue
  4. +9
    -1
      src/components/Template/Step.vue
  5. +47
    -135
      src/views/business/comps/template/comps/sp/SWYPNBGZYZBB.vue
  6. +15
    -10
      src/views/business/comps/template/mixins/templateMixin.js

+ 35
- 16
src/components/Template/BaseInfoFormPcakge.vue View File

@ -118,13 +118,13 @@
<HandleFormItem @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 v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
<HandleFormItem class="ml-10" v-if="sItem.subType === 'select'" type="select"
:item="getSubItem(sItem)" v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
@change="onSelectChange(sItem.subKey, $event)" :error="errors[sItem.subKey]"
@update:error="errors[sItem.subKey] = false"
:orange-bg="orangeBgFields[sItem.subKey]" />
<div v-else-if="sItem.subType === 'span'">{{ formFields[sItem.subKey] }}</div>
<HandleFormItem v-else-if="sItem.subType === 'clickable'" type="clickable"
<div class="ml-10" v-else-if="sItem.subType === 'span'">{{ formFields[sItem.subKey] }}</div>
<HandleFormItem class="ml-10" v-else-if="sItem.subType === 'clickable'" type="clickable"
@clickable="handleClickable(sItem, $event)" :item="getClickableItem(sItem)"
:value="formFields[sItem.subKey]" />
<div v-show="isShowOther(formFields[sItem.subKey])" class="flex flex1">
@ -146,13 +146,13 @@
@input="onInputNumberChange(key, $event)" :value="formFields[key]"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
<HandleFormItem v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
<HandleFormItem class="ml-10" v-if="sItem.subType === 'select'" type="select"
:item="getSubItem(sItem)" v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
@change="onSelectChange(sItem.subKey, $event)" :error="errors[sItem.subKey]"
@update:error="errors[sItem.subKey] = false"
:orange-bg="orangeBgFields[sItem.subKey]" />
<div v-else-if="sItem.subType === 'span'">{{ formFields[sItem.subKey] }}</div>
<HandleFormItem v-else-if="sItem.subType === 'clickable'"
<div class="ml-10" v-else-if="sItem.subType === 'span'">{{ formFields[sItem.subKey] }}</div>
<HandleFormItem class="ml-10" v-else-if="sItem.subType === 'clickable'"
@clickable="handleClickable(sItem, $event)" type="clickable"
:item="getClickableItem(sItem)" :value="formFields[sItem.subKey]" />
<!-- <div class="clickable" :class="getFillType(sItem.subFillType)" v-else-if = "sItem.subType ==='clickable'" @click="handleClickable(sItem,$event)">
@ -207,7 +207,7 @@ export default {
deep: true, // 便
handler(v) {
if (v) {
this.handleFormField();
this.handleFormField(true);
}
}
},
@ -303,7 +303,7 @@ export default {
return arr.some(item => item < 0);
},
// formConfigform
handleFormField() {
handleFormField(update = false) {
const result = {};
let config = {};
const { formConfig, formData, formFields } = this;
@ -321,11 +321,13 @@ export default {
// formFields
if (formFields[key] !== null &&
formFields[key] !== undefined &&
formFields[key] !== '' &&
typeof formFields[key] !== 'object'
formFields[key] !== ''
// typeof formFields[key] !== 'object'
) {
// 使formData
result[key] = formFields[key];
} else {
// 使formData
result[key] = value;
@ -334,12 +336,21 @@ export default {
// - ""
if (currentConfig.otherCode) {
const { otherCode } = currentConfig;
result[otherCode] = formData[otherCode] || '';
//使formFields
if (update) {
result[otherCode] = formFields[otherCode] || formData[otherCode] || '';
} else {
result[otherCode] = formData[otherCode] || formFields[otherCode] || '';
}
config[otherCode] = { label: "其他", parentKey: key, type: "input", fillType: currentConfig.fillType }
}
if (currentConfig.subKey) {
const { subKey } = currentConfig;
result[subKey] = formData[subKey] || '';
if (update) {
result[subKey] = formFields[subKey] || formData[subKey] || '';
} else {
result[subKey] = formData[subKey] || formFields[subKey] || '';
}
config[subKey] = { label: currentConfig.label, subKey, type: currentConfig.subType, fillType: currentConfig.subFillType || currentConfig.fillType }
}
});
@ -388,8 +399,8 @@ export default {
if (!isSelectedOther) {//
formFields[o.otherCode] = "";
}
}else if(o.subType === "select"){
const isSelectedOther = this.isShowOther(formFields[o.subKey]);
} else if (o.subType === "select") {
const isSelectedOther = this.isShowOther(formFields[o.subKey]);
if (!isSelectedOther) {//
formFields[o.otherCode] = "";
}
@ -455,6 +466,10 @@ export default {
}
});
},
//
getDirectFormData() {
return this.formFields;
},
getFormDataByKey(key) {
return this.formFields[key];
},
@ -629,4 +644,8 @@ export default {
.blue-border {
border-color: #4ea2ff;
}
.ml-10 {
margin-left: 10px;
}
</style>

+ 16
- 1
src/components/Template/CustomTable.vue View File

@ -94,7 +94,7 @@
</div>
<div class="add-row" v-if="isShowAddRos()">
<el-button type="primary" plain @click="addRow">添加行</el-button>
<el-button type="primary" plain @click="onAddRow">添加行</el-button>
</div>
</div>
</template>
@ -190,6 +190,13 @@ export default {
});
this.headerSelectFields = headerSelectObj;
},
//
getDirectFormData() {
return {
stepTableFormData: [...this.localDataSource],
headerSelectFields: this.headerSelectFields,
};
},
//
getFormData() {
// columns
@ -375,6 +382,14 @@ export default {
//
this.localDataSource = JSON.parse(JSON.stringify(dataSource || []));
},
onAddRow() {
this.addRow({
actSolutionVolumePrecision: 3,//3
actSolutionConcentrationPrecision: 3,//3
targetDiluentVolumePrecision: 3,//3
targetStartSolutionVolumePrecision: 3,//3
});
},
//
addRow(row = {}) {
this.localDataSource.push(row);

+ 9
- 34
src/components/Template/HandleFormItem.vue View File

@ -2,11 +2,11 @@
<div class="flex flex1">
<div class="flex1 flex">
<el-input v-if="type === 'input'" :maxlength="item.maxlength || 50" :disabled="getDisabled()"
:class="getFillTypeStyle() + (orangeBg ? ' orange-bg' : '')" @blur="onCommonHandleSaveRecord"
:class="getFillTypeStyle() + (orangeBg ? ' orange-bg' : '')" @blur="onBlur"
:placeholder="getPlaceholder()" v-model="inputValue"
@input="onInputChange" @change="onInputChange" />
<el-input v-else-if="type === 'textarea'" :maxlength="item.maxlength || 50" :disabled="getDisabled()"
:class="getFillTypeStyle() + (orangeBg ? ' orange-bg' : '')" type="textarea" show-word-limit resize="none" @blur="onCommonHandleSaveRecord"
:class="getFillTypeStyle() + (orangeBg ? ' orange-bg' : '')" type="textarea" show-word-limit resize="none" @blur="onBlur"
:rows="item.rows || 3" :placeholder="getPlaceholder()"
v-model="inputValue" @input="onInputChange" @change="onInputChange" />
<DecimalInput v-else-if="type === 'inputNumber'" @blur="onCommonHandleSaveRecord" :maxlength="item.maxlength || 10"
@ -17,7 +17,7 @@
@input="onInputChange" @change="onInputChange" />
<el-select v-else-if="type === 'select'" class="flex1" :multiple="item.multiple"
:class="getFillTypeStyle() + (orangeBg ? ' orange-bg' : '')" v-model="inputValue" :disabled="getDisabled()"
:placeholder="getPlaceholder()" @change="onInputChange">
:placeholder="getPlaceholder()" @change="onCommonHandleSaveRecord">
<el-option v-for="op in item.options" :key="op.value" :label="op.label" :value="op.value">
</el-option>
</el-select>
@ -127,7 +127,6 @@ export default {
watch: {
value(newVal) {
this.inputValue = newVal;
console.log(newVal,"newVal")
}
},
filters: {
@ -167,6 +166,11 @@ export default {
this.$emit('update:error', true);
}
},
//
onBlur(e) {
this.onCommonHandleSaveRecord(e.target.value);
},
async onCommonHandleSaveRecord(val){
const isEmpty = this.isValueEmpty(this.inputValue);
if (this.error && !isEmpty) {
@ -204,39 +208,10 @@ export default {
} else {
// blurchange
this.$emit("blur", val)
// this.$emit('input', val);
this.$emit('input', val);
this.$emit("change", val)
}
},
//
async handleValueChange(val, componentType = '') {
const oldValue = this.oldValue; //
this.$emit('input', val);
this.$emit('change', val);
//
const isEmpty = this.isValueEmpty(val);
if (this.error && !isEmpty) {
this.$emit('update:error', false);
} else if (!this.error && isEmpty) {
this.$emit('update:error', true);
}
//
const { templateStatus } = this.$store.state.template;
if (val !== oldValue && templateStatus === "actFill") {
//
try {
this.oldValue = val; //
//
await this.saveModificationRecord();
} catch (error) {
const componentName = componentType || '组件';
console.error(`记录${componentName}修改失败:`, error);
}
}
},
//
isValueEmpty(value) {

+ 9
- 1
src/components/Template/Step.vue View File

@ -10,7 +10,7 @@
<div class="step-content">
<span class="step-title">步骤{{ index + 1 }}</span>
<span class="step-title">{{ index + 1 }}</span>
<HandleFormItem
type = "select"
placeholder="请选择"
@ -252,6 +252,14 @@ export default {
resolve({stepData})
})
},
//
getDirectFormData() {
return this.steps.map(step => ({
type: step.type,
...step.formData
}))
},
//
setStepData(data) {

+ 47
- 135
src/views/business/comps/template/comps/sp/SWYPNBGZYZBB.vue View File

@ -13,7 +13,7 @@
<BaseInfoFormPcakge label="存储条件" ref="storageConditionRef" :formConfig="storageFormConfig"
:formData="formData" />
<LineLabel label="操作步骤" />
<div class = "mt-20">
<div v-if = "fillType === 'preFill'" class = "mt-20">
<el-button type="primary" @click="handleAddParalle">新增平行配制</el-button>
<el-button type="primary" @click="handleAddLadder">新增阶梯配制</el-button>
</div>
@ -29,6 +29,7 @@
<div class="config-header">
<div>阶梯配制</div>
<el-button
v-if = "fillType === 'preFill'"
type="text"
icon="el-icon-delete"
@click="deleteLadderConfig(ladderIndex)"
@ -43,7 +44,6 @@
/>
<CustomTable
@blur="onHandleTableBlur"
:showOperation="fillType === 'actFill'"
:ref="`ladderStepTableRef_${ladderIndex}`"
:columns="ladderStepColumns"
:formData="ladderConfig"
@ -57,9 +57,7 @@
></TableOpertaion>
</template>
</CustomTable>
<div class="add-row">
<el-button @click="handleAddRow('ladder', undefined, ladderIndex)">添加行</el-button>
</div>
<Step
class="mt-0"
:ref="`ladderStepRef_${ladderIndex}`"
@ -79,6 +77,7 @@
<div class="config-header">
<div>平行配制</div>
<el-button
v-if = "fillType === 'preFill'"
type="text"
icon="el-icon-delete"
@click="deleteParalleConfig(paralleIndex)"
@ -93,7 +92,6 @@
/>
<CustomTable
@blur="onHandleTableBlur"
:showOperation="fillType === 'actFill'"
:ref="`paralleStepTableRef_${paralleIndex}`"
:columns="paralleStepColumns"
:formData="paralleConfig"
@ -107,9 +105,7 @@
></TableOpertaion>
</template>
</CustomTable>
<div class="add-row">
<el-button @click="handleAddRow('paralle', undefined, paralleIndex)">添加行</el-button>
</div>
<Step
class="mt-0"
:ref="`paralleStepRef_${paralleIndex}`"
@ -150,102 +146,6 @@ export default {
},
},
watch: {
value: {
immediate: true,
handler(v) {
//
if (v && Object.keys(v).length > 0) {
this.formData = { ...this.formData, ...v };
//
if (v.ladderConfigs && Array.isArray(v.ladderConfigs) && v.ladderConfigs.length > 0) {
// ladderConfigs
if (!this.formData.ladderConfigs || !Array.isArray(this.formData.ladderConfigs)) {
this.$set(this.formData, 'ladderConfigs', []);
}
//
v.ladderConfigs.forEach((ladderConfig, index) => {
//
if (!this.formData.ladderConfigs[index]) {
this.formData.ladderConfigs[index] = {
ladderStepData: [],
ladderTableFormData: [],
showLadderConfig: true
};
}
//
if (ladderConfig.ladderTableFormData && ladderConfig.ladderTableFormData.length > 0 && this.$refs[`ladderStepTableRef_${index}`]) {
this.$refs[`ladderStepTableRef_${index}`].updateDataSource(ladderConfig.ladderTableFormData);
}
//
if (!ladderConfig.ladderStepData) {
this.$set(this.formData.ladderConfigs[index], 'ladderStepData', []);
}
//
if (ladderConfig.showLadderConfig === undefined) {
this.$set(this.formData.ladderConfigs[index], 'showLadderConfig', !!ladderConfig.ladderStepData && ladderConfig.ladderStepData.length > 0);
}
});
}
//
if (v.paralleConfigs && Array.isArray(v.paralleConfigs) && v.paralleConfigs.length > 0) {
// paralleConfigs
if (!this.formData.paralleConfigs || !Array.isArray(this.formData.paralleConfigs)) {
this.$set(this.formData, 'paralleConfigs', []);
}
//
v.paralleConfigs.forEach((paralleConfig, index) => {
//
if (!this.formData.paralleConfigs[index]) {
this.formData.paralleConfigs[index] = {
paralleStepData: [],
paralleTableFormData: [],
showParalleConfig: true
};
}
//
if (paralleConfig.paralleTableFormData && paralleConfig.paralleTableFormData.length > 0 && this.$refs[`paralleStepTableRef_${index}`]) {
this.$refs[`paralleStepTableRef_${index}`].updateDataSource(paralleConfig.paralleTableFormData);
}
//
if (!paralleConfig.paralleStepData) {
this.$set(this.formData.paralleConfigs[index], 'paralleStepData', []);
}
//
if (paralleConfig.showParalleConfig === undefined) {
this.$set(this.formData.paralleConfigs[index], 'showParalleConfig', !!paralleConfig.paralleStepData && paralleConfig.paralleStepData.length > 0);
}
});
}
//
if (v.ladderTableFormData && v.ladderTableFormData.length > 0 && (!v.ladderConfigs || v.ladderConfigs.length === 0)) {
this.formData.ladderConfigs = [{
ladderStepData: v.ladderStepData || [],
ladderTableFormData: v.ladderTableFormData,
showLadderConfig: v.showLadderConfig !== undefined ? v.showLadderConfig : true
}];
}
if (v.paralleTableFormData && v.paralleTableFormData.length > 0 && (!v.paralleConfigs || v.paralleConfigs.length === 0)) {
this.formData.paralleConfigs = [{
paralleStepData: v.paralleStepData || [],
paralleTableFormData: v.paralleTableFormData,
showParalleConfig: v.showParalleConfig !== undefined ? v.showParalleConfig : true
}];
}
}
}
},
fillType: {
immediate: true,
handler(v) {
@ -785,26 +685,6 @@ export default {
};
},
mounted() {
if (this.fillType === "preFill") {
this.formData = {
effectivePeriodUnit: "days",//
createTime: "2026-01-02 18:05:36",//
versionNum: 1,
stepTableFormData: [],
ladderConfigs: [], //
paralleConfigs: [], //
headerSelectFields: {
targetStartSolutionVolumeUnit: "mg",
actStartSolutionVolumeUnit: "mg",
targetDiluentVolumeUnit: "mg",
actDiluentVolumeUnit: "mg",
targetSolutionConcentrationUnit: "mg",
actSolutionConcentrationUnit: "mg",
targetSolutionVolumeUnit: "mg",
actSolutionVolumeUnit: "mg",
}
}
}
},
methods: {
//
@ -883,17 +763,41 @@ export default {
this.$refs.stepFormPackageRef.updateFormData(this.currentSubKey, code);
this.selectReagentVisible = false;
},
async getFormData() {
const baseData = await this.$refs.baseInfoRef.getFormData();
const conditionData = await this.$refs.storageConditionRef.getFormData();
//
async validFields(){
//
let refsToValidate = ["baseInfoRef", "storageConditionRef", "remarkRef"];
//
if (this.formData.ladderConfigs && this.formData.ladderConfigs.length > 0) {
for (let i = 0; i < this.formData.ladderConfigs.length; i++) {
refsToValidate.push(`ladderStepFormPackageRef_${i}`);
refsToValidate.push(`ladderStepTableRef_${i}`);
refsToValidate.push(`ladderStepRef_${i}`);
}
}
//
if (this.formData.paralleConfigs && this.formData.paralleConfigs.length > 0) {
for (let i = 0; i < this.formData.paralleConfigs.length; i++) {
refsToValidate.push(`paralleStepFormPackageRef_${i}`);
refsToValidate.push(`paralleStepTableRef_${i}`);
refsToValidate.push(`paralleStepRef_${i}`);
}
}
return await this.validFormFields(refsToValidate);
},
getRealFormData(){
const baseData = this.$refs.baseInfoRef.getDirectFormData();
const conditionData = this.$refs.storageConditionRef.getDirectFormData();
//
const ladderConfigsData = [];
if (this.formData.ladderConfigs && this.formData.ladderConfigs.length > 0) {
for (let i = 0; i < this.formData.ladderConfigs.length; i++) {
const ladderFormData = await this.$refs[`ladderStepFormPackageRef_${i}`][0].getFormData();
const ladderTableFormData = await this.$refs[`ladderStepTableRef_${i}`][0].getFormData();
const ladderStepData = await this.$refs[`ladderStepRef_${i}`][0].getFormData();
const ladderFormData = this.$refs[`ladderStepFormPackageRef_${i}`][0].getDirectFormData();
const ladderTableFormData = this.$refs[`ladderStepTableRef_${i}`][0].getDirectFormData();
const ladderStepData = this.$refs[`ladderStepRef_${i}`][0].getDirectFormData();
ladderConfigsData.push({
...ladderFormData,
@ -908,9 +812,9 @@ export default {
const paralleConfigsData = [];
if (this.formData.paralleConfigs && this.formData.paralleConfigs.length > 0) {
for (let i = 0; i < this.formData.paralleConfigs.length; i++) {
const paralleFormData = await this.$refs[`paralleStepFormPackageRef_${i}`][0].getFormData();
const paralleTableFormData = await this.$refs[`paralleStepTableRef_${i}`][0].getFormData();
const paralleStepData = await this.$refs[`paralleStepRef_${i}`][0].getFormData();
const paralleFormData = this.$refs[`paralleStepFormPackageRef_${i}`][0].getDirectFormData();
const paralleTableFormData = this.$refs[`paralleStepTableRef_${i}`][0].getDirectFormData();
const paralleStepData = this.$refs[`paralleStepRef_${i}`][0].getDirectFormData();
paralleConfigsData.push({
...paralleFormData,
@ -921,7 +825,7 @@ export default {
}
}
const remarkData = await this.$refs.remarkRef.getFormData();
const remarkData = this.$refs.remarkRef.getDirectFormData();
return {
...baseData,
@ -931,6 +835,14 @@ export default {
...remarkData
}
},
async getFormData() {
//
const validFlag = this.validFields();
if(!validFlag){
return false;
}
return this.getRealFormData();
},
async onSave() {
const formData = await this.getFormData();
console.log(formData, "formData")

+ 15
- 10
src/views/business/comps/template/mixins/templateMixin.js View File

@ -1,6 +1,6 @@
import moment from "moment";
export default {
dicts: ['business_pztj','business_cctj','business_nddw','business_tjdw','business_yxqdw','business_rqcz'],
dicts: ['business_pztj', 'business_cctj', 'business_nddw', 'business_tjdw', 'business_yxqdw', 'business_rqcz'],
props: {
templateData: {
type: Object,
@ -21,7 +21,7 @@ export default {
if (v.bdnr) {
this.formData = { ...n, ...JSON.parse(v.bdnr) };
}
console.log(v,"formData from templateData")
console.log(v, "formData from templateData")
this.setTemplateData(n);
}
}
@ -43,28 +43,33 @@ export default {
this.setTemplateData({});
},
methods: {
getResource(){
getResource() {
return this.resource;
},
//统一校验form表单是否填写
async validFormFields(refArr = []) {
let result = {};
const refs = refArr.map(ref => {
const refData = this.$refs[ref].getFormData();
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"){
if (err.errorType && err.errorType === "step") {
this.$message.error("请添加步骤");
return
}
console.log(err,"err")
console.log(err, "err")
this.$message.error("表单内容未填完,请填写后再提交");
});
if(validFormData){
if (validFormData) {
validFormData.forEach(item => {
result = {...result,...item}
result = { ...result, ...item }
})
return result;
}
@ -109,7 +114,7 @@ export default {
}));
this.$refs.stepTableRef.updateDataSource(arr);
} else if (key === "targetStartSolution") {//起始溶液体积失焦时,更新目标溶液预计浓度
const arr = this.$refs.stepTableRef.getDataSource();
const arr = this.$refs.stepTableRef?.getDataSource();
arr.forEach((item, rowIndex) => {
this.updateTargetStartSolutionVolume(rowIndex, item, targetStartSolution);
})
@ -120,7 +125,7 @@ export default {
const { rowIndex, colKey, value, item } = params;
console.log(rowIndex, colKey, value, item, "params")
if (colKey === "targetSolutionVolume" || colKey === "targetSolutionConcentration" || colKey === "targetStartSolutionVolumePrecision" || colKey === "targetDiluentVolumePrecision") {
const volume = this.$refs.stepFormPackageRef.getFormDataByKey("targetStartSolution") || 0;
const volume = this.$refs.stepFormPackageRef?.getFormDataByKey("targetStartSolution") || 0;
if (volume) {
this.updateTargetStartSolutionVolume(rowIndex, item, volume);
}

Loading…
Cancel
Save