| | |
| | | <el-form :model="state.form" size="default" ref="busRef" :rules="state.rules" label-position="top" label-width="130"> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin"> |
| | | <el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | |
| | | <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" |
| | |
| | | </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> |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | 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"; |
| | |
| | | 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(""); |
| | |
| | | legalTime: "", |
| | | suggest: '', |
| | | contractReviewRequires: [], |
| | | reviewMesses: [] |
| | | reviewMesses: [], |
| | | filePath:'', |
| | | fileName:'', |
| | | registrantName:'', |
| | | legalName:'', |
| | | number:'' |
| | | }, |
| | | rules: { |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | |
| | | 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' }], |
| | | }, |
| | |
| | | } |
| | | 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 === '新增'){ |
| | |
| | | } |
| | | } |
| | | } |
| | | 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 |
| | |
| | | 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) |
| | | } |
| | |
| | | legalTime: "", |
| | | suggest: '', |
| | | contractReviewRequires: [], |
| | | reviewMesses: [] |
| | | reviewMesses: [], |
| | | filePath:'', |
| | | fileName:'', |
| | | registrantName:'', |
| | | legalName:'', |
| | | number:'' |
| | | } |
| | | state.companyList = [] |
| | | state.contractList = [] |
| | |
| | | state.form.companyId = item.id |
| | | } |
| | | }) |
| | | getDeptList() |
| | | getContractList() |
| | | getPeopleList() |
| | | } |
| | |
| | | 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){ |
| | |
| | | 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 |