From 57067e7107abc6d7b921ca9ba1dc46b4b4107c95 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期五, 30 十月 2026 16:50:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/api/system/menu.js                                            |    4 +-
 src/views/system/role/index.vue                                   |    8 ++-
 src/store/modules/user.js                                         |   10 +++++
 src/views/CNAS/process/disposal/sampleReceipt/index.vue           |    1 
 src/views/business/productOrder/components/addOrder.vue           |   17 +++++++-
 src/views/structural/sealManage/usageLedger/index.vue             |    1 
 src/views/business/inspectionReview/index.vue                     |    1 
 src/views/business/reportPreparation/index.vue                    |    1 
 src/views/structural/capabilityAndLaboratory/laboratory/index.vue |   14 ++++--
 src/views/CNAS/process/reportResults/index.vue                    |    1 
 src/views/business/productOrder/index.vue                         |   30 ++++++--------
 src/views/business/inspectionTask/index.vue                       |    1 
 12 files changed, 60 insertions(+), 29 deletions(-)

diff --git a/src/api/system/menu.js b/src/api/system/menu.js
index fdf2138..72bbf55 100644
--- a/src/api/system/menu.js
+++ b/src/api/system/menu.js
@@ -28,7 +28,7 @@
 // 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋�
 export function roleMenuTreeselect(roleId) {
   return request({
-    url: '/system/menu/roleMenuTreeselect/' + roleId,
+    url: roleId == null ? '/system/menu/roleMenuTreeselect' : '/system/menu/roleMenuTreeselect/' + roleId,
     method: 'get'
   })
 }
@@ -66,4 +66,4 @@
     url: '/system/menu/' + menuId,
     method: 'delete'
   })
