工作流优化

This commit is contained in:
陈裕财
2025-04-12 02:02:53 +08:00
parent 46555e1f5d
commit 5e19713518
5 changed files with 391 additions and 65 deletions

View File

@@ -376,7 +376,7 @@ const RoutesXmCore: AppRouteRecordRaw[] = [
{
path: 'setup',
props:{bizKey:'xm_project_start_approva'},
component: () => import('@/views/xm/core/xmProject/XmProjectDetail.vue'),
component: () => import('@/views/xm/core/xmProject/XmProjectSetup.vue'),
name: 'projectSetup',
meta: {
title: '项目-立项申请',

View File

@@ -42,15 +42,44 @@
</ContentWrap>
<!--列表 Procinst act_hi_procinst-->
<el-table v-adaptive :ref="refId+'Table'" :data="tableDatas" @sort-change="sortChange" highlight-current-row v-loading="load.list" border @selection-change="selsChange" @row-click="rowClick" style="width: 100%;">
<el-table-column type="selection" width="55" show-overflow-tooltip fixed="left" v-if="currOpType=='mng' || this.multiple==true"/>
<el-table-column type="selection" width="55" fixed="left" v-if="currOpType=='mng' || this.multiple==true"/>
<el-table-column prop="name" label="流程名称" min-width="300" show-overflow-tooltip col-type="String" v-if="showCol('name')">
<template #default="{row}">
<div style="display: block;">
<mdp-select show-style="tag" :modelValue="row.deleteReason?'1':'0'" :options="[{id:'0',name:'正常'},{id:'1',name:'已删'}]" :disabled="true"/>
{{ row.name }}
</div>
</template>
<el-table-column prop="name" label="流程名称" width="300" col-type="String" v-if="showCol('name')">
<template #default="scope">
<el-popover placement="right-start" :show-after="200"
>
<template #reference>
<el-space>
<mdp-select show-style="tag" :modelValue="scope.row.deleteReason?'1':'0'" :options="[{id:'0',name:'正常',color:'green'},{id:'1',name:'已删',color:'red'}]" :disabled="true"/>
<el-link @click="openForm({parentOpType:currOpType,subOpType:'edit',formData:scope.row,title:'修改'})">
<el-text truncated style="width:300px;">
{{ scope.row.name }}
</el-text>
</el-link>
</el-space>
</template>
<template #default>
<el-space wrap>
<el-button v-if="currOpType=='mng'"
:disabled="disBtn('editBtn') || !checkBtnQx('editBtn',menuDefId) "
type="primary"
@click="openForm({parentOpType:currOpType,subOpType:'edit',formData:scope.row,title:'任务详情'})"
icon="edit" title="执行任务">执行</el-button>
<el-button v-if="currOpType!='mng'"
type="primary"
@click="openForm({parentOpType:currOpType,subOpType:'detail',formData:scope.row})"
icon="view"/>
<el-button :disabled=" disBtn('delBtn') || !checkBtnQx('delBtn',menuDefId) " type="danger" @click="handleDel(scope.row,scope.$index)" icon="delete" title="删除一条数据"/>
</el-space>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column sortable prop="startDeptName" label="发起部门" min-width="180" show-overflow-tooltip/>
<el-table-column sortable prop="startUsername" label="发起人" min-width="120" show-overflow-tooltip/>
@@ -134,21 +163,7 @@
</template>
</el-table-column>
<el-table-column prop="id" label="编号" min-width="120" show-overflow-tooltip col-type="String" v-if="showCol('id')"/>
<el-table-column label="操作" :width="currOpType=='mng'?150:150" fixed="right">
<template #default="scope" v-if="currOpType=='mng'" >
<el-button :disabled=" disBtn('editBtn') || !checkBtnQx('editBtn',menuDefId) " type="primary" @click="openForm({parentOpType:currOpType,subOpType:'edit',formData:scope.row,title:'任务详情'})" icon="edit" title="修改一条数据"/>
<el-button :disabled=" disBtn('delBtn') || !checkBtnQx('delBtn',menuDefId) " type="danger" @click="handleDel(scope.row,scope.$index)" icon="delete" title="删除一条数据"/>
</template>
<template #default="scope" v-else-if="currOpType=='list'" >
<el-button type="primary" @click="openForm({parentOpType:currOpType,subOpType:'detail',formData:scope.row})" icon="view"/>
</template>
<template #default="scope" v-else-if="currOpType=='select' && this.multiple!=true" >
<el-button type="primary" @click="selectConfirm(scope.row)" icon="check"/>
</template>
</el-table-column>
</el-table>
<el-pagination class="padding-top"
layout="slot,total, sizes, prev, next,pager,jumper"

View File

@@ -56,14 +56,42 @@
<el-table-column type="selection" width="55" show-overflow-tooltip fixed="left"
v-if="currOpType == 'mng' || multiple == true" />
<el-table-column sortable type="index" width="55" show-overflow-tooltip fixed="left" />
<el-table-column sortable prop="mainTitle" label="流程" min-width="300" show-overflow-tooltip>
<template #default="{ row }">
<div style="display:flex;justify-content: flex-start;"><mdp-select style="width:auto;" show-style="tag"
item-code="suspensionState" v-model="row.suspensionState" :disabled="true" />
<div>{{ row.mainTitle }}</div>
</div>
</template>
<el-table-column sortable prop="mainTitle" label="流程" width="300">
<template #default="scope">
<el-popover placement="right-start" :show-after="200"
>
<template #reference>
<el-link @click="openForm({parentOpType:currOpType,subOpType:'edit',formData:scope.row,title:'修改'})">
<mdp-select style="width:auto;" show-style="tag" item-code="suspensionState" v-model="scope.row.suspensionState" :disabled="true"/>
<el-text truncated style="width:300px;">
{{ scope.row.mainTitle }}
</el-text>
</el-link>
</template>
<template #default>
<el-space wrap>
<el-button :disabled="disBtn('editBtn') || !checkBtnQx('editBtn', menuDefId)" type="primary"
@click="openForm({ parentOpType: currOpType, subOpType: 'edit', formData: scope.row, title: '详情' })" icon="edit"
title="修改一条数据" />
<el-button :disabled="disBtn('delBtn') || !checkBtnQx('delBtn', menuDefId)" type="danger"
@click="handleDel(scope.row, scope.$index)" icon="delete" title="删除一条数据" />
<el-button type="primary" v-if="scope.row.suspensionState == '1'" @click="handleSuspend(scope.row)"
title="挂起流程">挂起
</el-button>
<el-button type="primary" v-if="scope.row.suspensionState == '2'" @click="handleActivite(scope.row)"
title="激活流程">激活
</el-button>
<el-button type="primary" v-if="currOpType=='list'" @click="openForm({parentOpType:currOpType,subOpType:'detail',formData:scope.row})" icon="view" />
</el-space>
</template>
</el-popover>
</template>
</el-table-column>
<el-table-column sortable prop="startUsername" label="发起人" width="100" show-overflow-tooltip />
@@ -285,37 +313,7 @@
</template>
</el-table-column>
<el-table-column prop="id" label="编号" min-width="120" show-overflow-tooltip col-type="String"
v-if="showCol('id')" />
<el-table-column label="操作" :width="currOpType == 'mng' ? 200 : 200" fixed="right">
<template #header>
</template>
<template #default="scope" v-if="currOpType == 'mng'">
<el-button :disabled="disBtn('editBtn') || !checkBtnQx('editBtn', menuDefId)" type="primary"
@click="openForm({ parentOpType: currOpType, subOpType: 'edit', formData: scope.row, title: '详情' })" icon="edit"
title="修改一条数据" />
<el-button :disabled="disBtn('delBtn') || !checkBtnQx('delBtn', menuDefId)" type="danger"
@click="handleDel(scope.row, scope.$index)" icon="delete" title="删除一条数据" />
<el-button type="primary" v-if="scope.row.suspensionState == '1'" @click="handleSuspend(scope.row)"
title="挂起流程">挂起
</el-button>
<el-button type="primary" v-if="scope.row.suspensionState == '2'" @click="handleActivite(scope.row)"
title="激活流程">激活
</el-button>
</template>
<template #default="scope" v-else-if="currOpType=='list'">
<el-button type="primary" @click="openForm({parentOpType:currOpType,subOpType:'detail',formData:scope.row})"
icon="view" />
</template>
<template #default="scope" v-else-if="currOpType=='select' && multiple!=true">
<el-button type="primary" @click="selectConfirm(scope.row)" icon="check" />
</template>
</el-table-column>
v-if="showCol('id')" />
</el-table>
<el-calendar v-if="defaultShowCalendar == true" v-loading="load.list" v-model="calendarDate">
<!-- 这里使用的是 2.5 slot 语法对于新项目请使用 2.6 slot 语法-->

View File

@@ -71,10 +71,10 @@
highlight-current-row v-loading="load.list" border @selection-change="selsChange"
@row-click="rowClick" style="width: 100%;">
<el-table-column
type="selection" width="55" show-overflow-tooltip fixed="left"
type="selection" width="55" fixed="left"
v-if="currOpType=='mng' || multiple==true"/>
<el-table-column
prop="mainTitle" label="流程名称" min-width="300" show-overflow-tooltip
prop="mainTitle" label="流程名称" min-width="300"
col-type="String" v-if="showCol('mainTitle')">
<template #default="scope">
@@ -83,7 +83,7 @@
<template #reference>
<el-link @click="openForm({parentOpType:currOpType,subOpType:'edit',formData:scope.row,title:'修改'})">
<mdp-select style="width:auto;" show-style="tag" item-code="suspensionState" v-model="scope.row.suspensionState" :disabled="true"/>
<el-text truncated style="width:200px;">
<el-text truncated style="width:300px;">
{{ scope.row.mainTitle }}
</el-text>
</el-link>

View File

@@ -0,0 +1,313 @@
<template>
<mdp-lr-box :lspan="24" :gutter="20">
<template #left>
<el-scrollbar v-adaptive>
<el-form :model="editForm" label-width="120px" label-position="left" :rules="editFormRules" ref="editForm" class="padding">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="项目名称" prop="name">
<el-space>
<el-text type="info">编号{{editForm.id}}</el-text> &nbsp;<el-text type="info">代号{{editForm.code}}</el-text>
<el-text type="info">审核状态<mdp-select itemCode="bizFlowState" v-model="editForm.bizFlowState" showStyle="tag" :disabled="true"/>
</el-text>
</el-space>
<el-input v-model="editForm.name" placeholder="项目名称"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目类型" prop="xmType">
<mdp-select width="100%" itemCode="projectType" v-model="editForm.xmType"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目总控" prop="admUserid">
<mdp-select-user width="100%" v-model="editForm.admUserid" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目经理" prop="pmUserid">
<mdp-select-user width="100%" v-model="editForm.pmUserid" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门" prop="deptid">
<mdp-select-dept width="100%" v-model="editForm.deptid" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="起止日期" prop="startTime">
<mdp-date-range width="100%" v-model="editForm" startKey="startTime" endKey="endTime"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工期(小时)" prop="planWorkingHours">
<mdp-input width="100%" type="number" v-model="planWorkingHours"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术来源" prop="tsrc">
<mdp-select width="100%" itemCode="tsrc" v-model="editForm.tsrc"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="研发成果" prop="gain">
<mdp-select width="100%" itemCode="gain" v-model="editForm.gain"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预算金额" prop="planTotalCost">
<el-input type="number" v-model="editForm.planTotalCost"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="税率" prop="taxRate">
<el-input type="number" v-model="editForm.taxRate"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预估毛利率" prop="budgetMarginRate">
<el-input type="number" v-model="editForm.contractAmt"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同总金额" prop="contractAmt">
<el-input type="number" v-model="editForm.contractAmt"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="研发目标" prop="target">
<el-input type="textarea" :rows="4" v-model="editForm.target" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="立项说明" prop="setupRemark">
<el-input type="textarea" :rows="4" v-model="editForm.setupRemark" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目描述" prop="description">
<el-input type="textarea" :rows="4" v-model="editForm.description" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="附件">
<mdp-select-att subOpType="select" simple v-if="editForm.id" crelyType="xm-project" :crelyId="editForm.id" :biz-id="editForm.id"/>
</el-form-item>
<el-form-item label="附件">
<el-button @click="sendToProcessApprova()">发起审核</el-button>
</el-form-item>
</el-form>
</el-scrollbar>
</template>
</mdp-lr-box>
</template>
<script>
import util from '@/components/mdp-ui/js/util';//全局公共库
import { sn } from '@/components/mdp-ui/js/sequence';//全局公共库
import config from "@/api/mdp_pub/mdp_config"; //全局公共库
import { addXmProject, editXmProject, createProjectCode, editXmProjectSomeFields } from '@/api/xm/core/xmProject';
import { mapState } from 'pinia'
import { useUserStore } from '@/store/modules/user';
import { useXmStore2, useXmStore} from '@/store/modules/xm'
import { MdpFormMixin } from '@/components/mdp-ui/mixin/MdpFormMixin';
export default {
mixins: [MdpFormMixin],
computed: {
...mapState(useUserStore, [
'userInfo', 'roles'
]),
...mapState(useXmStore, [
'projectInfo'
]),
},
watch: {
},
data() {
return {
currOpType: 'add',
load: { list: false, add: false, del: false, edit: false },//查询中...
editFormRules: {
name: [{
required: true, message: '项目名称不可为空', trigger: 'change'
},
{ min: 2, max: 50, message: '名称长度在2-50个字符', trigger: 'change' }
],
id: [{
required: true, message: '项目编号不可为空', trigger: 'change'
}],
code: [{
required: true, message: '项目代号不可为空', trigger: 'change'
},
{ min: 5, max: 40, message: '项目代号长度在5-40个字符', trigger: 'change' }
],
xmType: [{
required: true, message: '项目类型不可为空', trigger: 'change'
}],
deptid: [{
required: true, message: '部门不可为空', trigger: 'change'
}],
admUserid: [{
required: true, message: '项目总控不能为空', trigger: 'change'
}],
pmUserid: [{
required: true, message: '项目经理不能为空', trigger: 'change'
}],
description: [
{ min: 0, max: 250, message: '项目描述长度在0-250', trigger: 'change' }
],
setupRemark: [
{ min: 0, max: 250, message: '立项说明长度在0-250', trigger: 'change' }
],
planWorkingHours: [
{ required: true, message: '此项必填', trigger: 'change' }
],
startTime: [
{ required: true, message: '此项必填', trigger: 'change' }
],
endTime: [
{ required: true, message: '此项必填', trigger: 'change' }
],
tsrc: [
{ required: true, message: '此项必填', trigger: 'change' }
],
gain: [
{ required: true, message: '此项必填', trigger: 'change' }
],
target: [
{ min: 0, max: 250, message: '目标说明长度在0-250', trigger: 'change' }
]
},
//编辑界面数据 XmProject xm_project
editForm: {
id: '', code: '', name: '', xmType: '', startTime: '', endTime: '', urgent: '', priority: '', description: '', createUserid: '', createUsername: '', createTime: '', assess: '', assessRemarks: '', status: '', branchId: '', planTotalCost: '', bizProcInstId: '', bizFlowState: '', planNouserAt: '', planIuserAt: '', planOuserAt: '', locked: '', baseTime: '', baseRemark: '', baselineId: '', planWorkload: '0', totalReceivables: '0', budgetMarginRate: 13, contractAmt: 0, planIuserPrice: 85, planOuserPrice: 100, planOuserCnt: 0, planIuserCnt: 0, planWorkingHours: 0, taxRate: 3, planIuserWorkload: 0, planOuserWorkload: 0, fromTplId: '', budgetCtrl: '0', deptid: '', showOut: '0', isTpl: '0', pmUserid: '', pmUsername: '', assUserid: '', assUsername: '', admUserid: '', admUsername: '', budgetEarly: '', phaseActCtrl: '', del: '0', ltime: '', ostatus: '0', workType: '', wtype: '', earlyAmt: 0, maxTaskAmt: 0, menuLink: '0', phaseLink: '0', tplType: '', qxCode: ''
},
editFormBak: {
id: '', code: '', name: '', xmType: '', startTime: '', endTime: '', urgent: '', priority: '', description: '', createUserid: '', createUsername: '', createTime: '', assess: '', assessRemarks: '', status: '', branchId: '', planTotalCost: '', bizProcInstId: '', bizFlowState: '', planNouserAt: '', planIuserAt: '', planOuserAt: '', locked: '', baseTime: '', baseRemark: '', baselineId: '', planWorkload: '0', totalReceivables: '0', budgetMarginRate: 13, contractAmt: 0, planIuserPrice: 85, planOuserPrice: 100, planOuserCnt: 0, planIuserCnt: 0, planWorkingHours: 0, taxRate: 3, planIuserWorkload: 0, planOuserWorkload: 0, fromTplId: '', budgetCtrl: '0', deptid: '', showOut: '0', isTpl: '0', pmUserid: '', pmUsername: '', assUserid: '', assUsername: '', admUserid: '', admUsername: '', budgetEarly: '', phaseActCtrl: '', del: '0', ltime: '', ostatus: '0', workType: '', wtype: '', earlyAmt: 0, maxTaskAmt: 0, menuLink: '0', phaseLink: '0', tplType: '', qxCode: ''
},
apis: {
add: addXmProject,
edit: editXmProject,
editSomeFields: editXmProjectSomeFields
}
}//end return
},//end data
methods: {
sendToProcessApprova: function () {
let row=this.editForm
let bizKey="xm_project_start_approva"
// 传过来的参数格式
if (row.bizFlowState == '1') {
this.$notify.error("审核中,不允许重复发审");
return;
}
let extVars = { projectId: row.id }
let jsonExtVars = JSON.stringify(extVars);
var currDomain = window.location.protocol + "//" + window.location.host;
var fullPath = this.$route.fullPath;
var bizUrl = currDomain + '/#' + fullPath + '?extVars=' + jsonExtVars
let params = {
bizKey: bizKey,
bizUrl: bizUrl,
resUrl: '',
bizId: row.id,
bizPid: row.id,
mainContext: '',
extVars: extVars,
flowVars: {
subscribeTaskEvent: 'TASK_COMPLETED,TASK_CREATED',
data: {
id: row.id,
branchId: row.branchId
}
},
}
//立项审核
params.mainTitle = '关于项目【' + row.name + "】立项的审批申请";
params.mainContext = `<p><ol><li>xxx:xxxx</li><li>xxx:xxxx</li><li>xxx:xxxx</li><li>xxx:xxxx</li><li>xxx:xxxx</li></ol></p>`;
params.restUrl = config.getXmCtx() + "/xm/core/xmProject/processApprova";
params.flowVars.data = row
//this.html2canvas(document.querySelector(".editForm"),row,params);
this.$router.push({ name: 'bizStartProc', query: { paramsId: this.$mdp.setCacheParams(params) } });
},
editSomeFieldsCheck(row, fieldName, $event, params) {
if (fieldName == "admUserid") {
params["admUserid"] = $event.userid;
params["admUsername"] = $event.username;
} else if (fieldName == "assUserid") {
params["assUserid"] = $event.userid;
params["assUsername"] = $event.username;
} else if (fieldName == "pmUserid") {
params["pmUserid"] = $event.userid;
params["pmUsername"] = $event.username;
} else if (fieldName == 'deptid') {
params["deptid"] = $event.deptid;
params["deptidPath"] = $event.idPath;
} else {
params[fieldName] = $event
}
if (fieldName == 'description') {
this.$refs.editForm.validateField('description', err => {
if (!err) {
this.$notify({ position: 'bottom-left', showClose: true, message: "表单验证不通过", type: 'error' })
return;
}
})
} else if (fieldName == 'name') {
this.$refs.editForm.validateField('name', err => {
if (!err) {
this.$notify({ position: 'bottom-left', showClose: true, message: '表单验证不通过', type: 'error' })
return;
}
})
}
return true;
},
afterEditSomeFields(res, isOk, params, row) {
debugger
if (!isOk) {
this.initQxCode()
} else {
useXmStore2().setProjectInfo(row)
}
}
/**end 在上面加自定义方法**/
},//end method
components: {
},
mounted() {
this.$mdp.getDictOptions('projectStatus').then(res => this.dicts.projectStatus = res)
this.editForm=this.projectInfo
}
}
</script>
<style scoped />