From 9cf2a2365b1e5cf0c5a25cf05281465b8f667428 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 05 二月 2026 11:38:14 +0800
Subject: [PATCH] Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New

---
 src/views/collaborativeApproval/sealManagement/index.vue |  729 +++++++++++++------------------------------------------
 1 files changed, 171 insertions(+), 558 deletions(-)

diff --git a/src/views/collaborativeApproval/sealManagement/index.vue b/src/views/collaborativeApproval/sealManagement/index.vue
index 4cf5a14..c0d13f2 100644
--- a/src/views/collaborativeApproval/sealManagement/index.vue
+++ b/src/views/collaborativeApproval/sealManagement/index.vue
@@ -3,22 +3,23 @@
     <el-card class="box-card">
       <template #header>
         <div class="card-header">
-          <span>鐢ㄥ嵃绠$悊涓庤绔犲埗搴﹀彂甯�</span>
-          <el-button type="primary" @click="showSealApplyDialog = true">
-            <el-icon><Plus /></el-icon>
-            鐢宠鐢ㄥ嵃
-          </el-button>
+          <span>鐢ㄥ嵃绠$悊鍙戝竷</span>
         </div>
       </template>
 
-      <el-tabs v-model="activeTab" type="border-card">
-        <!-- 鐢ㄥ嵃鐢宠绠$悊 -->
-        <el-tab-pane label="鐢ㄥ嵃鐢宠绠$悊" name="seal">
-          <div class="tab-content">
-            <el-row :gutter="20" class="mb-20">
-              <el-col :span="6">
+      
+   <!-- 鐢ㄥ嵃鐢宠绠$悊 -->
+        <div class="tab-content">
+            <el-row :gutter="20" class="mb-20 ">
+              <span class="ml-10">鐢ㄥ嵃鏍囬锛�</span>
+              <el-col :span="4">
                 <el-input v-model="sealSearchForm.title" placeholder="璇疯緭鍏ョ敵璇锋爣棰�" clearable />
               </el-col>
+              <span class="ml-10">鐢ㄥ嵃缂栧彿锛�</span>
+              <el-col :span="4">
+                <el-input v-model="sealSearchForm.applicationNum" placeholder="璇疯緭鍏ョ敤鍗扮紪鍙�" clearable />
+              </el-col>
+              <span class="search_title">瀹℃壒鐘舵�侊細</span>
               <el-col :span="4">
                 <el-select v-model="sealSearchForm.status" placeholder="瀹℃壒鐘舵��" clearable>
                   <el-option label="寰呭鎵�" value="pending" />
@@ -26,124 +27,36 @@
                   <el-option label="宸叉嫆缁�" value="rejected" />
                 </el-select>
               </el-col>
-              <el-col :span="4">
+              <el-col :span="6">
                 <el-button type="primary" @click="searchSealApplications">鎼滅储</el-button>
                 <el-button @click="resetSealSearch">閲嶇疆</el-button>
-              </el-col>
-            </el-row>
-
-            <el-table :data="sealApplications" border v-loading="tableLoading" style="width: 100%">
-              <el-table-column prop="applicationNum" label="鐢宠缂栧彿" width="120" />
-              <el-table-column prop="title" label="鐢宠鏍囬" min-width="200" />
-              <el-table-column prop="createUserName" label="鐢宠浜�" width="120" />
-              <el-table-column prop="department" label="鎵�灞為儴闂�" width="150" />
-              <el-table-column prop="sealType" label="鐢ㄥ嵃绫诲瀷" width="120">
-                <template #default="scope">
-                  {{ getSealTypeText(scope.row.sealType) }}
-                </template>
-              </el-table-column>
-              <el-table-column prop="createTime" label="鐢宠鏃堕棿" width="180" />
-              <el-table-column prop="status" label="鐘舵��" width="100">
-                <template #default="scope">
-                  <el-tag :type="getStatusType(scope.row.status)">
-                    {{ getStatusText(scope.row.status) }}
-                  </el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column label="鎿嶄綔" width="200" fixed="right">
-                <template #default="scope">
-                  <el-button link @click="viewSealDetail(scope.row)">鏌ョ湅</el-button>
-                  <el-button 
-                    v-if="scope.row.status === 'pending'"
-										link
-                    type="primary" 
-                    @click="approveSeal(scope.row)"
-                  >
-                    瀹℃壒
-                  </el-button>
-                  <el-button 
-                    v-if="scope.row.status === 'pending'"
-										link
-                    type="danger" 
-                    @click="rejectSeal(scope.row)"
-                  >
-                    鎷掔粷
-                  </el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-          </div>
-        </el-tab-pane>
-
-        <!-- 瑙勭珷鍒跺害绠$悊 -->
-        <el-tab-pane label="瑙勭珷鍒跺害绠$悊" name="regulations">
-          <div class="tab-content">
-            <el-row :gutter="20" class="mb-20">
-              <el-col :span="6">
-                <el-input v-model="regulationSearchForm.title" placeholder="璇疯緭鍏ュ埗搴︽爣棰�" clearable />
-              </el-col>
-              <el-col :span="4">
-                <el-select v-model="regulationSearchForm.category" placeholder="鍒跺害鍒嗙被" clearable>
-                  <el-option label="浜轰簨鍒跺害" value="hr" />
-                  <el-option label="璐㈠姟鍒跺害" value="finance" />
-                  <el-option label="瀹夊叏鍒跺害" value="safety" />
-                  <el-option label="鎶�鏈埗搴�" value="tech" />
-                </el-select>
-              </el-col>
-              <el-col :span="8">
-                <el-button type="primary" @click="searchRegulations">鎼滅储</el-button>
-                <el-button @click="resetRegulationSearch">閲嶇疆</el-button>
-                <el-button type="success" @click="handleAdd">
-                  鍙戝竷鍒跺害
+                <el-button @click="handleExport">瀵煎嚭</el-button>
+                <el-button type="primary" @click="showSealApplyDialog = true">鐢宠鐢ㄥ嵃
                 </el-button>
               </el-col>
             </el-row>
 
