Browse Source

流程与表单整合页面显示完成

v3
超级管理员 2 years ago
parent
commit
b1de314a50
  1. 18
      src/api/DesignForm/requestapi.ts
  2. 5
      src/api/DesignForm/type.ts
  3. 13
      src/api/taskapi/types.ts
  4. 1
      src/assets/icons/addshixian.svg
  5. 1
      src/assets/icons/addxuxian.svg
  6. 7
      src/components/DesignForm/public/expand/user.vue
  7. 35
      src/components/DesignForm/public/expand/userDialog.vue
  8. 14
      src/components/DesignForm/public/form/form.vue
  9. 1
      src/components/DesignForm/public/form/formGroup.vue
  10. 14
      src/components/DesignForm/public/form/formItem.vue
  11. 2
      src/components/workflow/drwer/approverDrawer.vue
  12. 41
      src/utils/workflow/const.ts
  13. 20
      src/utils/workflow/index.ts
  14. 347
      src/views/public/orguser/orgalluser.vue
  15. 195
      src/views/public/orguser/orguser.vue
  16. 4
      src/views/sysworkflow/codepage/page.vue
  17. 4
      src/views/taskplatform/taskmanagement/edittaskcustomerform.vue
  18. 160
      src/views/taskplatform/taskmanagement/flowStep.vue
  19. 220
      src/views/taskplatform/taskmanagement/taskcustomerform.vue
  20. 552
      src/views/taskplatform/taskmanagement/taskcustomerformnew.vue
  21. 2
      src/views/taskplatform/taskmanagement/tasklist.vue
  22. 0
      vite.config.ts.timestamp-1700547221061-a6108b35a7917.mjs

18
src/api/DesignForm/requestapi.ts

