lcw
This commit is contained in:
@ -12,15 +12,15 @@
|
||||
<div v-show="active == '文件解析'">
|
||||
<h1>文件文本提取工具</h1>
|
||||
<p>上传文件提取文本内容(支持 .txt, .pdf, .docx, mp4 , mp3, wav)</p>
|
||||
|
||||
|
||||
<div class="container">
|
||||
<input type="file" id="file-input" accept=".txt,.pdf,.docx,'.mp4','.mp3','.wav'"/>
|
||||
<button @click="chooseFile">选择文件</button>
|
||||
<p id="file-info">{{ fileText }}</p>
|
||||
</div>
|
||||
|
||||
|
||||
<button id="extract-btn" disabled>提取文本</button>
|
||||
|
||||
|
||||
<h3>提取结果:</h3>
|
||||
<div id="result">{{ content }}</div>
|
||||
</div>
|
||||
@ -267,8 +267,14 @@ const changeRadio = (val) =>{
|
||||
texts.value = [];
|
||||
image.value = '';
|
||||
fjmc.value = '';
|
||||
if(val == '图片解析'){
|
||||
if(!imgIsLoad) proxy.$message({ type: "error", message: "加载失败,请刷新页面" });
|
||||
if (val == '图片解析') {
|
||||
|
||||
if (!imgIsLoad) {
|
||||
proxy.$message({ type: "error", message: "加载失败,请刷新页面" })
|
||||
|
||||
// frashJs()
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -396,4 +402,4 @@ button:hover {
|
||||
height: 195px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@ -46,15 +46,11 @@ const mMap = ref(null); //地图对象
|
||||
const mapUtil = ref(null); //地图工具对象
|
||||
const zoomTarget = ref(6);
|
||||
|
||||
// 定义组件发出的事件
|
||||
const emit = defineEmits(['mapLoaded'])
|
||||
|
||||
const props = defineProps({
|
||||
mapid: {
|
||||
type: String,
|
||||
default: "mapDiv"
|
||||
},
|
||||
|
||||
//是否显示可以切换地图底图
|
||||
isShow: {
|
||||
type: Boolean,
|
||||
@ -110,17 +106,48 @@ onMounted(() => {
|
||||
}
|
||||
});
|
||||
|
||||
// window.map = map;
|
||||
// map.mapboxGLMap.on("load", () => {
|
||||
// map.addGaudLayer({
|
||||
// url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
|
||||
// })
|
||||
// zoomTarget.value = map.mapboxGLMap.getZoom();
|
||||
// // 地图加载完成后发出事件
|
||||
// emit('mapLoaded')
|
||||
// });
|
||||
// mapUtil.value = new MapUtil(map);
|
||||
map = new EliMap({
|
||||
id: props.mapid,
|
||||
crs: "EPSG:4490",
|
||||
style: {
|
||||
glyphs: "./fonts/{fontstack}/{range}.pbf",
|
||||
center: [94.36057012, 29.64276831],
|
||||
zoom: 15
|
||||
},
|
||||
minZoom: 7,
|
||||
maxZoom: 18,
|
||||
});
|
||||
window.map = map;
|
||||
map.mapboxGLMap.on("load", () => {
|
||||
map.addGaudLayer({
|
||||
url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
|
||||
})
|
||||
map.addWMTSLayer(
|
||||
"/PGIS_S_TileMapServer/Maps/XZDJ_SL/EzMap"
|
||||
,
|
||||
{
|
||||
Service: "getImage",
|
||||
Type: "RGB",
|
||||
ZoomOffset: "0",
|
||||
V: "0.3",
|
||||
Zoom: "{z}",
|
||||
Row: "{y}",
|
||||
Col: "{x}"
|
||||
},
|
||||
{
|
||||
tileSize: 300
|
||||
}
|
||||
);
|
||||
zoomTarget.value = map.mapboxGLMap.getZoom();
|
||||
// 地图加载完成后发出事件
|
||||
emit('mapLoaded')
|
||||
});
|
||||
mapUtil.value = new MapUtil(map);
|
||||
|
||||
mapUtil.value.Drawplot(); //初始化加载绘制工具
|
||||
|
||||
// 设置地图中心点及图层
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
:highlight-current-row="getConfiger.showSelectType === 'radio'"
|
||||
:row-style="{ height: getConfiger.rowHeight === 'auto' ? getConfiger.rowHeight : getConfiger.rowHeight + 'px'}"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column style="width: 55px" type="selection" width="55" v-if="getConfiger.showSelectType === 'radio' ? 'tabBoxRadio' : ''" />
|
||||
<el-table-column
|
||||
type="index"
|
||||
label="序号"
|
||||
|
||||
@ -1,34 +1,35 @@
|
||||
<template>
|
||||
<div class="smallTitle">审批信息</div>
|
||||
<div class="ww100">
|
||||
<el-steps :active="0" space="500" finish-status="success" direction="vertical" status=''>
|
||||
<el-step :title="item.eventType == '0' ? '发起申请' : item.eventType == '1' ? '审批结束' : item.nodeName"
|
||||
v-for="(item, index) in workflow" :key="index">
|
||||
<template #description>
|
||||
<div class="ww100 mt10 mb20 nodeBox" v-if="item.eventType == '0'||item.eventType == '1'">
|
||||
<div class="nodeorgNameTg">{{ item.xtLrrbm }}</div>
|
||||
<div class="flex just-between nameTag">
|
||||
<div>{{ item.log.userName }}</div>
|
||||
<div class="fontColor">{{ item.eventType == '0' ? '发起' : '结束' }}</div>
|
||||
</div>
|
||||
<div>{{ item.log.xtLrsj }}</div>
|
||||
<div class="smallTitle">审批信息</div>
|
||||
<div class="ww100">
|
||||
<el-steps :active="0" space="500" finish-status="success" direction="vertical" status=''>
|
||||
<el-step :title="item.eventType == '0' ? '发起申请' : item.eventType == '1' ? '审批结束' : item.nodeName"
|
||||
v-for="(item, index) in workflow" :key="index">
|
||||
<template #description>
|
||||
<div class="ww100 mt10 mb20 nodeBox" v-if="item.eventType == '0' || item.eventType == '1'">
|
||||
<div class="nodeorgNameTg">{{ item.xtLrrbm }}</div>
|
||||
<div class="flex just-between nameTag">
|
||||
<div>{{ item.xtLrrxm}}</div>
|
||||
<div class="fontColor">{{ item.eventType == '0' ? '发起' : '结束' }}</div>
|
||||
</div>
|
||||
<div>{{ item.xtLrsj }}</div>
|
||||
</div>
|
||||
<div v-else class="ww100 mt10 mb20 nodeBox">
|
||||
<div :class="item.taskStatus == '2' ? 'nodeorgNameTg' : 'nodeorgNameDd'">{{ item.nodeName }}</div>
|
||||
<!-- <div v-for="(items, indexs) in item.log" :key="indexs"> -->
|
||||
<div class="flex just-between nameTag">
|
||||
<div>{{ item.logNode.userName }}</div>
|
||||
<div :class="item.taskStatus == '2' ? 'fontColor' : 'fontColorDd'">
|
||||
{{ item.taskStatus == '2' ? '已审批' : '审批中' }}
|
||||
</div>
|
||||
<div v-else class="ww100 mt10 mb20 nodeBox">
|
||||
<div :class="item.taskStatus=='2'?'nodeorgNameTg':'nodeorgNameDd'">{{ item.orgNameData.orgname }}</div>
|
||||
<div v-for="(items, indexs) in item.log" :key="indexs">
|
||||
<div class="flex just-between nameTag" >
|
||||
<div>{{ items.userName }}</div>
|
||||
<div :class="item.taskStatus=='2'?'fontColor':'fontColorDd'">审批中</div>
|
||||
</div>
|
||||
<div>{{ items.xtLrsj }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>{{ item.logNode.xtZhxgsj }}</div>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
</template>
|
||||
</el-step>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
</el-step>
|
||||
|
||||
</el-steps>
|
||||
</div>
|
||||
</el-steps>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -42,97 +43,57 @@ const getWorkflow = async (id) => {
|
||||
const process = await queryProcess(promes)
|
||||
const proNode = await queryProcessNode(promes)
|
||||
const proNodeLog = await queryProcessNodeLog(promes)
|
||||
const sortedNodes = sortNodesWithNoPreviousFirst(proNode.rows)
|
||||
|
||||
|
||||
workflow.value = sortedNodes.map(item => {
|
||||
const log = proNodeLog.rows.filter(items => item.nodeId == items.nodeId)
|
||||
if (item.eventType == '0') {
|
||||
console.log(item);
|
||||
return {
|
||||
...item,
|
||||
log: {
|
||||
// userData: JSON.parse(item.userData),
|
||||
// xtLrrbm:process.rows[0].xtLrrbm,
|
||||
userName: process.rows[0].userName,
|
||||
xtLrsj: process.rows[0].xtLrsj,
|
||||
processStatus: process.rows[0].processStatus,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
...item,
|
||||
orgNameData: JSON.parse(log[0].userData),
|
||||
log: log
|
||||
}
|
||||
let newProNode = proNode.rows.filter(item => item.eventType == '0')
|
||||
const decisionPNodeId = proNode.rows.map(item => {
|
||||
const log = proNodeLog.rows.find(items => items.nodeId == item.nodeId)
|
||||
return {
|
||||
...item,
|
||||
logNode: log ? log : ""
|
||||
}
|
||||
|
||||
})
|
||||
};
|
||||
workflow.value = sortNodesByFlow(decisionPNodeId)
|
||||
console.log(workflow.value);
|
||||
|
||||
function sortProcessNodes(nodes) {
|
||||
// 1. 创建节点映射表和子节点关系图
|
||||
const nodeMap = {};
|
||||
const childrenMap = {}; // 存储每个节点的子节点
|
||||
}
|
||||
|
||||
// 初始化
|
||||
nodes.forEach(node => {
|
||||
nodeMap[node.nodeId] = node;
|
||||
childrenMap[node.nodeId] = [];
|
||||
});
|
||||
|
||||
// 2. 构建子节点关系
|
||||
nodes.forEach(node => {
|
||||
if (node.prevPNodeId && nodeMap[node.prevPNodeId]) {
|
||||
childrenMap[node.prevPNodeId].push(node.nodeId);
|
||||
}
|
||||
});
|
||||
|
||||
// 3. 找到所有开始节点(没有prevPNodeId或prevPNodeId不在节点列表中的节点)
|
||||
const startNodes = nodes.filter(node =>
|
||||
!node.prevPNodeId || !nodeMap[node.prevPNodeId]
|
||||
);
|
||||
|
||||
// 4. 深度优先遍历生成排序列表
|
||||
const sortedNodes = [];
|
||||
const visited = new Set();
|
||||
|
||||
function traverse(nodeId) {
|
||||
if (visited.has(nodeId)) return;
|
||||
visited.add(nodeId);
|
||||
|
||||
// 添加当前节点
|
||||
sortedNodes.push(nodeMap[nodeId]);
|
||||
|
||||
// 获取所有子节点(相同prevPNodeId的节点)
|
||||
const children = childrenMap[nodeId];
|
||||
|
||||
// 对子节点按某种规则排序(如按创建时间)
|
||||
const sortedChildren = [...children].sort((a, b) => {
|
||||
return new Date(nodeMap[a].xtLrsj) - new Date(nodeMap[b].xtLrsj);
|
||||
});
|
||||
|
||||
// 递归处理每个子节点
|
||||
sortedChildren.forEach(childId => {
|
||||
traverse(childId);
|
||||
});
|
||||
function sortNodesByFlow(nodes) {
|
||||
// 找到首节点(eventType为0的节点)
|
||||
const startNode = nodes.find(node => node.eventType === "0");
|
||||
if (!startNode) {
|
||||
console.error("未找到首节点");
|
||||
return nodes;
|
||||
}
|
||||
|
||||
// 从每个开始节点开始遍历
|
||||
startNodes.forEach(node => {
|
||||
traverse(node.nodeId);
|
||||
});
|
||||
// 创建排序后的节点数组
|
||||
const sortedNodes = [startNode];
|
||||
|
||||
// 5. 处理可能的孤立节点(不应该存在,但作为保护)
|
||||
// 使用Map提高查找效率
|
||||
const nodeMap = new Map();
|
||||
nodes.forEach(node => {
|
||||
if (!visited.has(node.nodeId)) {
|
||||
sortedNodes.push(node);
|
||||
if (node.pNodeId) {
|
||||
nodeMap.set(node.pNodeId, node);
|
||||
}
|
||||
});
|
||||
|
||||
// 当前节点指针
|
||||
let currentNode = startNode;
|
||||
|
||||
// 循环查找下一个节点
|
||||
while (true) {
|
||||
// 查找下一个节点(prevPNodeId等于当前节点的pNodeId)
|
||||
const nextNode = nodes.find(node => node.prevPNodeId === currentNode.pNodeId);
|
||||
|
||||
if (!nextNode) {
|
||||
break; // 没有下一个节点,结束循环
|
||||
}
|
||||
|
||||
sortedNodes.push(nextNode);
|
||||
currentNode = nextNode;
|
||||
}
|
||||
|
||||
return sortedNodes;
|
||||
}
|
||||
|
||||
function sortNodesWithNoPreviousFirst(nodes) {
|
||||
if (!Array.isArray(nodes)) {
|
||||
console.error('参数必须是一个数组');
|
||||
@ -147,7 +108,7 @@ function sortNodesWithNoPreviousFirst(nodes) {
|
||||
if (node && node.nodeId) {
|
||||
map[node.nodeId] = node;
|
||||
}
|
||||
console.log(node,"xxxxxx");
|
||||
console.log(node, "xxxxxx");
|
||||
|
||||
return map;
|
||||
}, {});
|
||||
@ -250,9 +211,11 @@ defineExpose({
|
||||
color: #000000 !important;
|
||||
border-color: #000000 !important;
|
||||
}
|
||||
::v-deep .el-step__description{
|
||||
|
||||
::v-deep .el-step__description {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
::v-deep .el-step__description.is-wait {
|
||||
|
||||
color: #000000 !important;
|
||||
@ -296,7 +259,9 @@ defineExpose({
|
||||
|
||||
.fontColor {
|
||||
color: #1abe20;
|
||||
} .fontColorDd {
|
||||
}
|
||||
|
||||
.fontColorDd {
|
||||
color: #18a2dd;
|
||||
}
|
||||
}
|
||||
|
||||
533
src/components/flowPath/SelectingPeople copy.vue
Normal file
533
src/components/flowPath/SelectingPeople copy.vue
Normal file
@ -0,0 +1,533 @@
|
||||
<template>
|
||||
<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" /></div> -->
|
||||
</div>
|
||||
<div class="container-box">
|
||||
<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>
|
||||
<div class="reloBox">
|
||||
<div class="orgName">{{ item.userList.name }}</div>
|
||||
<el-checkbox-group v-model="item.checkList">
|
||||
<el-checkbox :label="items.userid" v-for="(items, index) in item.userList.users" :key="items.id">{{
|
||||
items.username }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<!-- <div v-if="showNode && showModel">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
|
||||
</div>
|
||||
</div> -->
|
||||
<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'
|
||||
import { splGet, splPost, submitProcess, queryUserListByRule } from '@/api/spl'
|
||||
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 InterfaceAddress = 'http://155.24.22.30:2109/mosty-api/mosty-gsxt/'
|
||||
const InterfaceAddress = 'http://192.168.0.231:8006/mosty-api/mosty-gsxt/'
|
||||
// 新增
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
//选取部门
|
||||
const orgId = ref()
|
||||
const changePostList = (index, e) => {
|
||||
orgId.value = e.fzOrgId
|
||||
chageIndex.value = index
|
||||
nodeData.value[chageIndex.value].id = e.id
|
||||
nodeData.value[chageIndex.value].orgData = {
|
||||
id: orgId.value,
|
||||
orgid: orgId.value,
|
||||
// id: '41fbffaf92a34b31bde6302004277486',
|
||||
// orgid: '41fbffaf92a34b31bde6302004277486',
|
||||
orgcode: e.orgCode,
|
||||
orgname: e.orgName
|
||||
}
|
||||
getUser()
|
||||
}
|
||||
const newUserData = ref({})
|
||||
|
||||
const transformData = (nodeData) => {
|
||||
const { userList, checkList } = nodeData;
|
||||
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));
|
||||
|
||||
}
|
||||
// 提交
|
||||
const qcckPostList = async () => {
|
||||
const data = {}
|
||||
const listError = []
|
||||
for (let i = 0; i < checkListData.value.length; i++) {
|
||||
if (checkListData.value[i].checkList && checkListData.value[i].checkList.length > 0) {
|
||||
data[checkListData.value[i].nodeId] = transformData(checkListData.value[i]);
|
||||
} else {
|
||||
listError.push(checkListData.value[i].nodeName)
|
||||
|
||||
}
|
||||
}
|
||||
if (listError.length > 0) {
|
||||
proxy.$message({ type: "warning", message: listError.join('、') + '请选择审批人' });
|
||||
return
|
||||
}
|
||||
const submitData = {
|
||||
...props.createProcess,
|
||||
flowType: "ZyCompany",
|
||||
callback: {
|
||||
"START": "",//流程开始
|
||||
"APPROVE": "",//节点审批通过
|
||||
"BACK": "",//退回上一节点
|
||||
"REVOKE": "",//撤回审批
|
||||
"DONE": `${InterfaceAddress}${props.path.byMeansOf}?id=${props.createProcess.processData.rwbh}&bkZt=05`,//流程审批通过
|
||||
"ABORT": `${InterfaceAddress}${props.path.nobyMeansOf}?id=${props.createProcess.processData.rwbh}&bkZt=06`,//审批不通过
|
||||
"RECOVER": "",//流程回收
|
||||
"AGAIN": `${InterfaceAddress}${props.path.recycle}?id=${props.createProcess.processData.rwbh}&bkZt=07`//流程退回初始
|
||||
},
|
||||
decision: JSON.stringify({
|
||||
...data,
|
||||
services: [],
|
||||
events: [],
|
||||
userData: newUserData.value,
|
||||
})
|
||||
}
|
||||
console.log(submitData);
|
||||
|
||||
submitData.processData = JSON.stringify(submitData.processData)
|
||||
submitData.callback = JSON.stringify(submitData.callback)
|
||||
await submitProcess({ ...submitData }).then(res => {
|
||||
proxy.$message({ type: "success", message: "提交审批成功" });
|
||||
sendMessage(res.rows[0])
|
||||
})
|
||||
// await emit('getList')
|
||||
// emit('close')
|
||||
// close()
|
||||
|
||||
}
|
||||
|
||||
|
||||
// const deptId = getItem('deptId')
|
||||
// let users = nodeData.value.map(item => {
|
||||
// return {
|
||||
// userId: item.userData.userId,
|
||||
// // userId: '540422200010197495',
|
||||
// userName: item.userData.userName,
|
||||
// userData: JSON.stringify(item.userData.userData)
|
||||
// // ...item.userData
|
||||
// }
|
||||
// })
|
||||
// let userData = {
|
||||
// id: deptId[0].fzOrgId,
|
||||
// orgid: deptId[0].fzOrgId,
|
||||
// // id: '41fbffaf92a34b31bde6302004277486',
|
||||
// // orgid: '41fbffaf92a34b31bde6302004277486',
|
||||
// orgcode: deptId[0].deptCode,
|
||||
// orgname: deptId[0].deptName,
|
||||
// }
|
||||
// const promes = {
|
||||
// ...props.createProcess,
|
||||
// // processData: { ...props.createProcess.processData.sqrw, orgNameData: userData },
|
||||
// flowType: "ZyCompany",
|
||||
// // iframe: `/#/${props.path.clueVerification}?id=${props.createProcess.processData.rwbh}`,
|
||||
// callback: {
|
||||
// "START": "",//流程开始
|
||||
// "APPROVE": "",//节点审批通过
|
||||
// "BACK": "",//退回上一节点
|
||||
// "REVOKE": "",//撤回审批
|
||||
// "DONE": `${InterfaceAddress}${props.path.byMeansOf}?id=${props.createProcess.processData.rwbh}&bkZt=05`,//流程审批通过
|
||||
// "ABORT": `${InterfaceAddress}${props.path.nobyMeansOf}?id=${props.createProcess.processData.rwbh}&bkZt=06`,//审批不通过
|
||||
// "RECOVER": "",//流程回收
|
||||
// "AGAIN": `${InterfaceAddress}${props.path.recycle}?id=${props.createProcess.processData.rwbh}&bkZt=07`//流程退回初始
|
||||
|
||||
// },
|
||||
// decision: JSON.stringify({
|
||||
// [modelData.value.nodeId]: {
|
||||
// users: users,
|
||||
// services: [],
|
||||
// events: [],
|
||||
// userData: JSON.stringify(userData)
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// promes.processData = JSON.stringify(promes.processData)
|
||||
// promes.callback = JSON.stringify(promes.callback)
|
||||
// console.log(promes);
|
||||
// await submitProcess({ ...promes }).then(res => {
|
||||
// proxy.$message({ type: "success", message: "提交审批成功" });
|
||||
// sendMessage(res.rows[0])
|
||||
// })
|
||||
// await emit('getList')
|
||||
// emit('close')
|
||||
// close()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//获取角色
|
||||
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
|
||||
})
|
||||
}
|
||||
const showModel = ref(true)
|
||||
//查询模板
|
||||
const modelData = ref({})
|
||||
const modelMsg = ref()
|
||||
const nodeDetails = ref({})
|
||||
const loading = ref(false)
|
||||
const flwsNode = ref({})
|
||||
const userList = ref()
|
||||
//节点审核人
|
||||
const checkList = ref()
|
||||
const endpoints = [
|
||||
'/modelVersion/queryModelVersion',
|
||||
'/modelVersion/queryModelNode',
|
||||
'/modelVersion/queryModelSequenceFlow',
|
||||
'/modelVersion/queryModelReachability'
|
||||
]
|
||||
const queryModel = async () => {
|
||||
try {
|
||||
loading.value = true
|
||||
const prrmes = {
|
||||
modelId: props.radioData,
|
||||
modelStatus: 1
|
||||
}
|
||||
const res = await splPost(prrmes, '/model/queryModel')
|
||||
if (res.rows.length > 0) {
|
||||
const resData = await Promise.all(endpoints.map(item => {
|
||||
return splPost({ modelVersionId: res.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)
|
||||
|
||||
// 如果是事件节点
|
||||
if (eventNode) {
|
||||
console.log(eventNode);
|
||||
const nodeExtension = JSON.parse(eventNode.nodeExtension)
|
||||
console.log(nodeExtension);
|
||||
modelData.value = [eventNode]
|
||||
checkList.value = modelData.value.map(item => {
|
||||
return item.nodeId
|
||||
})
|
||||
const res = await queryUserListByRule({ roles: '', posts: "", orgid: "eebefa725cb546118d6b2d17c8657ef3" })
|
||||
checkListData.value = userList.value = modelData.value.map((item, index) => {
|
||||
return { ...item, userList: res.rows[0] }
|
||||
})
|
||||
} else {
|
||||
const targetNodeId = resData[2].rows.filter(item => item.sourceNodeId == sequenceNode.targetNodeId).map(item => item.targetNodeId)
|
||||
console.log(targetNodeId);
|
||||
const targetIdSet = new Set(targetNodeId);
|
||||
modelData.value = resData[1].rows.filter(item => targetIdSet.has(item.nodeId));
|
||||
checkList.value = modelData.value.map(item => {
|
||||
return item.nodeId
|
||||
})
|
||||
const nodeExtension = modelData.value.map(item => {
|
||||
return JSON.parse(item.nodeExtension)
|
||||
})
|
||||
const roles = nodeExtension.map(item => {
|
||||
return queryUserListByRule({ roles: '', posts: "", orgid: "eebefa725cb546118d6b2d17c8657ef3" })
|
||||
})
|
||||
const a = await Promise.all(roles)
|
||||
checkListData.value = userList.value = modelData.value.map((item, index) => {
|
||||
return { ...item, userList: a[index].rows[0] }
|
||||
})
|
||||
}
|
||||
|
||||
// const targetIdSet = new Set(targetNodeId);
|
||||
// modelData.value = resData[1].rows.filter(item => targetIdSet.has(item.nodeId));
|
||||
// checkList.value = modelData.value.map(item => {
|
||||
// return item.nodeId
|
||||
// })
|
||||
|
||||
// console.log( modelData.value);
|
||||
|
||||
// const nodeExtension = modelData.value.map(item => {
|
||||
// console.log(item);
|
||||
|
||||
// return JSON.parse(item.nodeExtension)
|
||||
// })
|
||||
|
||||
// const roles = nodeExtension.map(item => {
|
||||
// return queryUserListByRule({ roles: '', posts: "", orgid: "eebefa725cb546118d6b2d17c8657ef3" })
|
||||
// })
|
||||
// console.log(roles);
|
||||
// const a = await Promise.all(roles)
|
||||
// checkListData.value = userList.value = modelData.value.map((item, index) => {
|
||||
// return { ...item, userList: a[index].rows[0] }
|
||||
// })
|
||||
|
||||
} else {
|
||||
proxy.$message({ type: "error", message: "模板不存在" });
|
||||
showModel.value = false
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
}
|
||||
// queryModelVersion(res.rows[0].currentVersionId)
|
||||
// queryModelNode(res.rows[0].currentVersionId)
|
||||
// modelMsg.value = versionRes.rows[0]
|
||||
// const nodeRes = await splPost({ modelVersionId: res.rows[0].currentVersionId }, '/modelVersion/queryModelNode')
|
||||
// if (versionRes.rows.length > 0) {
|
||||
// modelData.value = nodeRes.rows.filter(item => item.nodeType == '1')[0]
|
||||
// }
|
||||
|
||||
//发消息
|
||||
const sendMessage = (gzlid) => {
|
||||
const bkshrSfzh = nodeData.value.map(item => {
|
||||
return {
|
||||
bkshrXm: item.userData.userName,
|
||||
bkshrSfzh: item.userData.sfzh,
|
||||
bkshrSsbmmc: item.userData.userData.orgname,
|
||||
bkshrSsbmdm: item.userData.userData.orgcode,
|
||||
}
|
||||
})
|
||||
const promes = {
|
||||
xxly: '005',
|
||||
gzlid: gzlid,
|
||||
list: bkshrSfzh,
|
||||
versionId: modelMsg.value.modelVersionId,
|
||||
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':
|
||||
qcckPost(promes, '/mosty-gsxt/qbcj/updateBkgzl').then(res => {
|
||||
console.log(res);
|
||||
})
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
watch(() => props.modelValue, (val) => {
|
||||
if (val) {
|
||||
queryModel()
|
||||
}
|
||||
})
|
||||
const close = () => {
|
||||
nodeData.value = [
|
||||
{
|
||||
deptId: '',
|
||||
userId: '',
|
||||
userData: {},
|
||||
orgData: {},
|
||||
}
|
||||
]
|
||||
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 {
|
||||
// height: 300px;
|
||||
min-height: 300px;
|
||||
overflow: auto;
|
||||
// border: 1px solid rgba(172, 172, 172, 0.479);
|
||||
padding: 10px;
|
||||
max-height: 500px;
|
||||
|
||||
// border-radius: 5px;
|
||||
.row {
|
||||
margin-top: 10px;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
margin-right: 10px;
|
||||
|
||||
.select-user {
|
||||
margin: 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,31 +1,65 @@
|
||||
<template>
|
||||
<el-dialog class="dialog-container" :model-value="modelValue" :title="titles" :before-close="handleClose">
|
||||
<div class="dialog-header">
|
||||
<div class="flex align-center">下一节点:
|
||||
<el-checkbox v-model="showNode" :label="modelData.nodeName" size="large" />
|
||||
<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>
|
||||
</div>
|
||||
<div> <el-button type="success" :icon="Plus" @click="newAdditions" /></div>
|
||||
</div>
|
||||
<div class="container-box">
|
||||
<div v-if="showNode">
|
||||
<el-divider content-position="left">节点</el-divider>
|
||||
<div>
|
||||
<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 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>
|
||||
</div>
|
||||
<!-- </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>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div v-if="showNode && showModel">
|
||||
|
||||
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="close">取消</el-button>
|
||||
@ -42,7 +76,7 @@
|
||||
<script setup>
|
||||
import { ref, getCurrentInstance, reactive, watch } from 'vue'
|
||||
import { qcckGet, qcckPost } from '@/api/qcckApi'
|
||||
import { splGet, splPost, submitProcess } from '@/api/spl'
|
||||
import { splGet, splPost, submitProcess, queryUserListByRule, queryListByEntity, querysingleByEntity, queryUporgsByEntity } from '@/api/spl'
|
||||
import { getItem } from '@/utils/storage'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
@ -83,7 +117,6 @@ const props = defineProps({
|
||||
const emit = defineEmits(['update:modelValue', 'close', 'getList'])
|
||||
const titles = ref(props.title)
|
||||
const showNode = ref(true)
|
||||
const InterfaceAddress = 'http://155.2422.30:2109/mosty-api/mosty-gsxt/'
|
||||
|
||||
// 新增
|
||||
const nodeData = ref([
|
||||
@ -128,14 +161,14 @@ const changeUser = (index) => {
|
||||
}
|
||||
}
|
||||
//选取部门
|
||||
const orgId=ref()
|
||||
const orgId = ref()
|
||||
const changePostList = (index, e) => {
|
||||
orgId.value=e.fzOrgId
|
||||
orgId.value = e.fzOrgId
|
||||
chageIndex.value = index
|
||||
nodeData.value[chageIndex.value].id = orgId.value
|
||||
nodeData.value[chageIndex.value].id = e.id
|
||||
nodeData.value[chageIndex.value].orgData = {
|
||||
id:orgId.value,
|
||||
orgid:orgId.value,
|
||||
id: orgId.value,
|
||||
orgid: orgId.value,
|
||||
// id: '41fbffaf92a34b31bde6302004277486',
|
||||
// orgid: '41fbffaf92a34b31bde6302004277486',
|
||||
orgcode: e.orgCode,
|
||||
@ -143,56 +176,114 @@ const changePostList = (index, e) => {
|
||||
}
|
||||
getUser()
|
||||
}
|
||||
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));
|
||||
|
||||
}
|
||||
// 提交
|
||||
const qcckPostList = async () => {
|
||||
const deptId = getItem('deptId')
|
||||
let users = nodeData.value.map(item => {
|
||||
return {
|
||||
userId: item.userData.userId,
|
||||
// userId: '540422200010197495',
|
||||
userName: item.userData.userName,
|
||||
userData: JSON.stringify(item.userData.userData)
|
||||
// ...item.userData
|
||||
}
|
||||
})
|
||||
let userData = {
|
||||
id:deptId[0].fzOrgId,
|
||||
orgid:deptId[0].fzOrgId,
|
||||
// id: '41fbffaf92a34b31bde6302004277486',
|
||||
// orgid: '41fbffaf92a34b31bde6302004277486',
|
||||
orgcode: deptId[0].deptCode,
|
||||
orgname: deptId[0].deptName,
|
||||
}
|
||||
const promes = {
|
||||
...props.createProcess,
|
||||
// processData: { ...props.createProcess.processData.sqrw, orgNameData: userData },
|
||||
flowType: "ZyCompany",
|
||||
iframe: `${props.path.clueVerification}?id=${props.createProcess.processData.rwbh}`,
|
||||
callback: {
|
||||
"START": "",//流程开始
|
||||
"APPROVE": "",//节点审批通过
|
||||
"BACK": "",//退回上一节点
|
||||
"REVOKE": "",//撤回审批
|
||||
"DONE": `${InterfaceAddress}${props.path.byMeansOf}?id=${props.createProcess.rwbh}&bkZt=05`,//流程审批通过
|
||||
"ABORT": `${InterfaceAddress}${props.path.nobyMeansOf}?id=${props.createProcess.rwbh}&bkZt=06`,//审批不通过
|
||||
"RECOVER": "",//流程回收
|
||||
"AGAIN": `${InterfaceAddress}${props.path.recycle}?id=${props.createProcess.rwbh}&bkZt=07`//流程退回初始
|
||||
const data = {}
|
||||
const listError = []
|
||||
for (let i = 0; i < checkListData.value.length; i++) {
|
||||
|
||||
},
|
||||
decision: JSON.stringify({
|
||||
[modelData.value.nodeId]: {
|
||||
users: users,
|
||||
services: [],
|
||||
events: [],
|
||||
userData: JSON.stringify(userData)
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
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 = {
|
||||
...props.createProcess,
|
||||
decision: JSON.stringify({
|
||||
...data,
|
||||
services: [],
|
||||
events: [],
|
||||
userData: newUserData.value,
|
||||
})
|
||||
}
|
||||
promes.processData = JSON.stringify(promes.processData)
|
||||
promes.callback = JSON.stringify(promes.callback)
|
||||
console.log(promes);
|
||||
|
||||
await submitProcess({ ...promes }).then(res => {
|
||||
submitData.processData = JSON.stringify(submitData.processData)
|
||||
await submitProcess({ ...submitData }).then(res => {
|
||||
proxy.$message({ type: "success", message: "提交审批成功" });
|
||||
sendMessage(res.rows[0])
|
||||
})
|
||||
@ -200,6 +291,7 @@ const qcckPostList = async () => {
|
||||
emit('close')
|
||||
close()
|
||||
}
|
||||
|
||||
//获取角色
|
||||
const getUser = () => {
|
||||
const promes = {
|
||||
@ -210,38 +302,268 @@ const getUser = () => {
|
||||
nodeData.value[chageIndex.value].listData = res.records
|
||||
})
|
||||
}
|
||||
const showModel = ref(true)
|
||||
//查询模板
|
||||
const modelData = ref({})
|
||||
const modelMsg = ref()
|
||||
const loading = ref(false)
|
||||
const userList = ref()
|
||||
//节点审核人
|
||||
const checkList = ref()
|
||||
const endpoints = [
|
||||
'/modelVersion/queryModelVersion',
|
||||
'/modelVersion/queryModelNode',
|
||||
'/modelVersion/queryModelSequenceFlow',
|
||||
'/modelVersion/queryModelReachability'
|
||||
]
|
||||
const queryModel = async () => {
|
||||
const prrmes = {
|
||||
modelId: props.radioData,
|
||||
modelStatus: 1
|
||||
}
|
||||
const res = await splPost(prrmes, '/model/queryModel')
|
||||
const versionRes = await splPost({ modelVersionId: res.rows[0].currentVersionId }, '/modelVersion/queryModelVersion')
|
||||
modelMsg.value = versionRes.rows[0]
|
||||
const nodeRes = await splPost({ modelVersionId: res.rows[0].currentVersionId }, '/modelVersion/queryModelNode')
|
||||
if (versionRes.rows.length > 0) {
|
||||
modelData.value = nodeRes.rows.filter(item => item.nodeType == '1')[0]
|
||||
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
|
||||
)
|
||||
const orgId = 'a8aa5ed229724b278faa7abd0f0cceb6'
|
||||
// getItem('userOrg').parentid
|
||||
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
|
||||
}
|
||||
}
|
||||
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: ""
|
||||
}
|
||||
if (nodeExtension.flwsUserNode.orgType == 'brothers') {
|
||||
orgData = await queryListByEntity({ id: orgId })
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'parent') {
|
||||
orgData = await querysingleByEntity({ id: orgId })
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'parents') {
|
||||
orgData = await queryUporgsByEntity({ id: orgId })
|
||||
} else if (nodeExtension.flwsUserNode.orgType == 'appoint') {
|
||||
// orgData = await queryUporgsByEntity({ orgcode: orgId })
|
||||
}
|
||||
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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// 处理普通节点
|
||||
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') {
|
||||
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;
|
||||
}
|
||||
//发消息
|
||||
const sendMessage = (gzlid) => {
|
||||
const bkshrSfzh = nodeData.value.map(item => {
|
||||
return {
|
||||
bkshrXm: item.userData.userName,
|
||||
bkshrSfzh: item.userData.sfzh,
|
||||
bkshrSsbmmc: item.userData.userData.orgname,
|
||||
bkshrSsbmdm: item.userData.userData.orgcode,
|
||||
let letDataCheck = []
|
||||
let userList = []
|
||||
console.log(checkListData.value);
|
||||
|
||||
for (let i = 0; i < checkListData.value.length; i++) {
|
||||
letDataCheck = [...letDataCheck, ...checkListData.value[i].checkList]
|
||||
userList.push(checkListData.value[i].userList)
|
||||
}
|
||||
console.log(letDataCheck);
|
||||
console.log(userList);
|
||||
const bkshrSfzh = filterUsersWithOrgInfo(userList, letDataCheck).map(item => {
|
||||
return {
|
||||
bkshrXm: item.username,
|
||||
bkshrSfzh: item.userid,
|
||||
bkshrSsbmmc: item.orgName,
|
||||
bkshrSsbmdm: item.orgCode,
|
||||
}
|
||||
})
|
||||
const promes = {
|
||||
xxly: '005',
|
||||
gzlid: gzlid,
|
||||
list: bkshrSfzh,
|
||||
versionId: modelMsg.value.modelVersionId,
|
||||
versionId: checkListData.value[0].modelVersionId,
|
||||
id: props.createProcess.processData.rwbh
|
||||
}
|
||||
switch (props.userData.flowType) {
|
||||
@ -251,13 +573,12 @@ const sendMessage = (gzlid) => {
|
||||
})
|
||||
break;
|
||||
case 'ZDRYSDFJDP':
|
||||
|
||||
qcckPost(promes, '/mosty-gsxt/tbGsxtRqfjRy/updateBkgzl').then(res => {
|
||||
console.log(res);
|
||||
})
|
||||
break;
|
||||
case 'XSSJCJSP':
|
||||
qcckPost(promes, '/mosty-gsxt/qbcj/updateBkgzl').then(res => {
|
||||
qcckPost(promes, '/mosty-gsxt/qbcj/updateBkgzl').then(res => {
|
||||
console.log(res);
|
||||
})
|
||||
break;
|
||||
@ -278,6 +599,7 @@ const close = () => {
|
||||
orgData: {},
|
||||
}
|
||||
]
|
||||
optional.value=false
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
</script>
|
||||
@ -299,9 +621,14 @@ const close = () => {
|
||||
}
|
||||
|
||||
.container-box {
|
||||
height: 300px;
|
||||
// height: 300px;
|
||||
min-height: 300px;
|
||||
overflow: auto;
|
||||
// border: 1px solid rgba(172, 172, 172, 0.479);
|
||||
padding: 10px;
|
||||
max-height: 500px;
|
||||
|
||||
// border-radius: 5px;
|
||||
.row {
|
||||
margin-top: 10px;
|
||||
align-items: center;
|
||||
@ -312,5 +639,22 @@ const close = () => {
|
||||
margin: 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
<template>
|
||||
<el-dialog class="dialog-container" :model-value="modelValue" :title="title" :before-close="close">
|
||||
|
||||
<div style="height: 300px;overflow: auto" v-infinite-scroll="load">
|
||||
<el-radio-group v-model="radio" @change="changeRadio" v-if="lyquery.rows.length > 0">
|
||||
<el-radio :label="item.modelId" v-for="(item) in lyquery.rows" :key="item.id">
|
||||
@ -7,10 +8,9 @@
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
<div class="ww100 flex just-center">
|
||||
<MOSTY.Empty :show="lyquery.rows.length == 0"></MOSTY.Empty>
|
||||
</div>
|
||||
<MOSTY.Empty :show="lyquery.rows.length == 0"></MOSTY.Empty>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="close">取消</el-button>
|
||||
@ -21,8 +21,8 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<SelectingPeople v-model="showDialog"
|
||||
:createProcess="createProcess" @close="close" :radioData="radioData" :path="path" @getList="emit('getList')" :userData="userData"/>
|
||||
<SelectingPeople v-model="showDialog" :createProcess="createProcess" @close="close" :radioData="radioData"
|
||||
:path="path" @getList="emit('getList')" :userData="userData" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -30,6 +30,8 @@ import { ref, getCurrentInstance, reactive, watch } from 'vue'
|
||||
import SelectingPeople from './SelectingPeople.vue';
|
||||
import * as MOSTY from "@/components/MyComponents/index";
|
||||
import { splGet, splPost } from '@/api/spl'
|
||||
import { qcckGet } from '@/api/qcckApi'
|
||||
import { getItem,setItem } from '@/utils/storage'
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
@ -55,15 +57,17 @@ const props = defineProps({
|
||||
})
|
||||
|
||||
const showDialog = ref(false)
|
||||
const emit = defineEmits(['update:modelValue','getList'])
|
||||
const emit = defineEmits(['update:modelValue', 'getList'])
|
||||
const titles = ref(props.title)
|
||||
const deptId=getItem('deptId')
|
||||
const lyquery = reactive({
|
||||
rows: [],
|
||||
total: 0,
|
||||
promes: {
|
||||
page: 1,
|
||||
rows: 100,
|
||||
modelName:props.userData.modelName
|
||||
// orgCode:deptId[0].orgCode
|
||||
modelName: props.userData.modelName
|
||||
}
|
||||
|
||||
})
|
||||
@ -78,13 +82,28 @@ const qcckGetList = () => {
|
||||
lyquery.total = res.total
|
||||
})
|
||||
}
|
||||
const Sfzh = getItem('idEntityCard')
|
||||
const qcckGetCount = () => {
|
||||
if (!getItem('cookie') ) {
|
||||
qcckGet({ sfzh: Sfzh },'/mosty-base/fzmsg/getCokie').then(res => {
|
||||
document.cookie = res.cookie
|
||||
setItem('userOrg',res.userOrg)
|
||||
qcckGetList()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
watch(() => props.modelValue, (newVal) => {
|
||||
if (newVal) {
|
||||
qcckGetList()
|
||||
qcckGetCount()
|
||||
}
|
||||
})
|
||||
const createProcess = ref({})
|
||||
const radioData = ref('')
|
||||
// const InterfaceAddress = 'http://192.168.0.231:8006/mosty-api/mosty-gsxt/'
|
||||
// const InterfaceAddress = 'http://192.168.0.231:8006/mosty-api/mosty-gsxt/'
|
||||
// const InterfaceAddress = 'http://155.540.22.30:50037/mosty-api/mosty-gsxt/'
|
||||
const InterfaceAddress = 'http://192.168.1.32:8006/mosty-api/mosty-gsxt/'
|
||||
const changeRadio = (e) => {
|
||||
radioData.value = e
|
||||
const item = lyquery.rows.find(item => item.modelId == e)
|
||||
@ -92,14 +111,26 @@ const changeRadio = (e) => {
|
||||
createProcess.value = {
|
||||
modelId: e,
|
||||
processName: item.modelName ? item.modelName : '',
|
||||
processType:1,
|
||||
processType: 1,
|
||||
processData:
|
||||
{
|
||||
iframe: `${props.path.clueVerification}?id=${props.data.id}`,
|
||||
iframe: `#/${props.path.clueVerification}?id=${props.data.id}`,
|
||||
hostPrefix: "sgxtPath",
|
||||
rwbh: props.data.id,
|
||||
flowType: 'SGSP',
|
||||
sqrw: props.data,
|
||||
ajmc: props.userData.ajmc,
|
||||
// flowType: "ZyCompany",
|
||||
callback: {
|
||||
"START": "",//流程开始
|
||||
"APPROVE": "",//节点审批通过
|
||||
"BACK": "",//退回上一节点
|
||||
"REVOKE": "",//撤回审批
|
||||
"DONE": `${InterfaceAddress}${props.path.byMeansOf}?id=${props.data.id}&bkZt=05`,//流程审批通过
|
||||
"ABORT": `${InterfaceAddress}${props.path.nobyMeansOf}?id=${props.data.id}&bkZt=06`,//审批不通过
|
||||
"RECOVER": "",//流程回收
|
||||
"AGAIN": `${InterfaceAddress}${props.path.recycle}?id=${props.data.id}&bkZt=07`//流程退回初始
|
||||
},
|
||||
}
|
||||
|
||||
}
|
||||
@ -120,7 +151,7 @@ const load = () => {
|
||||
}
|
||||
|
||||
const close = () => {
|
||||
radio.value=''
|
||||
radio.value = ''
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user