多体系建设信息化条统-前端
zhouwx
2025-11-12 d53ceb426b363a9b4d0a7d8cf331427826550ee0
修改
1 files modified
8 files added
1282 ■■■■■ changed files
src/api/orgStructure/depart.js 9 ●●●● patch | view | raw | blame | history
src/api/sealManage/apply/index.js 39 ●●●●● patch | view | raw | blame | history
src/api/sealManage/process/index.js 32 ●●●●● patch | view | raw | blame | history
src/api/sealManage/type/index.js 32 ●●●●● patch | view | raw | blame | history
src/views/work/sealManagement/apply/components/editDialog.vue 506 ●●●●● patch | view | raw | blame | history
src/views/work/sealManagement/apply/index.vue 293 ●●●●● patch | view | raw | blame | history
src/views/work/sealManagement/proces/index.vue 11 ●●●●● patch | view | raw | blame | history
src/views/work/sealManagement/sealType/components/editDialog.vue 174 ●●●●● patch | view | raw | blame | history
src/views/work/sealManagement/sealType/index.vue 186 ●●●●● patch | view | raw | blame | history
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
    })
}
}
src/api/sealManage/apply/index.js
New file
@@ -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'
    })
}
src/api/sealManage/process/index.js
New file
@@ -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'
    })
}
src/api/sealManage/type/index.js
New file
@@ -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'
    })
}
src/views/work/sealManagement/apply/components/editDialog.vue
New file
@@ -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>
src/views/work/sealManagement/apply/index.vue
New file
@@ -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>
src/views/work/sealManagement/proces/index.vue
New file
@@ -0,0 +1,11 @@
<script setup>
</script>
<template>
流程
</template>
<style scoped lang="scss">
</style>
src/views/work/sealManagement/sealType/components/editDialog.vue
New file
@@ -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>
src/views/work/sealManagement/sealType/index.vue
New file
@@ -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>