diff --git a/backend/src/api/crmPayback.js b/backend/src/api/crmPayback.js index 140d31f..1ced323 100644 --- a/backend/src/api/crmPayback.js +++ b/backend/src/api/crmPayback.js @@ -66,3 +66,8 @@ export function createPaybackRecord(data) { export function deletePaybackRecord(id) { return request({ url: `/backend/crm/payback/record/${id}`, method: "delete" }); } + +/** 更新回款记录回执(补传流水回执):仅更新回执,不改金额与状态 */ +export function updatePaybackRecord(id, data) { + return request({ url: `/backend/crm/payback/record/${id}`, method: "put", data }); +} diff --git a/backend/src/api/crmUnit.js b/backend/src/api/crmUnit.js new file mode 100644 index 0000000..b8e9684 --- /dev/null +++ b/backend/src/api/crmUnit.js @@ -0,0 +1,36 @@ +import request from "@/utils/request"; + +/** + * CRM 基本设置 - 计量单位接口。 + * 单位用于产品管理等业务(产品「单位」下拉取自本表)。 + */ + +export function getUnitList(params) { + return request({ url: "/backend/crm/unit/list", method: "get", params }); +} + +/** 下拉数据源:仅返回启用中的单位 */ +export function getAllUnits(params) { + return request({ url: "/backend/crm/unit/all", method: "get", params }); +} + +export function getUnitDetail(id) { + return request({ url: `/backend/crm/unit/${id}`, method: "get" }); +} + +export function createUnit(data) { + return request({ url: "/backend/crm/unit", method: "post", data }); +} + +export function updateUnit(id, data) { + return request({ url: `/backend/crm/unit/${id}`, method: "put", data }); +} + +export function deleteUnit(id) { + return request({ url: `/backend/crm/unit/${id}`, method: "delete" }); +} + +/** 补齐缺失的系统默认单位(套 / 台 / 个 …) */ +export function initDefaultUnits() { + return request({ url: "/backend/crm/unit/init-default", method: "post" }); +} diff --git a/backend/src/router/index.js b/backend/src/router/index.js index f3d3a8a..b41817f 100644 --- a/backend/src/router/index.js +++ b/backend/src/router/index.js @@ -82,6 +82,25 @@ const staticMainChildren = [ path: "/apps/crm/product/cate.vue", redirect: "/apps/crm/product/cate" }, + // CRM 基本设置(单位设置等基础数据维护入口) + { + path: "/apps/crm/setting", + name: "CrmSetting", + component: () => import("@/views/apps/crm/setting/index.vue"), + meta: { requiresAuth: true, title: "基本设置", modulePath: "/apps/crm" } + }, + // CRM 单位设置(产品等业务的「单位」下拉取自该表) + { + path: "/apps/crm/setting/unit", + name: "CrmSettingUnit", + component: () => import("@/views/apps/crm/setting/unit/index.vue"), + meta: { requiresAuth: true, title: "单位设置", modulePath: "/apps/crm" } + }, + // 兼容带 .vue 后缀的菜单路径 + { + path: "/apps/crm/setting/unit.vue", + redirect: "/apps/crm/setting/unit" + }, { path: "/user/userProfile", name: "userProfile", diff --git a/backend/src/views/apps/crm/contract/components/detail_payback.vue b/backend/src/views/apps/crm/contract/components/detail_payback.vue index e21c001..eed8488 100644 --- a/backend/src/views/apps/crm/contract/components/detail_payback.vue +++ b/backend/src/views/apps/crm/contract/components/detail_payback.vue @@ -90,8 +90,17 @@ - + + + + + + +
+ + 上传流水回执 + +
+ + + {{ receiptForm.receipt_name || "流水回执" }} + + 移除 +
+
+
+
+ +
@@ -203,6 +241,7 @@ import { getPaybackList, getPaybackRecordList, createPaybackRecord, + updatePaybackRecord, deletePaybackRecord, } from "@/api/crmPayback"; import { uploadFile } from "@/api/file"; @@ -404,6 +443,65 @@ function clearReceipt() { receiveForm.receipt_name = ""; } +/* ---------------------------- 补传回款回执(事后补凭证) ---------------------------- */ +const receiptVisible = ref(false); +const receiptUploading = ref(false); +const receiptForm = reactive({ id: null, receipt_url: "", receipt_name: "" }); + +/** 打开补回执:仅针对未上传回执的回款记录 */ +function openReceipt(row) { + receiptForm.id = row.id; + receiptForm.receipt_url = ""; + receiptForm.receipt_name = ""; + receiptVisible.value = true; +} + +async function handleReceiptFileUpload(options) { + const file = options.file; + receiptUploading.value = true; + try { + const fd = new FormData(); + fd.append("file", file); + const res = await uploadFile(fd); + const data = res?.data || {}; + receiptForm.receipt_url = data.url || ""; + receiptForm.receipt_name = data.name || file.name; + ElMessage.success("上传成功"); + } catch (e) { + ElMessage.error(e.message || "上传失败"); + } finally { + receiptUploading.value = false; + } +} + +function clearReceiptForm() { + receiptForm.receipt_url = ""; + receiptForm.receipt_name = ""; +} + +async function submitReceipt() { + if (!receiptForm.id) return; + if (!receiptForm.receipt_url) { + ElMessage.warning("请先上传回执文件"); + return; + } + receiptUploading.value = true; + try { + await updatePaybackRecord(receiptForm.id, { + receipt_url: receiptForm.receipt_url, + receipt_name: receiptForm.receipt_name, + }); + ElMessage.success("回执已补传"); + receiptVisible.value = false; + await fetchRecords(); + emit("saved"); + } catch (e) { + ElMessage.error(e.message || "补传失败"); + } finally { + receiptUploading.value = false; + } +} + async function submitReceive() { if (!receiveForm.payback_id) { ElMessage.warning("请选择回款计划"); diff --git a/backend/src/views/apps/crm/payback/index.vue b/backend/src/views/apps/crm/payback/index.vue index 76b9608..a74f867 100644 --- a/backend/src/views/apps/crm/payback/index.vue +++ b/backend/src/views/apps/crm/payback/index.vue @@ -3,7 +3,7 @@