-            <el-table :data="regulations" border v-loading="tableLoading"  style="width: 100%">
-              <el-table-column prop="regulationNum" label="鍒跺害缂栧彿" width="120" />
-              <el-table-column prop="title" label="鍒跺害鏍囬" min-width="200" />
-              <el-table-column prop="category" label="鍒嗙被" width="120">
-                <template #default="scope">
-                  <el-tag>{{ getCategoryText(scope.row.category) }}</el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column prop="version" label="鐗堟湰" width="80" />
-              <el-table-column prop="createUserName" label="鍙戝竷浜�" width="120" />
-              <el-table-column prop="createTime" label="鍙戝竷鏃堕棿" width="180" />
-              <el-table-column prop="status" label="鐘舵��" width="100">
-                <template #default="scope">
-                  <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
-                    {{ scope.row.status === 'active' ? '鐢熸晥涓�' : '宸插簾姝�' }}
-                  </el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column prop="readCount" label="宸茶浜烘暟" width="100" />
-              <el-table-column label="鎿嶄綔" width="250" fixed="right">
-                <template #default="scope">
-                  <el-button link @click="viewRegulation(scope.row)">鏌ョ湅</el-button>
-                  <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
-                  <el-button link type="danger" @click="repealEdit(scope.row)">搴熷純</el-button>
-                  <el-button link type="success" @click="viewVersionHistory(scope.row)">鐗堟湰鍘嗗彶</el-button>
-                  <el-button link type="warning" @click="viewReadStatus(scope.row)">闃呰鐘舵��</el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-                  <!-- 鍒嗛〉
-            <pagination
-              v-show="total > 0"
-              :total="total"
-              layout="total, sizes, prev, pager, next, jumper"
-              :page="page.current"
-              :limit="page.size"
+            <PIMTable
+              rowKey="id"
+              :column="sealTableColumn"
+              :tableData="sealApplications"
+              :tableLoading="tableLoading"
+              :page="page"
+              :isShowPagination="true"
               @pagination="paginationChange"
-            /> -->
-          </div>
-        </el-tab-pane>
-      </el-tabs>
+            />
+        </div> 
     </el-card>
 
     <!-- 鐢ㄥ嵃鐢宠瀵硅瘽妗� -->
-    <el-dialog v-model="showSealApplyDialog" title="鐢宠鐢ㄥ嵃" width="600px">
+    <FormDialog
+      v-model="showSealApplyDialog"
+      title="鐢宠鐢ㄥ嵃"
+      :width="'600px'"
+      @close="closeSealApplyDialog"
+      @confirm="submitSealApplication"
+      @cancel="closeSealApplyDialog"
+    >
       <el-form :model="sealForm" :rules="sealRules" ref="sealFormRef" label-width="100px">
         <el-form-item label="鐢宠缂栧彿" prop="applicationNum">
           <el-input v-model="sealForm.applicationNum" placeholder="璇疯緭鍏ョ敵璇风紪鍙�" />
@@ -162,6 +75,16 @@
         <el-form-item label="鐢宠鍘熷洜" prop="reason">
           <el-input v-model="sealForm.reason" type="textarea" :rows="4" placeholder="璇疯缁嗚鏄庣敤鍗板師鍥�" />
         </el-form-item>
+        <el-form-item label="瀹℃壒浜�" prop="approveUserId">
+          <el-select v-model="sealForm.approveUserId" placeholder="璇烽�夋嫨瀹℃壒浜�" style="width: 100%" filterable>
+            <el-option
+                v-for="user in userList"
+                :key="user.userId"
+                :label="user.nickName"
+                :value="user.userId"
+            />
+          </el-select>
+        </el-form-item>
         <el-form-item label="绱ф�ョ▼搴�" prop="urgency">
           <el-radio-group v-model="sealForm.urgency">
             <el-radio label="normal">鏅��</el-radio>
