|
|
@@ -5,7 +5,7 @@
|
|
|
:close-on-click-modal="false" width="70%" :before-close="cancel">
|
|
|
<el-tabs v-model="activeName" type="card">
|
|
|
<el-tab-pane label="证书资质" name="QC">
|
|
|
- <el-form ref="form" :model="form">
|
|
|
+ <el-form ref="form" :model="form" class="el-form-box">
|
|
|
<headerTitle title="基本信息"/>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
@@ -14,27 +14,64 @@
|
|
|
<el-input v-model="form.name" :disabled="type=='view'" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="有效时间:" prop="date" label-width="90px">
|
|
|
+ <el-date-picker
|
|
|
+ :disabled="type=='view'"
|
|
|
+ v-model="form.date"
|
|
|
+ style="width: 100%;"
|
|
|
+ type="daterange"
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label-width="50px" label="备注">
|
|
|
<el-input type="textarea" v-model="form.remark" :disabled="type=='view'" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="附件:" prop="accessory" label-width="90px">
|
|
|
+ <fileUpload
|
|
|
+ v-if="type!=='view'"
|
|
|
+ v-model="form.accessory"
|
|
|
+ module="main"
|
|
|
+ :showLib="false"
|
|
|
+ :limit="10"/>
|
|
|
+ <div v-else>
|
|
|
+ <el-link
|
|
|
+ v-for="link in form.accessory"
|
|
|
+ :key="link.id"
|
|
|
+ type="primary"
|
|
|
+ :underline="false"
|
|
|
+ @click="downloadFile(link)">
|
|
|
+ {{ link.name }}
|
|
|
+ </el-link>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
<headerTitle title="资质信息"/>
|
|
|
- <ele-pro-table ref="linkTable" :columns="columns" :datasource="form.detailList" :toolkit="[]" height="350px"
|
|
|
+ <ele-pro-table ref="linkTable" :columns="columns" :datasource="form.detailsList" :toolkit="[]" height="350px"
|
|
|
:need-page="false">
|
|
|
<!-- 表头工具栏 -->
|
|
|
<template v-slot:toolbar>
|
|
|
|
|
|
<el-button v-if="type!=='view'" type="primary" @click="handleAdd">添加</el-button>
|
|
|
</template>
|
|
|
- <template v-slot:type="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.type'" :rules="{
|
|
|
+ <template v-slot:name="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.name'" :rules="{
|
|
|
required: true,
|
|
|
message: '',
|
|
|
trigger: 'change'
|
|
|
}">
|
|
|
- <el-select v-if="type!=='view'" v-model="scope.row.type" clearable
|
|
|
+ <el-select v-if="type!=='view'" v-model="scope.row.name" clearable
|
|
|
@change="(val)=>handleChangeType(val,scope.row)">
|
|
|
<el-option :disabled="disabledToType(scope.row).includes(item.dictCode)"
|
|
|
v-for="item in dictList" :value="item.dictCode"
|
|
|
@@ -42,27 +79,27 @@
|
|
|
</el-select>
|
|
|
<!-- <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
|
|
|
<!-- @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
|
|
|
- <span v-else>{{ scope.row.name }}</span>
|
|
|
+ <span v-else>{{ getLabelName(dictList,scope.row.name) }}</span>
|
|
|
</el-form-item>
|
|
|
|
|
|
</template>
|
|
|
- <template v-slot:num="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.num'" :rules="{
|
|
|
+ <template v-slot:code="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.code'" :rules="{
|
|
|
required: true,
|
|
|
message: '',
|
|
|
trigger: 'blur'
|
|
|
}">
|
|
|
- <el-input v-model="scope.row.num" :disabled="type=='view'" clearable></el-input>
|
|
|
+ <el-input v-model="scope.row.code" :disabled="type=='view'" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
|
|
|
</template>
|
|
|
- <template v-slot:scope="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.scope'">
|
|
|
- <el-input type="textarea" v-model="scope.row.scope" :disabled="type=='view'" clearable></el-input>
|
|
|
+ <template v-slot:businessRange="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.businessRange'">
|
|
|
+ <el-input type="textarea" v-model="scope.row.businessRange" :disabled="type=='view'" clearable></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
- <template v-slot:validityPeriodStart="scope">
|
|
|
- <el-form-item inline-message :prop="'detailList.' + scope.$index + '.validityPeriodStart'" :rules="{
|
|
|
+ <template v-slot:startTime="scope">
|
|
|
+ <el-form-item inline-message :prop="'detailsList.' + scope.$index + '.startTime'" :rules="{
|
|
|
required: true,
|
|
|
message: '',
|
|
|
trigger: 'change'
|
|
|
@@ -70,7 +107,7 @@
|
|
|
}">
|
|
|
<el-date-picker
|
|
|
:disabled="type=='view'"
|
|
|
- v-model="scope.row.validityPeriodStart"
|
|
|
+ v-model="scope.row.startTime"
|
|
|
type="date"
|
|
|
style="width: 100%"
|
|
|
value-format="yyyy-MM-dd"
|
|
|
@@ -79,8 +116,8 @@
|
|
|
</el-form-item>
|
|
|
|
|
|
</template>
|
|
|
- <template v-slot:validityPeriodEnd="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.validityPeriodEnd'"
|
|
|
+ <template v-slot:endTime="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.endTime'"
|
|
|
:rules="{
|
|
|
required: true,
|
|
|
validator: validateEndDate(scope.row,scope.$index),
|
|
|
@@ -88,7 +125,7 @@
|
|
|
}">
|
|
|
<el-date-picker
|
|
|
:disabled="type=='view'"
|
|
|
- v-model="scope.row.validityPeriodEnd"
|
|
|
+ v-model="scope.row.endTime"
|
|
|
type="date"
|
|
|
style="width: 100%"
|
|
|
value-format="yyyy-MM-dd"
|
|
|
@@ -97,8 +134,8 @@
|
|
|
</el-form-item>
|
|
|
|
|
|
</template>
|
|
|
- <template v-slot:notifyUserName="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.notifyUserName'" :rules="{
|
|
|
+ <template v-slot:noticePersonName="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.noticePersonName'" :rules="{
|
|
|
required: true,
|
|
|
message: '',
|
|
|
trigger: ['blur','change']
|
|
|
@@ -107,27 +144,27 @@
|
|
|
<el-input
|
|
|
:disabled="type=='view'"
|
|
|
@click.native="openStaffSelection(scope.$index)"
|
|
|
- v-model="scope.row.notifyUserName"
|
|
|
+ v-model="scope.row.noticePersonName"
|
|
|
placeholder="请选择"
|
|
|
></el-input>
|
|
|
</el-form-item>
|
|
|
|
|
|
</template>
|
|
|
- <template v-slot:files="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.files'" :rules="{
|
|
|
+ <template v-slot:accessory="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.accessory'" :rules="{
|
|
|
required: true,
|
|
|
message: '',
|
|
|
trigger: ['change','blur']
|
|
|
}">
|
|
|
<fileUpload
|
|
|
v-if="type!=='view'"
|
|
|
- v-model="scope.row.files"
|
|
|
+ v-model="scope.row.accessory"
|
|
|
module="main"
|
|
|
:showLib="false"
|
|
|
:limit="10"/>
|
|
|
<div v-else>
|
|
|
<el-link
|
|
|
- v-for="link in scope.row.files"
|
|
|
+ v-for="link in scope.row.accessory"
|
|
|
:key="link.id"
|
|
|
type="primary"
|
|
|
:underline="false"
|
|
|
@@ -138,13 +175,36 @@
|
|
|
</el-form-item>
|
|
|
|
|
|
</template>
|
|
|
+ <template v-slot:type="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.type'">
|
|
|
+ <el-select v-if="type!=='view'" v-model="scope.row.type" clearable>
|
|
|
+ <el-option v-for="item in typeList" :value="item.dictCode"
|
|
|
+ :label="item.dictValue"></el-option>
|
|
|
+ </el-select>
|
|
|
+ <!-- <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
|
|
|
+ <!-- @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
|
|
|
+ <span v-else>{{ getLabelName(typeList,scope.row.type) }}</span>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ </template>
|
|
|
+ <template v-slot:level="scope">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.level'">
|
|
|
+ <el-select v-if="type!=='view'" v-model="scope.row.level" clearable>
|
|
|
+ <el-option v-for="item in levelOptions" :value="item.dictCode"
|
|
|
+ :label="item.dictValue"></el-option>
|
|
|
+ </el-select>
|
|
|
+ <!-- <DictSelection v-if="type!=='view'" clearable dictName="客户/供应商资质类型" v-model="scope.row.type"-->
|
|
|
+ <!-- @itemChange="(val)=>handleChangeType(val,scope.row)"></DictSelection>-->
|
|
|
+ <span v-else>{{ getLabelName(levelOptions,scope.row.type) }}</span>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
<template v-slot:remark="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.remark'">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.remark'">
|
|
|
<el-input type="textarea" :disabled="type=='view'" v-model="scope.row.remark"></el-input>
|
|
|
</el-form-item>
|
|
|
</template>
|
|
|
<template v-slot:status="scope">
|
|
|
- <el-form-item :prop="'detailList.' + scope.$index + '.status'">
|
|
|
+ <el-form-item :prop="'detailsList.' + scope.$index + '.status'">
|
|
|
<el-tag v-if="scope.row.status" :type="statusTagTypeList[scope.row.status]">
|
|
|
{{ statusList[scope.row.status] }}
|
|
|
</el-tag>
|
|
|
@@ -212,7 +272,7 @@ export default {
|
|
|
components: {bpmDetail, FileUpload, staffSelection},
|
|
|
props: {
|
|
|
certificateQualificationsDialogFlag: Boolean,
|
|
|
- contactId: String,
|
|
|
+ contactInfo: Object,
|
|
|
typeInfo: String
|
|
|
},
|
|
|
data() {
|
|
|
@@ -221,26 +281,63 @@ export default {
|
|
|
type: '',
|
|
|
activeName: 'QC',
|
|
|
defaultData: {
|
|
|
- files: [],
|
|
|
+ accessory: [],
|
|
|
name: "",
|
|
|
- notifyUserId: "",
|
|
|
- notifyUserName: "",
|
|
|
+ noticePersonId: "",
|
|
|
+ noticePersonName: "",
|
|
|
num: "",
|
|
|
remark: "",
|
|
|
- scope: "",
|
|
|
+ businessRange: "",
|
|
|
type: "",
|
|
|
- validityPeriodEnd: "",
|
|
|
- validityPeriodStart: ""
|
|
|
+ endTime: "",
|
|
|
+ startTime: ""
|
|
|
},
|
|
|
form: {
|
|
|
- detailList: [],
|
|
|
- contactId: '',
|
|
|
+ accessory:[],
|
|
|
+ detailsList: [],
|
|
|
+ relationName: '',
|
|
|
name: '',
|
|
|
+ date: [],
|
|
|
remark: '',
|
|
|
|
|
|
},
|
|
|
curIndex: null,
|
|
|
- columns: [
|
|
|
+ levelOptions: [
|
|
|
+ {
|
|
|
+ dictValue: '初级',
|
|
|
+ dictCode: '1'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dictValue: '中级',
|
|
|
+ dictCode: '2'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ dictValue: '高级',
|
|
|
+ dictCode: '3'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ statusList: {
|
|
|
+ 10: '有效',
|
|
|
+ 20: '无效',
|
|
|
+ 30: '已过期',
|
|
|
+ },
|
|
|
+ statusTagTypeList: {
|
|
|
+ 10: 'success',
|
|
|
+ 20: 'info',
|
|
|
+ 30: 'danger',
|
|
|
+ },
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapGetters(['dict']),
|
|
|
+ dictList() {
|
|
|
+ return this.dict[dictEnum['客户/供应商资质类型']] || [];
|
|
|
+ },
|
|
|
+ typeList() {
|
|
|
+ return this.dict[dictEnum['工种类型']] || [];
|
|
|
+ },
|
|
|
+ columns() {
|
|
|
+ return [
|
|
|
{
|
|
|
type: 'index',
|
|
|
width: 55,
|
|
|
@@ -248,63 +345,77 @@ export default {
|
|
|
},
|
|
|
{
|
|
|
label: '名称',
|
|
|
- prop: 'type',
|
|
|
- slot: 'type',
|
|
|
+ prop: 'name',
|
|
|
+ slot: 'name',
|
|
|
headerSlot: 'isRequired',
|
|
|
- minWidth: 120,
|
|
|
+ minWidth: 180,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
label: '编号',
|
|
|
- prop: 'num',
|
|
|
- slot: 'num',
|
|
|
+ prop: 'code',
|
|
|
+ slot: 'code',
|
|
|
headerSlot: 'isRequired',
|
|
|
minWidth: 120,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
label: '许可/经营范围',
|
|
|
- prop: 'scope',
|
|
|
- slot: 'scope',
|
|
|
+ prop: 'businessRange',
|
|
|
+ slot: 'businessRange',
|
|
|
minWidth: 140,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
label: '有效期起始日期',
|
|
|
- prop: 'validityPeriodStart',
|
|
|
- slot: 'validityPeriodStart',
|
|
|
+ prop: 'startTime',
|
|
|
+ slot: 'startTime',
|
|
|
headerSlot: 'isRequired',
|
|
|
- minWidth: 140,
|
|
|
+ minWidth: 160,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
label: '有效期截止日期',
|
|
|
- prop: 'validityPeriodEnd',
|
|
|
- slot: 'validityPeriodEnd',
|
|
|
+ prop: 'endTime',
|
|
|
+ slot: 'endTime',
|
|
|
headerSlot: 'isRequired',
|
|
|
- minWidth: 140,
|
|
|
+ minWidth: 160,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
label: '通知人',
|
|
|
- prop: 'notifyUserName',
|
|
|
- slot: 'notifyUserName',
|
|
|
+ prop: 'noticePersonName',
|
|
|
+ slot: 'noticePersonName',
|
|
|
headerSlot: 'isRequired',
|
|
|
minWidth: 140,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
label: '附件',
|
|
|
- prop: 'files',
|
|
|
- slot: 'files',
|
|
|
+ prop: 'accessory',
|
|
|
+ slot: 'accessory',
|
|
|
headerSlot: 'isRequired',
|
|
|
minWidth: 140,
|
|
|
},
|
|
|
+ {
|
|
|
+ label: '等级',
|
|
|
+ prop: 'level',
|
|
|
+ slot: 'level',
|
|
|
+ minWidth: 140,
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '分类',
|
|
|
+ prop: 'type',
|
|
|
+ slot: 'type',
|
|
|
+ minWidth: 140,
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
{
|
|
|
label: '备注',
|
|
|
prop: 'remark',
|
|
|
slot: 'remark',
|
|
|
- action: 'remark',
|
|
|
+ minWidth: 140,
|
|
|
align: 'center'
|
|
|
},
|
|
|
{
|
|
|
@@ -317,53 +428,43 @@ export default {
|
|
|
action: 'action',
|
|
|
slot: 'action',
|
|
|
label: '操作',
|
|
|
- align: 'center'
|
|
|
+ align: 'center',
|
|
|
+ fixed:'right'
|
|
|
}
|
|
|
- ],
|
|
|
- statusList: {
|
|
|
- 10: '有效',
|
|
|
- 20: '无效',
|
|
|
- 30: '已过期',
|
|
|
- },
|
|
|
- statusTagTypeList: {
|
|
|
- 10: 'success',
|
|
|
- 20: 'info',
|
|
|
- 30: 'danger',
|
|
|
- },
|
|
|
- }
|
|
|
- },
|
|
|
- computed: {
|
|
|
- ...mapGetters(['dict']),
|
|
|
- dictList() {
|
|
|
- return this.dict[dictEnum['客户/供应商资质类型']] || [];
|
|
|
+ ]
|
|
|
},
|
|
|
disabledToType() {
|
|
|
return (row) => {
|
|
|
- let list = this.form.detailList.map(item => item.type)
|
|
|
+ let list = this.form.detailsList.map(item => item.name)
|
|
|
let dictCodeList = this.dictList.map(item => item.dictCode)
|
|
|
let intersectionList = list.filter((v) => dictCodeList.indexOf(v) > -1)
|
|
|
- intersectionList = intersectionList.filter(v => row.type !== v)
|
|
|
+ intersectionList = intersectionList.filter(v => row.name !== v)
|
|
|
return intersectionList
|
|
|
}
|
|
|
},
|
|
|
},
|
|
|
created() {
|
|
|
this.requestDict('客户/供应商资质类型');
|
|
|
+ this.requestDict('工种类型');
|
|
|
},
|
|
|
methods: {
|
|
|
...mapActions('dict', ['requestDict']),
|
|
|
+ getLabelName(arr,id){
|
|
|
+ if(!id) return ''
|
|
|
+ return arr.find(item=>item.dictCode == id)?.dictValue
|
|
|
+ },
|
|
|
//删除资质
|
|
|
handleRemove(index) {
|
|
|
- this.form.detailList.splice(index, 1)
|
|
|
+ this.form.detailsList.splice(index, 1)
|
|
|
},
|
|
|
//结束日期验证
|
|
|
validateEndDate(row, index) {
|
|
|
return (rule, value, callback) => {
|
|
|
if (!value) return callback(new Error(''))
|
|
|
if (
|
|
|
- row.validityPeriodEnd &&
|
|
|
- row.validityPeriodStart &&
|
|
|
- value < row.validityPeriodStart
|
|
|
+ row.endTime &&
|
|
|
+ row.startTime &&
|
|
|
+ value < row.startTime
|
|
|
) {
|
|
|
callback(new Error('截止日期不能小于起始日期'))
|
|
|
} else {
|
|
|
@@ -381,6 +482,7 @@ export default {
|
|
|
},
|
|
|
async getCertificateInfo(row) {
|
|
|
this.form = await contactQcPackDetailAPI(row.id)
|
|
|
+ this.form.date = [this.form.startTime, this.form.endTime]
|
|
|
},
|
|
|
//打开选择负责人弹窗
|
|
|
openStaffSelection(index) {
|
|
|
@@ -389,12 +491,12 @@ export default {
|
|
|
},
|
|
|
//选择负责人回调
|
|
|
confirmStaffSelection(data) {
|
|
|
- this.form.detailList[this.curIndex].notifyUserName = data.map((item) => item.name).toString();
|
|
|
- this.form.detailList[this.curIndex].notifyUserId = data.map((item) => item.id).toString();
|
|
|
+ this.form.detailsList[this.curIndex].noticePersonName = data.map((item) => item.name).toString();
|
|
|
+ this.form.detailsList[this.curIndex].noticePersonId = data.map((item) => item.id).toString();
|
|
|
},
|
|
|
//新增
|
|
|
handleAdd() {
|
|
|
- this.form.detailList.push({...this.defaultData})
|
|
|
+ this.form.detailsList.push({...this.defaultData})
|
|
|
},
|
|
|
//修改资质证书
|
|
|
handleChangeType(val, row) {
|
|
|
@@ -407,11 +509,16 @@ export default {
|
|
|
},
|
|
|
//保存/提交
|
|
|
handleSave(isSub) {
|
|
|
- if (!this.contactId) return this.$message.success('请保存合同信息后新增资质')
|
|
|
+ let msg = this.typeInfo == '1' ? '请保存客户信息后新增资质':'请保存供应商信息后新增资质'
|
|
|
+ if (!this.contactInfo.id) return this.$message.success(msg)
|
|
|
this.$refs.form.validate(async (valid) => {
|
|
|
if (!valid) return this.$message.warning('有必填项未填写,请检查')
|
|
|
- if (!this.form.detailList.length) return this.$message.warning('至少保存一条资质信息')
|
|
|
- this.form.contactId = this.contactId
|
|
|
+ if (!this.form.detailsList.length) return this.$message.warning('至少保存一条资质信息')
|
|
|
+ this.form.certificationType = this.typeInfo
|
|
|
+ this.form.relationId = this.contactInfo.id
|
|
|
+ this.form.relationName = this.contactInfo.name
|
|
|
+ this.form.startTime = this.form.date[0]
|
|
|
+ this.form.endTime = this.form.date[1]
|
|
|
let api = this.type == 'add' ? contactQcPackSaveAPI : contactQcPackUpdateAPI
|
|
|
let id = await api(this.form)
|
|
|
if (isSub) {
|