@ -20,7 +20,8 @@ import {
publicFormTableStruct,
hanziToPinyin,
gogoBackFormTabelStruct,
nodeFlow
nodeFlow,
searchUserListForm
} from './type';
//自定义表单列表
export function getCustomerFormList(queryParams: SearchForm): AxiosPromise<CustomerFormPageResult> {
@ -168,10 +169,19 @@ export function chineseToPinyin(data: hanziToPinyin){
data: data
});
}
//获取工作流步进节点
export function generateFlow(data: nodeFlow){
//自定义表单搜索人员
export function searchUserList(data: searchUserListForm){
return request({
url: '/systemapi/task_flow/searchUserList',
method: 'post',
data: data
});
}
//自定义表单搜索人员
export function gainFlowPeople(data?: string[]){
return request({
url: '/systemapi/task_flow/generateFlow',
url: '/systemapi/task_flow/gainFlowPeople',
method: 'post',
data: data
});

5
src/api/DesignForm/type.ts

@ -166,3 +166,8 @@ export interface nodeUserInfo{
icon?:string;
iconToBase64?:string;
}
//自定义表单搜索人员
export interface searchUserListForm extends PageQuery{
name?: string;
department?:number;
}

13
src/api/taskapi/types.ts

@ -57,18 +57,21 @@ export interface customerFormVersionCont{
}
//获取工作流步进节点
export interface nodeFlow extends customerFormLogo{
conditionList?:conditionInfo[]
conditionList?:conditionInfo[];
nodelPeople?:nodelPeoples[]
}
export interface nodelPeoples {
factorid?:string;
userList?:string
}
export interface conditionInfo{
factorid:string;
type:number;
factorid?:string;
type?:number;
isCheckbox?:boolean;
answers?:string[];
oneanswer?:string;
customFields?:customFieldsInfo[];
nodeUserList?:nodeUserInfo[];
}
//自定义条件
export interface customFieldsInfo{

1
src/assets/icons/addshixian.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1700526281008" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9447" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M795.136 935.424H164.352c-47.616 0-86.016-38.4-86.016-86.016V219.136c0-47.616 38.4-86.016 86.016-86.016h630.272c47.616 0 86.016 38.4 86.016 86.016v630.272c0.512 47.616-37.888 86.016-85.504 86.016zM164.352 177.664c-23.04 0-41.472 18.432-41.472 41.472v630.272c0 23.04 18.432 41.472 41.472 41.472h630.272c23.04 0 41.472-18.432 41.472-41.472V219.136c0-23.04-18.432-41.472-41.472-41.472H164.352z" fill="#bfbfbf" p-id="9448"></path><path d="M744.96 556.544H214.528c-12.288 0-22.528-9.728-22.528-22.528 0-12.288 9.728-22.528 22.528-22.528h530.432c12.288 0 22.528 9.728 22.528 22.528 0 12.8-10.24 22.528-22.528 22.528z" fill="#bfbfbf" p-id="9449"></path><path d="M479.744 821.76c-12.288 0-22.528-9.728-22.528-22.528V269.312c0-12.288 9.728-22.528 22.528-22.528s22.528 9.728 22.528 22.528v530.432c0 12.288-10.24 22.016-22.528 22.016z" fill="#bfbfbf" p-id="9450"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/addxuxian.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.0 KiB

7
src/components/DesignForm/public/expand/user.vue

@ -33,10 +33,12 @@ const value = computed({
return props.modelValue
},
set: (newVal: any) => {
console.log("value-set",newVal)
console.log("value-set",newVal,newVal.length)
// emits('update:modelValue', newVal)
let newValJson:criteriaForPeopleList[] = JSON.parse(newVal)
console.log("value-newValJson",newValJson)
if(newValJson.length > 0){
let userAry = new Array
let userKeyAry = new Array
@ -47,8 +49,11 @@ const value = computed({
emits('update:modelValue', userAry.join(','))
// userlist.value = userAry.join(',')
//
}else{
emits('update:modelValue', "")
}
},
});

35
src/components/DesignForm/public/expand/userDialog.vue

@ -100,23 +100,35 @@ const tableRowClick = (row: any) => {
}else{
checkDataList.push(row)
}
console.log("checkDataList",checkDataList,row)
// console.log("checkDataList",checkDataList,row)
}
const delRowClick = (row: criteriaForPeopleList) => {
console.log("checkDataList",row)
// checkData.value.forEach((item: any, index: number) => {
// if (item === row) {
// checkData.value.splice(index, 1)
// }
// })
let checkDataAry = checkDataList
if(checkDataAry.length > 0) {
checkDataList.splice(0,checkDataList.length)
checkDataAry.forEach(item => {
if(item.id != row.id){
checkDataList.push(item)
if(checkDataList &&checkDataList.length > 0) {
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(item.id == row.id){
checkDataList.splice(index,1)
}
})
}
// let checkDataAry = checkDataList
// if(checkDataAry.length > 0) {
// checkDataList.splice(0,checkDataList.length)
// console.log("checkDataList----1------>",checkDataAry,checkDataList)
// checkDataAry.forEach(item => {
// if(item.id != row.id){
// console.log("checkDataList---------->",item)
// checkDataList.push(item)
// }
// })
// }
}
const delAllClick = () => {
// checkData.value = []
@ -131,6 +143,7 @@ const open = () => {
.then(({data})=>{
console.log("弹窗处理",data)
// checkDataList = data
checkDataList.splice(0,checkDataList.length)
if(data.length > 0){
data.forEach((item:any) => {
checkDataList.push(item)
@ -164,6 +177,8 @@ onMounted(() => {
getUserList()
})
})
const defaultProps ={
children: 'children',
label: 'name',
@ -176,6 +191,8 @@ const defaultProps ={
:append-to-body="true"
:props="defaultProps "
width="80%"
top="2vh"
draggable
>
<el-row :gutter="20">
<el-col :span="6" style="padding:0">
@ -197,7 +214,7 @@ const defaultProps ={
<el-button @click="resetClick">重置</el-button>
</div>
<div class="list">
<el-table :data="tableData" style="width: 100%">
<el-table :data="tableData" style="width: 100%; height:710px">
<el-table-column prop="userName" label="照片" width="100px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
@ -241,7 +258,7 @@ const defaultProps ={
<div>已选择{{ checkDataList.length }}</div>
<el-button type="danger" @click="delAllClick" size="small">全部移除</el-button>
</div>
<el-table :data="checkDataList">
<el-table :data="checkDataList" style="height:710px">
<el-table-column prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />

14
src/components/DesignForm/public/form/form.vue

@ -35,6 +35,7 @@ const props = withDefaults(
beforeSubmit?: Function | string //
afterSubmit?: Function // return false
closeAppSubmit?: Function
changeKeyVal?: Function //
value?: { [key: string]: any } // setValue
options?: { [key: string]: any } // setOptions
dict?: object //
@ -155,7 +156,11 @@ const forEachGetFormModel = (list: FormList[], obj: any) => {
}
// tProp
provide(constControlChange, ({ key, value, data, tProp }: any) => {
provide(constControlChange, ({ key, value, data, tProp, type, attribute }: any) => {
console.log("监听表单--constControlChange-->",key, value, data, tProp,type,attribute)
if (typeof props.changeKeyVal === 'function') {
props.changeKeyVal(key, value,type,attribute)
}
if (key) {
if (!tProp) {
// change
@ -255,6 +260,7 @@ const getValue = (filter?: boolean) => {
}
return obj
} else {
console.log("getValue--->model-value->",model.value)
return model.value
}
}
@ -420,9 +426,9 @@ const submit = (params = {}) => {
if (valid) {
const formatParams = Object.assign({}, fields, params)
// console.log("params--->",params)
// console.log("fields--->",fields)
// console.log("formatParams-Object-->",formatParams)
console.log("params--->",params)
console.log("fields--->",fields)
console.log("formatParams-Object-->",formatParams)
let submitParams
const beforeSubmit = props.formData.events?.beforeSubmit

1
src/components/DesignForm/public/form/formGroup.vue

@ -45,6 +45,7 @@ watch(
() => props.data,
(v: FormList[]) => {
dataList.value = v
console.log("监听表单变化++++++++++>",v)
}
)
const activeKey = computed(() => {

14
src/components/DesignForm/public/form/formItem.vue

@ -64,12 +64,20 @@ const control = computed(() => {
const options = ref(props.data.options)
const changeEvent = inject(constControlChange, '') as any
const updateModel = (val: any) => {
let controlAttribute = ""
if(props.data.control){
if(props.data.control.type){
controlAttribute = props.data.control.type
}
}
changeEvent &&
changeEvent({
key: props.data.name,
value: val,
data: props.data,
tProp: props.tProp
tProp: props.tProp,
type: props.data.type,
attribute: controlAttribute
})
}
const value = computed({
@ -131,6 +139,10 @@ const currentComponent = computed(() => {
if (props.data.type === 'datePicker') {
props.data.control.valueFormat="x"
}
if (props.data.type === 'switch') {
props.data.control.activeValue=props.data.control.activeValue.toString()
props.data.control.inactiveValue=props.data.control.inactiveValue.toString()
}
// if (props.data.type === 'timePicker') {
// props.data.control.valueFormat="timestamp"
// }

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

@ -68,7 +68,7 @@ watch(visible,(val:any)=>{
watch(approverConfig1, (val:any)=>{
val.value.attribute = val.value.attribute*1
console.log("directormaxlevel",val.value)
// console.log("directormaxlevel",val.value)
matrixIsShow.value = false
approverConfig.value = val.value
if(val.type == 3){

41
src/utils/workflow/const.ts

@ -47,3 +47,44 @@ export let flowFactor = [
{id:1,name:"申请人",keyid:"applicant",type:1,isok:false,isCheckbox:true,options:[],customFields:[]},
{id:2,name:"自定义字段",keyid:"customFields",type:2,isok:false,isCheckbox:false,options:[],customFields:[]}
]
//暂时不做审批条件得控件类型
export let notAsA_BasisForJudgment = [
"datePicker",
"input",
"password",
"textarea",
"timePicker",
"colorPicker",
"switch",
"inputNumber",
"cascader",
"rate",
"slider",
"treeSelect",
"txt",
"title",
"upload",
"tinymce",
"button",
]
//作为审批节点操作人控件
export let asAnApprovalActionControl = ["expand-user"]
//定值类控件
export let fixedValueControl = [
"switch",
"inputNumber",
"rate",
"slider",
]
//时间类控件
//定值类控件
export let timeControl = [
"datePicker",
"timePicker"
]
//时间等式取值
export let timeEquation = [
"datetimerange",
"daterange",
"monthrange"
]

20
src/utils/workflow/index.ts

@ -92,13 +92,13 @@ All.prototype = {
return "指定行政岗位"
}
} else if (nodeConfig.settype == 4) {
// console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList);
console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList);
if (nodeConfig.selectRange == 1) {
return "发起人自选"
} else {
if (nodeConfig.nodeUserList.length > 0) {
if (nodeConfig.selectRange == 2) {
return "发起人自选"
return "发起人从指定成员中自选"
} else {
return '发起人从' + nodeConfig.nodeUserList[0].name + '中自选'
}
@ -175,7 +175,7 @@ All.prototype = {
for (var i = 0; i < conditionList.length; i++) {
// console.log("判断调教分支形同--6->",conditionList[i])
var {name,type,options,nodeUserList,answers,isCheckbox,customFields} = conditionList[i]
var {name,type,options,nodeUserList,answers,isCheckbox,customFields,oneanswer} = conditionList[i]
switch(type){
case 1:
if(nodeUserList.length > 0){
@ -184,6 +184,7 @@ All.prototype = {
}
break;
case 2:
if(customFields.length > 0){
customFields.forEach((item:any) =>{
if (item.optType != 6 && item.leftval) {
@ -198,6 +199,8 @@ All.prototype = {
}
break;
case 3:
if(isCheckbox){
if(answers.length > 0){
str += name + "为"
if(Array.isArray(answers)){
@ -221,6 +224,17 @@ All.prototype = {
}
}
}else{
str += name + "为"
options.forEach((item:any)=>{
// console.log("判断调教分支形同--6--1--->",oneanswer,item.value == oneanswer,item.value)
if(item.value == oneanswer){
str += item.label+` 并且 `
}
})
}
// console.log("判断调教分支形同--6--1-2-->",oneanswer,str,str.substring(0, str.length - 4))
break;
default:
}

347
src/views/public/orguser/orgalluser.vue

@ -0,0 +1,347 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-22 08:16:12
@ 备注: 全部行政组织
-->
<script lang='ts' setup>
import { getOrgFormTree,getOrgFormUserList,searchUserCustomerFormList } from '@/api/hr/org/index'
import { orgform,criteriaForPeopleList } from '@/api/hr/org/type'
import UserRole from '@/assets/icons/user.svg'
import { searchUserList,gainFlowPeople } from '@/api/DesignForm/requestapi'
const props = defineProps({
openclosebox:{
type:Boolean,
default:false
},
selectedPeople: {
type: Array,
default: () => []
}
})
const emits = defineEmits(["update:openclosebox","updateNode"]);
const isOpen = computed({
get: () => props.openclosebox,
set: (val) => {
emits("update:openclosebox", val);
},
});
const defaultProps ={
children: 'children',
label: 'name',
}
const orgLoading = ref(false)
const userLoading = ref(false)
//
const treeEl = ref(null)
const treeData = ref<orgform[]>([])
const department = ref<any>()
const userName = ref<any>()
const tableData = ref<criteriaForPeopleList[]>();
const page = reactive({
total: 0,
current: 1,
pageSize: 11
})
//
const handleNodeClick = (data: any) => {
department.value = data.id
getUserList()
}
//
const resetClick = () => {
userName.value = ''
department.value = ''
treeEl.value.setCurrentKey(null)
getUserList()
}
//
const getTreeData = () => {
orgLoading.value = true
getOrgFormTree()
.then(({ data }) => {
console.log(data)
treeData.value = data.list
}).finally(()=>{
orgLoading.value = false
})
}
//
const getUserList = () => {
userLoading.value = true
const params = {
page: page.current,
pagesize: page.pageSize,
name: userName.value,
department: department.value
}
searchUserList(params)
.then(({ data })=>{
tableData.value = data.list
page.total = data.total
userLoading.value = false
})
.finally(()=>{
userLoading.value = false
})
}
//
const currentChange = (current: number) => {
page.current = current
getUserList()
}
onMounted(() => {
nextTick(() => {
// loading
getTreeData()
getUserList()
backfillData()
})
})
//
const checkDataList = reactive<criteriaForPeopleList[]>([]);
const tableRowClick = (row: any) => {
if(checkDataList.length > 0){
let isIn = true
checkDataList.forEach(item =>{
if(item.id == row.id){
isIn = false
}
})
if(isIn){
checkDataList.push(row)
}
}else{
checkDataList.push(row)
}
// console.log("checkDataList",checkDataList,row)
}
//
const delRowClick = (row: criteriaForPeopleList) => {
// console.log("checkDataList",row)
if(checkDataList &&checkDataList.length > 0) {
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(item.id == row.id){
if(!item.noedit){
checkDataList.splice(index,1)
}
}
})
}
}
//
const delAllClick = () => {
// checkDataList.splice(0,checkDataList.length)
checkDataList.forEach((item:criteriaForPeopleList,index:number) => {
if(!item.noedit){
checkDataList.splice(index,1)
}
})
}
//
const clostBox = () =>{
emits("update:openclosebox", false);
}
//
const confirmChoices = () => {
console.log("confirmChoices",checkDataList)
emits('updateNode', checkDataList)
clostBox()
}
//
const backfillData = () => {
if(props.selectedPeople && props.selectedPeople.length > 0){
checkDataList.splice(0,checkDataList.length)
props.selectedPeople.forEach((item:any)=>{
checkDataList.push(item)
})
}
console.log("props.selectedPeople",props.selectedPeople,checkDataList)
}
</script>
<template>
<el-dialog
v-model="isOpen"
title="选择人员"
:append-to-body="true"
:props="defaultProps "
width="80%"
top="2vh"
draggable
>
<el-row :gutter="20">
<el-col :span="6" style="padding:0">
<div class="sidebar_tree">
<el-text class="orgTitle" size="large">行政组织</el-text>
<el-tree
v-loading="orgLoading"
element-loading-text="Loading..."
ref="treeEl"
:data="treeData"
node-key="id"
@node-click="handleNodeClick"
:props="defaultProps "
highlight-current
/>
</div>
</el-col>
<el-col :span="12">
<div class="search">
<el-input placeholder="请输入用户名" v-model="userName" />
<el-button type="primary" @click="getUserList">查询</el-button>
<el-button @click="resetClick">重置</el-button>
</div>
<div class="list">
<el-table v-loading="userLoading" element-loading-text="Loading..." :data="tableData" style="width: 100%; height:660px">
<el-table-column fixed prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column fixed prop="name" label="姓名" width="150px" align="left">
<template #default="scope">
{{ scope.row.name }}({{ scope.row.number }})
</template>
</el-table-column>
<el-table-column prop="tel" label="联系方式" width="120px" align="left" />
<el-table-column prop="nickName" label="归属行政组织" width="500px" align="left">
<template #default="{ row }">
{{ row.companyName }}<span v-if="row.departmentname!=''"> / {{ row.departmentname }}</span><span v-if="row.postname!=''"> / {{ row.postname }}</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60px">
<template #default="{ row }">
<el-button circle size="small" @click="tableRowClick(row)"><el-icon><ArrowRight /></el-icon></el-button>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination
background
layout="prev, pager, next, jumper"
small
hide-on-single-page
:current-page="page.current"
:total="page.total"
:page-size="page.pageSize"
@current-change="currentChange"
/>
</div>
</div>
</el-col>
<el-col :span="6">
<div class="has_select">
<div class="total">
<div>已选择{{ checkDataList.length }}</div>
<el-button type="danger" @click="delAllClick" size="small">全部移除</el-button>
</div>
<el-table :data="checkDataList" style="height:680px">
<el-table-column prop="userName" label="照片" width="60px" align="center">
<template #default="scope">
<el-avatar v-if="scope.row.icon != ''" shape="square" :size="30" :src="scope.row.icon" />
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" align="left">
<template #default="scope">
{{ scope.row.name }}({{ scope.row.number }})
</template>
</el-table-column>
<el-table-column label="操作" width="60px">
<template #default="{ row }">
<el-button v-if="!row.noedit" size="small" type="danger" @click="delRowClick(row)">移除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-col>
</el-row>
<template #footer>
<div>
<el-button @click="clostBox">取消</el-button>
<el-button type="primary" @click="confirmChoices"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
.orgTitle{
padding: 0 0 0 5px;
}
.sidebar_tree {
width: 100%;
border: 1px solid #ebeef5;
border-radius: 3px;
padding: 10px 0;
margin-right: 10px;
height: 750px;
overflow-y: auto;
}
.has_select {
width: 100%;
.total {
display: flex;
justify-content: space-between;
align-items: center;
height: 32px;
margin-bottom: 10px;
}
}
.search {
display: flex;
margin-bottom: 10px;
.el-input {
margin-right: 10px;
}
}
.page {
padding-top: 20px;
display: flex;
justify-content:space-between;
}
.expand-user-dialog {
display: flex;
align-items: flex-start;
.sidebar-tree {
width: 180px;
border: 1px solid #ebeef5;
border-radius: 3px;
padding: 10px 0;
margin-right: 10px;
max-height: 500px;
overflow-y: auto;
}
.table-list {
}
.search {
display: flex;
margin-bottom: 10px;
.el-input {
margin-right: 10px;
}
}
.page {
padding-top: 20px;
display: flex;
justify-content: flex-end;
}
.has-select {
width: 200px;
margin-left: 20px;
.total {
display: flex;
justify-content: space-between;
align-items: center;
height: 32px;
margin-bottom: 10px;
}
}
}
</style>

195
src/views/public/orguser/orguser.vue

@ -0,0 +1,195 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-21 13:01:56
@ 备注: 选择人员
-->
<script lang='ts' setup>
const state = reactive({
circleUrl:'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
squareUrl:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const props = defineProps({
openclose:{
type:Boolean,
default:false
},
presetPersonnel: {
type: Array,
default: () => []
},
selectedPeople: {
type: Array,
default: () => []
}
})
const emits = defineEmits(["update:openclose","updateNode"]);
const isShow = computed({
get: () => props.openclose,
set: (val) => {
emits("update:openclose", val);
},
});
//
const prePers = ref<any>([]);
//
const setUpPrePers = ref<any>([]);
watch(() =>props.openclose,(val:boolean)=>{
// console.log("props.openclose--1-->",val)
// console.log("props.openclose--2-->",props.selectedPeople)
// console.log("props.openclose--3-->",props.presetPersonnel)
if(props.openclose){
if(props.selectedPeople && props.selectedPeople.length > 0){
setUpPrePers.value = props.selectedPeople
}else{
setUpPrePers.value = new Array
if(props.presetPersonnel && props.presetPersonnel.length > 0){
console.log("props.openclose--4-->",props.presetPersonnel)
props.presetPersonnel.forEach((item)=>{
item.isTrue = false
})
}
}
}
})
const setUpUser = (val:any) => {
// console.log("setUpUser---->",val,prePers.value)
let isNewAdd = true;
if(setUpPrePers.value && setUpPrePers.value.length > 0){
setUpPrePers.value.forEach((item:any,index:number) => {
if(val.id == item.id){
isNewAdd = false;
if(!item.noedit){
val.isTrue = false
setUpPrePers.value.splice(index,1)
}else{
val.isTrue = true
}
}
})
}
if(isNewAdd){
val.isTrue = true
setUpPrePers.value.push(val)
}
}
//
const initDataUser = () => {
// console.log("---->",prePers.value,setUpPrePers.value)
}
onMounted(() => {
if(props.openclose){
if(props.selectedPeople && props.selectedPeople.length > 0){
setUpPrePers.value = props.selectedPeople
}else{
setUpPrePers.value = new Array
if(props.presetPersonnel && props.presetPersonnel.length > 0){
// console.log("props.openclose--4-->",props.presetPersonnel)
props.presetPersonnel.forEach((item)=>{
item.isTrue = false
})
}
}
}
})
const closeBox = () => {
emits("update:openclose", false);
}
//
const saveFlowUser = () => {
emits("updateNode", setUpPrePers);
closeBox();
}
</script>
<template>
<el-dialog
v-model="isShow"
title="选择人员"
width="800"
draggable
:before-close="handleClose"
>
<el-row :gutter="20">
<el-col :span="12" >
<div class="bianKuan">
<ul>
<li v-for="item in props.presetPersonnel" :key="item.id" :class="item.isTrue?'xuanZeUser active':'xuanZeUser'" @click="setUpUser(item)">
<table>
<tr>
<td valign="top" align="center" width="50">
<el-avatar v-if="item.iconbase64==''&&item.icon!=''" shape="square" fit="cover" :src="item.icon" />
<el-avatar v-else-if="item.iconbase64!=''" shape="square" fit="cover" :src="item.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td>
<el-text>{{ item.name }}{{ item.number }}</el-text><br>
<el-text v-if="item.departmentname">{{ item.departmentname }}</el-text>
<el-text v-if="item.postname"><span v-if="item.departmentname"> - </span>{{ item.postname }}</el-text>
</td>
</tr>
</table>
</li>
</ul>
</div>
</el-col>
<el-col :span="12">
<div class="bianKuan">
<ul>
<li v-for="item in setUpPrePers" :key="item.id" class="xuanZeUser" @click="setUpUser(item)">
<table>
<tr>
<td valign="top" align="center" width="50">
<el-avatar v-if="item.iconbase64==''&&item.icon!=''" shape="square" fit="cover" :src="item.icon" />
<el-avatar v-else-if="item.iconbase64!=''" shape="square" fit="cover" :src="item.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td style="width:100%">
<el-text>{{ item.name }}{{ item.number }}</el-text><br>
<el-text v-if="item.departmentname">{{ item.departmentname }}</el-text>
<el-text v-if="item.postname"><span v-if="item.departmentname"> - </span>{{ item.postname }}</el-text>
</td>
<td align="center" width="10">
<i class="fa fa-close"></i>
</td>
</tr>
</table>
</li>
</ul>
</div>
</el-col>
</el-row>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeBox">关闭</el-button>
<el-button type="primary" @click="saveFlowUser">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
.bianKuan{
width: 100%;
height: 500px;
border: 1px solid #CCCCCC;
overflow: hidden;
overflow-y: auto;
}
.xuanZeUser{
cursor: pointer;
// background-color: #F56C6C;
padding-top: 5px;
margin-bottom: 5px;
}
.xuanZeUser.active{
background-color: #F56C6C;
}
</style>

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

@ -91,6 +91,9 @@ const afterSubmit = (type: string) => {
onMounted(() => {
getFormData()
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
</script>
<template>
<el-card v-loading="state.loading" shadow="never" style="min-height: 300px">
@ -104,6 +107,7 @@ onMounted(() => {
edit-url="editFormContent"
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:change-key-val="changeKeyVal"
/>
</el-card>
</template>

4
src/views/taskplatform/taskmanagement/edittaskcustomerform.vue

@ -219,6 +219,9 @@ watch(()=>props.iseditopen,()=>{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
}
</script>
<template>
<el-drawer v-model="isShow" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerwith" class="drawerClass" >
@ -234,6 +237,7 @@ watch(()=>props.iseditopen,()=>{
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>

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

@ -4,12 +4,43 @@
@ 备注: 工作流步进图
-->
<script lang='ts' setup>
import SvgIcon from "@/components/SvgIcon/index.vue";
import OrgUserPage from "@/views/public/orguser/orguser.vue"
import OrgAllUserPage from "@/views/public/orguser/orgalluser.vue"
const state = reactive({
circleUrl:
'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
squareUrl:
'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
sizeList: ['small', '', 'large'] as const,
})
const { circleUrl, squareUrl, sizeList } = toRefs(state)
const openOrClose = ref(false)
const openclosebox = ref(false)
const props = defineProps({
flowMap: {
type: Array,
default: () => []
},
nodeKey:{
type:String,
default:""
},
currentProgress:{
type:Number,
default:0
}
,
nextStep:{
type:Number,
default:0
}
})
const presetPersonnel = ref<any>([]); //
const selectedPeople = ref<any>([]); //
const flowMaps = ref<any[]>();
const emits = defineEmits(["update:flowMap"]);
const flowList = computed({
get: () => props.flowMap,
@ -18,19 +49,136 @@ const flowList = computed({
},
});
watch(()=>props.flowMap,(val:any)=>{
emits("update:flowMap", val);
})
onMounted(()=>{
})
//
const judgeAddUser = (val:any):boolean =>{
console.log("val----->",val)
flowList=val
switch(val.runtype){
case 1:
val.runscope = val.runscope!=0?val.runscope:1
return true
break;
case 3:
if(val.customNode == props.nodeKey){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
break;
case 4:
if(val.runscope==1){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
break;
default:
if(!val.operator){
val.runscope = val.runscope!=0?val.runscope:1
return true
}else if(val.operator.length < 1){
val.runscope = val.runscope!=0?val.runscope:1
return true
}
return false
}
return false
}
let zhiXingStep = 1;
//
const addPeople = (val:any) =>{
zhiXingStep = val.step
presetPersonnel.value = val.pendpers
selectedPeople.value = val.operator
if(val.runscope == 1){
openclosebox.value = true
}else{
openOrClose.value = true
}
console.log("PresetPersonnel.value--------1-------->",val)
// console.log("PresetPersonnel.value--------2-------->",val.pendpers)
// console.log("PresetPersonnel.value--------3-------->",val.operator)
// console.log("PresetPersonnel.value--------4-------->",selectedPeople.value)
}
//
const updateNode = (val:any) =>{
console.log("P更新节点操作人",zhiXingStep,val)
flowList.value.forEach((item:any) =>{
if(item.step == zhiXingStep){
console.log("P更新节点操作人---1-->",item.step , zhiXingStep)
item.operator = val
}
})
console.log("P更新节点操作人--2--->",flowList)
}
</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>
<el-steps direction="vertical" :active="props.currentProgress">
<el-step v-for="item in flowList" :key="item.step">
<template #title>
{{ item.nodeName }}
</template>
<template #description>
<table>
<tr v-for="items in item.operator" :key="items.id">
<td valign="top" align="center" width="50">
<el-avatar v-if="items.iconbase64==''&&items.icon!=''" shape="square" fit="cover" :src="items.icon" />
<el-avatar v-else-if="items.iconbase64!=''" shape="square" fit="cover" :src="items.iconbase64" />
<el-avatar v-else shape="square" fit="cover" :src="squareUrl" />
</td>
<td valign="top" align="left">
<el-row>
<el-col :span="24">
<el-text>{{ items.departmentname }}</el-text>
<el-text><span v-if="items.departmentname"> - </span>{{ items.postname }}</el-text>
<el-text><span v-if="items.departmentname||items.postname"> - </span>{{ items.name }}</el-text>
</el-col>
<el-col :span="24">
<ul>
<li v-for="(logItem,logIndex) in items.log" :key="logIndex" class="logLi">
<el-text v-if="logItem.state==2" type="success">
<span v-if="logItem.cause">logItem.cause</span><span v-else>已同意</span>
</el-text>
<el-text v-else-if="logItem.state==3" type="danger">
<span v-if="logItem.cause">logItem.cause</span><span v-else>已驳回</span>
</el-text>
<el-text v-else>
<span v-if="logItem.cause">logItem.cause</span><span v-else>未操作</span>
</el-text> · {{ logItem.time }}
</li>
</ul>
</el-col>
</el-row>
</td>
</tr>
<tr>
<td>
<div v-if="judgeAddUser(item)" class="addUser" @click="addPeople(item)">
<svg-icon icon-class="addxuxian" size="50" />
</div>
</td>
<td></td>
</tr>
</table>
</template>
</el-step>
</el-steps>
<OrgUserPage v-if="openOrClose" v-model:openclose="openOrClose" :preset-personnel="presetPersonnel" :selected-people="selectedPeople" @update-node="updateNode" />
<OrgAllUserPage v-if="openclosebox" v-model:openclosebox="openclosebox" :selected-people="selectedPeople" @update-node="updateNode" />
</div>
</template>
<style lang='scss' scoped>
.logLi{
color:#999999;
}
.addUser{
display:block;
cursor:pointer;
}
</style>

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

@ -6,11 +6,14 @@
<script lang='ts' setup>
import { ref, reactive, onMounted, computed, nextTick } from 'vue'
import { useRouter } from 'vue-router'
import { notAsA_BasisForJudgment,asAnApprovalActionControl,fixedValueControl,timeControl,timeEquation } from '@/utils/workflow/const'
import {
string2json,
stringToObj
} from '@/utils/DesignForm/form'
import { nodeFlow } from '@/api/taskapi/types'
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow } from '@/api/taskapi/management'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
@ -88,8 +91,13 @@ const state = reactive<any>({
const gainFlowChart = reactive<nodeFlow>({
id:0
})
const flowFactor = reactive<conditionInfo[]>([]) //
const nodelUserList = reactive<nodelPeoples[]>([])
//
const flowMap = ref<any[]>();
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const nodeKey = ref<string>('');
const formType = computed(() => {
// id
if (props.infoid) {
@ -131,12 +139,12 @@ const getTaskFormData = () =>{
})
//
gainFlowChart.id=data.flowkeystr
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图",data)
flowMap.value = data.data
console.log("获取工作流不进图--->",flowMap.value)
})
// generateFlow(gainFlowChart)
// .then((data:any) =>{
// console.log("",data.data)
// flowMap.value = data.data.flowList
// console.log("--->",flowMap.value)
// })
})
.finally(()=>{
loadingData.value = false;
@ -179,6 +187,8 @@ const initData = () => {
state.formId = 0;
state.id = 0;
state.loading = true;
let aryLen = flowFactor.length
if(aryLen > 0) flowFactor.splice(0,aryLen);
}
watch(()=>props.isopen,()=>{
if(props.isopen){
@ -187,6 +197,196 @@ watch(()=>props.isopen,()=>{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
// console.log("--type-1-true->",notAsA_BasisForJudgment.indexOf(type))
// if(notAsA_BasisForJudgment.indexOf(type) != -1){
// console.log("--type--true->",notAsA_BasisForJudgment.indexOf(type))
// }
let unitsVal = val
let isUpdateFlowChart = false
//
if(notAsA_BasisForJudgment.indexOf(type) === -1){
let isWrite = true
flowFactor.forEach((item:any)=>{
if(item.factorid == key){
isWrite = false
isUpdateFlowChart = true
item.type=3
if(type == "checkbox"){
item.isCheckbox = true
item.answers = val.map(String)
}else{
item.isCheckbox = false
item.oneanswer = val.toString()
}
}
})
if(isWrite){
if(type == "checkbox"){
flowFactor.push({
factorid:key,
type:3,
isCheckbox:true,
answers:val.map(String)
})
}else{
flowFactor.push({
factorid:key,
type:3,
isCheckbox:false,
oneanswer:val.toString()
})
}
isUpdateFlowChart = true
}
// console.log("--flowFactor--->",flowFactor)
}
// console.log("--flowFactor--1->",unitsVal,timeControl,type)
//
if(timeControl.indexOf(type) > -1 || fixedValueControl.indexOf(type) > -1 || type == "input"){
// console.log("--flowFactor--3->",unitsVal)
let addNewTime = true //
flowFactor.forEach((item:any)=>{
// console.log("--flowFactor--5->",item.type)
if(item.type == 2){
addNewTime = false
// console.log("--flowFactor--5====1->",item.type)
// console.log("--flowFactor--5====3->",item.customFields,item.customFields.length)
if(item.customFields && item.customFields.length > 0){
// console.log("--flowFactor--5====2->",item.customFields)
let sunNewAdd = true
item.customFields.forEach((sunItem:any)=>{
// console.log("--flowFactor-4->",sunItem.wordfield , key,sunItem.wordfield == key)
if(sunItem.wordfield == key){
sunNewAdd = false
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
sunItem.leftval = val.toString()
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
sunItem.leftval = val[0].toString()
sunItem.rightval = val[val.length - 1].toString()
}
}
}
}
})
if(sunNewAdd){
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){//
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
item.customFields.push(customFieldInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
item.customFields.push(customFieldInfo)
}
}
}
}
}
}
})
if(addNewTime){ //
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}
}
}
}
}
//
if(asAnApprovalActionControl.indexOf(type) > -1){
isUpdateFlowChart = true
let isWriteUs = true
nodelUserList.forEach((item:any)=>{
if(item.factorid == key){
isWriteUs = false
item.userList = val
}
})
if(isWriteUs){
nodelUserList.push({
factorid:key,
userList:val
})
}
}
console.log("改变表单值--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
console.log("获取工作流不进图--gainFlowChart--->",gainFlowChart)
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图-new-->",data)
flowMap.value = data.data.flowList
nextStep.value = data.data.nextStep;
currentProgress.value = data.data.Step;
nodeKey.value = data.data.nodeKey;
console.log("获取工作流不进图-1-->",flowMap.value)
})
}
}
watch(()=>flowMap,(val:any)=>{
console.log("工作流在变化-->",flowMap.value)
})
</script>
<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" >
@ -205,15 +405,17 @@ watch(()=>props.isopen,()=>{
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</el-tab-pane>
<el-tab-pane label="流程">
<FlowStep v-molde:flow-map="flowMap" />
<FlowStep v-model:flow-map="flowMap" :next-step="nextStep" :current-progress="currentProgress" :node-key="nodeKey" />
</el-tab-pane>
</el-tabs>
<!--无流程表单-->
<div v-else class="drawerBody">
<ak-form
ref="formEl"
@ -226,9 +428,9 @@ watch(()=>props.isopen,()=>{
:before-submit="beforeSubmit"
:after-submit="afterSubmit"
:close-app-submit="closeAppSubmit"
:change-key-val="changeKeyVal"
/>
</div>
</el-drawer>
</template>

552
src/views/taskplatform/taskmanagement/taskcustomerformnew.vue

@ -0,0 +1,552 @@
<!--
@ 作者: 秦东
@ 时间: 2023-09-22 15:26:36
@ 备注: 回显表单
-->
<script lang='ts' setup>
import { ref, reactive, onMounted, computed, nextTick } from 'vue'
import { useRouter } from 'vue-router'
import { notAsA_BasisForJudgment,asAnApprovalActionControl,fixedValueControl,timeControl,timeEquation } from '@/utils/workflow/const'
import {
string2json,
stringToObj
} from '@/utils/DesignForm/form'
import { nodeFlow,conditionInfo,nodelPeoples } from '@/api/taskapi/types'
import { haveCustomerFormVersion,generateFlow } from '@/api/taskapi/management'
import { judgeSubmitCancel } from '@/api/DesignForm/requestapi'
import '@/assets/scss/element-var.scss'
import '@/assets/scss/index.scss'
import '@/assets/iconfont/iconfont.css'
import 'element-plus/dist/index.css'
import FlowStep from '@/views/taskplatform/taskmanagement/flowStep.vue'
const props = defineProps({
isopen:{
type:Boolean,
default:true
},
versionid:{
type:String,
default:""
},
versiontitle:{
type:String,
default:""
},
infoid:{
type:String,
default:""
},
drawerwith:{
type:Number,
default:0
}
})
const submitButton = {
type: "div",
control:
{},
config:
{
textAlign: "center",
span: ""
},
list: [
{
type: "button",
control:
{
label: "保存",
type: "primary",
key: "submit"
},
config:
{
textAlign: "center"
}
}]
}
const flowOpinion = ref(false); //
const isFlowForm = ref(false)
const loadingData = ref(false)
const formEl = ref()
const router = useRouter()
const state = reactive<any>({
type: 1, // 123 4 5
formData: {
list: [],
form: {},
config: {}
},
dict: {},
formId: props.versionid,
id: 0,
loading: true
})
//
const gainFlowChart = reactive<nodeFlow>({
id:0
})
const flowFactor = reactive<conditionInfo[]>([]) //
const nodelUserList = reactive<nodelPeoples[]>([])
//
const flowMap = ref<any[]>();
const nextStep = ref<number>(0);
const currentProgress = ref<number>(1);
const nodeKey = ref<string>('');
const formType = computed(() => {
// id
if (props.infoid) {
return 2
} else {
return 1
}
})
const emits = defineEmits(["update:isopen","searchquery"]);
const drawerOpenOrClose = computed({
get: () => props.isopen,
set: (val) => {
emits("update:isopen", val);
},
});
//
const getTaskFormData = () =>{
loadingData.value = true;
haveCustomerFormVersion({id:props.versionid})
.then(({ data }) =>{
console.log("表单数据",data)
if(data.classify == 2){
isFlowForm.value = true;
}else{
isFlowForm.value = false;
}
state.id=props.versionid
state.formData = stringToObj(data.mastesform)
state.dict = string2json(data.dict)
judgeSubmitCancel({"name":data.mastesformjson})
.then((data:any) =>{
if(data.code == 0){
if (data.data == 3 || data.data == 4){
state.formData.list.push(submitButton)
}
}
})
//
gainFlowChart.id=data.flowkeystr
// generateFlow(gainFlowChart)
// .then((data:any) =>{
// console.log("",data.data)
// flowMap.value = data.data.flowList
// console.log("--->",flowMap.value)
// })
})
.finally(()=>{
loadingData.value = false;
})
}
const drawerWith = ref<number>(0);
onMounted(()=>{
drawerWith.value = window.innerWidth - 220
});
window.addEventListener("resize", function(){
drawerWith.value = window.innerWidth -220
})
const beforeSubmit = (params: any) => {
params.formId = props.versionid
params.id = ""
// emits("update:isopen", false);
return params
}
const afterSubmit = (type: string) => {
if (type === 'success') {
// router.go(-1)
console.log("表单提交成功")
emits("searchquery");
closeAppSubmit();
}
}
const closeAppSubmit = () => {
emits("update:isopen", false);
initData();
}
const initData = () => {
state.formData = {
list: [],
form: {},
config: {}
};
state.dict = {};
state.formId = 0;
state.id = 0;
state.loading = true;
let aryLen = flowFactor.length
if(aryLen > 0) flowFactor.splice(0,aryLen);
}
watch(()=>props.isopen,()=>{
if(props.isopen){
getTaskFormData();
}else{
initData()
}
})
const changeKeyVal = (key:any,val:any,type:any,attribute:any) => {
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
// console.log("--type-1-true->",notAsA_BasisForJudgment.indexOf(type))
// if(notAsA_BasisForJudgment.indexOf(type) != -1){
// console.log("--type--true->",notAsA_BasisForJudgment.indexOf(type))
// }
let unitsVal = val
let isUpdateFlowChart = false
//
if(notAsA_BasisForJudgment.indexOf(type) === -1){
let isWrite = true
flowFactor.forEach((item:any)=>{
if(item.factorid == key){
isWrite = false
isUpdateFlowChart = true
item.type=3
if(type == "checkbox"){
item.isCheckbox = true
item.answers = val.map(String)
}else{
item.isCheckbox = false
item.oneanswer = val.toString()
}
}
})
if(isWrite){
if(type == "checkbox"){
flowFactor.push({
factorid:key,
type:3,
isCheckbox:true,
answers:val.map(String)
})
}else{
flowFactor.push({
factorid:key,
type:3,
isCheckbox:false,
oneanswer:val.toString()
})
}
isUpdateFlowChart = true
}
// console.log("--flowFactor--->",flowFactor)
}
// console.log("--flowFactor--1->",unitsVal,timeControl,type)
//
if(timeControl.indexOf(type) > -1 || fixedValueControl.indexOf(type) > -1 || type == "input"){
// console.log("--flowFactor--3->",unitsVal)
let addNewTime = true //
flowFactor.forEach((item:any)=>{
// console.log("--flowFactor--5->",item.type)
if(item.type == 2){
addNewTime = false
// console.log("--flowFactor--5====1->",item.type)
// console.log("--flowFactor--5====3->",item.customFields,item.customFields.length)
if(item.customFields && item.customFields.length > 0){
// console.log("--flowFactor--5====2->",item.customFields)
let sunNewAdd = true
item.customFields.forEach((sunItem:any)=>{
// console.log("--flowFactor-4->",sunItem.wordfield , key,sunItem.wordfield == key)
if(sunItem.wordfield == key){
sunNewAdd = false
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
sunItem.leftval = val.toString()
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
sunItem.leftval = val[0].toString()
sunItem.rightval = val[val.length - 1].toString()
}
}
}
}
})
if(sunNewAdd){
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){//
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
item.customFields.push(customFieldInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
item.customFields.push(customFieldInfo)
}
}
}
}
}
}
})
if(addNewTime){ //
isUpdateFlowChart = true
if(timeEquation.indexOf(attribute) === -1){ //
let customFieldInfo = {
wordfield: key,
optType: "1",
leftval: val.toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}else{ //
if(Array.isArray(val)){
if(val.length >= 2){
let customFieldInfo = {
wordfield: key,
optType: "6",
leftval: val[0].toString(),
leftoptType:"3",
rightoptType:"3",
rightval:val[val.length - 1].toString()
}
let condInfo = {
factorid:"customFields",
type:2,
isCheckbox:false,
customFields:[customFieldInfo]
}
flowFactor.push(condInfo)
}
}
}
}
}
//
if(asAnApprovalActionControl.indexOf(type) > -1){
isUpdateFlowChart = true
let isWriteUs = true
nodelUserList.forEach((item:any)=>{
if(item.factorid == key){
isWriteUs = false
item.userList = val
}
})
if(isWriteUs){
nodelUserList.push({
factorid:key,
userList:val
})
}
}
console.log("改变表单值--flowFactor--->",flowFactor)
//
if(isUpdateFlowChart){
//
gainFlowChart.conditionList=flowFactor
gainFlowChart.nodelPeople=nodelUserList
console.log("获取工作流不进图--gainFlowChart--->",gainFlowChart)
generateFlow(gainFlowChart)
.then((data:any) =>{
console.log("获取工作流不进图-new-->",data)
flowMap.value = data.data.flowList
nextStep.value = data.data.nextStep;
currentProgress.value = data.data.Step;
nodeKey.value = data.data.nodeKey;
console.log("获取工作流不进图-1-->",flowMap.value)
})
}
}
watch(()=>flowMap,(val:any)=>{
console.log("工作流在变化-->",flowMap.value)
})
const sendFlowInfo = ref<any>()
</script>
<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" >
<table border="0" v-if="isFlowForm" class="tableFlowBox">
<tr>
<td valign="top">
<div class="drawerFormBox boxLeft">
<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"
:change-key-val="changeKeyVal"
/>
</div>
</td>
<td valign="top" width="350">
<div class="drawerFormBox boxRight">
<div class="flowBox">
<el-affix :offset="20">
<el-text size="large">审批流程</el-text>
</el-affix>
<FlowStep v-model:flow-map="flowMap" :next-step="nextStep" :current-progress="currentProgress" :node-key="nodeKey" />
</div>
<el-affix v-if="flowOpinion" position="bottom" :offset="0">
<div class="approvalBoard">
<el-text size="large" class="appBoardTitle">审批意见</el-text>
<el-row :gutter="20">
<el-col :span="24">
<el-input
v-model="sendFlowInfo"
:autosize="{ minRows: 2, maxRows: 6 }"
type="textarea"
placeholder="请输入审批意见"
/>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="4"></el-col>
<el-col :span="8" class="juzhong"><el-button type="primary" style="width:100%">同意</el-button></el-col>
<el-col :span="8" class="juzhong"><el-button type="danger" style="width:100%">驳回</el-button></el-col>
<el-col :span="4"></el-col>
</el-row>
</div>
</el-affix>
</div>
</td>
</tr>
</table>
<!--无流程表单-->
<div v-else class="drawerBody">
<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"
:change-key-val="changeKeyVal"
/>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.tableFlowBox{
width: 100%;
height: 100%;
// background-color: #000000;
.drawerFormBox{
width: 100%;
height: 100%;
// background-color: #ff0000;
}
}
.boxLeft{
padding: 0 10px 0 15px;
overflow: hidden;
overflow-y: auto;
}
.flowBox{
padding: 0 5px 0 10px;
}
.boxRight{
overflow: hidden;
overflow-y: auto;
border-left: 1px solid #EEEEEE;
}
.approvalBoard{
padding: 5px 10px;
background-color: #FFFFFF;
border-top: 1px solid #EEEEEE;
.juzhong{
padding: 10px 0;
text-align: center;
}
.appBoardTitle{
padding: 5px 0 10px 0;
display: block;
}
}
</style>
<style lang='scss'>
.drawerClass ::v-deep.el-drawer__header {
font-size: 22px;
text-align: center;
margin-bottom: 0px;
padding: 0;
.el-drawer__close-btn{
background-color: rgb(255, 77, 79);
color: white;
}
}
::v-deep .el-drawer__body {
padding: 0px;
}
.details {
width: 80%;
margin-right: 0px;
margin-left: 20%;
box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
}
.drawerBody{
padding: 20px;
}
</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>
<style scoped>
.affix-container {
text-align: center;
height: 400px;
border-radius: 4px;
background: var(--el-color-primary-light-9);
}
</style>

2
src/views/taskplatform/taskmanagement/tasklist.vue

@ -9,7 +9,7 @@ import { appFormdataLog,delCustomerFormData } from '@/api/taskapi/management'
//
import TaskEntry from '@/views/taskplatform/taskmanagement/taskentry.vue'
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerform.vue'
import TaskCustomerForm from '@/views/taskplatform/taskmanagement/taskcustomerformnew.vue'
import EditTaskCustomerForm from '@/views/taskplatform/taskmanagement/edittaskcustomerform.vue'
const loading = ref(false)

0
vite.config.ts.timestamp-1700438049737-94a706be71b5b.mjs → vite.config.ts.timestamp-1700547221061-a6108b35a7917.mjs

Loading…
Cancel
Save