From bfdfceb60b41a541d9d9087323079bc64c144209 Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期四, 29 五月 2025 13:18:18 +0800
Subject: [PATCH] 客户/供应商修改

---
 src/views/salesManagement/salesLedger/index.vue |  191 ++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 152 insertions(+), 39 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index aa10594..78779b7 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -9,7 +9,7 @@
             placeholder="璇疯緭鍏�"
             @change="handleQuery"
             clearable
-            :prefix-icon="Search"
+            prefix-icon="Search"
         />
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
       </div>
@@ -53,7 +53,7 @@
         <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip/>
         <el-table-column label="椤圭洰鍚嶇О" prop="projectName" show-overflow-tooltip/>
         <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" show-overflow-tooltip/>
-        <el-table-column label="褰曞叆浜�" prop="entryPerson" show-overflow-tooltip/>
+        <el-table-column label="褰曞叆浜�" prop="entryPersonName" show-overflow-tooltip/>
         <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" show-overflow-tooltip/>
         <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
           <template #default="scope">
@@ -104,8 +104,8 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
-              <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable>
-                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+              <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled>
+                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -121,6 +121,7 @@
                   type="date"
                   placeholder="璇烽�夋嫨"
                   clearable
+                  disabled
               />
             </el-form-item>
           </el-col>
@@ -157,16 +158,18 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="闄勪欢鏉愭枡路锛�" prop="remark">
+            <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
               <el-upload
-                  :file-list="fileList"
-                  action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
+                  v-model:file-list="fileList"
+                  :action="upload.url"
                   multiple
                   ref="fileUpload"
-                  :headers="proxy.uploadHeader"
+                  auto-upload
+                  :headers="upload.headers"
                   :before-upload="handleBeforeUpload"
                   :on-error="handleUploadError"
                   :on-success="handleUploadSuccess"
+                  :on-remove="handleRemove"
               >
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
@@ -191,17 +194,27 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
-              <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable>
+              <!-- <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable>
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
-              </el-select>
+              </el-select> -->
+              <el-tree-select
+                  v-model="productForm.productCategory"
+                  placeholder="璇烽�夋嫨" clearable
+                  check-strictly
+                  @change="getModels"
+                  :data="productOptions"
+                  :render-after-expand="false"
+                  style="width: 100%"
+              />
+
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="specificationModel">
-              <el-select v-model="productForm.specificationModel" placeholder="璇烽�夋嫨" clearable>
-                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel">
+                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -268,18 +281,21 @@
 </template>
 
 <script setup>
+import { getToken } from "@/utils/auth"
 import pagination from '@/components/PIMTable/Pagination.vue'
 import { ref } from 'vue'
-import {Search} from "@element-plus/icons-vue";
 import {ElMessageBox } from "element-plus";
+import useUserStore from '@/store/modules/user'
 import {userListNoPage} from "@/api/system/user.js";
 import {
   ledgerList,
   productList,
   customerList,
   addOrUpdateSalesLedger,
-  getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct
+  getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile
 } from "@/api/salesManagement/salesLedger.js";
+import {modelList, productTreeList} from "@/api/basicData/product.js";
+const userStore = useUserStore()
 const { proxy } = getCurrentInstance()
 const tableData = ref([])
 const productData = ref([])
@@ -287,6 +303,8 @@
 const productSelectedRows = ref([])
 const userList = ref([])
 const customerOption = ref([])
+const productOptions = ref([])
+const modelOptions = ref([])
 const tableLoading = ref(false)
 const page = reactive({
   current: 1,
@@ -294,7 +312,6 @@
 })
 const total = ref(0)
 const fileList = ref([])
-const uploadList = ref([])
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const operationType = ref('')
@@ -353,6 +370,12 @@
   }
 })
 const { productForm, productRules } = toRefs(productFormData)
+const upload = reactive({
+  // 涓婁紶鐨勫湴鍧�
+  url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
+  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+  headers: { Authorization: "Bearer " + getToken() },
+})
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
@@ -374,11 +397,65 @@
       item.children = []
     })
     total.value = res.total
+  }).catch(() => {
+    tableLoading.value = false
   })
