Просмотр исходного кода

feat: 新增印章使用记录功能

新增印章使用记录列表页面,集成到印章详情弹窗中,支持按关键词、使用部门和使用人查询。同时修正印章禁用接口请求方式为GET,优化上传组件和印章管理列表的显示
yusheng 1 месяц назад
Родитель
Сommit
b20d2c8c85

+ 13 - 2
src/api/sealManagement/index.js

@@ -45,7 +45,7 @@ export async function deleteSeal(id) {
  * @returns {Promise}
  */
 export async function disableSeal(id) {
-  const res = await request.put(`/seal/management/disable/${id}`);
+  const res = await request.get(`/seal/management/disable/${id}`);
   if (res.data.code == 0) {
     return res.data.data;
   }
@@ -103,7 +103,18 @@ export async function getSealPage(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
-
+/**
+ * 分页查询印章使用列表
+ * @param {Object} params 查询参数
+ * @returns {Promise}
+ */
+export async function getUsageRecordPage(data) {
+  const res = await request.post(`/seal/management/usageRecord/page`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
 /**
  * 更新印章
  * @param {Object} data 印章数据

+ 2 - 2
src/components/upload/WithViewNew.vue

@@ -18,11 +18,11 @@
         :http-request="handlSuccess"
         :multiple="false"
       >
-        <el-button type="text" v-if="disabled"
+        <el-button type="text" v-if="!disabled"
           >上传{{ assetName }}图片</el-button
         >
       </el-upload>
-      <el-button type="text" v-if="disabled" @click="clearImg"
+      <el-button type="text" v-if="!disabled" @click="clearImg"
         >清除图片</el-button
       >
     </div>

+ 39 - 24
src/views/sealManagement/index.vue

@@ -29,13 +29,13 @@
               @click="handleAdd"
               >新增</el-button
             >
-            <el-button
+            <!-- <el-button
               type="danger"
               size="small"
               icon="el-icon-delete"
               @click="handleBatchDelete"
               >删除</el-button
-            >
+            > -->
           </template>
           <template v-slot:imgUrl="{ row }">
             <el-image
@@ -53,12 +53,12 @@
               >{{ row.code }}</el-link
             >
           </template>
-          <template v-slot:action="{ row }" >
+          <template v-slot:action="{ row }">
             <el-link
               type="primary"
               :underline="false"
               @click="handleEdit(row)"
-              v-if="[0, 3].includes(row.approvalStatus)&&row.isLatest==1"
+              v-if="[0, 3].includes(row.approvalStatus) && row.isLatest == 1"
               >修改</el-link
             >
             <el-link
@@ -66,7 +66,7 @@
               :underline="false"
               @click="handleSubmit(row)"
               style="margin-left: 8px"
-              v-if="[0, 3].includes(row.approvalStatus)&&row.isLatest==1"
+              v-if="[0, 3].includes(row.approvalStatus) && row.isLatest == 1"
               >提交</el-link
             >
             <el-link
@@ -74,21 +74,25 @@
               :underline="false"
               @click="handleDelete(row)"
               style="margin-left: 8px"
-              v-if="[0, 3].includes(row.approvalStatus)&&row.isLatest==1"
+              v-if="[0, 3].includes(row.approvalStatus) && row.isLatest == 1"
               >删除</el-link
             >
             <el-link
               type="primary"
               :underline="false"
               @click="handleModify(row)"
-              v-if="[2].includes(row.approvalStatus)&&row.isLatest==1"
+              v-if="[2].includes(row.approvalStatus) && row.isLatest == 1"
               >变更</el-link
             >
             <el-link
               type="danger"
               :underline="false"
               @click="handleStop(row)"
-              v-if="[2].includes(row.approvalStatus) && row.status == 1&&row.isLatest==1"
+              v-if="
+                [2].includes(row.approvalStatus) &&
+                row.status == 1 &&
+                row.isLatest == 1
+              "
               style="margin-left: 8px"
               >停用</el-link
             >
@@ -119,6 +123,7 @@
   } from '@/api/sealManagement';
   import { reviewStatus } from '@/enum/dict';
   import processSubmitDialog from '@/components/processSubmitDialog/processSubmitDialog.vue';
+  import { getUserPage } from '@/api/system/organization';
 
   export default {
     components: {
@@ -128,6 +133,7 @@
     data() {
       return {
         processSubmitDialogFlag: false,
+        userList: [],
         // 表格列配置
         columns: [
           {
@@ -180,7 +186,7 @@
             showOverflowTooltip: true
           },
           {
-            prop: 'holder',
+            prop: 'sealHolderName',
             label: '印章持有人',
             align: 'center',
             minWidth: 100,
@@ -253,42 +259,51 @@
         return [
           {
             label: '印章编码',
-            value: 'sealCode',
+            value: 'code',
             type: 'input',
-            width: 160,
             placeholder: '请输入'
           },
           {
             label: '印章名称',
-            value: 'sealName',
+            value: 'name',
             type: 'input',
-            width: 160,
             placeholder: '请输入'
           },
           {
             label: '印章类型',
             value: 'type',
             type: 'select',
-            width: 120,
             placeholder: '请选择',
             planList: [
-              { value: '', label: '全部' },
-              { label: '法律效力章', value: '法律效力章' },
-              { label: '财务专用章', value: '财务专用章' },
-              { label: '业务专用章', value: '业务专用章' },
-              { label: '内部管理章', value: '内部管理章' }
+              { label: '法律效力章', value: '1' },
+              { label: '财务专用章', value: '2' },
+              { label: '业务专用章', value: '3' },
+              { label: '内部管理章', value: '4' }
             ]
           },
           {
             label: '印章持有人',
-            value: 'holder',
-            type: 'input',
-            width: 160,
-            placeholder: '请输入'
+            value: 'sealHolderId',
+            type: 'select',
+            placeholder: '请选择',
+            planList: this.userList.map((item) => {
+              return {
+                label: item.name,
+                value: item.id
+              };
+            })
           }
         ];
       }
     },
+    created() {
+      // 格式化公司数据
+      getUserPage({
+        size: 999
+      }).then((res) => {
+        this.userList = res.list;
+      });
+    },
     methods: {
       // 新增
       handleAdd() {
@@ -395,7 +410,7 @@
       },
       // 表格数据源
       async datasource({ page, limit, where }) {
-        return await getSealPage({ page, limit, ...where });
+        return await getSealPage({ pageNum: page, size: limit, ...where });
       }
     }
   };

+ 210 - 0
src/views/sealManagement/list.vue

@@ -0,0 +1,210 @@
+<template>
+  <div class="seal-management">
+    <el-card shadow="never" class="config-card">
+      <!-- 搜索区域 -->
+      <div class="search-area">
+        <seek-page
+          :seekList="seekList"
+          @search="handleSearch"
+          @reset="handleReset"
+          :formLength="3"
+        />
+      </div>
+
+      <!-- 列表视图 -->
+      <div class="list-view">
+        <ele-pro-table
+          ref="table"
+          row-key="id"
+          :columns="columns"
+          :datasource="datasource"
+          :cache-key="cacheKeyUrl"
+          height="300px"
+        >
+        </ele-pro-table>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import { getUsageRecordPage } from '@/api/sealManagement';
+  import { getUserPage, listOrganizations } from '@/api/system/organization';
+  export default {
+    components: {},
+    props: { sealId: '' },
+    data() {
+      return {
+        userList: [],
+        groupList: [],
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 55,
+            align: 'center'
+          },
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+
+          {
+            prop: 'sealName',
+            label: '印章名称',
+            align: 'center',
+            minWidth: 130,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'documentCode',
+            label: '关联单据编码',
+            align: 'center',
+            minWidth: 150,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'documentName',
+            label: '关联单据名称',
+            align: 'center',
+            minWidth: 120,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'usageObjectName',
+            label: '使用对象',
+            align: 'center',
+            minWidth: 120,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'usageDeptName',
+            label: '使用部门',
+            align: 'center',
+            minWidth: 120,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'userName',
+            label: '使用人',
+            align: 'center',
+            minWidth: 120
+          },
+          {
+            prop: 'useTime',
+            label: '使用时间',
+            align: 'center',
+            minWidth: 160,
+
+            showOverflowTooltip: true
+          }
+        ],
+        cacheKeyUrl: 'seal-management-list'
+      };
+    },
+    computed: {
+      seekList() {
+        return [
+          {
+            label: '关键词',
+            value: 'keyWord',
+            type: 'input',
+            placeholder: '单据编码/名称、使用对象名称'
+          },
+          {
+            label: '使用部门',
+            value: 'usageDeptId',
+            type: 'selectTree',
+            planList: this.groupList,
+            placeholder: '请输入'
+          },
+          {
+            label: '使用人',
+            value: 'userId',
+            type: 'select',
+            placeholder: '请选择',
+            planList: this.userList.map((item) => {
+              return {
+                label: item.name,
+                value: item.id
+              };
+            })
+          }
+        ];
+      }
+    },
+    created() {
+      // 格式化公司数据
+      getUserPage({
+        size: 999
+      }).then((res) => {
+        this.userList = res.list;
+      });
+      listOrganizations().then((list) => {
+        this.groupList = this.$util.toTreeData({
+          data: list,
+          idField: 'id',
+          parentIdField: 'parentId'
+        });
+      });
+    },
+    methods: {
+      // 搜索
+      handleSearch(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+      // 重置
+      handleReset() {
+        this.$refs.table.reload({ page: 1 });
+      },
+      // 表格数据源
+      async datasource({ page, limit, where }) {
+        return await getUsageRecordPage({
+          pageNum:page,
+          size:limit,
+          ...where,
+          sealId: this.sealId
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .seal-management {
+    .config-card {
+      height: calc(100vh - 100px);
+
+      ::v-deep .el-card__body {
+        height: 100%;
+        padding: 15px;
+        display: flex;
+        flex-direction: column;
+      }
+    }
+
+    // 搜索区域
+    .search-area {
+      margin-bottom: 15px;
+      padding-bottom: 15px;
+      border-bottom: 1px solid #ebeef5;
+    }
+
+    // 列表视图
+    .list-view {
+      flex: 1;
+      overflow: hidden;
+
+      ::v-deep .ele-pro-table {
+        .el-table {
+          border: 1px solid #ebeef5;
+          border-radius: 4px;
+        }
+      }
+    }
+  }
+</style>

+ 6 - 3
src/views/sealManagement/sealDialog.vue

@@ -2,7 +2,7 @@
   <ele-modal
     :visible="visible"
     :title="title"
-    width="1200px"
+    width="65%"
     :destroy-on-close="true"
     @update:visible="updateVisible"
     :maxable="true"
@@ -206,6 +206,7 @@
       v-if="activeComp == 'bpm' && form.processInstanceId"
       :id="form.processInstanceId"
     ></bpmDetail>
+    <list v-if="activeComp == 'list' && form.id" :sealId="form.id"></list>
   </ele-modal>
 </template>
 
@@ -219,6 +220,7 @@
   import addUser from '@/views/system/user/components/add.vue';
   import WithView from '@/components/upload/WithViewNew.vue';
   import bpmDetail from '@/views/bpm/processInstance/businessDetail.vue';
+  import list from './list.vue';
 
   const defaultForm = {
     code: '',
@@ -239,14 +241,15 @@
   };
 
   export default {
-    components: { addUser, WithView, bpmDetail },
+    components: { addUser, WithView, bpmDetail, list },
     name: 'SealDialog',
     data() {
       return {
         activeComp: 'main',
         tabOptions: [
           { key: 'main', name: '详情' },
-          { key: 'bpm', name: '流程详情' }
+          { key: 'bpm', name: '流程详情' },
+          { key: 'list', name: '使用记录' }
         ],
         visible: false,
         title: '新增',