aiccs/src/views/forceNotice/recovery/handle.vue

683 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="page">
<easy-form
ref="EasyForm"
v-model="data"
:fields="fields"
:form-config="formConfig"
:buttons="buttons"
>
<template v-slot:divider="scope">
<div class="divider">
<span class="text">{{ scope.getPropValue(scope.field.label) }}</span>
</div>
</template>
<template v-slot:uploader="scope">
<div class="uploader">
<el-upload
:action="action"
:data="{
attachType: '1',
bizSeqNo: scope.formData.bizSeqNo
}"
accept=".jpg,.png,.pdf,.doc,.docx,.xls,.xlsx,.rar,.zip,.7z"
multiple
:disabled="scope.isView"
:file-list="scope.formData[scope.field.prop]"
:before-remove="removeFile"
:on-preview="previewFile"
>
<el-button v-if="!scope.isView" size="small" plain type="primary">
<svg-icon icon-class="download" />
点击上传
</el-button>
<div v-if="!scope.isView" slot="tip" class="el-upload__tip">只能上传jpg/png/pdf/doc/docx/xls/xlsx/rar/zip/7z文件且单个文件不能超过20M</div>
</el-upload>
</div>
</template>
<template v-slot:steps="scope">
<div class="steps">
<el-steps v-if="scope.formData[scope.field.prop].length > 0" :active="0" finish-status="success">
<el-step v-for="step in scope.formData[scope.field.prop]" :key="step.key">
<template v-slot:description>
<div class="step-description">
<div>
<span class="step-description-label">{{ step.opinionType }}内容:</span>
<span class="step-description-value">{{ step.opinionContent }}</span>
</div>
<div>
<span class="step-description-label">{{ step.opinionType }}人:</span>
<span class="step-description-value">{{ step.handler }}</span>
</div>
<div>
<span class="step-description-label">{{ step.opinionType }}日期:</span>
<span class="step-description-value">{{ parseTime2(step.createTime, 'yyyy-MM-dd hh:mm') }}</span>
</div>
</div>
</template>
</el-step>
</el-steps>
<div v-else class="empty-tips">暂无历史信息</div>
</div>
</template>
<template v-slot:opinion="scope">
<div class="opinion-selector">
<span class="opinion-selector-text">常用语</span>
<el-select
v-model="scope.field.opinion"
size="medium"
placeholder="请选择常用语"
@change="(val)=>{
scope.formData[scope.field.prop] = val
scope.easyFormItemBindData.componentScope.formInstance.clearValidate(scope.field.prop)
}"
>
<el-option
v-for="item in scope.field.options"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
</template>
<template v-slot:upperDept="scope">
<div class="opinion-selector">
<el-radio-group
v-model="localSelection"
@change="(val) => {
// 调用方法并传入 isUpper 参数
getUsersWithPermission(val === '上级部门处理人' ? 1 : 0);
scope.easyFormItemBindData.componentScope.formInstance.clearValidate(scope.field.prop);
}"
>
<el-radio label="当前部门处理人">当前部门处理人</el-radio>
<el-radio label="上级部门处理人">上级部门处理人</el-radio>
</el-radio-group>
</div>
</template>
</easy-form>
</div>
</template>
<script>
import { getUsersWithPermission } from '@/api/user'
import { createGlobalLoading, parseTime2 } from '@/utils'
import { findCurrentNode, findNextSequenceFlowList, taskInfo } from '@/api'
import {
generateDecisionContent,
xrForceDeregisterRemByBizSeqNo, xrForceDeregisterRemProcessControl,
getOrgunits,
xrAttachmentDelLawFile,
xrAttachmentListByBizSepNo,
xrOpinionListByBizSeqNo
} from '@/api/force'
export default {
data() {
return {
authItemMap: [],
parseTime2,
action: process.env.VUE_APP_BASE_API + '/attachment/uploadFileByBizseq',
nextPerformerMap: [],
generatingContent: false,
data: {},
status: '',
taskLikeId: '',
showFakeProgress: false,
type: this.$route.meta.type,
flowModel: [],
currentNodeID: '',
localSelection: '当前部门处理人', // 默认值
formConfig: {
labelPosition: 'right',
buttonPosition: 'right',
gutter: 0,
isView: () => {
return this.readonly
}
},
fields: [
{
type: 'divider',
label: '强制注销公告信息'
},
{
type: 'input',
label: '统一社会信用代码/注册号',
prop: 'uniscId',
span: 12,
isView: true
},
{
type: 'input',
label: '企业名称',
prop: 'entName',
span: 12,
isView: true
},
{
type: 'input',
label: '登记机关',
prop: 'regOrgCn',
span: 24,
isView: true
},
{
type: 'select',
label: '强制注销登记法定事由',
prop: 'forceRra',
optionsBaseCode: 'C13042',
required: true,
span: 24,
isView: true
},
{
type: 'date-picker',
label: '公告期自',
prop: 'noticeFrom',
required: true,
formProps: {
valueFormat: 'yyyy-MM-dd'
},
span: 12,
isView: true
},
{
type: 'date-picker',
label: '公告期至',
prop: 'noticeTo',
required: true,
formProps: {
valueFormat: 'yyyy-MM-dd'
},
span: 12,
isView: true
},
{
type: 'select',
label: '强制注销结果',
prop: 'forceRes',
optionsBaseCode: 'C13044',
span: 24,
isView: ({ formData }) => {
return formData.status !== '0'
},
showInForm: () => {
return this.readonly
}
},
{
type: 'date-picker',
label: '拟强制注销结果日期',
prop: 'forceResDate',
required: true,
formProps: {
valueFormat: 'yyyy-MM-dd'
},
span: 24,
isView: ({ formData }) => {
return formData.status !== '0'
},
showInForm: () => {
return this.readonly
}
},
{
type: 'input',
label: '公告标题',
prop: 'noticeTitle',
required: true,
span: 24,
isView: true
},
{
type: 'textarea',
label: '公告内容 ',
prop: 'noticeContent',
required: true,
span: 24,
isView: true
},
{
type: 'slot',
slotName: 'uploader',
label: '材料列表',
prop: 'fileList',
defaultValue: () => {
return []
},
span: 24
},
{
type: 'divider',
label: '历史处理信息'
},
{
type: 'slot',
slotName: 'steps',
label: '历史处理信息',
hiddenLabel: true,
prop: 'steps',
defaultValue: () => {
return []
},
span: 24
},
{
type: 'divider',
label: ({ formData }) => {
return ({
'0': '恢复登记经办意见',
'1': '恢复登记审核意见',
'2': '恢复登记审批意见',
'7': '恢复登记执法负责意见'
})[formData.status]
},
showInForm: () => {
return !this.readonly
}
},
{
type: 'radio',
label: '是否予以恢复',
prop: 'isAccept',
required: true,
span: 24,
options: [
{ label: '予以恢复', value: '1' },
{ label: '不予恢复', value: '0' }
],
isView: ({ formData }) => {
return formData.status !== '0' || this.readonly
},
onChange: ({ formData }, value, isFromUser) => {
if (isFromUser && formData.isAccept && !this.readonly) {
this.generateDecisionContent({
formData: formData,
field: { prop: 'decisionContent' }
})
}
}
},
{
type: 'textarea',
label: ({ formData }) => {
return formData.isAccept === '1' ? '予以恢复决定书内容' : formData.isAccept === '0' ? '不予恢复决定书内容' : '决定书内容'
},
prop: 'decisionContent',
required: true,
span: 24,
isView: ({ formData }) => {
return formData.status !== '0'
},
formProps: {
rows: 6,
autosize: {
minRows: 6,
maxRows: 12
}
}
},
{
type: 'radio',
label: '选择操作',
prop: 'isAgree',
required: true,
span: 24,
options: ({ formData }) => {
return this.flowModel
},
showInForm: ({ formData }) => {
return !this.readonly && formData.isAccept
},
onChange: (scope, value, isFromUser) => {
if (isFromUser) {
scope.formData.opinionContent = ''
}
}
},
{
type: 'select',
beforeSlotName: 'upperDept',
label: '下一步处理人',
prop: 'nextPerformerIds',
span: 12,
required: true,
options: () => {
return this.nextPerformerMap.map((item) => {
return {
...item,
label: item.name,
value: item.primaryKey
}
})
},
showInForm: ({ formData }) => {
return !this.readonly && formData.isAccept && ['0', '1', '7'].includes(formData.status) && !['nullify', 'transfer', 'examineFinish', 'approveFinish', 'lawFinish', 'handleReturn', 'examineReturn', 'end', 'upApproveFinish'].includes(formData.isAgree)
}
},
{
type: 'textarea',
afterSlotName: 'opinion',
label: ({ formData }) => {
return ({
'0': '经办意见',
'1': '审核意见',
'2': '审批意见',
'7': '执法负责意见'
})[formData.status]
},
prop: 'opinionContent',
required: true,
span: 24,
opinion: '',
options: [
'同意',
'不同意'
],
showInForm: ({ formData }) => {
return !this.readonly && formData.isAgree !== 'transfer' && formData.isAccept
}
},
{
type: 'cascader',
label: '转办机关',
prop: 'nextOrgID',
required: true,
span: 24,
showInForm: ({ formData }) => {
return formData.isAgree === 'transfer' && formData.status === '0' && formData.isAccept
},
isView: ({ formData }) => {
return ['1', '2'].includes(formData.status) || this.readonly
},
formProps: {
props: { checkStrictly: true }
},
optionConfig: {
labelKeyName: 'label',
valueKeyName: 'orgUnitId'
},
options: () => {
return this.authItemMap
},
onCreated: ({ setOptionLoading }) => {
if (this.authItemMap.length === 0) {
setOptionLoading('authItem', getOrgunits().then((data) => {
this.authItemMap = data
}))
}
}
},
{
type: 'input',
label: '转办原因',
prop: 'transferReason',
required: true,
span: 24,
showInForm: ({ formData }) => {
return formData.isAgree === 'transfer' && formData.status === '0' && formData.isAccept === '1'
},
isView: ({ formData }) => {
return ['1', '2'].includes(formData.status) || this.readonly
}
},
{
type: 'input',
label: '退回理由',
prop: 'backProposal',
required: true,
span: 24,
showInForm: false,
isView: ({ formData }) => {
return ['1', '2'].includes(formData.status) || this.readonly
}
}
],
buttons: [
{
label: '返回',
type: 'primary',
show: true,
buttonProps: {
plain: true
},
handler: (scope) => {
this.$router.back()
}
},
{
label: '提交',
type: 'primary',
show: () => {
return !this.readonly
},
handler: ({ formInstance, getOptionValue }) => {
return formInstance.submitForm().then((formData) => {
this.$confirm('是否继续提交', '提示', {
type: 'info',
customClass: 'type-1',
confirmHandlerPromise: () => {
const nextPerformer = getOptionValue('nextPerformerIds') ? [getOptionValue('nextPerformerIds')] : []
return xrForceDeregisterRemProcessControl({
xrForceDeregisterRem: { ...formData },
bizSeqNo: formData.bizSeqNo,
nextNodeID: formData.isAgree,
nextPerformerIds: nextPerformer.map((item) => {
return item.value
}),
nextPerformerNames: nextPerformer?.label,
opinion: {
opinionContent: formData.opinionContent
},
currentNodeID: this.currentNodeID
}).then((data) => {
this.$message.success(`已完成对“${formData.entName}”的业务办理!`)
this.$router.push({
path: `/forceNotice/recovery/${this.$route.meta.type}`
})
})
}
})
})
}
}
]
}
},
computed: {
readonly() {
return this.type === 'history'
}
},
created() {
createGlobalLoading(() => {
return Promise.all([
xrOpinionListByBizSeqNo({
bizSeqNo: this.$route.query.bizSeqNo
}).then((data) => {
this.data = {
...this.data,
steps: data.reverse()
}
}),
xrAttachmentListByBizSepNo({
bizseq: this.$route.query.bizSeqNo,
attachtype: '1'
}).then((data) => {
this.data.fileList = data.map((item) => {
return {
...item,
name: item.filename
}
})
}),
xrForceDeregisterRemByBizSeqNo({
bizSeqNo: this.$route.query.bizSeqNo
}).then((busInfo) => {
this.data.status = busInfo.status
this.data = {
...this.data,
...busInfo
}
const permission = ({
'0': 'xrExamine',
'1': 'xrApprove'
})[busInfo.status]
const ps = []
if (permission) {
ps.push(getUsersWithPermission(
permission,
this.$store.getters.orgId
).then((data) => {
this.nextPerformerMap = data.data
}))
}
return Promise.all(ps)
}),
taskInfo({
bizSeqNo: this.$route.query.bizSeqNo
}).then((data) => {
this.taskLikeId = data.taskLikeId
this.data = {
...this.data,
...data,
taskId: data.taskLikeId
}
findNextSequenceFlowList({
taskId: data.taskLikeId
}).then((data) => {
this.flowModel = data.map((item) => {
return {
label: item.name, value: item.nextNode.id
}
})
})
findCurrentNode({
taskId: data.taskLikeId
}).then((activity) => {
this.currentNodeID = activity.linkType
})
})
])
})
},
methods: {
generateDecisionContent(scope) {
this.generatingContent = true
generateDecisionContent(
scope.formData
).then((data) => {
scope.formData[scope.field.prop] = data
this.generatingContent = false
}).catch(() => {
this.generatingContent = false
})
},
stepStatus2CN(opinionType, approve) {
return `${approve === '1' ? '上级' : ''}` + ({
'handle': '经办',
'examine': '审核',
'approve': '审批'
})[opinionType]
},
removeFile(file) {
return xrAttachmentDelLawFile({
id: file.attachmentId
})
},
previewFile(file) {
window.open(`${process.env.VUE_APP_BASE_API}/attachment/getMaterial?id=${file.attachmentid || file?.response?.data?.attachmentid}&bizSeqNo=${file.bizseq}&attachType=${file.attachtype}`, '_blank')
},
getUsersWithPermission(isUpper) {
const ps = []
const status = this.data.status || '0'
const permission = ({
'0': 'xrExamine',
'1': 'xrApprove'
})[status]
if (permission) {
ps.push(getUsersWithPermission(
permission,
this.$store.getters.orgId,
isUpper
).then((data) => {
this.nextPerformerMap = data.data
}))
}
return Promise.all(ps)
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/styles/abnormal-handle";
.opinion-selector{
margin-top: 18px;
display: flex;
.opinion-selector-text{
margin-right: 16px;
}
}
.steps{
padding: 20px 24px;
overflow: auto;
.el-steps{
position: relative;
width: max-content;
min-width: 100%;
&::before{
content: "";
position: absolute;
border: 2px solid #F5F5F5;
width: 100%;
top: 18px;
}
.el-step{
flex-basis: unset!important;
margin-right: 56px!important;
flex-shrink: 0;
/deep/ .el-step__head{
margin-bottom: 16px;
.el-step__line{
display: none;
}
.el-step__icon{
width: 36px;
height: 36px;
border-color: #2A8CE3;
color: #2A8CE3;
}
}
/deep/ .el-step__description{
padding-right: 0;
}
.step-description{
font-size: 14px;
max-width: 235px;
&>div{
margin-bottom: 8px;
}
.step-description-label{
color: #666666;
}
.step-description-value{
color: #333333;
}
}
}
}
.empty-tips{
text-align: center;
color: #999999;
}
.notice-content-wrapper {
.button-group {
margin-top: 10px;
text-align: right;
}
}
}
</style>