From 78dc79e8222f2f76ca7b9d93866e1dcb64f6dd63 Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期一, 26 五月 2025 16:34:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/views/index.vue                                         |   99 ++++++++++++++++++-
 src/views/procurementManagement/procurementLedger/index.vue |    7 +
 src/views/system/user/index.vue                             |   20 ++--
 src/api/viewIndex.js                                        |   13 ++
 src/views/procurementManagement/paymentEntry/index.vue      |    2 
 src/views/salesManagement/salesLedger/index.vue             |  106 +++++++++++++++++++--
 src/views/procurementManagement/paymentLedger/index.vue     |    1 
 7 files changed, 216 insertions(+), 32 deletions(-)

diff --git a/src/api/viewIndex.js b/src/api/viewIndex.js
index 8ac39e4..23bddd8 100644
--- a/src/api/viewIndex.js
+++ b/src/api/viewIndex.js
@@ -25,21 +25,28 @@
 // 瀹㈡埛鍚堝悓閲戦TOP5缁熻
 export const getTopFiveList = () => {
     return request({
-        url: 'sales/ledger/getTopFiveList',
+        url: '/sales/ledger/getTopFiveList',
         method: 'get'
     })
 }
 // 鍥炴楗肩姸鍥�
 export const getAmountMouth = () => {
     return request({
-        url: 'receiptPayment/getAmountMouth',
+        url: '/receiptPayment/getAmountMouth',
         method: 'get'
     })
 }
-// 鍥炴楗肩姸鍥�
+// 浠樻楗肩姸鍥�
 export const paymentMonthList = () => {
     return request({
         url: '/purchase/paymentRegistration/paymentMonthList',
         method: 'get'
     })
+}
+// 绾垮舰鍥�
+export const getAmountHalfYear = () => {
+    return request({
+        url: '/sales/ledger/getAmountHalfYear',
+        method: 'get'
+    })
 }
\ No newline at end of file
diff --git a/src/views/index.vue b/src/views/index.vue
index 4f5b35c..1fbed5d 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -112,7 +112,7 @@
                      :grid="grid"
                      :legend="barLegend"
                      :series="lineSeries"
-                     :tooltip="tooltip"
+                     :tooltip="tooltipLine"
                      :xAxis="xAxis2"
                      :yAxis="yAxis2"
                      style="height: 27vh;"></Echarts>
@@ -128,6 +128,7 @@
 import * as echarts from 'echarts';
 import Echarts from "@/components/Echarts/echarts.vue";
 import {
+  getAmountHalfYear,
   getAmountMouth,
   getContractAmount,
   getInvoiceAmount,
@@ -232,6 +233,9 @@
     type: 'shadow'
   }
 }
+const tooltipLine = {
+  trigger: 'axis',
+}
 const yAxis1 = ref([
   {
     type: 'value',
@@ -313,26 +317,22 @@
     materialPieSeries1.value[0].data[1].value = payableAmount.value
   })
 }
-// 瀹㈡埛
+// 瀹㈡埛top5
 const getTopFiveListNum = async () => {
   const res = await getTopFiveList()
-  
   const customerName = []
   const totalAmount = []
-  
   res.data.forEach(item => {
     customerName.push(item.customerName)
     totalAmount.push(item.totalAmount)
   })
-
-// 鉁� 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
+// 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
   xAxis1.value = [
     {
       type: 'category',
       data: customerName
     }
   ]
-  
   barSeries.value = [
     {
       type: 'bar',
@@ -353,12 +353,97 @@
     }
   ]
 }
+// 绾垮舰鍥�
+const getAmountHalfYearNum = async () => {
+  const res = await getAmountHalfYear()
+  console.log(res)
+  const monthName = []
+  const receiptAmount = []
+  const invoiceAmount = []
+  res.data.forEach(item => {
+    monthName.push(item.month)
+    receiptAmount.push(item.receiptAmount)
+    invoiceAmount.push(item.invoiceAmount)
+  })
+// 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
+  xAxis2.value = [
+    {
+      type: 'category',
+      data: monthName
+    }
+  ]
+  lineSeries.value = [
+    {
+      name: '寮�绁�',
+      type: 'line',
+      data: receiptAmount,
+      smooth: true,
+      stack: 'Total',
+      areaStyle: {
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(131, 207, 255, 1)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(186, 228, 255, 1)'
+          }
+        ])
+      },
+      // 璁剧疆灏忓渾鐐圭殑棰滆壊
+      itemStyle: {
+        color: '#2D99FF', // 灏忓渾鐐归鑹茶缃负#2D99FF
+        borderColor: '#2D99FF' // 濡傛灉闇�瑕佺殑璇濓紝鍙互璁剧疆杈规棰滆壊
+      },
+      emphasis: {
+        focus: 'series'
+      },
+      lineStyle: {
+        width: 0
+      },
+      showSymbol: false,
+    },
+    {
+      name: '鍥炴',
+      type: 'line',
+      data: invoiceAmount,
+      smooth: true,
+      stack: 'Total',
+      lineStyle: {
+        width: 0
+      },
+      // 璁剧疆灏忓渾鐐圭殑棰滆壊
+      itemStyle: {
+        color: '#83CFFF', // 灏忓渾鐐归鑹茶缃负#83CFFF
+        borderColor: '#83CFFF' // 濡傛灉闇�瑕佺殑璇濓紝鍙互璁剧疆杈规棰滆壊
+      },
+      showSymbol: false,
+      areaStyle: {
+        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+          {
+            offset: 0,
+            color: 'rgba(54, 153, 255, 1)'
+          },
+          {
+            offset: 1,
+            color: 'rgba(89, 169, 254, 1)'
+          }
+        ])
+      },
+      emphasis: {
+        focus: 'series'
+      },
+    }
+  ]
+}
 getContractAmountNum()
 getInvoiceAmountNum()
 getReceiptAmountNum()
 getTopFiveListNum()
 getAmountMouthNum()
 paymentMonthListNum()
