ソースを参照

3.0.94 任务管理增加流程任务

liuyanpeng 2 年 前
コミット
7f9ad40747
4 ファイル変更360 行追加11 行削除
  1. 1 1
      package.json
  2. 1 0
      public/index-debug.html
  3. 96 0
      src/workflow/EditTableCell.vue
  4. 262 10
      src/workflow/TaskProcessManagement.vue

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "name": "client-base-v4",
   "description": "Leanwo Prodog Client",
-  "version": "3.0.90",
+  "version": "3.0.94",
   "author": "yangzhijie1488 <yangzhijie1488@163.com>",
   "scripts": {
     "dev": "cross-env webpack serve --config ./webpack.dev.js",

+ 1 - 0
public/index-debug.html

@@ -79,6 +79,7 @@
 <body>
 	<div id="app">
 	</div>
+	<div id="refreshCount"></div>
 
 	<script defer="defer" nonce="*NONCE_TOKEN*"  src="/static/echarts/dist/echarts.min.js"></script>
 	<!-- <script src="../static/js/fullscreen-api.js"></script> -->

+ 96 - 0
src/workflow/EditTableCell.vue

@@ -0,0 +1,96 @@
+<template>
+  <div v-if="props.controlType == 'input'">
+    <a-input
+      ref="myInput"
+      v-model:value="inputValue"
+      style="width: 80px"
+      @press-enter="check"
+      @blur="check"
+    />
+  </div>
+  <div v-if="props.controlType == 'select'">
+    <div>
+      <a-select
+        ref="myInput"
+        v-model:value="inputValue"
+        :options="selectOption"
+        style="width: 88px"
+        @change="check"
+        @blur="check"
+      />
+    </div>
+  </div>
+  <div v-if="props.controlType == 'inputModal'">
+    <a-button @click="showModal"> 填写 </a-button>
+
+    <a-modal
+      v-model:visible="modalVisible"
+      title="填写默认值"
+      ok-text="确认"
+      cancel-text="取消"
+      @ok="check"
+    >
+      <textarea v-model="inputValue" rows="16" cols="66" />
+    </a-modal>
+  </div>
+</template>
+
+<script setup>
+import { ref, defineProps, defineEmits, watch } from 'vue';
+const props = defineProps({
+  record: {
+    type: Object,
+    required: true,
+  },
+  paramName: {
+    type: String,
+    required: true,
+  },
+  controlType: {
+    type: String,
+    required: true,
+  },
+  selectData: {
+    type: Array,
+    default: () => [],
+    required: false,
+  },
+});
+
+const emit = defineEmits(['changeAll']);
+const myInput = ref(null);
+const newRecord = ref({});
+const selectOption = ref([]);
+const inputValue = ref('');
+const modalVisible = ref(false);
+
+watch(
+  () => props,
+  newData => {
+    if (newData) {
+      newRecord.value = JSON.parse(JSON.stringify(props.record));
+      inputValue.value = newRecord.value[props.paramName];
+      selectOption.value = JSON.parse(JSON.stringify(props.selectData));
+    }
+  },
+  { immediate: true, deep: true },
+);
+const updateProperty = value => {
+  if (value) {
+    check();
+  }
+};
+
+const showModal = () => {
+  modalVisible.value = true;
+};
+
+const check = () => {
+  modalVisible.value = false;
+  newRecord.value[props.paramName] = inputValue.value;
+  emit('changeAll', newRecord, props.paramName);
+};
+</script>
+
+<style scoped>
+</style>

+ 262 - 10
src/workflow/TaskProcessManagement.vue

@@ -2,7 +2,9 @@
   <div class="container-fluid">
     <Navbar title="任务管理" :is-go-back="false" />
     <a-button type="primary" @click="showDrawer"> 创建任务 </a-button>
-    <a-button type="dashed" style="margin-left: 8px;" @click="loadTaskTemplate"> 加载任务模板 </a-button>
+    <a-button type="dashed" style="margin-left: 8px" @click="loadTaskTemplate">
+      加载任务模板
+    </a-button>
     <a-drawer
       v-model:visible="visible"
       class="custom-class"
@@ -62,6 +64,58 @@
                   />
                 </div>
               </div>
+              <div
+                v-if="
+                  taskDefineDto.selectedTaskType &&
+                    taskDefineDto.selectedTaskType.value == '流程'
+                "
+                class="form-group"
+              >
+                <label for="lastname" class="col-sm-2 control-label">
+                  <font color="red">*</font>流程编号
+                </label>
+                <div class="col-sm-10">
+                  <a-select
+                    v-model:value="taskDefineDto.processNo"
+                    :options="processNos"
+                    style="width: 100%"
+                    @change="processNoChang"
+                  />
+                </div>
+              </div>
+              <div
+                v-if="
+                  taskDefineDto.selectedTaskType &&
+                    taskDefineDto.selectedTaskType.value == '流程'
+                "
+                class="form-group"
+              >
+                <label for="lastname" class="col-sm-2 control-label">
+                  <font color="red">*</font>流程参数
+                </label>
+                <div class="col-sm-10" style="margin-bottom: 6px" />
+                <div
+                  class="col-sm-10"
+                  style="margin-left: 100px; margin-bottom: 70px"
+                >
+                  <a-table
+                    :columns="processColumns"
+                    :data-source="processDatas"
+                    :pagination="false"
+                  >
+                    <template #bodyCell="{ column, record }">
+                      <template v-if="column.dataIndex === 'defaultValue'">
+                        <EditTableCell
+                          :record="record"
+                          :param-name="'defaultValue'"
+                          :control-type="'input'"
+                          @change-all="tableDataChange"
+                        />
+                      </template>
+                    </template>
+                  </a-table>
+                </div>
+              </div>
               <div
                 v-if="
                   taskDefineDto.selectedTaskType != null &&
@@ -163,7 +217,13 @@
                   />
                 </div>
               </div>
-              <div class="form-group">
+              <div
+                v-if="
+                  taskDefineDto.selectedTaskType &&
+                    taskDefineDto.selectedTaskType.value !== '流程'
+                "
+                class="form-group"
+              >
                 <label for="lastname" class="col-sm-2 control-label">接收人</label>
                 <div class="col-sm-10">
                   <v-select
@@ -175,7 +235,13 @@
                   />
                 </div>
               </div>
-              <div class="form-group">
+              <div
+                v-if="
+                  taskDefineDto.selectedTaskType &&
+                    taskDefineDto.selectedTaskType.value !== '流程'
+                "
+                class="form-group"
+              >
                 <label for="lastname" class="col-sm-2 control-label">接收用户组</label>
                 <div class="col-sm-10">
                   <v-select
@@ -390,7 +456,9 @@
               ? ""
               : record.taskType == "HTTP"
                 ? "HTTP"
-                : "流程报表"
+                : record.taskType == "PROCESS"
+                  ? "流程"
+                  : "流程报表"
           }}
         </template>
         <template v-if="column.key == 'receiveUserNames'">
