From 171c410b8bb74195e394c4065578acaeeca55173 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 12 六月 2026 11:17:48 +0800
Subject: [PATCH] 生成工资表限制输入
---
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js | 209 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 194 insertions(+), 15 deletions(-)
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 27706b9..9442a5a 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -10,10 +10,19 @@
saveApprovalInstance,
updateApprovalInstance,
} from "@/api/officeProcessAutomation/approvalInstance.js";
+import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
+import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
+import { getDeliveryDetailByShippingNo } from "@/api/salesManagement/deliveryLedger.js";
import useUserStore from "@/store/modules/user";
import { Search } from "@element-plus/icons-vue";
import { ElMessage, ElMessageBox } from "element-plus";
-import { computed, reactive, ref } from "vue";
+import { computed, getCurrentInstance, reactive, ref } from "vue";
+import {
+ inferReimburseModuleKeyFromInstance,
+ loadReimburseDetailForInstance,
+ navigateToReimburseManageForEdit,
+ resolveFinReimbursementIdFromInstance,
+} from "../../ReimburseManage/shared/reimburseApproveBridge.js";
import {
fetchBusinessTypeOptions,
formatDisplayTime,
@@ -26,6 +35,7 @@
validateTemplateBinding,
} from "../approve-shared/approvalTemplateBindingUtils.js";
import {
+ APPROVAL_STATUS_SEARCH_OPTIONS,
APPROVAL_TYPE_OPTIONS,
approvalStatusLabel,
approvalStatusTagType,
@@ -34,7 +44,6 @@
buildApproveInstanceDto,
buildEditFormFromInstanceRow,
buildInstanceDto,
- clearLegacyApproveListStorage,
createEmptySubmitForm,
mapInstanceFromApi,
mapSubmitTemplateCard,
@@ -43,10 +52,11 @@
} from "./approveListConstants.js";
export function useApproveList() {
- clearLegacyApproveListStorage();
+ const { proxy } = getCurrentInstance() || {};
const userStore = useUserStore();
const tableData = ref([]);
+ const searchBusinessTypeOptions = ref([]);
const submitBusinessTypeOptions = ref([]);
const allSubmitTemplates = ref([]);
const selectedBusinessType = ref("");
@@ -60,8 +70,8 @@
});
const searchForm = reactive({
- approvalType: "",
- applicantKeyword: "",
+ businessType: "",
+ status: "",
createTimeRange: [],
});
@@ -70,10 +80,21 @@
const detailDialog = reactive({ visible: false });
const detailRow = ref({});
+ const detailData = ref({});
const approveDialog = reactive({ visible: false, row: null });
const approveOpinion = ref("");
const approveSubmitting = ref(false);
+
+ /** 宸梾/璐圭敤鎶ラ攢涓撶敤璇︽儏銆佸鎵瑰脊绐� */
+ const reimburseDialog = reactive({
+ visible: false,
+ mode: "detail",
+ moduleKey: "",
+ loading: false,
+ reimburseRow: {},
+ instanceRow: null,
+ });
const submitDialog = reactive({ visible: false, step: 1, mode: "add" });
const submitEditRow = ref(null);
@@ -118,9 +139,9 @@
}));
const tableColumn = ref([
- { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
- { label: "鐢宠浜哄悕绉�", prop: "applicantName", minWidth: 100 },
- { label: "涓氬姟绫诲瀷", prop: "businessName", minWidth: 120 },
+ // { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
+ { label: "鍙戣捣浜�", prop: "applicantName", minWidth: 100 },
+ { label: "妯℃澘绫诲瀷", prop: "businessName", minWidth: 120 },
{
label: "瀹℃壒绫诲瀷",
prop: "approvalType",
@@ -133,7 +154,9 @@
prop: "unread",
width: 90,
align: "center",
+ dataType: "tag",
formatData: (v) => (v ? "鏄�" : "鍚�"),
+ formatType: (v) => (v ? "success" : "danger"),
},
{
label: "瀹℃壒鐘舵��",
@@ -203,7 +226,7 @@
fetchBusinessTypeOptions(),
listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
]);
- submitBusinessTypeOptions.value = typeOptions;
+ submitBusinessTypeOptions.value = typeOptions.filter((x) => ![5, 6, 7].includes(x.value));
allSubmitTemplates.value = unwrapTemplateList(customRes)
.filter((row) => mapEnabledFromApi(row.enabled))
.map(mapSubmitTemplateCard);
@@ -222,10 +245,18 @@
}
function resetSearch() {
- searchForm.approvalType = "";
- searchForm.applicantKeyword = "";
+ searchForm.businessType = "";
+ searchForm.status = "";
searchForm.createTimeRange = [];
handleQuery();
+ }
+
+ async function loadSearchBusinessTypeOptions() {
+ try {
+ searchBusinessTypeOptions.value = await fetchBusinessTypeOptions();
+ } catch {
+ searchBusinessTypeOptions.value = [];
+ }
}
function pagination({ page: p, limit }) {
@@ -234,15 +265,119 @@
fetchApprovalList();
}
- function openDetail(row) {
+ async function openReimburseDetail(row, mode) {
+ const moduleKey = inferReimburseModuleKeyFromInstance(row);
+ if (!moduleKey) return false;
+ reimburseDialog.mode = mode;
+ reimburseDialog.moduleKey = moduleKey;
+ reimburseDialog.instanceRow = row;
+ reimburseDialog.visible = true;
+ reimburseDialog.loading = true;
+ reimburseDialog.reimburseRow = {};
+ try {
+ const { reimburseRow, moduleKey: resolvedMk } =
+ await loadReimburseDetailForInstance(row, moduleKey);
+ reimburseDialog.moduleKey = resolvedMk || moduleKey;
+ reimburseDialog.reimburseRow = reimburseRow;
+ return true;
+ } catch {
+ ElMessage.error("鍔犺浇鎶ラ攢璇︽儏澶辫触");
+ reimburseDialog.visible = false;
+ return false;
+ } finally {
+ reimburseDialog.loading = false;
+ }
+ }
+
+ async function openDetail(row) {
+ if (isReimburseApprovalInstance(row)) {
+ await openReimburseDetail(row, "detail");
+ return;
+ }
+
detailRow.value = { ...row };
+ // 鎶ヤ环瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鎶ヤ环鍗曞彿"鍘绘煡鎶ヤ环鍒楄〃
+ if (row.businessType === 6) {
+ const quotationNo = row?.quotationNo;
+ if (quotationNo) {
+ const res = await getQuotationList({ quotationNo });
+ const records = res?.data?.records || [];
+ detailData.value = records[0] || {};
+ }
+ }
+
+ // 閲囪喘瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"閲囪喘鍚堝悓鍙�"鍘绘煡閲囪喘璇︽儏
+ else if (row.businessType === 5) {
+ const purchaseContractNumber = row?.purchaseContractNumber;
+ if (purchaseContractNumber) {
+ const res = await getPurchaseByCode({ purchaseContractNumber });
+ detailData.value = res || {};
+ }
+ }
+
+ // 鍙戣揣瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鍙戣揣鍗曞彿"鍘绘煡鍙戣揣璇︽儏
+ else if (row.businessType === 7) {
+ const shippingNo = row?.shippingNo;
+ if (shippingNo) {
+ const res = await getDeliveryDetailByShippingNo({ shippingNo });
+ detailData.value = res?.data || res || {};
+ }
+ }
+
+ // 鍏朵粬瀹℃壒绫诲瀷
+ else {
+ detailData.value = {};
+ }
+
detailDialog.visible = true;
}
- function openApprove(row) {
+ async function openApprove(row) {
+
+ if (inferReimburseModuleKeyFromInstance(row)) {
+ approveOpinion.value = "";
+ await openReimburseDetail(row, "approve");
+ return;
+ }
approveDialog.row = { ...row };
approveOpinion.value = "";
+ // 鎶ヤ环瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鎶ヤ环鍗曞彿"鍘绘煡鎶ヤ环鍒楄〃
+ if (row.businessType === 6) {
+ const quotationNo = row?.quotationNo;
+ if (quotationNo) {
+ const res = await getQuotationList({ quotationNo });
+ const records = res?.data?.records || [];
+ detailData.value = records[0] || {};
+ }
+ }
+
+ // 閲囪喘瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"閲囪喘鍚堝悓鍙�"鍘绘煡閲囪喘璇︽儏
+ else if (row.businessType === 5) {
+ const purchaseContractNumber = row?.purchaseContractNumber;
+ if (purchaseContractNumber) {
+ const res = await getPurchaseByCode({ purchaseContractNumber });
+ detailData.value = res || {};
+ }
+ }
+
+ // 鍙戣揣瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鍙戣揣鍗曞彿"鍘绘煡鍙戣揣璇︽儏
+ else if (row.businessType === 7) {
+ const shippingNo = row?.shippingNo;
+ if (shippingNo) {
+ const res = await getDeliveryDetailByShippingNo({ shippingNo });
+ detailData.value = res?.data || res || {};
+ }
+ }
+
+ // 鍏朵粬瀹℃壒绫诲瀷
+ else {
+ detailData.value = {};
+ }
approveDialog.visible = true;
+ }
+
+ function isReimburseApprovalInstance(row) {
+ return Boolean(inferReimburseModuleKeyFromInstance(row));
}
function resetSubmitDialogState() {
@@ -259,9 +394,23 @@
loadSubmitTemplates();
}
- function openEditDialog(row) {
+ async function openEditDialog(row) {
if (row?.approvalStatus !== "pending") {
ElMessage.warning("浠呭鏍镐腑鐨勫鎵瑰彲淇敼");
+ return;
+ }
+ const moduleKey = inferReimburseModuleKeyFromInstance(row);
+ if (moduleKey) {
+ const rid = resolveFinReimbursementIdFromInstance(row);
+ if (rid == null) {
+ ElMessage.warning("鏃犳硶淇敼锛氱己灏戞姤閿�鍗� ID");
+ return;
+ }
+ try {
+ await navigateToReimburseManageForEdit(proxy?.$router, moduleKey, rid);
+ } catch {
+ ElMessage.warning("鏈壘鍒板樊鏃�/璐圭敤鎶ラ攢鑿滃崟璺敱锛岃浠庡乏渚ц彍鍗曡繘鍏ュ悗鍐嶇紪杈�");
+ }
return;
}
if (!row?.id) {
@@ -436,6 +585,29 @@
}
}
+ async function submitReimburseApprove(result) {
+ const row = reimburseDialog.instanceRow;
+ if (!row?.id) return { ok: false };
+ if (result === "rejected" && !(approveOpinion.value || "").trim()) {
+ return { needOpinion: true };
+ }
+ if (approveSubmitting.value) return { ok: false };
+ approveSubmitting.value = true;
+ try {
+ await approveApprovalInstance(
+ buildApproveInstanceDto(row, result, approveOpinion.value)
+ );
+ reimburseDialog.visible = false;
+ await fetchApprovalList();
+ return { ok: true, result };
+ } catch {
+ ElMessage.error("瀹℃壒鎿嶄綔澶辫触");
+ return { ok: false };
+ } finally {
+ approveSubmitting.value = false;
+ }
+ }
+
async function submitApprove(result) {
const row = approveDialog.row;
if (!row?.id) return { ok: false };
@@ -473,6 +645,9 @@
return {
Search,
APPROVAL_TYPE_OPTIONS,
+ APPROVAL_STATUS_SEARCH_OPTIONS,
+ searchBusinessTypeOptions,
+ loadSearchBusinessTypeOptions,
approvalTypeLabel,
approvalStatusLabel,
approvalStatusTagType,
@@ -484,9 +659,13 @@
tableColumn,
detailDialog,
detailRow,
+ detailData,
+ reimburseDialog,
approveDialog,
approveOpinion,
approveSubmitting,
+ submitReimburseApprove,
+ isReimburseApprovalInstance,
submitDialog,
isSubmitEdit,
submitDialogTitle,
@@ -520,4 +699,4 @@
openApprove,
fetchApprovalList,
};
-}
+}
\ No newline at end of file
--
Gitblit v1.9.3