From d53ceb426b363a9b4d0a7d8cf331427826550ee0 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Wed, 12 Nov 2025 17:14:10 +0800
Subject: [PATCH] 修改

---
 src/views/work/sealManagement/apply/index.vue                    |  293 +++++++++++++
 src/views/work/sealManagement/sealType/components/editDialog.vue |  174 +++++++
 src/api/sealManage/type/index.js                                 |   32 +
 src/views/work/sealManagement/apply/components/editDialog.vue    |  506 +++++++++++++++++++++++
 src/views/work/sealManagement/sealType/index.vue                 |  186 ++++++++
 src/views/work/sealManagement/proces/index.vue                   |   11 
 src/api/orgStructure/depart.js                                   |    9 
 src/api/sealManage/apply/index.js                                |   39 +
 src/api/sealManage/process/index.js                              |   32 +
 9 files changed, 1,281 insertions(+), 1 deletions(-)

diff --git a/src/api/orgStructure/depart.js b/src/api/orgStructure/depart.js
index 089a827..76ffdff 100644
--- a/src/api/orgStructure/depart.js
+++ b/src/api/orgStructure/depart.js
@@ -8,6 +8,13 @@
         params: params
     })
 }
+export function getDepartById(id) {
+    return request({
+        url: '/system/dept/list/' + id,
+        method: 'get',
+    })
+}
+
 
 export function getDeptTreeList(params) {
     return request({
@@ -102,4 +109,4 @@
         method: 'post',
         data: data
     })
-}
\ No newline at end of file
+}
diff --git a/src/api/sealManage/apply/index.js b/src/api/sealManage/apply/index.js
new file mode 100644
index 0000000..f8dad31
--- /dev/null
+++ b/src/api/sealManage/apply/index.js
@@ -0,0 +1,39 @@
+import request from "@/utils/request";
+
+export function getSealApply(params) {
+    return request({
+        url: '/seal/apply/list',
+        method: 'get',
+        params: params
+    })
+}
+export function reviewApply(data) {
+    return request({
+        url: '/seal/apply/approve',
+        method: 'post',
+        data: data
+    })
+}
+
+export function addSealApply(data) {
+    return request({
+        url: '/seal/apply/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editSealApply(params) {
+    return request({
+        url: `/seal/apply/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delSealApply(data) {
+    return request({
+        url: `/seal/apply/deleted?applyId=${data}`,
+        method: 'get'
+    })
+}
diff --git a/src/api/sealManage/process/index.js b/src/api/sealManage/process/index.js
new file mode 100644
index 0000000..8300df8
--- /dev/null
+++ b/src/api/sealManage/process/index.js
@@ -0,0 +1,32 @@
+import request from "@/utils/request";
+
+export function getSealFlow(params) {
+    return request({
+        url: '/seal/flow/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addSealFlow(data) {
+    return request({
+        url: '/seal/flow/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editSealFlow(params) {
+    return request({
+        url: `/seal/flow/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delSealFlow(data) {
+    return request({
+        url: `/seal/flow/deleted?flowId=${data}`,
+        method: 'get'
+    })
+}
diff --git a/src/api/sealManage/type/index.js b/src/api/sealManage/type/index.js
new file mode 100644
index 0000000..7f826d0
--- /dev/null
+++ b/src/api/sealManage/type/index.js
@@ -0,0 +1,32 @@
+import request from "@/utils/request";
+
+export function getSealType(params) {
+    return request({
+        url: '/seal/type/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addSealType(data) {
+    return request({
+        url: '/seal/type/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editSealType(params) {
+    return request({
+        url: `/seal/type/update`,
+        method: 'post',
+        data: params
+    })
+}
+
+export function delSealType(data) {
+    return request({
+        url: `/seal/type/deleted?sealTypeId=${data}`,
+        method: 'get'
+    })
+}
diff --git a/src/views/work/sealManagement/apply/components/editDialog.vue b/src/views/work/sealManagement/apply/components/editDialog.vue
new file mode 100644
index 0000000..4d92244
--- /dev/null
+++ b/src/views/work/sealManagement/apply/components/editDialog.vue
@@ -0,0 +1,506 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="900px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules"  label-width="130px" >
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
+              <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
+                <el-option
+                    v-for="item in state.companyList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="申请人:"  prop="applyUserName">
+              <el-input disabled v-model="state.form.applyUserName"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="部门:" prop="applyDeptName">
+              <el-input disabled v-model="state.form.applyDeptName"  style="width: 100%"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="申请日期:" prop="applyTime">
+              <el-date-picker
+                  disabled
+                  v-model="state.form.applyTime"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="印章类型:" prop="sealId">
+              <el-select v-model="state.form.sealId" placeholder="请选择"  :disabled="title == '查看' ">
+                <el-option
+                    v-for="item in state.sealTypeList"
+                    :key="item.id"
+                    :label="item.sealName"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="盖章份数:" prop="amount">
+              <el-input :disabled="title == '查看' "  v-model="state.form.amount" @input="state.form.amount = state.form.amount.replace(/[^0-9]/g,'')" placeholder="盖章份数"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="用章日期:" prop="useSealTime">
+              <el-date-picker
+                  :disabled="title == '查看' "
+                  v-model="state.form.useSealTime"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="15">
+            <el-form-item label="用章事由:" prop="useSealCause">
+              <el-input :disabled="title == '查看' "  v-model="state.form.useSealCause" type="textarea" :rows="3" placeholder="用章事由"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="9">
+            <el-form-item label="是否为红头文件:" prop="isRed">
+              <el-select v-model="state.form.isRed" placeholder="请选择" :disabled="title == '查看' ">
+                <el-option
+                    v-for="item in state.redList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="附件" prop="files">
+              <el-upload :disabled="title == '查看' " accept=".jpg,.jpeg,.png,.doc,.docx,.pdf,.xls,.xlsx,.ppt,.pptx" style="width: 100%" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip"  v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" :on-preview="openFile">
+                <el-button type="primary">点击上传</el-button>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24" style="margin-left: 50px">
+            <span style="font-size: 19px;font-weight: 600;">签字意见</span>
+            <el-table :data="state.form.flows" :border="true" style="width: 90%;margin-top: 10px">
+              <el-table-column label="流程名称" prop="flowName" width="220" align="center"></el-table-column>
+              <el-table-column label="内容" align="center">
+                <template #default="scope">
+                  <span>{{scope.row.approveDeptName}}/{{scope.row.approveUserName}} {{scope.row.approveTime}} {{scope.row.approveContent}}</span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer v-if="title !== '查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {onMounted, reactive, ref, toRefs} from 'vue'
+import Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+import {addObjective, editObject, getDept} from "@/api/qualityObjectives/object";
+import {listUser} from "@/api/system/user";
+import moment from "moment";
+import {getToken} from "@/utils/auth";
+import {getDepartById, getDeptInfo} from "@/api/orgStructure/depart";
+import {getSealType} from "@/api/sealManage/type";
+import {addSealApply, editSealApply} from "@/api/sealManage/apply";
+import {getSealFlow} from "@/api/sealManage/process";
+import {renderAsync} from "docx-preview";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+  form: {
+    id: '',
+    companyId: null,
+    applyUserId: null,
+    applyDeptId: null,
+    applyTime: "",
+    sealId: null,
+    amount: null,
+    useSealTime: "",
+    useSealCause: "",
+    isRed: "",
+    nextCheck: "",
+    flows:[],
+    files:[],
+    applyUserName:'',
+    applyDeptName:''
+  },
+  sealTypeList:[],
+  redList:[
+    {
+      id: 0,
+      name: '否'
+    },
+    {
+      id: 1,
+      name: '是'
+    },
+  ],
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: getToken()
+  },
+  rules: {
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    sealId: [{ required: true, message: '请选择用章类型', trigger: 'blur' }],
+    amount: [{ required: true, message: '请输入盖章份数', trigger: 'blur' }],
+    useSealTime:  [{ required: true, message: '请选择用章日期', trigger: 'blur' }],
+    useSealCause:[{ required: true, message: '请输入用章事由', trigger: 'blur' }],
+    files:[{ required: true, message: '请上传附件', trigger: 'blur' }],
+    // nextCheck: "",
+    // flows:[],
+  },
+  isAdmin: false,
+  companyList: [],
+  deptList: [],
+  fileList: [],
+})
+
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  state.form.companyName = userInfo.companyName
+  state.form.companyId = userInfo.companyId
+  if(type=='add'){
+    //申请人信息
+    state.form.applyUserId = userInfo.id
+    state.form.applyUserName = userInfo.name
+    state.form.applyDeptId = userInfo.deptId
+    state.form.applyDeptName = userInfo.deptName
+    const nowDate = new Date()
+    state.form.applyTime = moment(nowDate).format('YYYY-MM-DD')
+    const obj = {
+      flowName: '申请人',
+      approveUserId: state.form.applyUserId,
+      approveDeptId: state.form.applyDeptId,
+      approveUserName: state.form.applyUserName,
+      approveDeptName: state.form.applyDeptName,
+      approveContent: "提交",
+      approveTime: state.form.applyTime,
+      approveStatus: 1,
+      status: null
+    }
+    state.form.flows[0]=obj
+    //部门负责人信息
+    await getLeaderInfo()
+    await getFlowList()
+  }
+  if(state.isAdmin){
+    state.companyList = companyList
+    state.form.companyId = null
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.form = JSON.parse(JSON.stringify(value));
+    state.form.compilationBy = state.form.compilationId
+    state.form.leadBy = state.form.leadId
+    state.form.qualityBy = state.form.qualityId
+    if(state.isAdmin){
+      state.form.companyId = value.companyId
+      state.form.companyName = value.companyName
+    }
+    state.fileList = value.files.map(i => {
+      return {
+        name: i.fileName,
+        path: i.filePath
+      }
+    })
+  }
+  await getSealTypeList()
+
+  dialogVisible.value = true;
+}
+const getLeaderInfo = async ()=> {
+  const res = await getDeptInfo(state.form.applyDeptId)
+  if(res.code === 200){
+
+    const obj = {
+      flowName: '部门负责人',
+      approveUserId: res.data.leaderUserId,
+      approveDeptId: res.data.deptId,
+      approveUserName: res.data.leaderName,
+      approveDeptName: res.data.deptName,
+      approveContent: '',
+      approveTime: null,
+      approveStatus: null,
+      status: null
+    }
+    state.form.flows[1]=obj
+    state.form.nextCheck = res.data.leaderUserId
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
+const addObject = () => {
+  state.form.qualityTargets.push({})
+}
+const getSealTypeList = async () => {
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getSealType(param)
+  if(res.code === 200){
+    state.sealTypeList = res.data.list
+  }else {
+    ElMessage.warning(res.message)
+  }
+}
+const getFlowList = async () => {
+  const param = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: state.form.companyId
+  }
+  const res = await getSealFlow(param)
+  if(res.code === 200){
+    res.data.forEach(item => {
+      item.approveDeptName = item.deptName
+    })
+    if(title.value == '新增'){
+      state.form.flows = state.form.flows.concat(res.data)
+    }
+
+
+  }else {
+    ElMessage.warning(res.message)
+  }
+}
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      console.log('sta',state.form)
+      state.form.flows[0].approveTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+      debugger
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addSealApply(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editSealApply(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    companyId: null,
+    applyUserId: null,
+    applyDeptId: null,
+    applyTime: "",
+    sealId: null,
+    amount: null,
+    useSealTime: "",
+    useSealCause: "",
+    isRed: "",
+    nextCheck: "",
+    flows:[],
+    files:[],
+    applyUserName:'',
+    applyDeptName:''
+  }
+  state.peopleList = []
+  state.companyList = []
+  state.fileList = []
+
+}
+const handleDelete = (val) => {
+  state.form.qualityTargets = state.form.qualityTargets.filter(item=> item != val)
+}
+
+const handleAvatarSuccess = (response,uploadFile) => {
+  if(response.code == 200){
+    state.form.files = state.fileList.map(item => {
+      return {
+        fileName: item.response ? item.response?.data.originName: item.name,
+        filePath: item.response ? item.response?.data.path: item.path
+      }
+    })
+  }else{
+    // state.fileList = []
+    // state.form.files = []
+    ElMessage({
+      type: 'warning',
+      message: response.message
+    })
+  }
+}
+
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+const handleRemove = async (file, uploadFiles) => {
+  state.form.files = state.fileList.map(item => {
+    return {
+      fileName: item.response ? item.response?.data.originName: item.name,
+      filePath: item.response ? item.response?.data.path: item.path
+    }
+  })
+}
+const selectValue = (val) => {
+  state.peopleList.forEach(item => {
+    if(item.name === val){
+      state.form.compilationBy = item.id
+    }
+  })
+}
+
+const selectValueCom = (val) => {
+  state.form.sealId = null
+  state.companyList.forEach(item => {
+    if(item.id === val){
+      state.form.companyName = item.name
+    }
+  })
+  getSealTypeList()
+  getFlowList()
+}
+
+const openFile = async(file)=>{
+  const path = file.path
+  const ext = path.split('.').pop().toLowerCase();
+  if (ext === 'doc' || ext === 'xls' || ext === 'xlsx'|| ext === 'ppt'|| ext === 'pptx')  {
+    ElMessageBox.confirm('暂不支持线上预览.doc文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
+      window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
+    }).catch(() => {
+      console.log('取消预览')
+    });
+    return
+  }else if(ext === 'docx'){
+    try {
+      // 1. 获取文件
+      const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path);
+      const arrayBuffer = await response.arrayBuffer();
+      // 2. 创建新窗口
+      const win = window.open('', '_blank')
+      win.document.write(`
+      <!DOCTYPE html>
+      <html>
+        <head>
+          <title>预览</title>
+          <style>
+            body { margin: 20px; font-family: Arial; }
+            .docx-container { width: 100%; height: 100%; }
+          </style>
+        </head>
+        <body>
+          <div id="container" class="docx-container"></div>
+        </body>
+      </html>
+    `);
+      // 3. 渲染 DOCX
+      await renderAsync(arrayBuffer, win.document.getElementById('container'));
+
+    } catch (error) {
+      console.error('预览失败:', error);
+      alert(`预览失败: ${error.message}`);
+    }
+  }else {
+    window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
+  }
+
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/work/sealManagement/apply/index.vue b/src/views/work/sealManagement/apply/index.vue
new file mode 100644
index 0000000..4fab369
--- /dev/null
+++ b/src/views/work/sealManagement/apply/index.vue
@@ -0,0 +1,293 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap;">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+              v-hasPermi="['sealApply:list:add']"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-radio-group v-model="data.tabName" style="margin-bottom: 30px" @change="changBtn">
+      <el-radio-button label="apply" >我申请的</el-radio-button>
+      <el-radio-button label="approval">待审批的</el-radio-button>
+    </el-radio-group>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true"  @selection-change="handleSelectionChange">
+<!--      <el-table-column type="selection" width="55" />-->
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="印章类型" prop="sealName" align="center"  />
+      <el-table-column label="用章事由" prop="useSealCause" align="center"  />
+      <el-table-column label="申请人" prop="applyUserName" align="center"  />
+      <el-table-column label="用章时间" prop="useSealTime" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160" >
+        <template #default="scope">
+          <div v-if="data.tabName === 'apply'">
+            <el-button link type="primary"  @click="openDialog('review',scope.row)">查看</el-button>
+            <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['sealApply:list:edit']">编辑</el-button>
+            <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['sealApply:list:del']">删除</el-button>
+          </div>
+          <div v-else>
+            <el-button link type="primary"  @click="openDialog('review',scope.row)">查看</el-button>
+            <el-button link type="primary"  @click="openApplyDialog(scope.row)" v-hasPermi="['sealApply:list:apply']">审批</el-button>
+          </div>
+
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+    <el-dialog
+        v-model="data.showDialog"
+        width="500px"
+        :before-close="handleClose"
+    >
+      <el-form :model="data.applyForm" size="default" ref="noticeRef" label-width="110px" >
+        <el-form-item label="审批意见:" prop="approveStatus" >
+          <el-radio-group v-model="data.applyForm.approveStatus" >
+            <el-radio :label="1">同意</el-radio>
+            <el-radio :label="2">不同意</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <template #footer >
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delObject, getObjectPage} from "@/api/qualityObjectives/object";
+import {delSealApply, getSealApply, reviewApply} from "@/api/sealManage/apply";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+    nextCheck:null,
+    applyUserId: null
+  },
+  tabName:'apply',
+  companyList: [],
+  isAdmin: false,
+  userId: null,
+  showDialog: false,
+  applyForm: {
+    useSealId: null,
+    approveUserId: null,
+    approveStatus: null
+  }
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  data.userId = userInfo.id
+  data.queryParams.applyUserId = userInfo.id
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const param = {
+    pageNum: data.queryParams.pageNum,
+    pageSize: data.queryParams.pageSize,
+    companyId: data.queryParams.companyId,
+    nextCheck: data.tabName === 'approval' ?data.userId : null,
+    applyUserId:data.tabName === 'apply' ?data.queryParams.applyUserId : null,
+  }
+  const res = await getSealApply(param);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const selectValue = (val) => {
+  data.companyList.forEach(item => {
+    if(item.name === val){
+      data.queryParams.companyId = item.id
+    }
+  })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if(data.isAdmin){
+    data.queryParams = {
+      companyId: '',
+      pageNum: 1,
+      pageSize: 10,
+      nextCheck:null,
+      applyUserId: null
+    }
+    choosedData.value = []
+    data.companyList = [];
+    getCompanyList()
+  }else {
+    data.queryParams = {
+      companyId: data.queryParams.companyId,
+      pageNum: 1,
+      pageSize: 10,
+      nextCheck:null,
+      applyUserId: null
+    }
+  }
+  getList();
+
+}
+
+const changBtn = () => {
+    getList()
+}
+const handleSelectionChange = (val) => {
+  choosedData.value = val
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delSealApply(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const openApplyDialog = (val)=>{
+  data.applyForm = {
+    useSealId: val.id,
+    approveUserId: data.userId,
+    approveStatus: null
+  }
+  data.showDialog = true
+}
+const handleClose = () => {
+  data.applyForm = {
+    useSealId: null,
+    approveUserId: null,
+    approveStatus: null
+  }
+  data.showDialog = false
+}
+const onSubmit = async () => {
+  const res = await reviewApply(data.applyForm)
+  if(res.code === 200){
+    ElMessage({
+      type: 'success',
+      message: '审批成功'
+    });
+    await getList();
+    data.showDialog = false
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/sealManagement/proces/index.vue b/src/views/work/sealManagement/proces/index.vue
new file mode 100644
index 0000000..c3826a4
--- /dev/null
+++ b/src/views/work/sealManagement/proces/index.vue
@@ -0,0 +1,11 @@
+<script setup>
+
+</script>
+
+<template>
+流程
+</template>
+
+<style scoped lang="scss">
+
+</style>
diff --git a/src/views/work/sealManagement/sealType/components/editDialog.vue b/src/views/work/sealManagement/sealType/components/editDialog.vue
new file mode 100644
index 0000000..1fc1398
--- /dev/null
+++ b/src/views/work/sealManagement/sealType/components/editDialog.vue
@@ -0,0 +1,174 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="500px"
+        :before-close="handleClose"
+    >
+      <el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="110px" >
+        <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
+          <el-select v-model="state.noticeForm.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
+            <el-option
+                v-for="item in state.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="印章名称:" prop="sealName" >
+          <el-input  v-model="state.noticeForm.sealName" :disabled="title == '查看'"  placeholder="印章名称"></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="title != '查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+import {addSealType, editSealType} from "@/api/sealManage/type";
+
+
+const emit = defineEmits(["getList"]);
+
+const dialogVisible = ref(false);
+const title = ref("");
+const noticeRef = ref();
+const fileList = ref([]);
+const state = reactive({
+  noticeForm: {
+    id: '',
+    companyId:null,
+    sealName:''
+  },
+  formRules:{
+    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+    sealName: [{ required: true, message: '请输入印章名称', trigger: 'blur' }],
+  },
+  isAdmin: false,
+  companyList: []
+
+})
+
+onMounted(() => {
+
+});
+const openDialog = async (type, value,companyList) => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  state.isAdmin = userInfo.userType === 0;
+  if(state.isAdmin){
+    state.companyList = companyList
+  }
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+  if(type === 'edit' || type === 'review') {
+    state.noticeForm = JSON.parse(JSON.stringify(value))
+    if(state.isAdmin){
+      state.noticeForm.companyId = value.companyId
+      state.noticeForm.companyName = value.companyName
+    }
+  }
+  if(type === 'add'){
+    reset()
+  }
+  dialogVisible.value = true;
+}
+
+
+const onSubmit = async () => {
+  if(!state.isAdmin){
+    const userInfo = JSON.parse(Cookies.get('userInfo'))
+    state.noticeForm.companyId = userInfo.companyId
+  }
+  const valid = await noticeRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await addSealType(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑') {
+      const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+      const res = await editSealType(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      reset();
+      noticeRef.value.clearValidate();
+      dialogVisible.value = false;
+    }
+  }
+}
+
+const handleClose = () => {
+
+  // reset()
+  noticeRef.value.clearValidate();
+  dialogVisible.value = false;
+}
+const reset = () => {
+  state.noticeForm = {
+    id: '',
+    companyId:null,
+    sealName:''
+  }
+}
+
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+.reviewTable {
+  :deep(table){
+    border: 1px solid #ccc;
+    text-align: center;
+  }
+  :deep(table td){
+    border: 1px solid #ccc;
+    text-align: center;
+    padding: 0 5px;
+  }
+  :deep(table th){
+    border: 1px solid #ccc;
+  }
+}
+
+
+</style>
diff --git a/src/views/work/sealManagement/sealType/index.vue b/src/views/work/sealManagement/sealType/index.vue
new file mode 100644
index 0000000..81d6ea5
--- /dev/null
+++ b/src/views/work/sealManagement/sealType/index.vue
@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <div style="margin-bottom: 10px">
+      <el-form style="display: flex;flex-wrap: wrap">
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+              v-hasPermi="['sealType:list:add']"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="单位名称:" v-if="data.isAdmin" style="margin-left: 20px">
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" filterable clearable>
+            <el-option
+                v-for="item in data.companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="data.isAdmin">
+          <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+          <el-button plain @click="reset">重置</el-button>
+        </el-form-item>
+
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+      <el-table-column label="印章名称" prop="sealName" align="center">
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary"  @click="openDialog('review',scope.row)" >查看</el-button>
+          <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['sealType:list:edit']">编辑</el-button>
+          <el-button link type="danger"  @click="handleDelete(scope.row)" v-hasPermi="['sealType:list:del']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <div class="pag-container">
+      <el-pagination
+          v-model:current-page="data.queryParams.pageNum"
+          v-model:page-size="data.queryParams.pageSize"
+          :page-sizes="[10,15,20,25]"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <editDialog ref="noticeRef" @getList = "getList"></editDialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import editDialog from "./components/editDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
+import {delPolicy, getPolicy} from "@/api/companyInfo/policy";
+import {delSealType, getSealType} from "@/api/sealManage/type";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null,
+  },
+  companyList: [],
+  isAdmin: false,
+  companyName: ''
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  console.log("userInfo",userInfo)
+  data.isAdmin = userInfo.userType === 0;
+  if(data.isAdmin){
+    data.queryParams.companyId = null
+  }else {
+    data.queryParams.companyId = userInfo.companyId
+  }
+  getList();
+  if(data.isAdmin){
+    getCompanyList()
+  }
+});
+const getList = async () => {
+  loading.value = true;
+  const res = await getSealType(data.queryParams);
+  if(res.code === 200){
+    dataList.value = res.data.list
+    total.value = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false;
+  loading.value = false;
+
+}
+
+const searchClick = () => {
+  getList();
+}
+const openDialog = (type, value) => {
+  noticeRef.value.openDialog(type, value,data.companyList);
+}
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    // data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const handleSizeChange = (val) => {
+  data.queryParams.pageSize = val
+  getList()
+}
+const handleCurrentChange = (val) => {
+  data.queryParams.pageNum = val
+  getList()
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    companyId: null,
+    pageNum: 1,
+    pageSize: 10,
+  }
+  data.companyName = ''
+  data.companyList = [];
+  getList();
+  getCompanyList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delSealType(val.id);
+        if(res.code === 200){
+          ElMessage({
+            type: 'success',
+            message: '删除成功'
+          });
+          getList();
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+  float: right;
+  margin-top: 10px;
+}
+</style>

--
Gitblit v1.9.2