hookehuyr

新增流程排序保存功能

...@@ -302,6 +302,12 @@ ...@@ -302,6 +302,12 @@
302 <span style="font-size: 12px; transform: scale(0.8); margin-top: 2px;">复制</span> 302 <span style="font-size: 12px; transform: scale(0.8); margin-top: 2px;">复制</span>
303 </div> 303 </div>
304 </el-tooltip> 304 </el-tooltip>
305 + <el-tooltip content="节点排序">
306 + <div class="vue-flow-editor-toolbar-item" @click="sortData">
307 + <i class="el-icon-sort" style=" margin-top: 4px;" />
308 + <span style="font-size: 12px; transform: scale(0.8); margin-top: 2px;">排序</span>
309 + </div>
310 + </el-tooltip>
305 <!-- <el-tooltip content="保存流程图数据"> 311 <!-- <el-tooltip content="保存流程图数据">
306 <div class="vue-flow-editor-toolbar-item" @click="saveData"> 312 <div class="vue-flow-editor-toolbar-item" @click="saveData">
307 <i class="el-icon-coin" style=" margin-top: 4px;" /> 313 <i class="el-icon-coin" style=" margin-top: 4px;" />
...@@ -440,6 +446,34 @@ ...@@ -440,6 +446,34 @@
440 @close="onCloseUserView" 446 @close="onCloseUserView"
441 @confirm="onConfirmUserView" 447 @confirm="onConfirmUserView"
442 /> 448 />
449 +
450 + <el-dialog v-model="state.dialogSortVisible" title="节点排序" width="30%" center>
451 + <draggable
452 + v-model="state.sortNodes"
453 + tag="transition-group"
454 + item-key="id"
455 + style="overflow: scroll;"
456 + :component-data="{name:'fade'}"
457 + >
458 + <template #item="{ element, index }">
459 + <div :class="['sort-item', state.sortNodes.length - 1 !== index ? 'sort-item-border' : '' ]">
460 + <div>
461 + <i class="el-icon-d-caret"></i>
462 + &nbsp;
463 + {{ element.name }}
464 + &nbsp;
465 + <span class="sort-item-index">索引:{{element.idx}}</span>&nbsp;
466 + </div>
467 + </div>
468 + </template>
469 + </draggable>
470 + <template #footer>
471 + <span class="dialog-footer">
472 + <el-button @click="state.dialogSortVisible = false">取消</el-button>
473 + <el-button color="#009688" @click="confirmSort">确认</el-button>
474 + </span>
475 + </template>
476 + </el-dialog>
443 </template> 477 </template>
444 478
445 <script lang="ts"> 479 <script lang="ts">
...@@ -459,7 +493,8 @@ import type { FormInstance, FormRules } from 'element-plus' ...@@ -459,7 +493,8 @@ import type { FormInstance, FormRules } from 'element-plus'
459 import qs from 'qs' 493 import qs from 'qs'
460 import { after } from 'lodash-es'; 494 import { after } from 'lodash-es';
461 // import { VueSpinner } from 'vue3-spinners'; 495 // import { VueSpinner } from 'vue3-spinners';
462 -import { flowVersionAPI, saveFlowAPI, flowNodesAPI, enableFlowVersionAPI, flowNodePropertyAPI, checkAllFlowNodePropertyAPI, saveAllFlowNodePropertyAPI } from "./api"; 496 +import { flowVersionAPI, saveFlowAPI, flowNodesAPI, enableFlowVersionAPI, flowNodePropertyAPI, checkAllFlowNodePropertyAPI, saveAllFlowNodePropertyAPI, saveNodeSortAPI } from "./api";
497 +import draggable from 'vuedraggable'
463 498
464 const G6 = (window as any).G6.default as any 499 const G6 = (window as any).G6.default as any
465 500
...@@ -499,6 +534,7 @@ export default { ...@@ -499,6 +534,7 @@ export default {
499 Calendar, 534 Calendar,
500 Search, 535 Search,
501 SelectUserView, 536 SelectUserView,
537 + draggable,
502 // VueSpinner, 538 // VueSpinner,
503 }, 539 },
504 setup(props, context) { 540 setup(props, context) {
...@@ -565,7 +601,9 @@ export default { ...@@ -565,7 +601,9 @@ export default {
565 }, 601 },
566 }, 602 },
567 search_auth_value: '', 603 search_auth_value: '',
604 + dialogSortVisible: false,
568 dialogUserFormVisible: false, 605 dialogUserFormVisible: false,
606 + sortNodes: [],
569 dialogUserTags: [], // 同步到用户列表的数据 607 dialogUserTags: [], // 同步到用户列表的数据
570 activeName: 'node', 608 activeName: 'node',
571 attr_radio: '基础属性', 609 attr_radio: '基础属性',
...@@ -1927,6 +1965,49 @@ export default { ...@@ -1927,6 +1965,49 @@ export default {
1927 const model = e.item.get('model') 1965 const model = e.item.get('model')
1928 } 1966 }
1929 1967
1968 + /**
1969 + * 排序节点
1970 + *
1971 + */
1972 + const sortData = () => {
1973 + state.sortNodes = [];
1974 + let { nodes } = editor.editorState.graph.save();
1975 + // console.warn(nodes);
1976 + // let data = [
1977 + // '1f6b88b0-b864-47bc-8903-c72e5014ac75',
1978 + // '5e22f525-1d02-4456-8d3e-0d088f99f9d6',
1979 + // 'end-node',
1980 + // 'start-node',
1981 + // ];
1982 + // let node_data = _.map(data, (n) => { return { id: n } });
1983 +
1984 + // let node_arr = _.intersectionBy(node_data, nodes, 'id');
1985 + // let new_node_arr = _.differenceBy(node_data, nodes, 'id');
1986 + // console.warn(node_arr);
1987 + // console.warn(new_node_arr);
1988 +
1989 + if (nodes.length > 0) {
1990 + nodes.forEach((element, idx) => {
1991 + state.sortNodes.push({
1992 + idx,
1993 + id: element.id,
1994 + name: element.text,
1995 + })
1996 + });
1997 + }
1998 + state.dialogSortVisible = true;
1999 + }
2000 +
2001 + const confirmSort = async () => {
2002 + state.dialogSortVisible = false;
2003 +
2004 + let arr = _.map(state.sortNodes, 'id');
2005 + const { code, data } = await saveNodeSortAPI({ id: getFlowId(), data: JSON.stringify(arr) })
2006 + if (code) {
2007 + ElNotification.success('保存成功')
2008 + }
2009 + }
2010 +
1930 const copyData = () => { // 复制节点回调 2011 const copyData = () => { // 复制节点回调
1931 if (state.detailModel.control !== 'start' && state.detailModel.control !== 'end') { 2012 if (state.detailModel.control !== 'start' && state.detailModel.control !== 'end') {
1932 let copy_node = _.cloneDeep(state.node_tree[state.detailModel.id]); // 复制节点的属性 2013 let copy_node = _.cloneDeep(state.node_tree[state.detailModel.id]); // 复制节点的属性
...@@ -2129,6 +2210,8 @@ export default { ...@@ -2129,6 +2210,8 @@ export default {
2129 onCloseUserView, 2210 onCloseUserView,
2130 onConfirmUserView, 2211 onConfirmUserView,
2131 2212
2213 + sortData,
2214 + confirmSort,
2132 copyData, 2215 copyData,
2133 saveData, 2216 saveData,
2134 startFlow, 2217 startFlow,
...@@ -2391,4 +2474,16 @@ body { ...@@ -2391,4 +2474,16 @@ body {
2391 .el-tabs__item:hover { 2474 .el-tabs__item:hover {
2392 color: #009688 !important; 2475 color: #009688 !important;
2393 } 2476 }
2477 +
2478 +.sort-item {
2479 + padding: 1rem; border: 1px solid #ebeef5; cursor: move;
2480 + background-color: #fff;
2481 + .sort-item-index {
2482 + background-color: #f5f6f8; padding: 2px 5px; border: 1px solid #d7d9dc; border-radius: 3px; color: #141e31; font-size: 12px; font-weight: 400; line-height: 22px; text-align: center;
2483 + }
2484 +}
2485 +.sort-item-border {
2486 + border-bottom: 0 !important;
2487 +}
2488 +
2394 </style> 2489 </style>
......
1 /* 1 /*
2 * @Date: 2023-11-30 10:34:01 2 * @Date: 2023-11-30 10:34:01
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2023-12-08 13:11:15 4 + * @LastEditTime: 2023-12-14 15:43:53
5 * @FilePath: /vue-flow-editor/doc/api/index.js 5 * @FilePath: /vue-flow-editor/doc/api/index.js
6 * @Description: 文件描述 6 * @Description: 文件描述
7 */ 7 */
...@@ -16,6 +16,7 @@ const Api = { ...@@ -16,6 +16,7 @@ const Api = {
16 SAVE_FLOW_NODE_PROPERTY: '/admin/?a=save_node_property', 16 SAVE_FLOW_NODE_PROPERTY: '/admin/?a=save_node_property',
17 SAVE_ALL_FLOW_NODE_PROPERTY: '/admin/?a=save_all_node_property', 17 SAVE_ALL_FLOW_NODE_PROPERTY: '/admin/?a=save_all_node_property',
18 CHECK_ALL_FLOW_NODE_PROPERTY: '/admin/?a=check_all_node_property', 18 CHECK_ALL_FLOW_NODE_PROPERTY: '/admin/?a=check_all_node_property',
19 + SAVE_NODE_SORT: '/admin/?a=save_node_sort',
19 } 20 }
20 21
21 /** 22 /**
...@@ -81,3 +82,10 @@ export const saveAllFlowNodePropertyAPI = (params) => fn(fetch.stringifyPost(Api ...@@ -81,3 +82,10 @@ export const saveAllFlowNodePropertyAPI = (params) => fn(fetch.stringifyPost(Api
81 * @returns 82 * @returns
82 */ 83 */
83 export const checkAllFlowNodePropertyAPI = (params) => fn(fetch.get(Api.CHECK_ALL_FLOW_NODE_PROPERTY, params)); 84 export const checkAllFlowNodePropertyAPI = (params) => fn(fetch.get(Api.CHECK_ALL_FLOW_NODE_PROPERTY, params));
85 +
86 +/**
87 + * @description: 保存节点排序
88 + * @param {*} id 流程 ID
89 + * @returns
90 + */
91 +export const saveNodeSortAPI = (params) => fn(fetch.stringifyPost(Api.SAVE_NODE_SORT, params));
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
38 "vue-router": "^4.0.0-0", 38 "vue-router": "^4.0.0-0",
39 "vue-template-compiler": "^2.6.14", 39 "vue-template-compiler": "^2.6.14",
40 "vue3-spinners": "^1.2.2", 40 "vue3-spinners": "^1.2.2",
41 + "vuedraggable": "^4.1.0",
41 "vuex": "^4.0.0-0" 42 "vuex": "^4.0.0-0"
42 }, 43 },
43 "devDependencies": { 44 "devDependencies": {
......
1 +#!/usr/bin/env sh
2 +# -----------------------------------------------
3 +# Filename: publish.sh
4 +# Revision: 1.0
5 +# Date: 2022年5月20日
6 +# Author: Hooke
7 +# Description: **** 根据php项目相应特征书写项目发布流程
8 +# -----------------------------------------------
9 +
10 +# 当发生错误时中止脚本
11 +set -e
12 +
13 +# 本地Git服务器目录路径
14 +PHP_PATH=/Users/huyirui/program/itomix/git/isp/f/custom_form
15 +
16 +# 编译输出文件夹
17 +OUTPUT=front
18 +
19 +# 打包
20 +npm run build
21 +
22 +# 移除Git服务器目录下项目文件夹
23 +rm -r $PHP_PATH"/${OUTPUT:?}"
24 +
25 +# 把本地编译输出文件夹添加到服务器目录
26 +mv "${OUTPUT:?}/" $PHP_PATH
27 +
28 +# 提交到Git服务器
29 +cd $PHP_PATH"/${OUTPUT:?}"
30 +git checkout custom_form
31 +git pull
32 +git add -A
33 +git commit -m '自定义表单-前端网页更新'
34 +git push
35 +
36 +git checkout develop;
37 +git pull origin develop;
38 +git merge --no-edit custom_form;
39 +git push origin develop;
40 +
41 +# 更新SSH服务器上文件
42 +ssh -p 22 itomix@ipadbiz.cn '
43 + cd /opt/space-dev/;
44 + git pull origin develop;
45 +'
46 +
47 +git checkout custom_form;
...@@ -7868,6 +7868,11 @@ sort-keys@^1.0.0: ...@@ -7868,6 +7868,11 @@ sort-keys@^1.0.0:
7868 dependencies: 7868 dependencies:
7869 is-plain-obj "^1.0.0" 7869 is-plain-obj "^1.0.0"
7870 7870
7871 +sortablejs@1.14.0:
7872 + version "1.14.0"
7873 + resolved "https://mirrors.cloud.tencent.com/npm/sortablejs/-/sortablejs-1.14.0.tgz#6d2e17ccbdb25f464734df621d4f35d4ab35b3d8"
7874 + integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==
7875 +
7871 source-list-map@^2.0.0: 7876 source-list-map@^2.0.0:
7872 version "2.0.1" 7877 version "2.0.1"
7873 resolved "https://registry.nlark.com/source-list-map/download/source-list-map-2.0.1.tgz" 7878 resolved "https://registry.nlark.com/source-list-map/download/source-list-map-2.0.1.tgz"
...@@ -8840,6 +8845,13 @@ vue@^3.0.0: ...@@ -8840,6 +8845,13 @@ vue@^3.0.0:
8840 "@vue/runtime-dom" "3.2.2" 8845 "@vue/runtime-dom" "3.2.2"
8841 "@vue/shared" "3.2.2" 8846 "@vue/shared" "3.2.2"
8842 8847
8848 +vuedraggable@^4.1.0:
8849 + version "4.1.0"
8850 + resolved "https://mirrors.cloud.tencent.com/npm/vuedraggable/-/vuedraggable-4.1.0.tgz#edece68adb8a4d9e06accff9dfc9040e66852270"
8851 + integrity sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==
8852 + dependencies:
8853 + sortablejs "1.14.0"
8854 +
8843 vuex@^4.0.0-0: 8855 vuex@^4.0.0-0:
8844 version "4.0.2" 8856 version "4.0.2"
8845 resolved "https://registry.nlark.com/vuex/download/vuex-4.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvuex%2Fdownload%2Fvuex-4.0.2.tgz" 8857 resolved "https://registry.nlark.com/vuex/download/vuex-4.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvuex%2Fdownload%2Fvuex-4.0.2.tgz"
......