2025-08-16 16:54:03 +08:00
|
|
|
|
<template>
|
2025-08-27 17:26:29 +08:00
|
|
|
|
<el-dialog class="dialog-container" :model-value="modelValue" :title="titles" :before-close="close">
|
|
|
|
|
|
<div v-loading="loading">
|
|
|
|
|
|
<div class="dialog-header" v-if="showModel">
|
|
|
|
|
|
<div class="flex align-center">下一节点:
|
|
|
|
|
|
<el-checkbox-group v-model="checkList" @change="handleCheckAllChange">
|
|
|
|
|
|
<el-checkbox v-model="showNode" :label="item.nodeId" size="large" v-for="(item, index) in modelData"
|
|
|
|
|
|
:key="index">{{ item.nodeName }}</el-checkbox>
|
|
|
|
|
|
</el-checkbox-group>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div> <el-button type="success" :icon="Plus" @click="newAdditions" v-if="optional"/></div>
|
2025-08-16 16:54:03 +08:00
|
|
|
|
</div>
|
2025-08-27 17:26:29 +08:00
|
|
|
|
<div v-if="optional" class="container-box">
|
|
|
|
|
|
<!-- <div v-if="flwsNode.flwsUserNode?.role.length == 0"> -->
|
|
|
|
|
|
<div class="row" v-for="(item, index) in nodeData" :key="index">
|
|
|
|
|
|
<MOSTY.Department filterable v-model="item.deptId" width="100%"
|
|
|
|
|
|
@getDepValue="(obj) => changePostList(index, obj)" clearable placeholder="请选择所属部门" />
|
|
|
|
|
|
<el-select class="select-user" v-model="item.userId" filterable placeholder="选择审批人"
|
|
|
|
|
|
@change="changeUser(index)">
|
|
|
|
|
|
<el-option v-for="item in item.listData" :key="item.id" :label="item.userName" :value="item.id" />
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<el-button type="danger" @click="newDelitions(index)">删除</el-button>
|
|
|
|
|
|
</div>
|
2025-08-16 16:54:03 +08:00
|
|
|
|
</div>
|
2025-08-27 17:26:29 +08:00
|
|
|
|
<!-- </div> -->
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="container-box" v-else>
|
|
|
|
|
|
<div v-for="(item, index) in userList" :key="item.id">
|
|
|
|
|
|
<div v-if="checkList.includes(item.nodeId)">
|
|
|
|
|
|
<el-divider content-position="left">{{ item.nodeName }}</el-divider>
|
|
|
|
|
|
<template v-if="Array.isArray(item.userList)">
|
|
|
|
|
|
<div class="reloBox" v-for="items in item.userList">
|
|
|
|
|
|
<div class="orgName">{{ items.name }}</div>
|
|
|
|
|
|
<el-checkbox-group v-model="items.checkList">
|
|
|
|
|
|
<el-checkbox :label="it.userid" v-for="(it, index) in items.users" :key="it.id">{{
|
|
|
|
|
|
it.username }}</el-checkbox>
|
|
|
|
|
|
</el-checkbox-group>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<template v-else>
|
|
|
|
|
|
<div class="reloBox">
|
|
|
|
|
|
<div class="orgName">{{ item.userList.name }}</div>
|
|
|
|
|
|
<el-checkbox-group v-model="item.checkList">
|
|
|
|
|
|
<el-checkbox :label="it.userid" v-for="(it, index) in item.userList.users" :key="it.id">{{
|
|
|
|
|
|
it.username }}</el-checkbox>
|
|
|
|
|
|
</el-checkbox-group>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
</div>
|
2025-08-27 17:26:29 +08:00
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
</div>
|
2025-08-27 17:26:29 +08:00
|
|
|
|
<div v-if="showNode && showModel">
|
|
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
</div>
|
2025-08-16 16:54:03 +08:00
|
|
|
|
<template #footer>
|
|
|
|
|
|
<div class="dialog-footer">
|
|
|
|
|
|
<el-button @click="close">取消</el-button>
|
|
|
|
|
|
<el-button type="primary" @click="qcckPostList">
|
|
|
|
|
|
确认
|
|
|
|
|
|
</el-button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
|
|
|
</script>
|
|
|
|
|
|
<script setup>
|
|
|
|
|
|
import { ref, getCurrentInstance, reactive, watch } from 'vue'
|
|
|
|
|
|
import { qcckGet, qcckPost } from '@/api/qcckApi'
|
2025-08-27 17:26:29 +08:00
|
|
|
|
import { splGet, splPost, submitProcess, queryUserListByRule, queryListByEntity, querysingleByEntity, queryUporgsByEntity } from '@/api/spl'
|
2025-08-16 16:54:03 +08:00
|
|
|
|
import { getItem } from '@/utils/storage'
|
|
|
|
|
|
import { Plus } from '@element-plus/icons-vue'
|
|
|
|
|
|
import * as MOSTY from "@/components/MyComponents/index";
|
|
|
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
|
modelValue: {
|
|
|
|
|
|
type: Boolean,
|
|
|
|
|
|
required: true
|
|
|
|
|
|
}, title: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: '发起流程'
|
|
|
|
|
|
},
|
|
|
|
|
|
createProcess: {
|
|
|
|
|
|
type: Object,
|
|
|
|
|
|
default: () => { }
|
|
|
|
|
|
}, radioData: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: ''
|
|
|
|
|
|
}, path: {
|
|
|
|
|
|
type: Object,
|
|
|
|
|
|
default: {
|
|
|
|
|
|
byMeansOf: '',
|
|
|
|
|
|
nobyMeansOf: '',
|
|
|
|
|
|
clueVerification: "",
|
|
|
|
|
|
recycle: ""
|
|
|
|
|
|
}
|
|
|
|
|
|
}, userData: {
|
|
|
|
|
|
type: Object,
|
|
|
|
|
|
default: () => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
ajmc: "",
|
|
|
|
|
|
flowType: ""
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
const emit = defineEmits(['update:modelValue', 'close', 'getList'])
|
|
|
|
|
|
const titles = ref(props.title)
|
|
|
|
|
|
const showNode = ref(true)
|
|
|
|
|
|
|
|
|
|
|
|
// 新增
|
|
|
|
|
|
const nodeData = ref([
|
|
|
|
|
|
{
|
|
|
|
|
|
deptId: '',
|
|
|
|
|
|
userId: '',
|
|
|
|
|
|
userData: {},
|
|
|
|
|
|
orgData: {},
|
|
|
|
|
|
}
|
|
|
|
|
|
])
|
|
|
|
|
|
//新增表单
|
|
|
|
|
|
const newAdditions = () => {
|
|
|
|
|
|
nodeData.value.push({
|
|
|
|
|
|
deptId: '',
|
|
|
|
|
|
userId: '',
|
|
|
|
|
|
userData: {},
|
|
|
|
|
|
orgData: {},
|
|
|
|
|
|
listData: []
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
// 删除表单
|
|
|
|
|
|
const newDelitions = (item) => {
|
|
|
|
|
|
nodeData.value.splice(item, 1)
|
|
|
|
|
|
}
|
|
|
|
|
|
const chageIndex = ref(0)
|
|
|
|
|
|
// 选取角色
|
|
|
|
|
|
const changeUser = (index) => {
|
|
|
|
|
|
chageIndex.value = index
|
|
|
|
|
|
let obj = nodeData.value[index].listData.find(item => { return item.id == nodeData.value[index].userId })
|
|
|
|
|
|
nodeData.value[index].userData = {
|
|
|
|
|
|
userId: obj.userId,
|
|
|
|
|
|
userName: obj.userName,
|
|
|
|
|
|
sfzh: obj.idEntityCard,
|
|
|
|
|
|
userData: {
|
|
|
|
|
|
// id: '41fbffaf92a34b31bde6302004277486',
|
|
|
|
|
|
// orgid: '41fbffaf92a34b31bde6302004277486',
|
|
|
|
|
|
id: orgId.value,
|
|
|
|
|
|
orgid: orgId.value,
|
|
|
|
|
|
orgcode: obj.deptCode,
|
|
|
|
|
|
orgname: obj.deptName
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//选取部门
|
2025-08-27 17:26:29 +08:00
|
|
|
|
const orgId = ref()
|
2025-08-16 16:54:03 +08:00
|
|
|
|
const changePostList = (index, e) => {
|
2025-08-27 17:26:29 +08:00
|
|
|
|
orgId.value = e.fzOrgId
|
2025-08-16 16:54:03 +08:00
|
|
|
|
chageIndex.value = index
|
2025-08-27 17:26:29 +08:00
|
|
|
|
nodeData.value[chageIndex.value].id = e.id
|
2025-08-16 16:54:03 +08:00
|
|
|
|
nodeData.value[chageIndex.value].orgData = {
|
2025-08-27 17:26:29 +08:00
|
|
|
|
id: orgId.value,
|
|
|
|
|
|
orgid: orgId.value,
|
2025-08-16 16:54:03 +08:00
|
|
|
|
// id: '41fbffaf92a34b31bde6302004277486',
|
|
|
|
|
|
// orgid: '41fbffaf92a34b31bde6302004277486',
|
|
|
|
|
|
orgcode: e.orgCode,
|
|
|
|
|
|
orgname: e.orgName
|
|
|
|
|
|
}
|
|
|
|
|
|
getUser()
|
|
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
const newUserData = ref({})
|
|
|
|
|
|
|
|
|
|
|
|
const transformData = (nodeData) => {
|
|
|
|
|
|
console.log(nodeData);
|
|
|
|
|
|
|
|
|
|
|
|
const { userList, checkList } = nodeData;
|
|
|
|
|
|
if (Array.isArray(userList)) {
|
|
|
|
|
|
const result = [];
|
|
|
|
|
|
// 遍历所有组织
|
|
|
|
|
|
for (const org of userList) {
|
|
|
|
|
|
// 遍历组织中的用户
|
|
|
|
|
|
for (const user of org.users) {
|
|
|
|
|
|
// 创建用户数据对象
|
|
|
|
|
|
const userData = {
|
|
|
|
|
|
id: user.id,
|
|
|
|
|
|
orgid: org.id,
|
|
|
|
|
|
orgcode: org.code,
|
|
|
|
|
|
orgname: org.name
|
|
|
|
|
|
};
|
|
|
|
|
|
// 创建结果对象
|
|
|
|
|
|
const transformedUser = {
|
|
|
|
|
|
userId: user.userid,
|
|
|
|
|
|
userName: user.username,
|
|
|
|
|
|
userData: JSON.stringify(userData)
|
|
|
|
|
|
};
|
|
|
|
|
|
result.push(transformedUser);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const { id: orgid, code: orgcode, name: orgname, users } = userList;
|
|
|
|
|
|
const checkListSet = new Set(checkList);
|
|
|
|
|
|
const filteredUsers = users.filter(user => checkListSet.has(user.userid));
|
|
|
|
|
|
return filteredUsers.map(user => {
|
|
|
|
|
|
newUserData.value = JSON.stringify({
|
|
|
|
|
|
id: user.id,
|
|
|
|
|
|
orgid,
|
|
|
|
|
|
orgcode,
|
|
|
|
|
|
orgname
|
|
|
|
|
|
})
|
|
|
|
|
|
return {
|
|
|
|
|
|
userId: user.userid,
|
|
|
|
|
|
userName: user.username,
|
|
|
|
|
|
userData: newUserData.value
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const checkListData = ref()
|
|
|
|
|
|
// 删除
|
|
|
|
|
|
const handleCheckAllChange = (e) => {
|
|
|
|
|
|
const checkListSet = new Set(e);
|
|
|
|
|
|
checkListData.value = userList.value.filter(item => checkListSet.has(item.nodeId));
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-08-16 16:54:03 +08:00
|
|
|
|
// 提交
|
|
|
|
|
|
const qcckPostList = async () => {
|
2025-08-27 17:26:29 +08:00
|
|
|
|
const data = {}
|
|
|
|
|
|
const listError = []
|
|
|
|
|
|
for (let i = 0; i < checkListData.value.length; i++) {
|
|
|
|
|
|
if (Array.isArray(checkListData.value[i].userList)) {
|
|
|
|
|
|
for (let j = 0; j < checkListData.value[i].userList.length; j++) {
|
|
|
|
|
|
const item = checkListData.value[i].userList[j]
|
|
|
|
|
|
if (item.checkList && item.checkList.length > 0) {
|
|
|
|
|
|
data[checkListData.value[i].nodeId] = {
|
|
|
|
|
|
users: transformData(checkListData.value[i])
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
listError.push(checkListData.value[i].nodeName)
|
|
|
|
|
|
}
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (checkListData.value[i].checkList && checkListData.value[i].checkList.length > 0) {
|
|
|
|
|
|
data[checkListData.value[i].nodeId] = {
|
|
|
|
|
|
users: transformData(checkListData.value[i])
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
listError.push(checkListData.value[i].nodeName)
|
|
|
|
|
|
}
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
if (modelData.value.length !== checkList.value.length) {
|
|
|
|
|
|
proxy.$message({ type: "warning", message: '环节' + listError.join('、') + '中有需要勾选的项' });
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
if (listError.length > 0) {
|
|
|
|
|
|
proxy.$message({ type: "warning", message: listError.join('、') + '请选择审批人' });
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
const submitData = {
|
2025-08-16 16:54:03 +08:00
|
|
|
|
...props.createProcess,
|
|
|
|
|
|
decision: JSON.stringify({
|
2025-08-27 17:26:29 +08:00
|
|
|
|
...data,
|
|
|
|
|
|
services: [],
|
|
|
|
|
|
events: [],
|
|
|
|
|
|
userData: newUserData.value,
|
2025-08-16 16:54:03 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
submitData.processData = JSON.stringify(submitData.processData)
|
|
|
|
|
|
await submitProcess({ ...submitData }).then(res => {
|
2025-08-16 16:54:03 +08:00
|
|
|
|
proxy.$message({ type: "success", message: "提交审批成功" });
|
|
|
|
|
|
sendMessage(res.rows[0])
|
|
|
|
|
|
})
|
|
|
|
|
|
await emit('getList')
|
|
|
|
|
|
emit('close')
|
|
|
|
|
|
close()
|
|
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
//获取角色
|
|
|
|
|
|
const getUser = () => {
|
|
|
|
|
|
const promes = {
|
|
|
|
|
|
size: 200, current: 1,
|
|
|
|
|
|
deptId: nodeData.value[chageIndex.value].id
|
|
|
|
|
|
}
|
|
|
|
|
|
qcckGet(promes, '/mosty-base/sysUser/selectPage').then(res => {
|
|
|
|
|
|
nodeData.value[chageIndex.value].listData = res.records
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
const showModel = ref(true)
|
2025-08-16 16:54:03 +08:00
|
|
|
|
//查询模板
|
|
|
|
|
|
const modelData = ref({})
|
2025-08-27 17:26:29 +08:00
|
|
|
|
const loading = ref(false)
|
|
|
|
|
|
const userList = ref()
|
|
|
|
|
|
//节点审核人
|
|
|
|
|
|
const checkList = ref()
|
|
|
|
|
|
const endpoints = [
|
|
|
|
|
|
'/modelVersion/queryModelVersion',
|
|
|
|
|
|
'/modelVersion/queryModelNode',
|
|
|
|
|
|
'/modelVersion/queryModelSequenceFlow',
|
|
|
|
|
|
'/modelVersion/queryModelReachability'
|
|
|
|
|
|
]
|
2025-08-16 16:54:03 +08:00
|
|
|
|
const queryModel = async () => {
|
2025-08-27 17:26:29 +08:00
|
|
|
|
try {
|
|
|
|
|
|
loading.value = true
|
|
|
|
|
|
// 查询模型信息
|
|
|
|
|
|
const params = {
|
|
|
|
|
|
modelId: props.radioData,
|
|
|
|
|
|
modelStatus: 1
|
|
|
|
|
|
}
|
|
|
|
|
|
const modelRes = await splPost(params, '/model/queryModel')
|
|
|
|
|
|
|
|
|
|
|
|
if (modelRes.rows.length === 0) {
|
|
|
|
|
|
proxy.$message({ type: "error", message: "模板不存在" })
|
|
|
|
|
|
showModel.value = false
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
// 并行获取模型相关数据
|
|
|
|
|
|
const resData = await Promise.all(endpoints.map(item => {
|
|
|
|
|
|
return splPost({ modelVersionId: modelRes.rows[0].currentVersionId }, item)
|
|
|
|
|
|
}))
|
|
|
|
|
|
// 解析节点数据
|
|
|
|
|
|
const rootNode = resData[1].rows.find(item => item.eventType === '0')
|
|
|
|
|
|
const sequenceNode = resData[2].rows.find(item => item.sourceNodeId === rootNode.nodeId)
|
|
|
|
|
|
const eventNode = resData[1].rows.find(item =>
|
|
|
|
|
|
item.nodeType === '1' && item.nodeId === sequenceNode.targetNodeId
|
|
|
|
|
|
)
|
2025-10-26 12:25:50 +08:00
|
|
|
|
const orgId = getItem('deptId')[0].fzOrgId
|
|
|
|
|
|
if (!orgId) {
|
|
|
|
|
|
proxy.$message({ type: "error", message: "查询模型失败,请重试" })
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
if (eventNode) {
|
|
|
|
|
|
// 处理事件节点
|
|
|
|
|
|
await handleEventNode(eventNode, orgId)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 处理普通节点
|
|
|
|
|
|
await handleNormalNodes(resData, sequenceNode, orgId)
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('查询模型失败:', error)
|
|
|
|
|
|
proxy.$message({ type: "error", message: "查询模型失败,请重试" })
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
loading.value = false
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
const optional=ref(false)
|
|
|
|
|
|
// 处理事件节点
|
|
|
|
|
|
const handleEventNode = async (eventNode, orgId) => {
|
|
|
|
|
|
const nodeExtension = JSON.parse(eventNode.nodeExtension)
|
|
|
|
|
|
modelData.value = [eventNode]
|
|
|
|
|
|
checkList.value = [eventNode.nodeId]
|
|
|
|
|
|
let userRes
|
|
|
|
|
|
let orgData
|
|
|
|
|
|
const roles = nodeExtension.flwsUserNode.role[0] ? nodeExtension.flwsUserNode.role[0] : ''
|
|
|
|
|
|
const promes = {
|
|
|
|
|
|
posts: "",
|
|
|
|
|
|
orgid: ""
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
if (nodeExtension.flwsUserNode.orgType == 'brothers') {
|
2025-10-26 12:25:50 +08:00
|
|
|
|
console.log(1);
|
|
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
orgData = await queryListByEntity({ id: orgId })
|
|
|
|
|
|
} else if (nodeExtension.flwsUserNode.orgType == 'parent') {
|
2025-10-26 12:25:50 +08:00
|
|
|
|
console.log(2);
|
2025-08-27 17:26:29 +08:00
|
|
|
|
orgData = await querysingleByEntity({ id: orgId })
|
|
|
|
|
|
} else if (nodeExtension.flwsUserNode.orgType == 'parents') {
|
2025-10-26 12:25:50 +08:00
|
|
|
|
console.log(3);
|
2025-08-27 17:26:29 +08:00
|
|
|
|
orgData = await queryUporgsByEntity({ id: orgId })
|
|
|
|
|
|
} else if (nodeExtension.flwsUserNode.orgType == 'appoint') {
|
2025-10-26 12:25:50 +08:00
|
|
|
|
console.log(4);
|
2025-08-27 17:26:29 +08:00
|
|
|
|
// orgData = await queryUporgsByEntity({ orgcode: orgId })
|
2025-10-26 12:25:50 +08:00
|
|
|
|
console.log(orgData);
|
|
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (nodeExtension.flwsUserNode.orgType == 'appoint') {
|
|
|
|
|
|
promes.roles = roles
|
|
|
|
|
|
promes.orgcode = nodeExtension.flwsUserNode.orgcode
|
|
|
|
|
|
userRes = await queryUserListByRule(promes)
|
|
|
|
|
|
checkListData.value = userList.value = [{
|
|
|
|
|
|
...eventNode,
|
|
|
|
|
|
userList: userRes.rows[0]
|
|
|
|
|
|
}]
|
|
|
|
|
|
}
|
|
|
|
|
|
if (nodeExtension.flwsUserNode.orgType == 'current') {
|
|
|
|
|
|
promes.roles = roles
|
|
|
|
|
|
promes.orgid = orgId
|
|
|
|
|
|
userRes = await queryUserListByRule(promes)
|
|
|
|
|
|
checkListData.value = userList.value = [{
|
|
|
|
|
|
...eventNode,
|
|
|
|
|
|
userList: userRes.rows[0]
|
|
|
|
|
|
}]
|
|
|
|
|
|
} else if (nodeExtension.flwsUserNode.orgType == 'optional') {
|
|
|
|
|
|
optional.value=true
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
|
|
const parentids = orgData.rows.map(item => item.parentid)
|
|
|
|
|
|
const userListPromises = parentids.map((item) => {
|
|
|
|
|
|
const promes = {
|
|
|
|
|
|
roles: roles,
|
|
|
|
|
|
posts: "",
|
|
|
|
|
|
orgid: item
|
|
|
|
|
|
}
|
|
|
|
|
|
return queryUserListByRule(promes)
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
const userListResults = await Promise.all(userListPromises)
|
|
|
|
|
|
checkListData.value = userList.value = modelData.value.map((item, index) => ({
|
|
|
|
|
|
...item,
|
|
|
|
|
|
userList: userListResults[index]?.rows[0]
|
|
|
|
|
|
}))
|
|
|
|
|
|
}
|
|
|
|
|
|
console.log(checkListData.value);
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
// 处理普通节点
|
|
|
|
|
|
const handleNormalNodes = async (resData, sequenceNode, orgId) => {
|
|
|
|
|
|
const targetNodeIds = resData[2].rows
|
|
|
|
|
|
.filter(item => item.sourceNodeId === sequenceNode.targetNodeId)
|
|
|
|
|
|
.map(item => item.targetNodeId)
|
|
|
|
|
|
const targetIdSet = new Set(targetNodeIds)
|
|
|
|
|
|
modelData.value = resData[1].rows.filter(item => targetIdSet.has(item.nodeId))
|
|
|
|
|
|
checkList.value = modelData.value.map(item => item.nodeId)
|
|
|
|
|
|
// 并行获取用户列表
|
|
|
|
|
|
let promesList = {}
|
|
|
|
|
|
for (let i = 0; i < modelData.value.length; i++) {
|
|
|
|
|
|
const str = JSON.parse(modelData.value[i].nodeExtension)
|
|
|
|
|
|
let res = {}
|
|
|
|
|
|
let list = []
|
|
|
|
|
|
if (str.flwsUserNode.orgType == 'brothers') {
|
|
|
|
|
|
res = await queryListByEntity({ parentid: orgId })
|
|
|
|
|
|
list = res.rows.map(item => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
orgid: item.id,
|
|
|
|
|
|
posts: str.flwsUserNode.post[0] ? str.flwsUserNode.post[0] : '',
|
|
|
|
|
|
roles: str.flwsUserNode.role[0] ? str.flwsUserNode.role[0] : '',
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
promesList[modelData.value[i].nodeId] = list
|
|
|
|
|
|
} else if (str.flwsUserNode.orgType == 'parent') {
|
|
|
|
|
|
res = await querysingleByEntity({ id: orgId })
|
|
|
|
|
|
list = res.rows.map(item => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
orgid: item.id,
|
|
|
|
|
|
posts: str.flwsUserNode.post[0] ? str.flwsUserNode.post[0] : '',
|
|
|
|
|
|
roles: str.flwsUserNode.role[0] ? str.flwsUserNode.role[0] : '',
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
promesList[modelData.value[i].nodeId] = list
|
|
|
|
|
|
} else if (str.flwsUserNode.orgType == 'parents') {
|
|
|
|
|
|
res = await queryUporgsByEntity({ id: orgId })
|
|
|
|
|
|
list = res.rows.map(item => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
orgid: item.id,
|
|
|
|
|
|
posts: str.flwsUserNode.post[0] ? str.flwsUserNode.post[0] : '',
|
|
|
|
|
|
roles: str.flwsUserNode.role[0] ? str.flwsUserNode.role[0] : '',
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
promesList[modelData.value[i].nodeId] = list
|
|
|
|
|
|
} else if (str.flwsUserNode.orgType == 'appoint') {
|
2025-10-26 12:25:50 +08:00
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
list = [{
|
|
|
|
|
|
posts: str.flwsUserNode.post[0] ? str.flwsUserNode.post[0] : '',
|
|
|
|
|
|
roles: str.flwsUserNode.role[0] ? str.flwsUserNode.role[0] : '',
|
|
|
|
|
|
orgcode: str.flwsUserNode.orgcode
|
|
|
|
|
|
}]
|
|
|
|
|
|
promesList[modelData.value[i].nodeId] = list
|
|
|
|
|
|
} else {
|
|
|
|
|
|
list = [{
|
|
|
|
|
|
posts: str.flwsUserNode.post[0] ? str.flwsUserNode.post[0] : '',
|
|
|
|
|
|
roles: str.flwsUserNode.role[0] ? str.flwsUserNode.role[0] : '',
|
|
|
|
|
|
orgid: orgId
|
|
|
|
|
|
}]
|
|
|
|
|
|
promesList[modelData.value[i].nodeId] = list
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
const listByRule = {}
|
|
|
|
|
|
for (const key in promesList) {
|
|
|
|
|
|
console.log(promesList[key]);
|
|
|
|
|
|
|
|
|
|
|
|
listByRule[key] = promesList[key].map(item => {
|
|
|
|
|
|
return queryUserListByRule(item)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
const userListByRule = {}
|
|
|
|
|
|
for (const key in listByRule) {
|
|
|
|
|
|
userListByRule[key] = await Promise.all(listByRule[key])
|
|
|
|
|
|
}
|
|
|
|
|
|
const model = {}
|
|
|
|
|
|
for (const key in userListByRule) {
|
|
|
|
|
|
model[key] = userListByRule[key].flatMap(item => item.rows)
|
|
|
|
|
|
}
|
|
|
|
|
|
checkListData.value = userList.value = modelData.value.map((item, index) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
userList: model[item.nodeId] ? model[item.nodeId] : []
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
function filterUsersWithOrgInfo(orgsData, checkList) {
|
|
|
|
|
|
const result = [];
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有数据或检查列表为空,返回空数组
|
|
|
|
|
|
if (!orgsData || !Array.isArray(orgsData) || !checkList || checkList.length === 0) {
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将checkList转换为Set以提高查找效率
|
|
|
|
|
|
const checkSet = new Set(checkList);
|
|
|
|
|
|
|
|
|
|
|
|
// 遍历所有组织
|
|
|
|
|
|
for (const org of orgsData) {
|
|
|
|
|
|
// 检查组织是否有用户数据
|
|
|
|
|
|
if (org.users && Array.isArray(org.users)) {
|
|
|
|
|
|
// 筛选匹配的用户
|
|
|
|
|
|
for (const user of org.users) {
|
|
|
|
|
|
if (checkSet.has(user.userid)) {
|
|
|
|
|
|
// 创建带组织信息的用户对象
|
|
|
|
|
|
const userWithOrgInfo = {
|
|
|
|
|
|
...user, // 保留所有原始用户属性
|
|
|
|
|
|
orgCode: org.code, // 添加组织code
|
|
|
|
|
|
orgName: org.name, // 添加组织name
|
|
|
|
|
|
orgId: org.id // 添加组织id
|
|
|
|
|
|
};
|
|
|
|
|
|
result.push(userWithOrgInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2025-08-16 16:54:03 +08:00
|
|
|
|
//发消息
|
|
|
|
|
|
const sendMessage = (gzlid) => {
|
2025-08-27 17:26:29 +08:00
|
|
|
|
let letDataCheck = []
|
|
|
|
|
|
let userList = []
|
|
|
|
|
|
for (let i = 0; i < checkListData.value.length; i++) {
|
|
|
|
|
|
letDataCheck = [...letDataCheck, ...checkListData.value[i].checkList]
|
|
|
|
|
|
userList.push(checkListData.value[i].userList)
|
|
|
|
|
|
}
|
2025-10-26 12:25:50 +08:00
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
const bkshrSfzh = filterUsersWithOrgInfo(userList, letDataCheck).map(item => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
bkshrXm: item.username,
|
|
|
|
|
|
bkshrSfzh: item.userid,
|
|
|
|
|
|
bkshrSsbmmc: item.orgName,
|
|
|
|
|
|
bkshrSsbmdm: item.orgCode,
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
const promes = {
|
|
|
|
|
|
xxly: '005',
|
|
|
|
|
|
gzlid: gzlid,
|
|
|
|
|
|
list: bkshrSfzh,
|
2025-08-27 17:26:29 +08:00
|
|
|
|
versionId: checkListData.value[0].modelVersionId,
|
2025-08-16 16:54:03 +08:00
|
|
|
|
id: props.createProcess.processData.rwbh
|
|
|
|
|
|
}
|
|
|
|
|
|
switch (props.userData.flowType) {
|
|
|
|
|
|
case 'BKSP':
|
|
|
|
|
|
qcckPost(promes, '/mosty-gsxt/tbGsxtBk/updateBkgzl').then(res => {
|
|
|
|
|
|
console.log(res);
|
|
|
|
|
|
})
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'ZDRYSDFJDP':
|
|
|
|
|
|
qcckPost(promes, '/mosty-gsxt/tbGsxtRqfjRy/updateBkgzl').then(res => {
|
|
|
|
|
|
console.log(res);
|
|
|
|
|
|
})
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'XSSJCJSP':
|
2025-08-27 17:26:29 +08:00
|
|
|
|
qcckPost(promes, '/mosty-gsxt/qbcj/updateBkgzl').then(res => {
|
2025-08-16 16:54:03 +08:00
|
|
|
|
console.log(res);
|
|
|
|
|
|
})
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
watch(() => props.modelValue, (val) => {
|
|
|
|
|
|
if (val) {
|
|
|
|
|
|
queryModel()
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
const close = () => {
|
|
|
|
|
|
nodeData.value = [
|
|
|
|
|
|
{
|
|
|
|
|
|
deptId: '',
|
|
|
|
|
|
userId: '',
|
|
|
|
|
|
userData: {},
|
|
|
|
|
|
orgData: {},
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
2025-08-27 17:26:29 +08:00
|
|
|
|
optional.value=false
|
2025-08-16 16:54:03 +08:00
|
|
|
|
emit('update:modelValue', false)
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
|
@import "@/assets/css/homeScreen.scss";
|
|
|
|
|
|
|
|
|
|
|
|
::v-deep .el-dialog__body {
|
|
|
|
|
|
padding-top: 0 !important;
|
|
|
|
|
|
padding-bottom: 0 !important;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.dialog-header {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.container-box {
|
2025-08-27 17:26:29 +08:00
|
|
|
|
// height: 300px;
|
|
|
|
|
|
min-height: 300px;
|
2025-08-16 16:54:03 +08:00
|
|
|
|
overflow: auto;
|
2025-08-27 17:26:29 +08:00
|
|
|
|
// border: 1px solid rgba(172, 172, 172, 0.479);
|
|
|
|
|
|
padding: 10px;
|
|
|
|
|
|
max-height: 500px;
|
2025-08-16 16:54:03 +08:00
|
|
|
|
|
2025-08-27 17:26:29 +08:00
|
|
|
|
// border-radius: 5px;
|
2025-08-16 16:54:03 +08:00
|
|
|
|
.row {
|
|
|
|
|
|
margin-top: 10px;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
margin-right: 10px;
|
|
|
|
|
|
|
|
|
|
|
|
.select-user {
|
|
|
|
|
|
margin: 0 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-27 17:26:29 +08:00
|
|
|
|
|
|
|
|
|
|
.reloBox {
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
padding: 0 10px;
|
|
|
|
|
|
border: 1px solid rgba(192, 192, 192, 0.426);
|
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
|
min-height: 100px;
|
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
|
|
|
|
|
|
.orgName {
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
transform: translate(-50%, -50%);
|
|
|
|
|
|
left: 50%;
|
|
|
|
|
|
padding: 0 10px;
|
|
|
|
|
|
background-color: #fff;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-16 16:54:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
</style>
|