Bladeren bron

操作按钮编辑添加动态字段参数及基础校验

lph 1 jaar geleden
bovenliggende
commit
215f8190f7

+ 15 - 5
ruoyi-ui/src/api/system/btn.js

@@ -7,7 +7,7 @@ export function listBtn(query) {
     url: '/system/btn/list',
     method: 'get',
     params: query,
-    baseURL:process.env.VUE_APP_BASE_API3
+    baseURL: process.env.VUE_APP_BASE_API3
   })
 }
 
@@ -16,7 +16,7 @@ export function getBtn(id) {
   return request({
     url: '/system/btn/' + id,
     method: 'get',
-    baseURL:process.env.VUE_APP_BASE_API3
+    baseURL: process.env.VUE_APP_BASE_API3
   })
 }
 
@@ -26,7 +26,7 @@ export function addBtn(data) {
     url: '/system/btn',
     method: 'post',
     data: data,
-    baseURL:process.env.VUE_APP_BASE_API3
+    baseURL: process.env.VUE_APP_BASE_API3
   })
 }
 
@@ -36,7 +36,7 @@ export function updateBtn(data) {
     url: '/system/btn',
     method: 'put',
     data: data,
-    baseURL:process.env.VUE_APP_BASE_API3
+    baseURL: process.env.VUE_APP_BASE_API3
   })
 }
 
@@ -45,6 +45,16 @@ export function delBtn(id) {
   return request({
     url: '/system/btn/' + id,
     method: 'delete',
-    baseURL:process.env.VUE_APP_BASE_API3
+    baseURL: process.env.VUE_APP_BASE_API3
+  })
+}
+
+// 查询按钮组绑定的表格
+export function checkBtn(btnKey) {
+  return request({
+    url: '/system/btn/checkBtn',
+    method: 'get',
+    params: btnKey,
+    baseURL: process.env.VUE_APP_BASE_API3
   })
 }

+ 23 - 5
ruoyi-ui/src/components/kFormDesign/OptionsEdit.vue

@@ -24,7 +24,8 @@
         size="small"
         icon="el-icon-edit"
         @click="editHandler(index)"
-      ></el-button>
+        >第{{ index + 1 }}级选项
+      </el-button>
       <el-button
         circle
         type="danger"
@@ -48,7 +49,7 @@
         label-width="140px"
       >
         <el-row type="flex" style="flex-wrap: wrap">
-          <el-col :span="12">
+          <!-- <el-col :span="12">
             <el-form-item label="选项数据名" prop="dynamicName">
               <el-input
                 v-model="formData.dynamicName"
@@ -56,7 +57,7 @@
                 size="normal"
               ></el-input>
             </el-form-item>
-          </el-col>
+          </el-col> -->
           <el-col :span="12">
             <el-form-item label="表名" prop="tableName">
               <el-select
@@ -230,11 +231,12 @@
       </template>
     </el-dialog>
     <el-dialog title="编辑参照值" :visible.sync="flagShow" width="30%">
+      <!-- :rules="rules" -->
       <el-form
         :model="flagFormData"
         ref="flagFormDataRef"
-        :rules="rules"
         label-width="100px"
+        :rules="flagRules"
         :inline="false"
         size="normal"
       >
@@ -401,7 +403,22 @@ export default {
       ],
       tableList: [],
       fieldList: [],
