Hua 3 kuukautta sitten
vanhempi
commit
7ab075345f
2 muutettua tiedostoa jossa 201 lisäystä ja 262 poistoa
  1. 14 0
      ruoyi-ui/src/api/service/info.js
  2. 187 262
      ruoyi-ui/src/views/dpp/calculateDev/index.vue

+ 14 - 0
ruoyi-ui/src/api/service/info.js

@@ -243,4 +243,18 @@ export function getEfficiency(query) {
     method: "get",
     params: query,
   });
+}
+export function flowDispatch(data) {
+  return request({
+    url: "/flow/dispatch",
+    method: 'post',
+    data:data
+  });
+}
+export function getDataRen(query) {
+  return request({
+    url: "/flow/dispatch/list",
+    method: "get",
+    params: query,
+  });
 }

+ 187 - 262
ruoyi-ui/src/views/dpp/calculateDev/index.vue

@@ -70,12 +70,12 @@
       @tab-click="handleClick"
     >
       <el-tab-pane label="任务详情" name="first">
-        <el-button  @click="addTask" style="margin-top: 0%;margin-right: 1%;float:right;" type="primary" size="mini" plain>新增</el-button>
+        <el-button :disabled="parMdid" @click="addTask" style="margin-top: 0%;margin-right: 1%;float:right;" type="primary" size="mini" plain>新增</el-button>
         <div style="width: 100%;margin-left: 0%;padding-top: 0%;" class="tab-container">
         <div>
           <el-table 
             :data="tableData" 
-            style="width: 98%;margin-left: 1%;margin-top: 0.5%;"
+            style="width: 98%;margin-left: 1%;margin-top: 0.5%;height: 73vh;"
             :cell-style="{ padding:'5px' }"
             :header-cell-style="{height: heightAll*0.01+'px',}"
             :row-style="{ fontSize: '16px',textAlign:'center'}"
@@ -87,26 +87,32 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="name" label="任务名称"  width="200">
-              <template #default="scope">
-                <div style="color: #409EFF;cursor: pointer;" @click="showDe(scope.row)">
-                  {{scope.row.name}}
-                </div>
-              </template>
+            <el-table-column prop="flowJobName" label="任务名称"  width="200">
             </el-table-column>
-            <el-table-column prop="type" label="建模方案"  width="200">
+            <el-table-column prop="type" label="建模方案"  width="300">
             </el-table-column>
-            <el-table-column prop="url" label="责任人" width="200"  show-overflow-tooltip/>
-            <el-table-column prop="rqtype" label="联系方式" />
+            <el-table-column prop="chargeBy" label="责任人" width="200"  show-overflow-tooltip/>
+            <el-table-column prop="chargePhone" label="联系方式" />
             <el-table-column prop="address" label="操作" width="150">
                 <template #default="scope">
                     <div style="display: flex;">
-                      <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">测试</el-button>
-                      <el-button @click="showLog(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">日志</el-button>
+                      <el-button @click="testSer(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">编辑</el-button>
+                      <el-button @click="showLog(scope.row)" type="primary" text size="mini" style="margin-left: 0%;">删除</el-button>
                     </div>
                 </template>
             </el-table-column>
           </el-table>
+          <el-pagination
+            v-if="total>12"
+            small
+            background
+            style="margin-top: 0.8%;float: right;margin-right: 1%;"
+            layout="prev, pager, next"
+            :total="total"
+            v-model="pageNum"
+            @change="changePage"
+            class="mt-4"
+          />
         </div>
         <el-dialog @close="clearAdd" v-model="dialogVisible" title="" width="60%" destroy-on-close :key="tableKey">
           <div style="display: flex;align-items: center;">
@@ -165,20 +171,15 @@
         </el-dialog>
         <el-dialog @close="clearAdd" v-model="dialogVisibleTest" draggable :title="titleTest" width="60%" destroy-on-close :key="tableKey">
           <el-form  size="mini"  style="margin-top: 0%;width: 98%;"  :model="formJi" label-position="right" ref="formRefJi" label-width="120px" :rules="rulesJi">
