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 |  149 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 139 insertions(+), 10 deletions(-)

diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
index 97ea3e6..562720d 100644
--- a/src/views/basicData/customerFile/index.vue
+++ b/src/views/basicData/customerFile/index.vue
@@ -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>
@@ -458,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>
       <!-- 娲借皥杩涘害璁板綍 -->
@@ -619,13 +670,14 @@
     addReturnVisit,
     getReturnVisit,
   } from "@/api/basicData/customerFile.js";
-  import {listCustomer, getCustomer, addCustomer, updateCustomer, delCustomer} from "@/api/basicData/customer.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);
@@ -671,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({
@@ -686,6 +743,9 @@
     contactPhone: "",
     maintainer: "",
     maintenanceTime: "",
+    trustFund: "",
+    depositTotalAmount: "",
+    exceedsTrustFund: false,
   });
   const negotiationRecords = ref([]);
 
@@ -710,6 +770,7 @@
       label: "瀹㈡埛鍒嗙被",
       prop: "customerType",
       width: 120,
+      formatData: value => proxy.selectDictLabel(customer_type.value, value),
     },
     {
       label: "瀹㈡埛鍚嶇О",
@@ -756,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,
@@ -797,7 +874,12 @@
         {
           name: "缂栬緫",
           type: "text",
+          showHide: row => !isCustomerEditLocked(row),
           clickFun: row => {
+            if (isCustomerEditLocked(row)) {
+              proxy.$modal.msgWarning("宸茶閿�鍞ā鍧楀紩鐢ㄧ殑绉佹捣瀹㈡埛涓嶈兘缂栬緫");
+              return;
+            }
             openForm("edit", row);
           },
         },
@@ -867,6 +949,8 @@
       bankAccount: "",
       bankCode: "",
       customerType: "",
+      // 閲戦瀛楁缁� null 鑰岄潪 ""锛岄伩鍏� el-input-number 鎶婄┖涓叉姌绠楁垚 0
+      trustFund: null,
       type: 0
     },
     rules: {
@@ -998,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;
@@ -1026,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 = () => {
@@ -1123,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("宸插彇娑�");
+        }
       });
   };
 
@@ -1526,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