Browse Source

添加工作流

v3
超级管理员 2 years ago
parent
commit
26eba2ecfc
  1. 11
      src/api/DesignForm/requestapi.ts
  2. 34
      src/api/DesignForm/type.ts
  3. 12
      src/api/taskapi/management.ts
  4. 32
      src/api/taskapi/types.ts
  5. 2
      src/components/workflow/dialog/common.ts
  6. 18
      src/components/workflow/dialog/positionDialog.vue
  7. 23
      src/components/workflow/drwer/approverDrawer.vue
  8. 12
      src/components/workflow/drwer/conditionDrawer.vue
  9. 36
      src/views/taskplatform/taskmanagement/flowStep.vue
  10. 65
      src/views/taskplatform/taskmanagement/taskcustomerform.vue
  11. 160
      vite.config.ts.timestamp-1700438049737-94a706be71b5b.mjs

11
src/api/DesignForm/requestapi.ts

@ -19,7 +19,8 @@ import {
optimizeRepairForm, optimizeRepairForm,
publicFormTableStruct, publicFormTableStruct,
hanziToPinyin, hanziToPinyin,
gogoBackFormTabelStruct gogoBackFormTabelStruct,
nodeFlow
} from './type'; } from './type';
//自定义表单列表 //自定义表单列表
export function getCustomerFormList(queryParams: SearchForm): AxiosPromise<CustomerFormPageResult> { export function getCustomerFormList(queryParams: SearchForm): AxiosPromise<CustomerFormPageResult> {
@ -167,3 +168,11 @@ export function chineseToPinyin(data: hanziToPinyin){
data: data data: data
}); });
} }
//获取工作流步进节点
export function generateFlow(data: nodeFlow){
return request({
url: '/systemapi/task_flow/generateFlow',
method: 'post',
data: data
});
}

34
src/api/DesignForm/type.ts

@ -59,6 +59,8 @@ export interface customerFormVersionCont{
editTime:number; editTime:number;
table_structure:string; table_structure:string;
dict:string; dict:string;
createrstr:string;
flowkeystr:string;
} }
//编辑自定义表单内容 //编辑自定义表单内容
export interface editFormInfo extends customerFromCont{ export interface editFormInfo extends customerFromCont{
@ -132,3 +134,35 @@ export interface hanziToPinyin{
types:number; types:number;
connector:string; connector:string;
} }
//获取工作流步进节点
export interface nodeFlow extends enableVersionId{
conditionList?:conditionInfo[]
}
export interface conditionInfo{
factorid:string;
type:number;
isCheckbox?:boolean;
answers?:string[];
oneanswer?:string;
customFields?:customFieldsInfo[];
nodeUserList?:nodeUserInfo[];
}
//自定义条件
export interface customFieldsInfo{
wordfield:string;
optType:string;
leftval:string;
leftoptType?:string;
rightoptType?:string;
rightval?:string;
}
//节点条件人员
export interface nodeUserInfo{
type:number;
targetId:string;
name?:string;
icon?:string;
iconToBase64?:string;
}

12
src/api/taskapi/management.ts

@ -6,7 +6,8 @@ import {
gainTaskListQuery, gainTaskListQuery,
gainTaskListPageResult, gainTaskListPageResult,
customerFormLogo, customerFormLogo,
customerFormVersionCont customerFormVersionCont,
nodeFlow
} from '@/api/taskapi/types' } from '@/api/taskapi/types'
@ -64,3 +65,12 @@ export function delCustomerFormData(data: customerFormLogo) {
data: data data: data
}); });
} }
//获取工作流步进节点
export function generateFlow(data: nodeFlow):any{
return request({
url: '/systemapi/task_flow/generateFlow',
method: 'post',
data: data
});
}

32
src/api/taskapi/types.ts

@ -55,3 +55,35 @@ export interface customerFormVersionCont{
table_structure:string; table_structure:string;
dict:string; dict:string;
} }
//获取工作流步进节点
export interface nodeFlow extends customerFormLogo{
conditionList?:conditionInfo[]
}
export interface conditionInfo{
factorid:string;
type:number;
isCheckbox?:boolean;
answers?:string[];
oneanswer?:string;
customFields?:customFieldsInfo[];
nodeUserList?:nodeUserInfo[];
}
//自定义条件
export interface customFieldsInfo{
wordfield:string;
optType:string;
leftval:string;
leftoptType?:string;
rightoptType?:string;
rightval?:string;
}
//节点条件人员
export interface nodeUserInfo{
type:number;
targetId:string;
name?:string;
icon?:string;
iconToBase64?:string;
}

