From fe44869e3ab926c3e1065145337b79eb6e2fb2cd Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 01 六月 2026 14:00:14 +0800
Subject: [PATCH] feat(shipping): 1.发货的时候需要填出库批号,选入库批号 2.可以按批号,批量入库 3.销售退货将发货单号改成出库批号
---
src/views/inventoryManagement/dispatchLog/Record.vue | 1051 ++++++++++++++++++++--------------------
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js | 7
src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js | 3
src/views/salesManagement/salesLedger/index.vue | 15
src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue | 456 ++++++++++------
5 files changed, 822 insertions(+), 710 deletions(-)
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index 2d7411d..431fd24 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,416 +1,411 @@
<template>
<div>
- <div class="search_form"
- style="margin-bottom: 10px">
- <el-form ref="searchFormRef"
- :model="searchForm"
- class="demo-form-inline">
+ <div class="search_form" style="margin-bottom: 10px">
+ <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline">
<el-row :gutter="20">
<el-col :span="4">
- <el-form-item label="鍑哄簱鏃ユ湡"
- prop="timeStr">
- <el-date-picker v-model="searchForm.timeStr"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable />
+ <el-form-item label="鍑哄簱鏃ユ湡" prop="timeStr">
+ <el-date-picker
+ v-model="searchForm.timeStr"
+ type="date"
+ placeholder="璇烽�夋嫨鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="浜у搧澶х被"
- prop="productName">
- <el-input v-model="searchForm.productName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable />
+ <el-form-item label="浜у搧澶х被" prop="productName">
+ <el-input
+ v-model="searchForm.productName"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="瑙勬牸鍨嬪彿"
- prop="model">
- <el-input v-model="searchForm.model"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable />
+ <el-form-item label="瑙勬牸鍨嬪彿" prop="model">
+ <el-input
+ v-model="searchForm.model"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="鎵瑰彿"
- prop="batchNo">
- <el-input v-model="searchForm.batchNo"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable />
+ <el-form-item label="鎵瑰彿" prop="batchNo">
+ <el-input
+ v-model="searchForm.batchNo"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="鏉ユ簮"
- prop="recordType">
- <el-select v-model="searchForm.recordType"
- style="width: 240px"
- placeholder="璇烽�夋嫨"
- clearable>
- <el-option v-for="item in stockRecordTypeOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value" />
+ <el-form-item label="鏉ユ簮" prop="recordType">
+ <el-select
+ v-model="searchForm.recordType"
+ style="width: 240px"
+ placeholder="璇烽�夋嫨"
+ clearable
+ >
+ <el-option
+ v-for="item in stockRecordTypeOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
</el-select>
</el-form-item>
</el-col>
<!-- 鎸夐挳 -->
<el-col :span="4">
<el-form-item>
- <el-button type="primary"
- @click="getList">
- 鎼滅储
- </el-button>
- <el-button @click="resetSearch">
- 閲嶇疆
- </el-button>
+ <el-button type="primary" @click="getList"> 鎼滅储 </el-button>
+ <el-button @click="resetSearch"> 閲嶇疆 </el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="actions">
- <el-button type="primary"
- @click="handleBatchApprove">瀹℃壒</el-button>
+ <el-button type="primary" @click="handleBatchApprove">瀹℃壒</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎</el-button>
- <el-button type="primary"
- plain
- @click="handlePrint">鎵撳嵃</el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+ <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
</div>
<div class="table_list">
- <el-table :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- style="width: 100%"
- height="calc(100vh - 18.5em)">
- <el-table-column align="center"
- type="selection"
- width="55" />
- <el-table-column align="center"
- label="搴忓彿"
- type="index"
- width="60" />
- <el-table-column label="鍑哄簱鎵规"
- prop="outboundBatches"
- min-width="100"
- show-overflow-tooltip />
- <el-table-column label="鍑哄簱鏃ユ湡"
- prop="createTime"
- show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被"
- prop="productName"
- show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿"
- prop="model"
- show-overflow-tooltip />
- <el-table-column label="鎵瑰彿"
- prop="batchNo"
- show-overflow-tooltip />
- <el-table-column label="鍗曚綅"
- prop="unit"
- show-overflow-tooltip />
- <el-table-column label="鍑哄簱鏁伴噺"
- prop="stockOutNum"
- show-overflow-tooltip />
- <el-table-column label="鍑哄簱浜�"
- prop="createBy"
- show-overflow-tooltip />
- <el-table-column label="鏉ユ簮"
- prop="recordType"
- show-overflow-tooltip>
+ <el-table
+ :data="tableData"
+ border
+ v-loading="tableLoading"
+ @selection-change="handleSelectionChange"
+ :expand-row-keys="expandedRowKeys"
+ :row-key="(row) => row.id"
+ style="width: 100%"
+ height="calc(100vh - 18.5em)"
+ >
+ <el-table-column align="center" type="selection" width="55" />
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column
+ label="鍑哄簱鎵规"
+ prop="outboundBatches"
+ min-width="100"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="鍑哄簱鏃ユ湡"
+ prop="updateTime"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="浜у搧澶х被"
+ prop="productName"
+ show-overflow-tooltip
+ />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+ <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+ <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
+ <el-table-column
+ label="鍑哄簱鏁伴噺"
+ prop="stockOutNum"
+ show-overflow-tooltip
+ />
+ <el-table-column label="鍑哄簱浜�" prop="createBy" show-overflow-tooltip />
+ <el-table-column label="鏉ユ簮" prop="recordType" show-overflow-tooltip>
<template #default="scope">
{{ getRecordType(scope.row.recordType) }}
</template>
</el-table-column>
- <el-table-column label="瀹℃壒鐘舵��"
- prop="approvalStatus"
- show-overflow-tooltip>
+ <el-table-column
+ label="瀹℃壒鐘舵��"
+ prop="approvalStatus"
+ show-overflow-tooltip
+ >
<template #default="scope">
- <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)"
- size="small">
+ <el-tag
+ :type="getApprovalStatusTagType(scope.row.approvalStatus)"
+ size="small"
+ >
{{ getApprovalStatusLabel(scope.row.approvalStatus) }}
</el-tag>
</template>
</el-table-column>
</el-table>
- <pagination v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange" />
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page="page.current"
+ :limit="page.size"
+ @pagination="paginationChange"
+ />
</div>
</div>
</template>
<script setup>
- import pagination from "@/components/PIMTable/Pagination.vue";
- import { ref } from "vue";
- import { ElMessageBox } from "element-plus";
- import useUserStore from "@/store/modules/user";
- import { getCurrentDate } from "@/utils/index.js";
- import {
- getStockOutPage,
- delPendingStockOut,
- batchApproveStockOutRecords,
- } from "@/api/inventoryManagement/stockOut.js";
- import {
- findAllQualifiedStockOutRecordTypeOptions,
- findAllUnQualifiedStockOutRecordTypeOptions,
- } from "@/api/basicData/enum.js";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { ElMessageBox } from "element-plus";
+import useUserStore from "@/store/modules/user";
+import { getCurrentDate } from "@/utils/index.js";
+import {
+ getStockOutPage,
+ delPendingStockOut,
+ batchApproveStockOutRecords,
+} from "@/api/inventoryManagement/stockOut.js";
+import {
+ findAllQualifiedStockOutRecordTypeOptions,
+ findAllUnQualifiedStockOutRecordTypeOptions,
+} from "@/api/basicData/enum.js";
- const userStore = useUserStore();
- const { proxy } = getCurrentInstance();
- const tableData = ref([]);
- const selectedRows = ref([]);
- const tableLoading = ref(false);
- // 鏉ユ簮绫诲瀷閫夐」
- const stockRecordTypeOptions = ref([]);
- const page = reactive({
- current: 1,
- size: 100,
- });
- const total = ref(0);
+const userStore = useUserStore();
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+// 鏉ユ簮绫诲瀷閫夐」
+const stockRecordTypeOptions = ref([]);
+const page = reactive({
+ current: 1,
+ size: 100,
+});
+const total = ref(0);
- const props = defineProps({
- type: {
- type: String,
- required: true,
- default: "0",
- },
- topParentProductId: {
- type: [String, Number],
- default: undefined,
- },
- });
+const props = defineProps({
+ type: {
+ type: String,
+ required: true,
+ default: "0",
+ },
+ topParentProductId: {
+ type: [String, Number],
+ default: undefined,
+ },
+});
- // 鎵撳嵃鐩稿叧
- const printPreviewVisible = ref(false);
- const printData = ref([]);
+// 鎵撳嵃鐩稿叧
+const printPreviewVisible = ref(false);
+const printData = ref([]);
- // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
- const data = reactive({
- searchForm: {
- supplierName: "",
- timeStr: "",
- recordType: "",
- },
- });
- const { searchForm } = toRefs(data);
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const data = reactive({
+ searchForm: {
+ supplierName: "",
+ timeStr: "",
+ recordType: "",
+ },
+});
+const { searchForm } = toRefs(data);
- const searchFormRef = ref(null);
+const searchFormRef = ref(null);
- const resetSearch = () => {
- searchFormRef.value?.resetFields();
- page.current = 1;
- getList();
- };
+const resetSearch = () => {
+ searchFormRef.value?.resetFields();
+ page.current = 1;
+ getList();
+};
- const paginationChange = obj => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
- };
- const getList = () => {
- tableLoading.value = true;
- getStockOutPage({
- ...searchForm.value,
- ...page,
- topParentProductId: props.topParentProductId,
+const paginationChange = (obj) => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+};
+const getList = () => {
+ tableLoading.value = true;
+ getStockOutPage({
+ ...searchForm.value,
+ ...page,
+ topParentProductId: props.topParentProductId,
+ })
+ .then((res) => {
+ tableLoading.value = false;
+ tableData.value = res.data.records;
+ tableData.value.map((item) => {
+ item.children = [];
+ });
+ total.value = res.data.total;
})
- .then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- tableData.value.map(item => {
- item.children = [];
- });
- total.value = res.data.total;
- })
- .catch(() => {
- tableLoading.value = false;
- });
- };
+ .catch(() => {
+ tableLoading.value = false;
+ });
+};
- const getRecordType = recordType => {
- return (
- stockRecordTypeOptions.value.find(item => item.value === recordType)
- ?.label || ""
- );
- };
+const getRecordType = (recordType) => {
+ return (
+ stockRecordTypeOptions.value.find((item) => item.value === recordType)
+ ?.label || ""
+ );
+};
- const approvalStatusLabelMap = {
- 0: "寰呭鎵�",
- 1: "閫氳繃",
- 2: "椹冲洖",
- 3: "寰呯‘璁�",
- pending: "寰呭鎵�",
- approved: "閫氳繃",
- rejected: "椹冲洖",
- PENDING: "寰呭鎵�",
- APPROVED: "閫氳繃",
- REJECTED: "椹冲洖",
- };
+const approvalStatusLabelMap = {
+ 0: "寰呭鎵�",
+ 1: "閫氳繃",
+ 2: "椹冲洖",
+ 3: "寰呯‘璁�",
+ pending: "寰呭鎵�",
+ approved: "閫氳繃",
+ rejected: "椹冲洖",
+ PENDING: "寰呭鎵�",
+ APPROVED: "閫氳繃",
+ REJECTED: "椹冲洖",
+};
- const getApprovalStatusLabel = status => {
- if (status === null || status === undefined || status === "") {
- return "寰呭鎵�";
- }
- return approvalStatusLabelMap[status] || "寰呭鎵�";
- };
+const getApprovalStatusLabel = (status) => {
+ if (status === null || status === undefined || status === "") {
+ return "寰呭鎵�";
+ }
+ return approvalStatusLabelMap[status] || "寰呭鎵�";
+};
- // 閫氳繃/椹冲洖鍥哄畾鑹诧紱鍏朵綑锛堝惈寰呭鎵广�佺┖鍊笺�佹湭鏄犲皠浣嗘枃妗堜负寰呭鎵癸級缁熶竴鐢� warning 棰勮鑹�
- const getApprovalStatusTagType = status => {
- if (
- status === 1 ||
- status === "1" ||
- status === "approved" ||
- status === "APPROVED"
- )
- return "success";
- if (
- status === 2 ||
- status === "2" ||
- status === "rejected" ||
- status === "REJECTED"
- )
- return "danger";
- return "warning";
- };
+// 閫氳繃/椹冲洖鍥哄畾鑹诧紱鍏朵綑锛堝惈寰呭鎵广�佺┖鍊笺�佹湭鏄犲皠浣嗘枃妗堜负寰呭鎵癸級缁熶竴鐢� warning 棰勮鑹�
+const getApprovalStatusTagType = (status) => {
+ if (
+ status === 1 ||
+ status === "1" ||
+ status === "approved" ||
+ status === "APPROVED"
+ )
+ return "success";
+ if (
+ status === 2 ||
+ status === "2" ||
+ status === "rejected" ||
+ status === "REJECTED"
+ )
+ return "danger";
+ return "warning";
+};
- // 鑾峰彇鏉ユ簮绫诲瀷閫夐」
- const fetchStockRecordTypeOptions = () => {
- if (props.type === "0") {
- findAllQualifiedStockOutRecordTypeOptions().then(res => {
- stockRecordTypeOptions.value = res.data;
- });
- return;
- }
- findAllUnQualifiedStockOutRecordTypeOptions().then(res => {
+// 鑾峰彇鏉ユ簮绫诲瀷閫夐」
+const fetchStockRecordTypeOptions = () => {
+ if (props.type === "0") {
+ findAllQualifiedStockOutRecordTypeOptions().then((res) => {
stockRecordTypeOptions.value = res.data;
});
- };
+ return;
+ }
+ findAllUnQualifiedStockOutRecordTypeOptions().then((res) => {
+ stockRecordTypeOptions.value = res.data;
+ });
+};
- // 琛ㄦ牸閫夋嫨鏁版嵁
- const handleSelectionChange = selection => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log("selection", selectedRows.value);
- };
- const expandedRowKeys = ref([]);
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+ // 杩囨护鎺夊瓙鏁版嵁
+ selectedRows.value = selection.filter((item) => item.id);
+ console.log("selection", selectedRows.value);
+};
+const expandedRowKeys = ref([]);
- const handleBatchApprove = () => {
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- const ids = selectedRows.value.map(item => item.id);
- ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "瀹℃壒", {
- confirmButtonText: "閫氳繃",
- cancelButtonText: "椹冲洖",
- type: "warning",
- distinguishCancelAndClose: true,
+const handleBatchApprove = () => {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ const ids = selectedRows.value.map((item) => item.id);
+ ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "瀹℃壒", {
+ confirmButtonText: "閫氳繃",
+ cancelButtonText: "椹冲洖",
+ type: "warning",
+ distinguishCancelAndClose: true,
+ })
+ .then(() => {
+ batchApproveStockOutRecords({ ids, approvalStatus: 1 })
+ .then(() => {
+ proxy.$modal.msgSuccess("瀹℃壒閫氳繃鎴愬姛");
+ getList();
+ })
+ .catch(() => {
+ proxy.$modal.msgError("瀹℃壒閫氳繃澶辫触");
+ });
})
- .then(() => {
- batchApproveStockOutRecords({ ids, approvalStatus: 1 })
+ .catch((action) => {
+ if (action === "cancel") {
+ batchApproveStockOutRecords({ ids, approvalStatus: 2 })
.then(() => {
- proxy.$modal.msgSuccess("瀹℃壒閫氳繃鎴愬姛");
+ proxy.$modal.msgSuccess("瀹℃壒椹冲洖鎴愬姛");
getList();
})
.catch(() => {
- proxy.$modal.msgError("瀹℃壒閫氳繃澶辫触");
+ proxy.$modal.msgError("瀹℃壒椹冲洖澶辫触");
});
- })
- .catch(action => {
- if (action === "cancel") {
- batchApproveStockOutRecords({ ids, approvalStatus: 2 })
- .then(() => {
- proxy.$modal.msgSuccess("瀹℃壒椹冲洖鎴愬姛");
- getList();
- })
- .catch(() => {
- proxy.$modal.msgError("瀹℃壒椹冲洖澶辫触");
- });
- return;
- }
- proxy.$modal.msg("宸插彇娑�");
- });
- };
+ return;
+ }
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
- // 瀵煎嚭
- const handleOut = () => {
- ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
+// 瀵煎嚭
+const handleOut = () => {
+ ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ proxy.download(
+ "/stockOutRecord/exportStockOutRecord",
+ { type: props.type },
+ props.type === "0" ? "鍚堟牸鍑哄簱鍙拌处.xlsx" : "涓嶅悎鏍煎嚭搴撳彴璐�.xlsx"
+ );
})
- .then(() => {
- proxy.download(
- "/stockOutRecord/exportStockOutRecord",
- { type: props.type },
- props.type === "0" ? "鍚堟牸鍑哄簱鍙拌处.xlsx" : "涓嶅悎鏍煎嚭搴撳彴璐�.xlsx"
- );
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- };
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
- // 鍒犻櫎
- const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
+// 鍒犻櫎
+const handleDelete = () => {
+ let ids = [];
+ if (selectedRows.value.length > 0) {
+ ids = selectedRows.value.map((item) => item.id);
+ } else {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ delPendingStockOut(ids).then((res) => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList();
+ });
})
- .then(() => {
- delPendingStockOut(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- };
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
- // 鎵撳嵃鍔熻兘
- const handlePrint = () => {
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
- return;
- }
- printData.value = [...selectedRows.value];
- console.log("鎵撳嵃鏁版嵁:", printData.value);
- printPreviewVisible.value = true;
- };
+// 鎵撳嵃鍔熻兘
+const handlePrint = () => {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
+ return;
+ }
+ printData.value = [...selectedRows.value];
+ console.log("鎵撳嵃鏁版嵁:", printData.value);
+ printPreviewVisible.value = true;
+};
- // 鎵ц鎵撳嵃
- const executePrint = () => {
- console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
- console.log("鎵撳嵃鏁版嵁:", printData.value);
+// 鎵ц鎵撳嵃
+const executePrint = () => {
+ console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
+ console.log("鎵撳嵃鏁版嵁:", printData.value);
- // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
- const printWindow = window.open("", "_blank", "width=800,height=600");
+ // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
+ const printWindow = window.open("", "_blank", "width=800,height=600");
- // 鏋勫缓鎵撳嵃鍐呭
- let printContent = `
+ // 鏋勫缓鎵撳嵃鍐呭
+ let printContent = `
<!DOCTYPE html>
<html>
<head>
@@ -545,9 +540,9 @@
<body>
`;
- // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
- printData.value.forEach((item, index) => {
- printContent += `
+ // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
+ printData.value.forEach((item, index) => {
+ printContent += `
<div class="print-page">
<div class="delivery-note">
<div class="header">
@@ -637,233 +632,233 @@
</div>
</div>
`;
- });
+ });
- printContent += `
+ printContent += `
</body>
</html>
`;
- // 鍐欏叆鍐呭鍒版柊绐楀彛
- printWindow.document.write(printContent);
- printWindow.document.close();
+ // 鍐欏叆鍐呭鍒版柊绐楀彛
+ printWindow.document.write(printContent);
+ printWindow.document.close();
- // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
- printWindow.onload = () => {
- setTimeout(() => {
- printWindow.print();
- printWindow.close();
- printPreviewVisible.value = false;
- }, 500);
- };
+ // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
+ printWindow.onload = () => {
+ setTimeout(() => {
+ printWindow.print();
+ printWindow.close();
+ printPreviewVisible.value = false;
+ }, 500);
};
+};
- // 鏍煎紡鍖栨棩鏈�
- const formatDate = dateString => {
- if (!dateString) return getCurrentDate();
- const date = new Date(dateString);
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- return `${year}/${month}/${day}`;
- };
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = (dateString) => {
+ if (!dateString) return getCurrentDate();
+ const date = new Date(dateString);
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ return `${year}/${month}/${day}`;
+};
- // 鏍煎紡鍖栨棩鏈熸椂闂�
- const formatDateTime = date => {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- const hours = String(date.getHours()).padStart(2, "0");
- const minutes = String(date.getMinutes()).padStart(2, "0");
- const seconds = String(date.getSeconds()).padStart(2, "0");
- return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
- };
- onMounted(() => {
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = (date) => {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ const hours = String(date.getHours()).padStart(2, "0");
+ const minutes = String(date.getMinutes()).padStart(2, "0");
+ const seconds = String(date.getSeconds()).padStart(2, "0");
+ return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
+};
+onMounted(() => {
+ getList();
+ fetchStockRecordTypeOptions();
+});
+
+watch(
+ () => props.topParentProductId,
+ () => {
+ page.current = 1;
getList();
- fetchStockRecordTypeOptions();
- });
-
- watch(
- () => props.topParentProductId,
- () => {
- page.current = 1;
- getList();
- }
- );
+ }
+);
</script>
<style scoped lang="scss">
- .print-preview-dialog {
- .el-dialog__body {
- padding: 0;
- max-height: 80vh;
- overflow-y: auto;
- }
+.print-preview-dialog {
+ .el-dialog__body {
+ padding: 0;
+ max-height: 80vh;
+ overflow-y: auto;
}
+}
- .print-preview-container {
- .print-preview-header {
- padding: 15px;
- border-bottom: 1px solid #e4e7ed;
- text-align: center;
-
- .el-button {
- margin: 0 10px;
- }
- }
-
- .print-preview-content {
- padding: 20px;
- background-color: #f5f5f5;
- min-height: 400px;
- }
- }
-
- .print-page {
- width: 220mm;
- height: 90mm;
- padding: 10mm;
- margin: 0 auto;
- background: white;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- margin-bottom: 10px;
- box-sizing: border-box;
- }
-
- .delivery-note {
- width: 100%;
- height: 100%;
- font-family: "SimSun", serif;
- font-size: 10px;
- line-height: 1.2;
- display: flex;
- flex-direction: column;
- }
-
- .header {
+.print-preview-container {
+ .print-preview-header {
+ padding: 15px;
+ border-bottom: 1px solid #e4e7ed;
text-align: center;
- margin-bottom: 8px;
- .company-name {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 4px;
- }
-
- .document-title {
- font-size: 16px;
- font-weight: bold;
+ .el-button {
+ margin: 0 10px;
}
}
- .info-section {
- margin-bottom: 8px;
- display: flex;
- justify-content: space-between;
- align-items: center;
+ .print-preview-content {
+ padding: 20px;
+ background-color: #f5f5f5;
+ min-height: 400px;
+ }
+}
- .info-row {
- line-height: 20px;
+.print-page {
+ width: 220mm;
+ height: 90mm;
+ padding: 10mm;
+ margin: 0 auto;
+ background: white;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+ margin-bottom: 10px;
+ box-sizing: border-box;
+}
+
+.delivery-note {
+ width: 100%;
+ height: 100%;
+ font-family: "SimSun", serif;
+ font-size: 10px;
+ line-height: 1.2;
+ display: flex;
+ flex-direction: column;
+}
+
+.header {
+ text-align: center;
+ margin-bottom: 8px;
+
+ .company-name {
+ font-size: 18px;
+ font-weight: bold;
+ margin-bottom: 4px;
+ }
+
+ .document-title {
+ font-size: 16px;
+ font-weight: bold;
+ }
+}
+
+.info-section {
+ margin-bottom: 8px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .info-row {
+ line-height: 20px;
+
+ .label {
+ font-weight: bold;
+ width: 60px;
+ font-size: 14px;
+ }
+
+ .value {
+ margin-right: 20px;
+ min-width: 80px;
+ font-size: 14px;
+ }
+ }
+}
+
+.table-section {
+ margin-bottom: 4px;
+ flex: 1;
+
+ .product-table {
+ width: 100%;
+ border-collapse: collapse;
+ border: 1px solid #000;
+
+ th,
+ td {
+ border: 1px solid #000;
+ padding: 6px;
+ text-align: center;
+ font-size: 14px;
+ line-height: 1.4;
+ }
+
+ th {
+ font-weight: bold;
+ }
+
+ .total-label {
+ text-align: right;
+ font-weight: bold;
+ }
+
+ .total-value {
+ font-weight: bold;
+ }
+ }
+}
+
+.footer-section {
+ .footer-row {
+ display: flex;
+ margin-bottom: 3px;
+ line-height: 20px;
+ justify-content: space-between;
+
+ .footer-item {
+ display: flex;
+ margin-right: 20px;
.label {
font-weight: bold;
- width: 60px;
+ width: 80px;
font-size: 14px;
}
.value {
- margin-right: 20px;
min-width: 80px;
font-size: 14px;
}
- }
- }
- .table-section {
- margin-bottom: 4px;
- flex: 1;
-
- .product-table {
- width: 100%;
- border-collapse: collapse;
- border: 1px solid #000;
-
- th,
- td {
- border: 1px solid #000;
- padding: 6px;
- text-align: center;
- font-size: 14px;
- line-height: 1.4;
- }
-
- th {
- font-weight: bold;
- }
-
- .total-label {
- text-align: right;
- font-weight: bold;
- }
-
- .total-value {
- font-weight: bold;
- }
- }
- }
-
- .footer-section {
- .footer-row {
- display: flex;
- margin-bottom: 3px;
- line-height: 20px;
- justify-content: space-between;
-
- .footer-item {
- display: flex;
- margin-right: 20px;
-
- .label {
- font-weight: bold;
- width: 80px;
- font-size: 14px;
- }
-
- .value {
- min-width: 80px;
- font-size: 14px;
- }
-
- &.address-item {
- .address-value {
- min-width: 200px;
- }
+ &.address-item {
+ .address-value {
+ min-width: 200px;
}
}
}
}
+}
- @media print {
- .app-container {
- display: none;
- }
-
- .print-page {
- box-shadow: none;
- margin: 0;
- padding: 10mm;
- padding-left: 20mm;
- page-break-inside: avoid;
- page-break-after: always;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
+@media print {
+ .app-container {
+ display: none;
}
- .actions {
- display: flex;
- justify-content: flex-end;
- margin-bottom: 10px;
+ .print-page {
+ box-shadow: none;
+ margin: 0;
+ padding: 10mm;
+ padding-left: 20mm;
+ page-break-inside: avoid;
+ page-break-after: always;
}
+ .print-page:last-child {
+ page-break-after: avoid;
+ }
+}
+
+.actions {
+ display: flex;
+ justify-content: flex-end;
+ margin-bottom: 10px;
+}
</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
index e2f1e45..64793b7 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -473,12 +473,13 @@
}
/** 缁勮瀹℃壒鎻愪氦 DTO */
-export function buildApproveInstanceDto(row, uiResult, comment) {
+export function buildApproveInstanceDto(row, uiResult, comment, extraData = {}) {
const opinion = (comment || "").trim();
return {
id: row?.id,
approveAction: mapApproveActionToApi(uiResult),
approveComment: opinion || (uiResult === "approved" ? "鍚屾剰" : ""),
+ ...extraData,
};
}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index ffa727e..9689be8 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -3,32 +3,44 @@
<div class="approve-detail-panel">
<div class="detail-block">
<div class="detail-block-title">鍩烘湰淇℃伅</div>
- <el-descriptions :column="2"
- border>
- <el-descriptions-item label="涓氬姟鍗曞彿">{{ row.bizId || row.id || "鈥�" }}</el-descriptions-item>
+ <el-descriptions :column="2" border>
+ <el-descriptions-item label="涓氬姟鍗曞彿">{{
+ row.bizId || row.id || "鈥�"
+ }}</el-descriptions-item>
<el-descriptions-item label="瀹℃壒鐘舵��">
- <el-tag :type="approvalStatusTagType(row.approvalStatus)"
- size="small"
- effect="plain">
+ <el-tag
+ :type="approvalStatusTagType(row.approvalStatus)"
+ size="small"
+ effect="plain"
+ >
{{ approvalStatusLabel(row.approvalStatus) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="瀹℃壒绫诲瀷">
- <span class="approve-type-cell"
- :style="approvalTypeStyle(row.approvalType)">
+ <span
+ class="approve-type-cell"
+ :style="approvalTypeStyle(row.approvalType)"
+ >
{{ approvalTypeLabel(row.approvalType) }}
</span>
</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜虹紪鍙�">{{ row.applicantNo || "鈥�" }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜哄悕绉�">{{ row.applicantName || "鈥�" }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鎽樿">{{ row.summary || "鈥�" }}</el-descriptions-item>
- <el-descriptions-item v-if="row.rejectReason"
- label="椹冲洖鍘熷洜"
- :span="2">
+ <el-descriptions-item label="鐢宠浜虹紪鍙�">{{
+ row.applicantNo || "鈥�"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠浜哄悕绉�">{{
+ row.applicantName || "鈥�"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠鎽樿">{{
+ row.summary || "鈥�"
+ }}</el-descriptions-item>
+ <el-descriptions-item
+ v-if="row.rejectReason"
+ label="椹冲洖鍘熷洜"
+ :span="2"
+ >
<span class="reject-text">{{ row.rejectReason }}</span>
</el-descriptions-item>
- <el-descriptions-item label="鍒涘缓鏃堕棿"
- :span="2">
+ <el-descriptions-item label="鍒涘缓鏃堕棿" :span="2">
{{ formatDisplayTime(row.createTime) }}
</el-descriptions-item>
</el-descriptions>
@@ -36,141 +48,226 @@
<div class="detail-block">
<div class="detail-block-title">濉姤鍐呭</div>
<!-- 榛樿琛ㄥ崟灞曠ず -->
- <FormPayloadFields v-if="!isSpecialApprovalType"
- :fields="formResolved.fields"
- :form-payload="formResolved.formPayload"
- readonly />
-
+ <FormPayloadFields
+ v-if="!isSpecialApprovalType"
+ :fields="formResolved.fields"
+ :form-payload="formResolved.formPayload"
+ readonly
+ />
+
<!-- 鍙戣揣瀹℃壒璇︽儏 -->
<template v-else-if="row.businessType === 7">
<div v-if="detailData.shippingInfo" class="shipment-detail">
<el-divider content-position="left">鍙戣揣璇︽儏</el-divider>
<el-descriptions :column="2" border>
- <el-descriptions-item label="閿�鍞鍗�">{{ detailData.shippingInfo.salesContractNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
- <el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
- <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{ detailData.shippingInfo.expressNumber || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="閿�鍞鍗�">{{
+ detailData.shippingInfo.salesContractNo || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍑哄簱鎵瑰彿">{{
+ detailData.shippingInfo.outboundBatches || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
+ detailData.shippingInfo.customerName || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣绫诲瀷">{{
+ detailData.shippingInfo.type || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣鏃ユ湡">{{
+ detailData.shippingInfo.shippingDateDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃牳鐘舵��">{{
+ detailData.shippingInfo.status || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{
+ detailData.shippingInfo.shippingCarNumber || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑叕鍙�">{{
+ detailData.shippingInfo.expressCompany || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{
+ detailData.shippingInfo.expressNumber || "--"
+ }}</el-descriptions-item>
</el-descriptions>
- <div v-if="detailData.shippingProductDetailDtoList.length" style="margin-top: 20px;">
+ <div
+ v-if="detailData.shippingProductDetailDtoList.length"
+ style="margin-top: 20px"
+ >
<h4>浜у搧鏄庣粏</h4>
- <el-table :data="detailData.shippingProductDetailDtoList"
- border
- size="small"
- style="width: 100%">
- <el-table-column label="鎵瑰彿" prop="batchNo" min-width="160" show-overflow-tooltip />
- <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="160" show-overflow-tooltip />
- <el-table-column label="鍙戣揣鏁伴噺" prop="deliveryQuantity" min-width="120" align="center" />
+ <el-table
+ :data="detailData.shippingProductDetailDtoList"
+ border
+ size="small"
+ style="width: 100%"
+ >
+ <el-table-column
+ label="鎵瑰彿"
+ prop="batchNo"
+ min-width="160"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="浜у搧鍚嶇О"
+ prop="productName"
+ min-width="160"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ min-width="160"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="鍙戣揣鏁伴噺"
+ prop="deliveryQuantity"
+ min-width="120"
+ align="center"
+ />
</el-table>
</div>
</div>
</template>
-
+
<!-- 閲囪喘瀹℃壒璇︽儏 -->
<template v-else-if="row.businessType === 5">
<div v-if="detailData" class="procurement-detail">
<el-divider content-position="left">閲囪喘璇︽儏</el-divider>
<el-descriptions :column="2" border>
- <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ detailData.purchaseContractNumber || "--" }}</el-descriptions-item>
- <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ detailData.supplierName || "--" }}</el-descriptions-item>
- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detailData.projectName || "--" }}</el-descriptions-item>
- <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="绛捐鏃ユ湡">{{ detailData.executionDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.entryDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{
+ detailData.purchaseContractNumber || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{
+ detailData.supplierName || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="椤圭洰鍚嶇О">{{
+ detailData.projectName || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="閿�鍞悎鍚屽彿">{{
+ detailData.salesContractNo || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="绛捐鏃ユ湡">{{
+ detailData.executionDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="褰曞叆鏃ユ湡">{{
+ detailData.entryDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="浠樻鏂瑰紡">{{
+ detailData.paymentMethod || "--"
+ }}</el-descriptions-item>
<el-descriptions-item label="鍚堝悓閲戦" :span="2">
- <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+ <span style="font-size: 18px; color: #e6a23c; font-weight: bold">
楼{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
</span>
</el-descriptions-item>
</el-descriptions>
- <div v-if="detailData.productData.length" style="margin-top: 20px;">
+ <div v-if="detailData.productData.length" style="margin-top: 20px">
<h4>浜у搧鏄庣粏</h4>
- <el-table :data="detailData.productData"
- border
- style="width: 100%">
+ <el-table :data="detailData.productData" border style="width: 100%">
<el-table-column prop="productCategory" label="浜у搧鍚嶇О" />
<el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" />
<el-table-column prop="unit" label="鍗曚綅" />
<el-table-column prop="quantity" label="鏁伴噺" />
<el-table-column prop="taxInclusiveUnitPrice" label="鍚◣鍗曚环">
- <template #default="scope">楼{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
+ <template #default="scope"
+ >楼{{
+ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2)
+ }}</template
+ >
</el-table-column>
<el-table-column prop="taxInclusiveTotalPrice" label="鍚◣鎬讳环">
- <template #default="scope">楼{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
+ <template #default="scope"
+ >楼{{
+ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2)
+ }}</template
+ >
</el-table-column>
</el-table>
</div>
</div>
</template>
-
+
<!-- 鎶ヤ环瀹℃壒璇︽儏 -->
<template v-else-if="row.businessType === 6">
<div v-if="detailData" class="quotation-detail">
<el-divider content-position="left">鎶ヤ环璇︽儏</el-divider>
<el-descriptions :column="2" border>
- <el-descriptions-item label="鎶ヤ环鍗曞彿">{{ detailData.quotationNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.customer || "--" }}</el-descriptions-item>
- <el-descriptions-item label="涓氬姟鍛�">{{ detailData.salesperson || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ detailData.quotationDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ detailData.validDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="鎶ヤ环鍗曞彿">{{
+ detailData.quotationNo || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
+ detailData.customer || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="涓氬姟鍛�">{{
+ detailData.salesperson || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{
+ detailData.quotationDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鏈夋晥鏈熻嚦">{{
+ detailData.validDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="浠樻鏂瑰紡">{{
+ detailData.paymentMethod || "--"
+ }}</el-descriptions-item>
<el-descriptions-item label="鎶ヤ环鎬婚" :span="2">
- <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+ <span style="font-size: 18px; color: #e6a23c; font-weight: bold">
楼{{ Number(detailData.totalAmount ?? 0).toFixed(2) }}
</span>
</el-descriptions-item>
</el-descriptions>
- <div v-if="detailData.products?.length" style="margin-top: 20px;">
+ <div v-if="detailData.products?.length" style="margin-top: 20px">
<h4>浜у搧鏄庣粏</h4>
- <el-table :data="detailData.products"
- border
- style="width: 100%">
+ <el-table :data="detailData.products" border style="width: 100%">
<el-table-column prop="product" label="浜у搧鍚嶇О" />
<el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
<el-table-column prop="unit" label="鍗曚綅" />
<el-table-column prop="unitPrice" label="鍗曚环">
- <template #default="scope">楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template>
+ <template #default="scope"
+ >楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template
+ >
</el-table-column>
</el-table>
</div>
- <div v-if="detailData.remark" style="margin-top: 20px;">
+ <div v-if="detailData.remark" style="margin-top: 20px">
<h4>澶囨敞</h4>
<p>{{ detailData.remark }}</p>
</div>
</div>
</template>
</div>
- <div v-if="attachmentList.length"
- class="detail-block">
+ <div v-if="attachmentList.length" class="detail-block">
<div class="detail-block-title">闄勪欢鍒楄〃</div>
<div class="attachment-list">
- <div v-for="file in attachmentList"
- :key="file.id"
- class="attachment-item">
+ <div
+ v-for="file in attachmentList"
+ :key="file.id"
+ class="attachment-item"
+ >
<el-icon class="file-icon">
<Paperclip />
</el-icon>
- <span class="file-name"
- :title="file.name || file.originalFilename">
+ <span class="file-name" :title="file.name || file.originalFilename">
{{ file.name || file.originalFilename }}
</span>
<div class="file-actions">
- <el-link v-if="file.previewURL || file.url"
- type="primary"
- :underline="false"
- @click="openFile(file.previewURL || file.url)">棰勮</el-link>
- <el-divider v-if="(file.previewURL || file.url) && file.downloadURL"
- direction="vertical" />
- <el-link v-if="file.downloadURL"
- type="primary"
- :underline="false"
- @click="openFile(file.downloadURL)">涓嬭浇</el-link>
+ <el-link
+ v-if="file.previewURL || file.url"
+ type="primary"
+ :underline="false"
+ @click="openFile(file.previewURL || file.url)"
+ >棰勮</el-link
+ >
+ <el-divider
+ v-if="(file.previewURL || file.url) && file.downloadURL"
+ direction="vertical"
+ />
+ <el-link
+ v-if="file.downloadURL"
+ type="primary"
+ :underline="false"
+ @click="openFile(file.downloadURL)"
+ >涓嬭浇</el-link
+ >
</div>
</div>
</div>
@@ -179,108 +276,107 @@
</template>
<script setup>
- import { computed } from "vue";
- import { Paperclip } from "@element-plus/icons-vue";
- import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
- import {
- approvalTypeLabel,
- approvalTypeStyle,
- approvalStatusLabel,
- approvalStatusTagType,
- resolveInstanceFormFields,
- } from "../approveListConstants.js";
- import FormPayloadFields from "./FormPayloadFields.vue";
+import { computed } from "vue";
+import { Paperclip } from "@element-plus/icons-vue";
+import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
+import {
+ approvalTypeLabel,
+ approvalTypeStyle,
+ approvalStatusLabel,
+ approvalStatusTagType,
+ resolveInstanceFormFields,
+} from "../approveListConstants.js";
+import FormPayloadFields from "./FormPayloadFields.vue";
- const props = defineProps({
- row: { type: Object, default: () => ({}) },
- detailData: { type: Object, default: () => ({}) },
- });
+const props = defineProps({
+ row: { type: Object, default: () => ({}) },
+ detailData: { type: Object, default: () => ({}) },
+});
- const formResolved = computed(() => resolveInstanceFormFields(props.row));
+const formResolved = computed(() => resolveInstanceFormFields(props.row));
+// 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
+const isSpecialApprovalType = computed(() => {
+ return [5, 7, 6].includes(props.row.businessType);
+});
- // 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
- const isSpecialApprovalType = computed(() => {
- return [5, 7, 6].includes(props.row.businessType);
- });
+// 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
+const detailData = computed(() => {
+ return props.detailData || {};
+});
- // 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
- const detailData = computed(() => {
- return props.detailData || {};
- });
+const attachmentList = computed(() => {
+ const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
+ return Array.isArray(list) ? list : [];
+});
- const attachmentList = computed(() => {
- const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
- return Array.isArray(list) ? list : [];
- });
-
- function openFile(url) {
- if (!url) return;
- window.open(url, "_blank");
- }
+function openFile(url) {
+ if (!url) return;
+ window.open(url, "_blank");
+}
</script>
<style scoped>
- .approve-detail-panel {
- display: flex;
- flex-direction: column;
- gap: 20px;
- }
- .detail-block-title {
- font-size: 14px;
- font-weight: 600;
- color: var(--el-text-color-primary);
- margin: 0 0 12px;
- padding-left: 10px;
- border-left: 3px solid var(--el-color-primary);
- line-height: 1.4;
- }
- .approve-type-cell {
- display: inline-block;
- padding: 2px 10px;
- border-radius: 4px;
- font-size: 13px;
- line-height: 1.5;
- }
- .reject-text {
- color: var(--el-color-danger);
- }
+.approve-detail-panel {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+.detail-block-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--el-text-color-primary);
+ margin: 0 0 12px;
+ padding-left: 10px;
+ border-left: 3px solid var(--el-color-primary);
+ line-height: 1.4;
+}
+.approve-type-cell {
+ display: inline-block;
+ padding: 2px 10px;
+ border-radius: 4px;
+ font-size: 13px;
+ line-height: 1.5;
+}
+.reject-text {
+ color: var(--el-color-danger);
+}
- .attachment-list {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
- gap: 12px;
- }
- .attachment-item {
- display: flex;
- align-items: center;
- padding: 10px 12px;
- background-color: var(--el-fill-color-light);
- border-radius: 6px;
- border: 1px solid var(--el-border-color-lighter);
- transition: all 0.3s;
- }
- .attachment-item:hover {
- border-color: var(--el-color-primary-light-5);
- background-color: var(--el-color-primary-light-9);
- }
- .file-icon {
- font-size: 18px;
- color: var(--el-text-color-secondary);
- margin-right: 10px;
- }
- .file-name {
- flex: 1;
- font-size: 13px;
- color: var(--el-text-color-primary);
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- margin-right: 12px;
- }
- .file-actions {
- display: flex;
- align-items: center;
- flex-shrink: 0;
- }
-</style>
\ No newline at end of file
+.attachment-list {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 12px;
+}
+.attachment-item {
+ display: flex;
+ align-items: center;
+ padding: 10px 12px;
+ background-color: var(--el-fill-color-light);
+ border-radius: 6px;
+ border: 1px solid var(--el-border-color-lighter);
+ transition: all 0.3s;
+}
+.attachment-item:hover {
+ border-color: var(--el-color-primary-light-5);
+ background-color: var(--el-color-primary-light-9);
+}
+.file-icon {
+ font-size: 18px;
+ color: var(--el-text-color-secondary);
+ margin-right: 10px;
+}
+.file-name {
+ flex: 1;
+ font-size: 13px;
+ color: var(--el-text-color-primary);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-right: 12px;
+}
+.file-actions {
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index f61e038..e6ec8a0 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -664,8 +664,13 @@
if (approveSubmitting.value) return { ok: false };
approveSubmitting.value = true;
try {
+ // 鍙戣揣瀹℃壒鏃朵紶閫掑嚭搴撴壒鍙�
+ const extraData = {};
+ if (Number(row.businessType) === 7 && detailData.value?.shippingInfo?.outboundBatches) {
+ extraData.outboundBatches = detailData.value.shippingInfo.outboundBatches;
+ }
await approveApprovalInstance(
- buildApproveInstanceDto(row, result, approveOpinion.value)
+ buildApproveInstanceDto(row, result, approveOpinion.value, extraData)
);
approveDialog.visible = false;
await fetchApprovalList();
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index e7300a4..3f467cd 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -1083,6 +1083,15 @@
/>
</el-form-item>
</el-col>
+ <el-col :span="24" v-if="deliveryForm.type === '璐ц溅'">
+ <el-form-item label="鍑哄簱鎵瑰彿锛�" prop="outboundBatches">
+ <el-input
+ v-model="deliveryForm.outboundBatches"
+ placeholder="璇疯緭鍏ュ嚭搴撴壒鍙�"
+ clearable
+ />
+ </el-form-item>
+ </el-col>
<el-col :span="24" v-else>
<el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
<el-input
@@ -1421,6 +1430,7 @@
expressCompany: "",
expressNumber: "",
type: "璐ц溅", // 璐ц溅, 蹇��
+ outboundBatches: "",
},
deliveryRules: {
shippingCarNumber: [
@@ -2880,6 +2890,7 @@
type: "璐ц溅",
batchNo: [],
batchNoList,
+ outboundBatches: "",
};
deliveryFileList.value = [];
deliveryFormVisible.value = true;
@@ -2923,6 +2934,10 @@
deliveryForm.value.type === "璐ц溅"
? deliveryForm.value.shippingCarNumber
: "",
+ outboundBatches:
+ deliveryForm.value.type === "璐ц溅"
+ ? deliveryForm.value.outboundBatches
+ : "",
expressCompany:
deliveryForm.value.type === "蹇��"
? deliveryForm.value.expressCompany
--
Gitblit v1.9.3