-            <el-row :gutter="24">
+            <el-row :gutter="48">
                     <el-col :span="8">
-                    <el-form-item label="任务名称:" prop="jobName" style="">
+                    <el-form-item label="任务名称:" prop="flowJobName" style="">
                         <div style="display: flex;width: 100%;justify-content: space-between;">
-                            <el-input  v-model="formJi.jobName" style="width: 100%;"/>
+                            <el-input  v-model="formJi.flowJobName" style="width: 100%;"/>
                         </div>
                     </el-form-item>
                     </el-col>
                     <el-col :span="8">
-                    <el-form-item label="组名称:" prop="groupName" style="">
-                        <div style="display: flex;width: 100%;justify-content: space-between;">
-                            <el-input :disabled="!isAddTa" v-model="formJi.groupName" style="width: 100%;"/>
-                        </div>
-                    </el-form-item>
                     </el-col>
                     
             </el-row>
@@ -188,16 +189,16 @@
             </el-row>
             <el-row :gutter="48">
                 <el-col :span="8">
-                    <el-form-item label="负责人:" prop="" style="">
+                    <el-form-item label="负责人:" prop="chargeBy" style="">
                         <div style="display: flex;width: 100%;justify-content: space-between;">
-                            <el-input  v-model="formJi.ownerName" style="width: 100%;"/>
+                            <el-input  v-model="formJi.chargeBy" style="width: 100%;"/>
                         </div>
                     </el-form-item>
                     </el-col>
                 <el-col :span="8">
-                  <el-form-item label="联系方式" prop="" style="">
+                  <el-form-item label="联系方式" prop="chargePhone" style="">
                       <div style="display: flex;width: 100%;justify-content: space-between;">
-                          <el-input  v-model="formJi.ownerName" style="width: 100%;"/>
+                          <el-input  v-model="formJi.chargePhone" style="width: 100%;"/>
                       </div>
                   </el-form-item>
                 </el-col>
@@ -274,6 +275,7 @@
                         <el-form-item label="间隔时长:" prop="triggerInterval">
                             <el-input-number
                                 v-model="formJi.triggerInterval"
+                                v-if="formJi.triggerType==2"
                                 style="width: 100%;"
                                 class="mx-4"
                                 :min="1"
@@ -281,6 +283,14 @@
                                 controls-position="right"
                                 @CHANGE="handleChange"
                             />
+                            <el-input v-if="formJi.triggerType==3" v-model="formJi.triggerInterval" placeholder="请输入cron执行表达式">
+                                <template #append>
+                                  <el-button type="primary" @click="handleShowCron">
+                                      生成表达式
+                                      <i class="el-icon-time el-icon--right"></i>
+                                  </el-button>
+                                </template>
+                            </el-input>
                         </el-form-item>
                     </el-col>
                 </el-row>
@@ -332,58 +342,56 @@
                 </el-form-item>
             </div>
         </el-form>