+getAmountHalfYearNum()
 </script>
 
 <style scoped>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 0c2365d..03a7343 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -22,7 +22,7 @@
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="閲囪喘鍚堝悓鍙�11111锛�" prop="purchaseLedgerId">
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerId">
               <el-select v-model="form.purchaseLedgerId" placeholder="璇烽�夋嫨" clearable @change="setInfo"
                 :disabled="operationType === 'edit'">
                 <el-option v-for="item in purchaseLedgerList" :key="item.id" :label="item.purchaseContractNumber"
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 18c0176..f720960 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -65,7 +65,6 @@
           <PIMTable
             :column="tableColumnSon"
             :tableData="tableDataSon"
-            :page="pageSon"
             :isSelection="false"
             :tableLoading="tableLoadingSon"
             :isShowSummary="isShowSummarySon"
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index f04b8f2..b836cde 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -378,6 +378,13 @@
   page.current = 1
   getList()
 }
+// 瀛愯〃鍚堣鏂规硶
+const summarizeChildrenTable = (param) => {
+  return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'], {
+    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+  });
+};
 const paginationChange = ({ current, limit }) => {
   page.current = current;
   page.size = limit;
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 3a0fa46..7a373f2 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -104,7 +104,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
-              <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable>
+              <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs">
                 <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/>
               </el-select>
             </el-form-item>
@@ -121,6 +121,7 @@
                   type="date"
                   placeholder="璇烽�夋嫨"
                   clearable
+                  disabled
               />
             </el-form-item>
           </el-col>
@@ -193,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>
@@ -275,6 +286,7 @@
 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,
@@ -283,6 +295,8 @@
   addOrUpdateSalesLedger,
   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([])
@@ -290,6 +304,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,
@@ -386,6 +402,55 @@
     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
@@ -460,13 +525,12 @@
   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
   })
@@ -478,7 +542,17 @@
       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) {
@@ -554,6 +628,7 @@
     productForm.value = {...row}
   }
   productFormVisible.value = true
+  getProductOptions()
 }
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitProduct = () => {
@@ -662,6 +737,17 @@
     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>
 
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 7a5800a..a43d890 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -17,8 +17,8 @@
         <pane size="84">
           <el-col style="padding: 10px">
             <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-              <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
-                <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+              <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
+                <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" clearable style="width: 240px" @keyup.enter="handleQuery" />
               </el-form-item>
               <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
                 <el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -59,7 +59,7 @@
             <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
               <el-table-column type="selection" width="50" align="center" />
               <el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
-              <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
+              <el-table-column label="鐧诲綍璐﹀彿" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
               <el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
               <el-table-column label="閮ㄩ棬" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
               <el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
@@ -111,8 +111,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="褰掑睘閮ㄩ棬" prop="deptId">
-              <el-tree-select v-model="form.deptId" :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" check-strictly />
+            <el-form-item label="褰掑睘鍏徃" prop="deptId">
+              <el-tree-select v-model="form.deptId" :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘鍏徃" check-strictly />
             </el-form-item>
           </el-col>
         </el-row>
@@ -130,8 +130,8 @@
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛鍚嶇О" prop="userName">
-              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" />
+            <el-form-item v-if="form.userId == undefined" label="鐧诲綍璐﹀彿" prop="userName">
+              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -259,7 +259,7 @@
 // 鍒楁樉闅愪俊鎭�
 const columns = ref([
   { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
-  { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true },
+  { key: 1, label: `鐧诲綍璐﹀彿`, visible: true },
   { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
   { key: 3, label: `閮ㄩ棬`, visible: true },
   { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
@@ -278,9 +278,9 @@
     deptId: undefined
   },
   rules: {
-    userName: [{ required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }],
+    userName: [{ required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐧诲綍璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }],
     nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
-    deptId: [{ required: true, message: "褰掑睘閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur" }],
+    deptId: [{ required: true, message: "鍏徃涓嶈兘涓虹┖", trigger: "change" }],
     password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
     email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
     phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }]

--
Gitblit v1.9.3