@@ -438,7 +506,7 @@
             删除
           </a-button>
           <a-button
-            v-if="record.taskType != 'HTTP'"
+            v-if="record.taskType != 'HTTP' && record.taskType != 'PROCESS'"
             type="dashed"
             :size="size"
             @click="manualExecutionProcess(record.id)"
@@ -468,14 +536,60 @@ import 'vue-select/dist/vue-select.css';
 import { Notify, Uuid } from 'pc-component-v3';
 import CommonTable from './CommonTable.vue';
 import { message } from 'ant-design-vue';
+import EditTableCell from './EditTableCell.vue';
 export default {
   components: {
     vSelect,
     CommonTable,
+    EditTableCell,
   },
   data: function () {
     return {
       size: 'small',
+      processColumns: [
+        {
+          key: 'name',
+          title: '全局参数名称',
+          dataIndex: 'name',
+          width: 80,
+        },
+        {
+          key: 'defaultValue',
+          title: '全局参数值',
+          dataIndex: 'defaultValue',
+          width: 80,
+        },
+        {
+          key: 'dataType',
+          title: '全局参数类型',
+          dataIndex: 'dataType',
+          width: 80,
+        },
+        // {
+        //   title: '操作',
+        //   dataIndex: 'operation',
+        //   key: 'operation',
+        //   width: 60,
+        // },
+      ].map(item => ({ ...item, align: 'center' })),
+      typeOptions: [
+        {
+          value: 'java.lang.Boolean',
+        },
+        {
+          value: 'java.lang.Integer',
+        },
+        {
+          value: 'java.lang.Double',
+        },
+        {
+          value: 'java.lang.Long',
+        },
+        {
+          value: 'java.lang.String',
+        },
+      ],
+      processDatas: [],
       columns: [
         {
           title: '序号',
@@ -563,8 +677,14 @@ export default {
         timeoutTermination: false, //是否超时终止
         failureAlarm: false, //是否失败报警
         selectedAlarmUser: null, //选择的报警联系人
+        processNo: null,
+        processParam: null,
       },
+      processNos: [],
       taskTypes: [
+        {
+          value: '流程',
+        },
         {
           value: 'HTTP任务',
         },
@@ -605,6 +725,7 @@ export default {
 
   mounted: function () {
     var _self = this;
+    _self.loadProcess();
     _self.getAllUsers();
     _self.getAllGroups();
     _self.getAllTaskDefineDtos();
@@ -625,27 +746,105 @@ export default {
       this.pagination.per_page = length;
       this.getAllTaskDefineDtos();
     },
+    // 打开编辑或新建抽屉
     showDrawer: function () {
       var _self = this;
       _self.visible = true;
+      _self.processDatas = [];
       _self.restore();
     },
-    loadTaskTemplate: function(){
+
+    // 获取流程编号
+    loadProcess: function () {
+      const _self = this;
+      _self.processNos = [];
+      $.ajax({
+        url: Common.getApiURL('ProcessEditResource/list'),
+        type: 'get',
+        contentType: 'application/json',
+        beforeSend: function (request) {
+          Common.addTokenToRequest(request);
+        },
+        success: function (data) {
+          if (data.errorCode == 0) {
+            data.datas.forEach(item => {
+              _self.processNos.push({
+                value: item.no,
+                label: item.no + '-' + item.name,
+              });
+            });
+          } else {
+            message.warning(data.errorMessage);
+          }
+        },
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
+          Common.processException(XMLHttpRequest, textStatus, errorThrown);
+        },
+      });
+    },
+
+    // 流程编号改变获取流程参数
+    processNoChang: function (value) {
+      const _self = this;
+      _self.processDatas = [];
+      const params = { processNo: value };
+      $.ajax({
+        url: Common.getApiURL('ProcessEditResource/uniqueByNo'),
+        type: 'get',
+        data: params,
+        contentType: 'application/json',
+        beforeSend: function (request) {
+          Common.addTokenToRequest(request);
+        },
+        success: function (data) {
+          if (data.errorCode == 0) {
+            if (data.data && data.data.globalProperty) {
+              let jsonStr = JSON.stringify(data.data);
+              let datas = JSON.parse(jsonStr);
+              let globalProperty  = JSON.parse(datas.globalProperty);
+              if(globalProperty.variables && globalProperty.variables.length>0){
+                _self.processDatas = globalProperty.variables;
+              }
+            }
+          } else {
+            message.warning(data.errorMessage);
+          }
+        },
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
+          Common.processException(XMLHttpRequest, textStatus, errorThrown);
+        },
+      });
+    },
+
+    // 更新表格数据
+    tableDataChange: function (record, paramName) {
+      var _self = this;
+      var row = _self.deepClone(record.value);
+      var datas = _self.deepClone(_self.processDatas);
+      datas.forEach(item => {
+        if (item.key == row.key) {
+          item[paramName] = row[paramName];
+        }
+      });
+      _self.processDatas = datas;
+    },
+
+    loadTaskTemplate: function () {
       $.ajax({
         url: Common.getApiURL('TaskDefineResource/generateTask'),
         type: 'get',
         contentType: 'application/json',
-        beforeSend: function(request) {
+        beforeSend: function (request) {
           Common.addTokenToRequest(request);
         },
-        success: function(data) {
-          if(data.errorCode == 0){
+        success: function (data) {
+          if (data.errorCode == 0) {
             message.success(data.errorMessage);
           } else {
             message.warning(data.errorMessage);
           }
         },
-        error: function(XMLHttpRequest, textStatus, errorThrown) {
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
           Common.processException(XMLHttpRequest, textStatus, errorThrown);
         },
       });
@@ -742,6 +941,12 @@ export default {
         _self.taskDefineDto.selectedTaskType = {
           value: '流程报表',
         };
+      } else if (item.taskType == 'PROCESS') {
+        _self.taskDefineDto.processNo = item.processNo;
+        _self.processDatas = JSON.parse(item.processParam);
+        _self.taskDefineDto.selectedTaskType = {
+          value: '流程',
+        };
       }
       if (item.taskTimeType == 'NONE') {
         _self.taskDefineDto.selectedTimeType = {
@@ -910,10 +1115,27 @@ export default {
       if (_self.taskDefineDto.selectedTaskType.value == 'HTTP任务') {
         _self.taskDefineDto.processReportNo = null;
         _self.taskDefineDto.processReportName = null;
+        _self.taskDefineDto.processNo = null;
+        _self.processDatas = [];
       } else if (_self.taskDefineDto.selectedTaskType.value == '流程报表') {
         _self.taskDefineDto.selectedRequestType = null;
         _self.taskDefineDto.httpRequestUrl = null;
         _self.taskDefineDto.httpRequestParam = null;
+        _self.taskDefineDto.processNo = null;
+        _self.processDatas = [];
+      } else if (_self.taskDefineDto.selectedTaskType.value == '流程') {
+        _self.taskDefineDto.processReportNo = null;
+        _self.taskDefineDto.processReportName = null;
+        _self.taskDefineDto.selectedRequestType = null;
+        _self.taskDefineDto.httpRequestUrl = null;
+        _self.taskDefineDto.httpRequestParam = null;
+        _self.taskDefineDto.selectedUser = [];
+        _self.taskDefineDto.selectedGroup = [];
+      }
+      if (_self.processDatas && _self.processDatas.length > 0) {
+        _self.taskDefineDto.processParam = JSON.stringify(_self.processDatas);
+      } else {
+        _self.taskDefineDto.processParam = null;
       }
       var receiveUserIds = [];
       if (
@@ -966,7 +1188,12 @@ export default {
         failureAlarm: _self.taskDefineDto.failureAlarm,
         alarmUserIds: alarmUserIds,
         taskStatus: _self.taskDefineDto.selectedStatus.value,
+        processNo: _self.taskDefineDto.processNo,
+        processParam: _self.taskDefineDto.processParam,
       };
+      if (_self.taskDefineDto.selectedTaskType.value == '流程') {
+        requestDto.taskType = '流程任务';
+      }
       TaskDefineResource.saveTaskDefine(requestDto).then(
         successData => {
           if (successData) {
@@ -1044,6 +1271,17 @@ export default {
             response.errorMessage = '请填写流程报表名称';
             return response;
           }
+        } else if (_self.taskDefineDto.selectedTaskType.value == '流程'){
+          if (!_self.taskDefineDto.processNo){
+            response.errorCode = 8;
+            response.errorMessage = '请选择流程编号';
+            return response;
+          }
+          if(_self.processDatas.length == 0){
+            response.errorCode = 9;
+            response.errorMessage = '请添加流程参数';
+            return response;
+          }
         }
       }
       return response;
@@ -1187,6 +1425,20 @@ export default {
         },
       );
     },
+    // 深拷贝
+    deepClone: function (obj) {
+      const _self = this;
+      if (typeof obj !== 'object' || obj == null) {
+        return obj;
+      }
+      let result = Array.isArray(obj) ? [] : {};
+      for (let key in obj) {
+        if (Object.prototype.hasOwnProperty.call(obj, key)) {
+          result[key] = _self.deepClone(obj[key]);
+        }
+      }
+      return result;
+    },
   },
 };
 </script>