@@ -170,68 +93,20 @@
           </el-radio-group>
         </el-form-item>
       </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="showSealApplyDialog = false">鍙栨秷</el-button>
-          <el-button type="primary" @click="submitSealApplication">鎻愪氦鐢宠</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <!-- 瑙勭珷鍒跺害鍙戝竷瀵硅瘽妗� -->
-    <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? '鍙戝竷鍒跺害' : '缂栬緫鍒跺害'" width="800px">
-      <el-form :model="regulationForm" :rules="regulationRules" ref="regulationFormRef" label-width="100px">
-        <el-form-item label="鍒跺害缂栧彿" prop="regulationNum">
-          <el-input v-model="regulationForm.regulationNum" placeholder="璇疯緭鍏ュ埗搴︾紪鍙�" />
-        </el-form-item>
-        <el-form-item label="鍒跺害鏍囬" prop="title">
-          <el-input v-model="regulationForm.title" placeholder="璇疯緭鍏ュ埗搴︽爣棰�" />
-        </el-form-item>
-        <el-form-item label="鍒跺害鍒嗙被" prop="category">
-          <el-select v-model="regulationForm.category" placeholder="璇烽�夋嫨鍒跺害鍒嗙被" style="width: 100%">
-            <el-option label="浜轰簨鍒跺害" value="hr" />
-            <el-option label="璐㈠姟鍒跺害" value="finance" />
-            <el-option label="瀹夊叏鍒跺害" value="safety" />
-            <el-option label="鎶�鏈埗搴�" value="tech" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鍒跺害鍐呭" prop="content">
-          <el-input v-model="regulationForm.content" type="textarea" :rows="10" placeholder="璇疯緭鍏ュ埗搴﹁缁嗗唴瀹�" />
-        </el-form-item>
-        <el-form-item label="鍒跺害鐗堟湰" prop="version">
-          <el-input v-model="regulationForm.version" placeholder="璇疯緭鍏ュ埗搴︾増鏈�" />
-        </el-form-item>
-        <el-form-item label="鐢熸晥鏃堕棿" prop="effectiveTime">
-          <el-date-picker v-model="regulationForm.effectiveTime" type="datetime" format="YYYY-MM-DD HH:mm:ss"
-             value-format="YYYY-MM-DD HH:mm:ss" placeholder="閫夋嫨鐢熸晥鏃堕棿" style="width: 100%" />
-        </el-form-item>
-        <el-form-item label="閫傜敤鑼冨洿" prop="scope">
-          <el-checkbox-group v-model="regulationForm.scope">
-            <el-checkbox label="all">鍏ㄤ綋鍛樺伐</el-checkbox>
-            <el-checkbox label="manager">绠$悊灞�</el-checkbox>
-            <el-checkbox label="hr">浜轰簨閮ㄩ棬</el-checkbox>
-            <el-checkbox label="finance">璐㈠姟閮ㄩ棬</el-checkbox>
-            <el-checkbox label="tech">鎶�鏈儴闂�</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-        <el-form-item label="鏄惁闇�瑕佺‘璁�" prop="requireConfirm">
-          <el-switch v-model="regulationForm.requireConfirm" />
-          <span class="ml-10">寮�鍚悗鍛樺伐闇�瑕侀槄璇荤‘璁�</span>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="showRegulationDialog = false">鍙栨秷</el-button>
-          <el-button type="primary" @click="submitRegulation">鍙戝竷鍒跺害</el-button>
-        </span>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 鐢ㄥ嵃璇︽儏瀵硅瘽妗� -->
-    <el-dialog v-model="showSealDetailDialog" title="鐢ㄥ嵃鐢宠璇︽儏" width="700px">
+    <FormDialog
+      v-model="showSealDetailDialog"
+      title="鐢ㄥ嵃鐢宠璇︽儏"
+      :width="'700px'"
+      @close="closeSealDetailDialog"
+      @confirm="closeSealDetailDialog"
+      @cancel="closeSealDetailDialog"
+    >
       <div v-if="currentSealDetail" class="mb10">
         <el-descriptions :column="2" border>
-          <el-descriptions-item label="鐢宠缂栧彿">{{ currentSealDetail.id }}</el-descriptions-item>
+          <el-descriptions-item label="鐢宠缂栧彿">{{ currentSealDetail.applicationNum }}</el-descriptions-item>
           <el-descriptions-item label="鐢宠鏍囬">{{ currentSealDetail.title }}</el-descriptions-item>
           <el-descriptions-item label="鐢宠浜�">{{ currentSealDetail.createUserName }}</el-descriptions-item>
           <el-descriptions-item label="鎵�灞為儴闂�">{{ currentSealDetail.department }}</el-descriptions-item>
