From c5f4bef2a867c3da79555a95b60a7c4d5c295f0e Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期一, 22 十二月 2025 15:18:57 +0800
Subject: [PATCH] 修改
---
src/views/work/marketingManagement/contractManagement/contractChange/index.vue | 62 +++++++++---
public/contractChangeExample.docx | 0
public/contractReviewExample.docx | 0
src/views/work/menuIndex/index.vue | 4
src/views/work/marketingManagement/contractManagement/contractChange/components/editDialog.vue | 211 ++++++++++++++++++++++++++++++++---------
5 files changed, 211 insertions(+), 66 deletions(-)
diff --git a/public/contractChangeExample.docx b/public/contractChangeExample.docx
index bd91662..87ae31a 100644
--- a/public/contractChangeExample.docx
+++ b/public/contractChangeExample.docx
Binary files differ
diff --git a/public/contractReviewExample.docx b/public/contractReviewExample.docx
index 4893786..3c9f6ea 100644
--- a/public/contractReviewExample.docx
+++ b/public/contractReviewExample.docx
Binary files differ
diff --git a/src/views/work/marketingManagement/contractManagement/contractChange/components/editDialog.vue b/src/views/work/marketingManagement/contractManagement/contractChange/components/editDialog.vue
index 5d54f7c..b2a9b2f 100644
--- a/src/views/work/marketingManagement/contractManagement/contractChange/components/editDialog.vue
+++ b/src/views/work/marketingManagement/contractManagement/contractChange/components/editDialog.vue
@@ -40,7 +40,7 @@
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="合同:" prop="contractId" >
- <el-select clearable v-model="state.form.contractId" :disabled="title =='查看'" filterable>
+ <el-select clearable v-model="state.form.contractId" :disabled="title =='查看'" filterable @change="changeContract">
<el-option
v-for="item in state.contractList"
:key="item.id"
@@ -63,12 +63,12 @@
</el-col>
<el-col :span="8">
<el-form-item label="记录人:" prop="registrantId">
- <el-select clearable v-model="state.form.registrantId" :disabled="title =='查看'" filterable style="width: 240px;margin-bottom: 5px">
+ <el-select clearable v-model="state.form.registrantId" :disabled="title =='查看'" filterable style="width: 240px;margin-bottom: 5px" @change="changeRegistrant">
<el-option
v-for="item in state.peopleList"
- :key="item.id"
+ :key="item.userId"
:label="item.name"
- :value="item.id"
+ :value="item.userId"
/>
</el-select>
</el-form-item>
@@ -210,43 +210,60 @@
<div style="display: flex;width: 100%;">
<el-table :data="state.form.reviewMesses" :border="true" >
<el-table-column type="index" label="序号" align="center"></el-table-column>
- <el-table-column :label="state.form.type == 1 ? '评审部门' :'变更部门' " prop="deptName" align="center" >
+ <el-table-column :label="state.form.type == 1 ? '评审部门' :'变更部门' " prop="deptId" align="center" >
<template #default="{row,$index}">
- <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'deptName'" :rules="state.rules.deptName">
- <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.deptName" placeholder="请输入"></el-input>
+ <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'deptId'" :rules="state.rules.deptId" >
+ <el-select
+ :disabled="title === '查看'"
+ v-model="row.deptId"
+ placeholder="请选择部门"
+ style="width: 240px"
+ @change="changeDept"
+ >
+ <el-option
+ v-for="item in state.deptList"
+ :key="item.deptId"
+ :label="item.deptName"
+ :value="item.deptId"
+ />
+ </el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column :label="state.form.type == 1 ? '评审内容(含风险)' :'变更内容(含风险)' " prop="reviewMess" align="center" >
<template #default="{row,$index}">
- <div v-for="(i,index) in row.contractReviewMessbs" :key="index">
- <el-form-item :prop="'reviewMesses.' + '[' + $index + '].' +'contractReviewMessbs.' + '[' + index + ']' + '.reviewMess'" :rules="state.rules.reviewMess">
- <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.reviewMess" placeholder="请输入"></el-input>
+<!-- <div v-for="(i,index) in row.contractReviewMessbs" :key="index">-->
+ <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'reviewMess'" :rules="state.rules.reviewMess">
+ <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.reviewMess" placeholder="请输入"></el-input>
</el-form-item>
- </div>
+<!-- </div>-->
</template>
</el-table-column>
<el-table-column :label="state.form.type == 1 ? '评审意见' :'变更意见' " prop="reviewOpinion" align="center">
<template #default="{row,$index}">
- <div v-for="(i,index) in row.contractReviewMessbs" :key="index">
- <el-form-item :prop="'reviewMesses.' + '[' + $index + '].' +'contractReviewMessbs.' + '[' + index + ']' + '.reviewOpinion'" :rules="state.rules.reviewOpinion">
- <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.reviewOpinion" placeholder="请输入"></el-input>
+ <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'reviewOpinion'" :rules="state.rules.reviewOpinion">
+ <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.reviewOpinion" placeholder="请输入"></el-input>
</el-form-item>
- </div>
</template>
</el-table-column>
- <el-table-column label="签字" prop="reviewSign" align="center" >
+ <el-table-column label="人员" prop="reviewUser" align="center" >
<template #default="{row,$index}">
- <div v-for="(i,index) in row.contractReviewMessbs" :key="index">
- <el-form-item :prop="'reviewMesses.' + '[' + $index + '].' +'contractReviewMessbs.' + '[' + index + ']' + '.reviewSign'" :rules="state.rules.reviewSign">
- <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.reviewSign" placeholder="请输入"></el-input>
+ <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'reviewUser'" :rules="state.rules.reviewUser">
+ <el-select clearable v-model="row.reviewUser" :disabled="title =='查看'" filterable style="width: 240px;margin-bottom: 5px" @change="changeReviewUser($event,$index)">
+ <el-option
+ v-for="item in state.peopleList"
+ :key="item.userId"
+ :label="item.name"
+ :value="item.userId"
+ />
+ </el-select>
</el-form-item>
- </div>
+
</template>
</el-table-column>
<el-table-column label="操作" align="center" v-if="title !== '查看'" >
<template #default="scope">
- <el-button link type="primary" @click="addObject(scope.row,scope.$index)" >添加</el-button>
+<!-- <el-button link type="primary" @click="addObject(scope.row,scope.$index)" >添加</el-button>-->
<el-button link type="danger" @click="delContent(scope.row,scope.$index)" >删除</el-button>
</template>
</el-table-column>
@@ -266,12 +283,12 @@
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="法人/委托代理人签字:" prop="legalPerson" >
- <el-select clearable v-model="state.form.legalPerson" :disabled="title =='查看'" filterable style="width: 240px;margin-bottom: 5px">
+ <el-select clearable v-model="state.form.legalPerson" :disabled="title =='查看'" filterable style="width: 240px;margin-bottom: 5px" @change="changeLegal">
<el-option
v-for="item in state.peopleList"
- :key="item.id"
+ :key="item.userId"
:label="item.name"
- :value="item.id"
+ :value="item.userId"
/>
</el-select>
</el-form-item>
@@ -303,7 +320,7 @@
import Cookies from "js-cookie";
import {getCompany} from "@/api/onlineEducation/company";
import {ElMessage} from "element-plus";
-import {getUser} from "@/api/onlineEducation/user";
+import {getEmployeeRecordList, getEmployeeRecords, getUser} from "@/api/onlineEducation/user";
import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
import {addNeedDiscren, editNeedDiscren} from "@/api/need/need";
@@ -311,6 +328,11 @@
import {getCustomer} from "@/api/customerList";
import {getLedger} from "@/api/contractLedger";
import {verifyPhone} from "@/utils/validate";
+import {generateWordDocument} from "@/utils/exportWord";
+import PizZip from "pizzip";
+import docxtemplater from "docxtemplater";
+import axios from "axios";
+import {getToken} from "@/utils/auth";
const dialogVisible = ref(false);
const title = ref("");
@@ -351,7 +373,12 @@
legalTime: "",
suggest: '',
contractReviewRequires: [],
- reviewMesses: []
+ reviewMesses: [],
+ filePath:'',
+ fileName:'',
+ registrantName:'',
+ legalName:'',
+ number:''
},
rules: {
companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
@@ -370,16 +397,16 @@
riskMess: [{ required: true, message: '请输入风险识别', trigger: 'blur' }],
legalPerson: [{ required: true, message: '请选择法人', trigger: 'blur' }],
legalTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
- suggest: [{ required: true, message: '请输入评审意见', trigger: 'blur' }],
+ // suggest: [{ required: true, message: '请输入评审意见', trigger: 'blur' }],
productName: [{required: true, message: "", trigger: "blur"}],
pecification: [{required: true, message: "", trigger: "blur"}],
amount: [{required: true, message: "", trigger: "blur"}],
price: [{required: true, message: "", trigger: "blur"}],
// remark: [{required: true, message: "", trigger: "blur"}],
- deptName:[{required: true, message: "", trigger: "blur"}],
+ deptId:[{required: true, message: "", trigger: "blur"}],
reviewMess:[{required: true, message: "", trigger: "blur"}],
- reviewOpinion:[{required: true, message: "", trigger: "blur"}],
- reviewSign:[{required: true, message: "", trigger: "blur"}],
+ // reviewOpinion:[{required: true, message: "", trigger: "blur"}],
+ reviewUser:[{required: true, message: "", trigger: "blur"}],
contractReviewRequires:[{ required: true, message: '请填写顾客明示的要求及用途表', trigger: 'blur' }],
reviewMesses:[{ required: true, message: '请填写评审/变更内容表', trigger: 'blur' }],
},
@@ -424,10 +451,25 @@
}
await getContractList()
await getPeopleList()
+ await getDeptList()
dialogVisible.value = true;
}
+const getDeptList = async () => {
+ if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+ return
+ }
+ const param = {
+ pageNum: 1,
+ pageSize: 999,
+ companyId: state.form.companyId
+ }
+ const res = await getDept(param)
+ if(res.code === 200){
+ state.deptList = res.data
+ }
+}
const onSubmit = async () => {
-
+ await generateAndUpload()
const valid = await busRef.value.validate();
if(valid){
if(title.value === '新增'){
@@ -467,6 +509,50 @@
}
}
}
+const templatePath = ref()
+const generateAndUpload = async () => {
+ try {
+ const data = JSON.parse(JSON.stringify(state.form))
+ data.contractReviewRequires = data.contractReviewRequires.map(item => {
+ return{
+ ...item,
+ remark: item.remark ? item.remark : ' '
+ }
+ })
+ templatePath.value = data.type == 1 ? '/contractReviewExample.docx' : '/contractChangeExample.docx'
+ const msg = data.type == 1 ? '评审' : '变更'
+ const response = await fetch(templatePath.value) // public目录下的文件可直接通过/访问
+ if (!response.ok) {
+ throw new Error('模板文件加载失败')
+ }
+ const templateContent = await response.arrayBuffer()
+ const zip = new PizZip(templateContent)
+ const doc = new docxtemplater(zip, {
+ paragraphLoop: true,
+ linebreaks: true
+ })
+ doc.setData(data)
+ doc.render()
+ const out = doc.getZip().generate({
+ type: 'blob',
+ mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+ })
+ const file = new File([out],`合同${msg}表.docx`, {
+ type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+ })
+ const formData = new FormData()
+ formData.append('file', file)
+
+ const uploadResponse = await axios.post(import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', formData, {
+ headers: {
+ Authorization: getToken()
+ },
+ })
+ state.form.fileName = uploadResponse.data.data.originName
+ state.form.filePath = uploadResponse.data.data.path
+ } catch (error) {
+ }
+}
const getContractList = async () => {
if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
return
@@ -486,13 +572,11 @@
return
}
const queryParams = {
- pageNum: 1,
- pageSize: 9999,
companyId: state.form.companyId
}
- const res = await getUser(queryParams)
+ const res = await getEmployeeRecords(queryParams)
if(res.code == 200){
- state.peopleList = res.data.list?res.data.list:[]
+ state.peopleList = res.data?res.data:[]
}else{
ElMessage.warning(res.message)
}
@@ -525,7 +609,12 @@
legalTime: "",
suggest: '',
contractReviewRequires: [],
- reviewMesses: []
+ reviewMesses: [],
+ filePath:'',
+ fileName:'',
+ registrantName:'',
+ legalName:'',
+ number:''
}
state.companyList = []
state.contractList = []
@@ -541,6 +630,7 @@
state.form.companyId = item.id
}
})
+ getDeptList()
getContractList()
getPeopleList()
}
@@ -549,15 +639,15 @@
state.form.contractReviewRequires.push({})
}
const addContentTable = () => {
- state.form.reviewMesses.push({contractReviewMessbs: [{}]})
+ state.form.reviewMesses.push({})
}
-const addObject = (val,itemIndex) => {
- state.form.reviewMesses.forEach((item,index) => {
- if(index == itemIndex){
- item.contractReviewMessbs.push({})
- }
- })
-}
+// const addObject = (val,itemIndex) => {
+// state.form.reviewMesses.forEach((item,index) => {
+// if(index == itemIndex){
+// item.contractReviewMessbs.push({})
+// }
+// })
+// }
const delProduct = (val,itemIndex) => {
state.form.contractReviewRequires.forEach((item,index) => {
if(index == itemIndex){
@@ -568,14 +658,37 @@
const delContent = (val,itemIndex) => {
state.form.reviewMesses.forEach((item,index) => {
if(index == itemIndex){
- if(item.contractReviewMessbs.length == 1){
- state.form.reviewMesses.splice(index,1)
- }else {
- item.contractReviewMessbs.pop()
- }
+ state.form.reviewMesses.splice(index,1)
}
})
}
+const changeRegistrant = (val) => {
+ const obj = state.peopleList.find(i => i.userId == val)
+ state.form.registrantName = obj.name
+
+}
+const changeLegal = (val) => {
+ const obj = state.peopleList.find(i => i.userId == val)
+ state.form.legalName = obj.name
+
+}
+const changeReviewUser = (val,index) => {
+ const obj = state.peopleList.find(i => i.userId == val)
+ state.form.reviewMesses[index].reviewName = obj.name
+
+}
+const changeContract = (val) => {
+ const obj = state.contractList.find(i => i.id == val)
+ state.form.number = obj.number
+
+}
+const changeDept = (val) => {
+ const obj = state.deptList.find(i => i.deptId == val)
+ state.form.deptName = obj.deptName
+}
+
+
+
defineExpose({
openDialog
diff --git a/src/views/work/marketingManagement/contractManagement/contractChange/index.vue b/src/views/work/marketingManagement/contractManagement/contractChange/index.vue
index ce03607..baa5fbf 100644
--- a/src/views/work/marketingManagement/contractManagement/contractChange/index.vue
+++ b/src/views/work/marketingManagement/contractManagement/contractChange/index.vue
@@ -21,7 +21,27 @@
</el-option>
</el-select>
</el-form-item>
- <el-form-item v-if="data.isAdmin">
+ <el-form-item label="评审状态:" style="margin-left: 20px">
+ <el-select v-model="data.queryParams.status" placeholder="请选择" filterable clearable>
+ <el-option
+ v-for="item in data.stateList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="评审类型:" style="margin-left: 20px">
+ <el-select v-model="data.queryParams.type" placeholder="请选择" filterable clearable>
+ <el-option
+ v-for="item in data.typeList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item >
<el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
<el-button plain @click="reset">重置</el-button>
</el-form-item>
@@ -90,12 +110,32 @@
pageNum: 1,
pageSize: 10,
companyId: null,
- year: '',
- type: ''
+ status:null,
+ type:null
},
companyList: [],
isAdmin: false,
dialogVisible: false,
+ stateList:[
+ {
+ id: 0,
+ name:'待评审'
+ },
+ {
+ id: 1,
+ name:'已评审'
+ },
+ ],
+ typeList:[
+ {
+ id: 1,
+ name:'合同评审'
+ },
+ {
+ id: 2,
+ name:'合同变更'
+ },
+ ],
});
const dataList = ref([]);
const total = ref(0);
@@ -168,6 +208,8 @@
companyId: '',
pageNum: 1,
pageSize: 10,
+ status:null,
+ type:null
}
choosedData.value = []
data.companyList = [];
@@ -177,6 +219,8 @@
companyId: data.queryParams.companyId,
pageNum: 1,
pageSize: 10,
+ status:null,
+ type:null
}
}
getList();
@@ -195,18 +239,6 @@
data.forEach(item => {
const msg = item.type == 1 ? '评审' : '变更'
templatePath.value = item.type == 1 ? '/contractReviewExample.docx' : '/contractChangeExample.docx'
- item.reviewMesses = item.reviewMesses.map((i,index) => {
- return{
- ...i,
- contractReviewMessbs: i.contractReviewMessbs.map((q,qindex) => {
- return{
- ...q,
- first: qindex == 0,
- num: index+1,
- }
- })
- }
- })
item.contractReviewRequires = item.contractReviewRequires.map((item,index) => {
return {
...item,
diff --git a/src/views/work/menuIndex/index.vue b/src/views/work/menuIndex/index.vue
index c134af0..167b244 100644
--- a/src/views/work/menuIndex/index.vue
+++ b/src/views/work/menuIndex/index.vue
@@ -27,8 +27,8 @@
<div class="process-list" v-if="flowList && flowList.length>0">
<div class="process-item" v-for="process in flowList" :key="process.id">
<div class="process-info" @click="openDetail(process)">
- <span class="process-status" :class="{processing: process.type == 1,pending: process.type == 2,success: process.type == 3,normal: process.type == 4,seal: process.type == 5,normal: process.type == 6}">
- {{process.type == 1? '内审实施计划':process.type == 2? '培训计划':process.type == 3? '项目评审':process.type == 4?'年度检定计划':process.type == 5?'用章审批(申请)': process.type == 6? '用章审批(待审批)': '颁布令'}}
+ <span class="process-status" :class="{processing: process.type == 1,pending: process.type == 2,success: process.type == 3,normal: process.type == 4,seal: process.type == 5,normal: process.type == 6,normal: process.type == 8}">
+ {{process.type == 1? '内审实施计划':process.type == 2? '培训计划':process.type == 3? '项目评审':process.type == 4?'年度检定计划':process.type == 5?'用章审批(申请)': process.type == 6? '用章审批(待审批)':process.type == 7?'颁布令':process.type == 8?'合同审批':'' }}
</span>
<span class="process-name">{{process.title}}</span>
</div>
--
Gitblit v1.9.2