From 3533b11c19b628e45f26d25bedd7c82e0aa2037a Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期五, 14 三月 2025 17:24:24 +0800 Subject: [PATCH] 接口对接 --- src/api/signAgreement/signType.js | 34 ++ src/store/modules/user.js | 1 src/views/templateManage/components/createSign.vue | 64 ++- src/views/templateManage/index.vue | 108 ++---- src/api/signAgreement/signProject.js | 51 +++ src/api/signAgreement/template.js | 35 ++ src/views/templateManage/components/templateDialog.vue | 189 +++++++--- src/views/signProject/components/circulation.vue | 67 ++- src/api/menu.js | 2 .env.development | 2 src/views/signProject/index.vue | 143 +++++--- package.json | 6 src/views/signTypeManage/components/addDialog.vue | 18 src/views/signProject/components/viewPdf.vue | 66 +++ src/views/signProject/components/record.vue | 105 +++-- src/views/signTypeManage/index.vue | 73 ++-- 16 files changed, 636 insertions(+), 328 deletions(-) diff --git a/.env.development b/.env.development index 083f646..3248597 100644 --- a/.env.development +++ b/.env.development @@ -7,7 +7,7 @@ # 纳米所安全责任书签署/开发环境 #小董 -VITE_APP_BASE_API = 'http://192.168.2.21:8085/signature' +VITE_APP_BASE_API = 'http://192.168.2.30:8085/signature' #线上 #VITE_APP_BASE_API = 'http://8.137.115.153:85/api' diff --git a/package.json b/package.json index 45ae4ef..7293990 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/plugin-upload-attachment": "^1.1.0", "axios": "0.27.2", + "crypto-browserify": "^3.12.1", "docxtemplater": "^3.54.0", "echarts": "5.4.0", "element-plus": "2.2.27", @@ -36,13 +37,17 @@ "jszip-utils": "^0.1.0", "moment": "^2.30.1", "nprogress": "0.2.0", + "path-browserify": "^1.0.1", + "pdfjs-dist": "^4.10.38", "pinia": "2.0.22", "pizzip": "^3.1.7", "quill": "^2.0.0-dev.3", + "stream-browserify": "^3.0.0", "tinymce": "^5.10.2", "vue": "3.2.45", "vue-baidu-map-3x": "^1.0.35", "vue-cropper": "1.0.3", + "vue-pdf": "^4.3.0", "vue-quill-editor": "^3.0.6", "vue-router": "4.1.4", "vue3-json-excel": "^1.0.10-alpha", @@ -58,6 +63,7 @@ "unplugin-vue-setup-extend-plus": "0.4.9", "vite": "3.2.3", "vite-plugin-compression": "0.5.1", + "vite-plugin-require": "^1.2.14", "vite-plugin-svg-icons": "2.0.1" } } diff --git a/src/api/menu.js b/src/api/menu.js index faef101..95aaa17 100644 --- a/src/api/menu.js +++ b/src/api/menu.js @@ -6,4 +6,4 @@ url: '/getRouters', method: 'get' }) -} \ No newline at end of file +} diff --git a/src/api/signAgreement/signProject.js b/src/api/signAgreement/signProject.js new file mode 100644 index 0000000..ccacff5 --- /dev/null +++ b/src/api/signAgreement/signProject.js @@ -0,0 +1,51 @@ +import request from '@/utils/request' + +export function getSignProject(params) { + return request({ + url: '/item/list', + method: 'get', + params: params + }) +} + + + +export function addSignProject(data) { + return request({ + url: '/item/insert', + method: 'post', + data: data + }) +} + +export function editSignProject(params) { + return request({ + url: `/item/update`, + method: 'post', + data: params + }) +} + +export function delSignProject(data) { + return request({ + url: `/item/delete/` + data, + method: 'post', + }) +} + +export function signFlow(data) { + return request({ + url: `/flow/insert`, + method: 'post', + data: data + }) +} + +export function signArchive(data) { + return request({ + url: `/flow/returnFile`, + method: 'post', + data: data + }) +} + diff --git a/src/api/signAgreement/signType.js b/src/api/signAgreement/signType.js new file mode 100644 index 0000000..bc810d6 --- /dev/null +++ b/src/api/signAgreement/signType.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +export function getSignType(params) { + return request({ + url: '/type/list', + method: 'get', + params: params + }) +} + + + +export function addType(data) { + return request({ + url: '/type/insert', + method: 'post', + data: data + }) +} + +export function editType(params) { + return request({ + url: `/type/update`, + method: 'post', + data: params + }) +} + +export function delType(data) { + return request({ + url: `/type/delete/` + data, + method: 'post', + }) +} diff --git a/src/api/signAgreement/template.js b/src/api/signAgreement/template.js new file mode 100644 index 0000000..b09f4ea --- /dev/null +++ b/src/api/signAgreement/template.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function getTemplate(params) { + return request({ + url: '/template/list', + method: 'get', + params: params + }) +} + + + +export function addTemplate(data) { + return request({ + url: '/template/insert', + method: 'post', + data: data + }) +} + +export function editTemplate(params) { + return request({ + url: `/template/update`, + method: 'post', + data: params + }) +} + +export function delTemplate(data) { + return request({ + url: `/template/delete/` + data, + method: 'post', + data: data + }) +} diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 9900234..ba3034c 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -48,6 +48,7 @@ this.name = user.userName this.avatar = avatar Cookies.set('userInfo',JSON.stringify(user)) + Cookies.set('userRole',JSON.stringify(this.roles)) resolve(res) }).catch(error => { reject(error) diff --git a/src/views/signProject/components/circulation.vue b/src/views/signProject/components/circulation.vue index dd5f2c3..7b0be49 100644 --- a/src/views/signProject/components/circulation.vue +++ b/src/views/signProject/components/circulation.vue @@ -9,27 +9,25 @@ :close-on-click-modal="false" > <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="部门:" prop="deptId" > + <el-form-item label="部门:" prop="signDeptId" > <el-cascader style="width: 100%" clearable - v-model="state.form.deptId" + v-model="state.form.signDeptId" :options="state.options" @change="selectValue" :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader> </el-form-item> - <el-form-item label="签署人:" prop="people" > + <el-form-item label="签署人:" prop="signUserId" > <el-select clearable - v-model="state.form.people" + v-model="state.form.signUserId" filterable - multiple remote - reserve-keyword placeholder="请输入签署人名称(可多选)" remote-show-suffix - :remote-method="(val)=>getUserList(val,state.form.deptId)" + :remote-method="(val)=>getUserList(val,state.form.signDeptId)" style="width: 100%" > <el-option @@ -55,6 +53,8 @@ import {ElMessage} from "element-plus"; import {listDept} from "@/api/system/dept"; import {listUser} from "@/api/system/user"; +import {signFlow} from "@/api/signAgreement/signProject"; +import {getInfo} from "@/api/login"; const { proxy } = getCurrentInstance(); const dialogVisible = ref(false); @@ -65,26 +65,29 @@ const state = reactive({ form: { - id: '', - deptId: '', - people: [] + itemId: null, + signUserId: null, + signDeptId: null }, + user: {}, options: [], userList: [], formRules:{ - deptId: [{ required: true, trigger: "blur", message:'请选择部门' }], - people: [{ required: true, trigger: "blur", message:'请选择签署人' }], + signDeptId: [{ required: true, trigger: "blur", message:'请选择部门' }], + signUserId: [{ required: true, trigger: "blur", message:'请选择签署人' }], }, }) const openDialog = async (value) => { await getDept() + await getUserInfo() + state.form.itemId = value.id dialogVisible.value = true; } const selectValue = (val) => { state.userList = [] - state.form.people = [] + state.form.signUserId = [] getUserList("",val) } @@ -96,25 +99,37 @@ }); } +const getUserInfo = async () => { + const res = await getInfo() + if(res.code == 200){ + state.user = res.user + }else{ + ElMessage.warning(res.message) + } +} + const onSubmit = async () => { const valid = await busRef.value.validate(); if(valid){ const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - // const res = await addWarehouse(data) - // if(res.code === 200){ - // ElMessage({ - // type: 'success', - // message: '新增成功' - // }); - // }else{ - // ElMessage.warning(res.message) - // } + data.userId = state.user.userId + data.userName = state.user.userName + data.deptId = state.user.deptId + data.deptName = state.user.dept.deptName + const res = await signFlow(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '流转成功' + }); + }else{ + ElMessage.warning(res.message) + } emit("getList") busRef.value.clearValidate(); reset(); dialogVisible.value = false; - } } @@ -126,9 +141,9 @@ } const reset = () => { state.form = { - id: '', - name: '', - remark: '', + itemId: null, + signUserId: null, + signDeptId: null } } const getUserList = async (val,deptId)=>{ diff --git a/src/views/signProject/components/record.vue b/src/views/signProject/components/record.vue index 0ee91a6..d15ccf5 100644 --- a/src/views/signProject/components/record.vue +++ b/src/views/signProject/components/record.vue @@ -9,22 +9,32 @@ :close-on-click-modal="false" > <el-timeline style="max-width: 600px"> + <el-timeline-item size="large" color="#0bbd87" style="font-size: 16px"> + <div>创建人:{{state.creatContent}}</div> + </el-timeline-item> + <el-timeline-item style="font-size: 16px" :color="state.firstPeopleState == 1 ? '#0bbd87' : '#B4B4B4' " size="large"> + <div> + 最初签署人:{{state.firstPeopleContent}} + <span v-if="state.firstPeopleState == 1" style="color: #1ab394;font-size: 14px;">[已签]</span> + <span v-else style="color: #6d737b;font-size: 14px;">[未签]</span> + + </div> + </el-timeline-item> <el-timeline-item v-for="(activity, index) in state.activities" :key="index" - :icon="activity.icon" - :type="activity.type" - :color="activity.state == 1 ? '#0bbd87' : '#B4B4B4' " - :size="activity.size" + size="large" + style="font-size: 16px" + :color="activity.signStatus == 1 || activity.signStatus == 3 ? '#0bbd87' : '#B4B4B4' " > <div style="display: flex;font-size: 16px"> <div style="display: flex;flex-direction: column"> - <span v-if="activity.title" style="font-size: 14px;margin-bottom: 5px;color: #6d737b">{{activity.title}}</span> + <span style="font-size: 14px;margin-bottom: 5px;color: #6d737b">由 {{activity.deptName}} {{activity.userName}} 流转</span> <div> - <span style="font-size: 16px">{{activity.content}}</span> - <span v-if="activity.state == 1 && index != 3" style="color: #1ab394;font-size: 14px;margin-left: 5px">[已签]</span> - <span v-if="activity.state == 0 && index != 3" style="color: #6d737b;font-size: 14px;margin-left: 5px">[未签]</span> - <span v-if="activity.state == 1 && index == 3" style="color: #1ab394;font-size: 14px;margin-left: 5px">[已归档]</span> + <span style="font-size: 16px" >{{activity.signUserName}}({{activity.signDeptName}})</span> + <span v-if="activity.signStatus == 1" style="color: #1ab394;font-size: 14px;margin-left: 5px">[已签]</span> + <span v-else-if="activity.signStatus == 0 || activity.signStatus == null " style="color: #6d737b;font-size: 14px;margin-left: 5px">[未签]</span> + <span v-else-if="activity.signStatus == 3 && state.form.itemStatus == 2 " style="color: #1ab394;font-size: 14px;margin-left: 5px">[已归档]</span> </div> </div> </div> @@ -52,6 +62,9 @@ id: '', }, activities: [], + creatContent: '', + firstPeopleContent: '', + firstPeopleState: null, formRules:{ name: [{ required: true, trigger: "blur", message:'' }], }, @@ -59,40 +72,52 @@ const openDialog = async (value) => { - state.activities = [ - { - content: '创建人:张三(综合办)', - timestamp: '2018-04-03 20:46', - size: 'large', - state: 1, - }, - { - content: '最初签署人:李四', - timestamp: '2018-04-03 20:46', - size: 'large', - state: 1, - }, - { - title: '由 XXX 部门 XX 流转', - content: 'XXXX', - timestamp: '2018-04-03 20:46', - size: 'large', - state: 1, - }, - { - title: '由 XXX 部门 XX 流转', - content: 'XXXX', - timestamp: '2018-04-03 20:46', - size: 'large', - state: 1, - }, + console.log('va',value) + state.form = JSON.parse(JSON.stringify(value)) + state.activities = JSON.parse(JSON.stringify(value)).signatureFlows + const newArr = [] + state.activities.forEach(item => { + if(item.sort == 1){ + state.creatContent = item.userName + '('+ item.deptName + ')' + state.firstPeopleContent = item.signUserName + '('+ item.signDeptName + ')' + state.firstPeopleState = item.signStatus + }else { + newArr.push(item) + } + }) + newArr.sort((a,b) => a.sort - b.sort) + state.activities = newArr - - - ] + // state.activities = [ + // { + // content: '创建人:张三(综合办)', + // timestamp: '2018-04-03 20:46', + // size: 'large', + // state: 1, + // }, + // { + // content: '最初签署人:李四', + // timestamp: '2018-04-03 20:46', + // size: 'large', + // state: 1, + // }, + // { + // title: '由 XXX 部门 XX 流转', + // content: 'XXXX', + // timestamp: '2018-04-03 20:46', + // size: 'large', + // state: 1, + // }, + // { + // title: '由 XXX 部门 XX 流转', + // content: 'XXXX', + // timestamp: '2018-04-03 20:46', + // size: 'large', + // state: 1, + // }, + // ] dialogVisible.value = true; } - const handleClose = () => { reset(); diff --git a/src/views/signProject/components/viewPdf.vue b/src/views/signProject/components/viewPdf.vue new file mode 100644 index 0000000..84ae76d --- /dev/null +++ b/src/views/signProject/components/viewPdf.vue @@ -0,0 +1,66 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + title="流转记录" + width="500px" + :before-close="handleClose" + :close-on-press-escape="false" + :close-on-click-modal="false" + > + <iframe :src="state.pdfUrl" width="100%" height="600px" sandbox="allow-scripts"></iframe> + </el-dialog> + </div> +</template> +<script setup> +import {reactive, ref, toRefs} from 'vue' +const dialogVisible = ref(false); +const title = ref(""); + +const emit = defineEmits(["getList"]); + +const state = reactive({ + pdfUrl: '' +}) + + +const openDialog = async (value) => { + state.pdfUrl = import.meta.env.VITE_APP_BASE_API +value.itemFile + console.log('11',state.pdfUrl) + dialogVisible.value = true; +} + +const handleClose = () => { + reset(); + dialogVisible.value = false; + emit("getList") +} +const reset = () => { +state.pdfUrl = '' +} + +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + /* 针对 iframe 的滚动条 */ + iframe::-webkit-scrollbar { + width: 12px; /* 滚动条宽度 */ + } + iframe::-webkit-scrollbar-track { + background: #f1f1f1; /* 滚动条轨道背景 */ + border-radius: 10px; + } + iframe::-webkit-scrollbar-thumb { + background: #888; /* 滚动条滑块颜色 */ + border-radius: 10px; + } + iframe::-webkit-scrollbar-thumb:hover { + background: #555; /* 鼠标悬停时滑块颜色 */ + } +} +</style> diff --git a/src/views/signProject/index.vue b/src/views/signProject/index.vue index 5b30136..c3a7b6e 100644 --- a/src/views/signProject/index.vue +++ b/src/views/signProject/index.vue @@ -2,9 +2,9 @@ <div class="app-container"> <div style="display: flex;justify-content: space-between;margin-bottom: 20px"> <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-radio-group v-model="queryParams.type"> + <el-radio-group v-model="queryParams.status" @change="getList"> <el-radio-button label="" >全部</el-radio-button> - <el-radio-button label="1">签署中</el-radio-button> + <el-radio-button label="0">签署中</el-radio-button> <el-radio-button label="2" >已归档</el-radio-button> </el-radio-group> <!-- <el-form-item label="仓库名称:" >--> @@ -26,22 +26,26 @@ <!-- 表格数据 --> <el-table v-loading="loading" :data="dataList" :border="true"> <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="项目名称" prop="name" align="center" /> - <el-table-column label="模板ID" prop="remark" align="center" /> - <el-table-column label="发起部门" prop="remark" align="center" /> - <el-table-column label="发起时间" prop="remark" align="center" /> - <el-table-column label="最初签署人" prop="remark" align="center" /> + <el-table-column label="项目名称" prop="itemName" align="center" /> + <el-table-column label="模板ID" prop="templateId" align="center" /> + <el-table-column label="发起部门" prop="deptName" align="center" /> + <el-table-column label="发起时间" prop="originateTime" align="center" /> + <el-table-column label="最初签署人" prop="initiaiUserName" align="center" /> <el-table-column label="流转记录" prop="count" align="center" > <template #default="scope"> - <span style="color: #1890ff;cursor: pointer" @click="record(scope.row)">{{scope.row.count}}</span> + <span style="color: #1890ff;cursor: pointer" @click="record(scope.row)">{{scope.row.flowCount}}</span> </template> </el-table-column> - <el-table-column label="签署状态" prop="remark" align="center" /> + <el-table-column label="签署状态" prop="itemStatus" align="center" > + <template #default="scope"> + <span>{{scope.row.itemStatus == 0 ? '签署中' : scope.row.itemStatus == 1 ? '已签署' :scope.row.itemStatus == 2 ? '已归档' : '' }}</span> + </template> + </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" > <template #default="scope"> - <el-button link type="primary" >预览</el-button> - <el-button link type="primary" @click="circulationBtn(scope.row)" >流转</el-button> - <el-button link type="primary" >确认归档</el-button> + <el-button link type="primary" @click="view(scope.row)">预览</el-button> + <el-button link type="primary" v-if="scope.row.itemStatus !=2 && (data.userRole.includes('admin') || data.userRole.includes('suprice') ) " @click="circulationBtn(scope.row)" >流转</el-button> + <el-button link type="primary" v-if="scope.row.itemStatus !=2 &&(data.userRole.includes('admin') || data.userRole.includes('suprice')) && scope.row.isAbleArchive " @click="archiveBtn(scope.row)">确认归档</el-button> <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> @@ -55,6 +59,7 @@ /> <circulation ref="circulationRef" @getList="getList"></circulation> <timeRecord ref="timeRecordRef" @getList="getList"></timeRecord> +<!-- <view-p ref="viewPRef" @getList="getList"></view-p>--> </div> </template> @@ -63,18 +68,23 @@ import {ElMessage, ElMessageBox} from "element-plus"; import circulation from './components/circulation' import timeRecord from './components/record.vue' +import viewP from './components/viewPdf.vue' +import {delSignProject, getSignProject, signArchive} from "@/api/signAgreement/signProject"; +import Cookies from "js-cookie"; const { proxy } = getCurrentInstance(); const loading = ref(false); const dialogRef = ref(); const circulationRef = ref(); -const cupDialogRef = ref(); +const viewPRef = ref(); const timeRecordRef = ref() const data = reactive({ queryParams: { pageNum: 1, pageSize: 10, - type: '' + status: '' }, + userRole:[], + user: {}, total: 0, dataList: [] }); @@ -83,6 +93,8 @@ const classHourRef = ref(); onMounted(()=>{ getList() + data.userRole = JSON.parse(Cookies.get('userRole')) + data.user = JSON.parse(Cookies.get('userInfo')) }) onUnmounted(()=>{ @@ -91,20 +103,28 @@ const getList = async () => { loading.value = true - // const res = await getWarehouse(data.queryParams) - // if(res.code == 200){ - // data.dataList = res.data.list - // data.total = res.data.total - // }else{ - // ElMessage.warning(res.message) - // } - data.dataList = [ - { - id: 1, - name: 'xxx', - count: 2 - } - ] + const res = await getSignProject(data.queryParams) + if(res.code == 200){ + data.dataList = res.rows.map(item => { + return { + ...item, + flowCount: item.signatureFlows && item.signatureFlows.length >0 ? item.signatureFlows.length : 0 + } + }) + data.dataList.forEach(item => { + let isAble = true + item.signatureFlows.forEach(i => { + if(i.signStatus !=1){ + isAble = false + } + }) + item.isAbleArchive = isAble + }) + console.log('1',data.dataList) + data.total = res.total + }else{ + ElMessage.warning(res.message) + } loading.value = false } @@ -112,18 +132,53 @@ dialogRef.value.openDialog(type, value); } const record = (val) => { - timeRecordRef.value.openDialog(val) + if(val.flowCount > 0){ + timeRecordRef.value.openDialog(val) + }else { + ElMessage.warning('暂无流转记录') + } + } const circulationBtn = (value) => { circulationRef.value.openDialog(value) +} +const view = (val) => { + const url =import.meta.env.VITE_APP_BASE_API +val.itemFile + window.open(url) +} +const archiveBtn = (val) => { + ElMessageBox.confirm( + '确定项目归档?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + + .then( async() => { + console.log('1111',val) + const param = { + itemId: val.id, + filePath: val.itemFile, + userId: data.user.userId + } + const res = await signArchive(param) + if(res.code == 200){ + ElMessage.success('项目归档成功') + await getList() + }else{ + ElMessage.warning(res.message) + } + }) } /** 重置新增的表单以及其他数据 */ function reset() { data.queryParams = { pageNum: 1, pageSize: 10, - name: '' + status: '' } getList() } @@ -137,7 +192,7 @@ type: 'warning', }) .then( async() => { - const res = await delWarehouse(val.id) + const res = await delSignProject(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getList() @@ -145,31 +200,7 @@ ElMessage.warning(res.message) } }) -} -const delCup = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delCupboard(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const addCupboard = (type,value) => { - cupDialogRef.value.openDialog(type, value); } -const getRowKeys = (row) => { - return row.name -} + </script> diff --git a/src/views/signTypeManage/components/addDialog.vue b/src/views/signTypeManage/components/addDialog.vue index c43b589..8adc3ff 100644 --- a/src/views/signTypeManage/components/addDialog.vue +++ b/src/views/signTypeManage/components/addDialog.vue @@ -9,8 +9,8 @@ :close-on-click-modal="false" > <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="类别名称:" prop="name" > - <el-input v-model.trim="state.form.name" placeholder="请输入类别名称"></el-input> + <el-form-item label="类别名称:" prop="typeName" > + <el-input v-model.trim="state.form.typeName" placeholder="请输入类别名称"></el-input> </el-form-item> </el-form> <template #footer> @@ -25,6 +25,7 @@ <script setup> import {reactive, ref, toRefs} from 'vue' import {ElMessage} from "element-plus"; +import {addType, editType} from "@/api/signAgreement/signType"; const dialogVisible = ref(false); const title = ref(""); const busRef = ref(); @@ -35,12 +36,10 @@ const state = reactive({ form: { id: '', - name: '', - remark: '' - + typeName: '', }, formRules:{ - name: [{ required: true, trigger: "blur", message: '请输入类别名称' }], + typeName: [{ required: true, trigger: "blur", message: '请输入类别名称' }], }, }) @@ -59,7 +58,7 @@ if(valid){ if(title.value === '新增'){ const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - const res = await addWarehouse(data) + const res = await addType(data) if(res.code === 200){ ElMessage({ type: 'success', @@ -74,7 +73,7 @@ dialogVisible.value = false; }else if(title.value === '编辑'){ const {...data} = JSON.parse(JSON.stringify(state.form)) - const res = await editWarehouse(data) + const res = await editType(data) if(res.code === 200){ ElMessage({ type: 'success', @@ -100,8 +99,7 @@ const reset = () => { state.form = { id: '', - name: '', - remark: '', + typeName: '', } } defineExpose({ diff --git a/src/views/signTypeManage/index.vue b/src/views/signTypeManage/index.vue index dc31169..337b7e1 100644 --- a/src/views/signTypeManage/index.vue +++ b/src/views/signTypeManage/index.vue @@ -10,26 +10,26 @@ @click="openDialog('add',{})" >新增</el-button> </el-form-item> -<!-- <el-form-item label="仓库名称:" >--> -<!-- <el-input v-model="data.queryParams.name" placeholder="请输仓库名称"></el-input>--> -<!-- </el-form-item>--> -<!-- <el-form-item >--> -<!-- <el-button--> -<!-- type="primary"--> -<!-- @click="getList"--> -<!-- >查询</el-button>--> -<!-- <el-button--> -<!-- type="primary"--> -<!-- plain--> -<!-- @click="reset"--> -<!-- >重置</el-button>--> -<!-- </el-form-item>--> + <el-form-item label="名称:" > + <el-input v-model="data.queryParams.typeName" placeholder="请输入类别名称"></el-input> + </el-form-item> + <el-form-item > + <el-button + type="primary" + @click="getList" + >查询</el-button> + <el-button + type="primary" + plain + @click="reset" + >重置</el-button> + </el-form-item> </el-form> </div> <!-- 表格数据 --> <el-table v-loading="loading" :data="dataList" :border="true"> <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="类别名称" prop="name" align="center" /> + <el-table-column label="类别名称" prop="typeName" align="center" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" > <template #default="scope"> <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> @@ -38,13 +38,13 @@ </el-table-column> </el-table> - <pagination - v-show="total > 0" - :total="total" - v-model:page="queryParams.pageNum" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> +<!-- <pagination--> +<!-- v-show="total > 0"--> +<!-- :total="total"--> +<!-- v-model:page="queryParams.pageNum"--> +<!-- v-model:limit="queryParams.pageSize"--> +<!-- @pagination="getList"--> +<!-- />--> <add-dialog ref="dialogRef" @getList="getList"></add-dialog> </div> @@ -54,15 +54,14 @@ import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; import {ElMessage, ElMessageBox} from "element-plus"; import addDialog from './components/addDialog.vue' +import {delType, getSignType} from "@/api/signAgreement/signType"; const { proxy } = getCurrentInstance(); const loading = ref(false); const dialogRef = ref(); const cupDialogRef = ref(); const data = reactive({ queryParams: { - pageNum: 1, - pageSize: 10, - name: '' + typeName: '' }, total: 0, dataList: [] @@ -79,15 +78,15 @@ }) const getList = async () => { - // loading.value = true - // const res = await getWarehouse(data.queryParams) - // if(res.code == 200){ - // data.dataList = res.data.list - // data.total = res.data.total - // }else{ - // ElMessage.warning(res.message) - // } - // loading.value = false + loading.value = true + const res = await getSignType(data.queryParams) + if(res.code == 200){ + data.dataList = res.data + // data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } + loading.value = false } const openDialog = (type, value) => { @@ -97,9 +96,7 @@ /** 重置新增的表单以及其他数据 */ function reset() { data.queryParams = { - pageNum: 1, - pageSize: 10, - name: '' + typeName: '' } getList() } @@ -113,7 +110,7 @@ type: 'warning', }) .then( async() => { - const res = await delWarehouse(val.id) + const res = await delType(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getList() diff --git a/src/views/templateManage/components/createSign.vue b/src/views/templateManage/components/createSign.vue index f6a217f..099f818 100644 --- a/src/views/templateManage/components/createSign.vue +++ b/src/views/templateManage/components/createSign.vue @@ -3,19 +3,22 @@ <el-dialog v-model="dialogVisible" title="创建签署项目" - width="50%" + width="550px" :before-close="handleClose" :close-on-press-escape="false" :close-on-click-modal="false" > <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > - <el-form-item label="项目名称:" prop="name" > - <el-input v-model="state.form.name" placeholder="请输入项目名称"></el-input> + <el-form-item label="项目名称:" prop="itemName" > + <el-input v-model="state.form.itemName" placeholder="请输入项目名称"></el-input> </el-form-item> + + <div style="display: flex;align-items: center;"> + <el-form-item label="最初签署人:" prop="deptId" > - <div style="display: flex;"> <el-cascader - style="width: 50%" + :show-all-levels="false" + style="width: 170px" clearable placeholder="请选择部门" v-model="state.form.deptId" @@ -23,18 +26,16 @@ @change="selectValue" :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"> </el-cascader> - <el-select clearable - v-model="state.form.people" + v-model="state.form.initiaiUserId" filterable - multiple remote reserve-keyword - placeholder="请输入签署人名称(可多选)" + placeholder="请输入签署人名称" remote-show-suffix :remote-method="(val)=>getUserList(val,state.form.deptId)" - style="width: 50%;margin-left: 10px" + style=" width:170px;margin-left:20px" > <el-option v-for="item in state.userList" @@ -43,9 +44,8 @@ :value="item.userId" /> </el-select> - </div> - </el-form-item> + </div> </el-form> <template #footer> <span class="dialog-footer"> @@ -61,6 +61,7 @@ import {ElMessage} from "element-plus"; import {listDept} from "@/api/system/dept"; import {listUser} from "@/api/system/user"; +import {addSignProject} from "@/api/signAgreement/signProject"; const { proxy } = getCurrentInstance(); const dialogVisible = ref(false); @@ -72,25 +73,28 @@ const state = reactive({ form: { id: '', - deptId: '', - people: [] + itemName: '', + deptId: null, + initiaiUserId: null, + templateId: null }, options: [], userList: [], formRules:{ deptId: [{ required: true, trigger: "blur", message:'请选择部门' }], - people: [{ required: true, trigger: "blur", message:'请选择签署人' }], + itemName: [{ required: true, trigger: "blur", message:'请输入项目名称' }], }, }) const openDialog = async (value) => { await getDept() + state.form.templateId = value.id dialogVisible.value = true; } const selectValue = (val) => { state.userList = [] - state.form.people = [] + state.form.initiaiUserId = null getUserList("",val) } @@ -107,15 +111,19 @@ const valid = await busRef.value.validate(); if(valid){ const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - // const res = await addWarehouse(data) - // if(res.code === 200){ - // ElMessage({ - // type: 'success', - // message: '新增成功' - // }); - // }else{ - // ElMessage.warning(res.message) - // } + if(data.initiaiUserId == null) { + ElMessage.warning('请选择签署人') + return; + } + const res = await addSignProject(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '新增成功' + }); + }else{ + ElMessage.warning(res.message) + } emit("getList") busRef.value.clearValidate(); reset(); @@ -133,8 +141,10 @@ const reset = () => { state.form = { id: '', - name: '', - remark: '', + itemName: '', + deptId: null, + initiaiUserId: null, + templateId: null } } const getUserList = async (val,deptId)=>{ diff --git a/src/views/templateManage/components/templateDialog.vue b/src/views/templateManage/components/templateDialog.vue index b9361f6..a1f70b9 100644 --- a/src/views/templateManage/components/templateDialog.vue +++ b/src/views/templateManage/components/templateDialog.vue @@ -11,53 +11,54 @@ <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > <el-row :gutter="24"> <el-col :span="24"> - <el-form-item label="模板名称:" prop="name" > - <el-input v-model="state.form.name" placeholder="请输入模板名称"></el-input> + <el-form-item label="模板名称:" prop="templateName" > + <el-input v-model="state.form.templateName" placeholder="请输入模板名称"></el-input> </el-form-item> </el-col> </el-row> - <el-row :gutter="24"> - <el-col :span="12"> - <el-form-item label="创建部门:" > - <span style="font-size: 16px">{{state.form.deptName}}</span> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="签署类型:" > - <el-select - v-model="state.form.type" - placeholder="请选择" - style="width: 100%" - > + <div style="display: flex;align-items: center;justify-content: space-between"> + <el-form-item label="创建部门:" > + <span style="font-size: 16px">{{state.deptName}}</span> + </el-form-item> + <el-form-item label="签署类型:" prop="typeId"> + <el-select + v-model="state.form.typeId" + placeholder="请选择" + style="width: 100%" + > <el-option v-for="item in state.typeList" - :key="item.value" - :label="item.label" - :value="item.value" + :key="item.id" + :label="item.typeName" + :value="item.id" /> - </el-select> - </el-form-item> - </el-col> - </el-row> + </el-select> + </el-form-item> + </div> + <el-row :gutter="24"> <el-col :span="24"> - <el-form-item label="签名文件附件:" prop="name" > + <el-form-item label="签名文件附件:" prop="fileList" > <el-upload - :auto-upload="false" + v-model:file-list="state.form.fileList" :action="uploadFileUrl" - :file-list="state.fileList" + :headers="state.header" :remove="handleRemove" + :on-success="handleAvatarSuccess" :on-change="handleChange" accept=".pdf,.word" :limit="state.limit" style="width: 230px" > <el-button type="primary" plain> 点击上传 </el-button> + <template #tip> + <div class="el-upload__tip">只能上传pdf类型,最多上传1份。</div> + </template> </el-upload> </el-form-item> </el-col> </el-row> - <el-form-item label="签名文件附件:" style="display: flex;flex-direction: column;align-items: flex-start"> + <el-form-item label="签署效果预览:" style="display: flex;flex-direction: column;align-items: flex-start"> <div style="width: 500px;height: 100px;margin-left: 50px"> </div> @@ -77,6 +78,10 @@ import {ElMessage} from "element-plus"; import {listDept} from "@/api/system/dept"; import {listUser} from "@/api/system/user"; +import {addTemplate, editTemplate} from "@/api/signAgreement/template"; +import {addType, editType, getSignType} from "@/api/signAgreement/signType"; +import {getInfo} from "@/api/login"; +import {getToken} from "@/utils/auth"; const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传文件服务器地址 const { proxy } = getCurrentInstance(); @@ -89,50 +94,99 @@ const state = reactive({ form: { id: '', - deptId: '', - deptName: '综合办', - people: [] + templateName: '', + typeId:null, + deptId: null, + filePath: '', + fileList: [] }, - typeList: [ - { - value: '1', - label: 'xx' - } - ], - fileList: [], + header: { + Authorization: getToken() + }, + deptName: '', + typeList: [], limit: 1, formRules:{ - deptId: [{ required: true, trigger: "blur", message:'请选择部门' }], - people: [{ required: true, trigger: "blur", message:'请选择签署人' }], + templateName: [{ required: true, trigger: "blur", message:'请输入模板名称' }], + typeId: [{ required: true, trigger: "blur", message:'请选择签署类型' }], + fileList: [{ required: true, trigger: "blur", message:'请上传签名文件' }], }, }) const openDialog = async (type,value) => { + await getSignTypeList() + await getUserInfo() title.value = type === 'add' ? '新增' : '编辑' if(type === 'edit') { state.form = JSON.parse(JSON.stringify(value)) + if(state.form.filePath && state.form.fileName){ + const obj = { + name: state.form.fileName, + url : import.meta.env.VITE_APP_BASE_API + state.form.filePath + } + state.form.fileList = [obj] + }else { + state.form.fileList = [] + } + } dialogVisible.value = true; } +const getSignTypeList = async () => { + const res = await getSignType() + if(res.code == 200){ + state.typeList = res.data + }else{ + ElMessage.warning(res.message) + } +} +const getUserInfo = async () => { + const res = await getInfo() + if(res.code == 200){ + state.deptName = res.user.dept.deptName + state.form.deptId = res.user.deptId + }else{ + ElMessage.warning(res.message) + } +} const onSubmit = async () => { + console.log('form',state.form) const valid = await busRef.value.validate(); + if(valid){ - const {id, ...data} = JSON.parse(JSON.stringify(state.form)) - // const res = await addWarehouse(data) - // if(res.code === 200){ - // ElMessage({ - // type: 'success', - // message: '新增成功' - // }); - // }else{ - // ElMessage.warning(res.message) - // } - emit("getList") - busRef.value.clearValidate(); - reset(); - dialogVisible.value = false; + if(title.value === '新增'){ + const {id,fileList, ...data} = JSON.parse(JSON.stringify(state.form)) + const res = await addTemplate(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 editTemplate(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '编辑成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + reset(); + dialogVisible.value = false; + } } } @@ -146,28 +200,45 @@ const reset = () => { state.form = { id: '', - name: '', - remark: '', + templateName: '', + typeId:null, + deptId: null, + filePath: '', + fileList: [] } } const handleRemove = (file) => { - const index = data.fileList.indexOf(file) - const newFileList = data.fileList.slice() + const index = state.form.fileList.indexOf(file) + const newFileList = state.form.fileList.slice() newFileList.splice(index, 1) - data.fileList = newFileList; + state.form.fileList = newFileList; } const f = ref() const handleChange = (file,fileList) => { - console.log('file',file) let fileExtension = file.name.split('.').pop(); if(fileExtension == 'pdf' || fileExtension == 'word'){ f.value = file.raw }else { - data.fileList = [] + state.form.fileList = [] ElMessage.warning('仅可上传pdf或word文件') } } +const handleAvatarSuccess = (res) => { + if(res.code === 200){ + // ElMessage({ + // type: 'success', + // message: '文件上传成功' + // }) + state.form.filePath = res.fileName + }else { + state.form.fileList = [] + ElMessage({ + type: 'warning', + message: res.message + }) + } +} defineExpose({ openDialog }); diff --git a/src/views/templateManage/index.vue b/src/views/templateManage/index.vue index da8587b..b2f4f6b 100644 --- a/src/views/templateManage/index.vue +++ b/src/views/templateManage/index.vue @@ -2,35 +2,37 @@ <div class="app-container"> <div style="display: flex;justify-content: space-between;margin-bottom: 20px"> <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" > - <el-button - type="primary" - @click="addProject('add',{})" - > - 新增模板 - </el-button> - <!-- <el-form-item label="仓库名称:" >--> - <!-- <el-input v-model="data.queryParams.name" placeholder="请输仓库名称"></el-input>--> - <!-- </el-form-item>--> - <!-- <el-form-item >--> - <!-- <el-button--> - <!-- type="primary"--> - <!-- @click="getList"--> - <!-- >查询</el-button>--> - <!-- <el-button--> - <!-- type="primary"--> - <!-- plain--> - <!-- @click="reset"--> - <!-- >重置</el-button>--> - <!-- </el-form-item>--> + <el-form-item> + <el-button + type="primary" + @click="addProject('add',{})" + > + 新增模板 + </el-button> + </el-form-item> + <el-form-item label="模板名称:" > + <el-input v-model="data.queryParams.templateName" placeholder="请输入模板名称"></el-input> + </el-form-item> + <el-form-item > + <el-button + type="primary" + @click="getList" + >查询</el-button> + <el-button + type="primary" + plain + @click="reset" + >重置</el-button> + </el-form-item> </el-form> </div> <!-- 表格数据 --> <el-table v-loading="loading" :data="dataList" :border="true"> <el-table-column label="序号" type="index" align="center" width="80" /> - <el-table-column label="模板ID" prop="remark" align="center" /> - <el-table-column label="模板名称" prop="name" align="center" /> - <el-table-column label="类型" prop="remark" align="center" /> - <el-table-column label="提交部门" prop="remark" align="center" /> + <el-table-column label="模板ID" prop="id" align="center" /> + <el-table-column label="模板名称" prop="templateName" align="center" /> + <el-table-column label="类型" prop="typeName" align="center" /> + <el-table-column label="提交部门" prop="deptName" align="center" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250" > <template #default="scope"> <el-button link type="primary" @click="createS(scope.row)">创建签署项目</el-button> @@ -56,15 +58,14 @@ import {ElMessage, ElMessageBox} from "element-plus"; import templateDialog from './components/templateDialog.vue' import createSignDialog from './components/createSign.vue' +import {delTemplate, getTemplate} from "@/api/signAgreement/template"; const { proxy } = getCurrentInstance(); const loading = ref(false); const dialogRef = ref(); const createSignRef = ref(); const data = reactive({ queryParams: { - pageNum: 1, - pageSize: 10, - type: '' + templateName: '' }, total: 0, dataList: [] @@ -88,33 +89,20 @@ } const getList = async () => { loading.value = true - // const res = await getWarehouse(data.queryParams) - // if(res.code == 200){ - // data.dataList = res.data.list - // data.total = res.data.total - // }else{ - // ElMessage.warning(res.message) - // } - data.dataList = [ - { - id: 1, - name: 'xxx', - count: 2 - } - ] + const res = await getTemplate(data.queryParams) + if(res.code == 200){ + data.dataList = res.data + // data.total = res.data.total + }else{ + ElMessage.warning(res.message) + } loading.value = false } const openDialog = (type, value) => { dialogRef.value.openDialog(type, value); } -const record = (val) => { - timeRecordRef.value.openDialog(val) -} -const circulationBtn = (value) => { - circulationRef.value.openDialog(value) -} /** 重置新增的表单以及其他数据 */ function reset() { data.queryParams = { @@ -134,7 +122,7 @@ type: 'warning', }) .then( async() => { - const res = await delWarehouse(val.id) + const res = await delTemplate(val.id) if(res.code == 200){ ElMessage.success('数据删除成功') await getList() @@ -143,28 +131,8 @@ } }) } -const delCup = (val) => { - ElMessageBox.confirm( - '确定删除此条数据?', - '提示', - { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning', - }) - .then( async() => { - const res = await delCupboard(val.id) - if(res.code == 200){ - ElMessage.success('数据删除成功') - await getList() - }else{ - ElMessage.warning(res.message) - } - }) -} -const addCupboard = (type,value) => { - cupDialogRef.value.openDialog(type, value); -} + + const getRowKeys = (row) => { return row.name -- Gitblit v1.9.2