<template>
|
|
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" title="分装(分装后的编号可用于下一步关联选择)" append-to-body
|
|
:visible.sync="visible" @close="close" width="1100px">
|
|
<div class="dialog-content">
|
|
<div class="header-container">
|
|
<div class="header-item">
|
|
<div class="header-title">母液编号</div>
|
|
<HandleFormItem :fieldKey="formData.mybh + '_mybh'" :isFieldsRecord="false" :item="inputItem" :error="formErrors.mybh"
|
|
v-model="formData.mybh" />
|
|
</div>
|
|
<div class="header-item">
|
|
<div class="header-title">分装数量</div>
|
|
<HandleFormItem :isFieldsRecord="false" :fieldKey="formData.mybh + '_fzsl'" @blur="onBlurFzsl" :item="integerInputNumberItem"
|
|
type="inputNumber" :error="formErrors.fzsl" v-model="formData.fzsl" />
|
|
</div>
|
|
</div>
|
|
<div class="content-container">
|
|
<div class="content-item">
|
|
<span>分装编号</span>
|
|
<span class="ml-20">单位:</span>
|
|
<div class="unit-select">
|
|
<HandleFormItem :fieldKey="formData.mybh + '_dw'" :isFieldsRecord="false" :item="unitItem" type="select" :error="formErrors.dw"
|
|
@blur="(e) => onCommonBlur(e, 'dw')" v-model="formData.dw" />
|
|
</div>
|
|
<span class="ml-20">每份包装量:</span>
|
|
<div class="unit-select">
|
|
<HandleFormItem :fieldKey="formData.mybh + '_mfbzl'" type="inputNumber" :error="formErrors.mfbzl" :isFieldsRecord="false"
|
|
:item="inputNumberItem" v-model="formData.mfbzl" />
|
|
</div>
|
|
<el-button type="primary" plain @click="onAverage">平均分配</el-button>
|
|
<el-button type="primary" plain @click="onReset">重置</el-button>
|
|
</div>
|
|
<div class="header-container header2">
|
|
<div v-for="(item, index) in fzList" class="list-item" :key="index">
|
|
<div class="list-label">{{ formData.mybh }}-set{{ item.subCode }}</div>
|
|
<HandleFormItem :fieldKey="formData.mybh + '_num_' + item.subCode" :isFieldsRecord="false" :item="inputNumberItem" :error="fzListErrors[index]"
|
|
type="inputNumber" @blur="onBlurFzNum(index)" v-model="item.num" />
|
|
<el-button type="primary" class="ml-5" plain @click="onPrint(item)">打印</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<template slot="footer" class="dialog-footer">
|
|
<el-button @click="close">{{ $t('form.cancel') }}</el-button>
|
|
<el-button type="primary" @click="onSubmit">{{ $t('form.saveConfirm') }}</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script>
|
|
import HandleFormItem from '@/components/Template/HandleFormItem.vue';
|
|
import { compareVolume } from '@/utils/volumeTools.js';
|
|
import { EventBus } from '@/utils/eventBus';
|
|
import { getLatestSn } from '@/api/template';
|
|
import { isValueEmpty } from "@/utils/index";
|
|
import moment from 'moment';
|
|
import { getuuid } from "@/utils/index.js";
|
|
export default {
|
|
inject: ['updateZdxgjl',"getZdxgjl"],
|
|
dicts: [
|
|
'business_tjdw',
|
|
],
|
|
components: {
|
|
HandleFormItem,
|
|
},
|
|
data() {
|
|
return {
|
|
visible: false,
|
|
inputItem: {
|
|
type: "input",
|
|
fillType: "actFill",
|
|
disabled: true,
|
|
},
|
|
integerInputNumberItem: {
|
|
type: "inputNumber",
|
|
fillType: "actFill",
|
|
precision: 0,
|
|
label: "分装数量",
|
|
maxlength: 3
|
|
},
|
|
inputNumberItem: {
|
|
type: "inputNumber",
|
|
fillType: "actFill",
|
|
},
|
|
formData: {
|
|
mybh: "",//母液编号
|
|
fzsl: "",//分装数量
|
|
dw: "",//单位
|
|
mfbzl: "",//每份包装量
|
|
},
|
|
fzList: [],//分装列表
|
|
// 错误状态字段
|
|
formErrors: {
|
|
mybh: false,
|
|
fzsl: false,
|
|
dw: false,
|
|
},
|
|
fzListErrors: [], // 分装列表错误状态
|
|
uuid: "",//事件id
|
|
originalData: {},//原始数据
|
|
uuid:getuuid(),//事件id
|
|
}
|
|
},
|
|
computed: {
|
|
unitItem() {
|
|
return {
|
|
type: "select",
|
|
fillType: "actFill",
|
|
options: this.dict.type.business_tjdw
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
EventBus.$on('onEditSignCallback', this.handleEditSignCallback);
|
|
EventBus.$on('onFormEditSignCancel', this.handleEditSignCancel);
|
|
},
|
|
unmounted() {
|
|
EventBus.$off('onEditSignCallback', this.handleEditSignCallback);
|
|
EventBus.$off('onFormEditSignCancel', this.handleEditSignCancel);
|
|
},
|
|
methods: {
|
|
handleEditSignCancel(data) {
|
|
|
|
},
|
|
handleEditSignCallback(data) {
|
|
if (data.uuid === this.uuid) {
|
|
this.updateRecords();
|
|
}
|
|
},
|
|
close() {
|
|
this.visible = false;
|
|
this.fzList = [];
|
|
this.formData = {};
|
|
this.resetErrors();
|
|
},
|
|
show(data) {
|
|
const cloneData = JSON.parse(JSON.stringify(data));
|
|
console.log(cloneData, "cloneData")
|
|
if (data && data.uuid) {//为了标识eventBus的事件id
|
|
this.uuid = data.uuid
|
|
}
|
|
this.originalData = {
|
|
fzList: [],
|
|
mybh: cloneData.mybh,
|
|
fzsl: cloneData.fzsl,
|
|
dw: cloneData.dw,
|
|
mfbzl: cloneData.mfbzl,
|
|
}
|
|
if (data.fzList) {
|
|
this.fzList = JSON.parse(JSON.stringify(cloneData.fzList));
|
|
this.originalData.fzList = JSON.parse(JSON.stringify(cloneData.fzList));
|
|
// 初始化分装列表错误状态
|
|
this.fzListErrors = new Array(this.fzList.length).fill(false);
|
|
delete cloneData.fzList;
|
|
}
|
|
|
|
this.formData = cloneData;
|
|
// 重置错误状态
|
|
this.resetErrors();
|
|
this.visible = true;
|
|
},
|
|
onSubmit() {
|
|
// 验证表单数据
|
|
if (!this.validateFormData()) {
|
|
this.$message.error('表单内容未填完,请填写后再提交')
|
|
return;
|
|
} else {
|
|
const errMsg = "分装后小份容量之和大于母液容量,是否确认分装?"
|
|
const { maxVolume, maxVolumeUnit, dw } = this.formData;
|
|
|
|
const totalVolume = this.fzList.reduce((acc, cur) => acc + Number(cur.num), 0);
|
|
const compareResult = compareVolume(totalVolume, dw, maxVolume, maxVolumeUnit);
|
|
console.log(compareResult, totalVolume, dw, maxVolume, maxVolumeUnit, "比较结果");
|
|
if (compareResult > 0 || !maxVolume) {//没有填写实际溶液体积的也需要提示错误信息
|
|
this.$modal.confirm(errMsg, '提示', {
|
|
confirmButtonText: this.$t('form.saveConfirm'),
|
|
cancelButtonText: this.$t('form.cancel'),
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.submitEmit();
|
|
}).catch(() => {
|
|
// 取消操作,不执行任何操作
|
|
});
|
|
return;
|
|
}
|
|
this.submitEmit();
|
|
|
|
}
|
|
|
|
|
|
},
|
|
submitEmit() {
|
|
const { originalData } = this;
|
|
const { mybh, fzsl, dw, mfbzl } = this.formData;
|
|
const nowData = { fzList: this.fzList, mybh, fzsl, dw, mfbzl };
|
|
|
|
if (!originalData.fzList.length) {
|
|
this.updateRecords();
|
|
} else if (JSON.stringify(nowData) !== JSON.stringify(originalData)) {
|
|
EventBus.$emit('showEditSignDialog', { uuid: this.uuid });
|
|
return;
|
|
} else {
|
|
this.updateRecords();
|
|
}
|
|
},
|
|
handleSubmit() {
|
|
EventBus.$emit('dialogSubPackageSubmit', { ...this.formData, fzList: this.fzList, uuid: this.uuid });
|
|
setTimeout(() => {
|
|
this.close();
|
|
}, 500);
|
|
},
|
|
getCommonInfo(type){
|
|
const { nickName, name } = this.$store.getters;
|
|
const o ={
|
|
mybh:"母液编号",
|
|
fzsl:"分装数量",
|
|
dw:"单位",
|
|
mfbzl:"每份包装量",
|
|
num:"分装编号"
|
|
}
|
|
return{
|
|
userNameCn: nickName,
|
|
userNameEn: name,
|
|
time: moment().format("YYYY-MM-DD HH:mm:ss"),
|
|
fieldCn: o[type],
|
|
fieldEn: o[type],
|
|
}
|
|
},
|
|
updateRecords() {
|
|
const { originalData } = this;
|
|
const records = [];
|
|
const { mybh, fzsl, dw, mfbzl } = this.formData;
|
|
const nowData = { fzList: this.fzList, mybh, fzsl, dw, mfbzl };
|
|
// 定义要比较的字段
|
|
const fieldsToCompare = ['mybh', 'fzsl', 'dw', 'mfbzl'];
|
|
|
|
// 比较基础字段
|
|
fieldsToCompare.forEach(field => {
|
|
if (originalData[field] !== nowData[field]) {
|
|
const record = {
|
|
key: mybh + '_' + field,
|
|
oldValue: originalData[field],
|
|
value: nowData[field],
|
|
title: originalData[field] ? "修改" : "提交",
|
|
...this.getCommonInfo(field),
|
|
}
|
|
records.push(record);
|
|
this.updateZdxgjl(record);
|
|
}
|
|
});
|
|
// 比较分装列表
|
|
this.compareFzList(originalData.fzList, nowData.fzList, records);
|
|
|
|
console.log(records, "records")
|
|
|
|
this.handleSubmit();
|
|
if (records.length == 0) {
|
|
return;
|
|
}
|
|
const params = {
|
|
type: "fieldChanged",
|
|
newRecord: records,
|
|
resourceList: this.getZdxgjl(),
|
|
source: "customTable",
|
|
}
|
|
EventBus.$emit('onModifyRecord', params);
|
|
},
|
|
|
|
// 比较分装列表的辅助方法
|
|
compareFzList(originalFzList, nowFzList, records) {
|
|
console.log(originalFzList, nowFzList, records, "compareFzList")
|
|
const { mybh } = this.formData;
|
|
if(!originalFzList.length){
|
|
nowFzList.forEach(item => {
|
|
const record = {
|
|
key: mybh + '_num_' + item.subCode,
|
|
oldValue: '',
|
|
value: item.num,
|
|
title: item.num ? "修改" : "提交",
|
|
...this.getCommonInfo('num'),
|
|
};
|
|
records.push(record);
|
|
this.updateZdxgjl(record);
|
|
})
|
|
return;
|
|
}
|
|
if (originalFzList.length === nowFzList.length) {
|
|
for (let i = 0; i < originalFzList.length; i++) {
|
|
if (originalFzList[i].num !== nowFzList[i].num) {
|
|
const record = {
|
|
key: mybh + '_num_' + originalFzList[i].subCode,
|
|
oldValue: originalFzList[i].num,
|
|
value: nowFzList[i].num,
|
|
title: originalFzList[i].num ? "修改" : "提交",
|
|
...this.getCommonInfo('num'),
|
|
};
|
|
records.push(record);
|
|
this.updateZdxgjl(record);
|
|
}
|
|
}
|
|
}else if(originalFzList.length>nowFzList.length){
|
|
for (let i = 0; i < nowFzList.length; i++) {
|
|
if (originalFzList[i].num !== nowFzList[i].num) {
|
|
const record = {
|
|
key: mybh + '_num_' + nowFzList[i].subCode,
|
|
oldValue: originalFzList[i].num,
|
|
value: nowFzList[i].num,
|
|
title: originalFzList[i].num ? "修改" : "提交",
|
|
...this.getCommonInfo('num'),
|
|
};
|
|
records.push(record);
|
|
this.updateZdxgjl(record);
|
|
}
|
|
}
|
|
}else{
|
|
for (let i = 0; i < originalFzList.length; i++) {
|
|
if (originalFzList[i].num !== nowFzList[i].num) {
|
|
const record = {
|
|
key: mybh + '_num_' + nowFzList[i].subCode,
|
|
oldValue: originalFzList[i].num,
|
|
value: nowFzList[i].num,
|
|
title: originalFzList[i].num ? "修改" : "提交",
|
|
...this.getCommonInfo('num'),
|
|
};
|
|
records.push(record);
|
|
this.updateZdxgjl(record);
|
|
}
|
|
}
|
|
}
|
|
|
|
},
|
|
validateFormData() {
|
|
let isValid = true;
|
|
const { mybh, fzsl, dw, mfbzl } = this.formData;
|
|
// 验证母液编号
|
|
if (isValueEmpty(mybh)) {
|
|
this.formErrors.mybh = true;
|
|
isValid = false;
|
|
}
|
|
// 验证分装数量
|
|
if (isValueEmpty(fzsl)) {
|
|
this.formErrors.fzsl = true;
|
|
isValid = false;
|
|
}
|
|
|
|
// 验证单位
|
|
if (isValueEmpty(dw)) {
|
|
this.formErrors.dw = true;
|
|
isValid = false;
|
|
}
|
|
// 验证单位
|
|
if (isValueEmpty(mfbzl)) {
|
|
this.formErrors.mfbzl = true;
|
|
isValid = false;
|
|
}
|
|
// 验证分装列表中的数值
|
|
if (this.fzList && this.fzList.length > 0) {
|
|
for (let i = 0; i < this.fzList.length; i++) {
|
|
if (isValueEmpty(this.fzList[i].num)) {
|
|
// 确保fzListErrors数组有足够的元素
|
|
if (this.fzListErrors.length <= i) {
|
|
this.$set(this.fzListErrors, i, true);
|
|
} else {
|
|
this.fzListErrors[i] = true;
|
|
}
|
|
isValid = false;
|
|
}
|
|
}
|
|
}
|
|
return isValid;
|
|
},
|
|
resetErrors() {
|
|
// 重置表单错误状态
|
|
Object.keys(this.formErrors).forEach(key => {
|
|
this.formErrors[key] = false;
|
|
});
|
|
|
|
// 重置分装列表错误状态
|
|
this.fzListErrors.forEach((_, index) => {
|
|
this.$set(this.fzListErrors, index, false);
|
|
});
|
|
},
|
|
// 分装数量失去焦点时,根据数量生成分装列表
|
|
async onBlurFzsl(e) {
|
|
console.log(e, "失去焦点时的数量")
|
|
// 清除当前字段的错误状态
|
|
if (e) {
|
|
this.formErrors.fzsl = false;
|
|
}
|
|
// 清空现有列表
|
|
this.fzList = [];
|
|
this.fzListErrors = [];
|
|
const result = await getLatestSn({
|
|
pre: this.formData.mybh,
|
|
count: e,
|
|
type: 2,
|
|
})
|
|
if (result.code === 200) {
|
|
const codes = result.data;
|
|
// 根据输入的数量生成新列表
|
|
for (let i = 0; i < e; i++) {
|
|
this.fzList.push({
|
|
num: "",
|
|
subCode: codes[i],
|
|
preCode: `-set${codes[i]}`
|
|
});
|
|
// 同步初始化错误状态数组
|
|
this.fzListErrors.push(false);
|
|
}
|
|
}
|
|
|
|
},
|
|
onAverage() {
|
|
const { mfbzl } = this.formData;
|
|
this.fzList.forEach((item, index) => {
|
|
item.num = mfbzl;
|
|
// 同时更新错误状态
|
|
if (this.fzListErrors[index] !== undefined) {
|
|
this.$set(this.fzListErrors, index, false);
|
|
}
|
|
})
|
|
// 清除相关字段的错误状态
|
|
this.formErrors.mfbzl = false;
|
|
},
|
|
onReset() {
|
|
this.fzList.forEach((item, index) => {
|
|
item.num = "";
|
|
// 同时更新错误状态
|
|
if (this.fzListErrors[index] !== undefined) {
|
|
this.$set(this.fzListErrors, index, false);
|
|
}
|
|
})
|
|
// 清除相关字段的错误状态
|
|
this.formErrors.mfbzl = false;
|
|
},
|
|
onPrint(item) {
|
|
EventBus.$emit('subPackageDialogPrintTag', { ...this.formData, printCode: `${this.formData.mybh}-set${item.subCode}`, uuid: this.uuid });
|
|
},
|
|
onCommonBlur(e, field) {
|
|
if (this.formData[field]) {
|
|
this.formErrors[field] = false;
|
|
}
|
|
},
|
|
onBlurFzNum(index) {
|
|
if (this.fzList[index] && this.fzList[index].num) {
|
|
if (this.fzListErrors[index] !== undefined) {
|
|
this.$set(this.fzListErrors, index, false);
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.dialog-content {
|
|
padding: 20px;
|
|
}
|
|
|
|
.unit-select {
|
|
width: 100px;
|
|
}
|
|
|
|
.content-item {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.header-container {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr 1fr;
|
|
grid-gap: 20px;
|
|
margin-top: 20px;
|
|
}
|
|
|
|
.header2 {
|
|
grid-template-columns: 1fr 1fr;
|
|
}
|
|
|
|
.header-item {
|
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
background: #fff;
|
|
border-radius: 4px;
|
|
padding: 20px;
|
|
}
|
|
|
|
.header-title {
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.content-container {
|
|
margin-top: 20px;
|
|
padding: 20px;
|
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
max-height: 50vh;
|
|
overflow: auto;
|
|
}
|
|
|
|
.ml-20 {
|
|
margin-left: 20px;
|
|
}
|
|
|
|
.list-item {
|
|
display: flex;
|
|
align-items: center;
|
|
// margin-top: 20px;
|
|
}
|
|
|
|
.list-label {
|
|
margin-right: 5px;
|
|
// width: 200px;
|
|
}
|
|
.ml-5{
|
|
margin-left: 5px;
|
|
}
|
|
</style>
|