@@ -245,90 +120,37 @@
           <el-descriptions-item label="鐢宠鍘熷洜" :span="2">{{ currentSealDetail.reason }}</el-descriptions-item>
         </el-descriptions>
       </div>
-    </el-dialog>
+    </FormDialog>
 
-    <!-- 瑙勭珷鍒跺害璇︽儏瀵硅瘽妗� -->
-    <el-dialog v-model="showRegulationDetailDialog" title="瑙勭珷鍒跺害璇︽儏" width="800px">
-      <div v-if="currentRegulationDetail">
-        <el-descriptions :column="2" border>
-          <el-descriptions-item label="鍒跺害缂栧彿">{{ currentRegulationDetail.id }}</el-descriptions-item>
-          <el-descriptions-item label="鍒跺害鏍囬">{{ currentRegulationDetail.title }}</el-descriptions-item>
-          <el-descriptions-item label="鍒嗙被">{{ getCategoryText(currentRegulationDetail.category) }}</el-descriptions-item>
-          <el-descriptions-item label="鐗堟湰">{{ currentRegulationDetail.version }}</el-descriptions-item>
-          <el-descriptions-item label="鍙戝竷浜�">{{ currentRegulationDetail.createUserName }}</el-descriptions-item>
-          <el-descriptions-item label="鍙戝竷鏃堕棿">{{ currentRegulationDetail.createTime }}</el-descriptions-item>
-        </el-descriptions>
-        <div class="mt-20">
-          <h4>鍒跺害鍐呭</h4>
-          <div class="regulation-content">{{ currentRegulationDetail.content }}</div>
-        </div>
-        <!-- 濡傛灉tableData>0 鏄剧ず -->
-        <div style="margin: 10px 0;" v-if="tableData && tableData.length > 0" >
-          <el-button type="success" @click="resetForm(currentRegulationDetail)">纭鏌ョ湅</el-button>
-        </div>
-      </div>
-    </el-dialog>
-
-    <!-- 鐗堟湰鍘嗗彶瀵硅瘽妗� -->
-    <el-dialog v-model="showVersionHistoryDialog" title="鐗堟湰鍘嗗彶" width="800px">
-      <el-table :data="versionHistory" style="width: 100%;margin-bottom: 10px">
-        <el-table-column prop="version" label="鐗堟湰鍙�" width="100" />
-        <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
-        <el-table-column prop="createUserName" label="鏇存柊浜�" width="120" />
-        <el-table-column prop="changeLog" label="鍙樻洿璇存槑">
-          <template #default="scope">
-            <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
-              {{ scope.row.status === 'active' ? '鐢熸晥涓�' : '宸插簾姝�' }}
-            </el-tag>
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-dialog>
-
-    <!-- 闃呰鐘舵�佸璇濇 -->
-    <el-dialog v-model="showReadStatusDialog" title="闃呰鐘舵��" width="800px">
-      <el-table :data="readStatusList" style="width: 100%;margin-bottom: 10px">
-        <el-table-column prop="employee" label="鍛樺伐濮撳悕" width="120" />
-        <el-table-column prop="department" label="鎵�灞為儴闂�" width="150" />
-        <el-table-column prop="createTime" label="闃呰鏃堕棿" width="180" />
-        <el-table-column prop="confirmTime" label="纭鏃堕棿" width="180" />
-        <el-table-column prop="status" label="鐘舵��" width="100">
-          <template #default="scope">
-            <el-tag :type="scope.row.status === 'confirmed' ? 'success' : 'warning'">
-              {{ scope.row.status === 'confirmed' ? '宸茬‘璁�' : '鏈‘璁�' }}
-            </el-tag>
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from 'vue'
+import { ref, reactive, onMounted, getCurrentInstance, watch } from 'vue'
+import { useRoute } from 'vue-router'
 import { ElMessage, ElMessageBox } from 'element-plus'
-import { Plus } from '@element-plus/icons-vue'
-import { listSealApplication, addSealApplication, updateSealApplication,listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,getReadingStatusList,addReadingStatus,updateReadingStatus  } from '@/api/collaborativeApproval/sealManagement.js'
-import { el } from 'element-plus/es/locales.mjs'
-import { getUserProfile } from '@/api/system/user.js'
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
+import { listSealApplication, addSealApplication, updateSealApplication } from '@/api/collaborativeApproval/sealManagement.js'
+import { userListNoPageByTenantId } from '@/api/system/user.js'
+import useUserStore from '@/store/modules/user'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
+import PIMTable from '@/components/PIMTable/PIMTable.vue'
 
 // 鍝嶅簲寮忔暟鎹�
-const currentUser = ref(null)
-const activeTab = ref('seal')
-const operationType = ref('add')
-const tableData = ref([])
 // 鐢ㄥ嵃鐢宠鐩稿叧
+const userStore = useUserStore()
+const route = useRoute()
 const showSealApplyDialog = ref(false)
 const tableLoading = ref(false)
 const showSealDetailDialog = ref(false)
 const currentSealDetail = ref(null)
 const sealFormRef = ref()
