From 0cd35d78a4edc361d377370bbc85417215610a67 Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期二, 02 七月 2024 10:41:00 +0800
Subject: [PATCH] 启动流程展示样式更改 添加启动流程节点选择穿梭框 调试模板查询 节点查询 启用流程默认接口

---
 Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue |   79 ++++++-----
 Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue   |  261 +++++++++++++++++++++++++++---------
 Source/plt-web/plt-web-ui/src/views/system/user/index.vue                 |    7 
 Source/plt-web/plt-web-ui/src/api/base/startWork/index.js                 |   22 +++
 4 files changed, 262 insertions(+), 107 deletions(-)

diff --git a/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js b/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js
index 102dc35..265f67a 100644
--- a/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js
+++ b/Source/plt-web/plt-web-ui/src/api/base/startWork/index.js
@@ -18,3 +18,25 @@
     params: params,
   });
 }
+
+//鍚姩娴佺▼
+export const startProcess = (params) => {
+  let formData = new FormData()
+  for (let key in params) {
+    // 濡傛灉鏄� nodeUsers 瀵硅薄锛屽垯鐗规畩澶勭悊
+    if (key === 'nodeUsers' && typeof params[key] === 'object' && params[key] !== null) {
+      for (let innerKey in params[key]) {
+        formData.append(`${key}[${innerKey}]`, params[key][innerKey]);
+      }
+    } else {
+      // 闈瀗odeUsers灞炴�э紝鐩存帴娣诲姞鍒� formData 涓�
+      formData.append(key.replaceAll('"', ''), params[key]);
+    }
+  }
+  return request({
+    url: '/api/processDefineController/startProcess',
+    method: 'post',
+    data:formData
+  });
+}
+
diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
index 8afee4f..68f7a40 100644
--- a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
+++ b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
@@ -1,59 +1,59 @@
 <template>
