Browse Source

条件审批

local_v3_liwenxuan
超级管理员 2 years ago
parent
commit
c7840bfd0a
  1. 8
      src/api/displayboardapi/indexapi.ts
  2. 12
      src/api/workflowapi/index.ts
  3. 21
      src/api/workflowapi/types.ts
  4. 15
      src/components/workflow/dialog/common.ts
  5. 135
      src/components/workflow/dialog/formWord.vue
  6. 38
      src/components/workflow/drwer/approverDrawer.vue
  7. 387
      src/components/workflow/drwer/conditionDrawer.vue
  8. 11
      src/components/workflow/selectBoxs.vue
  9. 7
      src/components/workflow/selectResult.vue
  10. 5
      src/utils/workflow/const.ts
  11. 18
      src/utils/workflow/index.ts
  12. 4
      src/views/sysworkflow/codepage/index.vue
  13. 56
      src/views/sysworkflow/flow/flowDrawingBoard.vue

8
src/api/displayboardapi/indexapi.ts

@ -103,3 +103,11 @@ export const GetPositionUnify = (data?: any) => {
data: data data: data
}) })
} }
//获取审批节点或条件节点
export const gainNodeFactor = (data?: any) => {
return request({
url: '/systemapi/task_flow/gain_node_factor',
method: 'post',
data: data
})
}

12
src/api/workflowapi/index.ts

@ -2,7 +2,9 @@ import request from '@/utils/request';
import { AxiosPromise } from 'axios'; import { AxiosPromise } from 'axios';
import { import {
formTableName formTableName,
flowversion,
publicid
} from '@/api/workflowapi/types' } from '@/api/workflowapi/types'
//初始化工作流 //初始化工作流
@ -45,3 +47,11 @@ export function judgeOptionalNode(data: any) {
data: data data: data
}); });
} }
//获取工作流版本列表
export function gainFlowVersionList(data: publicid): AxiosPromise<flowversion> {
return request({
url: '/systemapi/task_flow/gain_flow_version_list',
method: 'post',
data: data
});
}

21
src/api/workflowapi/types.ts

@ -1,9 +1,26 @@
export interface publicid{
id?: string;
}
//表单名称 //表单名称
export interface formTableName{ export interface formTableName{
name?: string; name?: string;
} }
//错误提示 //错误提示
export interface tipListStrucr{ export interface flowversion{
id:string;
version:string;
state:number;
key:string;
}
//工作流判断条件
export interface flowFactorCont{
id:number;
factorid:string;
options:optionsInfo[]
}
export interface optionsInfo{
label:string;
value:string;
} }

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