-        </el-dialog>
-        <el-dialog @close="clearFromLev" :title="titleTest" v-model="dialogVisibleLevel" width="50%" destroy-on-close :key="tableKey">
-          <el-table 
-            style="margin-top: 1%;width: 98%;"
-            :data="tableDataLog" 
-            :cell-style="{ textAlign: 'center',padding:'2px 0' }"
-            :header-cell-style="{ textAlign: 'center'}"
-            :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
-            border >
-                <el-table-column prop="createBy" label="测试发起人">
-                </el-table-column>
-                <el-table-column prop="runTm" label="测试时间">
-                </el-table-column>
-                <el-table-column prop="execTm" label="测试耗时" show-overflow-tooltip>
-                </el-table-column>
-                <el-table-column prop="returnData" label="测试返回结果" show-overflow-tooltip>
-                </el-table-column>
-                <el-table-column prop="audit" label="测试状态" width="100">
-                  <template #default="scope">
-                    <div style="text-align: center;display: flex;color:#67C23A" v-if="scope.row.senState==1">
-                      已测试
-                    </div>
-                    <div style="text-align: center;display: flex;color:#F56C6C" v-if="scope.row.senState==0">
-                      测试失败
-                    </div>
-                    <div style="text-align: center;display: flex;color:#E6A23C" v-if="scope.row.senState==null">
-                      未测试
+        <div style="display: flex;align-items: center;line-height: 1.5;margin-top: 1%;">
+          <el-button  @click="addStart" style="margin-top: 0%;margin-left: 1%;" type="success" size="mini" plain>新增参数</el-button>
+          <!-- <div style="margin-left: 1%;color: #909399;">需要至少一条输入参数</div> -->
+        </div>
+        <el-table 
+        style="margin-top: 1%;width: 100%;"
+        :data="tableDataCanStart" 
+        :cell-style="{ textAlign: 'center',padding:'2px 0' }"
+        :header-cell-style="{ textAlign: 'center'}"
+        :row-style="{ height: heightAll*0.01+'px',fontSize: '16px',textAlign:'center'  }"
+        border >
+            <el-table-column prop="itemName" label="参数名称">
+                <template #default="scope">
+                    <div style="width: 100%;">
+                        <el-input  placeholder="请填写参数名称" type="primary" class="noBor" v-model="scope.row.name" size="mini" text style="margin-left: 0%;"></el-input>
                     </div>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="errorMessage" label="错误信息" show-overflow-tooltip>
-                  <template #default="scope">
-                    <div style="text-align: center;display: flex;color:#F56C6C" v-if="scope.row.errorMessage!==null">
-                      {{scope.row.errorMessage}}
+                </template>
+            </el-table-column>
+            <el-table-column prop="itemName" label="参数值" >
+                <template #default="scope">
+                    <div style="width: 100%;">
+                        <el-input type="primary"  class="noBor" v-model="scope.row.value" size="mini" text style="margin-left: 0%;"></el-input>
                     </div>
-                    <div style="text-align: center;display: flex;color:#67C23A" v-if="scope.row.errorMessage==null">
-                      /
+                </template>
+            </el-table-column>
+            <el-table-column prop="address" label="操作" width="100">
+                <template #default="scope">
+                    <div style="width: 100%;">
+                        <el-button type="danger" @click="delCanStart(scope.$index)" size="mini" text style="margin-left: 0%;">删除</el-button>
                     </div>
-                  </template>
-                </el-table-column>
-            </el-table>
-          <template #footer>
-              <span class="dialog-footer">
-                <el-button type="primary" @click="dialogVisibleLevel = false" size="mini">
-                  确定
-                </el-button>
-            </span>
-          </template>
+                </template>
+            </el-table-column>
+        </el-table>
+        <template #footer>
+            <span class="dialog-footer">
+              <el-button size="mini" @click="dialogVisibleTest = false">取消</el-button>
+              <el-button type="primary" @click="addRen" size="mini" v-if="isAdd">
+                提交
+              </el-button>
+              <el-button type="primary" @click="saveAddNextLevel" size="mini" v-if="!isAdd">
+                提交
+              </el-button>
+          </span>
+        </template>
+        </el-dialog>
+        <el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close>
+          <crontab ref="crontabRef" @hide="openCron=false" @fill="crontabFill" :expression="expression"></crontab>
         </el-dialog>
         <el-dialog  v-model="dialogVisibleDe" title="" width="50%" @close="" destroy-on-close class="custom-dialog-bg">
-          <el-form size="mini" :key="tableKey" style="margin-top:1%;width: 100%;" :model="formJi" label-position="right"
-                 ref="formRefJi" label-width="120px" :rules="rulesJi">
+          <el-form size="mini" :key="tableKey" style="margin-top:1%;width: 100%;" :model="formJi" label-position="right">
             <el-row :gutter="48">
               <el-col :span="10">
                 <el-form-item label="服务名称:" prop="name" style="">
