update 法规合规流程页面

This commit is contained in:
赵霄
2023-11-27 18:06:55 +08:00
parent c3f147b997
commit 5be8f9b15f
9 changed files with 629 additions and 22 deletions
+4 -1
View File
@@ -387,6 +387,9 @@ module.exports = {
// 法规合规评估流程
standardCompliance: {
addStandard: '添加标准',
responsibleUnitContactPerson: '责任单位联络人'
responsibleUnitContactPerson: '责任单位联络人',
pleaseSelectDeleteData: '请选择要删除的数据',
moduleOwner: '模块责任人',
projectAppraisal: '项目评估'
}
}
+12
View File
@@ -391,3 +391,15 @@ export const EsStartUseNodes = new EsEnums({
leaderApproval: { text: '起草人和会签人主管级领导审批', value: 'sid-0BC5B3BC-ED99-4061-84B4-7320E25DE326' },
standardizationApproval: { text: '标准化审批', value: 'sid-9C90582D-F71F-4516-B54F-1E9F896C30D8' }
})
// 法规合规流程节点
export const StandardComplianceNodes = new EsEnums({
initial: { text: '法规工程师发起', value: '1', btn: ['save', 'submit'] },
departLeaderIssue: { text: '部所主管级领导下发', value: '2', btn: [] },
moduleOwnerIssue: { text: '模块责任人分发', value: '3', btn: [] },
designEngineerAssess: { text: '设计工程师评估', value: '4', btn: [] },
moduleOwnerReview: { text: '模块责任人审批', value: '5', btn: [] },
departLeaderApprove: { text: '部所主管级领导审批', value: '6', btn: [] },
regulatoryEngineerApprove: { text: '法规工程师审批', value: '7', btn: [] },
designEngineerWriteProject: { text: '设计工程师补充立项项目号', value: '8', btn: [] }
})
@@ -53,12 +53,32 @@
:disabled="disabled"
v-decorator="['processDescription']" />
</a-form-item>
<!--标准编号/标准名称-->
<div class="standard-info" v-if="!isInitial">
<label class="standard-info-label">{{ $t('projectLibrary.vehicleItemLibrary.standardNumberStandardName') }}</label>
<div class="standard-info-text">
</div>
</div>
</a-form>
<!--业务基本信息选择标准-->
<initial-basic-service-info />
<!--业务分派信息-->
<initial-assign-table />
<!--发起节点-->
<template v-if="isInitial">
<!--业务基本信息选择标准-->
<initial-basic-service-info @source:change="handleSourceChange" @standard:change="handleStandardChange" />
<!--业务分派信息-->
<initial-assign-table :selected-source="selectedSource" :selected-standard="selectedStandard" />
</template>
<!--部所主管级领导下发-->
<depart-leader-issue-table v-if="isDepartLeaderIssue" />
<!--模块责任人分发-->
<module-owner-issue-table v-if="isModuleOwnerIssue" />
<!--设计工程师评估-->
<design-engineer-assess v-if="isDesignEngineerAssess" />
<!--流程审批信息-->
<div class="process-part-title">{{ $t('processApprovalInformation') }}</div>
@@ -118,19 +138,26 @@ import PersonnelInfo from '../../../components/PersonnelInfo'
import InternalDetailPage from '../../../components/InternalDetailPage'
import ProcessDetailList from '../../../components/ProcessDetailList'
import { WorkCenterMixin } from '../../../mixins/WorkCenterMixin'
import { ProcessKey } from '../../../enums/commonEnums'
import { ProcessKey, StandardComplianceNodes } from '../../../enums/commonEnums'
import InitialBasicServiceInfo from './components/InitialBasicServiceInfo'
import InitialAssignTable from './components/InitialAssignTable'
import DepartLeaderIssueTable from './components/DepartLeaderIssueTable'
import ModuleOwnerIssueTable from './components/ModuleOwnerIssueTable'
import DesignEngineerAssess from './components/DesignEngineerAssess'
export default {
name: 'StandardComplianceProcess',
components: { ProcessDetailList, InternalDetailPage, PersonnelInfo, InitialBasicServiceInfo, InitialAssignTable },
mixins: [WorkCenterMixin],
computed: {
pageTitle () {
return `${this.$t('flowCenter')}${this.$route.meta.title}`
}
components: {
ProcessDetailList,
InternalDetailPage,
PersonnelInfo,
InitialBasicServiceInfo,
InitialAssignTable,
DepartLeaderIssueTable,
ModuleOwnerIssueTable,
DesignEngineerAssess
},
mixins: [WorkCenterMixin],
data () {
return {
loading: false,
@@ -142,7 +169,7 @@ export default {
// 审批信息的表单
approvalInfoForm: this.$form.createForm(this),
approvalInfo: {},
currentNode: null,
currentNode: '4',
labelCol: {
xs: { span: 24 },
sm: { span: 4 }
@@ -165,11 +192,58 @@ export default {
rules: [{ required: false, message: this.$t('pleaseEnter') + this.$t('remarks') }],
validateTrigger: 'blur'
}
}
},
selectedStandard: {}, // 发起节点,选中的标准
selectedSource: null // 发起节点,选中标准的分解单来源
}
},
computed: {
pageTitle () {
return `${this.$t('flowCenter')}${this.$route.meta.title}`
},
// 是否发起节点,发起节点展示业务基本信息、业务分派信息
isInitial () {
return this.currentNode === StandardComplianceNodes.initial.value
},
// 是否部所主管级领导下发节点
isDepartLeaderIssue () {
return this.currentNode === StandardComplianceNodes.departLeaderIssue.value
},
// 是否模块负责人分发
isModuleOwnerIssue () {
return this.currentNode === StandardComplianceNodes.moduleOwnerIssue.value
},
// 是否设计工程师评估节点
isDesignEngineerAssess () {
return this.currentNode === StandardComplianceNodes.designEngineerAssess.value
}
},
created () {
this.getPersonInfoStructure(ProcessKey.NO_MATCH_TRACKING.value)
// if (this.$route.query.processInstanceId || this.$route.query.draftId) {
// this.currentNode = this.$route.query.nodeId
// } else {
// this.currentNode = StandardComplianceNodes.initial.value
// }
this.btnList = StandardComplianceNodes.propertyOfValue('btn', this.currentNode)
this.getPersonInfoStructure(ProcessKey.NO_MATCH_TRACKING.value, () => {
this.initPersonInfoData()
})
},
methods: {
/**
* 分解单来源变化
* @param source
*/
handleSourceChange (source) {
this.selectedSource = source
},
/**
* 选择的标准变化
* @param standard
*/
handleStandardChange (standard) {
this.selectedStandard = Object.assign({}, standard)
}
}
}
</script>
@@ -177,4 +251,15 @@ export default {
<style scoped lang="less">
@import '~@assets/less/common.less';
.standard-info {
display: flex;
&-text {
flex: 1;
width: 0;
word-break: break-word;
color: @primary-color;
cursor: pointer;
}
}
</style>
@@ -0,0 +1,147 @@
<!--部所主管级领导下发-->
<template>
<div>
<div class="process-part-title">{{ $t('workCenter.dispatchInformation') }}</div>
<div class="table-operator">
<!--批量选择人员-->
<a-button type="primary" @click="handleSelectPerson">
{{ $t('workCenter.projectComplianceEvaluationProcess.batchSelector') }}
</a-button>
</div>
<div>
<j-table rowKey="id"
:columns="columns"
:data-source="dataSource"
:scroll="{x: '100%'}"
:pagination="false"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
<!--选择模块负责人-->
<template v-slot:moduleOwner="{text,record,index}">
<user-selection :show-btn="false"
:value="record.contact"
:name-str="record.contact_dictText"
v-if="!record.uninvolved"
:placeholder="$t('pleaseSelect') + $t('workCenter.standardCompliance.moduleOwner')" />
<div v-else>{{ global.emptyLine }}</div>
</template>
<!--操作-->
<template v-slot:action="{text,record,index}">
<div class="action-span-cell">
<a @click="handleUninvolved(record, index)">{{
!record.uninvolved ? $t('projectLibrary.vehicleItemLibrary.uninvolved') : $t('workCenter.projectComplianceEvaluationProcess.noCauseInvolved')
}}</a>
</div>
</template>
</j-table>
</div>
<!--批量选择人员-->
<user-select-modal ref="userSelectModal" @listChange="handleBatchSelected" />
<!--不涉及原因-->
<uninvolved-modal ref="uninvolvedModal" @ok="handleUninvolvedOk" />
</div>
</template>
<script>
import UserSelection from '../../../../components/selection/UserSelection'
import JTable from '../../../../components/jero/JTable'
import UserSelectModal from '../../../../components/selection/UserSelectModal'
import UninvolvedModal from '../modules/UninvolvedModal'
export default {
name: 'DepartLeaderIssueTable',
components: { JTable, UserSelection, UserSelectModal, UninvolvedModal },
data () {
return {
columns: [
// 标准编号/条款号
{
dataIndex: 'workNumber',
title: this.$t('projectLibrary.vehicleItemLibrary.standardNumberClauseNumber'),
width: 150
},
// 标准名称/条款名称
{
dataIndex: 'projectName',
title: this.$t('workCenter.projectComplianceEvaluationProcess.standardNameClauseName'),
width: 160
},
// 标准状态
{
title: this.$t('standardSelect.textState'),
dataIndex: 'standardState_dictText',
width: 150
},
// 模块责任人
{
title: this.$t('workCenter.standardCompliance.moduleOwner'),
dataIndex: 'contact',
width: 150,
scopedSlots: { customRender: 'moduleOwner' }
},
// 操作
{
title: this.$t('operation'),
fixed: 'right',
width: 150,
scopedSlots: { customRender: 'action' }
}
],
dataSource: [{ id: 1 }],
selectedRowKeys: []
}
},
methods: {
/**
* 批量选择人员
*/
handleSelectPerson () {
// 请选择要分发的数据
if (!this.selectedRowKeys || this.selectedRowKeys.length === 0) {
this.$message.warning(this.$t('pleaseSelectDistributeData'))
return
}
this.$refs.userSelectModal.open()
},
handleBatchSelected (list) {
const data = JSON.parse(JSON.stringify(this.dataSource))
this.dataSource = data.map(item => {
// 选中且没有填写不涉及理由
if (this.selectedRowKeys.includes(item.id) && !item.uninvolved) {
item.contact = list.map(tt => tt.id).join(',')
item.contact_dictText = list.map(tt => tt.realname + '(' + tt.username + ')').join(',')
}
return item
})
},
/**
* 不涉及
* @param record
* @param index
*/
handleUninvolved (record, index) {
this.$refs.uninvolvedModal.open(record, index)
},
handleUninvolvedOk (record, index) {
this.$set(this.dataSource, index, record)
},
onSelectChange (selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.process-part-title:first-child {
margin-top: 32px;
}
/deep/ .user-input {
width: 100% !important;
}
</style>
@@ -0,0 +1,37 @@
<!--设计工程师评估-->
<template>
<div>
<!--项目评估-->
<div class="process-part-title">{{ $t('workCenter.standardCompliance.projectAppraisal') }}</div>
<!--上一节点处理人-->
<div class="info-form-item">
<label class="info-form-item-label">{{ $t('workCenter.projectComplianceEvaluationProcess.preNodePeople') }}</label>
<div class="info-form-item-text">
</div>
</div>
</div>
</template>
<script>
export default {
name: 'DesignEngineerAssess'
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.process-part-title:first-child {
margin-top: 32px;
}
.info-form-item {
display: flex;
&-text {
flex: 1;
width: 0;
word-break: break-word;
}
}
</style>
@@ -8,14 +8,16 @@
{{ $t('workCenter.projectComplianceEvaluationProcess.batchSelector') }}
</a-button>
<!--批量删除-->
<a-button type="primary" ghost @click="handleDelete">
<a-button type="primary" ghost @click="batchDelete">
{{ $t('batchDelete') }}
</a-button>
</div>
<div>
<j-table :columns="columns"
<j-table rowKey="id"
:columns="columns"
:data-source="dataSource"
:scroll="{x: '100%'}"
:pagination="false"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
<!--选择责任单位联络人-->
@@ -30,13 +32,13 @@
<!--操作-->
<template v-slot:action="{text,record,index}">
<div class="action-span-cell">
<a :disabled="index === 0 && dataSource.length === 1">{{ $t('delete') }}</a>
<a :disabled="index === 0 && dataSource.length === 1" @click="handleDelete(record.id)">{{ $t('delete') }}</a>
</div>
</template>
</j-table>
</div>
<user-select-modal ref="userSelectModal" />
<user-select-modal ref="userSelectModal" type="checkbox" @listChange="handleBatchSelected" />
</div>
</template>
@@ -48,6 +50,37 @@ import UserSelectModal from '../../../../components/selection/UserSelectModal'
export default {
name: 'InitialAssignTable',
components: { UserSelection, JTable, UserSelectModal },
props: {
// 选中的标准
selectedStandard: {
type: Object,
required: false,
default: () => {
return {}
}
},
// 分解单来源
selectedSource: {
type: String,
required: false,
default: false
}
},
watch: {
// 选中标准变化,清除表格数据
selectedStandard: {
handler () {
this.dataSource = []
},
deep: true
},
// 选中的分解单来源变化
selectedSource (value) {
if (value && this.selectedStandard.id) {
// todo 获取条款号的数据
}
}
},
data () {
return {
columns: [
@@ -100,7 +133,7 @@ export default {
scopedSlots: { customRender: 'action' }
}
],
dataSource: [{ id: 1 }, { id: 2 }, { id: 3 }],
dataSource: [],
selectedRowKeys: []
}
},
@@ -114,9 +147,49 @@ export default {
this.$message.warning(this.$t('pleaseSelectDistributeData'))
return
}
this.$refs.userSelectModal.open()
},
handleDelete () {
handleBatchSelected (list) {
const data = JSON.parse(JSON.stringify(this.dataSource))
this.dataSource = data.map(item => {
if (this.selectedRowKeys.includes(item.id)) {
item.contact = list.map(tt => tt.id).join(',')
item.contact_dictText = list.map(tt => tt.realname + '(' + tt.username + ')').join(',')
}
return item
})
},
handleDelete (id) {
this.$confirm({
title: this.$t('confirmDeletion'),
content: this.$t('areYouSure'),
onOk: () => {
const index = this.dataSource.findIndex(tt => tt.id === id)
this.dataSource[index] = null
this.dataSource = this.dataSource.filter(tt => !!tt)
this.selectedRowKeys = []
}
})
},
batchDelete () {
if (!this.selectedRowKeys || this.selectedRowKeys.length === 0) {
this.$message.warning(this.$t('workCenter.standardCompliance.pleaseSelectDeleteData'))
return
}
this.$confirm({
title: this.$t('confirmBatchDeletion'),
content: this.$t('deleteAData'),
onOk: () => {
const data = this.dataSource.map(item => {
if (this.selectedRowKeys.includes(item.id)) {
return null
}
return item
}).filter(tt => !!tt)
this.dataSource = JSON.parse(JSON.stringify(data))
this.selectedRowKeys = []
}
})
},
onSelectChange (selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys
@@ -93,10 +93,12 @@ export default {
},
handleSelectedStandard (list) {
this.dataSource = list
this.$emit('standard:change', list[0])
},
handleSourceChange (value, record, index) {
record.salvageSource = value
this.$set(this.dataSource, index, record)
this.$emit('source:change', value)
}
}
}
@@ -0,0 +1,148 @@
<!--模块负责人分发-->
<template>
<div>
<div class="process-part-title">{{ $t('workCenter.dispatchInformation') }}</div>
<div class="table-operator">
<!--批量选择人员-->
<a-button type="primary" @click="handleSelectPerson">
{{ $t('workCenter.projectComplianceEvaluationProcess.batchSelector') }}
</a-button>
</div>
<div>
<j-table rowKey="id"
:columns="columns"
:data-source="dataSource"
:scroll="{x: '100%'}"
:pagination="false"
:row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
<!--选择责任单位联络人-->
<template v-slot:moduleOwner="{text,record,index}">
<user-selection :show-btn="false"
:value="record.contact"
:name-str="record.contact_dictText"
v-if="!record.uninvolved"
type="checkbox"
:placeholder="$t('pleaseSelect') + $t('workCenter.standardConsultationProcess.designEngineer')" />
<div v-else>{{ global.emptyLine }}</div>
</template>
<!--操作-->
<template v-slot:action="{text,record,index}">
<div class="action-span-cell">
<a @click="handleUninvolved(record, index)">{{
!record.uninvolved ? $t('projectLibrary.vehicleItemLibrary.uninvolved') : $t('workCenter.projectComplianceEvaluationProcess.noCauseInvolved')
}}</a>
</div>
</template>
</j-table>
</div>
<!--批量选择人员-->
<user-select-modal ref="userSelectModal" type="checkbox" @listChange="handleBatchSelected" />
<!--不涉及原因-->
<uninvolved-modal ref="uninvolvedModal" @ok="handleUninvolvedOk" />
</div>
</template>
<script>
import UserSelection from '../../../../components/selection/UserSelection'
import UserSelectModal from '../../../../components/selection/UserSelectModal'
import UninvolvedModal from '../modules/UninvolvedModal'
import JTable from '../../../../components/jero/JTable'
export default {
name: 'ModuleOwnerIssueTable',
components: { JTable, UninvolvedModal, UserSelectModal, UserSelection },
data () {
return {
columns: [
// 标准编号/条款号
{
dataIndex: 'workNumber',
title: this.$t('projectLibrary.vehicleItemLibrary.standardNumberClauseNumber'),
width: 150
},
// 标准名称/条款名称
{
dataIndex: 'projectName',
title: this.$t('workCenter.projectComplianceEvaluationProcess.standardNameClauseName'),
width: 160
},
// 标准状态
{
title: this.$t('standardSelect.textState'),
dataIndex: 'standardState_dictText',
width: 150
},
// 设计工程师
{
title: this.$t('workCenter.standardConsultationProcess.designEngineer'),
dataIndex: 'contact',
width: 150,
scopedSlots: { customRender: 'moduleOwner' }
},
// 操作
{
title: this.$t('operation'),
fixed: 'right',
width: 150,
scopedSlots: { customRender: 'action' }
}
],
dataSource: [{ id: 1 }],
selectedRowKeys: []
}
},
methods: {
/**
* 批量选择人员
*/
handleSelectPerson () {
// 请选择要分发的数据
if (!this.selectedRowKeys || this.selectedRowKeys.length === 0) {
this.$message.warning(this.$t('pleaseSelectDistributeData'))
return
}
this.$refs.userSelectModal.open()
},
handleBatchSelected (list) {
const data = JSON.parse(JSON.stringify(this.dataSource))
this.dataSource = data.map(item => {
// 选中且没有填写不涉及理由
if (this.selectedRowKeys.includes(item.id) && !item.uninvolved) {
item.contact = list.map(tt => tt.id).join(',')
item.contact_dictText = list.map(tt => tt.realname + '(' + tt.username + ')').join(',')
}
return item
})
},
/**
* 不涉及
* @param record
* @param index
*/
handleUninvolved (record, index) {
this.$refs.uninvolvedModal.open(record, index)
},
handleUninvolvedOk (record, index) {
this.$set(this.dataSource, index, record)
},
onSelectChange (selectedRowKeys) {
this.selectedRowKeys = selectedRowKeys
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.process-part-title:first-child {
margin-top: 32px;
}
/deep/ .user-input {
width: 100% !important
}
</style>
@@ -0,0 +1,100 @@
<template>
<j-modal
:title="$t('projectLibrary.vehicleItemLibrary.uninvolved')"
:maskClosable="false"
:width="600"
:closable="true"
@ok="handleOk"
@cancel="handleCancel"
switchFullscreen
:visible="visible">
<a-form :form="form">
<!--清单名称-->
<a-form-item :labelCol="labelCol"
:wrapperCol="wrapperCol"
:label="$t('workCenter.projectComplianceEvaluationProcess.noCauseInvolved')">
<a-input :placeholder="$t('pleaseEnter') + $t('workCenter.projectComplianceEvaluationProcess.noCauseInvolved')"
type="textarea"
:maxLength="500"
v-decorator="['uninvolved', validatorRules.uninvolved]" />
</a-form-item>
</a-form>
<template v-slot:footer>
<a-button @click="handleCancel">{{ $t('cancel') }}</a-button>
<a-button type="primary" @click="handleOk(false)">
{{ $t('workCenter.projectComplianceEvaluationProcess.cancelNotInvolve') }}
</a-button>
<a-button @click="handleOk(true)" type="primary">{{ $t('submit') }}</a-button>
</template>
</j-modal>
</template>
<script>
export default {
name: 'UninvolvedModal',
data () {
return {
visible: false,
form: this.$form.createForm(this),
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 }
},
validatorRules: {
// 不涉及原因
uninvolved: {
rules: [{
required: true,
message: this.$t('pleaseEnter') + this.$t('workCenter.projectComplianceEvaluationProcess.noCauseInvolved')
}],
validateTrigger: 'blur'
}
},
model: {},
dataIndex: null
}
},
methods: {
open (record, index) {
this.visible = true
this.model = Object.assign({}, record)
this.dataIndex = index
this.$nextTick(() => {
this.form.setFieldsValue(this.model)
})
},
handleOk (flag) {
this.validatorRules.uninvolved.rules[0].required = flag
if (!flag) {
this.form.setFieldsValue({ uninvolved: null })
}
this.form.validateFields((errors, values) => {
if (!errors) {
const formData = Object.assign(this.model, values)
this.$emit('ok', formData, this.dataIndex)
this.close()
}
})
},
handleCancel () {
this.close()
},
close () {
this.visible = false
this.model = {}
this.form.resetFields()
}
}
}
</script>
<style scoped lang="less">
</style>