+const userList = ref([])
 const sealForm = reactive({
   applicationNum: '',
   title: '',
   sealType: '',
   reason: '',
+  approveUserId: '',
   urgency: 'normal',
   status: 'pending'
 })
@@ -337,12 +159,14 @@
   applicationNum: [{ required: true, message: '璇疯緭鍏ョ敵璇风紪鍙�', trigger: 'blur' }],
   title: [{ required: true, message: '璇疯緭鍏ョ敵璇锋爣棰�', trigger: 'blur' }],
   sealType: [{ required: true, message: '璇烽�夋嫨鐢ㄥ嵃绫诲瀷', trigger: 'change' }],
-  reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }]
+  reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }],
+  approveUserId: [{ required: true, message: '璇烽�夋嫨瀹℃壒浜�', trigger: 'change' }]
 }
 
 const sealSearchForm = reactive({
   title: '',
-  status: ''
+  status: '',
+  applicationNum: ''
 })
 // 鍒嗛〉鍙傛暟
 const page = reactive({
@@ -350,61 +174,8 @@
   size: 10,
   total: 0
 })
-// 瑙勭珷鍒跺害鐩稿叧
-const showRegulationDialog = ref(false)
-const showRegulationDetailDialog = ref(false)
-const showVersionHistoryDialog = ref(false)
-const showReadStatusDialog = ref(false)
-const currentRegulationDetail = ref(null)
-const regulationFormRef = ref()
-const regulationForm = reactive({
-  id: '',
-  regulationNum: '',
-  title: '',
-  category: '',
-  content: '',
-  version: '',
-  status: 'active',
-  readCount: 0,
-  effectiveTime: '',
-  scope: [],
-  requireConfirm: false
-})
 
-const readStatus = ref({
-  id: '',
-  ruleId: '',
-  employee: '',
-  department: '',
-  createTime: '',
-  confirmTime: '',
-  status: 'unconfirmed'
-})
-
-const regulationRules = {
-  title: [{ required: true, message: '璇疯緭鍏ュ埗搴︽爣棰�', trigger: 'blur' }],
-  category: [{ required: true, message: '璇烽�夋嫨鍒跺害鍒嗙被', trigger: 'change' }],
-  content: [{ required: true, message: '璇疯緭鍏ュ埗搴﹀唴瀹�', trigger: 'blur' }],
-  effectiveTime: [{ required: true, message: '璇烽�夋嫨鐢熸晥鏃堕棿', trigger: 'change' }],
-  scope: [{ required: true, message: '璇烽�夋嫨閫傜敤鑼冨洿', trigger: 'change' }]
-}
-
-const regulationSearchForm = reactive({
-  title: '',
-  category: ''
-})
-
-// 鍋囨暟鎹�
 const sealApplications = ref([])
-
-const regulations = ref([])
-
-const versionHistory = ref([])
-
-const readStatusList = ref([])
-  // { employee: '闄堝織寮�', department: '閿�鍞儴', readTime: '2025-01-11 10:30:00', confirmTime: '2025-01-11 10:35:00', status: 'confirmed' },
-  // { employee: '鍒橀泤濠�', department: '鎶�鏈儴', readTime: '2025-01-11 14:20:00', confirmTime: '', status: 'unconfirmed' },
-  // { employee: '鐜嬪缓鍥�', department: '璐㈠姟閮�', readTime: '2025-01-12 09:15:00', confirmTime: '2025-01-12 09:20:00', status: 'confirmed' }
 
 // 鐢ㄥ嵃鐢宠鐘舵��
 const getStatusType = (status) => {
@@ -415,7 +186,7 @@
   }
   return statusMap[status] || 'info'
 }
-// 鍒跺害鐘舵��
+// 鐢ㄥ嵃鐢宠鐘舵�佹枃鏈�
 const getStatusText = (status) => {
   const statusMap = {
     pending: '寰呭鎵�',
@@ -430,20 +201,56 @@
     official: '鍏珷',
     contract: '鍚堝悓涓撶敤绔�',
     finance: '璐㈠姟涓撶敤绔�',
+    legal: '娉曚汉绔�',
     tegal: '鎶�鏈笓鐢ㄧ珷'
   }
   return sealTypeMap[sealType] || '鏈煡'
 }
