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