@@ -471,14 +479,15 @@ import {getCatalog} from "@/api/service/catalog";
 import { Plus,Search,Filter,Promotion,Check  } from '@element-plus/icons-vue'
 import { reactive } from 'vue'
 import {getModellist} from '@/api/standardization/modeling'
-import { modelTreeSelect,getSerDe,addService,addServiceParam,delService,addTree,deTree,getServiceInfo,testService,testLog } from "@/api/service/info";
+import { modelTreeSelect,getSerDe,addService,addServiceParam,delService,addTree,deTree,getDataRen,testService,testLog,flowDispatch } from "@/api/service/info";
 import { ref, onMounted, onUnmounted, nextTick,onBeforeMount } from 'vue';
 import JsonViewer from 'vue-json-viewer'
 import 'vue-json-viewer/style.css' 
 import  JsonEditorVue from 'json-editor-vue3'
 import { cloneDeep } from 'lodash'
 import { useClipboard } from "@vueuse/core";
-
+import Crontab from '@/components/Crontab'
+import { routerKey } from "vue-router";
 const titleTest = ref('')
 const { proxy } = getCurrentInstance();
 const JsonAdd= ref(JSON.stringify({ data: "初始值1" }))
@@ -575,6 +584,28 @@ const optionsType=  ref([
     value:'WebSocket'
     },
 ])
+const optionsTaskType = ref([
+  {
+    label:'集群',
+    value:1
+  },
+  {
+    label:'广播',
+    value:2
+  },
+  {
+    label:'Sharding',
+    value:3
+  },
+  {
+    label:'Map',
+    value:4
+  },
+  {
+    label:'MapReduce',
+    value:5
+  },
+])
 const data =  ref([])
 const select =  ref('1')
 const activeName =  ref('first')
@@ -582,6 +613,7 @@ const title =  ref('')
 const titleTree =  ref('')
 const currentPage =  ref(1)
 const total =  ref(1)
+const pageNum =  ref(1)
 const tableData = ref([])
 const tableheight = window.innerHeight*0.7
 const heightAll = window.innerHeight
