From 67569b8d234da7ca2d0131226392410c6ae35635 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 05 一月 2026 11:54:47 +0800
Subject: [PATCH] 海川开心: 1.销售管理、仓储物流一些字段赋默认值 2.生产报工改成可以多个报工
---
src/views/productionManagement/productionReporting/components/formDia.vue | 283 ++++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 194 insertions(+), 89 deletions(-)
diff --git a/src/views/productionManagement/productionReporting/components/formDia.vue b/src/views/productionManagement/productionReporting/components/formDia.vue
index 89f6c76..18df18d 100644
--- a/src/views/productionManagement/productionReporting/components/formDia.vue
+++ b/src/views/productionManagement/productionReporting/components/formDia.vue
@@ -4,68 +4,100 @@
v-model="dialogFormVisible"
title="鐢熶骇鎶ュ伐"
width="70%"
+ draggable
@close="closeDia"
>
<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎺掍骇鏁伴噺锛�" prop="schedulingNum">
- <el-input v-model="form.schedulingNum" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鐢熶骇鏁伴噺锛�" prop="finishedNum">
- <el-input-number
- v-model="form.finishedNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- @change="changeNum"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寰呯敓浜ф暟閲忥細" prop="pendingNum">
- <el-input v-model="form.pendingNum" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢熶骇浜猴細" prop="schedulingUserId">
- <el-select
- v-model="form.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢熶骇鏃ユ湡锛�" prop="schedulingDate">
- <el-date-picker
- v-model="form.schedulingDate"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
+ <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)"
/>
- </el-form-item>
- </el-col>
- </el-row>
+ </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">
@@ -78,7 +110,7 @@
</template>
<script setup>
-import {ref} from "vue";
+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";
@@ -88,14 +120,9 @@
const userList = ref([])
const dialogFormVisible = ref(false);
const operationType = ref('')
+const reportList = ref([])
const data = reactive({
- form: {
- successNum: "",
- schedulingNum: "",
- finishedNum: "",
- schedulingUserId: "",
- schedulingDate: "",
- },
+ form: {},
rules: {
schedulingNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
},
@@ -103,46 +130,124 @@
const { form, rules } = toRefs(data);
// 鎵撳紑寮规
-const openDialog = (type, row) => {
+const openDialog = (type, rows) => {
operationType.value = type;
dialogFormVisible.value = true;
userListNoPageByTenantId().then((res) => {
userList.value = res.data;
});
- form.value = {...row}
+
+ // 澶勭悊澶氭潯鏁版嵁
+ 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 = (value) => {
- if (value > form.value.schedulingNum) {
- form.value.finishedNum = form.value.schedulingNum;
+const changeNum = (row, value) => {
+ if (value > row.schedulingNum) {
+ row.finishedNum = row.schedulingNum;
proxy.$modal.msgWarning('鏈鐢熶骇鏁伴噺涓嶅彲澶т簬鎺掍骇鏁伴噺')
}
- form.value.pendingNum = form.value.schedulingNum - form.value.finishedNum;
+ // 楠岃瘉鏈鐢熶骇鏁伴噺涓嶈兘澶т簬寰呮姤宸ユ暟閲�
+ 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 = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- productionReport(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- productionReportUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
+ // 楠岃瘉鏁版嵁
+ 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 = () => {
- proxy.resetForm("formRef");
dialogFormVisible.value = false;
+ reportList.value = [];
emit('close')
};
defineExpose({
--
Gitblit v1.9.3