From c6b67b0f3103729c5a14cc4777009f7ad729c7aa Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 09 一月 2026 16:20:00 +0800
Subject: [PATCH] 浪潮 1.生产管控添加新增功能以及bug修改
---
src/views/productionManagement/productionOrder/index.vue | 320 ++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 252 insertions(+), 68 deletions(-)
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index e65fd3b..f14ec66 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -2,32 +2,26 @@
<div class="app-container">
<div class="search_form">
<div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
+ <span class="search_title">浜у搧澶х被锛�</span>
+ <el-tree-select
+ v-model="searchForm.productCategory"
+ :data="productOptions"
+ placeholder="璇烽�夋嫨"
clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.projectName"
+ check-strictly
+ :render-after-expand="false"
style="width: 240px"
- placeholder="璇疯緭鍏�"
@change="handleQuery"
- clearable
- prefix-icon="Search"
/>
<span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+ <el-date-picker v-model="searchForm.registerDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
<el-button type="primary" @click="handleQuery" style="margin-left: 10px"
>鎼滅储</el-button
>
</div>
<div>
+ <el-button type="primary" @click="openDialog('create')">鏂板璁㈠崟</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
</div>
</div>
@@ -39,102 +33,279 @@
:page="page"
:tableLoading="tableLoading"
@pagination="pagination"
- ></PIMTable>
+ >
+ <template #action="{ row }">
+ <el-button type="primary" link @click="handleEdit(row)">缂栬緫</el-button>
+ <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
+ </template>
+ </PIMTable>
</div>
+ <el-dialog v-model="dialogVisible" :title="dialogTitle" width="40%" @close="closeDialog">
+ <el-form ref="formRef" :model="form" :rules="formRules" label-width="100px">
+ <el-form-item label="褰曞叆鏃ユ湡" prop="registerDate">
+ <el-date-picker v-model="form.registerDate" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" placeholder="璇烽�夋嫨褰曞叆鏃ユ湡" style="width: 100%"/>
+ </el-form-item>
+ <el-form-item label="浜у搧澶х被" prop="productCategory">
+ <el-input
+ v-model="form.productCategory"
+ placeholder="璇疯緭鍏ヤ骇鍝佸ぇ绫�"
+ clearable
+ />
+ </el-form-item>
+ <el-form-item label="瑙勬牸鍨嬪彿" prop="specificationModel">
+ <el-input
+ v-model="form.specificationModel"
+ placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+ clearable
+ />
+ </el-form-item>
+ <el-form-item label="鍗曚綅" prop="unit">
+ <el-input
+ v-model="form.unit"
+ placeholder="璇疯緭鍏ュ崟浣�"
+ clearable
+ />
+ </el-form-item>
+ <el-form-item label="鏁伴噺" prop="quantity">
+ <el-input-number v-model="form.quantity" :min="0" :step="0.1" style="width: 100%"/>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
</div>
</template>
<script setup>
-import {onMounted, ref} from "vue";
+import {onMounted, ref, reactive, toRefs, getCurrentInstance} from "vue";
import { ElMessageBox } from "element-plus";
import dayjs from "dayjs";
-import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
+import {schedulingListPage, addProductionOrder, updateProductionOrder, deleteProductionOrder} from "@/api/productionManagement/productionOrder.js";
+import {productTreeList} from "@/api/basicData/product.js";
const { proxy } = getCurrentInstance();
const tableColumn = ref([
{
label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
+ prop: "registerDate",
width: 120,
},
{
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
+ label: "鐢熶骇璁㈠崟鍙�",
+ prop: "orderNo",
},
{
label: "浜у搧澶х被",
prop: "productCategory",
- width: 160,
},
{
label: "瑙勬牸鍨嬪彿",
prop: "specificationModel",
- width: 220,
},
{
label: "鍗曚綅",
prop: "unit",
- width:90
},
{
label: "鏁伴噺",
prop: "quantity",
},
+ // {
+ // label: "鎺掍骇鏁伴噺",
+ // prop: "schedulingNum",
+ // width: 100,
+ // },
+ // {
+ // label: "瀹屽伐鏁伴噺",
+ // prop: "successNum",
+ // width: 100,
+ // },
{
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "瀹屽伐鏁伴噺",
- prop: "successNum",
- width: 100,
- },
+ label: "鎿嶄綔",
+ prop: "action",
+ width: 120,
+ fixed: "right",
+ dataType: "slot",
+ align: "center",
+ slot: "action"
+ }
]);
const tableData = ref([]);
const tableLoading = ref(false);
-const page = reactive({
+const page = ref({
current: 1,
size: 100,
total: 0,
});
+const dialogVisible = ref(false);
+const dialogTitle = ref("");
+const dialogMode = ref(""); // 'create' 鎴� 'edit'
+const formRef = ref();
+const productOptions = ref([]);
+const form = reactive({
+ id: null,
+ registerDate: dayjs().format("YYYY-MM-DD"),
+ productCategory: "",
+ specificationModel: "",
+ unit: "",
+ quantity: null,
+});
+const formRules = {
+ registerDate: [{ required: true, message: "璇烽�夋嫨褰曞叆鏃ユ湡", trigger: "change" }],
+ productCategory: [{ required: true, message: "璇疯緭鍏ヤ骇鍝佸ぇ绫�", trigger: "blur" }],
+ specificationModel: [{ required: true, message: "璇疯緭鍏ヨ鏍煎瀷鍙�", trigger: "blur" }],
+ unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+};
const data = reactive({
searchForm: {
- customerName: "",
- projectName: "",
- entryDate: [], // 褰曞叆鏃ユ湡
- entryDateStart: '',
- entryDateEnd: '',
+ productCategory: "",
+ registerDate: null, // 褰曞叆鏃ユ湡
+ entryDateStart: undefined,
+ entryDateEnd: undefined,
},
});
const { searchForm } = toRefs(data);
+const openDialog = (mode, row = null) => {
+ dialogMode.value = mode;
+ if (mode === 'create') {
+ dialogTitle.value = "鏂板鐢熶骇璁㈠崟";
+ resetForm();
+ } else if (mode === 'edit') {
+ dialogTitle.value = "缂栬緫鐢熶骇璁㈠崟";
+ resetForm();
+
+ console.log('缂栬緫鏁版嵁:', row);
+
+ // 濉厖缂栬緫鏁版嵁
+ form.id = row.id;
+ form.registerDate = row.registerDate;
+ form.productCategory = row.productCategory;
+ form.specificationModel = row.specificationModel;
+ form.unit = row.unit;
+ form.quantity = row.quantity;
+ }
+
+ dialogVisible.value = true;
+};
+
+const closeDialog = () => {
+ dialogVisible.value = false;
+};
+
+const resetForm = () => {
+ form.id = null;
+ form.registerDate = dayjs().format("YYYY-MM-DD");
+ form.productCategory = "";
+ form.specificationModel = "";
+ form.unit = "";
+ form.quantity = null;
+};
+
+const submitForm = () => {
+ formRef.value?.validate(async (valid) => {
+ if (!valid) return;
+ try {
+ const payload = {
+ registerDate: form.registerDate,
+ productCategory: form.productCategory,
+ specificationModel: form.specificationModel,
+ unit: form.unit,
+ quantity: form.quantity,
+ };
+
+ if (dialogMode.value === 'create') {
+ await addProductionOrder(payload);
+ proxy.$modal.msgSuccess("鏂板鎴愬姛");
+ } else if (dialogMode.value === 'edit') {
+ payload.id = form.id;
+ await updateProductionOrder(payload);
+ proxy.$modal.msgSuccess("缂栬緫鎴愬姛");
+ }
+
+ closeDialog();
+ getList();
+ } catch (err) {
+ console.error(`${dialogMode.value === 'create' ? '鏂板' : '缂栬緫'}澶辫触`, err);
+ proxy.$modal.msgError(`${dialogMode.value === 'create' ? '鏂板' : '缂栬緫'}澶辫触锛岃閲嶈瘯`);
+ }
+ });
+};
+
+// 缂栬緫鏂规硶
+const handleEdit = (row) => {
+ openDialog('edit', row);
+};
+
+// 鍒犻櫎鏂规硶
+const handleDelete = (row) => {
+ proxy.$modal.confirm(`纭畾瑕佸垹闄ょ敓浜ц鍗�"${row.orderNo}"鍚楋紵`, "鍒犻櫎纭", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }).then(async () => {
+ try {
+ await deleteProductionOrder([row.id]);
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList(); // 鍒锋柊鍒楄〃
+ } catch (err) {
+ console.error("鍒犻櫎澶辫触", err);
+ proxy.$modal.msgError("鍒犻櫎澶辫触锛岃閲嶈瘯");
+ }
+ }).catch(() => {
+ proxy.$modal.msg("宸插彇娑堝垹闄�");
+ });
+};
+
+const getProductOptions = () => {
+ return productTreeList().then((res) => {
+ productOptions.value = convertIdToValue(res || []);
+ });
+};
+
+const convertIdToValue = (data) => {
+ return data.map((item) => {
+ const { id, children, ...rest } = item;
+ const newItem = {
+ ...rest,
+ value: id,
+ };
+ if (children && children.length > 0) {
+ newItem.children = convertIdToValue(children);
+ }
+ return newItem;
+ });
+};
+
+const findNodeById = (nodes, value) => {
+ for (let i = 0; i < nodes.length; i++) {
+ if (nodes[i].value === value) {
+ return nodes[i].label;
+ }
+ if (nodes[i].children && nodes[i].children.length > 0) {
+ const label = findNodeById(nodes[i].children, value);
+ if (label) return label;
+ }
+ }
+ return null;
+};
+
+
// 鏌ヨ鍒楄〃
/** 鎼滅储鎸夐挳鎿嶄綔 */
const handleQuery = () => {
- page.current = 1;
+ page.value.current = 1;
getList();
};
const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
+ page.value.current = obj.page;
+ page.value.size = obj.limit;
getList();
};
const changeDaterange = (value) => {
@@ -149,13 +320,27 @@
};
const getList = () => {
tableLoading.value = true;
- // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
+ // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁鍜� total 瀛楁
+ const { total, ...pageParams } = page.value;
+ const params = { ...searchForm.value, ...pageParams };
+ params.registerDate = undefined;
+ if (params.productCategory) {
+ // 濡傛灉鏄璞$被鍨嬶紝鑾峰彇鍏秎abel锛堝悕绉帮級鑰屼笉鏄痸alue锛圛D锛�
+ if (typeof params.productCategory === "object") {
+ params.productCategory = findNodeById(productOptions.value, params.productCategory) || params.productCategory;
+ }
+ // 濡傛灉鏄疘D锛岃浆鎹负鍚嶇О
+ else if (typeof params.productCategory === "string" || typeof params.productCategory === "number") {
+ const categoryName = findNodeById(productOptions.value, params.productCategory);
+ if (categoryName) {
+ params.productCategory = categoryName;
+ }
+ }
+ }
schedulingListPage(params).then((res) => {
tableLoading.value = false;
tableData.value = res.data.records;
- page.total = res.data.total;
+ page.value.total = res.data.total;
}).catch(() => {
tableLoading.value = false;
})
@@ -177,12 +362,11 @@
};
onMounted(() => {
- searchForm.value.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- searchForm.value.entryDateStart = dayjs().format("YYYY-MM-DD")
- searchForm.value.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
+ getProductOptions();
+ // 涓嶈缃粯璁ゆ棩鏈燂紝鍏ㄩ儴鏉′欢涓虹┖鍔犺浇
+ searchForm.value.registerDate = null;
+ searchForm.value.entryDateStart = undefined;
+ searchForm.value.entryDateEnd = undefined;
getList();
});
</script>
--
Gitblit v1.9.3