@@ -613,18 +645,26 @@ const formZu = ref({
 });
 const parId= ref('')
 const formJi = ref({
-  name:'',
-  cateCode:'',
-  type:'',
-  url:'',
-  rqtype:'',
-  rptype:'',
-  intro:'',
+  routeKey:4,
+  blockStrategy:1,
+  triggerType:2,
+  triggerInterval:10,
+  executorTimeout:10,
+  maxRetryTimes:3,
+  retryInterval:1,
 });
 const rulesJi = reactive({
-  name: [{ required: true, message: '必填', trigger: 'blur' }],
-  url: [{ required: true, message: '必填', trigger: 'blur' }],
-  cateCode: [{ required: true, message: '必填', trigger: 'blur' }],
+  flowJobName: [{ required: true, message: '必填', trigger: 'blur' }],
+  routeKey: [{ required: true, message: '必填', trigger: 'blur' }],
+  triggerType: [{ required: true, message: '必填', trigger: 'blur' }],
+  triggerInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+  executorTimeout: [{ required: true, message: '必填', trigger: 'blur' }],
+  maxRetryTimes: [{ required: true, message: '必填', trigger: 'blur' }],
+  retryInterval: [{ required: true, message: '必填', trigger: 'blur' }],
+  chargeBy: [{ required: true, message: '必填', trigger: 'blur' }],
+  chargePhone: [{ required: true, message: '必填', trigger: 'blur' }],
+  taskType: [{ required: true, message: '必填', trigger: 'blur' }],
+  blockStrategy: [{ required: true, message: '必填', trigger: 'blur' }],
 });
 const formRefJi = ref();
 const formAdd = ref({
@@ -674,6 +714,10 @@ const props1 = ref({
 })
 const detailJson = ref('')
 const parOptions = ref([])
+const openCron = ref(false)
+const tableDataCanStart = ref([
+])
+const expression = ref('')
 watch(inputNode, (val) => {
   treeRef.value?.filter(val); // 调用树的过滤方法
 });
@@ -683,6 +727,48 @@ const filterNode = (value, data) => {
 };
 
 const copied = ref(false);
+function changePage(val){
+  pageNum.value = val
+  getDataRen()
+}
+function addRen() {
+  formRefJi.value.validate((valid) => {
+    if (valid) {
+      formJi.value.flowId = parMdid.value
+      formJi.value.flowParam = {}
+      if(tableDataCanStart.value.length>0){
+        tableDataCanStart.value.forEach(item=>{
+          formJi.value.flowParam[item.name] = item.value
+        })
+      }
+      flowDispatch(formJi.value).then(res=>{
+        if(res.code===200){
+          proxy.$message({
+            message: '操作成功',
+            type: 'success'
+          });
+          dialogVisibleTest.value = false
+          getDataRen({
+            mdid:parMdid.value,
+            pageNum:pageNum.value,
+            pageSize:20
+          })
+        }else{
+          proxy.$message({
+            message: res.message,
+            type: 'error'
+          });
+        }
+      })
+    }
+  })
+}
+function addStart(){
+  tableDataCanStart.value.push({})
+}
+function delCanStart(index){
+  tableDataCanStart.value.splice(index,1)
+}
 function showLog(row){
   dialogVisibleLevel.value = true
   var par = {
@@ -692,19 +778,15 @@ function showLog(row){
     tableDataLog.value = res.rows
   })
 }
-function test(){
-  var par = detailJson.value
-  par.params = tableDataCan.value
-  testService(par).then(res=>{
-    console.log(res)
-    dataReturn.value = res.msg
-    var par1  = {
-      data:{id:parMdid.value}
-    }
-    handleNodeClick(null,par1,null)
-  })
+function handleShowCron() {
+  expression.value = formJi.value.triggerInterval;
+  openCron.value = true;
+}
+function crontabFill(value) {
+  formJi.value.triggerInterval = value;
 }
 function addTask(row){
+  isAdd.value = true
   dialogVisibleTest.value = true
   getSerDe(row.srvId).then(res=>{
     if(res.code===200){
@@ -763,184 +845,27 @@ function clearAdd(){
   ]
   dataReturn.value = ''
 }
-function extractModelNodesDFSIterative(root) {
-  const result = [];
-  const stack = root;
-  
-  while (stack.length > 0) {
-    const node = stack.pop();
-    if (node.nodeType === 'MODEL') {
-      result.push(node);
-    }
-    
-    // 子节点逆序入栈(保证从左到右遍历)
-    if (node.children) {
-      for (let i = node.children.length - 1; i >= 0; i--) {
-        stack.push(node.children[i]);
-      }
-    }
-  }
-  return result;
-}
-function delAll(){
-  proxy.$modal.confirm('是否确认删除?').then(function () {
-    return deTree(parTree.value.id);
-  }).then(() => {
-    getTreeLeft();
-    proxy.$modal.msgSuccess("删除成功");
-    dialogVisibleLevel.value = false
-  }).catch(() => {});
-}
 function clearFromLev(){
   tableDataLog.value = []
 }
-function addNextLevel(){
-  dialogVisibleLevel.value = true
-  show1Lev.value = false
-}
-function saveAddNextLevel(){
-   formRefLev.value.validate((valid) => {
-    if(valid){
-      var par = formLev.value
-      par.treeType = 'MODEL'
-      par.treePid = parTree.value.id
-      addTree(par).then(res=>{
-        if(res.code===200){
-          proxy.$modal.msgSuccess("新增成功");
-          getTreeLeft()
-          dialogVisibleLevel.value = false
-        }
-      })
-    }
-  });
-}
-function add1Level(){
-  dialogVisibleLevel.value = true
-  show1Lev.value = true
-}
-function saveAdd1Level(){
-  formRefLev.value.validate((valid) => {
-    if(valid){
-      var par = formLev.value
-      par.treeType = 'MODEL'
-      par.treePid = parTree.value.pid
-      addTree(par).then(res=>{
-        if(res.code===200){
-          proxy.$modal.msgSuccess("新增成功");
-          getTreeLeft()
-          dialogVisibleLevel.value = false
-        }
-      })
-    }
-  });
-}
-async function delSer(){
-  proxy.$modal.confirm('是否确认删除?').then(function () {
-    return delService(parId.value.id);
-  }).then(() => {
-    getTreeLeft();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {});
-}
-async function addSer(){
-  console.log(JsonAdd.value)
-  var valid
-  await formRefAdd.value.validate((valid1) => {
-    valid = valid1
-  });
-  console.log(valid) 
-  if(valid){
-    var par = formAdd.value
-    par.example = exampleAdd.value
-    par.rpcontent = JsonAdd.value
-    par.cateCode = par.cateCode[0]
-    console.log(par)
-
-    await addService(par).then(res=>{
-      if(res.code===200){
-        var parCan = tableDataCanAdd.value
-        parCan.srvId = res.data.srvId
-        addServiceParam(parCan).then(res1=>{
-          if(res1.code===200){
-            proxy.$modal.msgSuccess("新增成功");
-            getTreeLeft()
-          }
-        })
-      }
-    })
-    
-    
-  }
-
-}
-function showAdd(){
-  dialogVisible.value = true
-}
 async function handleNodeClick(node,data,event){
-  // parTree.value = data.data
-  // currentNodeKey.value = data.data.id
- 
-  // isEdit.value = false
-  // parId.value = data.data
-  // await getSerDe(data.data.id).then(res=>{
-  //   if(res.data.ptService){
-  //     detail.value = res.data.ptService
-  //     tableDataCan.value = res.data.list
-  //     dataReturn.value = res.data.returnList
-  //     console.log(tableDataCan.value)
-  //     dataJsonXiang.value = res.data.ptService.rpcontent
-  //     formJi.value = res.data.ptService
-  //     example.value = res.data.ptService.example
-  //   }
-    
-  // })
   console.log(data)
   titleTest.value = data.data.label
   parMdid.value = data.data.id
   var par = {
-    mdid:data.data.id
+    mdid:data.data.id,
+    pageNum:1,
+    pageSize:20
   }
-  console.log(data.data.id)
-  await getServiceInfo(par).then(res=>{
-    if(res.data){
-      tableData.value = res.data.serviceList
-      
+  await getDataRen(par).then(res=>{
+    if(res.rows){
+      tableData.value = res.rows
+      tableData.value.forEach(item=>{
+        item.type = data.data.label
+      })
+      total.value = res.total
     }
   })
-  parOptions.value.forEach(option => {
-    option.label = option.cateName;
-    option.value = option.cateCode;
-  });
-  console.log(parOptions.value)
-  for(var i = 0; i < parOptions.value.length; i++){
-    for(var i1 = 0; i1 < tableData.value.length; i1++){
-      console.log(i1);
-      if(parOptions.value[i].value === tableData.value[i1].cateCode){
-         tableData.value[i1].cateCode = parOptions.value[i].label
-      }
-    }
-  }
-  var par = [
-    {
-      value:'1',
-      label:'JSON'
-    },
-    {
-      value:'2',
-      label:'XML'
-    },
-    {
-      value:'3',
-      label:'HTML'
-    }
-  ]
-  for(var i = 0; i < par.length; i++){
-    for(var i1 = 0; i1 < tableData.value.length; i1++){
-      if(par[i].value === tableData.value[i1].rptype){
-         tableData.value[i1].rptype = par[i].label
-      }
-    }
-  }
 }
 async function getTreeLeft(){
   var par = {