update 标准征求意见流程

This commit is contained in:
赵霄
2023-11-16 18:00:38 +08:00
parent 99e3b44f3c
commit 53bb03a9f5
11 changed files with 882 additions and 57 deletions
+31 -1
View File
@@ -160,6 +160,26 @@ const agreeStandardECProcess = (params) => postAction('/process/fb/processFbEntr
// 驳回 // 驳回
const rejectStandardECProcess = (params) => postAction('/process/fb/processFbEntryChange/reject', params) const rejectStandardECProcess = (params) => postAction('/process/fb/processFbEntryChange/reject', params)
/*标准征求意见流程*/
// 获取标准被拆分的列表
const querySpitFileByStandardNumber = (params) => getAction('/laws/standard/common/getSplitsByStandardNumber', params)
// 获取标准条款号
const queryStandardClauseNumber = (params) => getAction('/laws/DocumentTool/documentSplit/queryTreeMenuByInfoId', params)
// 保存
const saveConsultationProcess = (params) => postAction('/process/fb/processFbStandardConsultation/saveToDraft', params)
// 查询流程详情
const queryConsultationProcessDetail = (params) => getAction('/process/fb/processFbStandardConsultation/queryProcessInfoVO', params)
// 发起
const initiateConsultationProcess = (params) => postAction('/process/fb/processFbStandardConsultation/startProcess', params)
// 提交
const submitConsultationProcess = (params) => postAction('/process/fb/processFbStandardConsultation/submit', params)
// 转办
const transferConsultationProcess = (params) => postAction('/process/fb/processFbStandardConsultation/transfer', params)
// 同意
const agreeConsultationProcess = (params) => postAction('/process/fb/processFbStandardConsultation/agree', params)
// 驳回
const rejectConsultationProcess = (params) => postAction('/process/fb/processFbStandardConsultation/reject', params)
export { export {
getProcessNodeList, getProcessNodeList,
@@ -240,5 +260,15 @@ export {
queryStandardECProcessData, queryStandardECProcessData,
turnToStandardECProcess, turnToStandardECProcess,
agreeStandardECProcess, agreeStandardECProcess,
rejectStandardECProcess rejectStandardECProcess,
querySpitFileByStandardNumber,
queryStandardClauseNumber,
saveConsultationProcess,
queryConsultationProcessDetail,
initiateConsultationProcess,
submitConsultationProcess,
transferConsultationProcess,
agreeConsultationProcess,
rejectConsultationProcess
} }
+2 -1
View File
@@ -238,7 +238,8 @@ module.exports = {
moduleOwner: '模块负责人', moduleOwner: '模块负责人',
designEngineer: '设计工程师', designEngineer: '设计工程师',
solicitationList: '征求意见列表', solicitationList: '征求意见列表',
chapterName: '章节名称' chapterName: '章节名称',
pleaseSelectCriteriaFirst: '请先选择标准',
}, },
// 企标稽查计划 // 企标稽查计划
esInspectionPlan: { esInspectionPlan: {
+9 -5
View File
@@ -38,7 +38,8 @@
<template v-else-if="form.fieldShowType === 2"> <template v-else-if="form.fieldShowType === 2">
<j-upload <j-upload
v-model="record[form.dbFieldName]" v-model="record[form.dbFieldName]"
:disabled="form.isDisabled || false"> :disabled="form.isDisabled || false"
:file-type="form.fileType || canUploadType">
</j-upload> </j-upload>
</template> </template>
<template v-else-if="form.fieldShowType === 3"> <template v-else-if="form.fieldShowType === 3">
@@ -76,7 +77,8 @@
<template v-else-if="form.fieldShowType === 2"> <template v-else-if="form.fieldShowType === 2">
<j-upload <j-upload
v-model="record[form.dbFieldName]" v-model="record[form.dbFieldName]"
:disabled="form.isDisabled || false"> :disabled="form.isDisabled || false"
:file-type="form.fileType || canUploadType">
</j-upload> </j-upload>
</template> </template>
<template v-else-if="form.fieldShowType === 3"> <template v-else-if="form.fieldShowType === 3">
@@ -208,15 +210,17 @@ export default {
}, },
wrapperCol: { wrapperCol: {
sm: 16 sm: 16
} },
// 本系统限制可以上传的文件格式
canUploadType: 'pdf,docx,doc,xlsx,xls,ppt,pptx,rar,zip,jpg,jpeg,png,avi,wmv,mov,rm,mp4,cad'
} }
}, },
methods: { methods: {
submit () { submit () {
const arr = [] const arr = []
for (const i in this.dataSource) { for (const i in this.dataSource) {
if (this.$refs[`ruleForm${i}`]) { if (this.$refs[`ruleForm${i}`][0]) {
this.$refs[`ruleForm${i}`].validate(valid => { this.$refs[`ruleForm${i}`][0].validate(valid => {
arr[i] = valid arr[i] = valid
}) })
} else { } else {
@@ -30,8 +30,8 @@
</a-col> </a-col>
<div style="float: right;overflow: hidden;margin-right: 41px;margin-bottom: 20px" <div style="float: right;overflow: hidden;margin-right: 41px;margin-bottom: 20px"
class="table-page-search-submitButtons"> class="table-page-search-submitButtons">
<a-button style="margin-left: 8px" type="primary" icon="search" @click="searchQuery">{{$t('query')}}</a-button> <a-button style="margin-left: 8px" type="primary" icon="search" @click="searchQuery">{{ $t('query') }}</a-button>
<a-button style="margin-left: 8px" type="primary" ghost icon="reload" @click="searchReset">{{$t('reset')}}</a-button> <a-button style="margin-left: 8px" type="primary" ghost icon="reload" @click="searchReset">{{ $t('reset') }}</a-button>
</div> </div>
</a-row> </a-row>
</a-form> </a-form>
@@ -99,9 +99,17 @@ export default {
}, },
// 列表数据不包含的标准 // 列表数据不包含的标准
excludeStandardNumbers: { excludeStandardNumbers: {
type:String, type: String,
required: false, required: false,
default: null default: null
},
// 过滤条件
filters: {
type: Object,
required: false,
default: () => {
return {}
}
} }
}, },
data () { data () {
@@ -186,10 +194,15 @@ export default {
replacePage () { replacePage () {
const query = { const query = {
...this.queryParam, ...this.queryParam,
...this.filters,
pageNo: this.ipagination.current, pageNo: this.ipagination.current,
pageSize: this.ipagination.pageSize, pageSize: this.ipagination.pageSize,
excludeStandardNumbers: this.excludeStandardNumbers excludeStandardNumbers: this.excludeStandardNumbers
} }
// 清空在可选范围内进行查询
if (!query.source && this.canSelectedSource.length < 3) {
query.source = this.canSelectedSource.join(',')
}
// this.selectedRowKeys = [] // this.selectedRowKeys = []
this.loading = true this.loading = true
getStandardList(query).then((res) => { getStandardList(query).then((res) => {
+1 -1
View File
@@ -129,7 +129,7 @@ export default class EsEnum {
} }
for (const i in this) { for (const i in this) {
const e = this[i] const e = this[i]
if (e.value !== undefined && e.value !== null && e.value.toString() === value.toString()) { if (e.value !== undefined && e.value !== null && e.value.toString().indexOf(value.toString()) !== -1) {
return i return i
} }
} }
+12 -2
View File
@@ -228,7 +228,10 @@ export const ConsultationProcess = new EsEnums({
distribute: { text: '各部所主管级领导分发', value: 'depart_leader_start', btn: ['return', 'save', 'submit'] }, distribute: { text: '各部所主管级领导分发', value: 'depart_leader_start', btn: ['return', 'save', 'submit'] },
moduleOwnerDistribution: { text: '模块负责人分发', value: '1', btn: ['return', 'save', 'submit'] }, moduleOwnerDistribution: { text: '模块负责人分发', value: '1', btn: ['return', 'save', 'submit'] },
designEngineerFillIn: { text: '设计工程师填写', value: '2', btn: ['return', 'save', 'submit'] }, designEngineerFillIn: { text: '设计工程师填写', value: '2', btn: ['return', 'save', 'submit'] },
audit: { text: '审批', value: '3', btn: ['return', 'save', 'agree', 'reject'] } moduleOwnerSummary: { text: '模块负责人汇总', value: '4', btn: ['return', 'save', 'submit'] },
leaderApproval: { text: '各部所主管级领导审批', value: '5', btn: ['return', 'save', 'agree', 'reject'] },
leaderSummary: { text: '各部所主管级领导汇总', value: '6', btn: ['return', 'save', 'submit'] },
regulatoryEngineerApproval: { text: '法规工程师审批', value: '7', btn: ['return', 'save', 'agree', 'reject'] },
}) })
// 下发人员类型 // 下发人员类型
@@ -243,4 +246,11 @@ export const EvaluationResultType = new EsEnums({
inconformity: { text: '不符合', value: '2' }, inconformity: { text: '不符合', value: '2' },
toBeVerified: { text: '待验证', value: '3' }, toBeVerified: { text: '待验证', value: '3' },
uninvolved: { text: '不涉及', value: '4' } uninvolved: { text: '不涉及', value: '4' }
}) })
// 征求意见流程-意见
export const SolicitOpinions = {
accept: { text: '采纳', value: '1' },
partialAdoption: { text: '部分采纳', value: '2' },
reject: { text: '不采纳', value: '3' }
}
@@ -64,7 +64,10 @@
<a-form-item :label="$t('standardNumber')"> <a-form-item :label="$t('standardNumber')">
<standard-selection v-decorator="['standardNumber', validatorRules.standardNumber]" <standard-selection v-decorator="['standardNumber', validatorRules.standardNumber]"
:disabled="basicServiceInfoDisabled" :disabled="basicServiceInfoDisabled"
:placeholder="$t('pleaseSelect') + $t('standardNumber')" /> :placeholder="$t('pleaseSelect') + $t('standardNumber')"
:filters="{releaseSplitFlag: '1'}"
:can-selected-source="[StandardSource.DOMESTIC.value]"
@nameChange="handleStandardChange" />
</a-form-item> </a-form-item>
</div> </div>
<div class="form-flex-item custom-flex-form-item"> <div class="form-flex-item custom-flex-form-item">
@@ -74,22 +77,24 @@
@change="event => event.target.value = event.target.value.trim()" @change="event => event.target.value = event.target.value.trim()"
:maxLength="50" :maxLength="50"
disabled disabled
:disabled="basicServiceInfoDisabled"
v-decorator="['standardName', validatorRules.standardName]" /> v-decorator="['standardName', validatorRules.standardName]" />
</a-form-item> </a-form-item>
</div> </div>
<div class="form-flex-item custom-flex-form-item"> <div class="form-flex-item custom-flex-form-item">
<!--标准文本--> <!--标准文本-->
<a-form-item :label="$t('workCenter.standardConsultationProcess.standardText')"> <a-form-item :label="$t('workCenter.standardConsultationProcess.standardText')"
:class="{'add-required': basicServiceInfoDisabled}">
<div class="box-title-text"> <div class="box-title-text">
<a-input class="box-input" <a-input class="box-input disabled-white-input"
v-decorator="['standardText', validatorRules.standardText]" v-decorator="['standardTextFileName', validatorRules.standardText]"
readonly readonly
:disabled="basicServiceInfoDisabled" disabled
v-if="!basicServiceInfoDisabled"
:placeholder="$t('pleaseSelect') + $t('workCenter.standardConsultationProcess.standardText')" /> :placeholder="$t('pleaseSelect') + $t('workCenter.standardConsultationProcess.standardText')" />
<a-button type="primary" class="button-box" @click="chooseStandardText"> <a-button type="primary" class="button-box" @click="chooseStandardText" v-if="!basicServiceInfoDisabled">
{{ this.$t('workCenter.standardConsultationProcess.selectText') }} {{ this.$t('workCenter.standardConsultationProcess.selectText') }}
</a-button> </a-button>
<file-echo :file-ids="basicServiceInfo.standardText" v-if="basicServiceInfoDisabled" />
</div> </div>
</a-form-item> </a-form-item>
</div> </div>
@@ -115,7 +120,7 @@
<div class="process-part-title">{{ $t('workCenter.dispatchInformation') }}</div> <div class="process-part-title">{{ $t('workCenter.dispatchInformation') }}</div>
<a-form :form="dispatchInfoForm"> <a-form :form="dispatchInfoForm">
<div class="form-flex-box"> <div class="form-flex-box">
<div class="form-flex-item custom-flex-form-item" v-if="currentNode === ConsultationProcess.distribute.value"> <div class="form-flex-item custom-flex-form-item" v-if="currentNode.indexOf(ConsultationProcess.distribute.value) === 0">
<!--下发人员类型--> <!--下发人员类型-->
<a-form-item :label="$t('workCenter.standardConsultationProcess.senderType')"> <a-form-item :label="$t('workCenter.standardConsultationProcess.senderType')">
<j-dict-select-tag v-decorator="['userType', validatorRules.userType]" <j-dict-select-tag v-decorator="['userType', validatorRules.userType]"
@@ -137,7 +142,7 @@
</div> </div>
<!--下发人员类型选了模块负责人或者模块负责人分发节点都显示这个选项--> <!--下发人员类型选了模块负责人或者模块负责人分发节点都显示这个选项-->
<div class="form-flex-item custom-flex-form-item" <div class="form-flex-item custom-flex-form-item"
v-if="senderType === SenderType.designEngineer.value || currentNode === ConsultationProcess.moduleOwnerDistribution.value"> v-if="senderType === SenderType.designEngineer.value || currentNode.indexOf(ConsultationProcess.moduleOwnerDistribution.value)===0">
<!--设计工程师--> <!--设计工程师-->
<a-form-item :label="$t('workCenter.standardConsultationProcess.designEngineer')"> <a-form-item :label="$t('workCenter.standardConsultationProcess.designEngineer')">
<user-selection v-decorator="['designEngineerId', validatorRules.designEngineerId]" <user-selection v-decorator="['designEngineerId', validatorRules.designEngineerId]"
@@ -154,7 +159,7 @@
<template v-if="showConsultationList"> <template v-if="showConsultationList">
<div class="process-part-title">{{ $t('workCenter.standardConsultationProcess.solicitationList') }}</div> <div class="process-part-title">{{ $t('workCenter.standardConsultationProcess.solicitationList') }}</div>
<!--设计工程师填写征求意见表格--> <!--设计工程师填写征求意见表格-->
<template v-if="currentNode === ConsultationProcess.designEngineerFillIn.value"> <template v-if="currentNode.indexOf(ConsultationProcess.designEngineerFillIn.value) === 0">
<div class="table-operator"> <div class="table-operator">
<!-- 新增--> <!-- 新增-->
<a-button icon="plus" type="primary" @click="handleAdd">{{ $t('newlyAdded') }}</a-button> <a-button icon="plus" type="primary" @click="handleAdd">{{ $t('newlyAdded') }}</a-button>
@@ -181,6 +186,33 @@
</j-table> </j-table>
</div> </div>
</template> </template>
<!--模块负责人汇总填写意见-->
<template v-if="showAuditTable">
<div class="table-operator">
<!--批量操作,汇总节点才有的按钮-->
<a-button type="primary" icon="delete" ghost @click="batchOperate" v-if="isSummaryNode">
{{ $t('batchOperation') }}
</a-button>
</div>
<j-expand-table ref="expandTable"
:columns="columns"
:data-source="dataSource"
bordered
form-is-depend="isAdopt"
:extra-form="collectExtraForm"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
<!--意见,汇总节点才用插槽,用表头控制了-->
<template v-slot:opinion="{text, record, index}">
<j-dict-select-tag :value="record.isAdopt"
:triggerChange="false"
class="opinion-select"
dict-code="consultation_opinion"
:placeholder="$t('pleaseSelect') + $t('workCenter.esInspectionPlan.opinion')"
@change="value => {handleOpinionChange(value, index)}" />
</template>
</j-expand-table>
</template>
</template> </template>
<!--流程审批信息--> <!--流程审批信息-->
@@ -201,6 +233,15 @@
</a-form> </a-form>
</div> </div>
<!--人员信息-->
<div class="detail-page-scroll-content p-0" v-show="switchValue === 'user'">
<process-detail-list>
<template #personnelInfo>
<personnel-info ref="personnelInfo" :data="personnelInfoData" />
</template>
</process-detail-list>
</div>
<div class="detail-page-bottom-operate-box"> <div class="detail-page-bottom-operate-box">
<!--转办 审批节点存在--> <!--转办 审批节点存在-->
<a-button type="primary" :loading="loading" ghost icon="arrow-up" v-if="btnList.includes('return')" @click="handleTurnTo"> <a-button type="primary" :loading="loading" ghost icon="arrow-up" v-if="btnList.includes('return')" @click="handleTurnTo">
@@ -215,36 +256,73 @@
{{ $t('submit') }} {{ $t('submit') }}
</a-button> </a-button>
<!--同意 审批节点存在--> <!--同意 审批节点存在-->
<a-button type="primary" :loading="loading" icon="check-circle" v-if="btnList.includes('agree')" @click="handleSubmit"> <a-button type="primary" :loading="loading" icon="check-circle" v-if="btnList.includes('agree')" @click="handleAgree">
{{ $t('agree') }} {{ $t('agree') }}
</a-button> </a-button>
<!--驳回 审批节点存在--> <!--驳回 审批节点存在-->
<a-button type="primary" :loading="loading" icon="close-circle" v-if="btnList.includes('reject')" @click="handleSubmit"> <a-button type="primary" :loading="loading" icon="close-circle" v-if="btnList.includes('reject')" @click="handleReject">
{{ $t('reject') }} {{ $t('reject') }}
</a-button> </a-button>
</div> </div>
<!--新增、编辑征求意见列表弹框--> <!--新增、编辑征求意见列表弹框-->
<consultation-modal ref="consultationModal" @ok="handleAddData" /> <consultation-modal ref="consultationModal" @ok="handleAddData" />
<!--选择标准文本-->
<select-standard-file-modal ref="selectStandardFileModal" @okItem="handleSelectedFile" />
<!--批量填写意见-->
<batch-write-opinion-modal ref="opinionModal" @ok="handleWriteOpinion" />
<!--转办选人-->
<user-select-modal ref="userSelectModal" check-required @change="continueTurnTo" />
</internal-detail-page> </internal-detail-page>
</template> </template>
<script> <script>
import InternalDetailPage from '../../../components/InternalDetailPage.vue' import InternalDetailPage from '../../../components/InternalDetailPage.vue'
import StandardSelection from '../../../components/selection/StandardSelection.vue' import StandardSelection from '../../../components/selection/StandardSelection.vue'
import { ConsultationProcess, SenderType } from '../../../enums/commonEnums' import { ConsultationProcess, SenderType, ProcessKey, StandardSource } from '../../../enums/commonEnums'
import UserSelection from '../../../components/selection/UserSelection' import UserSelection from '../../../components/selection/UserSelection'
import JTable from '../../../components/jero/JTable' import JTable from '../../../components/jero/JTable'
import ConsultationModal from './modules/ConsultationModal' import ConsultationModal from './modules/ConsultationModal'
import line from 'ant-design-vue/lib/progress/line' import ProcessDetailList from '../../../components/ProcessDetailList'
import PersonnelInfo from '../../../components/PersonnelInfo'
import { WorkCenterMixin } from '../../../mixins/WorkCenterMixin'
import JExpandTable from '../../../components/JExpandTable'
import SelectStandardFileModal from './modules/SelectStandardFileModal'
import FileEcho from '../../../components/FileEcho'
import BatchWriteOpinionModal from './modules/BatchWriteOpinionModal'
import {
saveConsultationProcess,
queryConsultationProcessDetail,
initiateConsultationProcess,
submitConsultationProcess,
transferConsultationProcess,
agreeConsultationProcess,
rejectConsultationProcess
} from '../../../api/workCenter'
import UserSelectModal from '../../../components/selection/UserSelectModal'
export default { export default {
name: 'StandardConsultationProcess', name: 'StandardConsultationProcess',
components: { JTable, UserSelection, InternalDetailPage, StandardSelection, ConsultationModal }, components: {
UserSelectModal,
FileEcho,
PersonnelInfo,
ProcessDetailList,
JTable,
UserSelection,
InternalDetailPage,
StandardSelection,
ConsultationModal,
JExpandTable,
SelectStandardFileModal,
BatchWriteOpinionModal
},
mixins: [WorkCenterMixin],
data () { data () {
return { return {
SenderType, SenderType,
ConsultationProcess, ConsultationProcess,
StandardSource,
switchValue: 'base', switchValue: 'base',
twoLabelCol: { twoLabelCol: {
xs: { span: 24 }, xs: { span: 24 },
@@ -337,10 +415,11 @@ export default {
}, },
btnList: [], // 显示的按钮 btnList: [], // 显示的按钮
loading: false, loading: false,
currentNode: '2', currentNode: '', // 当前节点
nodeEnumsKey: null, // 当前节点对应枚举的key nodeEnumsKey: null, // 当前节点对应枚举的key
senderType: null, senderType: null,
columns: [ // 设计工程师填写表头
designEngineerFillInColumns: [
{ {
title: this.$t('serialNumber'), title: this.$t('serialNumber'),
dataIndex: '', dataIndex: '',
@@ -354,12 +433,16 @@ export default {
{ // 章节编号 { // 章节编号
title: this.$t('workCenter.esInspectionProcess.sectionNumber'), title: this.$t('workCenter.esInspectionProcess.sectionNumber'),
width: 180, width: 180,
dataIndex: 'chapterNumber' align: 'center',
dataIndex: 'chapterNumber',
scopedSlots: { customRender: 'text' }
}, },
{ // 章节名称 { // 章节名称
title: this.$t('workCenter.standardConsultationProcess.chapterName'), title: this.$t('workCenter.standardConsultationProcess.chapterName'),
width: 180, width: 180,
dataIndex: 'chapterName' align: 'center',
dataIndex: 'chapterName',
scopedSlots: { customRender: 'text' }
}, },
{ // 修改意见内容 { // 修改意见内容
title: this.$t('workCenter.enStandardChange.revisedOpinionContent'), title: this.$t('workCenter.enStandardChange.revisedOpinionContent'),
@@ -394,8 +477,235 @@ export default {
width: 200 width: 200
} }
], ],
// 汇总表头
collectColumns: [
{
title: this.$t('serialNumber'),
dataIndex: '',
key: 'rowIndex',
align: 'center',
width: 80,
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{ // 章节编号
title: this.$t('workCenter.esInspectionProcess.sectionNumber'),
width: 180,
align: 'center',
dataIndex: 'chapterNumber',
scopedSlots: { customRender: 'text' }
},
{ // 章节名称
title: this.$t('workCenter.standardConsultationProcess.chapterName'),
width: 180,
align: 'center',
dataIndex: 'chapterName',
scopedSlots: { customRender: 'text' }
},
{ // 修改意见内容
title: this.$t('workCenter.enStandardChange.revisedOpinionContent'),
children: [
{ // 修改前
title: this.$t('workCenter.enStandardChange.beforeUpdate'),
align: 'center',
width: 180,
dataIndex: 'modificationBefore',
scopedSlots: { customRender: 'text' }
},
{ // 修改后
title: this.$t('workCenter.enStandardChange.afterUpdate'),
align: 'center',
width: 180,
dataIndex: 'modificationAfter',
scopedSlots: { customRender: 'text' }
},
{ // 修改理由
title: this.$t('workCenter.enStandardChange.updateReason'),
align: 'center',
width: 180,
dataIndex: 'modificationReason',
scopedSlots: { customRender: 'text' }
}
]
},
{ // 设计工程师
title: this.$t('workCenter.standardConsultationProcess.designEngineer'),
width: 180,
align: 'center',
dataIndex: 'designEngineerId_dictText',
scopedSlots: { customRender: 'text' }
},
{ // 意见
title: this.$t('workCenter.esInspectionPlan.opinion'),
width: 180,
align: 'center',
dataIndex: 'isAdopt_dictText',
scopedSlots: { customRender: 'opinion' }
}
],
dataSource: [], dataSource: [],
selectedRowKeys: [] selectedRowKeys: [],
// 汇总表格的表单校验
collectExtraForm: {
// 采纳
'1': {
rules: {
// 依据描述
basisDescription: {
required: false,
message: this.$t('pleaseEnter') + this.$t('projectLibrary.specialProjectLibrary.basisDescription'),
trigger: 'blur'
},
// 佐证材料
basisFile: {
required: false,
message: this.$t('pleaseUpload') + this.$t('projectLibrary.specialProjectLibrary.supportingMaterial'),
trigger: 'change'
}
},
formArr: [
{
fieldShowType: 1,
dbFieldTxt: this.$t('projectLibrary.specialProjectLibrary.basisDescription'),
dbFieldName: 'basisDescription'
},
{
fieldShowType: 2,
dbFieldTxt: this.$t('projectLibrary.specialProjectLibrary.supportingMaterial'),
dbFieldName: 'basisFile',
fileType: 'pdf,doc,docx,pptx,ppt,jpg,jpeg,png,xls,xlsx,bmp'
}
]
},
// 部分采纳
'2': {
rules: {
// 依据描述
basisDescription: {
required: false,
message: this.$t('pleaseEnter') + this.$t('projectLibrary.specialProjectLibrary.basisDescription'),
trigger: 'blur'
},
// 佐证材料
basisFile: {
required: false,
message: this.$t('pleaseUpload') + this.$t('projectLibrary.specialProjectLibrary.supportingMaterial'),
trigger: 'change'
}
},
formArr: [
{
fieldShowType: 1,
dbFieldTxt: this.$t('projectLibrary.specialProjectLibrary.basisDescription'),
dbFieldName: 'basisDescription'
},
{
fieldShowType: 2,
dbFieldTxt: this.$t('projectLibrary.specialProjectLibrary.supportingMaterial'),
dbFieldName: 'basisFile',
fileType: 'pdf,doc,docx,pptx,ppt,jpg,jpeg,png,xls,xlsx,bmp'
}
]
},
// 不采纳
'3': {
rules: {
// 依据描述
basisDescription: {
required: true,
message: this.$t('pleaseEnter') + this.$t('projectLibrary.specialProjectLibrary.basisDescription'),
trigger: 'blur'
},
// 佐证材料
basisFile: {
required: false,
message: this.$t('pleaseUpload') + this.$t('projectLibrary.specialProjectLibrary.supportingMaterial'),
trigger: 'change'
}
},
formArr: [
{
fieldShowType: 1,
dbFieldTxt: this.$t('projectLibrary.specialProjectLibrary.basisDescription'),
dbFieldName: 'basisDescription'
},
{
fieldShowType: 2,
dbFieldTxt: this.$t('projectLibrary.specialProjectLibrary.supportingMaterial'),
dbFieldName: 'basisFile',
fileType: 'pdf,doc,docx,pptx,ppt,jpg,jpeg,png,xls,xlsx,bmp'
}
]
}
},
// 审批表头
approvalColumns: [
{
title: this.$t('serialNumber'),
dataIndex: '',
key: 'rowIndex',
align: 'center',
width: 80,
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{ // 章节编号
title: this.$t('workCenter.esInspectionProcess.sectionNumber'),
width: 180,
align: 'center',
dataIndex: 'chapterNumber',
scopedSlots: { customRender: 'text' }
},
{ // 章节名称
title: this.$t('workCenter.standardConsultationProcess.chapterName'),
width: 180,
align: 'center',
dataIndex: 'chapterName',
scopedSlots: { customRender: 'text' }
},
{ // 修改意见内容
title: this.$t('workCenter.enStandardChange.revisedOpinionContent'),
children: [
{ // 修改前
title: this.$t('workCenter.enStandardChange.beforeUpdate'),
align: 'center',
width: 180,
dataIndex: 'modificationBefore',
scopedSlots: { customRender: 'text' }
},
{ // 修改后
title: this.$t('workCenter.enStandardChange.afterUpdate'),
align: 'center',
width: 180,
dataIndex: 'modificationAfter',
scopedSlots: { customRender: 'text' }
},
{ // 修改理由
title: this.$t('workCenter.enStandardChange.updateReason'),
align: 'center',
width: 180,
dataIndex: 'modificationReason',
scopedSlots: { customRender: 'text' }
}
]
},
{ // 设计工程师
title: this.$t('workCenter.standardConsultationProcess.designEngineer'),
width: 180,
align: 'center',
dataIndex: 'designEngineerId_dictText',
scopedSlots: { customRender: 'text' }
},
{ // 意见
title: this.$t('workCenter.standardConsultationProcess.moduleOwner') + this.$t('workCenter.esInspectionPlan.opinion'),
width: 180,
align: 'center',
dataIndex: 'isAdopt_dictText',
scopedSlots: { customRender: 'text' }
}
]
} }
}, },
computed: { computed: {
@@ -404,7 +714,8 @@ export default {
}, },
// 是否展示业务分派信息,各部所主管级领导分发、模块负责人分发显示 // 是否展示业务分派信息,各部所主管级领导分发、模块负责人分发显示
showDispatchInformation () { showDispatchInformation () {
return this.currentNode === ConsultationProcess.distribute.value || this.currentNode === ConsultationProcess.moduleOwnerDistribution.value const nodes = [ConsultationProcess.distribute.value, ConsultationProcess.moduleOwnerDistribution.value]
return nodes.some(tt => this.currentNode.indexOf(tt) === 0)
}, },
// 流程信息禁用,非发起节点都禁用 // 流程信息禁用,非发起节点都禁用
processInfoDisabled () { processInfoDisabled () {
@@ -412,11 +723,39 @@ export default {
}, },
// 业务基本信息禁用,非发起节点都禁用 // 业务基本信息禁用,非发起节点都禁用
basicServiceInfoDisabled () { basicServiceInfoDisabled () {
return this.currentNode && this.currentNode !== ConsultationProcess.initiate.value return this.currentNode && this.currentNode.indexOf(ConsultationProcess.initiate.value) === -1
}, },
// 展示征求意见列表(设计工程师填写征求意见) // 展示征求意见列表(设计工程师填写征求意见、模块负责人/各部所主管级领导汇总、各部所主管级领导/法规工程师审批)
showConsultationList () { showConsultationList () {
return this.currentNode === ConsultationProcess.designEngineerFillIn.value const nodes = [ConsultationProcess.designEngineerFillIn.value, ConsultationProcess.moduleOwnerSummary.value, ConsultationProcess.leaderApproval.value, ConsultationProcess.leaderSummary.value, ConsultationProcess.regulatoryEngineerApproval.value]
return nodes.some(tt => this.currentNode.indexOf(tt) === 0)
},
// 展示审批的表格
showAuditTable () {
const nodes = [ConsultationProcess.moduleOwnerSummary.value, ConsultationProcess.leaderSummary.value, ConsultationProcess.leaderApproval.value, ConsultationProcess.regulatoryEngineerApproval.value]
return nodes.some(tt => this.currentNode.indexOf(tt) === 0) || this.nodeEnumsKey === 'regulatoryEngineerApproval'
},
// 是否汇总节点
isSummaryNode () {
const nodes = [ConsultationProcess.moduleOwnerSummary.value, ConsultationProcess.leaderSummary.value]
return nodes.some(tt => this.currentNode.indexOf(tt) === 0)
},
columns () {
// 设计工程师填写征求意见表头
if (this.currentNode.indexOf(ConsultationProcess.designEngineerFillIn.value)) {
return this.designEngineerFillInColumns
}
// 模块负责人汇总填写意见表头
const summaryNodes = [ConsultationProcess.moduleOwnerSummary.value, ConsultationProcess.leaderSummary.value]
if (summaryNodes.some(tt => this.currentNode.indexOf(tt) === 0)) {
return this.collectColumns
}
// 审批节点表头
const auditNodes = [ConsultationProcess.leaderApproval.value, ConsultationProcess.regulatoryEngineerApproval.value]
if (auditNodes.some(tt => this.currentNode.indexOf(tt) === 0) || this.nodeEnumsKey === 'regulatoryEngineerApproval') {
return this.approvalColumns
}
return []
} }
}, },
created () { created () {
@@ -424,19 +763,35 @@ export default {
if (this.$route.query.processInstanceId || this.$route.query.draftId) { if (this.$route.query.processInstanceId || this.$route.query.draftId) {
} else { } else {
this.nodeEnumsKey = ConsultationProcess.keyOfValue(this.currentNode) || 'audit' // 找不到这个节点默认使用审批节点页面及按钮,发起除外
this.nodeEnumsKey = this.currentNode ? ConsultationProcess.keyOfValue(this.currentNode) || 'regulatoryEngineerApproval' : 'initiate'
this.btnList = ConsultationProcess[this.nodeEnumsKey].btn this.btnList = ConsultationProcess[this.nodeEnumsKey].btn
} }
// 获取人员信息数据
this.getPersonInfoStructure(ProcessKey.CONSULTATION.value)
}, },
methods: { methods: {
switchChange (value) { switchChange (value) {
this.switchValue = value this.switchValue = value
}, },
/**
* 选择标准带出标准名称
* @param name
*/
handleStandardChange (name) {
this.basicServiceInfoForm.setFieldsValue({ standardName: name, standardTextFileName: null })
delete this.basicServiceInfo.standardText
},
/** /**
* 选择标准文本 * 选择标准文本
*/ */
chooseStandardText () { chooseStandardText () {
const selectedStandard = this.basicServiceInfoForm.getFieldValue('standardNumber')
if (!selectedStandard) {
this.$message.warning(this.$t('workCenter.standardConsultationProcess.pleaseSelectCriteriaFirst'))
return
}
this.$refs.selectStandardFileModal.open(selectedStandard, this.basicServiceInfo.standardText)
}, },
/** /**
* 下发人员类型修改 * 下发人员类型修改
@@ -450,7 +805,7 @@ export default {
*/ */
handleAdd () { handleAdd () {
const pdfId = '1723899113057075201' const pdfId = '1723899113057075201'
this.$refs.consultationModal.add(pdfId) this.$refs.consultationModal.add(pdfId, '1716698213217865729')
}, },
/** /**
* 表单填写完成,新增数据 * 表单填写完成,新增数据
@@ -466,7 +821,16 @@ export default {
* 征求意见列表-删除 * 征求意见列表-删除
*/ */
batchDel () { batchDel () {
if (!this.selectedRowKeys || this.selectedRowKeys.length === 0) {
this.$message.warning(this.$t('selectLeastOne'))
return
}
const tableData = JSON.parse(JSON.stringify(this.dataSource))
this.selectedRowKeys.forEach(index => {
tableData[index] = null
})
this.dataSource = tableData.filter(tt => !!tt)
this.selectedRowKeys = []
}, },
onSelectChange (selectedRowKeys) { onSelectChange (selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys this.selectedRowKeys = selectedRowKeys
@@ -474,6 +838,224 @@ export default {
handleEdit (record, index) { handleEdit (record, index) {
record.index = index record.index = index
this.$refs.consultationModal.edit(null, record) this.$refs.consultationModal.edit(null, record)
},
/**
* 处理页面数据
*/
dealFormData (isSave) {
// 提交的表单数据,流程信息,流程审批信息,征求意见列表,业务分派信息,业务基本信息
let formData = {}, processInfo = {}, approvalInfo = {}, consultationListData = [], dispatchInfo = {}, basicServiceInfo = {},
flag = true
// 保存,只需要有填写内容即可
if (isSave) {
// 流程信息
processInfo = Object.assign(this.processInfo, this.processInfoForm.getFieldsValue())
// 业务基本信息
basicServiceInfo = Object.assign(this.basicServiceInfo, this.basicServiceInfoForm.getFieldsValue())
// 流程审批信息
approvalInfo = Object.assign(this.approvalInfo, this.approvalInfoForm.getFieldsValue())
// 业务分派信息
if (this.showDispatchInformation) {
dispatchInfo = Object.assign(this.dispatchInfo, this.dispatchInfoForm.getFieldsValue())
}
const saveCheckObj = { ...processInfo, ...basicServiceInfo, ...approvalInfo, ...dispatchInfo }
// 征求意见列表
consultationListData = this.dataSource || []
if (!(Object.values(saveCheckObj).some(tt => !!tt || tt === 0) || consultationListData.length > 0)) {
// 提示至少填写一项
this.$message.warning(this.$t('pleaseFillInAtLeastOneItem'))
flag = false
}
} else {
// 流程信息
this.processInfoForm.validateFields((errors, values) => {
if (!errors) {
processInfo = Object.assign(this.processInfo, values)
} else {
flag = false
}
})
// 业务基本信息
this.basicServiceInfoForm.validateFields((errors, values) => {
if (!errors) {
basicServiceInfo = Object.assign(this.basicServiceInfo, values)
} else {
flag = false
}
})
// 流程审批信息
this.approvalInfoForm.validateFields((errors, values) => {
if (!errors) {
approvalInfo = Object.assign(this.approvalInfo, values)
} else {
flag = false
}
})
// 业务分派信息
if (this.showDispatchInformation) {
this.dispatchInfoForm.validateFields((errors, values) => {
if (!errors) {
dispatchInfo = Object.assign(this.dispatchInfo, values)
} else {
flag = false
}
})
} else {
dispatchInfo = Object.assign({}, this.dispatchInfo)
}
// 征求意见列表
if (this.showConsultationList && this.currentNode === ConsultationProcess.moduleOwnerSummary.value && !this.$refs.expandTable.submit()) {
flag = false
}
consultationListData = this.dataSource || []
}
if (!flag) {
return false
}
formData = {
basicProcessInfoDTO: processInfo,
basicTaskInfoDTO: approvalInfo,
businessInfoDTO: {
processFbStandardConsultation: basicServiceInfo,
processFbConsultationUserLink: dispatchInfo,
processFbConsultationLists: this.dataSource
}
}
return formData
},
/**
* 转办
*/
handleTurnTo () {
this.$refs.userSelectModal.open()
},
continueTurnTo (userId) {
const params = {
taskId: this.$route.query.taskId,
userId
}
this.loading = true
transferConsultationProcess(params).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
/**
* 保存
*/
handleSave () {
const formData = this.dealFormData(true)
if (!formData) {
return
}
this.loading = true
saveConsultationProcess(formData).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
/**
* 提交
*/
handleSubmit () {
const formData = this.dealFormData()
if (!formData) {
return
}
this.loading = true
submitConsultationProcess(formData).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
/**
* 同意
*/
handleAgree () {
const formData = this.dealFormData()
if (!formData) {
return
}
this.loading = true
agreeConsultationProcess(formData).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
/**
* 驳回
*/
handleReject () {
const formData = this.dealFormData()
if (!formData) {
return
}
this.loading = true
rejectConsultationProcess(formData).then(res => {
if (res.success) {
this.$message.success(res.message)
this.goBack()
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
/**
* 批量操作
*/
batchOperate () {
if (!this.selectedRowKeys || this.selectedRowKeys.length === 0) {
this.$message.warning(this.$t('selectLeastOne'))
return
}
this.$refs.opinionModal.open()
},
handleWriteOpinion ({ isAdopt }) {
this.selectedRowKeys.forEach(index => {
this.$set(this.dataSource[index], 'isAdopt', isAdopt)
})
},
/**
* 选中标准文本
* @param item
*/
handleSelectedFile (item) {
this.basicServiceInfoForm.setFieldsValue({ standardTextFileName: item.fileName })
this.basicServiceInfo.standardText = item.publishBeforeId
},
/**
* 修改意见
* @param value
* @param index
*/
handleOpinionChange (value, index) {
this.$set(this.dataSource[index], 'isAdopt', value)
} }
} }
} }
@@ -496,4 +1078,23 @@ export default {
margin-left: 10px; margin-left: 10px;
} }
} }
.disabled-white-input[disabled] {
background-color: white;
color: rgba(0, 0, 0, 0.65);
}
.opinion-select {
width: 100%;
}
.add-required > ::v-deep.ant-form-item-label > label::before {
display: inline-block;
margin-right: 4px;
color: #f5222d;
font-size: 14px;
font-family: SimSun, sans-serif;
line-height: 1;
content: '*';
}
</style> </style>
@@ -0,0 +1,71 @@
<template>
<j-modal
:title="title"
:maskClosable="false"
:width="width"
:visible="visible"
:confirm-loading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<!--意见-->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('workCenter.esInspectionPlan.opinion')">
<j-dict-select-tag :triggerChange="false"
class="opinion-select"
dict-code="consultation_opinion"
:placeholder="$t('pleaseSelect') + $t('workCenter.esInspectionPlan.opinion')"
v-decorator="['isAdopt']" />
</a-form-item>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
export default {
name: 'BatchWriteOpinionModal',
data () {
return {
title: this.$t('batchOperation'),
width: 600,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
}
}
},
methods: {
open () {
this.visible = true
},
handleOk () {
this.form.validateFields((errors, values) => {
if (!errors) {
this.$emit('ok', values)
this.close()
}
})
},
handleCancel () {
this.close()
},
close () {
this.visible = false
this.form.resetFields()
}
}
}
</script>
<style scoped lang="less">
</style>
@@ -17,10 +17,18 @@
<a-form :form="form"> <a-form :form="form">
<!--章节编号--> <!--章节编号-->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('workCenter.esInspectionProcess.sectionNumber')"> <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('workCenter.esInspectionProcess.sectionNumber')">
<a-input :placeholder="$t('pleaseEnter') + $t('workCenter.esInspectionProcess.sectionNumber')" <a-tree-select
:maxLength="50" v-decorator="['chapterId', validatorRules.chapterId]"
@change="event => event.target.value = event.target.value.trim()" :getPopupContainer="triggerNode=> triggerNode.parentNode"
v-decorator="['chapterNumber', validatorRules.chapterNumber]" /> style="width: 100%"
:tree-data="chapterNumberTreeData"
treeCheckStrictly
:replace-fields="{key: 'id',label: 'name', value: 'id'}"
:label-in-value="false"
show-search
:filterTreeNode="filterTreeOption"
:placeholder="$t('pleaseSelect')+$t('workCenter.esInspectionProcess.sectionNumber')"
@change="handleNumberChange" />
</a-form-item> </a-form-item>
<!--章节名称--> <!--章节名称-->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('workCenter.standardConsultationProcess.chapterName')"> <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('workCenter.standardConsultationProcess.chapterName')">
@@ -69,6 +77,7 @@ import Vue from 'vue'
import { ACCESS_TOKEN } from '../../../../store/mutation-types' import { ACCESS_TOKEN } from '../../../../store/mutation-types'
import { previewPdf } from '../../../../utils/previewPdf' import { previewPdf } from '../../../../utils/previewPdf'
import { Base64 } from 'js-base64' import { Base64 } from 'js-base64'
import { queryStandardClauseNumber } from '../../../../api/workCenter'
export default { export default {
name: 'ConsultationModal', name: 'ConsultationModal',
@@ -90,9 +99,9 @@ export default {
}, },
validatorRules: { validatorRules: {
// 章节编号 // 章节编号
chapterNumber: { chapterId: {
rules: [{ required: true, message: this.$t('pleaseEnter') + this.$t('workCenter.esInspectionProcess.sectionNumber') }], rules: [{ required: true, message: this.$t('pleaseSelect') + this.$t('workCenter.esInspectionProcess.sectionNumber') }],
validateTrigger: 'blur' validateTrigger: 'change'
}, },
// 章节名称 // 章节名称
chapterName: { chapterName: {
@@ -114,13 +123,15 @@ export default {
rules: [{ required: true, message: this.$t('pleaseEnter') + this.$t('workCenter.enStandardChange.updateReason') }], rules: [{ required: true, message: this.$t('pleaseEnter') + this.$t('workCenter.enStandardChange.updateReason') }],
validateTrigger: 'blur' validateTrigger: 'blur'
} }
} },
chapterNumberTreeData: []
} }
}, },
methods: { methods: {
async add (fileId) { async add (fileId, infoId) {
this.title = this.$t('newlyAdded') this.title = this.$t('newlyAdded')
this.visible = true this.visible = true
this.getChapterNumberTreeData(infoId)
if (!fileId) { if (!fileId) {
return return
} }
@@ -191,6 +202,22 @@ export default {
this.previewUrl = null this.previewUrl = null
this.model = {} this.model = {}
this.form.resetFields() this.form.resetFields()
},
filterTreeOption (input, option) {
const text = option.componentOptions.propsData.title || option.componentOptions.propsData.label
return text.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
getChapterNumberTreeData (infoId) {
queryStandardClauseNumber({ infoId }).then(res => {
if (res.success) {
this.chapterNumberTreeData = res.result || []
}
})
},
handleNumberChange (value, label, extra) {
const nodeData = extra.triggerNode.dataRef
this.form.setFieldsValue({ chapterName: nodeData.itemName.trim() })
this.model.chapterNumber = nodeData.name
} }
} }
} }
@@ -8,18 +8,91 @@
switchFullscreen switchFullscreen
@ok="handleOk" @ok="handleOk"
@cancel="handleCancel"> @cancel="handleCancel">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<!--文件类型-->
<a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="$t('docTool.split.fileType')">
<a-select
:getPopupContainer="getPopupContainer"
:placeholder="$t('pleaseSelect') + $t('docTool.split.fileType')"
show-search
:filter-option="filterOption"
v-decorator="['fileType']">
<a-select-option v-for="item in optionList" :key="item.publishBeforeId" :value="item.publishBeforeId">
<div style="display: inline-block;width: 100%" :title=" item.fileType_dictText">
{{ item.fileType_dictText }}
</div>
</a-select-option>
</a-select>
</a-form-item>
</a-form>
</a-spin>
</j-modal> </j-modal>
</template> </template>
<script> <script>
import { querySpitFileByStandardNumber } from '../../../../api/workCenter'
export default { export default {
name: 'SelectStandardFileModal', name: 'SelectStandardFileModal',
data () { data () {
return { return {
title: this.$t('workCenter.standardConsultationProcess.selectionStandardFile'), title: this.$t('workCenter.standardConsultationProcess.selectionStandardFile'),
width: false, width: 600,
visible: false, visible: false,
confirmLoading: false confirmLoading: false,
form: this.$form.createForm(this),
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
optionList: [],
getPopupContainer: (node) => node.parentNode
}
},
methods: {
open (standardNumber, selectedValue) {
this.visible = true
this.confirmLoading = true
querySpitFileByStandardNumber({ standardNumber }).then(res => {
if (res.success) {
console.log(res.reuslt)
this.optionList = res.result || []
this.$nextTick(() => {
this.form.setFieldsValue({ fileType: selectedValue })
})
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.confirmLoading = false
})
},
handleOk () {
this.form.validateFields((errors, values) => {
if (!errors) {
this.$emit('ok', values.fileType)
const item = values.fileType ? this.optionList.find(tt => tt.publishBeforeId === values.fileType) : {}
this.$emit('okItem', item)
}
this.close()
})
},
handleCancel () {
this.close()
},
close () {
this.visible = false
this.form.resetFields()
this.optionList = []
},
filterOption (input, option) {
const text = option.componentOptions.children[0].text || option.componentOptions.children[0].data.attrs.title
return text.toLowerCase().indexOf(input.toLowerCase()) >= 0
} }
} }
} }
@@ -1065,11 +1065,6 @@ export default {
}).finally(() => { }).finally(() => {
this.loading = false this.loading = false
}) })
},
goBack () {
let timer = setTimeout(() => {
this.$router.go(-1)
}, 700)
} }
} }
} }