-// 鍒跺害鍒嗙被
-const getCategoryText = (category) => {
-  const categoryMap = {
-    hr: '浜轰簨鍒跺害',
-    finance: '璐㈠姟鍒跺害',
-    safety: '瀹夊叏鍒跺害',
-    tech: '鎶�鏈埗搴�'
+
+// 鐢ㄥ嵃鐢宠琛ㄦ牸鍒楅厤缃紙闇�鍦� getStatusText/getSealTypeText 绛変箣鍚庡畾涔夛級
+const sealTableColumn = ref([
+  { label: '鐢宠缂栧彿', prop: 'applicationNum',},
+  { label: '鐢宠鏍囬', prop: 'title', showOverflowTooltip: true },
+  { label: '鐢宠浜�', prop: 'createUserName', },
+  { label: '鎵�灞為儴闂�', prop: 'department', width: 150 },
+  {
+    label: '鐢ㄥ嵃绫诲瀷',
+    prop: 'sealType',
+    dataType: 'tag',
+    formatData: (v) => getSealTypeText(v),
+    formatType: () => 'info'
+  },
+  { label: '鐢宠鏃堕棿', prop: 'createTime', width: 180 },
+  {
+    label: '鐘舵��',
+    prop: 'status',
+    width: 100,
+    dataType: 'tag',
+    formatData: (v) => getStatusText(v),
+    formatType: (v) => getStatusType(v)
+  },
+  {
+    dataType: 'action',
+    label: '鎿嶄綔',
+    width: 200,
+    fixed: 'right',
+    align: 'center',
+    operation: [
+      { name: '鏌ョ湅', clickFun: (row) => viewSealDetail(row) },
+      {
+        name: '瀹℃壒',
+        clickFun: (row) => approveSeal(row),
+        showHide: (row) => row.status === 'pending'
+      },
+      {
+        name: '鎷掔粷',
+        clickFun: (row) => rejectSeal(row),
+        showHide: (row) => row.status === 'pending'
+      }
+    ]
   }
-  return categoryMap[category] || '鏈煡'
-}
+])
+
 // 鎼滅储鍗扮珷鐢宠
 const searchSealApplications = () => {
   page.current=1
@@ -455,18 +262,8 @@
 const resetSealSearch = () => {
   sealSearchForm.title = ''
   sealSearchForm.status = ''
+  sealSearchForm.applicationNum = ''
   searchSealApplications()
-}
-// 鎼滅储鍒跺害
-const searchRegulations = () => {
-  page.current=1
-  getRegulationList()
-}
-// 閲嶇疆鍒跺害鎼滅储
-const resetRegulationSearch = () => {
-  regulationSearchForm.title = ''
-  regulationSearchForm.category = ''
-  searchRegulations()
 }
 // 鎻愪氦鐢ㄥ嵃鐢宠
 const submitSealApplication = async () => {
@@ -475,105 +272,47 @@
     addSealApplication(sealForm).then(res => {
       if(res.code == 200){
         ElMessage.success('鐢宠鎻愪氦鎴愬姛')
-        showSealApplyDialog.value = false
+        closeSealApplyDialog()
         getSealApplicationList()
         Object.assign(sealForm, {
         applicationNum: '',
         title: '',
         sealType: '',
         reason: '',
+        approveUserId: '',
         urgency: 'normal',
         status: 'pending'
       })
       }
     }).catch(err => {
-      ElMessage.error(err.msg)
+      console.log(err.msg)
     })
   
   } catch (error) {
-    ElMessage.error('璇峰畬鍠勭敵璇蜂俊鎭�')
   }
 }
-// 鏂板
-const handleAdd = () => {
-  operationType.value = 'add'
-  resetRegulationForm()
-  showRegulationDialog.value = true
-}
-
-// 缂栬緫
-const handleEdit = (row) => {
-  operationType.value = 'edit'
-  Object.assign(regulationForm, row)
-  showRegulationDialog.value = true
-}
-// 搴熷純
-const repealEdit = (row) => {
-  operationType.value = 'edit'
-  Object.assign(regulationForm, row)
-  regulationForm.status = 'repealed'
-  ElMessageBox.confirm('纭搴熷純璇ュ埗搴︼紵', '鎻愮ず', {
-    confirmButtonText: '纭畾',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning'
-  }).then(() => {
-    updateRuleManagement(regulationForm).then(res => {
-      if(res.code == 200){
-        ElMessage.success('鍒跺害搴熷純鎴愬姛')
-        // showRegulationDialog.value = false
-        getRegulationList()
-        resetRegulationForm()
-      }
-    })
-  }).catch(() => {
-    ElMessage({
-      type: 'info',
-      message: '宸插彇娑堝簾寮�'
-    })
-  })
-}
-// 鍙戝竷鍒跺害
-const submitRegulation = async () => {
-  try {
-    await regulationFormRef.value.validate()
-    if(operationType.value == 'add'){
-      addRuleManagement(regulationForm).then(res => {
-        if(res.code == 200){
-          ElMessage.success('鍒跺害鍙戝竷鎴愬姛')
-          showRegulationDialog.value = false
-          getRegulationList()
-          resetRegulationForm()
-        }
-      })
-    }else{
-      updateRuleManagement(regulationForm).then(res => {
-        if(res.code == 200){
-          ElMessage.success('鍒跺害缂栬緫鎴愬姛')
-          showRegulationDialog.value = false
-          resetRegulationForm()
-          getRegulationList()
-      }})}
-  }catch(err){
-    ElMessage.error(err.msg)
-  }
-} 
-//閲嶇疆鍒跺害琛ㄥ崟
-const resetRegulationForm = () => {
-  Object.assign(regulationForm, {
-    id: '',
-    regulationNum: '',
+// 鍏抽棴鐢ㄥ嵃鐢宠瀵硅瘽妗�
+const closeSealApplyDialog = () => {
+  // 娓呯┖琛ㄥ崟鏁版嵁
+  Object.assign(sealForm, {
+    applicationNum: '',
     title: '',
-    category: '',
-    content: '',
-    version: '',
-    status: 'active',
-    readCount: 0,
-    effectiveTime: '',
-    scope: [],
-    requireConfirm: false
-})
+    sealType: '',
+    reason: '',
+    approveUserId: '',
+    urgency: 'normal',
+    status: 'pending'
+  })
+  // 娓呴櫎琛ㄥ崟楠岃瘉鐘舵��
+  if (sealFormRef.value) {
+    sealFormRef.value.clearValidate()
+  }
+  showSealApplyDialog.value = false
 }
-
+// 鍏抽棴鐢ㄥ嵃璇︽儏瀵硅瘽妗�
+const closeSealDetailDialog = () => {
+  showSealDetailDialog.value = false
+}
 
 // 鏌ョ湅鐢ㄥ嵃鐢宠璇︽儏
 const viewSealDetail = (row) => {
@@ -582,7 +321,6 @@
 }
 // 瀹℃壒鐢ㄥ嵃鐢宠
 const approveSeal = (row) => {
-  console.log(row)
   ElMessageBox.confirm('纭閫氳繃璇ョ敤鍗扮敵璇凤紵', '鎻愮ず', {
     confirmButtonText: '纭畾',
     cancelButtonText: '鍙栨秷',
@@ -592,6 +330,7 @@
     updateSealApplication(row).then(res => {
       if(res.code == 200){
         ElMessage.success('瀹℃壒閫氳繃')
+        getSealApplicationList()
       }
     })
   })
@@ -607,163 +346,56 @@
     row.status = 'rejected'
     updateSealApplication(row).then(res => {
       if(res.code == 200){
-        ElMessage.success('瀹℃壒鎷掔粷')
+        ElMessage.success('宸叉嫆缁濈敵璇�')
+        getSealApplicationList()
       }
     })
-    ElMessage.success('宸叉嫆缁濈敵璇�')
-  })
-}
-// 鑾峰彇鍦ㄨ亴鍛樺伐鍒楄〃
-const getList = () => {
-  tableLoading.value = true;
-      //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
-  getUserProfile().then(res => {
-    if(res.code == 200){
-      console.log(res.data.userName)
-      currentUser.value = res.data.userName
-    }
-  })
-  staffJoinListPage({staffState: 1}).then(res => {
-    tableLoading.value = false;
-    // tableData.value = res.data.records
-    // //绛涢�夊嚭鍜宑urrentUser鍚屽悕鐨勪汉鍛�
-    tableData.value = res.data.records.filter(item => item.staffName === currentUser.value)
-    console.log("tableData",tableData.value) 
-    page.total = res.data.total;
-      
-    if(tableData.value.length == 0){
-    ElMessage.error('褰撳墠鐢ㄦ埛鏈姞鍏ヤ换浣曢儴闂�')
-    }
-  }).catch(err => {
-    tableLoading.value = false;
-  })
-
-
-};
-
-// 鏌ョ湅鍒跺害鐗堟湰鍘嗗彶
-const viewVersionHistory = (row) => {
-  showVersionHistoryDialog.value = true
-  const params = {
-
-    category: row.category
-  }
-  listRuleManagement(page,params).then(res => {
-    if(res.code == 200){
-      versionHistory.value = res.data.records
-    }
-  })
-}
-// 鏌ョ湅鍒跺害璇︽儏
-const viewRegulation = (row) => {
-  getList()
-  currentRegulationDetail.value = row
-  showRegulationDetailDialog.value = true
-  getReadingStatusByRuleId(row.id).then(res => {
-    if(res.code == 200){
-      readStatusList.value = res.data
-      if(readStatusList.value.length==0 && tableData.value.length>0){
-          const params = {
-          ruleId: row.id,
-          employee: tableData.value[0].staffName,
-          department: tableData.value[0].postJob,
-          status: 'unconfirmed'
-        }
-        addReadingStatus(params).then(res => {
-          if(res.code == 200){
-            ElMessage.success('鍒跺害闃呰鎴愬姛')
-          }
-        })
-      }
-    }
-  })
-  
-}
-// 鏌ョ湅鍒跺害闃呰鐘舵��
-const viewReadStatus = (row) => {
-  showReadStatusDialog.value = true
-  //鏌ョ湅闃呰鐘舵�佸垪琛�
-  getReadingStatusByRuleId(row.id).then(res => {
-    if(res.code == 200){
-      readStatusList.value = res.data
-    }
   })
 }
 
