From 3533b11c19b628e45f26d25bedd7c82e0aa2037a Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: Fri, 14 Mar 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