Browse Source

设置审批选项

local_v3_liwenxuan
超级管理员 2 years ago
parent
commit
34a2602f98
  1. 17
      src/api/displayboardapi/indexapi.ts
  2. 6
      src/components/workflow/addNode.vue
  3. 20
      src/components/workflow/dialog/common.ts
  4. 104
      src/components/workflow/dialog/positionDialog.vue
  5. 116
      src/components/workflow/drwer/approverDrawer.vue
  6. 12
      src/components/workflow/selectBoxs.vue
  7. 9
      src/components/workflow/selectResult.vue
  8. 3
      src/styles/workflowcss/workflow.scss
  9. 9
      src/utils/workflow/index.ts
  10. 31
      src/views/sysworkflow/codepage/index.vue
  11. 249
      src/views/sysworkflow/flow/flowDrawingBoard.vue
  12. 168
      src/views/sysworkflow/flow/index.vue
  13. 160
      vite.config.ts.timestamp-1697610303012-42c6e5d26ab95.mjs

17
src/api/displayboardapi/indexapi.ts

@ -86,3 +86,20 @@ export const getRoles = (data?: any) => {
data: data
})
}
//搜索角色(新版)
export const SearchPositionUnify = (data?: any) => {
return request({
url: '/kpiapi/powerpc/search_position_unify',
method: 'post',
data: data
})
}
//获取统一岗位
export const GetPositionUnify = (data?: any) => {
return request({
url: '/kpiapi/powerpc/get_position_unify',
method: 'post',
data: data
})
}

6
src/components/workflow/addNode.vue

@ -66,7 +66,8 @@ const addType = (type:any)=> {
"nodeUserList": [],
"fromNode": fromNodeNumber,
"gotoNode":[gotoNodeNumber],
"sendBackNode":"beginnode"
"sendBackNode":"beginnode",
"attribute":1
}
// console.log("p4",data)
} else if (type == 2) {
@ -98,7 +99,8 @@ const addType = (type:any)=> {
"nodeUserList": [],
"fromNode": fromNodeNumber,
"gotoNode":[gotoNodeNumber],
"sendBackNode":"beginnode"
"sendBackNode":"beginnode",
"attribute":1
}
// console.log("p6",data)
}

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

@ -1,12 +1,13 @@
import $func from '@/utils/workflow/index'
import { outputOrgAndUser } from '@/api/displayboardapi/types'
import { getBasisOrgChiled,getEmployees,getRoles } from '@/api/displayboardapi/indexapi'
import { getBasisOrgChiled,getEmployees,getRoles,SearchPositionUnify,GetPositionUnify } from '@/api/displayboardapi/indexapi'
export let searchVal = ref<any>('')
export let departments = ref<any>()
export let roles = ref({})
export let positionList = ref<any>()
//获取行政组织及人员
export let getDepartmentList = async (parentId:any = 0) => {
@ -39,8 +40,25 @@ export let getDebounceData = (event:any, type = 1) => {
}
})()
}
export let searchPostName =async (event:any, type = 1) => {
let sendData ={
name:event.target.value
}
console.log("searchPostName",sendData)
let { data } = await SearchPositionUnify(sendData);
positionList.value = data;
}
//角色列表
export let getRoleList = async () => {
let { data: { list } } = await getRoles()
roles.value = list;
}
export let getPostList = async () => {
let { data } = await GetPositionUnify()
console.log("getPostList",data);
positionList.value = data;
}

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