+}
+// 鑾峰彇浜у搧澶х被tree鏁版嵁
+const getProductOptions = () => {
+  productTreeList().then(res => {
+    productOptions.value = convertIdToValue(res)
+  })
+}
+// 鑾峰彇tree瀛愭暟鎹�
+const getModels =(value) => {
+  productForm.value.productCategory = findNodeById(productOptions.value, value)
+  modelList({id: value}).then(res => {
+    modelOptions.value = res
+  })
+}
+const getProductModel =(value) => {
+  const index = modelOptions.value.findIndex(item => item.id === value);
+  if (index !== -1) {
+    productForm.value.specificationModel = modelOptions.value[index].model;
+  } else {
+    productForm.value.specificationModel = null;
+  }
+}
+const findNodeById = (nodes, productId) => {
+  for (let i = 0; i < nodes.length; i++) {
+    if (nodes[i].value === productId) {
+      return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
+    }
+    if (nodes[i].children && nodes[i].children.length > 0) {
+      const foundNode = findNodeById(nodes[i].children, productId);
+      if (foundNode) {
+        return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
+      }
+    }
+  }
+  return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
+};
+function convertIdToValue(data) {
+  return data.map(item => {
+    const { id, children, ...rest } = item;
+    const newItem = {
+      ...rest,
+      value: id // 灏� id 鏀逛负 value
+    };
+    if (children && children.length > 0) {
+      newItem.children = convertIdToValue(children);
+    }
+
+    return newItem;
+  });
 }
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection
+
+  // 杩囨护鎺夊瓙鏁版嵁
+  selectedRows.value = selection.filter(item => item.children !== undefined);
+  console.log('selection',selectedRows.value)
 }
 const productSelected = (selectedRows) => {
   productSelectedRows.value = selectedRows
@@ -389,10 +466,10 @@
   if (expandedRows.length > 0) {
     expandedRowKeys.value = []
     try {
-      productList({salesLedgerId: row.id}).then(res => {
+      productList({salesLedgerId: row.id, type: 1}).then(res => {
       const index = tableData.value.findIndex(item => item.id === row.id);
       if (index > -1) {
-        tableData.value[index].children = res.rows;
+        tableData.value[index].children = res;
       }
       expandedRowKeys.value.push(row.id)
     })
@@ -450,33 +527,42 @@
   return sums;
 }
 // 鎵撳紑寮规
-const openForm = (type, row) => {
+const openForm = async (type, row) => {
   operationType.value = type
   form.value = {}
   productData.value = []
-  userListNoPage().then(res => {
-    userList.value = res.data
-  })
+  let userLists = await userListNoPage()
+  userList.value = userLists.data
   customerList().then(res => {
     customerOption.value = res
   })
+  form.value.entryPerson = userStore.id
   if (type === 'edit') {
     currentId.value = row.id;
-    getSalesLedgerWithProducts({id: row.id}).then(res => {
+    getSalesLedgerWithProducts({id: row.id, type: 1}).then(res => {
       form.value = {...res}
       productData.value = form.value.productData
+      fileList.value = form.value.salesLedgerFiles
     })
   }
+  let userAll = await userStore.getInfo()
+  userList.value.forEach(element => {
+    if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
+      form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
+    }
+  });
+  form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
   dialogFormVisible.value = true
+}
+function changs(val){
+  console.log(val);
 }
 // 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload(file) {
   // 鏍℃鏂囦欢澶у皬
-  if (props.fileSize) {
-    if (file.size > 1024 * 1024) {
-      proxy.$modal.msgError('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!')
-      return false
-    }
+  if (file.size > 1024 * 1024 * 10) {
+    proxy.$modal.msgError('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!')
+    return false
   }
   proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...")
   return true
@@ -487,15 +573,24 @@
   proxy.$modal.closeLoading()
 }
 // 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file) {
+function handleUploadSuccess(res, file, uploadFiles) {
+  proxy.$modal.closeLoading()
   if (res.code === 200) {
-    uploadList.value.push({ name: res.fileName, url: res.fileName })
-    fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value)
-    uploadList.value = []
+    file.tempId = res.data.tempId
+    proxy.$modal.msgSuccess("涓婁紶鎴愬姛")
   } else {
-    proxy.$modal.closeLoading()
     proxy.$modal.msgError(res.msg)
     proxy.$refs.fileUpload.handleRemove(file)
+  }
+}
+// 绉婚櫎鏂囦欢
+function handleRemove (file) {
+  if (operationType.value === 'edit') {
+    let ids = []
+    ids.push(file.id)
+    delLedgerFile(ids).then(res => {
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+    })
   }
 }
 // 鎻愪氦琛ㄥ崟
@@ -508,6 +603,12 @@
         proxy.$modal.msgWarning('璇锋坊鍔犱骇鍝佷俊鎭�')
         return
       }
+      let tempFileIds = []
+      if (fileList.value.length > 0) {
+        tempFileIds = fileList.value.map(item => item.tempId)
+      }
+      form.value.tempFileIds = tempFileIds
+      form.value.type = 1
       addOrUpdateSalesLedger(form.value).then(res => {
         proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
         closeDia()
@@ -530,6 +631,7 @@
     productForm.value = {...row}
   }
   productFormVisible.value = true
+  getProductOptions()
 }
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitProduct = () => {
@@ -549,7 +651,7 @@
   addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
     proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
     closeProductDia()
-    getSalesLedgerWithProducts({id: currentId.value}).then(res => {
+    getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => {
       productData.value = res.productData
     })
   })
@@ -583,14 +685,14 @@
       delProduct(ids).then(res => {
         proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
         closeProductDia()
-        getSalesLedgerWithProducts({id: currentId.value}).then(res => {
+        getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => {
           productData.value = res.productData
         })
       })
     }).catch(() => {
       proxy.$modal.msg("宸插彇娑�")
     })
-    
+
   }
 }
 // 鍏抽棴浜у搧寮规
@@ -632,15 +734,26 @@
   ).then(() => {
     delLedger(ids).then(res => {
       proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+      getList()
     })
-    getList()
   }).catch(() => {
     proxy.$modal.msg("宸插彇娑�")
   })
+}
+// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
+function getCurrentDate() {
+  const today = new Date();
+  const year = today.getFullYear();
+  const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
+  const day = String(today.getDate()).padStart(2, '0');
+  return `${year}-${month}-${day}`;
+}
+const mathNum = (val) => {
+  productForm.value.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(val, productForm.value.taxRate)
 }
 getList()
 </script>
 
 <style scoped lang="scss">
 
-</style>
\ No newline at end of file
+</style>

--
Gitblit v1.9.3