2
src/components/workflow/dialog/common.ts

@ -60,7 +60,7 @@ export let getRoleList = async () => {
export let getPostList = async () => { export let getPostList = async () => {
let { data } = await GetPositionUnify() let { data } = await GetPositionUnify()
console.log("getPostList",data); // console.log("getPostList",data);
positionList.value = data; positionList.value = data;
} }

18
src/components/workflow/dialog/positionDialog.vue

@ -55,6 +55,7 @@ watch(() => props.visible, (val:any) => {
if (val) { if (val) {
getPostList(); getPostList();
searchVal.value = ""; searchVal.value = "";
// console.log("--->",props.data)
checkedRoleList.value = props.data.map(({ name, targetId }) => ({ checkedRoleList.value = props.data.map(({ name, targetId }) => ({
name: name, name: name,
id: targetId id: targetId
@ -63,13 +64,28 @@ watch(() => props.visible, (val:any) => {
}) })
let total = computed(() => checkedRoleList.value.length) let total = computed(() => checkedRoleList.value.length)
const saveDialog = () => { const saveDialog = () => {
// console.log("",checkedRoleList.value)
let checkedList = checkedRoleList.value.map((item:any) => ({ let checkedList = checkedRoleList.value.map((item:any) => ({
type: 4, type: 4,
targetId: item.id.toString(), targetId: item.id.toString(),
name: item.name name: item.name,
options:optionsList(item.PositionListId)
})) }))
// console.log("--2--->",checkedList)
emits('change', checkedList) emits('change', checkedList)
} }
const optionsList = (val:any[]) =>{
let optionsAry = new Array
if(val&&val.length>0){
val.forEach((item:any) => {
optionsAry.push({
label:"",
value:item.toString()
})
})
}
return optionsAry
}
const delList = () => { const delList = () => {
checkedRoleList.value = []; checkedRoleList.value = [];
} }

23
src/components/workflow/drwer/approverDrawer.vue

@ -66,7 +66,9 @@ watch(visible,(val:any)=>{
}) })
watch(approverConfig1, (val:any)=>{ watch(approverConfig1, (val:any)=>{
// console.log("directormaxlevel",visible.value)\
val.value.attribute = val.value.attribute*1
console.log("directormaxlevel",val.value)
matrixIsShow.value = false matrixIsShow.value = false
approverConfig.value = val.value approverConfig.value = val.value
if(val.type == 3){ if(val.type == 3){
@ -75,7 +77,7 @@ watch(approverConfig1, (val:any)=>{
nodeTitle.value = "审批人设置" nodeTitle.value = "审批人设置"
} }
isExecutor.value = false isExecutor.value = false
// approverConfig.attribute = approverConfig.attribute*1
if(visible.value){ if(visible.value){
judgeOptionalNode(props.nodeConfig) judgeOptionalNode(props.nodeConfig)
.then((data:any)=>{ .then((data:any)=>{
@ -221,10 +223,10 @@ const updateMatrix = (val:any) =>{
<div v-if="approverConfig.settype==2" class="approver_manager"> <div v-if="approverConfig.settype==2" class="approver_manager">
<p> <p>
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="6"> <el-col v-if="isExecutor" :span="6">
<select v-model="approverConfig.attribute" style="width:100%"> <select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option> <option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option> <option value="2">执行人</option>
</select> </select>
</el-col> </el-col>
<el-col :span="18"> <el-col :span="18">
@ -245,9 +247,9 @@ const updateMatrix = (val:any) =>{
<el-button type="primary" @click="addApproverPost">添加/修改行政岗位</el-button> <el-button type="primary" @click="addApproverPost">添加/修改行政岗位</el-button>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<select v-model="approverConfig.attribute" style="width:100%"> <select v-if="isExecutor" v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option> <option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option> <option value="2">执行人</option>
</select> </select>
</el-col> </el-col>
</el-row> </el-row>
@ -283,10 +285,10 @@ const updateMatrix = (val:any) =>{
<p>审批终点</p> <p>审批终点</p>
<p style="padding-bottom:20px"> <p style="padding-bottom:20px">
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="6"> <el-col v-if="isExecutor" :span="6">
<select v-model="approverConfig.attribute" style="width:100%"> <select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option> <option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option> <option value="2">执行人</option>
</select> </select>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
@ -318,7 +320,10 @@ const updateMatrix = (val:any) =>{
</div> </div>
<!--权限矩阵--> <!--权限矩阵-->
<div v-if="approverConfig.settype==9" class="approver_manager"> <div v-if="approverConfig.settype==9" class="approver_manager">
<select v-if="isExecutor" v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option value="2">执行人</option>
</select>
<MatrixPage <MatrixPage
v-model:isshow="matrixIsShow" v-model:isshow="matrixIsShow"
:data="matrixFieldList" :data="matrixFieldList"

12
src/components/workflow/drwer/conditionDrawer.vue

@ -166,7 +166,7 @@ const addFactorCondition = () => {
}) })
} }
if(currLent < flowFactorList.value.length){ if(currLent < flowFactorList.value.length){
tableList.value.push({id:currLent+1,name:"",factorid:"",type:0,isok:false,isCheckbox:true,options:[],answers:[],customFields:[]}) tableList.value.push({id:currLent+1,name:"",factorid:"",type:0,isok:false,isCheckbox:true,options:[],oneanswer:"",answers:[],customFields:[]})
if(currLent+1 >= flowFactorList.value.length){ if(currLent+1 >= flowFactorList.value.length){
maxFactor.value = true maxFactor.value = true
}else{ }else{
@ -231,7 +231,7 @@ const saveCondition = () => {
let isError = false let isError = false
if(tableList.value.length>0){ if(tableList.value.length>0){
for (var i = 0; i < tableList.value.length; i++) { for (var i = 0; i < tableList.value.length; i++) {
var {name,type,options,nodeUserList,answers,isCheckbox,customFields} = tableList.value[i] var {name,type,options,nodeUserList,oneanswer,answers,isCheckbox,customFields} = tableList.value[i]
console.log("conditionConfig.conditionList--1->",name); console.log("conditionConfig.conditionList--1->",name);
console.log("conditionConfig.conditionList--2->",type); console.log("conditionConfig.conditionList--2->",type);
console.log("conditionConfig.conditionList--3->",options); console.log("conditionConfig.conditionList--3->",options);
@ -239,6 +239,7 @@ const saveCondition = () => {
console.log("conditionConfig.conditionList--5->",answers); console.log("conditionConfig.conditionList--5->",answers);
console.log("conditionConfig.conditionList--6->",isCheckbox); console.log("conditionConfig.conditionList--6->",isCheckbox);
console.log("conditionConfig.conditionList--7->",customFields); console.log("conditionConfig.conditionList--7->",customFields);
console.log("conditionConfig.conditionList--8->",oneanswer);
switch(type){ switch(type){
case 1: case 1:
if(nodeUserList){ if(nodeUserList){
@ -262,6 +263,7 @@ const saveCondition = () => {
} }
break; break;
case 3: case 3:
if (isCheckbox){
if(answers.length > 0){ if(answers.length > 0){
if(!Array.isArray(answers)){ if(!Array.isArray(answers)){
tableList.value[i].answers=[answers] tableList.value[i].answers=[answers]
@ -269,6 +271,10 @@ const saveCondition = () => {
}else{ }else{
isError = true isError = true
} }
}else{
tableList.value[i].oneanswer=oneanswer
}
break; break;
default: default:
isError = true isError = true
@ -441,7 +447,7 @@ const delCuresTiaoJian = (val:any,old:any) => {
<el-button type="warning" style="margin-top:0px" @click="addCustomFields">添加条件</el-button> <el-button type="warning" style="margin-top:0px" @click="addCustomFields">添加条件</el-button>
</template> </template>
<template v-if="itemw.type==3"> <template v-if="itemw.type==3">
<el-radio-group v-if="!itemw.isCheckbox" v-model="itemw.answers"> <el-radio-group v-if="!itemw.isCheckbox" v-model="itemw.oneanswer">
<el-radio v-for="optVal in itemw.options" :key="optVal.value" :label="optVal.value">{{optVal.label}}</el-radio> <el-radio v-for="optVal in itemw.options" :key="optVal.value" :label="optVal.value">{{optVal.label}}</el-radio>
</el-radio-group> </el-radio-group>
<el-checkbox-group v-if="itemw.isCheckbox" v-model="itemw.answers"> <el-checkbox-group v-if="itemw.isCheckbox" v-model="itemw.answers">

36
src/views/taskplatform/taskmanagement/flowStep.vue

@ -0,0 +1,36 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-17 16:43:55
@ 备注: 工作流步进图
-->
<script lang='ts' setup>
const props = defineProps({
flowMap: {
type: Array,
default: () => []
}
})
const emits = defineEmits(["update:flowMap"]);
const flowList = computed({
get: () => props.flowMap,
set: (val) => {
emits("update:flowMap", val);
},
});
watch(()=>props.flowMap,(val:any)=>{
console.log("val----->",val)
flowList=val
})
</script>
<template>
<div>
{{props.flowMap}}
<el-steps direction="vertical" :active="1">
<el-step v-for="item in flowList" :key="item.step" :title="item.step">{{item.nodeName}}</el-step>
</el-steps>
</div>
</template>
<style lang='scss' scoped>
</style>

65
src/views/taskplatform/taskmanagement/taskcustomerform.vue

@ -10,8 +10,8 @@ import {
string2json, string2json,
stringToObj stringToObj
} from '@/utils/DesignForm/form' } from '@/utils/DesignForm/form'
import { nodeFlow } from '@/api/taskapi/types'
import { haveCustomerFormVersion } from '@/api/taskapi/management' import { haveCustomerFormVersion,generateFlow } from '@/api/taskapi/management'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi' import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import '@/assets/scss/element-var.scss' import '@/assets/scss/element-var.scss'
@ -19,6 +19,8 @@ import '@/assets/scss/index.scss'
import '@/assets/iconfont/iconfont.css' import '@/assets/iconfont/iconfont.css'
import 'element-plus/dist/index.css' import 'element-plus/dist/index.css'
import FlowStep from '@/views/taskplatform/taskmanagement/flowStep.vue'
const props = defineProps({ const props = defineProps({
isopen:{ isopen:{
type:Boolean, type:Boolean,
@ -65,6 +67,7 @@ const submitButton = {
} }
}] }]
} }
const isFlowForm = ref(false)
const loadingData = ref(false) const loadingData = ref(false)
const formEl = ref() const formEl = ref()
const router = useRouter() const router = useRouter()
@ -80,6 +83,13 @@ const state = reactive<any>({
id: 0, id: 0,
loading: true loading: true
}) })
//
const gainFlowChart = reactive<nodeFlow>({
id:0
})
//
const flowMap = ref<any[]>();
const formType = computed(() => { const formType = computed(() => {
// id // id
if (props.infoid) { if (props.infoid) {
@ -103,6 +113,11 @@ const getTaskFormData = () =>{
haveCustomerFormVersion({id:props.versionid}) haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{ .then(({ data }) =>{
console.log("表单数据",data) console.log("表单数据",data)
if(data.classify == 2){
isFlowForm.value = true;
}else{
isFlowForm.value = false;
}
state.id=props.versionid state.id=props.versionid
state.formData = stringToObj(data.mastesform) state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict) state.dict = string2json(data.dict)
@ -114,6 +129,14 @@ const getTaskFormData = () =>{
} }
} }
}) })
//
gainFlowChart.id=data.flowkeystr
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图",data)
flowMap.value = data.data
console.log("获取工作流不进图--->",flowMap.value)
})
}) })
.finally(()=>{ .finally(()=>{
loadingData.value = false; loadingData.value = false;
@ -167,7 +190,31 @@ watch(()=>props.isopen,()=>{
</script> </script>
<template> <template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" > <el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
<div class="drawerBody">
<el-tabs v-if="isFlowForm" tab-position="left" style="height: 100%" class="demo-tabs">
<el-tab-pane label="表单">
<ak-form
ref="formEl"
:form-data="state.formData"
:type="formType"
:dict="state.dict"
request-url="getFormContent"
add-url="saveFormContent"
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
/>
</el-tab-pane>
<el-tab-pane label="流程">
<FlowStep v-molde:flow-map="flowMap" />
</el-tab-pane>
</el-tabs>
<div v-else class="drawerBody">
<ak-form <ak-form
ref="formEl" ref="formEl"
:form-data="state.formData" :form-data="state.formData"
@ -209,3 +256,15 @@ watch(()=>props.isopen,()=>{
padding: 20px; padding: 20px;
} }
</style> </style>
<style>
.demo-tabs > .el-tabs__content {
padding: 0px 20px 20px 20px;
overflow: hidden;
overflow-y: auto;
}
.el-tabs--right .el-tabs__content,
.el-tabs--left .el-tabs__content {
height: 100%;
}
</style>

160
vite.config.ts.timestamp-1700438049737-94a706be71b5b.mjs

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save