@ -0,0 +1,104 @@
<!--
@ 作者: 秦东
@ 时间: 2023-10-19 08:13:15
@ 备注: 行政岗位
-->
<script lang='ts' setup>
import { positionList, searchPostName, getPostList, 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: () => []
}
});
let checkedRoleList = ref([])
let emits = defineEmits(['update:visible', 'change'])
let list = computed(() => {
return [{
type: 'position',
data: positionList.value,
isActive: (item) => $func.toggleClass(checkedRoleList.value, item, 'id'),
// change: (item) => {
// checkedRoleList.value = [item]
// }
change: (item)=> $func.toChecked(checkedRoleList.value, item),
}]
})
let resList = computed(() => {
return [{
type: 'position',
data: checkedRoleList.value,
// cancel: (item) => $func.removeEle(checkedRoleList.value, item, 'id')
cancel: (item)=> $func.removeEle(checkedRoleList.value, item)
}]
})
let visibleDialog = computed({
get() {
return props.visible
},
set(val) {
closeDialog()
}
})
watch(() => props.visible, (val) => {
if (val) {
getPostList();
searchVal.value = "";
checkedRoleList.value = props.data.map(({ name, targetId }) => ({
name: name,
id: targetId
}));
}
})
let total = computed(() => checkedRoleList.value.length)
const saveDialog = () => {
let checkedList = checkedRoleList.value.map(item => ({
type: "position",
targetId: item.id,
name: item.name
}))
emits('change', checkedList)
}
const delList = () => {
checkedRoleList.value = [];
}
const closeDialog = () => {
emits('update:visible', false)
}
</script>
<template>
<el-dialog v-model="visibleDialog" 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">
<input v-model="searchVal" type="text" placeholder="搜索岗位" @input="searchPostName($event,2)">
<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>

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