-//纭鏌ョ湅
-const resetForm = (row) => {
-  console.log("row",row)
-  row.readCount = row.readCount + 1
-  
-  updateRuleManagement(row).then(res => {
-    if(res.code == 200){
-      ElMessage.success('鏌ョ湅鏁伴噺淇敼鎴愬姛')
-      //淇敼闃呰鐘舵��
-      //鏍规嵁鍒跺害id鍜屽綋鍓嶇櫥褰曠殑鍛樺伐寰楀埌闃呰鐘舵��
-      // let item = readStatusList.value.filter(item => item.employee == tableData.value[0].staffName )
-      // if(item.length>0){
-      //   item[0].status = 'confirmed',
-      //   item[0].confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0];
-      // }
-      // 绛涢�夊綋鍓嶅憳宸ュ搴旇鍒跺害鐨勯槄璇荤姸鎬佽褰�
-      let statusItem = readStatusList.value.find(item => item.employee === tableData.value[0].staffName && item.ruleId === row.id);
-
-      if (statusItem) {
-        // 濡傛灉鎵惧埌璁板綍锛屾洿鏂扮姸鎬佸拰纭鏃堕棿
-        statusItem.status = 'confirmed';
-        // 鏍煎紡鍖栨椂闂翠负"YYYY-MM-DD HH:mm:ss"鏍煎紡
-        const now = new Date();
-        statusItem.confirmTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`;
-        // statusItem.confirmTime = new Date().toISOString().replace('T', ' ').split('.')[0];
-        
-        updateReadingStatus(statusItem).then(res => {
-          if(res.code == 200){
-            ElMessage.success('鍒跺害闃呰鐘舵�佷慨鏀规垚鍔�')
-          }
-        })
-      }
-
-    }
-  })
+// 瀵煎嚭鐢ㄥ嵃鐢宠
+const { proxy } = getCurrentInstance()
+const handleExport = () => {
+  proxy.download('/sealApplicationManagement/export', { ...sealSearchForm }, '鐢ㄥ嵃鐢宠.xlsx')
 }
-
-
 
 // 鑾峰彇鍗扮珷鐢宠鍒楄〃鏁版嵁
 const getSealApplicationList = async () => {
   tableLoading.value = true
-  listSealApplication(page,sealSearchForm)
+  listSealApplication(page, sealSearchForm)
   .then(res => {
-
     sealApplications.value = res.data.records
-    page.value.total = res.data.total;
-    tableLoading.value = false;
-
+    page.total = res.data.total
+    tableLoading.value = false
   }).catch(err => {
-    tableLoading.value = false;
+    tableLoading.value = false
   })
 }
-// 鑾峰彇瑙勭珷鍒跺害鍒楄〃鏁版嵁
-const getRegulationList = async () => {
-  tableLoading.value = true
-  listRuleManagement(page,regulationSearchForm)
-  .then(res => {
+// 鍒嗛〉鍙樺寲澶勭悊
+const paginationChange = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getSealApplicationList();
+};
 
-    regulations.value = res.data.records
-    // 杩囨护鎺夊凡搴熷純鐨勫埗搴�
-    // regulations.value = res.data.records.filter(item => item.status !== 'repealed')
-    page.value.total = res.data.total;
-    tableLoading.value = false;
-
-  }).catch(err => {
-    tableLoading.value = false;
-  })
-}
+// 鐩戝惉瀵硅瘽妗嗘墦寮�锛岃幏鍙栫敤鎴峰垪琛�
+watch(showSealApplyDialog, (newVal) => {
+  if (newVal) {
+    userListNoPageByTenantId().then((res) => {
+      userList.value = res.data;
+    });
+  }
+});
 
 onMounted(() => {
-  // 鍒濆鍖�
-  getSealApplicationList()
-  getRegulationList()
+  // 璺敱鎼哄甫 applicationNum 鏃讹紝棰勫~骞舵煡璇�
+  if (route.query.applicationNum) {
+    sealSearchForm.applicationNum = String(route.query.applicationNum)
+    page.current = 1
+    getSealApplicationList()
+  } else {
+    getSealApplicationList()
+  }
 })
 </script>
 
@@ -786,26 +418,7 @@
   margin-bottom: 20px;
 }
 
-.mt-20 {
-  margin-top: 20px;
-}
-
 .ml-10 {
   margin-left: 10px;
-}
-
-.regulation-content {
-  background-color: #f5f5f5;
-  padding: 15px;
-  border-radius: 4px;
-  line-height: 1.6;
-  white-space: pre-wrap;
-  height: 200px;
-}
-
-.dialog-footer {
-  display: flex;
-  justify-content: flex-end;
-  gap: 10px;
 }
 </style>

--
Gitblit v1.9.3