-      rules: {},
+      rules: {
+        tableName: [
+          { required: true, message: "请选择表格名称", trigger: "change" },
+        ],
+        optLabelData: [
+          { required: true, message: "请选择描述字段", trigger: "change" },
+        ],
+        optValueData: [
+          { required: true, message: "请选择值字段", trigger: "change" },
+        ],
+      },
+      flagRules: {
+        flagType: [
+          { required: true, message: "请选择参照值类型", trigger: "change" },
+        ],
+      },
       constFlagList: [
         {
           value: "#{USERID}",
@@ -606,5 +623,6 @@ export default {
 }
 .btn-list {
   display: flex;
+  flex-wrap: wrap;
 }
 </style>

+ 4 - 0
ruoyi-ui/src/utils/index.js

@@ -406,6 +406,10 @@ export function titleCase(str) {
 export function camelCase(str = '') {
   return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
 }
+// 驼峰转下划线
+export function toUnderline(str = '') {
+  return str.replace(/([A-Z])/g, '_$1').toLowerCase()
+}
 
 export function isNumberStr(str) {
   return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)

+ 13 - 2
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementExecuteUser.vue

@@ -37,7 +37,7 @@
           <el-select
             v-scroll="scrollHandler"
             v-model="exeUserValue"
-            placeholder="请选择执行人类型"
+            placeholder="请选择执行人"
             :multiple="exeUserType == 2"
             clearable
             filterable
@@ -110,6 +110,7 @@ export default {
         deptId: undefined,
       },
       isArriveBoottom: false,
+      isFirst: true,
     };
   },
 
@@ -130,7 +131,16 @@ export default {
   methods: {
     initFormData() {
       this.exeUserValue = getExecuteUser(getActive()) || "";
+      console.log(this.exeUserValue);
       this.exeUserType = getExecuteUserType(getActive()) || "1";
+      if (this.exeUserType && this.isFirst) {
+        if (this.exeUserType == 3) {
+          this.exeRoleListHandler();
+        } else {
+          this.exeUserListHandler();
+        }
+        this.isFirst = false;
+      }
       Object.assign(this.queryParams, {
         pageNum: 1,
         pageSize: 10,
@@ -163,10 +173,11 @@ export default {
           }
           res.rows.forEach((item) => {
             this.exeUserValueList.push({
-              value: item.userId,
+              value: item.userId.toString(),
               label: item.nickName,
             });
           });
+          console.log(this.exeUserValueList);
         }
       } catch (error) {
         console.log(error);

+ 1 - 2
ruoyi-ui/src/views/system/bpmnPro/components/Panel/index.vue

@@ -161,8 +161,7 @@ export default {
       // 添加执行表单
       isTaskOrUserTask(element) &&
         this.renderComponents.push(ElementExecuteForm);
-      (isStartInitializable(element) || isTaskOrUserTask(element)) &&
-        this.renderComponents.push(ElementNormalTask);
+      this.renderComponents.push(ElementNormalTask); //正常节点
       !isProcess(element) && this.renderComponents.push(ElementUnusualTasks); //可处理异常
       isUserTask(element) && this.renderComponents.push(ElementExecuteUser);
       // !isProcess(element) && this.renderComponents.push(ElementBeforeNode);

+ 6 - 2
ruoyi-ui/src/views/system/bpmnPro/components/bo-utils/getNodeMsg.js

@@ -38,7 +38,7 @@ export function getNodeMsg(xmlObj) {
   let prefix = getProcessEngine();
   let { attributes, childNodes } = xmlObj
     .getElementsByTagName("bpmn:process")[0];
-  let bpmProcessConfigurationList = [], bpmNodeHandleUserList = [], bpmNodeScriptRelevanceList = [], attributeArray = ['nodeKey', 'nodeFormKey', 'nodeProcessKey', 'nodeType', 'nodeRolePremission', 'spare1', 'spare2', 'spare3', 'createBy', 'updateBy', 'remark'];
+  let bpmProcessConfigurationList = [], bpmNodeHandleUserList = [], bpmNodeScriptRelevanceList = [], attributeArray = ['nodeKey', 'nodeFormKey', 'nodeProcessKey', 'nodeRolePremission', 'spare1', 'spare2', 'spare3', 'createBy', 'updateBy', 'remark'];
   childNodes.forEach((node) => {
     // let uuid = uuidv4();
 
@@ -58,6 +58,8 @@ export function getNodeMsg(xmlObj) {
       updateBy: '',  //修改者
       remark: '',    //节点描述
     }
+    console.dir(node);
+    console.log(node.localName);
     nodeObj.nodeType = node.localName;
     if (nodeObj.nodeType == "sequenceFlow") return;
     let nodeExceptionList = getNodeException(node, nodeObj)
@@ -73,6 +75,7 @@ export function getNodeMsg(xmlObj) {
     bpmNodeHandleUser.length && (nodeObj.nodeRolePermission = node.getAttribute(`${prefix}:virtuallyRole`));
 
     bpmProcessConfigurationList.push(nodeObj)
+    console.log(bpmProcessConfigurationList);
   })
   return {
     bpmProcessConfigurationList,
@@ -210,7 +213,8 @@ const blackArr = [
   "waypoint",
   "BPMNEdge",
   "waypoint",
-  "waypoint"
+  "waypoint",
+  "property"
 ]
 
 /**

+ 205 - 114
ruoyi-ui/src/views/system/excuteBtnMange/index.vue

@@ -367,112 +367,108 @@
                 ></el-input>
               </el-form-item>
             </el-col>
-          </div>
-
-          <!-- <el-col :span="24">
-            <div class="btn-show-condition">
-              <span class="table-title">条件编辑</span>
-              <el-table :data="conditionBtnData" style="width: 100%">
-                <el-table-column label="序号" type="index" width="50">
-                </el-table-column>
-                <el-table-column prop="tableName" label="表名" width="150">
-                  <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.tableName"
-                      @change="conditionTableChange(scope.row)"
-                      placeholder="请选择"
+            <el-col
+              :span="24"
+              v-show="
+                btnGroupFormData.btnType != 3 && btnGroupFormData.btnType != 7
+              "
+            >
+              <el-form-item label="" prop="btnParams">
+                <div class="filter-table-wrap">
+                  <span class="title">公共参数</span>
+                  <el-table :data="commonFieldData" style="width: 100%">
+                    <el-table-column label="序号" type="index" width="50">
+                    </el-table-column>
+                    <el-table-column
+                      prop="fieldName"
+                      label="字段名"
+                      width="150"
+                      align="center"
                     >
-                      <el-option
-                        v-for="item in tableList"
-                        :key="item.tableName"
-                        :label="item.tableComment"
-                        :value="item.tableName"
-                      >
-                        <span style="float: left">{{ item.tableComment }}</span>
-                        <span
-                          style="float: right; color: #8492a6; font-size: 13px"
-                          >{{ item.tableName }}</span
+                      <template slot-scope="scope">
+                        <el-select
+                          v-model="scope.row.fieldName"
+                          placeholder="请选择"
                         >
-                      </el-option>
-                    </el-select>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="fieldName" label="字段名" width="150">
-                  <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.fieldName"
-                      placeholder="请选择"
+                          <el-option
+                            v-for="item in rootFieldInfo.fieldList"
+                            :key="item.value"
+                            :label="item.value"
+                            :value="item.key"
+                          >
+                            <span style="float: left">{{ item.value }}</span>
+                            <span
+                              style="
+                                float: right;
+                                color: #8492a6;
+                                font-size: 13px;
+                              "
+                              >{{ item.key }}</span
+                            >
+                          </el-option>
+                        </el-select>
+                      </template>
+                    </el-table-column>
+                    <el-table-column
+                      prop="flagValue"
+                      label="默认值"
+                      width="150"
+                      align="center"
                     >
-                      <el-option
-                        v-for="item in scope.row.fieldList"
-                        :key="item.fieldName"
-                        :label="item.fieldDescription"
-                        :value="item.fieldName"
-                      >
-                        <span style="float: left">{{
-                          item.fieldDescription
-                        }}</span>
-                        <span
-                          style="float: right; color: #8492a6; font-size: 13px"
-                          >{{ item.fieldName }}</span
+                      <template slot="header" slot-scope="">
+                        默认值
+                        <el-tooltip
+                          class="item"
+                          effect="dark"
+                          content="不设置默认值时,默认为当前行的该字段"
+                          placement="top-start"
                         >
-                      </el-option>
-                    </el-select>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="condition" label="条件" width="100">
-                  <template slot-scope="scope">
-                    <el-select
-                      v-model="scope.row.condition"
-                      placeholder="请选择"
-                    >
-                      <el-option
-                        v-for="item in conditionList"
-                        :key="item.value"
-                        :label="item.label"
-                        :value="item.value"
-                      >
-                      </el-option>
-                    </el-select>
-                  </template>
-                </el-table-column>
-                <el-table-column prop="flagValue" label="参照值" width="100">
-                  <template slot-scope="scope">
-                    <el-input
-                      v-model="scope.row.flagValue"
-                      @input="
-                        scope.row.flagValue = scope.row.flagValue.replace(
-                          /^(0+)|[^\d]+/g,
-                          ''
-                        )
-                      "
-                    ></el-input>
-                  </template>
-                </el-table-column>
-                <el-table-column label="操作">
-                  <template slot-scope="scope">
-                    <el-button
-                      size="mini"
-                      type="danger"
-                      icon="el-icon-delete"
-                      @click="deleteConditionItem(scope.$index)"
-                      >删除
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-              <el-button
-                type="primary"
-                class="inline-large-button mb10"
-                icon="el-icon-plus"
-                size="mini"
-                style="width: 100%"
-                @click="addConditionHandler"
-              >
-                添加条件
-              </el-button>
-            </div>
-          </el-col> -->
+                          <i class="el-icon-info"></i>
+                        </el-tooltip>
+                      </template>
+                      <template slot-scope="scope">
+                        <!-- <el-button
+                          type="info"
+                          size="small"
+                          icon="el-icon-edit"
+                          @click="editFlagHandler(scope.row, scope.$index)"
+                        >
+                        </el-button> -->
+                        <el-input
+                          v-model="scope.row.fieldValue"
+                          placeholder="请输入默认值"
+                          size="normal"
+                          clearable
+                        >
+                        </el-input>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="操作" align="center">
+                      <template slot-scope="scope">
+                        <el-button
+                          size="mini"
+                          type="danger"
+                          icon="el-icon-delete"
+                          @click="deleteFilterItem(scope.$index)"
+                          >删除
+                        </el-button>
+                      </template>
+                    </el-table-column>
+                  </el-table>
+                  <el-button
+                    type="primary"
+                    class="inline-large-button mb10"
+                    icon="el-icon-plus"
+                    size="mini"
+                    style="width: 100%"
+                    @click="addFilterHandler"
+                  >
+                    添加条件
+                  </el-button>
+                </div>
+              </el-form-item>
+            </el-col>
+          </div>
         </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -485,13 +481,13 @@
 
 <script>
 import {
-  listMenu,
-  getMenu,
-  delMenu,
-  addMenu,
-  updateMenu,
-} from "@/api/system/menu";
-import { listBtn, addBtn, getBtn, updateBtn, delBtn } from "@/api/system/btn";
+  listBtn,
+  addBtn,
+  getBtn,
+  updateBtn,
+  delBtn,
+  checkBtn,
+} from "@/api/system/btn";
 import { listForm } from "@/api/dragform/form";
 import { listProcess } from "@/api/bpmprocess/process";
 import { listTable } from "@/api/dragform/tableList";
@@ -500,7 +496,8 @@ import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import IconSelect from "@/components/IconSelect";
 import { v4 as uuidv4 } from "uuid";
-
+import { dragTableInfo } from "@/api/tablelist/commonTable";
+import { camelCase } from "@/utils";
 export default {
   name: "ExcuteBtnMange",
   dicts: ["sys_show_hide", "sys_normal_disable"],
@@ -621,6 +618,17 @@ export default {
       tableOptions: [],
       processOptions: [],
       scriptOptions: [],
+      // 普遍字段参数
+      commonFieldData: [
+        {
+          fieldName: "",
+          fieldValue: "",
+        },
+      ],
+      rootFieldInfo: {
+        tableName: "",
+        fieldList: [],
+      },
     };
   },
   created() {
@@ -628,6 +636,63 @@ export default {
     this.initFormSubData();
   },
   methods: {
+    // 删除公共传参
+    deleteFilterItem(index) {
+      this.commonFieldData.splice(index, 1);
+    },
+    // 添加公共传参
+    addFilterHandler() {
+      this.commonFieldData.push({
+        fieldName: "",
+        fieldValue: "",
+      });
+    },
+    // 获取根节点绑定表格的字段数据
+    async getRootFieldInfo(btnKey) {
+      let res = await checkBtn({ btnKey });
+      if (res.code == 200) {
+        if (res.rows[0]?.tableKey) {
+          let tableInfo = await dragTableInfo({
+            queryMap: { tableKey: res.rows[0].tableKey },
+          });
+          this.rootFieldInfo.fieldList = this.columnsHandler(
+            JSON.parse(tableInfo.data.resultMap.template.dtColumnName)
+          );
+          console.log(this.rootFieldInfo.fieldList);
+        }
+      }
+    },
+    // 处理列表信息
+    columnsHandler(columns) {
+      let resArr = [];
+      columns.forEach((item) => {
+        for (const key in item) {
+          let tempObj = {};
+          tempObj.key = camelCase(key);
+          tempObj.value = item[key];
+          resArr.push(tempObj);
+        }
+      });
+      return resArr;
+    },
+    // 给所有节点设置根节点key
+    setRootBtnKey(rows, rootKey = "") {
+      if (rows.length == 0) {
+        return rows;
+      }
+      for (let i = 0; i < rows.length; i++) {
+        let row = rows[i];
+        if (row.btnParentId == 0) {
+          row.rootKey = row.btnKey;
+        } else {
+          row.rootKey = rootKey;
+        }
+        if (row.children.length != 0) {
+          row.children = this.setRootBtnKey(row.children, row.rootKey);
+        }
+      }
+      return rows;
+    },
     // 选择图标
     selected(name) {
       this.btnGroupFormData.btnIcon = name;
@@ -637,7 +702,9 @@ export default {
       this.loading = true;
 
       listBtn(this.queryParams).then((response) => {
-        this.btnList = response.rows;
+        let res = this.setRootBtnKey(response.rows);
+        console.log(res);
+        this.btnList = res;
         console.log("btnList", this.btnList);
         this.loading = false;
       });
@@ -726,7 +793,7 @@ export default {
       this.handleQuery();
     },
     /** 新增按钮操作 */
-    handleAdd(row) {
+    async handleAdd(row) {
       this.title = "新增按钮";
       this.reset();
       this.getTreeselect();
@@ -734,6 +801,7 @@ export default {
       this.editType = row ? true : false;
       if (row != null && row.id) {
         //在已知节点下新增
+        await this.getRootFieldInfo(row.rootKey);
         this.btnGroupFormData.btnParentId = row.id;
       } else {
         this.btnGroupFormData.btnParentId = 0;
@@ -751,10 +819,12 @@ export default {
       });
     },
     /** 修改按钮操作 */
-    handleUpdate(row) {
+    async handleUpdate(row) {
       this.reset();
       this.getTreeselect();
       this.editType = false;
+      //在已知节点下新增
+      await this.getRootFieldInfo(row.rootKey);
       getBtn(row.id).then((response) => {
         this.btnGroupFormData = response.data;
         this.open = true;
@@ -774,15 +844,30 @@ export default {
       }
       return res;
     },
+    // 获取公共数据
+    // getCommonData(list) {
+    //   if (list.length == 0) return '';
+
+    // },
     /** 提交按钮 */
     submitForm() {
       this.$refs["btnGroupFormRef"].validate(async (valid) => {
         if (valid) {
-          let validateRes = myValidate(this.btnGroupFormData);
+          let validateRes = this.myValidate(this.btnGroupFormData);
           if (!validateRes.flag) {
             this.$message.error(validateRes.msg);
             return;
           }
+          // 获取公共参数
+          // let commonData=this.getCommonData(this.commonFieldData)
+          if (
+            this.btnGroupFormData.btnType != 3 &&
+            this.btnGroupFormData.btnType != 7
+          ) {
+            this.btnGroupFormData.btnParams = JSON.stringify(
+              this.commonFieldData
+            );
+          }
           if (this.editType) {
             // 新增按钮组
             this.btnGroupFormData.btnKey = uuidv4();
@@ -879,4 +964,10 @@ export default {
 .submenu-title-noDropdown:hover {
   background-color: linear-gradient(to right, blue, rgb(69, 118, 225));
 }
+
+.filter-table-wrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
 </style>

+ 1 - 1
ruoyi-ui/src/views/system/fromModel/index.vue

@@ -92,7 +92,7 @@ export default {
         // Object.assign(formSQL, item.options.sqlData);
         let sqlList = item.options.sqlData.sqls;
         formSQL[item.options.dynamicKey] = {};
-        formSQL[item.options.dynamicKey].sqls =
+        formSQL[item.options.dynamicKey] =
           item.type == "select" ? sqlList[0] : sqlList;
       });
 

+ 33 - 2
ruoyi-ui/src/views/tablelist/commonTable/listInfo.vue

@@ -272,7 +272,7 @@ import {
 import { listData } from "@/api/system/tenant/data";
 import { getToken } from "@/utils/auth";
 import Queryfrom from "@/views/tablelist/commonTable/queryfrom.vue";
-import { camelCase } from "@/utils";
+import { camelCase, toUnderline } from "@/utils";
 import { inputDisableComplete } from "@/utils/other";
 import Menu from "./BtnMenu.vue";
 import { checkRole } from "@/utils/permission";
@@ -370,6 +370,8 @@ export default {
       dynamicData: {},
       // 当前点击按钮的数据
       currentBtnData: {},
+      // 当前点击行的数据
+      currentRow: {},
     };
   },
 
@@ -605,6 +607,7 @@ export default {
     /** 修改按钮操作 */
     async handleUpdate(row, btnData) {
       console.log(this.currentBtnData);
+      console.log("row", row);
 
       // 新的修改请求
       try {
@@ -639,7 +642,6 @@ export default {
         //   realField = realField[0].toLocaleLowerCase() + realField.substring(1);
         //   resultMap[realField] = resultMap[field];
         // });
-        console.log(resultMap);
         Object.assign(this.defaultValue, resultMap);
         this.jsonData = JSON.parse(res.data.template.dfVueTemplate);
         this.open = true;
@@ -741,7 +743,18 @@ export default {
         conditionMap: {
           // id: delIds,
         },
+        btnParametersMap: {},
       };
+      if (this.currentBtnData.btnParams) {
+        let btnParams = JSON.parse(this.currentBtnData.btnParams);
+        btnParams.forEach((item) => {
+          data.btnParametersMap[
+            this.formatField(item.fieldName, camelCase(this.tableName))
+          ] = item.fieldValue
+            ? item.fieldValue
+            : this.currentRow[item.fieldName];
+        });
+      }
       data.conditionMap[this.templateInfo.template?.primaryKey] = delIds;
       this.$modal
         .confirm('是否确认删除"' + delIds + '"的数据项?')
@@ -828,6 +841,12 @@ export default {
     submitFileForm() {
       this.$refs.upload.submit();
     },
+    // 去掉表名 开头字母小写
+    formatField(field = "", tableName) {
+      console.log(field, tableName);
+      let temp = field.replace(tableName, "");
+      return toUnderline(temp[0].toLowerCase() + temp.slice(1));
+    },
     //提交编辑结果按钮回调
     editConfirmHandler() {
       this.$refs.addFromRef
@@ -842,7 +861,18 @@ export default {
             addListMap: [values],
             conditionMap: {},
             commMap: {},
+            btnParametersMap: {},
           };
+          if (this.currentBtnData.btnParams) {
+            let btnParams = JSON.parse(this.currentBtnData.btnParams);
+            btnParams.forEach((item) => {
+              data.btnParametersMap[
+                this.formatField(item.fieldName, camelCase(this.tableName))
+              ] = item.fieldValue
+                ? item.fieldValue
+                : this.currentRow[item.fieldName];
+            });
+          }
           if (Object.keys(this.defaultValue).length) {
             //修改
             // 后台接收需要是表中字段真实的名称,无所谓驼峰。
@@ -1054,6 +1084,7 @@ export default {
     excuteHandler(btnData, row) {
       let { btnType, btnParams } = btnData;
       this.currentBtnData = btnData;
+      this.currentRow = JSON.parse(JSON.stringify(row));
       switch (
         btnType //3:内链  6:目录  7:外链  8:修改  9:删除
       ) {