@ -9,6 +9,8 @@ import { setTypes, selectModes, selectRanges } from '@/utils/workflow/const'
import { useStore } from '@/store/workflow/index'
import { getAllParentNode,judgeOptionalNode } from '@/api/workflowapi/index'
import PositionDialog from '@/components/workflow/dialog/positionDialog.vue'
let props = defineProps({
nodeConfig:{
type: Object,
@ -17,15 +19,26 @@ let props = defineProps({
directormaxlevel: {
type: Number,
default: 4
}
},
isFormFlow:{
type:Boolean,
default:true
},
customerFormKey:{
type:String,
default:""
},
});
const isExecutor = ref(false)
const nodeTitle = ref<string>("审批人设置")
const nodeOptional = ref<any[]>() //线
const nodeAllVerify = ref<any[]>()
let approverConfig = ref<any>({})
let approverVisible = ref(false)
let approverRoleVisible = ref(false)
let appPosistonVisible = ref(false)
let checkedRoleList = ref<any[]>([])
let checkedPostList = ref<any[]>([])
let checkedList = ref<any[]>([])
let store = useStore()
let { setApproverConfig, setApprover } = store
@ -40,30 +53,46 @@ let visible = computed({
}
})
watch(visible,(val:any)=>{
// if(val)
})
watch(approverConfig1, (val:any)=>{
// console.log("directormaxlevel",props.directormaxlevel)
console.log("directormaxlevel",visible.value)
approverConfig.value = val.value
if(val.type == 3){
nodeTitle.value = "执行人设置"
}else{
nodeTitle.value = "审批人设置"
}
isExecutor.value = false
if(visible.value){
judgeOptionalNode(props.nodeConfig)
.then((data)=>{
.then((data:any)=>{
if(data.code == 0){
let sendData = {
id:val.value.fromNode,
allcont:data.data.allcont
}
getAllParentNode(sendData)
.then((data)=>{
.then((data:any)=>{
if(data.code == 0){
nodeOptional.value = data.data.allcont
if(data.data.allcont && data.data.allcont.length > 0){
data.data.allcont.forEach(item => {
if(item.type == 3){
isExecutor.value = true
return
}
});
}
}
})
}
})
}
})
@ -91,6 +120,14 @@ const addRoleApprover = ()=> {
approverRoleVisible.value = true;
checkedRoleList.value = approverConfig.value.nodeUserList
}
const addApproverPost = ()=> {
appPosistonVisible.value = true;
checkedPostList.value = approverConfig.value.nodeUserList
}
const surePostApprover = (data:any)=> {
appPosistonVisible.value = false;
approverConfig.value.nodeUserList = data;
}
const sureApprover = (data:any)=> {
approverConfig.value.nodeUserList = data;
approverVisible.value = false;
@ -110,16 +147,28 @@ const saveApprover = ()=> {
}
const closeDrawer = ()=> {
setApprover(false)
isExecutor.value = false
}
//
const isShowRatify = (id:number)=>{
if(id == 8){
return props.isFormFlow
}else{
return true
}
}
</script>
<template>
<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="drawer_content">
<div class="approver_content">
<el-radio-group v-model="approverConfig.settype" class="clear" @change="changeType">
<el-radio v-for="({value, label}) in setTypes" :key="value" :label="value" style="width:auto">{{label}}=>{{value}}</el-radio>
<template v-for="({value, label}) in setTypes" :key="value">
<el-radio v-if="isShowRatify(value)" :label="value" style="width:auto">{{label}}=>{{value}}</el-radio>
</template>
</el-radio-group>
</div>
<!--指定成员-->
@ -133,14 +182,42 @@ const closeDrawer = ()=> {
<!--主管-->
<div v-if="approverConfig.settype==2" class="approver_manager">
<p>
<span>发起人的</span>
<el-row :gutter="10">
<el-col :span="6">
<select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option>
</select>
</el-col>
<el-col :span="18">
<select v-model="approverConfig.directorLevel">
<option v-for="item in props.directormaxlevel" :key="item" :value="item">{{item==1?'直接':''+item+''}}主管</option>
</select>
</el-col>
</el-row>
</p>
<p class="tip">找不到主管时由上级主管代审批</p>
</div>
<!--行政岗位-->
<div v-if="approverConfig.settype==3" class="approver_manager">
<p>指定行政岗位</p>
<el-row>
<el-col :span="18">
<el-button type="primary" @click="addApproverPost">添加/修改行政岗位</el-button>
</el-col>
<el-col :span="6">
<select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option>
</select>
</el-col>
</el-row>
<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-show="approverConfig.settype==4" class="approver_self_select">
<el-radio-group v-model="approverConfig.selectMode" style="width: 100%;">
@ -167,10 +244,20 @@ const closeDrawer = ()=> {
<div v-if="approverConfig.settype==6" class="approver_manager">
<p>审批终点</p>
<p style="padding-bottom:20px">
<span>发起人的</span>
<select v-model="approverConfig.examineEndDirectorLevel">
<option v-for="item in props.directormaxlevel" :key="item" :value="item">{{item==1?'直接':''+item}}层级主管</option>
<el-row :gutter="10">
<el-col :span="6">
<select v-model="approverConfig.attribute" style="width:100%">
<option value="1">发起人</option>
<option v-if="isExecutor" value="2">执行人</option>
</select>
</el-col>
<el-col :span="10">
<select v-model="approverConfig.directorLevel">
<option v-for="item in props.directormaxlevel" :key="item" :value="item">{{item==1?'直接':''+item+''}}主管</option>
</select>
</el-col>
</el-row>
</p>
</div>
<!--指定审批节点为本节点设置审批人-->
@ -184,7 +271,7 @@ const closeDrawer = ()=> {
</div>
<!--补充审批信息-->
<div v-if="(approverConfig.settype==1&&approverConfig.nodeUserList.length>1)||approverConfig.settype==2||(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)" class="approver_some">
<p>多人审批时采用的审批方式</p>
<el-radio-group v-model="approverConfig.examineMode" class="clear">
<el-radio :label="1">依次审批</el-radio>
@ -229,7 +316,12 @@ const closeDrawer = ()=> {
:data="checkedRoleList"
@change="sureRoleApprover"
/>
<!--选择岗位-->
<PositionDialog
v-model:visible="appPosistonVisible"
:data="checkedPostList"
@change="surePostApprover"
/>
</div>

12
src/components/workflow/selectBoxs.vue

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

9
src/components/workflow/selectResult.vue

@ -11,7 +11,7 @@ let props = defineProps({
},
list: {
type: Array,
default: () => [{ type: 'role', data, cancel }]
default: () => [{ type: 'role', data:[], cancel:()=>{} }]
}
})
let emits = defineEmits(['del'])
@ -49,6 +49,13 @@ let emits = defineEmits(['del'])
</li>
</template>
<template v-if="type === 'position'">
<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>
</ul>
</div>

3
src/styles/workflowcss/workflow.scss

@ -1063,7 +1063,8 @@ html {
.fd-nav-content-new {
position: relative;
width: initial;
height: 100%;
// height: 100%;
height: calc(100% - 60px);
overflow-x: hidden;
overflow-y: auto;
padding-bottom: 30px

9
src/utils/workflow/index.ts

@ -71,6 +71,8 @@ All.prototype = {
}else if (nodeConfig.examineMode == 3) {
return nodeConfig.nodeUserList.length + "人非会签"
}
}else{
return "指定成员"
}
} else if (nodeConfig.settype == 2) {
let level = nodeConfig.directorLevel == 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管'
@ -79,6 +81,13 @@ All.prototype = {
} else if (nodeConfig.examineMode == 2) {
return level + "会签"
}
} else if (nodeConfig.settype == 3) {
console.log("nodeConfig==会签==>",nodeConfig)
if (nodeConfig.nodeUserList.length == 1) {
return nodeConfig.nodeUserList[0].name
}else{
return "指定行政岗位"
}
} else if (nodeConfig.settype == 4) {
console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList);
if (nodeConfig.selectRange == 1) {

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

@ -11,6 +11,8 @@ import CreateForm from '@/views/sysworkflow/codepage/createform.vue'
import SetupConfig from '@/views/sysworkflow/codepage/setupconfig.vue'
import DataTableStructure from '@/views/sysworkflow/codepage/datatablestructure.vue'
import FlowDrawingBoard from '@/views/sysworkflow/flow/flowDrawingBoard.vue'
const contbody = ref()
const queryParams = reactive<SearchForm>({
page: 1,
@ -143,9 +145,26 @@ const openDataTableStructure = (cont:customerFormCont) =>{
dataTableIsShow.value = true;
// console.log("",cont)
}
//
const drawer = ref(false)
const drawerWidht = ref()
const isFormFlow = ref(false)
const customerFormKey = ref<string>()
const customerFormName = ref<string>()
const setupWorkFlow = (cont:customerFormCont) => {
drawerWidht.value = contbody.value?.clientWidth
// console.log("clientHeight--->",drawerWidht.value)
drawer.value = true
isFormFlow.value = true;
customerFormName.value = cont.name
customerFormKey.value = cont.id.toString()
}
</script>
<template>
<div ref="contbody" class="app-container">
<div ref="contbody">
<div class="app-container">
<div class="search">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="关键字" prop="keywords">
@ -241,6 +260,14 @@ const openDataTableStructure = (cont:customerFormCont) =>{
>
<i-ep-delete />删除
</el-button>
<el-button
type="info"
link
size="small"
@click.stop="setupWorkFlow(scope.row)"
>
<i-ep-operation />流程
</el-button>
</template>
</el-table-column>
</el-table>
@ -253,11 +280,13 @@ const openDataTableStructure = (cont:customerFormCont) =>{
/>
</el-card>
</div>
</div>
<el-drawer v-model="drawerOpenOrClose" title="设置/编辑自定义表单" :with-header="false" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="drawerWith" class="drawerClass">
<CreateForm v-model:draweropenclose="drawerOpenOrClose" :formid="formId" :formconfigcont="formConfigCont" @handlequery="handleQuery" />
</el-drawer>
<SetupConfig v-model:show="show" :editid="editid" @handle_query="handleQuery" />
<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" />
</template>
<style lang='scss' scoped>
.drawerClass{

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

@ -4,11 +4,256 @@
@ 备注: 工作流画板
-->
<script lang='ts' setup>
import '@/styles/workflowcss/workflow.scss'
import { useStore } from '@/store/workflow/index'
import { tipListStrucr } from '@/api/workflowapi/types'
import { initializeWorkFlow,setWorkFlowData } from '@/api/workflowapi/index'
//
import errorDialog from "@/components/workflow/dialog/errorDialog.vue";
import promoterDrawer from "@/components/workflow/drwer/promoterDrawer.vue";
import approverDrawer from "@/components/workflow/drwer/approverDrawer.vue";
import copyerDrawer from "@/components/workflow/drwer/copyerDrawer.vue";
import conditionDrawer from "@/components/workflow/drwer/conditionDrawer.vue";
const props = defineProps({
openDrawer:{
type:Boolean,
default:true
},
drawerWidht:{
type:Number,
default:100
},
isFormFlow:{
type:Boolean,
default:true
},
customerFormKey:{
type:String,
default:""
},
customerFormName:{
type:String,
default:""
}
})
const emits = defineEmits(["update:openDrawer"]);
const isShow = computed({
get: () => props.openDrawer,
set: (val) => {
emits("update:openDrawer", val);
},
});
let { setTableId, setIsTried } = useStore()
let tipList = ref<any>([]);
let tipVisible = ref(false);
let nowVal = ref(100); //
let processConfig = ref<any>({});
let nodeConfig = ref({});
let workFlowDef = ref({});
let flowPermission = ref([]);
let directorMaxLeveling = ref<number>(0);
const shenPiTitle = ref<string>("")
//
onMounted(async ()=>{
})
//
const initWorkFlowData = async() => {
let { data } = await initializeWorkFlow({name:""})
// console.log("data-=------>",data)
let {
nodeConfig: nodes,
flowPermission: flows,
directorMaxLevel: directorMaxLevel,
workFlowDef: works,
tableId,
} = data;
nodeConfig.value = nodes;
flowPermission.value = flows;
directorMaxLeveling = directorMaxLevel;
workFlowDef.value = works;
setTableId(tableId);
// console.log("max--->",flowPermission.value)
}
//
const reErr = ({ childNode }:any) => {
if (childNode) {
let { type, error, nodeName, conditionNodes } = childNode;
if (type == 1 || type == 2 || type == 3) {
if (error) {
tipList.value.push({
name: nodeName,
type: ["", "审核人", "抄送人", "执行人"][type],
});
}
reErr(childNode);
} else if (type == 4) {
reErr(childNode);
} else if (type == 5) {
reErr(childNode);
for (var i = 0; i < conditionNodes.length; i++) {
if (conditionNodes[i].error) {
tipList.value.push({ name: conditionNodes[i].nodeName, type: "条件" });
}
reErr(conditionNodes[i]);
}
}
} else {
childNode = null;
}
};
//
const saveSet = async () => {
setIsTried(true);
tipList.value = [];
processConfig.value.flowPermission = flowPermission.value;
// eslint-disable-next-line no-console
// console.log("processConfig",JSON.stringify(nodeConfig.value));
// console.log("processConfig",nodeConfig.value);
reErr(nodeConfig.value);
if (tipList.value.length != 0) {
tipVisible.value = true;
return;
}
let res = await setWorkFlowData(processConfig.value);
if (res.code == 200) {
ElMessage.success("设置成功")
setTimeout(function () {
window.location.href = "";
}, 200);
}
};
//
const zoomSize = (type:number) => {
if (type == 1) {
if (nowVal.value == 50) {
return;
}
nowVal.value -= 10;
} else {
if (nowVal.value == 300) {
return;
}
nowVal.value += 10;
}
};
//
const clearCanvas = () =>{
ElMessageBox.confirm('确定要清空画布?')
.then(() => {
initWorkFlowData()
setIsTried(false);
tipList.value = []
})
}
watch(()=>props.openDrawer,(val)=>{
if(val){
initWorkFlowData()
shenPiTitle.value = props.customerFormName
}else{
setIsTried(false);
tipList.value = []
}
})
</script>
<template>
<div></div>
<el-drawer v-model="isShow" :size="props.drawerWidht" :show-close="false">
<template #header="{ close, titleId, titleClass }">
<div style="display: flex; width:50%">
<div class="right_kongx"><h4 :id="titleId" :class="titleClass">{{ shenPiTitle }}审批流程</h4></div>
</div>
<el-button type="warning" @click="clearCanvas">
<el-icon class="el-icon--left"><Delete /></el-icon>
清空
</el-button>
<el-button type="primary" @click="saveSet">
<el-icon class="el-icon--left"><Promotion /></el-icon>
发布
</el-button>
<el-button type="danger" @click="close">
<el-icon class="el-icon--left"><CircleCloseFilled /></el-icon>
关闭
</el-button>
</template>
<div class="canvas_body">
<el-row :gutter="20">
<el-col :span="20">
<el-tabs class="flow_version" >
<el-tab-pane>
<template #label>
<span class="custom-tabs-label">
<span>1</span>
</span>
</template>
</el-tab-pane>
<el-tab-pane>
<template #label>
<span class="custom-tabs-label">
<span>2</span>
</span>
</template>
<style lang='scss' scoped>
</el-tab-pane>
</el-tabs>
</el-col>
<el-col :span="3" style="text-align: center;">
<el-button type="primary" round>启用</el-button>
</el-col>
</el-row>
<div class="fd-nav-content-new">
<!--画板-->
<section class="dingflow-design">
<div class="zoom">
<div class="zoom-out" :class="nowVal == 50 && 'disabled'" @click="zoomSize(1)"></div>
<span>{{ nowVal }}%</span>
<div class="zoom-in" :class="nowVal == 300 && 'disabled'" @click="zoomSize(2)"></div>
</div>
<div class="box-scale" :style="`transform: scale(${ nowVal / 100});`">
<nodeWrap v-model:nodeConfig="nodeConfig" v-model:flowPermission="flowPermission" />
<div class="end-node">
<div class="end-node-circle"></div>
<div class="end-node-text">流程结束</div>
</div>
</div>
</section>
</div>
<errorDialog v-model:visible="tipVisible" :list="tipList" />
<promoterDrawer />
<approverDrawer :directormaxlevel="directorMaxLeveling" :node-config="nodeConfig" :is-form-flow="props.isFormFlow" :customer-form-key="props.customerFormKey" />
<copyerDrawer />
<conditionDrawer />
</div>
</el-drawer>
</template>
<style>
.canvas_body{
height: 100%;
width: inherit;
}
.flow_version{
}
.flow_version > .el-tabs__content{
padding: 0px;
height:0px;
}
.flow_version > .el-tabs__header{
margin:0px;
}
.flow_version .custom-tabs-label span {
padding:0 10px;
}
.right_kongx{
margin-right:50px
}
</style>

168
src/views/sysworkflow/flow/index.vue

@ -4,19 +4,8 @@
@ 备注:
-->
<script lang='ts' setup>
import '@/styles/workflowcss/workflow.scss'
import { useStore } from '@/store/workflow/index'
import { tipListStrucr } from '@/api/workflowapi/types'
import { initializeWorkFlow,setWorkFlowData } from '@/api/workflowapi/index'
//
import errorDialog from "@/components/workflow/dialog/errorDialog.vue";
import promoterDrawer from "@/components/workflow/drwer/promoterDrawer.vue";
import approverDrawer from "@/components/workflow/drwer/approverDrawer.vue";
import copyerDrawer from "@/components/workflow/drwer/copyerDrawer.vue";
import conditionDrawer from "@/components/workflow/drwer/conditionDrawer.vue";
import FlowDrawingBoard from '@/views/sysworkflow/flow/flowDrawingBoard.vue'
//
const flowcont = ref()
const drawer = ref(false)
const drawerWidht = ref()
@ -25,157 +14,16 @@ const openfloaw = ()=>{
// console.log("clientHeight--->",drawerWidht.value)
drawer.value = true
}
let { setTableId, setIsTried } = useStore()
let tipList = ref<any>([]);
let tipVisible = ref(false);
let nowVal = ref(100); //
let processConfig = ref<any>({});
let nodeConfig = ref({});
let workFlowDef = ref({});
let flowPermission = ref([]);
let directorMaxLeveling = ref<number>(0);
//
onMounted(async ()=>{
initWorkFlowData()
})
//
const initWorkFlowData = async() => {
let { data } = await initializeWorkFlow({name:""})
// console.log("data-=------>",data)
let {
nodeConfig: nodes,
flowPermission: flows,
directorMaxLevel: directorMaxLevel,
workFlowDef: works,
tableId,
} = data;
nodeConfig.value = nodes;
flowPermission.value = flows;
directorMaxLeveling = directorMaxLevel;
workFlowDef.value = works;
setTableId(tableId);
// console.log("max--->",flowPermission.value)
}
//
const reErr = ({ childNode }:any) => {
if (childNode) {
let { type, error, nodeName, conditionNodes } = childNode;
if (type == 1 || type == 2 || type == 3) {
if (error) {
tipList.value.push({
name: nodeName,
type: ["", "审核人", "抄送人", "执行人"][type],
});
}
reErr(childNode);
} else if (type == 4) {
reErr(childNode);
} else if (type == 5) {
reErr(childNode);
for (var i = 0; i < conditionNodes.length; i++) {
if (conditionNodes[i].error) {
tipList.value.push({ name: conditionNodes[i].nodeName, type: "条件" });
}
reErr(conditionNodes[i]);
}
}
} else {
childNode = null;
}
};
//
const saveSet = async () => {
setIsTried(true);
tipList.value = [];
processConfig.value.flowPermission = flowPermission.value;
// eslint-disable-next-line no-console
// console.log("processConfig",JSON.stringify(nodeConfig.value));
// console.log("processConfig",nodeConfig.value);
reErr(nodeConfig.value);
if (tipList.value.length != 0) {
tipVisible.value = true;
return;
}
let res = await setWorkFlowData(processConfig.value);
if (res.code == 200) {
ElMessage.success("设置成功")
setTimeout(function () {
window.location.href = "";
}, 200);
}
};
//
const zoomSize = (type:number) => {
if (type == 1) {
if (nowVal.value == 50) {
return;
}
nowVal.value -= 10;
} else {
if (nowVal.value == 300) {
return;
}
nowVal.value += 10;
}
};
//
const clearCanvas = () =>{
ElMessageBox.confirm('确定要清空画布?')
.then(() => {
initWorkFlowData()
setIsTried(false);
tipList.value = []
})
}
const isFormFlow = ref(false)
const customerFormKey = ref<string>()
</script>
<template>
<div ref="flowcont">
<el-button type="primary" @click="openfloaw">添加</el-button>
<el-drawer v-model="drawer" :size="drawerWidht" :show-close="false">
<template #header="{ close, titleId, titleClass }">
<h4 :id="titleId" :class="titleClass">创建流程</h4>
<el-button type="warning" @click="clearCanvas">
<el-icon class="el-icon--left"><Delete /></el-icon>
清空
</el-button>
<el-button type="primary" @click="saveSet">
<el-icon class="el-icon--left"><Promotion /></el-icon>
发布
</el-button>
<el-button type="danger" @click="close">
<el-icon class="el-icon--left"><CircleCloseFilled /></el-icon>
关闭
</el-button>
</template>
<div class="canvas_body">
<div class="fd-nav-content-new">
<!--画板-->
<section class="dingflow-design">
<div class="zoom">
<div class="zoom-out" :class="nowVal == 50 && 'disabled'" @click="zoomSize(1)"></div>
<span>{{ nowVal }}%</span>
<div class="zoom-in" :class="nowVal == 300 && 'disabled'" @click="zoomSize(2)"></div>
</div>
<div class="box-scale" :style="`transform: scale(${ nowVal / 100});`">
<nodeWrap v-model:nodeConfig="nodeConfig" v-model:flowPermission="flowPermission" />
<div class="end-node">
<div class="end-node-circle"></div>
<div class="end-node-text">流程结束</div>
</div>
</div>
</section>
</div>
<errorDialog v-model:visible="tipVisible" :list="tipList" />
<promoterDrawer />
<approverDrawer :directormaxlevel="directorMaxLeveling" :node-config="nodeConfig" />
<copyerDrawer />
<conditionDrawer />
</div>
</el-drawer>
<FlowDrawingBoard v-model:open-drawer="drawer" :drawer-widht = "drawerWidht" :is-form-flow="isFormFlow" :customer-form-key="customerFormKey" />
</div>
</template>
<style lang='scss' scoped>

160
vite.config.ts.timestamp-1697610303012-42c6e5d26ab95.mjs

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