From 11d7990309ddace2fa600cbeae58e3ab5ac368f9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 20 九月 2026 19:25:45 +0800
Subject: [PATCH] 新疆-融邦 1. 委外管理:新增合作商档案、委外订单、往来台账三个页面及接口;合作商附件弹框支持直接上传/删除并即时保存。 2. 信托基金与代储台账:客户档案加「信托基金 / 代储金额」并对超限标红提示;销售台账拆「卖油 / 代储」页签,代储走油库+储罐+合同金额,卖油保留产品明细;台账列表加审批状态与超限红字;审批中心显示销售合同号并能下钻台账明细。 3. 储罐号带入库存:储罐信息表单加「是否启用 / 用途 / 租客信息」联动与校验;库存管理、批号明细、入库/出库表单与列表补齐储罐号、油品、物流、过磅等字段展示。 4. 出库即发货与往来备件:出库台账区分「发货单 / 油品出库」两类来源并分别处理详情;新增备件出入库流水页面。 5. 车辆管理与残油联动:新增车辆管理页面;油品出入库表单物流信息顺序调整,车牌/车挂牌号联动只读。 6. 油品出库联动发货台账:发货台账加「发货单号 / 销售合同号」筛选,修复油品出库行批号列取错字段。 7. 采购申请模块:新增采购申请页面及接口。 8. 付款流水组件:抽出公共「付款流水」弹框组件,采购付款分栏、收付款台账与委外往来台账复用。 9. 列调整:收付款台账删除「付款金额 / 退货金额」;委外往来台账删除「回款金额」,并去掉金额列右对齐。
---
src/views/basicData/customerFile/index.vue | 233 ++++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 177 insertions(+), 56 deletions(-)
diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
index 79b1616..562720d 100644
--- a/src/views/basicData/customerFile/index.vue
+++ b/src/views/basicData/customerFile/index.vue
@@ -1,6 +1,6 @@
<template>
<div class="app-container">
- <div class="search_form">
+ <div class="search_form" style="margin-bottom: 20px;">
<div>
<span class="search_title">瀹㈡埛鍚嶇О锛�</span>
<el-input v-model="searchForm.customerName"
@@ -15,10 +15,10 @@
style="width: 240px"
clearable
@change="handleQuery">
- <el-option label="闆跺敭瀹㈡埛"
- value="闆跺敭瀹㈡埛" />
- <el-option label="杩涢攢鍟嗗鎴�"
- value="杩涢攢鍟嗗鎴�" />
+ <el-option v-for="dict in customer_type"
+ :key="dict.value"
+ :label="dict.label"
+ :value="dict.value" />
</el-select>
<el-button type="primary"
@click="handleQuery"
@@ -27,6 +27,9 @@
<div>
<el-button type="primary"
@click="openForm('add')">鏂板瀹㈡埛</el-button>
+ <el-button type="primary"
+ plain
+ @click="back">娴佸叆鍏捣</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
<el-button type="info"
plain
@@ -45,7 +48,16 @@
:isSelection="true"
@selection-change="handleSelectionChange"
:tableLoading="tableLoading"
- @pagination="pagination"></PIMTable>
+ @pagination="pagination">
+ <template #depositAmountSlot="{ row }">
+ <el-tooltip v-if="row.exceedsTrustFund"
+ :content="`浠e偍閲戦鍚堣宸茶秴鍑鸿瀹㈡埛淇℃墭鍩洪噾锛堜俊鎵樺熀閲戯細${row.trustFund}锛塦"
+ placement="top">
+ <el-text type="danger">{{ formatAmount(row.depositTotalAmount) }}</el-text>
+ </el-tooltip>
+ <span v-else>{{ formatAmount(row.depositTotalAmount) }}</span>
+ </template>
+ </PIMTable>
</div>
<el-dialog v-model="dialogFormVisible"
:title="operationType === 'add' ? '鏂板瀹㈡埛淇℃伅' : '缂栬緫瀹㈡埛淇℃伅'"
@@ -125,11 +137,24 @@
<el-select v-model="form.customerType"
placeholder="璇烽�夋嫨"
clearable>
- <el-option label="闆跺敭瀹㈡埛"
- value="闆跺敭瀹㈡埛" />
- <el-option label="杩涢攢鍟嗗鎴�"
- value="杩涢攢鍟嗗鎴�" />
+ <el-option v-for="dict in customer_type"
+ :key="dict.value"
+ :label="dict.label"
+ :value="dict.value" />
</el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="淇℃墭鍩洪噾(鍏�)锛�"
+ prop="trustFund">
+ <el-input-number v-model="form.trustFund"
+ :min="0"
+ :precision="2"
+ :controls="false"
+ placeholder="璇疯緭鍏ワ紝鍙负绌�"
+ style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
@@ -211,7 +236,8 @@
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
+ :action="upload.url"
+ :data="upload.data"
:disabled="upload.isUploading"
:before-upload="upload.beforeUpload"
:on-progress="upload.onProgress"
@@ -457,6 +483,32 @@
</div>
</el-col>
</el-row>
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <div class="info-item">
+ <span class="info-label">淇℃墭鍩洪噾(鍏�)锛�</span>
+ <span class="info-value">{{ formatAmount(detailForm.trustFund) }}</span>
+ </div>
+ </el-col>
+ <el-col :span="12">
+ <div class="info-item">
+ <span class="info-label">浠e偍閲戦(鍏�)锛�</span>
+ <span class="info-value"
+ :class="{ 'text-danger': detailForm.exceedsTrustFund }">
+ {{ formatAmount(detailForm.depositTotalAmount) }}
+ </span>
+ </div>
+ </el-col>
+ </el-row>
+ <el-row v-if="detailForm.exceedsTrustFund"
+ :gutter="20">
+ <el-col :span="24">
+ <el-alert type="warning"
+ show-icon
+ :closable="false"
+ :title="`璇ュ鎴蜂唬鍌ㄩ噾棰濆悎璁� ${formatAmount(detailForm.depositTotalAmount)} 鍏冿紝宸茶秴鍑轰俊鎵樺熀閲� ${formatAmount(detailForm.trustFund)} 鍏僠" />
+ </el-col>
+ </el-row>
</div>
</div>
<!-- 娲借皥杩涘害璁板綍 -->
@@ -612,23 +664,20 @@
import { onMounted, ref, reactive, getCurrentInstance, toRefs } from "vue";
import { Search, Paperclip, Upload } from "@element-plus/icons-vue";
import {
- addCustomer,
- delCustomer,
- getCustomer,
- listCustomer,
- updateCustomer,
addCustomerFollow,
updateCustomerFollow,
delCustomerFollow,
addReturnVisit,
getReturnVisit,
} from "@/api/basicData/customerFile.js";
+ import {listCustomer, getCustomer, addCustomer, updateCustomer, delCustomer, backCustomer} from "@/api/basicData/customer.js";
import { ElMessageBox } from "element-plus";
import { userListNoPage } from "@/api/system/user.js";
import useUserStore from "@/store/modules/user";
import { getToken } from "@/utils/auth.js";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
+ const { customer_type } = proxy.useDict("customer_type");
// 鍥炶鎻愰啋鐩稿叧
const reminderDialogVisible = ref(false);
@@ -654,7 +703,7 @@
const negotiationFormRef = ref();
const negotiationForm = reactive({
customerName: "",
- customerId: "",
+ customerId: "",
followUpMethod: "",
followUpLevel: "",
followUpTime: "",
@@ -674,6 +723,11 @@
content: [{ required: true, message: "璇疯緭鍏ュ唴瀹�", trigger: "blur" }],
};
+ const formatAmount = value => {
+ return value === null || value === undefined || value === ""
+ ? "-"
+ : Number(value).toFixed(2);
+ };
// 璇︽儏鐩稿叧
const detailDialogVisible = ref(false);
const detailForm = reactive({
@@ -689,6 +743,9 @@
contactPhone: "",
maintainer: "",
maintenanceTime: "",
+ trustFund: "",
+ depositTotalAmount: "",
+ exceedsTrustFund: false,
});
const negotiationRecords = ref([]);
@@ -713,6 +770,7 @@
label: "瀹㈡埛鍒嗙被",
prop: "customerType",
width: 120,
+ formatData: value => proxy.selectDictLabel(customer_type.value, value),
},
{
label: "瀹㈡埛鍚嶇О",
@@ -726,7 +784,7 @@
},
{
label: "鍦板潃鍙婅仈绯绘柟寮�",
- prop: "addressPhone",
+ prop: "companyAddress",
width: 250,
},
{
@@ -759,6 +817,22 @@
width: 220,
},
{
+ label: "淇℃墭鍩洪噾(鍏�)",
+ prop: "trustFund",
+ width: 140,
+ formatData: value =>
+ value === null || value === undefined || value === ""
+ ? "-"
+ : Number(value).toFixed(2),
+ },
+ {
+ label: "浠e偍閲戦(鍏�)",
+ prop: "depositTotalAmount",
+ dataType: "slot",
+ slot: "depositAmountSlot",
+ width: 150,
+ },
+ {
label: "寮�鎴疯鍙�",
prop: "bankCode",
width: 220,
@@ -766,6 +840,24 @@
{
label: "缁存姢浜�",
prop: "maintainer",
+ },
+ {
+ label: "瀹㈡埛鏉ユ簮",
+ prop: "type",
+ dataType: "tag",
+ width: 100,
+ formatData: value => {
+ if (value === 1 || value === "1") {
+ return "鍏捣";
+ }
+ return "绉佹捣";
+ },
+ formatType: value => {
+ if (value === 1 || value === "1") {
+ return "warning";
+ }
+ return "success";
+ },
},
{
label: "缁存姢鏃堕棿",
@@ -782,7 +874,12 @@
{
name: "缂栬緫",
type: "text",
+ showHide: row => !isCustomerEditLocked(row),
clickFun: row => {
+ if (isCustomerEditLocked(row)) {
+ proxy.$modal.msgWarning("宸茶閿�鍞ā鍧楀紩鐢ㄧ殑绉佹捣瀹㈡埛涓嶈兘缂栬緫");
+ return;
+ }
openForm("edit", row);
},
},
@@ -837,6 +934,7 @@
searchForm: {
customerName: "",
customerType: "",
+ type: 0
},
form: {
customerName: "",
@@ -851,6 +949,9 @@
bankAccount: "",
bankCode: "",
customerType: "",
+ // 閲戦瀛楁缁� null 鑰岄潪 ""锛岄伩鍏� el-input-number 鎶婄┖涓叉姌绠楁垚 0
+ trustFund: null,
+ type: 0
},
rules: {
customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
@@ -882,6 +983,9 @@
headers: { Authorization: "Bearer " + getToken() },
// 涓婁紶鐨勫湴鍧�
url: import.meta.env.VITE_APP_BASE_API + "/basic/customer/importData",
+ data: {
+ type: 0
+ },
// 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
beforeUpload: file => {
console.log("鏂囦欢鍗冲皢涓婁紶", file);
@@ -954,8 +1058,8 @@
tableLoading.value = true;
listCustomer({ ...searchForm.value, ...page }).then(res => {
tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
+ tableData.value = res.data.records;
+ page.total = res.data.total;
});
};
// 琛ㄦ牸閫夋嫨鏁版嵁
@@ -978,6 +1082,10 @@
}
// 鎵撳紑寮规
const openForm = (type, row) => {
+ if (type === "edit" && isCustomerEditLocked(row)) {
+ proxy.$modal.msgWarning("宸茶閿�鍞ā鍧楀紩鐢ㄧ殑绉佹捣瀹㈡埛涓嶈兘缂栬緫");
+ return;
+ }
operationType.value = type;
form.value = {};
form.value.maintainer = userStore.nickName;
@@ -987,6 +1095,7 @@
contactPhone: "",
},
];
+ form.value.type = 0;
form.value.maintenanceTime = getCurrentDate();
userListNoPage().then(res => {
userList.value = res.data;
@@ -1005,6 +1114,12 @@
});
}
dialogFormVisible.value = true;
+ };
+ const isCustomerEditLocked = row => {
+ const salesReferenced = Number(row?.salesReferenceFlag || 0) === 1;
+ const customerType = Number(row?.type);
+ const usageStatus = Number(row?.usageStatus || 0);
+ return salesReferenced && (customerType === 0 || (customerType === 1 && usageStatus === 1));
};
// 鎻愪氦琛ㄥ崟
const submitForm = () => {
@@ -1062,7 +1177,7 @@
type: "warning",
})
.then(() => {
- proxy.download("/basic/customer/export", {}, "瀹㈡埛妗f.xlsx");
+ proxy.download("/basic/customer/export", {type: 0}, "瀹㈡埛妗f.xlsx");
})
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
@@ -1072,12 +1187,11 @@
const handleDelete = () => {
let ids = [];
if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
const unauthorizedData = selectedRows.value.filter(
- item => item.maintainer !== userStore.nickName
+ item => item.type === 1 || item.type === "1"
);
if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
+ proxy.$modal.msgWarning("鍏捣鍒嗛厤鐨勫鎴蜂笉鑳藉垹闄�");
return;
}
ids = selectedRows.value.map(item => item.id);
@@ -1093,7 +1207,7 @@
.then(() => {
tableLoading.value = true;
delCustomer(ids)
- .then(res => {
+ .then(() => {
proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
getList();
})
@@ -1103,6 +1217,36 @@
})
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
+ });
+ };
+
+ const back = () => {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ const ids = selectedRows.value.map(item => item.id);
+ ElMessageBox.confirm("閫変腑鐨勫鎴峰皢娴佸叆鍏捣锛屾槸鍚︾‘璁わ紵", "娴佸叆鍏捣鎻愮ず", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ tableLoading.value = true;
+ return Promise.all(ids.map(id => backCustomer(id)))
+ .then(() => {
+ proxy.$modal.msgSuccess("娴佸叆鍏捣鎴愬姛");
+ selectedRows.value = [];
+ getList();
+ })
+ .finally(() => {
+ tableLoading.value = false;
+ });
+ })
+ .catch(error => {
+ if (error === "cancel" || error === "close") {
+ proxy.$modal.msg("宸插彇娑�");
+ }
});
};
@@ -1146,7 +1290,7 @@
if (reminderForm.id) {
submitvalue.value = {
id: reminderForm.id,
- customerId: currentCustomerId.value,
+ customerId: currentCustomerId.value,
isEnabled: reminderForm.reminderSwitch ? 1 : 0,
content: reminderForm.reminderContent,
reminderTime: reminderForm.reminderTime,
@@ -1161,8 +1305,6 @@
remindUserId: userStore.id,
};
}
-
- console.log("鎻愪氦鍥炶鎻愰啋鏁版嵁:", submitvalue.value);
// 璋冪敤鎺ュ彛
addReturnVisit(submitvalue.value)
@@ -1191,14 +1333,6 @@
negotiationForm.followUpTime = "";
negotiationForm.followerUserName = userStore.nickName; // 榛樿褰撳墠鐧诲綍浜�
negotiationForm.content = "";
- // {
- // "customerId": 152,
- // "followUpMethod": "鐢佃瘽娌熼��",
- // "followUpLevel": "娌℃湁鎰忓悜",
- // "followUpTime": "2026-03-04T15:30:00",
- // "followerUserName": "绠$悊鍛樿处鍙�",
- // "content": "111"
- // }
negotiationDialogVisible.value = true;
};
@@ -1220,23 +1354,6 @@
if (isEdit) {
// 淇敼鎿嶄綔
- console.log("淇敼娲借皥杩涘害鏁版嵁:", negotiationForm);
- // 杩欓噷鍙互璋冪敤鏇存柊鎺ュ彛
- // 瀹為檯椤圭洰涓渶瑕佹牴鎹悗绔帴鍙h繘琛岃皟鏁�
- // 绀轰緥锛歶pdateCustomerFollow(negotiationForm).then(res => {
- // // 鏇存柊鏈湴鏁版嵁
- // const index = negotiationForm.editIndex;
- // negotiationRecords.value[index] = {
- // followUpTime: negotiationForm.followUpTime,
- // followUpMethod: negotiationForm.followUpMethod,
- // followUpLevel: negotiationForm.followUpLevel,
- // followerUserName: negotiationForm.followerUserName,
- // content: negotiationForm.content,
- // id: negotiationForm.id,
- // };
- // proxy.$modal.msgSuccess("淇敼鎴愬姛");
- // closeNegotiationDialog();
- // });
updateCustomerFollow(negotiationForm).then(res => {
// 鏇存柊鏈湴鏁版嵁
getCustomer(negotiationForm.customerId).then(res => {
@@ -1271,7 +1388,6 @@
// 鎵撳紑璇︽儏寮圭獥
const openDetailDialog = row => {
- // 璋冪敤getCustomer鎺ュ彛鑾峰彇瀹㈡埛璇︽儏
getCustomer(row.id).then(res => {
// 濉厖瀹㈡埛鍩烘湰淇℃伅
Object.assign(detailForm, res.data);
@@ -1293,7 +1409,7 @@
// 灏嗗綋鍓嶈褰曟暟鎹~鍏呭埌琛ㄥ崟
Object.assign(negotiationForm, {
customerName: row.customerName,
- customerId: row.customerId,
+ customerId: row.customerId,
followUpMethod: row.followUpMethod,
followUpLevel: row.followUpLevel,
followUpTime: row.followUpTime,
@@ -1421,7 +1537,7 @@
const downloadAttachment = row => {
if (row.url) {
// proxy.download(row.url, {}, row.name);
- proxy.$download.name(row.url);
+ proxy.$download.byUrl(row.url, row.originalFilename);
} else {
proxy.$modal.msgError("涓嬭浇閾炬帴涓嶅瓨鍦�");
}
@@ -1534,6 +1650,11 @@
word-break: break-word;
}
+ .text-danger {
+ color: var(--el-color-danger);
+ font-weight: 600;
+ }
+
.no-records {
text-align: center;
padding: 30px;
--
Gitblit v1.9.3