<template>
|
<div>
|
<el-dialog
|
v-model="dialogFormVisible"
|
title="生产报工"
|
width="70%"
|
draggable
|
@close="closeDia"
|
>
|
<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
|
<el-table
|
:data="reportList"
|
border
|
style="width: 100%"
|
>
|
<el-table-column
|
align="center"
|
label="序号"
|
type="index"
|
width="60"
|
/>
|
<el-table-column label="合同号" prop="salesContractNo" width="150" />
|
<el-table-column label="产品大类" prop="productCategory" width="120" />
|
<el-table-column label="规格型号" prop="specificationModel" width="150" />
|
<el-table-column label="排产数量" prop="schedulingNum" width="100">
|
<template #default="scope">
|
<span>{{ scope.row.schedulingNum }}</span>
|
</template>
|
</el-table-column>
|
<el-table-column label="待生产数量" prop="pendingFinishNum" width="100">
|
<template #default="scope">
|
<span>{{ scope.row.pendingFinishNum }}</span>
|
</template>
|
</el-table-column>
|
<el-table-column label="本次生产数量" prop="finishedNum" width="150">
|
<template #default="scope">
|
<el-input-number
|
v-model="scope.row.finishedNum"
|
placeholder="请输入"
|
:min="0"
|
:step="0.1"
|
:precision="2"
|
clearable
|
style="width: 100%"
|
@change="(val) => changeNum(scope.row, val)"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column label="单价(元)" prop="unitPrice" width="120">
|
<template #default="scope">
|
<el-input-number
|
v-model="scope.row.unitPrice"
|
placeholder="请输入"
|
:min="0"
|
:step="0.01"
|
:precision="2"
|
clearable
|
style="width: 100%"
|
@change="() => calculateTotalPrice(scope.row)"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column label="总价(元)" prop="totalPrice" width="120">
|
<template #default="scope">
|
<span>{{ scope.row.totalPrice || '0.00' }}</span>
|
</template>
|
</el-table-column>
|
<el-table-column label="生产人" prop="schedulingUserId" width="150">
|
<template #default="scope">
|
<el-select
|
v-model="scope.row.schedulingUserId"
|
placeholder="选择人员"
|
style="width: 100%;"
|
filterable
|
default-first-option
|
:reserve-keyword="false"
|
>
|
<el-option
|
v-for="user in userList"
|
:key="user.userId"
|
:label="user.nickName"
|
:value="user.userId"
|
/>
|
</el-select>
|
</template>
|
</el-table-column>
|
<el-table-column label="生产日期" prop="schedulingDate" width="150">
|
<template #default="scope">
|
<el-date-picker
|
v-model="scope.row.schedulingDate"
|
type="date"
|
placeholder="请选择日期"
|
value-format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
clearable
|
style="width: 100%"
|
/>
|
</template>
|
</el-table-column>
|
</el-table>
|
</el-form>
|
<template #footer>
|
<div class="dialog-footer">
|
<el-button type="primary" @click="submitForm">确认</el-button>
|
<el-button @click="closeDia">取消</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
</div>
|
</template>
|
|
<script setup>
|
import {ref, reactive, toRefs, getCurrentInstance} from "vue";
|
import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
|
import {userListNoPageByTenantId} from "@/api/system/user.js";
|
import {productionReport, productionReportUpdate} from "@/api/productionManagement/productionReporting.js";
|
const { proxy } = getCurrentInstance()
|
const emit = defineEmits(['close'])
|
|
const userList = ref([])
|
const dialogFormVisible = ref(false);
|
const operationType = ref('')
|
const reportList = ref([])
|
const data = reactive({
|
form: {},
|
rules: {
|
schedulingNum: [{ required: true, message: "请输入", trigger: "blur" },],
|
},
|
});
|
const { form, rules } = toRefs(data);
|
|
// 打开弹框
|
const openDialog = (type, rows) => {
|
operationType.value = type;
|
dialogFormVisible.value = true;
|
userListNoPageByTenantId().then((res) => {
|
userList.value = res.data;
|
});
|
|
// 处理多条数据
|
const rowsArray = Array.isArray(rows) ? rows : [rows];
|
reportList.value = rowsArray.map(row => {
|
const total = Number(row?.schedulingNum ?? 0);
|
const pendingFinish = Number(row?.pendingFinishNum ?? 0);
|
const autoFill = pendingFinish > 0 ? Math.min(pendingFinish, total) : total;
|
const unitPrice = row?.unitPrice ? Number(row.unitPrice) : 0.33;
|
|
return {
|
id: row?.id ?? null,
|
salesContractNo: row?.salesContractNo ?? '',
|
productCategory: row?.productCategory ?? '',
|
specificationModel: row?.specificationModel ?? '',
|
schedulingNum: total,
|
pendingFinishNum: pendingFinish, // 保存原始的待报工数量
|
finishedNum: autoFill,
|
unitPrice: unitPrice,
|
totalPrice: (autoFill * unitPrice).toFixed(2),
|
schedulingUserId: row?.schedulingUserId ?? '',
|
schedulingDate: row?.schedulingDate ?? '',
|
};
|
});
|
}
|
|
const changeNum = (row, value) => {
|
if (value > row.schedulingNum) {
|
row.finishedNum = row.schedulingNum;
|
proxy.$modal.msgWarning('本次生产数量不可大于排产数量')
|
}
|
// 验证本次生产数量不能大于待报工数量
|
if (value > row.pendingFinishNum) {
|
row.finishedNum = row.pendingFinishNum;
|
proxy.$modal.msgWarning('本次生产数量不可大于待报工数量')
|
}
|
calculateTotalPrice(row);
|
}
|
|
// 计算总价
|
const calculateTotalPrice = (row) => {
|
const quantity = Number(row.finishedNum ?? 0);
|
const unitPrice = Number(row.unitPrice ?? 0);
|
|
if (quantity > 0 && unitPrice > 0) {
|
row.totalPrice = (quantity * unitPrice).toFixed(2);
|
} else {
|
row.totalPrice = '0.00';
|
}
|
}
|
|
// 提交产品表单
|
const submitForm = () => {
|
// 验证数据
|
for (let i = 0; i < reportList.value.length; i++) {
|
const item = reportList.value[i];
|
if (!item.finishedNum || item.finishedNum <= 0) {
|
proxy.$modal.msgError(`第${i + 1}行本次生产数量需大于0`);
|
return;
|
}
|
if (item.finishedNum > item.schedulingNum) {
|
proxy.$modal.msgError(`第${i + 1}行本次生产数量不可大于排产数量`);
|
return;
|
}
|
if (item.finishedNum > item.pendingFinishNum) {
|
proxy.$modal.msgError(`第${i + 1}行本次生产数量不可大于待报工数量`);
|
return;
|
}
|
if (!item.schedulingUserId) {
|
proxy.$modal.msgError(`第${i + 1}行请选择生产人`);
|
return;
|
}
|
if (!item.schedulingDate) {
|
proxy.$modal.msgError(`第${i + 1}行请选择生产日期`);
|
return;
|
}
|
}
|
|
// 构建提交数据数组
|
const payloadList = reportList.value.map(item => ({
|
id: item.id,
|
finishedNum: Number(item.finishedNum),
|
unitPrice: Number(item.unitPrice || 0.33),
|
totalPrice: Number(item.totalPrice || 0),
|
schedulingUserId: item.schedulingUserId,
|
schedulingDate: item.schedulingDate,
|
}));
|
|
if (operationType.value === "add") {
|
productionReport(payloadList).then(res => {
|
proxy.$modal.msgSuccess("提交成功");
|
closeDia();
|
}).catch(err => {
|
console.error('提交失败:', err);
|
})
|
} else {
|
// 编辑模式,逐条更新
|
Promise.all(payloadList.map(item => productionReportUpdate(item)))
|
.then(() => {
|
proxy.$modal.msgSuccess("提交成功");
|
closeDia();
|
})
|
.catch(err => {
|
console.error('提交失败:', err);
|
proxy.$modal.msgError('提交失败,请重试');
|
});
|
}
|
}
|
|
// 关闭弹框
|
const closeDia = () => {
|
dialogFormVisible.value = false;
|
reportList.value = [];
|
emit('close')
|
};
|
defineExpose({
|
openDialog,
|
});
|
</script>
|
|
<style scoped>
|
|
</style>
|