-}
\ No newline at end of file
+}
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index b1e5df4..c93a35b 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -22,6 +22,16 @@
       permissions: []
     }),
     actions: {
+      // 鏇存柊鎸夐挳鏉冮檺锛屼笉閲嶅瑙﹀彂鐧诲綍鏃剁殑瀵嗙爜鎻愮ず銆�
+      async refreshPermissions() {
+        const token = this.token
+        const res = await getInfo()
+        if (this.token === token) {
+          this.roles = res.roles?.length ? res.roles : ['ROLE_DEFAULT']
+          this.permissions = res.permissions || []
+        }
+        return res
+      },
       // 鐧诲綍
       login(userInfo) {
         const username = userInfo.username.trim()
diff --git a/src/views/CNAS/process/disposal/sampleReceipt/index.vue b/src/views/CNAS/process/disposal/sampleReceipt/index.vue
index 8b6f4cb..2cd0206 100644
--- a/src/views/CNAS/process/disposal/sampleReceipt/index.vue
+++ b/src/views/CNAS/process/disposal/sampleReceipt/index.vue
@@ -145,6 +145,7 @@
         { label: '鏍峰搧缂栧彿', prop: 'sampleCode' },
         { label: '妫�娴嬮」鐩�', prop: 'inspectionItem', dataType: 'slot', slot: 'inspectionItem', width: '220px' },
         { label: '濮旀墭缂栧彿', prop: 'entrustCode' },
+        { label: '閫佹牱鏃堕棿', prop: 'sampleDate', width: '110px', formatData: value => value || '鈥�' },
         { label: '鏂规硶鏍囧噯', prop: 'methodStandard' },
         { label: '涓绘浜虹瀛�', prop: 'mainInspectorName' },
         { label: '澶囨敞', prop: 'remark', dataType: 'slot', slot: 'remark', width: '180px' },
diff --git a/src/views/CNAS/process/reportResults/index.vue b/src/views/CNAS/process/reportResults/index.vue
index 91094c0..585dead 100644
--- a/src/views/CNAS/process/reportResults/index.vue
+++ b/src/views/CNAS/process/reportResults/index.vue
@@ -164,6 +164,7 @@
       tableData: [],
       column: [
         { label: "妫�楠屾姤鍛婄紪鍙�", prop: "insReportCode" },
+        { label: "閫佹牱鏃堕棿", prop: "sampleDate", width: "110px", formatData: value => value || '鈥�' },
         { label: "鍙戝線浣曞", prop: "send" },
         { label: "鍙戦�佹柟寮�", prop: "method" },
         { label: "鍙戦�佹棩鏈�", prop: "sendTime" },
diff --git a/src/views/business/inspectionReview/index.vue b/src/views/business/inspectionReview/index.vue
index 8e3e564..6ade3ed 100644
--- a/src/views/business/inspectionReview/index.vue
+++ b/src/views/business/inspectionReview/index.vue
@@ -96,6 +96,7 @@
           linkMethod: "selectAllByOne",
         },
         {label: "鏍峰搧鍚嶇О", prop: "sample", width: "160px"},
+        {label: "閫佹牱鏃堕棿", prop: "sampleDate", width: "110px", formatData: value => value || '鈥�'},
         // {
         //   label: '鐗╂枡灞炴��',
         //   prop: 'materialProp',
diff --git a/src/views/business/inspectionTask/index.vue b/src/views/business/inspectionTask/index.vue
index 28e4def..d2499b3 100644
--- a/src/views/business/inspectionTask/index.vue
+++ b/src/views/business/inspectionTask/index.vue
@@ -364,6 +364,7 @@
           linkMethod: "selectAllByOne",
         },
         { label: "鐩戞帶椤圭洰", prop: "monitorProject", width: "150px" },
+        { label: "閫佹牱鏃堕棿", prop: "sampleDate", width: "110px", formatData: value => value || '鈥�' },
         { label: "璁″垝鏈熼檺", prop: "dueDate", width: "120px" },
         { label: "鏍峰搧鍚嶇О", prop: "sample", width: "160px" },
         {
diff --git a/src/views/business/productOrder/components/addOrder.vue b/src/views/business/productOrder/components/addOrder.vue
index 17cd750..aeae70a 100644
--- a/src/views/business/productOrder/components/addOrder.vue
+++ b/src/views/business/productOrder/components/addOrder.vue
@@ -136,7 +136,7 @@
             </el-col>
             <el-col :span="6">
               <el-form-item label="閫佹牱鏃ユ湡" prop="sampleDate">
-                <el-date-picker v-model="addObj.sampleDate" type="date" value-format="YYYY-MM-DD" :disabled="active>1"
+                <el-date-picker v-model="addObj.sampleDate" type="date" value-format="YYYY-MM-DD" placeholder="璇烽�夋嫨鏈閫佹牱鏃ユ湡" :disabled="active>1"
                                 size="small"/>
               </el-form-item>
             </el-col>
@@ -1671,6 +1671,11 @@
       }
     },
     saveMethod(sampleList) {
+      if (!this.addObj.sampleDate && !this.isEdit) {
+        this.$refs.newJuOrder?.validateField('sampleDate')
+        this.$message.warning('璇烽�夋嫨鏈閫佹牱鏃ユ湡')
+        return
+      }
       if (this.addObj.standardTreeId) {
         this.saveData([]);
         return;
@@ -1705,6 +1710,11 @@
       }
     },
     saveData(sampleList) {
+      if (!this.addObj.sampleDate && !this.isEdit) {
+        this.$refs.newJuOrder?.validateField('sampleDate')
+        this.$message.warning('璇烽�夋嫨鏈閫佹牱鏃ユ湡')
+        return
+      }
       this.saveLoad = true
       const insOrder = {
         ...this.addObj,
@@ -2185,14 +2195,17 @@
     },
     // 鏌ヨ妯℃澘
     selectInsOrderTemplateById(e) {
+      const loadVersion = ++this.orderLoadVersion
       selectInsOrderTemplateById({id: e}).then(res => {
+        if (loadVersion !== this.orderLoadVersion || this.template !== e) return
         const detail = res.data || {}
         let obj = JSON.parse(detail.thing)
         //鍒跺崟浜鸿缃负褰撳墠鐧诲綍鐢ㄦ埛
         let user = this.nickName
         obj.addObj.custom = user.name
         obj.addObj.userId = user.userId
-        this.addObj = obj.addObj;
+        this.addObj = {...obj.addObj, sampleDate: null};
+        this.$nextTick(() => this.$refs.newJuOrder?.clearValidate('sampleDate'))
         this.sampleList = obj.sampleList;
         this.selectTree = obj.selectTree
         // backend already resolved the bound record templates by standard
diff --git a/src/views/business/productOrder/index.vue b/src/views/business/productOrder/index.vue
index 8bdd92c..394a16e 100644
--- a/src/views/business/productOrder/index.vue
+++ b/src/views/business/productOrder/index.vue
@@ -45,7 +45,7 @@
           <ul class="tab">
             <li :class="{ active: tabIndex === 7 }" v-if="checkPermi(['get:insOrder:all'])" @click="handleTab(7)">鍏ㄩ儴</li>
             <li :class="{ active: tabIndex === 1 }" v-if="checkPermi(['get:insOrder:checkout'])" @click="handleTab(1)">妫�楠屼腑</li>
-            <li :class="{ active: tabIndex === 2 }" v-if="checkPermi(['get:insOrder:customerOrdered'])" @click="handleTab(2)">濮旀墭宸叉</li>
+            <li :class="{ active: tabIndex === 2 }" v-if="checkPermi(['get:insOrder:customerOrdered'])" @click="handleTab(2)">宸叉</li>
             <li :class="{ active: tabIndex === 4 }" v-if="checkPermi(['get:insOrder:sendBack'])" @click="handleTab(4)">閫�鍥�</li>
             <li :class="{ active: tabIndex === 5 }" v-if="checkPermi(['get:insOrder:revocation'])" @click="handleTab(5)">鎾ら攢</li>
             <li :class="{ active: tabIndex === 6 }" v-if="checkPermi(['get:insOrder:revocation'])" @click="handleTab(6)">浣滃簾</li>
@@ -288,6 +288,7 @@
 } from "@/api/business/productOrder";
 import { downFile, getFileList } from "@/api/business/rawMaterialOrder";
 import {mapGetters} from "@/utils/store-compat";
+import useUserStore from '@/store/modules/user'
 export default {
   name: 'ProductOrder',
   components: {
@@ -442,7 +443,7 @@
                 this.handleDelete(row);
               },
               showHide: (row) => {
-                return this.tabIndex === 4 || this.tabIndex === 5
+                return this.checkPermi(['delete:insOrder'])
               }
             },
             {
@@ -573,7 +574,7 @@
           value: 1
         },
         {
-          label: '濮旀墭宸叉',
+          label: '宸叉',
           value: 4
         },
         {
@@ -630,25 +631,20 @@
     ...mapGetters(["nickName"]),
   },
   mounted() {
+    useUserStore().refreshPermissions().catch(() => {})
     // 鍏嶅鏍稿悗娌℃湁寰呭鏍搁〉绛撅紝榛樿杩涘叆鍏ㄩ儴
     this.tabIndex = this.checkPermi(['get:insOrder:all']) ? 7 : 1
     this.refreshTable()
   },
   activated() {
+    useUserStore().refreshPermissions().catch(() => {})
     this.refreshTable()
   },
   methods: {
     // 鏌ヨ鍒楄〃鏁版嵁
     refreshTable() {
-      if (this.tabIndex !== 2 && this.tabIndex !== 3) {
-        this.entity.orderType = ''
-      } else {
-        if (this.tabIndex === 2) {
-          this.entity.orderType = 'Customer-ordered test'
-        } else {
-          this.entity.orderType = '鎶芥'
-        }
-      }
+      // 宸叉鎸夋姤鍛婃壒鍑嗗悗鐨勮鍗曠姸鎬佹煡璇紝涓嶉檺鍒舵楠岀被鍒��
+      this.entity.orderType = this.tabIndex === 3 ? '鎶芥' : ''
       const params = { ...this.entity, state: this.tabList[this.tabIndex].value }
       this.isLoading = true; // 寮�濮嬪姞杞�
       selectInsOrderParameter({...this.page,...params}).then(res => {
@@ -1074,16 +1070,16 @@
       this.InspectionKey++
     },
     handleDelete(row) {
-      this.$confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', "璀﹀憡", {
-        confirmButtonText: "纭畾",
+      if (!this.checkPermi(['delete:insOrder'])) return
+      this.$confirm(`纭畾姘镐箙鍒犻櫎濮旀墭鍗曗��${row.entrustCode || row.code || row.id}鈥濆悧锛熻濮旀墭鐨勬牱鍝佹帴鏀躲�佹楠屼换鍔°�佸師濮嬭褰曘�佹姤鍛婏紙鍚凡鎵瑰噯鎶ュ憡锛夈�侀檮浠惰褰曞強鍏朵粬鍏宠仈涓氬姟璁板綍灏嗕竴骞跺垹闄わ紝鍒犻櫎鍚庢棤娉曟仮澶嶃�俙, "鍒犻櫎濮旀墭鍗�", {
+        confirmButtonText: "纭鍒犻櫎",
         cancelButtonText: "鍙栨秷",
         type: "warning"
       }).then(() => {
-        delInsOrder({ insOrderId: row.id }).then(res => {
+        return delInsOrder({ insOrderId: row.id }).then(res => {
+          this.multipleSelection = this.multipleSelection.filter(item => item.id !== row.id)
           this.$message.success('鍒犻櫎鎴愬姛')
           this.refreshTable()
-        }).catch(e => {
-          this.$message.error('鍒犻櫎澶辫触')
         })
       }).catch(() => { })
     }
diff --git a/src/views/business/reportPreparation/index.vue b/src/views/business/reportPreparation/index.vue
index 09de219..8428612 100644
--- a/src/views/business/reportPreparation/index.vue
+++ b/src/views/business/reportPreparation/index.vue
@@ -568,6 +568,7 @@
           },
         },
         {label: "鍒涘缓鏃堕棿", prop: "createTime"},
+        {label: "閫佹牱鏃堕棿", prop: "sampleDate", width: "110px", formatData: value => value || '鈥�'},
         {label: "鎻愪氦浜�", prop: "writeUserName"},
         {label: "鎻愪氦鏃堕棿", prop: "writeTime"},
         {
diff --git a/src/views/structural/capabilityAndLaboratory/laboratory/index.vue b/src/views/structural/capabilityAndLaboratory/laboratory/index.vue
index 7dde2e5..10cb00a 100644
--- a/src/views/structural/capabilityAndLaboratory/laboratory/index.vue
+++ b/src/views/structural/capabilityAndLaboratory/laboratory/index.vue
@@ -62,8 +62,8 @@
               <p style="line-height: 26px">
                 璧勮川鍚嶇О锛�<span style="color: var(--el-color-primary)">{{ m.name }}</span>
               </p>
-              <p style="line-height: 26px">棰佸彂鏃堕棿锛歿{ m.recentlyTime }}</p>
-              <p style="line-height: 26px">鍒版湡鏃堕棿锛歿{ m.expireTime }}</p>
+              <p style="line-height: 26px">棰佸彂鏃堕棿锛歿{ formatDate(m.dateOfIssuance) }}</p>
+              <p style="line-height: 26px">鍒版湡鏃堕棿锛歿{ formatDate(m.expireTime) }}</p>
               <p>
                 <span>鐘舵�侊細</span>
                 <el-tag :type="m.state === 0 ? 'danger' : 'success'" size="small">{{ m.state === 0 ? "澶辨晥" : "鏈夋晥"
@@ -167,6 +167,10 @@
 } from "@/api/structural/laboratory";
 import { getToken } from "@/utils/auth";
 
+function formatDate(value) {
+  return value ? String(value).slice(0, 10) : "";
+}
+
 export default {
   name: 'Laboratory',
   components: {
@@ -186,9 +190,8 @@
         { label: "璧勮川缂栫爜", prop: "code" },
         { label: "棰佸彂鏈烘瀯", prop: "organization" },
         { label: "璧勮川璇存槑", prop: "explanation" },
-        { label: "棣栨棰佸彂鏃堕棿", prop: "firstIssuanceDate" },
-        { label: "鏈�杩戦鍙戞椂闂�", prop: "latestIssuanceDate" },
-        { label: "鍒版湡棰佸彂鏃堕棿", prop: "expireTime" },
+        { label: "棰佸彂鏃堕棿", prop: "dateOfIssuance", formatData: formatDate },
+        { label: "鍒版湡鏃堕棿", prop: "expireTime", formatData: formatDate },
         {
           dataType: "action",
           label: "鎿嶄綔",
@@ -257,6 +260,7 @@
     this.refreshTable();
   },
   methods: {
+    formatDate,
     selectorSwitch(radio) {
       if (radio === 1) {
         this.reloadOverview();
diff --git a/src/views/structural/sealManage/usageLedger/index.vue b/src/views/structural/sealManage/usageLedger/index.vue
index bbd2bf1..b806bca 100644
--- a/src/views/structural/sealManage/usageLedger/index.vue
+++ b/src/views/structural/sealManage/usageLedger/index.vue
@@ -132,6 +132,7 @@
         { label: '鍗扮珷鍚嶇О', prop: 'sealNames', dataType: 'slot', slot: 'sealNames', minWidth: '210px' },
         { label: '妫�娴嬮」鐩悕绉�', prop: 'projectName', dataType: 'slot', slot: 'projectName', minWidth: '180px' },
         { label: '鎶ュ憡缂栧彿', prop: 'reportCode', minWidth: '180px' },
+        { label: '閫佹牱鏃堕棿', prop: 'sampleDate', width: '110px', formatData: value => value || '鈥�' },
         { label: '浠芥暟', prop: 'copies', dataType: 'slot', slot: 'copies', width: '120px' },
         { label: '鐢ㄥ嵃浜虹瀛�', prop: 'useUserName', width: '140px' }
       ]
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index c191194..b71b095 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -243,7 +243,8 @@
 
 <script setup name="Role">
 import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role"
-import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu"
+import { roleMenuTreeselect } from "@/api/system/menu"
+import useUserStore from '@/store/modules/user'
 
 const router = useRouter()
 const { proxy } = getCurrentInstance()
@@ -377,8 +378,8 @@
 
 /** 鏌ヨ鑿滃崟鏍戠粨鏋� */
 function getMenuTreeselect() {
-  menuTreeselect().then(response => {
-    menuOptions.value = response.data
+  roleMenuTreeselect().then(response => {
+    menuOptions.value = response.menus
   })
 }
 
@@ -513,6 +514,7 @@
       if (form.value.roleId != undefined) {
         form.value.menuIds = getMenuAllCheckedKeys()
         updateRole(form.value).then(() => {
+          useUserStore().refreshPermissions().catch(() => {})
           proxy.$modal.msgSuccess("淇敼鎴愬姛")
           open.value = false
           getList()

--
Gitblit v1.9.3