From b604dd5258ad5cbc37c6630f3416c548341fbf48 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 10 六月 2026 11:41:25 +0800
Subject: [PATCH] feat(salesLedger): 添加订单状态管理和标记完成功能
---
src/api/salesManagement/salesLedger.js | 18 +++
src/views/salesManagement/salesLedger/index.vue | 281 +++++++++++++++++++++++++++++++++++++++++++------------
2 files changed, 236 insertions(+), 63 deletions(-)
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
index dc4cdfd..c57e319 100644
--- a/src/api/salesManagement/salesLedger.js
+++ b/src/api/salesManagement/salesLedger.js
@@ -228,4 +228,22 @@
method: "post",
data,
})
+}
+
+// 鏍囪璁㈠崟瀹屾垚
+export function markOrderCompleted(data) {
+ return request({
+ url: "/sales/ledger/markOrderCompleted",
+ method: "post",
+ data,
+ })
+}
+
+// 閫掑鎵撳嵃娆℃暟
+export function incrementPrintCount(data) {
+ return request({
+ url: "/sales/ledger/incrementPrintCount",
+ method: "post",
+ data,
+ })
}
\ No newline at end of file
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 5ff00cc..9762553 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -87,6 +87,17 @@
:value="2" />
</el-select>
</el-form-item>
+ <el-form-item label="璁㈠崟鐘舵�侊細">
+ <el-select v-model="searchForm.orderStatus"
+ placeholder="璇烽�夋嫨"
+ clearable
+ style="width: 140px">
+ <el-option label="杩涜涓�"
+ :value="0" />
+ <el-option label="宸插畬鎴�"
+ :value="1" />
+ </el-select>
+ </el-form-item>
<el-form-item>
<el-button type="primary"
@click="handleQuery"> 鎼滅储 </el-button>
@@ -110,6 +121,9 @@
<el-button type="primary"
@click="handleReverseAudit"
:disabled="isBatchButtonDisabled('reverseAudit')">鍙嶅</el-button>
+ <el-button type="warning"
+ @click="handleMarkCompleted"
+ :disabled="isBatchButtonDisabled('markCompleted')">鏍囪瀹屾垚</el-button>
<el-button type="primary"
@click="handleSalesStock"
:disabled="isBatchButtonDisabled('stock')">鍏ュ簱</el-button>
@@ -421,6 +435,30 @@
type="info">-</el-tag>
</template>
</el-table-column>
+ <el-table-column label="璁㈠崟鐘舵��"
+ width="120"
+ align="center">
+ <template #default="scope">
+ <el-tag v-if="Number(scope.row.orderStatus) === 1"
+ type="success">宸插畬鎴�</el-tag>
+ <el-tag v-else
+ type="info">杩涜涓�</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏍囩鎵撳嵃"
+ width="90"
+ align="center">
+ <template #default="scope">
+ <span>{{ scope.row.labelPrintCount ?? 0 }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍗曟嵁鎵撳嵃"
+ width="90"
+ align="center">
+ <template #default="scope">
+ <span>{{ scope.row.documentPrintCount ?? 0 }}</span>
+ </template>
+ </el-table-column>
<el-table-column label="褰曞叆浜�"
prop="entryPersonName"
width="100"
@@ -453,17 +491,18 @@
<el-button link
type="primary"
@click="openForm('edit', scope.row)"
- :disabled="Number(scope.row.reviewStatus) === 1">缂栬緫</el-button>
+ :disabled="Number(scope.row.orderStatus) === 1">缂栬緫</el-button>
<el-button link
type="primary"
@click="openProcessFlowSelect(scope.row)"
- :disabled="Number(scope.row.reviewStatus) !== 1">宸ヨ壓璺嚎</el-button>
+ :disabled="Number(scope.row.reviewStatus) !== 1 || Number(scope.row.orderStatus) === 1">宸ヨ壓璺嚎</el-button>
<el-button link
type="primary"
@click="downLoadFile(scope.row)">闄勪欢</el-button>
<el-button link
type="primary"
- @click="openLedgerQrDialog(scope.row)">浜岀淮鐮�</el-button>
+ @click="openLedgerQrDialog(scope.row)"
+ :disabled="Number(scope.row.orderStatus) === 1">浜岀淮鐮�</el-button>
</template>
</el-table-column>
</el-table>
@@ -475,9 +514,9 @@
@pagination="paginationChange" />
</div>
<FormDialog v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
+ :title="isCompletedOrder ? '鏌ョ湅閿�鍞彴璐﹂〉闈紙宸插畬鎴愶級' : operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
:width="'70%'"
- :operation-type="operationType"
+ :operation-type="isCompletedOrder ? 'detail' : operationType"
@close="closeDia"
@confirm="submitForm"
@cancel="closeDia">
@@ -515,7 +554,7 @@
<el-select v-model="form.salesman"
placeholder="璇烽�夋嫨"
clearable
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1">
+ :disabled="operationType === 'view' || isReviewedEdit">
<el-option v-for="item in userList"
:key="item.nickName"
:label="item.nickName"
@@ -532,7 +571,7 @@
filterable
placeholder="璇烽�夋嫨"
clearable
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1">
+ :disabled="operationType === 'view' || isReviewedEdit">
<el-option v-for="item in customerOption"
:key="item.id"
:label="item.customerName"
@@ -548,7 +587,7 @@
<el-input v-model="form.projectName"
placeholder="璇疯緭鍏�"
clearable
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" />
+ :disabled="operationType === 'view' || isReviewedEdit" />
</el-form-item>
</el-col>
</el-row>
@@ -563,7 +602,7 @@
type="date"
placeholder="璇烽�夋嫨"
clearable
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" />
+ :disabled="operationType === 'view' || isReviewedEdit" />
</el-form-item>
</el-col>
<el-col :span="12">
@@ -576,7 +615,7 @@
type="date"
placeholder="璇烽�夋嫨"
clearable
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" />
+ :disabled="operationType === 'view' || isReviewedEdit" />
</el-form-item>
</el-col>
</el-row>
@@ -591,7 +630,7 @@
placeholder="璇烽�夋嫨"
clearable
@change="changs"
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1">
+ :disabled="operationType === 'view' || isReviewedEdit">
<el-option v-for="item in userList"
:key="item.userId"
:label="item.nickName"
@@ -609,7 +648,7 @@
type="date"
placeholder="璇烽�夋嫨"
clearable
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" />
+ :disabled="operationType === 'view' || isReviewedEdit" />
</el-form-item>
</el-col>
</el-row>
@@ -618,14 +657,14 @@
prop="entryDate">
<el-button v-if="operationType !== 'view'"
type="primary"
- :disabled="hasEditingProductRow() || Number(form.reviewStatus) === 1"
+ :disabled="hasEditingProductRow() || isReviewedEdit"
@click="addProductInline">
娣诲姞
</el-button>
<el-button v-if="operationType !== 'view'"
plain
type="danger"
- :disabled="Number(form.reviewStatus) === 1"
+ :disabled="isReviewedEdit"
@click="deleteProduct">鍒犻櫎</el-button>
</el-form-item>
</el-row>
@@ -658,7 +697,7 @@
style="width: 100%"
:filter-node-method="filterProductCategoryNode"
@change="(val) => handleInlineProductCategoryChange(scope.row, val)"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.productCategory ?? "" }}</span>
</template>
</el-table-column>
@@ -673,7 +712,7 @@
filterable
style="width: 100%"
@change="(val) => handleInlineProductModelChange(scope.row, val)"
- :disabled="Number(form.reviewStatus) === 1">
+ :disabled="isReviewedEdit">
<el-option v-for="item in modelOptions"
:key="item.id"
:label="item.model"
@@ -695,7 +734,7 @@
style="width: 100%"
placeholder="璇疯緭鍏�"
clearable
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.thickness ?? "" }}</span>
</template>
</el-table-column>
@@ -709,7 +748,7 @@
placeholder="璇疯緭鍏�"
clearable
style="width: 100%"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.floorCode ?? "" }}</span>
</template>
</el-table-column>
@@ -745,7 +784,7 @@
clearable
@change="() => handleInlineSizeChange(scope.row)"
@input="() => handleInlineSizeChange(scope.row)"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.width ?? "" }}</span>
</template>
</el-table-column>
@@ -764,7 +803,7 @@
clearable
@change="() => handleInlineSizeChange(scope.row)"
@input="() => handleInlineSizeChange(scope.row)"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.height ?? "" }}</span>
</template>
</el-table-column>
@@ -783,7 +822,7 @@
clearable
@change="() => handleInlineQuantityChange(scope.row)"
@input="() => handleInlineQuantityChange(scope.row)"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.quantity ?? "" }}</span>
</template>
</el-table-column>
@@ -801,7 +840,7 @@
placeholder="璇疯緭鍏�"
clearable
@change="() => handleInlineSettleAreaChange(scope.row)"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.settlePieceArea ? Number(scope.row.settlePieceArea).toFixed(4) : "" }}</span>
</template>
</el-table-column>
@@ -817,7 +856,7 @@
:precision="4"
style="width: 100%"
placeholder="鑷姩璁$畻"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.actualTotalArea ? Number(scope.row.actualTotalArea).toFixed(4) : "" }}</span>
</template>
</el-table-column>
@@ -831,7 +870,7 @@
clearable
style="width: 100%"
@change="() => handleInlineTaxRateChange(scope.row)"
- :disabled="Number(form.reviewStatus) === 1">
+ :disabled="isReviewedEdit">
<el-option label="1"
value="1" />
<el-option label="3"
@@ -864,7 +903,7 @@
placeholder="璇疯緭鍏�"
clearable
style="width: 100%"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.processRequirement ?? "" }}</span>
</template>
</el-table-column>
@@ -877,7 +916,7 @@
placeholder="璇烽�夋嫨"
clearable
style="width: 100%"
- :disabled="Number(form.reviewStatus) === 1">
+ :disabled="isReviewedEdit">
<el-option label="澧炴櫘绁�"
value="澧炴櫘绁�" />
<el-option label="澧炰笓绁�"
@@ -896,7 +935,7 @@
placeholder="璇疯緭鍏�"
clearable
style="width: 100%"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.remark ?? "" }}</span>
</template>
</el-table-column>
@@ -909,7 +948,7 @@
placeholder="璇疯緭鍏�"
clearable
style="width: 100%"
- :disabled="Number(form.reviewStatus) === 1" />
+ :disabled="isReviewedEdit" />
<span v-else>{{ scope.row.heavyBox ?? "" }}</span>
</template>
</el-table-column>
@@ -1010,20 +1049,32 @@
</el-popover>
</template>
<template v-else>
- <el-button link
+ <!-- 宸插鏍告ā寮忥細鍙兘淇敼鍗曚环 -->
+ <el-button v-if="isReviewedEdit"
+ link
type="primary"
size="small"
:disabled="isProductShipped(scope.row)"
- @click="editProductInline(scope.row, scope.$index)">
- 缂栬緫
+ @click="editPriceOnly(scope.row)">
+ 淇敼鍗曚环
</el-button>
- <el-button link
- type="primary"
- size="small"
- :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1"
- @click="copyProductInline(scope.row, scope.$index)">
- 澶嶅埗鏂板缓
- </el-button>
+ <!-- 鏈鏍告ā寮忥細瀹屾暣缂栬緫 -->
+ <template v-if="!isReviewedEdit">
+ <el-button link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="editProductInline(scope.row, scope.$index)">
+ 缂栬緫
+ </el-button>
+ <el-button link
+ type="primary"
+ size="small"
+ :disabled="isProductShipped(scope.row)"
+ @click="copyProductInline(scope.row, scope.$index)">
+ 澶嶅埗鏂板缓
+ </el-button>
+ </template>
<el-popover :width="560"
trigger="click"
:hide-after="0"
@@ -1045,7 +1096,7 @@
<el-button type="primary"
plain
size="small"
- :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
@click="startAddOtherAmountForRow(scope.row)">
鏂板
</el-button>
@@ -1058,7 +1109,7 @@
clearable
placeholder="璇烽�夋嫨棰濆鍔犲伐椤圭洰"
style="width: 100%;"
- :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1">
+ :disabled="isProductShipped(scope.row) || isReviewedEdit">
<el-option v-for="item in otherAmountSelectOptions"
:key="item.id"
:label="item.processName"
@@ -1066,13 +1117,13 @@
</el-select>
<div style="display:flex; justify-content:flex-end; gap: 8px;">
<el-button size="small"
- :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
@click="scope.row.__inlineOtherAmountAdding = false; scope.row.__inlineOtherAmountAddId = null">
鍙栨秷
</el-button>
<el-button type="primary"
size="small"
- :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1 || scope.row.__inlineOtherAmountAddId === null || scope.row.__inlineOtherAmountAddId === undefined || scope.row.__inlineOtherAmountAddId === ''"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit || scope.row.__inlineOtherAmountAddId === null || scope.row.__inlineOtherAmountAddId === undefined || scope.row.__inlineOtherAmountAddId === ''"
@click="confirmAddOtherAmountForRow(scope.row)">
纭娣诲姞
</el-button>
@@ -1093,12 +1144,12 @@
:precision="0"
style="width: 120px;"
placeholder="鏁伴噺"
- :disabled="operationType === 'view' || isProductShipped(scope.row) || Number(form.reviewStatus) === 1"
+ :disabled="operationType === 'view' || isProductShipped(scope.row) || isReviewedEdit"
@change="handleOtherAmountQuantityChange(scope.row)" />
<el-button type="danger"
link
size="small"
- :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1"
+ :disabled="isProductShipped(scope.row) || isReviewedEdit"
@click="removeOtherAmountAtForRow(scope.row, idx)">
鍒犻櫎
</el-button>
@@ -1122,7 +1173,7 @@
clearable
type="textarea"
:rows="2"
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" />
+ :disabled="operationType === 'view' || isReviewedEdit" />
</el-form-item>
</el-col>
</el-row>
@@ -1135,7 +1186,7 @@
clearable
type="textarea"
:rows="2"
- :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" />
+ :disabled="operationType === 'view' || isReviewedEdit" />
</el-form-item>
</el-col>
</el-row>
@@ -1154,9 +1205,9 @@
:on-success="handleUploadSuccess"
:on-remove="handleRemove">
<el-button type="primary"
- v-if="operationType !== 'view'">涓婁紶</el-button>
+ v-if="operationType !== 'view' || isCompletedOrder">涓婁紶</el-button>
<template #tip
- v-if="operationType !== 'view'">
+ v-if="operationType !== 'view' || isCompletedOrder">
<div class="el-upload__tip">
鏂囦欢鏍煎紡鏀寔
doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
@@ -1841,28 +1892,40 @@
</el-dialog>
<!-- 鍙嶅鏍稿脊绐� -->
<el-dialog v-model="reverseAuditDialogVisible"
- title="鍙嶅鏍�"
- width="450px"
- :close-on-click-modal="false">
- <el-form label-width="100px">
+ title="鍙嶅鏍哥‘璁�"
+ width="500px"
+ :close-on-click-modal="false"
+ class="reverse-audit-dialog">
+ <el-form label-width="110px"
+ label-position="left">
<el-form-item label="鍙嶅鏍哥被鍨�">
<el-radio-group v-model="reverseAuditForm.counterReviewType">
- <el-radio :label="1">浣滃簾</el-radio>
- <el-radio :label="2">閲嶆柊鐢熸垚</el-radio>
+ <el-radio :label="1">
+ <span>浣滃簾璁㈠崟</span>
+ <span style="color: #909399; font-size: 12px; margin-left: 4px;">锛堜笉鐢熸垚鏂拌鍗曪級</span>
+ </el-radio>
+ <el-radio :label="2">
+ <span>閲嶆柊鐢熸垚</span>
+ <span style="color: #909399; font-size: 12px; margin-left: 4px;">锛堣烦杞埌鏂板椤甸潰缂栬緫锛�</span>
+ </el-radio>
</el-radio-group>
</el-form-item>
- <el-form-item label="鍙嶅鏍告弿杩�">
+ <el-form-item label="鍙嶅鏍稿師鍥�">
<el-input v-model="reverseAuditForm.counterReviewDesc"
type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ弽瀹℃牳鎻忚堪" />
+ :rows="4"
+ placeholder="璇疯緭鍏ュ弽瀹℃牳鍘熷洜" />
</el-form-item>
</el-form>
+ <div class="reverse-audit-warning">
+ <el-icon style="color: #E6A23C; margin-right: 4px;"><WarningFilled /></el-icon>
+ 娉ㄦ剰锛氬弽瀹℃牳灏嗚嚜鍔ㄤ綔搴熻璁㈠崟瀵瑰簲鐨勬墍鏈夊叆搴撱�佸嚭搴撱�佸彂璐у崟鎹�
+ </div>
<template #footer>
<el-button @click="reverseAuditDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary"
+ <el-button type="danger"
@click="confirmReverseAudit"
- :disabled="!reverseAuditForm.counterReviewType || !reverseAuditForm.counterReviewDesc">纭畾</el-button>
+ :disabled="!reverseAuditForm.counterReviewType || !reverseAuditForm.counterReviewDesc.trim()">纭鍙嶅鏍�</el-button>
</template>
</el-dialog>
</div>
@@ -1874,7 +1937,7 @@
import { onMounted, ref, reactive, getCurrentInstance, watch, nextTick } from "vue";
import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
import { ElMessageBox, ElMessage } from "element-plus";
- import { ArrowDown } from "@element-plus/icons-vue";
+ import { ArrowDown, WarningFilled } from "@element-plus/icons-vue";
import useUserStore from "@/store/modules/user";
import { approveUserList } from "@/api/collaborativeApproval/approvalProcess.js";
import { userListNoPage } from "@/api/system/user.js";
@@ -1904,6 +1967,8 @@
getSalesLabel,
salesStock,
counterReview,
+ markOrderCompleted,
+ incrementPrintCount,
} from "@/api/salesManagement/salesLedger.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import useFormData from "@/hooks/useFormData.js";
@@ -2073,6 +2138,10 @@
// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
const operationType = ref("");
const dialogFormVisible = ref(false);
+ // 宸插畬鎴愯鍗曟爣璁帮細view 妯″紡浣嗛檮浠朵笂浼犱粛鍙敤
+ const isCompletedOrder = ref(false);
+ // 宸插鏍歌鍗曠紪杈戞ā寮忥細鍙兘淇敼鍗曚环锛屽叾浠栧瓧娈电鐢�
+ const isReviewedEdit = ref(false);
const data = reactive({
searchForm: {
customerName: "", // 瀹㈡埛鍚嶇О
@@ -2086,6 +2155,7 @@
deliveryStatus: undefined, // 鍙戣揣鐘舵�侊細1鏈彂璐� 2瀹℃壒涓� 3瀹℃壒涓嶉�氳繃 4瀹℃壒閫氳繃 5宸插彂璐� 6閮ㄥ垎鍙戣揣
stockStatus: undefined, // 鍏ュ簱鐘舵�侊細0鏈叆搴� 1閮ㄥ垎鍏ュ簱 2宸插叆搴�
reviewStatus: undefined, // 瀹℃牳鐘舵�侊細0寰呭鏍� 1宸插鏍� 2宸插弽瀹�
+ orderStatus: undefined, // 璁㈠崟鐘舵�侊細0杩涜涓� 1宸插畬鎴�
},
form: {
salesContractNo: "",
@@ -2339,6 +2409,15 @@
productData.value.push(copied);
editingProductRow.value = copied;
productForm.value = copied;
+ };
+
+ /** 宸插鏍歌鍗曪細浠呬慨鏀瑰惈绋庡崟浠� */
+ const editPriceOnly = (row) => {
+ if (operationType.value === "view") return;
+ if (!row) return;
+ stopOtherEditingRows();
+ row.__editing = true;
+ row.__priceOnly = true; // 鏍囪鍙慨鏀瑰崟浠�
};
const editProductInline = async (row, index) => {
@@ -3020,13 +3099,17 @@
handleQuery();
};
- /** 鎵归噺鎸夐挳绂佺敤鍒ゆ柇锛氭牴鎹�変腑琛岀殑瀹℃牳鐘舵�佹帶鍒舵寜閽彲鐢ㄦ��
+ /** 鎵归噺鎸夐挳绂佺敤鍒ゆ柇锛氭牴鎹�変腑琛岀殑瀹℃牳鐘舵�佸拰璁㈠崟鐘舵�佹帶鍒舵寜閽彲鐢ㄦ��
* 鏈鏍�(0)锛氬彧鑳藉鏍搞�佸垹闄ゃ�佺紪杈�
* 宸插鏍�(1)锛氬彲浠ュ弽瀹°�佸叆搴撱�佸彂璐с�佸鍑恒�佹墦鍗般�佸伐鑹鸿矾绾�
+ * 宸插畬鎴�(orderStatus=1)锛氭墍鏈夋搷浣滄寜閽鐢�
* 鏈�変腑浠讳綍琛屾椂鎵�鏈夋壒閲忔寜閽鐢�
*/
const isBatchButtonDisabled = (action) => {
if (selectedRows.value.length === 0) return true;
+ const hasCompleted = selectedRows.value.some(r => Number(r.orderStatus) === 1);
+ // 宸插畬鎴愯鍗曪細鎵�鏈夋搷浣滄寜閽鐢�
+ if (hasCompleted && action !== 'markCompleted') return true;
const statuses = selectedRows.value.map(r => Number(r.reviewStatus));
const allUnreviewed = statuses.every(s => s === 0);
const allReviewed = statuses.every(s => s === 1);
@@ -3045,6 +3128,9 @@
return !allUnreviewed;
case 'print':
return !allReviewed;
+ case 'markCompleted':
+ // 鍙湁宸插鏍镐笖鏈畬鎴愮殑璁㈠崟鎵嶈兘鏍囪瀹屾垚
+ return !allReviewed || hasCompleted;
default:
return false;
}
@@ -3134,7 +3220,7 @@
return;
}
if (!reverseAuditForm.counterReviewDesc.trim()) {
- proxy.$modal.msgWarning("璇疯緭鍏ュ弽瀹℃牳鎻忚堪");
+ proxy.$modal.msgWarning("璇疯緭鍏ュ弽瀹℃牳鍘熷洜");
return;
}
try {
@@ -3160,6 +3246,34 @@
getList();
} catch (error) {
console.log(error);
+ }
+ };
+
+ /** 鏍囪瀹屾垚鎿嶄綔 */
+ const handleMarkCompleted = async () => {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇烽�夋嫨瑕佹爣璁板畬鎴愮殑鏁版嵁");
+ return;
+ }
+ const cannotComplete = selectedRows.value.filter(
+ row => Number(row.reviewStatus) !== 1 || Number(row.orderStatus) === 1
+ );
+ if (cannotComplete.length > 0) {
+ proxy.$modal.msgWarning("閫変腑鐨勬暟鎹腑鍖呭惈闈炲凡瀹℃牳鎴栧凡瀹屾垚鐨勯」锛岃閲嶆柊閫夋嫨");
+ return;
+ }
+ try {
+ await ElMessageBox.confirm(
+ "鏍囪瀹屾垚鍚庤鍗曞皢鍙樹负鍙锛屽彧鑳芥煡鐪嬪拰涓婁紶涓嬭浇闄勪欢锛屼笉鍙挙閿�銆傛槸鍚︾‘璁わ紵",
+ "鎻愮ず",
+ { confirmButtonText: "纭畾", cancelButtonText: "鍙栨秷", type: "warning" }
+ );
+ const ids = selectedRows.value.map(row => row.id);
+ await markOrderCompleted({ ids });
+ proxy.$modal.msgSuccess("鏍囪瀹屾垚鎴愬姛");
+ getList();
+ } catch {
+ // 鐢ㄦ埛鍙栨秷
}
};
@@ -3667,10 +3781,16 @@
};
// 鎵撳紑寮规
const openForm = async (type, row) => {
- operationType.value = type;
+ // 宸插畬鎴愯鍗曞己鍒朵负鍙妯″紡锛屼絾闄勪欢涓婁紶浠嶅彲鐢�
+ const isCompleted = Number(row?.orderStatus) === 1;
+ const effectiveType = isCompleted ? 'view' : type;
+ operationType.value = effectiveType;
+ isCompletedOrder.value = isCompleted;
form.value = {};
productData.value = [];
selectedQuotation.value = null;
+ // 宸插鏍歌鍗曠紪杈戞椂锛屾爣璁板彧鑳戒慨鏀瑰崟浠凤紙宸插畬鎴愯鍗曞凡寮哄埗view锛屾澶勪笉浼氬啀鍛戒腑锛�
+ isReviewedEdit.value = effectiveType === "edit" && Number(row?.reviewStatus) === 1;
let userLists = await userListNoPage();
userList.value = userLists.data;
customerList().then(res => {
@@ -3923,6 +4043,8 @@
const closeDia = () => {
proxy.resetForm("formRef");
dialogFormVisible.value = false;
+ isCompletedOrder.value = false;
+ isReviewedEdit.value = false;
};
const productIndex = ref(0);
@@ -4355,6 +4477,10 @@
const res = await getSalesInvoices(selectedIds);
const salesInvoiceData = res?.data ?? {};
await printSalesDeliveryNote(salesInvoiceData, selectedRow, selectedIds);
+ // 鎵撳嵃鎴愬姛鍚庨�掑鍗曟嵁鎵撳嵃娆℃暟
+ selectedIds.forEach(id => {
+ incrementPrintCount({ id, printType: 'document' }).catch(() => {});
+ });
} catch (error) {
console.error("鎵撳嵃閿�鍞彂璐у崟澶辫触:", error);
proxy.$modal.msgError("鎵撳嵃澶辫触锛岃绋嶅悗閲嶈瘯");
@@ -4380,6 +4506,8 @@
const res = await getSalesOrder(selectedId);
const salesOrderData = res?.data ?? {};
printSalesOrder(salesOrderData);
+ // 鎵撳嵃鎴愬姛鍚庨�掑鍗曟嵁鎵撳嵃娆℃暟
+ incrementPrintCount({ id: selectedId, printType: 'document' }).catch(() => {});
} else {
const res = await getProcessCard(selectedId);
const processCardData = res?.data ?? {};
@@ -4410,8 +4538,12 @@
return;
}
await printFinishedProcessCard(processCardData);
+ // 鎵撳嵃鎴愬姛鍚庨�掑鍗曟嵁鎵撳嵃娆℃暟
+ incrementPrintCount({ id: selectedId, printType: 'document' }).catch(() => {});
} else {
await printFinishedProcessCard(processCardData);
+ // 鎵撳嵃鎴愬姛鍚庨�掑鍗曟嵁鎵撳嵃娆℃暟
+ incrementPrintCount({ id: selectedId, printType: 'document' }).catch(() => {});
}
}
} catch (error) {
@@ -4455,6 +4587,8 @@
return;
}
printSalesLabel(labelList);
+ // 鎵撳嵃鎴愬姛鍚庨�掑鏍囩鎵撳嵃娆℃暟
+ incrementPrintCount({ id: selectedId, printType: 'label' }).catch(() => {});
} catch (error) {
console.error("鎵撳嵃鏍囩澶辫触:", error);
proxy.$modal.msgError("鎵撳嵃鏍囩澶辫触锛岃绋嶅悗閲嶈瘯");
@@ -5276,4 +5410,25 @@
flex: 0 0 100%;
}
}
+
+ .reverse-audit-warning {
+ display: flex;
+ align-items: flex-start;
+ padding: 10px 12px;
+ margin-top: 8px;
+ background-color: #fdf6ec;
+ border: 1px solid #faecd8;
+ border-radius: 4px;
+ color: #e6a23c;
+ font-size: 13px;
+ line-height: 1.6;
+ }
+
+ .reverse-audit-dialog .el-radio {
+ display: flex;
+ align-items: center;
+ height: 36px;
+ margin-right: 0;
+ margin-bottom: 8px;
+ }
</style>
--
Gitblit v1.9.3