-    <el-dialog
-      v-dialogDrag
-      :close-on-click-modal="false"
-      :destroy-on-close="true"
-      :title="title"
-      :visible.sync="visible"
-      append-to-body="true"
-      class="avue-dialog"
-      style="text-align: center"
-      width="40%"
-      @close="dialogClose">
-      <el-transfer
-        v-model="rightRoleData"
-        v-loading="loading"
-        :data="data"
-        :filter-method="filterMethod"
-        :render-content="renderFunc"
-        :titles="['鐜版湁瑙掕壊', '鎷ユ湁瑙掕壊']"
-        filter-placeholder="瑙掕壊鍚嶇О鎼滅储"
-        filterable
-        style="text-align: left; display: inline-block;">
-      </el-transfer>
-      <span slot="footer" class="dialog-footer">
-    <el-button @click="visible = false">鍙� 娑�</el-button>
-    <el-button type="primary" @click="sendHandler">纭� 瀹�</el-button>
-  </span>
-    </el-dialog>
+  <el-dialog
+    v-dialogDrag
+    :close-on-click-modal="false"
+    :destroy-on-close="true"
+    :title="title"
+    :visible.sync="visible"
+    append-to-body="true"
+    class="avue-dialog"
+    style="text-align: center"
+    width="50%"
+    @close="dialogClose">
+    <el-transfer
+      v-model="rightRoleData"
+      v-loading="loading"
+      :data="data"
+      :filter-method="filterMethod"
+      :render-content="renderFunc"
+      :titles="transferTitle"
+      filter-placeholder="鍏抽敭璇嶆悳绱�"
+      filterable
+      style="text-align: left; display: inline-block;">
+    </el-transfer>
+    <div slot="footer" class="dialog-footer">
+      <div class="valueInfo" v-if="bottomValue">宸茶缃殑鍊间负锛歔{{bottomValue}}]</div>
+      <el-button @click="visible = false" size="small">鍙� 娑�</el-button>
+      <el-button type="primary" @click="sendHandler" size="small">纭� 瀹�</el-button>
+    </div>
+  </el-dialog>
 </template>
 
 <script>
 export default {
   name: "transfer",
-  props: ['title', 'leftRoleData', 'rightRoleData'],
+  props: ['title', 'leftRoleData', 'rightRoleData', 'transferTitle' , 'bottomValue'],
   data() {
     return {
       visible: false, // 閫氳繃 this.$refs.transfer.visible = true; 寮�鍚瓙缁勪欢瀵硅瘽妗�
       data: [],
-      value: [],
       loading: false,
       filterMethod(query, item) {
         return item.label.indexOf(query) > -1;
       },
       renderFunc(h, option) {
-        return <span><i class="el-icon-s-custom"></i> { option.label }</span>;
+        return <span><i class="el-icon-s-custom"></i> {option.label}</span>;
       }
     }
   },
   watch: {
     //娓叉煋绌挎妗�
     leftRoleData: {
-      handler(newval, oldval) {
+      handler(newval) {
         if (newval) {
           // 娓呯┖data鏁扮粍
           this.data = [];
-          newval.forEach((city, index) => {
+          newval.forEach((city) => {
             this.data.push({
               label: city.name,
               key: city.oid,
@@ -82,11 +82,20 @@
 </script>
 
 <style lang="scss" scoped>
-/deep/ .el-transfer-panel{ /* 宸﹀彸涓や釜绌挎妗嗙殑楂樺害鍜屽搴� */
-  height: 450px;
+/deep/ .el-transfer-panel {
+  height: 450px; /* 宸﹀彸涓や釜绌挎妗嗙殑楂樺害鍜屽搴� */
+  width: 300px;
 }
+
 /deep/ .el-transfer-panel__list.is-filterable {
   height: 323px; /* 绌挎妗嗗垪琛ㄩ珮搴� */
 }
-
+.valueInfo{
+  float: left;
+  border: 1px solid #E9E7E7;
+  display: inline-block;
+  vertical-align: middle;
+  padding: 6px 12px;
+  line-height: 1;
+}
 </style>
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue b/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue
index ac10977..7b1d72e 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/startWorkFlow.vue
@@ -6,14 +6,18 @@
              :width="width"
              append-to-body="true"
              class="avue-dialog"
-             style="margin-top: -10% !important;"
              title="鍚姩娴佺▼"
-             top="0"
              @close="dialogClose">
 
-    <el-form :model="saveParam" :rules="rules" class="demo-form-inline" label-position="left" label-width="auto">
+    <el-divider content-position="left">娴佺▼淇℃伅</el-divider>
+
+    <el-form ref="nodeForm" :model="saveParam" :rules="rules" class="demo-form-inline" label-position="left"
+             label-width="auto">
       <el-form-item label="娴佺▼妯℃澘">
-        <el-input v-model="saveParam.modelName" disabled placeholder="娴佺▼妯℃澘"></el-input>
+        <el-select v-model="saveParam.processTemplate" filterable style="width: 100%;" @change="proTemSelect($event)">
+          <el-option v-for="(item, key) in processTemplateList" :key="key" :label="item.value"
+                     :value="item.value"></el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="娴佺▼鍚嶇О" prop="processName">
         <el-input v-model="saveParam.processName" placeholder="娴佺▼鍚嶇О">
@@ -25,30 +29,33 @@
       </el-form-item>
     </el-form>
 
-    <el-divider></el-divider>
-    <!--    <div class="btns-icon">-->
-    <!--      <el-button circle icon="el-icon-star-off" @click="handleCollect"></el-button>-->
-    <!--    </div>-->
-    <el-form :model="collectParam" class="demo-form-inline" label-position="left" label-width="auto">
-      <el-form-item v-for="(item, index) in initFrom" :key="index" :label="`鑺傜偣${index + 1}`">
-        <el-select style="width: 100%;" filterable v-model="collectParam.flowTaskUsers[index]['userId']"
-                   :placeholder="item.value" @change="handleSelect($event, index)">
-          <el-option :label="key.name" :value="key.name" v-for="(key, keyi) in item.processNodes"
-                     :key="keyi"></el-option>
-        </el-select>
+    <el-divider content-position="left">娴佺▼鑺傜偣</el-divider>
+
+
+    <el-form :key="formKey" v-loading="nodeLoading" :model="collectParam" :rules="nodeRules" class="demo-form-inline"
+             label-position="left"
+             label-width="auto">
+      <el-form-item v-for="(item, index) in initFrom" :key="index" :label="item.name" prop="node">
+        <div @click="nodeChange(item)">
+          <el-input v-model="collectParam[item.name+'name']" readonly="true" suffix-icon="el-icon-zoom-in"></el-input>
+        </div>
       </el-form-item>
     </el-form>
-    <div slot="footer" class="dialog-footer">
-      <el-button @click="handleCancel">鍙� 娑�</el-button>
-      <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
-    </div>
 
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="handleCancel">鍙� 娑�</el-button>
+      <el-button size="small" type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+    </div>
+    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData"
+              :title="`涓恒��${this.nodeName}銆戦�夊彇鍊糮" :transferTitle="transferTitle" :bottomValue="bottomValue"
+              @transferSend="roleSendHandler"></transfer>
   </el-dialog>
+
 </template>
 
 <script>
 import {validatenull} from "@/util/validate";
-import {getTemplateByType, getAllProcessNode} from "@/api/base/startWork/index"
+import {getTemplateByType, getAllProcessNode, startProcess} from "@/api/base/startWork/index"
 
 export default {
   name: "startWorkFlow",
@@ -71,34 +78,67 @@
   data() {
     return {
       visible: false,
-      saveParam: {}, // 瀵硅薄鍖呭惈 {modelName娴佺▼妯℃澘(鐢辨帴鍙h繑鍥炲綋鍓嶆祦绋嬫ā鏉�) , processName娴佺▼鍚嶇О锛堜负褰撳墠鐢ㄦ埛+'鍚姩娴佺▼'+褰撳墠鍒嗙被锛� , processDesc娴佺▼鎻忚堪 }
+      saveParam: {
+        processName: ''
+      }, // 瀵硅薄鍖呭惈 {processTemplate娴佺▼妯℃澘(鐢辨帴鍙h繑鍥炲綋鍓嶆祦绋嬫ā鏉�) , processName娴佺▼鍚嶇О锛堜负褰撳墠鐢ㄦ埛+'鍚姩娴佺▼'+褰撳墠鍒嗙被锛� , processDesc娴佺▼鎻忚堪 }
+      processTemplateList: [], // 娴佺▼妯℃澘涓嬫媺鏁扮粍
       initFrom: [],  // 褰撳墠娴佺▼鑺傜偣寰幆鏁扮粍
       collectParam: {}, // 娴佺▼鑺傜偣涓嬫媺妗嗗弻鍚戠粦瀹氬睘鎬�
       typeName: [], // 娴佺▼鑺傜偣option寰幆閫夐」
+      nodeLoading: false,
       rules: {
         processName: [
           {required: true, message: '娴佺▼鍚嶇О涓嶈兘涓虹┖', trigger: 'blur'},
           {min: 3, max: 50, message: '闀垮害鍦� 3 鍒� 50 涓瓧绗�', trigger: 'blur'}
         ]
-      }
+      },
+      nodeRules: {
+        node: [
+          {required: true, message: '閫夋嫨鍐呭涓嶈兘涓虹┖', trigger: 'change'},
+        ]
+      },
+      bottomValue:'',
+      leftRoleData: [],
+      rightRoleData: [],
+      transferTitle: [],
+      nodeName: '', // 褰撳墠鑺傜偣鍚嶇О
+      userVo: [
+        {
+          "children": [],
+          "id": "zkjs",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "1241AC3B-26AF-9B86-7870-53DA8D78A742",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "1",
+          "leaf": true,
+          "name": "娴嬭瘯",
+          "oid": "921D71F8-C2BB-3BCE-B744-AD0C3812F41A",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "5",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "34ddb5a8-ab95-4070-b72f-abaaa48cf8b1",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        }
+      ],
+      formKey: 0,
+
     }
   },
-  watch: {
-    users: {
-      handler(val) {
-        this.collectParam.flowTaskUsers = val
-      },
-      deep: true,
-      immediate: true
-    },
-    parameter: {
-      handler(newval, oldval) {
-        this.saveParam = Object.assign({processName: '', processDesc: '',}, newval);
-      },
-      deep: true,
-      immediate: true
-    }
-  },
+  watch: {},
   computed: {
     fullscreen() {
       if (this.paramVOS.width || this.paramVOS.height) {
@@ -121,7 +161,7 @@
     },
   },
   created() {
-    this.modelNameChange();
+    // this.modelNameChange();
     this.getWorkByType();
   },
   mounted() {
@@ -135,26 +175,39 @@
       }
       getTemplateByType(params).then(res => {
         const data = res.data.data;
-        data.forEach(item => {
-          this.getProcessNode(item);
-        })
-        this.initFrom = data;
-      }).catch(error => {
-        console.log(error);
+        const userInfo = JSON.parse(localStorage.getItem('saber-userInfo'));
+
+        this.processTemplateList = data;
+        this.saveParam.processTemplate = data[0].value;
+        this.saveParam.processName = userInfo.content.userName + '-' + data[0].value; // 瀵规祦绋嬫ā鏉� 娴佺▼鍚嶇О璧嬮粯璁ゅ��
+
+        this.getProcessNode(data[0].attributes.oid); // 棣栨杩涘叆璋冪敤绗竴涓ā鏉跨殑鎵�鏈夎妭鐐�
+      }).catch(err => {
+        this.$message.error(err);
       })
     },
 
     // 璇锋眰娴佺▼鑺傜偣
-    getProcessNode(item) {
+    getProcessNode(oid) {
       let params = {
-        processOid: item.attributes.oid,
+        processOid: oid,
         maxSecret: -1
       }
       getAllProcessNode(params).then(res => {
         const nodes = res.data.data;
-        item.processNodes = nodes;
-      }).catch(error => {
-        console.log(error);
+        this.initFrom = nodes;
+        nodes.forEach(item => {
+          // let name = item.processUserVO[0].children.map(name => name.name).join(',');
+          // let ids = item.processUserVO[0].children.map(id => id.id).join(',');
+          let name = this.userVo.map(name => name.name).join(',');
+          let ids = this.userVo.map(id => id.id).join(',');
+          this.bottomValue = name;
+          this.collectParam[item.name + 'name'] = name;
+          this.collectParam[item.name] = ids;
+        })
+        this.nodeLoading = false;
+      }).catch(err => {
+        this.$message.error(err);
       })
     },
 
@@ -163,38 +216,108 @@
       this.visible = false;
     },
 
-    handleSelect() {
-
-    },
-
-    handleCollect() {
-
-    },
 
     handleCancel() {
       this.dialogClose();
     },
 
     handleConfirm() {
-      console.log(this.initFrom);
+      let params = {
+        deployid:this.processTemplateList[0].attributes.deploymentId,
+        title:this.saveParam.processName,
+        description:this.saveParam.processDesc,
+        btmType:this.processTemplateList[0].attributes.taskType,
+        uiType:this.processTemplateList[0].attributes.taskType,
+        oids:'', // 褰撳墠鏁版嵁oid锛屽涓敤,鍒嗛殧
+        detailInfoUrl:'', // 鐢ㄦ埛閰嶇疆灞炴��
+        resetStatus:'Editing',
+        nodeUsers:{
+          ...this.collectParam
+        }
+      }
+      startProcess(params).then(res => {
+        if(res.data.obj.status === 200){
+          this.dialogClose();
+          this.$message.success('鍚姩娴佺▼鎴愬姛');
+        }else {
+          this.$message.error(res.data.obj.error);
+        }
+      }).catch(err => {
+        this.$message.error(err);
+      })
     },
 
-    //  娴佺▼鍚嶇О鍒濆鍖栫粦瀹�
-    modelNameChange() {
-      var userInfo = JSON.parse(localStorage.getItem('saber-userInfo'));
+    // 鍒囨崲娴佺▼妯℃澘
+    proTemSelect(event) {
+      this.nodeLoading = true;
+      this.getProcessNode(event);
+      this.$refs.nodeForm.clearValidate();
+    },
 
-      if (this.paramVOS && this.paramVOS.modelName) {
-        this.saveParam.modelName = this.paramVOS.modelName;
-      } else if (userInfo.content && userInfo.content.userName) {
-        this.saveParam.modelName = userInfo.content.userName + '鍚姩娴佺▼';
-      } else {
-        this.saveParam.modelName = '';
-      }
-    }
+    // 鑺傜偣鐐瑰嚮浜嬩欢
+    nodeChange(item) {
+      this.nodeName = item.name;
+      this.transferTitle = [`[${item.name}]鏈�夌敤鎴穈, `[${item.name}]宸查�夌敤鎴穈]
+      this.leftRoleData = [
+        {
+          "children": [],
+          "id": "zkjs",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "1241AC3B-26AF-9B86-7870-53DA8D78A742",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "1",
+          "leaf": true,
+          "name": "娴嬭瘯",
+          "oid": "921D71F8-C2BB-3BCE-B744-AD0C3812F41A",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        },
+        {
+          "children": [],
+          "id": "5",
+          "leaf": true,
+          "name": "鎬讳細璁″笀",
+          "oid": "34ddb5a8-ab95-4070-b72f-abaaa48cf8b1",
+          "secret": -1,
+          "secretText": "",
+          "type": "user"
+        }
+      ];
+      this.rightRoleData = this.userVo.map(item => item.oid);
+      this.$refs.transfer.visible = true;
+    },
+
+    // 绌挎妗嗗洖濉�
+    roleSendHandler(data) {
+      let filterData;
+      filterData = this.userVo.filter(item => {
+        return data.includes(item.oid);
+      });
+      const filterName = filterData.map(item => item.name).join(',');
+      this.$set(this.collectParam, this.nodeName + 'name', filterName);
+      this.formKey += 1; // 鍒锋柊琛ㄥ崟 鍥犱负鍙屽悜缁戝畾鐨則his.collectParam[this.nodeName + 'name']鏄姩鎬佸�� vue鏃犳硶妫�娴嬪埌鍊肩殑鏇存柊
+    },
   }
 }
 </script>
 
 <style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 25px;
+}
 
+.el-divider--horizontal {
+  margin-bottom: 20px !important;
+}
+
+.el-divider__text.is-left {
+  color: #8b8989 !important;
+}
 </style>
diff --git a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
index 45970cc..ab0c3d1 100644
--- a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue
@@ -41,7 +41,7 @@
         <el-button icon="el-icon-download" plain size="small" type="primary">涓嬭浇瀵煎叆妯℃澘</el-button>
       </template>
     </avue-crud>
-    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData" title="鍒嗛厤瑙掕壊"
+    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData" :transferTitle="transferTitle" title="鍒嗛厤瑙掕壊"
               @transferSend="roleSendHandler"></transfer>
   </basic-container>
 </template>
@@ -71,8 +71,9 @@
       },
       searchParams: {},
       selectList: [],
-      leftRoleData: [],  // 鍒嗛厤瑙掕壊绌挎妗嗗乏渚ч粯璁ゆ暟鎹�
-      rightRoleData: [], // 鍒嗛厤瑙掕壊绌挎妗嗗彸渚ч粯璁ゆ暟鎹�
+      leftRoleData: [],  // 鍒嗛厤瑙掕壊绌挎妗嗗乏渚у垵濮嬫暟鎹�
+      rightRoleData: [], // 鍒嗛厤瑙掕壊绌挎妗嗗彸渚у垵濮嬫暟鎹�
+      transferTitle:['鐜版湁瑙掕壊', '鎷ユ湁瑙掕壊']
     }
   },
   created() {

--
Gitblit v1.9.3