<template>
|
<div class="notice">
|
<el-dialog
|
v-model="dialogVisible"
|
:title="title"
|
width="850px"
|
:before-close="handleClose"
|
:close-on-press-escape="false"
|
:close-on-click-modal="false"
|
>
|
<el-form :model="state.form" size="default" ref="busRef" :rules="state.rules" label-position="top" label-width="130">
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item label="单位名称:" prop="companyId" v-if="state.isAdmin">
|
<el-select v-model="state.form.companyId" placeholder="请选择" filterable clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin" @change="selectValueCom">
|
<el-option
|
v-for="item in state.companyList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id">
|
</el-option>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item label="评审类型:" prop="type" >
|
<el-select clearable v-model="state.form.type" :disabled="title =='查看'" filterable>
|
<el-option
|
v-for="item in state.typeList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="8">
|
<el-form-item label="合同:" prop="contractId" >
|
<el-select clearable v-model="state.form.contractId" :disabled="title =='查看'" filterable>
|
<el-option
|
v-for="item in state.contractList"
|
:key="item.id"
|
:label="item.contractName"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="记录日期:" prop="recordTime" >
|
<el-date-picker
|
:disabled="title =='查看'"
|
v-model="state.form.recordTime"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择记录日期"
|
/>
|
</el-form-item>
|
</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-option
|
v-for="item in state.peopleList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24" style="margin-bottom: 10px">
|
<el-col :span="24">
|
<span style="font-weight: 550;font-size: 18px">顾客信息</span>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="8">
|
<el-form-item label="名称:" prop="customerName" >
|
<el-input :disabled="title === '查看'" v-model="state.form.customerName" placeholder="名称"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="联系人:" prop="customerUser" >
|
<el-input :disabled="title === '查看'" v-model="state.form.customerUser" placeholder="联系人"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="电话:" prop="costomerPhone" >
|
<el-input :disabled="title === '查看'" v-model="state.form.costomerPhone" placeholder="电话"></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item label="顾客明示的要求及用途(订货产品信息):" prop="contractReviewRequires" >
|
<el-button
|
:disabled="title === '查看'"
|
type="primary"
|
@click="addProductTable"
|
style="margin-left: 10px;margin-bottom: 10px"
|
>新增</el-button>
|
<div style="display: flex;width: 100%;">
|
<el-table :data="state.form.contractReviewRequires" :border="true" >
|
<el-table-column type="index" label="序号" align="center"></el-table-column>
|
<el-table-column label="产品名称" prop="name" align="center" >
|
<template #default="{row,$index}">
|
<el-form-item :prop="'contractReviewRequires.' + '[' + $index + ']' + 'productName'" :rules="state.rules.productName">
|
<el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.productName" placeholder="请输入"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="规格型号" prop="specification" align="center" >
|
<template #default="{row,$index}">
|
<el-form-item :prop="'contractReviewRequires.' + '[' + $index + ']' + 'specification'" :rules="state.rules.specification">
|
<el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.specification" placeholder="请输入"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="数量" prop="amount" align="center" >
|
<template #default="{row,$index}">
|
<el-form-item :prop="'contractReviewRequires.' + '[' + $index + ']' + 'amount'" :rules="state.rules.amount">
|
<el-input style="margin-top: 10px" :disabled="title === '查看'" @input="row.amount = row.amount.replace(/[^0-9]/g,'')" type="textarea" :rows="2" v-model="row.amount" placeholder="请输入"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="单价" prop="price" align="center" >
|
<template #default="{row,$index}">
|
<el-form-item :prop="'contractReviewRequires.' + '[' + $index + ']' + 'price'" :rules="state.rules.price">
|
<el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" @input="row.price= row.price.replace(/[^\d.]/g, '') .replace(/\.+/g, '.').replace(/^\./, '0.').replace(/^(\d*\.?\d{0,2}).*/, '$1')" v-model="row.price" placeholder="请输入"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="其他" prop="remark" align="center" >
|
<template #default="{row,$index}">
|
<el-form-item :prop="'contractReviewRequires.' + '[' + $index + ']' + 'remark'" :rules="state.rules.remark">
|
<el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="2" v-model="row.remark" placeholder="请输入"></el-input>
|
</el-form-item>
|
</template>
|
</el-table-column>
|
<el-table-column label="操作" align="center" v-if="title !== '查看'" >
|
<template #default="scope">
|
<el-button link type="danger" @click="delProduct(scope.row,scope.$index)" >删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
</div>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="12">
|
<el-form-item label="交货期限:" prop="deliveryTime" >
|
<el-date-picker
|
:disabled="title =='查看'"
|
v-model="state.form.deliveryTime"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择记录日期"
|
/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="交付方式:" prop="deliveryType" >
|
<el-input :disabled="title === '查看'" v-model="state.form.deliveryType" placeholder="交付方式"></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="12">
|
<el-form-item label="交货地址:" prop="deliveryAddr" >
|
<el-input :disabled="title === '查看'" v-model="state.form.deliveryAddr" placeholder="交货地址"></el-input>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="付款方式:" prop="payType" >
|
<el-input :disabled="title === '查看'" v-model="state.form.payType" placeholder="付款方式"></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item label="产品和服务要求及其他要求:(或变更内容):" prop="productMess" >
|
<el-input :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.productMess" placeholder=""></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item label="风险识别:" prop="riskMess" >
|
<el-input :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.riskMess" placeholder=""></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item :label="state.form.type == 1 ? '评审内容' :state.form.type == 2?'变更内容':'内容' " prop="reviewMesses" >
|
<el-button
|
:disabled="title === '查看'"
|
type="primary"
|
@click="addContentTable"
|
style="margin-left: 10px;margin-bottom: 10px"
|
>新增</el-button>
|
<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" >
|
<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>
|
</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>
|
</el-form-item>
|
</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>
|
</div>
|
</template>
|
</el-table-column>
|
<el-table-column label="签字" prop="reviewSign" 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>
|
</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="danger" @click="delContent(scope.row,scope.$index)" >删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
</div>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<el-row :gutter="24">
|
<el-col :span="24">
|
<el-form-item label="审批意见:" prop="suggest" >
|
<el-input :disabled="title === '查看'" type="textarea" :rows="4" v-model="state.form.suggest" placeholder=""></el-input>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
<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-option
|
v-for="item in state.peopleList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id"
|
/>
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="日期:" prop="legalTime" >
|
<el-date-picker
|
:disabled="title =='查看'"
|
v-model="state.form.legalTime"
|
type="date"
|
value-format="YYYY-MM-DD"
|
placeholder="请选择记录日期"
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
<template #footer v-if="title !== '查看'">
|
<span class="dialog-footer">
|
<el-button @click="handleClose" size="default">取 消</el-button>
|
<el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button>
|
</span>
|
</template>
|
</el-dialog>
|
</div>
|
</template>
|
<script setup>
|
import {onMounted, reactive, ref, toRefs} from 'vue'
|
import Cookies from "js-cookie";
|
import {getCompany} from "@/api/onlineEducation/company";
|
import {ElMessage} from "element-plus";
|
import {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 {addContractReview, editContractReview} from "@/api/contractChange";
|
import {getCustomer} from "@/api/customerList";
|
import {getLedger} from "@/api/contractLedger";
|
import {verifyPhone} from "@/utils/validate";
|
|
const dialogVisible = ref(false);
|
const title = ref("");
|
const busRef = ref();
|
const length = ref()
|
const selectPopperClass = "max-width-select";
|
const emit = defineEmits(["getList"]);
|
const dataRef = ref();
|
const validatePhone = (rule, value, callback)=>{
|
if(value === ''){
|
callback(new Error('请输入手机号'))
|
}else{
|
if(!verifyPhone(value)){
|
callback(new Error('手机号格式有误'))
|
}else{
|
callback()
|
}
|
}
|
}
|
const state = reactive({
|
form: {
|
id: '',
|
companyId: null,
|
type: null,
|
contractId: null,
|
recordTime: "",
|
registrantId: null,
|
customerName: "",
|
customerUser: "",
|
costomerPhone: "",
|
deliveryTime: "",
|
deliveryAddr: "",
|
deliveryType: "",
|
payType: "",
|
productMess: "",
|
riskMess: "",
|
legalPerson: null,
|
legalTime: "",
|
suggest: '',
|
contractReviewRequires: [],
|
reviewMesses: []
|
},
|
rules: {
|
companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
|
type: [{ required: true, message: '请选择评审类型', trigger: 'blur' }],
|
contractId: [{ required: true, message: '请选择合同', trigger: 'blur' }],
|
recordTime: [{ required: true, message: '请选择记录日期', trigger: 'blur' }],
|
registrantId: [{ required: true, message: '请选择记录人', trigger: 'blur' }],
|
customerName: [{ required: true, message: '请输入顾客名称', trigger: 'blur' }],
|
customerUser: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
|
costomerPhone: [{ required: true, validator: validatePhone, trigger: 'blur' }],
|
deliveryTime: [{ required: true, message: '请选择交货期限', trigger: 'blur' }],
|
deliveryAddr: [{ required: true, message: '请输入交货地址', trigger: 'blur' }],
|
deliveryType: [{ required: true, message: '请输入交付方式', trigger: 'blur' }],
|
payType: [{ required: true, message: '请输入付款方式', trigger: 'blur' }],
|
productMess: [{ 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' }],
|
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"}],
|
reviewMess:[{required: true, message: "", trigger: "blur"}],
|
reviewOpinion:[{required: true, message: "", trigger: "blur"}],
|
reviewSign:[{required: true, message: "", trigger: "blur"}],
|
contractReviewRequires:[{ required: true, message: '请填写顾客明示的要求及用途表', trigger: 'blur' }],
|
reviewMesses:[{ required: true, message: '请填写评审/变更内容表', trigger: 'blur' }],
|
},
|
peopleList: [],
|
isAdmin: false,
|
companyList: [],
|
deptList: [],
|
contractList:[],
|
typeList: [
|
{
|
id: 1,
|
name: '合同评审'
|
},
|
{
|
id: 2,
|
name: '合同变更'
|
}
|
]
|
})
|
|
onMounted(() => {
|
|
|
});
|
const openDialog = async (type, value,companyList) => {
|
const userInfo = JSON.parse(Cookies.get('userInfo'))
|
state.isAdmin = userInfo.userType === 0;
|
state.form.companyName = userInfo.companyName
|
state.form.companyId = userInfo.companyId
|
if(state.isAdmin){
|
state.form.companyId = value.companyId
|
state.form.companyName = value.companyName
|
state.companyList = companyList
|
}
|
title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
|
if(type === 'edit' || type === 'review') {
|
state.form = JSON.parse(JSON.stringify(value));
|
if(state.isAdmin){
|
state.form.companyId = value.companyId
|
state.form.companyName = value.companyName
|
}
|
}
|
await getContractList()
|
await getPeopleList()
|
dialogVisible.value = true;
|
}
|
const onSubmit = async () => {
|
|
const valid = await busRef.value.validate();
|
if(valid){
|
if(title.value === '新增'){
|
console.log('sta',state.form)
|
const {id, ...data} = JSON.parse(JSON.stringify(state.form))
|
const res = await addContractReview(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))
|
data.reviewMesses.forEach(item => {
|
item.reviewId = state.form.id
|
})
|
const res = await editContractReview(data)
|
if(res.code === 200){
|
ElMessage({
|
type: 'success',
|
message: '编辑成功'
|
});
|
}else{
|
ElMessage.warning(res.message)
|
}
|
emit("getList")
|
busRef.value.clearValidate();
|
reset();
|
dialogVisible.value = false;
|
}
|
}
|
}
|
const getContractList = 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 getLedger(param)
|
if(res.code === 200){
|
state.contractList = res.data.list
|
}
|
}
|
const getPeopleList = async ()=> {
|
if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
|
return
|
}
|
const queryParams = {
|
pageNum: 1,
|
pageSize: 9999,
|
companyId: state.form.companyId
|
}
|
const res = await getUser(queryParams)
|
if(res.code == 200){
|
state.peopleList = res.data.list?res.data.list:[]
|
}else{
|
ElMessage.warning(res.message)
|
}
|
};
|
const handleClose = () => {
|
busRef.value.clearValidate();
|
reset();
|
dialogVisible.value = false;
|
emit("getList")
|
|
}
|
const reset = () => {
|
state.form = {
|
id: '',
|
companyId: null,
|
type: null,
|
contractId: null,
|
recordTime: "",
|
registrantId: null,
|
customerName: "",
|
customerUser: "",
|
costomerPhone: "",
|
deliveryTime: "",
|
deliveryAddr: "",
|
deliveryType: "",
|
payType: "",
|
productMess: "",
|
riskMess: "",
|
legalPerson: null,
|
legalTime: "",
|
suggest: '',
|
contractReviewRequires: [],
|
reviewMesses: []
|
}
|
state.companyList = []
|
state.contractList = []
|
}
|
|
|
const selectValueCom = (val) => {
|
state.form.contractId = null
|
state.form.registrantId = null
|
state.form.legalPerson = null
|
state.companyList.forEach(item => {
|
if(item.name === val){
|
state.form.companyId = item.id
|
}
|
})
|
getContractList()
|
getPeopleList()
|
}
|
|
const addProductTable = () => {
|
state.form.contractReviewRequires.push({})
|
}
|
const addContentTable = () => {
|
state.form.reviewMesses.push({contractReviewMessbs: [{}]})
|
}
|
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){
|
state.form.contractReviewRequires.splice(index,1)
|
}
|
})
|
}
|
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()
|
}
|
}
|
})
|
}
|
|
defineExpose({
|
openDialog
|
});
|
|
</script>
|
|
<style scoped lang="scss">
|
.notice{
|
:deep(.el-form .el-form-item__label) {
|
font-size: 15px;
|
}
|
.file {
|
display: flex;
|
flex-direction: column;
|
align-items: flex-start;
|
}
|
}
|
</style>
|