@ -1,13 +1,14 @@
import $func from '@/utils/workflow/index' import $func from '@/utils/workflow/index'
import { outputOrgAndUser } from '@/api/displayboardapi/types' import { outputOrgAndUser } from '@/api/displayboardapi/types'
import { getBasisOrgChiled,getEmployees,getRoles,SearchPositionUnify,GetPositionUnify } from '@/api/displayboardapi/indexapi' import { getBasisOrgChiled,getEmployees,getRoles,SearchPositionUnify,GetPositionUnify,gainNodeFactor } from '@/api/displayboardapi/indexapi'
export let searchVal = ref<any>('') export let searchVal = ref<any>('')
export let departments = ref<any>() export let departments = ref<any>()
export let roles = ref({}) export let roles = ref({})
export let positionList = ref<any>() export let positionList = ref<any>()
export let formWordList = ref<any>()
//获取行政组织及人员 //获取行政组织及人员
export let getDepartmentList = async (parentId:any = 0) => { export let getDepartmentList = async (parentId:any = 0) => {
@ -62,3 +63,15 @@ export let getPostList = async () => {
console.log("getPostList",data); console.log("getPostList",data);
positionList.value = data; positionList.value = data;
} }
//获取表单字段
export let gainFormTableWorde = async (id:string,types:number) => {
let sendData ={
id:id,
types:types
}
console.log("gainFormTableWorde--->",sendData);
let { data } = await gainNodeFactor(sendData)
console.log("gainFormTableWorde",data);
formWordList.value = data;
}

135
src/components/workflow/dialog/formWord.vue

@ -0,0 +1,135 @@
<!--
@ 作者: 秦东
@ 时间: 2023-10-20 13:32:10
@ 备注: 表单字段
-->
<script lang='ts' setup>
import { formWordList, gainFormTableWorde, searchVal } from '@/components/workflow/dialog/common'
import $func from '@/utils/workflow/index'
//
import '@/styles/workflowcss/dialog.scss'
//
import selectBox from '@/components/workflow/selectBoxs.vue'
import selectResult from '@/components/workflow/selectResult.vue'
let props = defineProps({
visible: {
type: Boolean,
default: false
},
data: {
type: Array,
default: () => []
},
formid:{
type:String,
default:""
},
formtype:{
type:Number,
default:1
}
});
let checkedFormList = ref([])
let emits = defineEmits(['update:visible', 'change'])
let list = computed(() => {
if(props.formtype == 1){
return [{
type: 'formword',
not: false,
data: formWordList.value,
isActive: (item) => $func.toggleClass(checkedFormList.value, item, 'id'),
change: (item) => {
checkedFormList.value = [item]
}
}]
}else{
return [{
type: 'formword',
not: true,
data: formWordList.value,
isActive: (item) => $func.toggleClass(checkedFormList.value, item, 'id'),
change: (item)=> $func.toChecked(checkedFormList.value, item),
}]
}
})
let resList = computed(() => {
if(props.formtype == 1){
return [{
type: 'formword',
data: checkedFormList.value,
cancel: (item) => $func.removeEle(checkedFormList.value, item, 'id')
}]
}else{
return [{
type: 'formword',
data: checkedFormList.value,
cancel: (item)=> $func.removeEle(checkedFormList.value, item)
}]
}
})
//
const closeDialog = () => {
emits('update:visible', false)
}
let isShow = computed({
get() {
return props.visible
},
set(val) {
closeDialog()
}
})
watch(() => props.visible, (val) => {
if (val) {
gainFormTableWorde(props.formid,props.formtype);
searchVal.value = "";
checkedFormList.value = props.data.map(({ name, id,options,isCheckbox }) => ({
name: name,
id: id,
options:options,
isCheckbox:isCheckbox
}));
}
})
let total = computed(() => checkedFormList.value.length)
const saveDialog = () => {
let checkedList = checkedFormList.value.map(item => ({
type: props.formtype,
name: item.name,
id: item.id,
options:item.options,
isCheckbox:item.isCheckbox
}))
emits('change', checkedList)
}
const delList = () => {
checkedFormList.value = [];
}
</script>
<template>
<el-dialog v-model="isShow" title="选择人力资源字段" :width="600" append-to-body class="promoter_person">
<div class="person_body clear">
<el-row>
<el-col :span="12">
<div class="person_tree l">
<selectBox :list="list"/>
</div>
</el-col>
<el-col :span="12">
<selectResult :list="resList" :total="total" @del="delList"/>
</el-col>
</el-row>
</div>
<template #footer>
<el-button @click="closeDialog"> </el-button>
<el-button type="primary" @click="saveDialog"> </el-button>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
</style>

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

@ -10,6 +10,7 @@ import { useStore } from '@/store/workflow/index'
import { getAllParentNode,judgeOptionalNode } from '@/api/workflowapi/index' import { getAllParentNode,judgeOptionalNode } from '@/api/workflowapi/index'
import PositionDialog from '@/components/workflow/dialog/positionDialog.vue' import PositionDialog from '@/components/workflow/dialog/positionDialog.vue'
import FormWord from '@/components/workflow/dialog/formWord.vue'
let props = defineProps({ let props = defineProps({
nodeConfig:{ nodeConfig:{
@ -37,8 +38,10 @@ let approverConfig = ref<any>({})
let approverVisible = ref(false) let approverVisible = ref(false)
let approverRoleVisible = ref(false) let approverRoleVisible = ref(false)
let appPosistonVisible = ref(false) let appPosistonVisible = ref(false)
let checkedRoleList = ref<any[]>([]) let appFormTableVisible = ref(false)
let checkedPostList = ref<any[]>([]) let checkedRoleList = ref<any[]>([]) //
let checkedPostList = ref<any[]>([]) //
let checkedFormList = ref<any[]>([]) //
let checkedList = ref<any[]>([]) let checkedList = ref<any[]>([])
let store = useStore() let store = useStore()
let { setApproverConfig, setApprover } = store let { setApproverConfig, setApprover } = store
@ -157,8 +160,19 @@ const isShowRatify = (id:number)=>{
return true return true
} }
} }
//
const formTableField = ()=> {
appFormTableVisible.value = true;
checkedFormList.value = approverConfig.value.nodeUserList
}
const sureFormTableApprover = (data:any)=> {
approverConfig.value.nodeUserList = data;
appFormTableVisible.value = false;
}
</script> </script>
<template> <template>
<el-drawer v-model="visible" :append-to-body="true" :title="nodeTitle" class="set_promoter" :show-close="false" :size="550" :before-close="saveApprover"> <el-drawer v-model="visible" :append-to-body="true" :title="nodeTitle" class="set_promoter" :show-close="false" :size="550" :before-close="saveApprover">
<div class="demo-drawer__content"> <div class="demo-drawer__content">
@ -269,9 +283,16 @@ const isShowRatify = (id:number)=>{
</el-radio-group> </el-radio-group>
</div> </div>
<div v-if="approverConfig.settype==8" class="approver_manager">
<p>指定审批字段</p>
<el-button type="primary" @click="formTableField">添加/修改审批字段</el-button>
<p class="selected_list">
<el-tag v-for="(item,index) in approverConfig.nodeUserList" :key="index" closable type="info" effect="plain" class="tag_us" @close="$func.removeEle(approverConfig.nodeUserList,item,'targetId')">{{item.name}}</el-tag>
<el-tag v-if="approverConfig.nodeUserList.length!=0" type="danger" effect="dark" @click="approverConfig.nodeUserList=[]">清除</el-tag>
</p>
</div>
<!--补充审批信息--> <!--补充审批信息-->
<div v-if="(approverConfig.settype==1&&approverConfig.nodeUserList.length>1)||approverConfig.settype==2||approverConfig.settype==6||(approverConfig.settype==4&&approverConfig.selectMode==2)" class="approver_some"> <div v-if="(approverConfig.settype==1&&approverConfig.nodeUserList.length>1)||approverConfig.settype==2||approverConfig.settype==6||(approverConfig.settype==4&&approverConfig.selectMode==2)||approverConfig.settype==8" class="approver_some">
<p>多人审批时采用的审批方式</p> <p>多人审批时采用的审批方式</p>
<el-radio-group v-model="approverConfig.examineMode" class="clear"> <el-radio-group v-model="approverConfig.examineMode" class="clear">
<el-radio :label="1">依次审批</el-radio> <el-radio :label="1">依次审批</el-radio>
@ -322,7 +343,14 @@ const isShowRatify = (id:number)=>{
:data="checkedPostList" :data="checkedPostList"
@change="surePostApprover" @change="surePostApprover"
/> />
<!--表单字段-->
<FormWord
v-model:visible="appFormTableVisible"
:data="checkedFormList"
:formid="props.customerFormKey"
:formtype="1"
@change="sureFormTableApprover"
/>
</div> </div>
</el-drawer> </el-drawer>

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

@ -6,8 +6,26 @@
<script lang='ts' setup> <script lang='ts' setup>
import $func from '@/utils/workflow/index' import $func from '@/utils/workflow/index'
import { useStore } from '@/store/workflow/index' import { useStore } from '@/store/workflow/index'
import { optTypes, opt1s } from '@/utils/workflow/const' import { optTypes, opt1s,flowFactor } from '@/utils/workflow/const'
import { flowFactorCont } from '@/api/workflowapi/types'
import { getConditions } from '@/api/workflowapi/index' import { getConditions } from '@/api/workflowapi/index'
import { gainNodeFactor } from '@/api/displayboardapi/indexapi'
let props = defineProps({
isFormFlow:{
type:Boolean,
default:true
},
customerFormKey:{
type:String,
default:""
},
});
const flowFactorList = ref<any[]>([]);
let conditionVisible = ref(false) let conditionVisible = ref(false)
let conditionsConfig = ref({ let conditionsConfig = ref({
conditionNodes: [], conditionNodes: [],
@ -33,7 +51,6 @@ let visible = computed({
} }
}) })
watch(conditionsConfig1, (val:any) => { watch(conditionsConfig1, (val:any) => {
// console.log("val.priorityLevel",val.priorityLevel)
conditionsConfig.value = val.value; conditionsConfig.value = val.value;
PriorityLevel.value = val.priorityLevel PriorityLevel.value = val.priorityLevel
conditionConfig.value = val.priorityLevel conditionConfig.value = val.priorityLevel
@ -41,130 +58,175 @@ watch(conditionsConfig1, (val:any) => {
: { nodeUserList: [], conditionList: [] } : { nodeUserList: [], conditionList: [] }
}) })
const changeOptType = (item) => { watch(visible,(val:any)=>{
if (item.optType == 1) { if(val){
item.zdy1 = 2; if(flowFactor.length>0){
} else { flowFactor.forEach(ites=>{
item.zdy1 = 1; flowFactorList.value.push({
item.zdy2 = 2; id:ites.id,
} name:ites.name,
keyid:ites.keyid,
type:ites.type,
isok:ites.isok,
isCheckbox:ites.isCheckbox,
options:ites.options
})
})
}
if(props.isFormFlow){
let sendData ={
id:props.customerFormKey,
types:2
}
gainNodeFactor(sendData)
.then(({data}) =>{
console.log("......>",data)
if(data.length > 0){
data.forEach(item=>{
flowFactorList.value.push({
id:flowFactorList.value.length+1,
name:item.name,
keyid:item.id,
type:3,
isok:false,
isCheckbox:item.isCheckbox,
options:item.options
})
})
}
})
}
}else{
flowFactorList.value = []
}
})
const closeDrawer = (val?:any) => {
initFactor()
setCondition(false)
} }
const toStrChecked = (item, key) => {
let a = item.zdy1 ? item.zdy1.split(",") : [] const isDelField = ref(false)
var isIncludes = $func.toggleStrClass(item, key); const tableList = ref<any[]>([])
if (!isIncludes) { const maxFactor = ref(false)
a.push(key)
item.zdy1 = a.toString() const tiaoJianAry = ref<any>()
} else { //
removeStrEle(item, key); const pickFactor = (val:any) => {
} let tableKeyAry = new Array
tableList.value.forEach(item=>{
tableKeyAry.push(item.factorid)
})
let types = 0
let options = new Array
let isCheckbox = false
flowFactorList.value.forEach(item=>{
if(item.keyid == val){
item.isok=true
types = item.type
options = item.options
isCheckbox = item.isCheckbox
}else{
if(tableKeyAry.length>0){
if(tableKeyAry.includes(item.keyid)){
item.isok=true
}else{
item.isok=false
}
}
}
})
tableList.value.forEach(item=>{
if(item.factorid == val){
item.type = types
item.options = options
item.isCheckbox = isCheckbox
}
})
console.log("tableList--->",tableList.value,val,types);
} }
const removeStrEle = (item, key) => { //
let a = item.zdy1 ? item.zdy1.split(",") : [] const addFactorCondition = () => {
var includesIndex; let currLent = tableList.value.length
a.map((item, index) => { if(currLent < flowFactorList.value.length){
if (item == key) { tableList.value.push({id:currLent+1,factorid:"",type:0})
includesIndex = index if(currLent+1 >= flowFactorList.value.length){
} maxFactor.value = true
}); }else{
a.splice(includesIndex, 1); maxFactor.value = false
item.zdy1 = a.toString() }
}else{
maxFactor.value = true
}
if(tableList.value.length > 1){
isDelField.value = true
}else{
isDelField.value = false
}
} }
const addCondition = async () => { const initFactor = () => {
conditionList.value = []; maxFactor.value = false
conditionVisible.value = true; if(tableList.value.length>0){
let { data } = await getConditions({ tableId: tableId.value }) tableList.value = []
conditions.value = data; }
if (conditionConfig.value.conditionList) { if(flowFactorList.value.length>0){
for (var i = 0; i < conditionConfig.value.conditionList.length; i++) { flowFactorList.value = []
var { columnId } = conditionConfig.value.conditionList[i] }
if (columnId == 0) {
conditionList.value.push({ columnId: 0 })
} else {
conditionList.value.push(conditions.value.filter(item => { return item.columnId == columnId; })[0])
}
}
}
} }
const sureCondition = () => { //
//1.+ const delTiaoJian = (val:any) => {
//2. let currLent = tableList.value.length
for (var i = 0; i < conditionList.value.length; i++) { if(currLent>0){
var { columnId, showName, columnName, showType, columnType, fixedDownBoxValue } = conditionList.value[i]; let guoduTable = []
if ($func.toggleClass(conditionConfig.value.conditionList, conditionList.value[i], "columnId")) { tableList.value.forEach(item=>{
continue; if(item.factorid != val.factorid){
} guoduTable.push(item)
if (columnId == 0) { }
conditionConfig.value.nodeUserList = []; })
conditionConfig.value.conditionList.push({ tableList.value = guoduTable
"type": 1, }
"columnId": columnId, flowFactorList.value.forEach(item=>{
"showName": '发起人' if(item.keyid == val.factorid){
}); item.isok=false
} else { }
if (columnType == "Double") { })
conditionConfig.value.conditionList.push({
"showType": showType, if(currLent < flowFactorList.value.length){
"columnId": columnId, maxFactor.value = false
"type": 2, }
"showName": showName, if(tableList.value.length > 1){
"optType": "1", isDelField.value = true
"zdy1": "2", }else{
"opt1": "<", isDelField.value = false
"zdy2": "", }
"opt2": "<",
"columnDbname": columnName,
"columnType": columnType,
})
} else if (columnType == "String" && showType == "3") {
conditionConfig.value.conditionList.push({
"showType": showType,
"columnId": columnId,
"type": 2,
"showName": showName,
"zdy1": "",
"columnDbname": columnName,
"columnType": columnType,
"fixedDownBoxValue": fixedDownBoxValue
})
}
}
}
//3.-
for (let i = conditionConfig.value.conditionList.length - 1; i >= 0; i--) {
if (!$func.toggleClass(conditionList.value, conditionConfig.value.conditionList[i], "columnId")) {
conditionConfig.value.conditionList.splice(i, 1);
}
}
conditionConfig.value.conditionList.sort(function (a, b) { return a.columnId - b.columnId; });
conditionVisible.value = false;
} }
const saveCondition = () => { const saveCondition = () => {
closeDrawer()
var a = conditionsConfig.value.conditionNodes.splice(PriorityLevel.value - 1, 1)// conditionConfig.conditionList = tableList.value
conditionsConfig.value.conditionNodes.splice(conditionConfig.value.priorityLevel - 1, 0, a[0])// console.log("conditionConfig.conditionList--->",conditionConfig.conditionList,tableList);
conditionsConfig.value.conditionNodes.map((item, index) => { // var a = conditionsConfig.value.conditionNodes.splice(PriorityLevel.value - 1, 1)//
item.priorityLevel = index + 1 // conditionsConfig.value.conditionNodes.splice(conditionConfig.value.priorityLevel - 1, 0, a[0])//
}); // conditionsConfig.value.conditionNodes.map((item, index) => {
for (var i = 0; i < conditionsConfig.value.conditionNodes.length; i++) { // item.priorityLevel = index + 1
conditionsConfig.value.conditionNodes[i].error = $func.conditionStr(conditionsConfig.value, i) == "请设置条件" && i != conditionsConfig.value.conditionNodes.length - 1 // });
} // for (var i = 0; i < conditionsConfig.value.conditionNodes.length; i++) {
setConditionsConfig({ // conditionsConfig.value.conditionNodes[i].error = $func.conditionStr(conditionsConfig.value, i) == "" && i != conditionsConfig.value.conditionNodes.length - 1
value: conditionsConfig.value, // }
flag: true, // setConditionsConfig({
id: conditionsConfig1.value.id // value: conditionsConfig.value,
}) // flag: true,
} // id: conditionsConfig1.value.id
const addConditionRole = () => { // })
conditionRoleVisible.value = true; closeDrawer()
checkedList.value = conditionConfig.value.nodeUserList
}
const sureConditionRole = (data) => {
conditionConfig.value.nodeUserList = data;
conditionRoleVisible.value = false;
}
const closeDrawer = (val?:any) => {
setCondition(false)
} }
</script> </script>
<template> <template>
@ -178,8 +240,69 @@ const closeDrawer = (val?:any) => {
<div class="demo-drawer__content"> <div class="demo-drawer__content">
<div class="condition_content drawer_content"> <div class="condition_content drawer_content">
<p class="tip">当审批单同时满足以下条件时进入此流程</p> <p class="tip">当审批单同时满足以下条件时进入此流程</p>
<el-row v-for="itemw in tableList" :key="itemw.id" :gutter="10" class="condition_row">
<el-col :span="7">
<div class="left_right_cont">
<el-select v-model="itemw.factorid" placeholder="请选择" class="selectInfo" @change="pickFactor">
<el-option
v-for="item in flowFactorList"
:key="item.keyid"
:label="item.name"
:value="item.keyid"
:disabled="item.isok"
>
</el-option>
</el-select>
<span></span>
</div>
</el-col>
<el-col :span="16">
<template v-if="itemw.type==1">
<el-button type="primary" style="margin-bottom:0px" >添加/修改成员</el-button>
<p class="selected_list">
<el-tag closable type="info" effect="plain" class="tag_us">演员1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag><el-tag closable type="info" effect="plain" class="tag_us">1</el-tag>
</p>
</template>
<template v-if="itemw.type==2">
<el-row v-for="(itemCustomFields,index) in itemw" :key="index" :gutter="5">
<el-col :span="6">
<el-input v-model="itemCustomFields.wordfield" placeholder="判断关键字"></el-input>
</el-col>
<el-col :span="itemCustomFields.optType != 6?7:16">
<el-select v-model="itemCustomFields.optType" class="selectInfo" @change="myoptChhange($event,itemCustomFields)">
<el-option
v-for="itemSel in optTypes"
:key="itemSel.value"
:label="itemSel.label"
:value="itemSel.value"
>
</el-option>
</el-select>
</el-col>
<el-col v-if="itemCustomFields.optType != 6" :span="9">
<el-input v-model="itemCustomFields.leftval" placeholder="请输入值"></el-input>
</el-col>
</el-row>
<el-button type="warning" style="margin-top:10px" >添加条件</el-button>
</template>
<template v-if="itemw.type==3">
<el-radio-group v-if="!itemw.isCheckbox" v-model="itemw.answers">
<el-radio v-for="optVal in itemw.options" :key="optVal.value" :label="optVal.value">{{optVal.label}}</el-radio>
</el-radio-group>
<el-checkbox-group v-if="itemw.isCheckbox" v-model="itemw.answers">
<el-checkbox v-for="optVal in itemw.options" :key="optVal.value" :label="optVal.value">{{ optVal.label }}</el-checkbox>
</el-checkbox-group>
</template>
</el-col>
<el-col :span="1"><el-icon v-if="isDelField" color="#FF0000" size="20px" class="delIcon" @click="delTiaoJian(itemw)"><CircleClose /></el-icon></el-col>
</el-row>
<el-button :disabled="maxFactor" type="primary" @click="addFactorCondition" >添加条件</el-button>
</div> </div>
<el-button type="primary" @click="addCondition">添加条件</el-button>
<div class="demo-drawer__footer clear"> <div class="demo-drawer__footer clear">
<el-button type="primary" @click="saveCondition"> </el-button> <el-button type="primary" @click="saveCondition"> </el-button>
<el-button @click="closeDrawer"> </el-button> <el-button @click="closeDrawer"> </el-button>
@ -203,7 +326,17 @@ const closeDrawer = (val?:any) => {
.condition_content { .condition_content {
padding: 20px 20px 0; padding: 20px 20px 0;
.condition_row{
margin-bottom:15px;
.left_right_cont{
display: flex;
justify-content: space-between;
align-items: center;
.selectInfo{
margin-right:5px;
}
}
}
p.tip { p.tip {
margin: 20px 0; margin: 20px 0;
width: 510px; width: 510px;
@ -301,4 +434,14 @@ const closeDrawer = (val?:any) => {
} }
} }
} }
.delIcon{
margin-top:6px;
}
.selected_list{
margin: 0;
span{
margin:5px 5px 4px 0px;
}
}
</style> </style>

11
src/components/workflow/selectBoxs.vue

@ -62,6 +62,17 @@ defineProps({
</div> </div>
</li> </li>
</template> </template>
<!--岗位信息遍历-->
<template v-if="elem.type === 'formword'">
<li v-for="item in elem.data" :key="item.roleId" class="check_box" :class="{not: !elem.isDepartment}">
<div :class="elem.isActive(item) && 'active'">
<a :title="item.departmentNames" @click="elem.change(item)">
<img src="@/assets/images/icon_role.png">{{item.name}}
</a>
</div>
</li>
</template>
</template> </template>
</ul> </ul>
</template> </template>

7
src/components/workflow/selectResult.vue

@ -56,6 +56,13 @@ let emits = defineEmits(['del'])
<img src="@/assets/images/cancel.png" @click="cancel(item)"> <img src="@/assets/images/cancel.png" @click="cancel(item)">
</li> </li>
</template> </template>
<template v-if="type === 'formword'">
<li v-for="item in data" :key="item.roleId">
<img src="@/assets/images/icon_role.png">
<span>{{item.name}}</span>
<img src="@/assets/images/cancel.png" @click="cancel(item)">
</li>
</template>
</template> </template>
</ul> </ul>
</div> </div>

5
src/utils/workflow/const.ts

@ -39,3 +39,8 @@ export let opt1s = [
{value: '<', label: '<'}, {value: '<', label: '<'},
{value: '≤', label: '≤'}, {value: '≤', label: '≤'},
] ]
//工作流判断条件(类型:1、申请人;2、自定义字段;3、单选;4、多选;5、开关)
export let flowFactor = [
{id:1,name:"申请人",keyid:"applicant",type:1,isok:false,isCheckbox:true,options:[]},
{id:2,name:"自定义字段",keyid:"customFields",type:2,isok:false,isCheckbox:false,options:[]}
]

18
src/utils/workflow/index.ts

@ -72,7 +72,7 @@ All.prototype = {
return nodeConfig.nodeUserList.length + "人非会签" return nodeConfig.nodeUserList.length + "人非会签"
} }
}else{ }else{
return "指定成员" // return "指定成员"
} }
} else if (nodeConfig.settype == 2) { } else if (nodeConfig.settype == 2) {
let level = nodeConfig.directorLevel == 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管' let level = nodeConfig.directorLevel == 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管'
@ -80,7 +80,9 @@ All.prototype = {
return level return level
} else if (nodeConfig.examineMode == 2) { } else if (nodeConfig.examineMode == 2) {
return level + "会签" return level + "会签"
} }else if (nodeConfig.examineMode == 3) {
return level + + "非会签"
}
} else if (nodeConfig.settype == 3) { } else if (nodeConfig.settype == 3) {
console.log("nodeConfig==会签==>",nodeConfig) console.log("nodeConfig==会签==>",nodeConfig)
if (nodeConfig.nodeUserList.length == 1) { if (nodeConfig.nodeUserList.length == 1) {
@ -109,6 +111,18 @@ All.prototype = {
return '从直接主管到通讯录中级别最高的第' + nodeConfig.examineEndDirectorLevel + '个层级主管' return '从直接主管到通讯录中级别最高的第' + nodeConfig.examineEndDirectorLevel + '个层级主管'
}else if (nodeConfig.settype == 7){ }else if (nodeConfig.settype == 7){
return "指定前置审批为本节点设置审批人" return "指定前置审批为本节点设置审批人"
}else if (nodeConfig.settype == 8){
console.log("checkedFormList--1111->",nodeConfig)
if(nodeConfig.nodeUserList.length > 0){
if (nodeConfig.examineMode == 1) {
return nodeConfig.nodeUserList[0].name + "依次审批"
} else if (nodeConfig.examineMode == 2) {
return nodeConfig.nodeUserList[0].name + "会签"
}else if (nodeConfig.examineMode == 3) {
return nodeConfig.nodeUserList[0].name + "非会签"
}
}
} }
}, },
dealStr(str:any, obj:any) { dealStr(str:any, obj:any) {

4
src/views/sysworkflow/codepage/index.vue

@ -151,6 +151,7 @@ const drawerWidht = ref()
const isFormFlow = ref(false) const isFormFlow = ref(false)
const customerFormKey = ref<string>() const customerFormKey = ref<string>()
const customerFormName = ref<string>() const customerFormName = ref<string>()
const flowKey = ref<string>()
const setupWorkFlow = (cont:customerFormCont) => { const setupWorkFlow = (cont:customerFormCont) => {
drawerWidht.value = contbody.value?.clientWidth drawerWidht.value = contbody.value?.clientWidth
// console.log("clientHeight--->",drawerWidht.value) // console.log("clientHeight--->",drawerWidht.value)
@ -158,6 +159,7 @@ const setupWorkFlow = (cont:customerFormCont) => {
isFormFlow.value = true; isFormFlow.value = true;
customerFormName.value = cont.name customerFormName.value = cont.name
customerFormKey.value = cont.id.toString() customerFormKey.value = cont.id.toString()
flowKey.value = cont.flowkey.toString()
} }
</script> </script>
@ -286,7 +288,7 @@ const setupWorkFlow = (cont:customerFormCont) => {
</el-drawer> </el-drawer>
<SetupConfig v-model:show="show" :editid="editid" @handle_query="handleQuery" /> <SetupConfig v-model:show="show" :editid="editid" @handle_query="handleQuery" />
<DataTableStructure v-model:isshow="dataTableIsShow" :formcont="formCont" /> <DataTableStructure v-model:isshow="dataTableIsShow" :formcont="formCont" />
<FlowDrawingBoard v-model:open-drawer="drawer" :drawer-widht="drawerWidht" :is-form-flow="isFormFlow" :customer-form-name="customerFormName" :customer-form-key="customerFormKey" /> <FlowDrawingBoard v-model:open-drawer="drawer" :drawer-widht="drawerWidht" :is-form-flow="isFormFlow" :customer-form-name="customerFormName" :customer-form-key="customerFormKey" :flow-key="flowKey" />
</template> </template>
<style lang='scss' scoped> <style lang='scss' scoped>
.drawerClass{ .drawerClass{

56
src/views/sysworkflow/flow/flowDrawingBoard.vue

@ -7,8 +7,8 @@
import '@/styles/workflowcss/workflow.scss' import '@/styles/workflowcss/workflow.scss'
import { useStore } from '@/store/workflow/index' import { useStore } from '@/store/workflow/index'
import { tipListStrucr } from '@/api/workflowapi/types' import { tipListStrucr,flowversion } from '@/api/workflowapi/types'
import { initializeWorkFlow,setWorkFlowData } from '@/api/workflowapi/index' import { initializeWorkFlow,setWorkFlowData,gainFlowVersionList } from '@/api/workflowapi/index'
// //
import errorDialog from "@/components/workflow/dialog/errorDialog.vue"; import errorDialog from "@/components/workflow/dialog/errorDialog.vue";
@ -37,6 +37,10 @@ const props = defineProps({
customerFormName:{ customerFormName:{
type:String, type:String,
default:"" default:""
},
flowKey:{
type:String,
default:""
} }
}) })
const emits = defineEmits(["update:openDrawer"]); const emits = defineEmits(["update:openDrawer"]);
@ -58,6 +62,25 @@ let workFlowDef = ref({});
let flowPermission = ref([]); let flowPermission = ref([]);
let directorMaxLeveling = ref<number>(0); let directorMaxLeveling = ref<number>(0);
const shenPiTitle = ref<string>("") const shenPiTitle = ref<string>("")
const activeTabs = ref<string>(""); //
const versionList = ref<flowversion[]>(); //
//
const getFlowVerList = ()=>{
gainFlowVersionList({id:props.flowKey.toString()})
.then(({data})=>{
if(data){
if(data.length>0){
versionList.value = data;
data.forEach(item=>{
if(item.state == 1){
activeTabs.value = item.version
}
})
}
}
})
}
// //
onMounted(async ()=>{ onMounted(async ()=>{
@ -155,6 +178,12 @@ const clearCanvas = () =>{
} }
watch(()=>props.openDrawer,(val)=>{ watch(()=>props.openDrawer,(val)=>{
if(val){ if(val){
if(props.flowKey != ""){
getFlowVerList()
}else{
}
initWorkFlowData() initWorkFlowData()
shenPiTitle.value = props.customerFormName shenPiTitle.value = props.customerFormName
}else{ }else{
@ -162,6 +191,12 @@ watch(()=>props.openDrawer,(val)=>{
tipList.value = [] tipList.value = []
} }
}) })
//
const clickFormTable = (val:any) =>{
// console.log("",val,formTableIndex.value)
// getTableFieldList(versionIndex.value,val)
}
</script> </script>
<template> <template>
<el-drawer v-model="isShow" :size="props.drawerWidht" :show-close="false"> <el-drawer v-model="isShow" :size="props.drawerWidht" :show-close="false">
@ -185,20 +220,13 @@ watch(()=>props.openDrawer,(val)=>{
</template> </template>
<div class="canvas_body"> <div class="canvas_body">
<el-row :gutter="20"> <el-row v-if="props.flowKey!=''" :gutter="20">
<el-col :span="20"> <el-col :span="20">
<el-tabs class="flow_version" > <el-tabs v-model="activeTabs" class="flow_version" @tab-change="clickFormTable">
<el-tab-pane> <el-tab-pane v-for="item in versionList" :key="item.id">
<template #label>
<span class="custom-tabs-label">
<span>1</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane>
<template #label> <template #label>
<span class="custom-tabs-label"> <span class="custom-tabs-label">
<span>2</span> <span>{{ item.version }}}</span>
</span> </span>
</template> </template>
</el-tab-pane> </el-tab-pane>
@ -229,7 +257,7 @@ watch(()=>props.openDrawer,(val)=>{
<promoterDrawer /> <promoterDrawer />
<approverDrawer :directormaxlevel="directorMaxLeveling" :node-config="nodeConfig" :is-form-flow="props.isFormFlow" :customer-form-key="props.customerFormKey" /> <approverDrawer :directormaxlevel="directorMaxLeveling" :node-config="nodeConfig" :is-form-flow="props.isFormFlow" :customer-form-key="props.customerFormKey" />
<copyerDrawer /> <copyerDrawer />
<conditionDrawer /> <conditionDrawer :is-form-flow="props.isFormFlow" :customer-form-key="props.customerFormKey" />
</div> </div>
</el-drawer> </el-drawer>
</template> </template>

Loading…
Cancel
Save