Selaa lähdekoodia

Merge branch 'master' of http://47.110.251.215:3000/web/saber into master

zhangh 3 vuotta sitten
vanhempi
commit
99a63315f3

+ 89 - 87
src/api/system/role.js

@@ -1,128 +1,130 @@
 import request from '@/router/axios';
 
 export const getList = (current, size, params) => {
-    return request({
-        url: '/api/blade-system/role/list',
-        method: 'get',
-        params: {
-            ...params,
-            current,
-            size,
-        }
-    })
+  return request({
+    url: '/api/blade-system/role/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
 }
 export const grantTree = () => {
-    return request({
-        url: '/api/blade-system/menu/grant-tree',
-        method: 'get',
-    })
+  return request({
+    url: '/api/blade-system/menu/grant-tree',
+    method: 'get',
+  })
 }
 
-export const grant = (roleIds, menuIds, dataScopeIds, apiScopeIds) => {
-    return request({
-        url: '/api/blade-system/role/grant',
-        method: 'post',
-        data: {
-            roleIds,
-            menuIds,
-            dataScopeIds,
-            apiScopeIds
-        }
-    })
+export const grant = (roleIds, menuIds, menuClientIds, dataScopeIds, apiScopeIds, tableOwners) => {
+  return request({
+    url: '/api/blade-system/role/grant',
+    method: 'post',
+    data: {
+      roleIds,
+      menuIds,
+      menuClientIds,
+      tableOwners,
+      dataScopeIds,
+      apiScopeIds
+    }
+  })
 }
 
 export const remove = (ids) => {
-    return request({
-        url: '/api/blade-system/role/remove',
-        method: 'post',
-        params: {
-            ids,
-        }
-    })
+  return request({
+    url: '/api/blade-system/role/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
 }
 
 export const add = (row) => {
-    return request({
-        url: '/api/blade-system/role/submit',
-        method: 'post',
-        data: row
-    })
+  return request({
+    url: '/api/blade-system/role/submit',
+    method: 'post',
+    data: row
+  })
 }
 
 export const update = (row) => {
-    return request({
-        url: '/api/blade-system/role/submit',
-        method: 'post',
-        data: row
-    })
+  return request({
+    url: '/api/blade-system/role/submit',
+    method: 'post',
+    data: row
+  })
 }
 
 
 export const getRole = (roleIds) => {
-    return request({
-        url: '/api/blade-system/menu/role-tree-keys',
-        method: 'get',
-        params: {
-            roleIds,
-        }
-    })
+  return request({
+    url: '/api/blade-system/menu/role-tree-keys',
+    method: 'get',
+    params: {
+      roleIds,
+    }
+  })
 }
 
 export const getRoleTree = () => {
-    return request({
-        url: '/api/blade-system/dict-biz/dictionary',
-        method: 'get',
-        params: {
-            code: 'maintainer_role',
-        }
-    })
+  return request({
+    url: '/api/blade-system/dict-biz/dictionary',
+    method: 'get',
+    params: {
+      code: 'maintainer_role',
+    }
+  })
 }
 
 //所属角色
 export const roletree = () => {
-    return request({
-        url: '/api/blade-system/role/tree',
-        method: 'get',
-        params: {
-            tenantId: ''
-        }
-    })
+  return request({
+    url: '/api/blade-system/role/tree',
+    method: 'get',
+    params: {
+      tenantId: ''
+    }
+  })
 }
 
 export const getRoleTreeById = (roleId) => {
-    return request({
-        url: '/api/blade-system/role/tree-by-id',
-        method: 'get',
-        params: {
-            roleId,
-        }
-    })
+  return request({
+    url: '/api/blade-system/role/tree-by-id',
+    method: 'get',
+    params: {
+      roleId,
+    }
+  })
 }
 
 export const treeUser = (roleId) => {
-    return request({
-        url: '/api/blade-system/role/treeTow',
-        method: 'get',
-        params: {
-            roleId,
-        }
-    })
+  return request({
+    url: '/api/blade-system/role/treeTow',
+    method: 'get',
+    params: {
+      roleId,
+    }
+  })
 }
 
 //编辑加载项目合同段信息
 export const findProjectAndContractList = (params) => {
-    return request({
-        url: '/api/blade-manager/projectInfo/findProjectAndContractList',
-        method: 'get',
-        params
-    })
+  return request({
+    url: '/api/blade-manager/projectInfo/findProjectAndContractList',
+    method: 'get',
+    params
+  })
 }
 
 //编辑新增项目合同段信息
 export const saveUserInfoByProjectTow = (params) => {
-    return request({
-        url: '/api/blade-manager/contractInfo/saveUserInfoByProjectTow',
-        method: 'post',
-        data: params
-    })
-}
+  return request({
+    url: '/api/blade-manager/contractInfo/saveUserInfoByProjectTow',
+    method: 'post',
+    data: params
+  })
+}

+ 324 - 309
src/views/authority/role.vue

@@ -43,7 +43,7 @@
       title="角色权限配置"
       append-to-body
       :visible.sync="box"
-      width="567px"
+      width="610px"
     >
       <el-tabs type="border-card">
         <el-tab-pane label="后管菜单权限">
@@ -58,41 +58,53 @@
           </el-tree>
         </el-tab-pane>
 
-        <el-tab-pane label="数据权限">
+        <el-tab-pane label="客户端菜单权限">
           <el-tree
-            :data="dataScopeGrantList"
+            :data="menuClientList"
             show-checkbox
             node-key="id"
-            ref="treeDataScope"
-            :default-checked-keys="dataScopeTreeObj"
+            ref="treeClientMenu"
+            :default-checked-keys="menuClientObj"
             :props="props"
           >
           </el-tree>
         </el-tab-pane>
-        <el-tab-pane label="接口权限">
+
+        <el-tab-pane label="表单权限">
           <el-tree
-            :data="apiScopeGrantList"
+            :data="tableOwnerList"
             show-checkbox
             node-key="id"
-            ref="treeApiScope"
-            :default-checked-keys="apiScopeTreeObj"
+            ref="tableOwners"
+            :default-checked-keys="tableOwnerObj"
             :props="props"
           >
           </el-tree>
         </el-tab-pane>
 
-        <el-tab-pane label="表单权限">
+        <el-tab-pane label="数据权限">
           <el-tree
-            :data="ExcelRole"
+            :data="dataScopeGrantList"
+            show-checkbox
+            node-key="id"
+            ref="treeDataScope"
+            :default-checked-keys="dataScopeTreeObj"
+            :props="props"
+          >
+          </el-tree>
+        </el-tab-pane>
+        <el-tab-pane label="接口权限">
+          <el-tree
+            :data="apiScopeGrantList"
             show-checkbox
             node-key="id"
             ref="treeApiScope"
+            :default-checked-keys="apiScopeTreeObj"
             :props="props"
           >
-
-            <!-- :default-checked-keys="apiScopeTreeObj" -->
           </el-tree>
         </el-tab-pane>
+
       </el-tabs>
 
       <span
@@ -110,325 +122,328 @@
 </template>
 
 <script>
-import { add, getList, getRole, getRoleTreeById, grant, grantTree, remove, update } from "@/api/system/role";
-import { getPostList } from "@/api/system/post";
-import { mapGetters } from "vuex";
-import website from '@/config/website';
+  import {add, getList, getRole, getRoleTreeById, grant, grantTree, remove, update} from "@/api/system/role";
+  import {getPostList} from "@/api/system/post";
+  import {mapGetters} from "vuex";
+  import website from '@/config/website';
 
-export default {
-  data () {
-    return {
-      ExcelRole: [],//表单权限
-      form: {},
-      box: false,
-      props: {
-        label: "title",
-        value: "key"
-      },
-      menuGrantList: [],
-      dataScopeGrantList: [],
-      apiScopeGrantList: [],
-      apiGrantList: [],
-      menuTreeObj: [],
-      dataScopeTreeObj: [],
-      apiScopeTreeObj: [],
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0
-      },
-      option: {
-        tip: false,
-        simplePage: true,
-        searchShow: true,
-        searchMenuSpan: 6,
-        tree: true,
-        border: true,
-        index: true,
-        selection: true,
-        viewBtn: true,
-        dialogWidth: 900,
-        dialogClickModal: false,
-        column: [
-          {
-            label: "角色名称",
-            prop: "roleName",
-            search: true,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: "请输入角色名称",
-                trigger: "blur"
-              }
-            ]
-          },
-          {
-            label: "所属租户",
-            prop: "tenantId",
-            type: "tree",
-            dicUrl: "/api/blade-system/tenant/select",
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: website.tenantMode,
-            span: 24,
-            props: {
-              label: "tenantName",
-              value: "tenantId"
+  export default {
+    data() {
+      return {
+        form: {},
+        box: false,
+        props: {
+          label: "title",
+          value: "key"
+        },
+        menuGrantList: [],
+        dataScopeGrantList: [],
+        menuClientList: [],
+        apiScopeGrantList: [],
+        tableOwnerList: [],
+        apiGrantList: [],
+        menuTreeObj: [],
+        menuClientObj: [],
+        tableOwnerObj: [],
+        dataScopeTreeObj: [],
+        apiScopeTreeObj: [],
+        selectionList: [],
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        option: {
+          tip: false,
+          simplePage: true,
+          searchShow: true,
+          searchMenuSpan: 6,
+          tree: true,
+          border: true,
+          index: true,
+          selection: true,
+          viewBtn: true,
+          dialogWidth: 900,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "角色名称",
+              prop: "roleName",
+              search: true,
+              span: 24,
+              rules: [
+                {
+                  required: true,
+                  message: "请输入角色名称",
+                  trigger: "blur"
+                }
+              ]
             },
-            hide: !website.tenantMode,
-            search: website.tenantMode,
-            rules: [{
-              required: true,
-              message: "请输入所属租户",
-              trigger: "click"
-            }]
-          },
-          {
-            label: "角色别名",
-            prop: "roleAlias",
-            search: true,
-            span: 24,
-            rules: [
-              {
+            {
+              label: "所属租户",
+              prop: "tenantId",
+              type: "tree",
+              dicUrl: "/api/blade-system/tenant/select",
+              addDisplay: false,
+              editDisplay: false,
+              viewDisplay: website.tenantMode,
+              span: 24,
+              props: {
+                label: "tenantName",
+                value: "tenantId"
+              },
+              hide: !website.tenantMode,
+              search: website.tenantMode,
+              rules: [{
                 required: true,
-                message: "请输入角色别名",
-                trigger: "blur"
-              }
-            ]
-          },
-          // {
-          //   label: "所属岗位",
-          //   prop: "pId",
-          //   type: "tree",
-          //   hide: true,
-          //   dicData: [],
-          //   props: {
-          //     label: "postName",
-          //     value: "id"
-          //   },
-          //   rules: [{
-          //     required: true,
-          //     message: "请选择所属岗位",
-          //     trigger: "click"
-          //   }],
-          // },
-          {
-            label: "上级角色",
-            prop: "parentId",
-            dicData: [],
-            type: "tree",
-            hide: true,
-            span: 24,
-            props: {
-              label: "title"
-            },
-            rules: [
-              {
-                required: false,
-                message: "请选择上级角色",
+                message: "请输入所属租户",
                 trigger: "click"
-              }
-            ]
-          },
-          {
-            label: "角色排序",
-            prop: "sort",
-            type: "number",
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: "请输入角色排序",
-                trigger: "blur"
-              }
-            ]
-          }
-        ]
-      },
-      data: []
-    };
-  },
-  computed: {
-    ...mapGetters(["userInfo", "permission"]),
-    permissionList () {
-      return {
-        addBtn: this.vaildData(this.permission.role_add, false),
-        viewBtn: this.vaildData(this.permission.role_view, false),
-        delBtn: this.vaildData(this.permission.role_delete, false),
-        editBtn: this.vaildData(this.permission.role_edit, false)
+              }]
+            },
+            {
+              label: "角色别名",
+              prop: "roleAlias",
+              search: true,
+              span: 24,
+              rules: [
+                {
+                  required: true,
+                  message: "请输入角色别名",
+                  trigger: "blur"
+                }
+              ]
+            },
+            {
+              label: "上级角色",
+              prop: "parentId",
+              dicData: [],
+              type: "tree",
+              hide: true,
+              span: 24,
+              props: {
+                label: "title"
+              },
+              rules: [
+                {
+                  required: false,
+                  message: "请选择上级角色",
+                  trigger: "click"
+                }
+              ]
+            },
+            {
+              label: "角色排序",
+              prop: "sort",
+              type: "number",
+              span: 24,
+              rules: [
+                {
+                  required: true,
+                  message: "请输入角色排序",
+                  trigger: "blur"
+                }
+              ]
+            }
+          ]
+        },
+        data: []
       };
     },
-    ids () {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
+    computed: {
+      ...mapGetters(["userInfo", "permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.role_add, false),
+          viewBtn: this.vaildData(this.permission.role_view, false),
+          delBtn: this.vaildData(this.permission.role_delete, false),
+          editBtn: this.vaildData(this.permission.role_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
 
-      });
-      return ids.join(",");
-    },
-    idsArray () {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids;
-    }
-  },
-  methods: {
-    initData (roleId) {
-      getRoleTreeById(roleId).then(res => {
-        const column = this.findObject(this.option.column, "parentId");
-        column.dicData = res.data.data;
-      });
-      let tenantId = website.tenantId;
-      getPostList(tenantId).then(res => {
-        const column = this.findObject(this.option.column, "pId");
-        column.dicData = res.data.data;
-      });
-    },
-    submit () {
-      const menuList = this.$refs.treeMenu.getCheckedKeys();
-      const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
-      const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
-      grant(this.idsArray, menuList, dataScopeList, apiScopeList).then(() => {
-        this.box = false;
-        this.$message({
-          type: "success",
-          message: "操作成功!"
         });
-        this.onLoad(this.page);
-      });
-    },
-    rowSave (row, done, loading) {
-      add(row).then(() => {
-        this.onLoad(this.page);
-        this.$message({
-          type: "success",
-          message: "操作成功!"
+        return ids.join(",");
+      },
+      idsArray() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
         });
-        done();
-      }, error => {
-        window.console.log(error);
-        loading();
-      });
+        return ids;
+      }
     },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(() => {
-        this.onLoad(this.page);
-        this.$message({
-          type: "success",
-          message: "操作成功!"
+    methods: {
+      initData(roleId) {
+        getRoleTreeById(roleId).then(res => {
+          const column = this.findObject(this.option.column, "parentId");
+          column.dicData = res.data.data;
         });
-        done();
-      }, error => {
-        window.console.log(error);
-        loading();
-      });
-    },
-    rowDel (row) {
-      this.$confirm("确定将选择数据删除?", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
+        let tenantId = website.tenantId;
+        getPostList(tenantId).then(res => {
+          const column = this.findObject(this.option.column, "pId");
+          column.dicData = res.data.data;
+        });
+      },
+
+      submit() {
+        const menuList = this.$refs.treeMenu.getCheckedKeys();
+        const menuClientList = this.$refs.treeClientMenu.getCheckedKeys();
+        const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
+        const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
+        const tableOwnersList = this.$refs.tableOwners.getCheckedKeys();
+
+        grant(this.idsArray, menuList, menuClientList, dataScopeList, apiScopeList, tableOwnersList).then(() => {
+          this.box = false;
           this.$message({
             type: "success",
             message: "操作成功!"
           });
+          this.onLoad(this.page);
         });
-    },
-    searchReset () {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange (params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange (list) {
-      this.selectionList = list;
-    },
-    selectionClear () {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    beforeOpen (done, type) {
-      if (["add", "edit"].includes(type)) {
-        this.initData(this.form.id);
-      }
-      done();
-    },
-    handleRole () {
-      if (this.selectionList.length !== 1) {
-        this.$message.warning("只能选择一条数据");
-        return;
-      }
-      this.menuTreeObj = [];
-      this.dataScopeTreeObj = [];
-      this.apiScopeTreeObj = [];
-      grantTree()
-        .then(res => {
-          this.menuGrantList = res.data.data.menu;
-          this.dataScopeGrantList = res.data.data.dataScope;
-          this.apiScopeGrantList = res.data.data.apiScope;
-          getRole(this.ids).then(res => {
-            this.menuTreeObj = res.data.data.menu;
-            this.dataScopeTreeObj = res.data.data.dataScope;
-            this.apiScopeTreeObj = res.data.data.apiScope;
-            this.box = true;
+      },
+
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
           });
+          done();
+        }, error => {
+          window.console.log(error);
+          loading();
         });
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning("请选择至少一条数据");
-        return;
-      }
-      this.$confirm("确定将选择数据删除?", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
+      },
+
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
           this.onLoad(this.page);
           this.$message({
             type: "success",
             message: "操作成功!"
           });
-          this.$refs.crud.toggleSelection();
+          done();
+        }, error => {
+          window.console.log(error);
+          loading();
         });
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad (page, params = {}) {
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        this.data = res.data.data;
-        this.loading = false;
-        this.selectionClear();
-      });
+      },
+
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      beforeOpen(done, type) {
+        if (["add", "edit"].includes(type)) {
+          this.initData(this.form.id);
+        }
+        done();
+      },
+
+      handleRole() {
+        if (this.selectionList.length !== 1) {
+          this.$message.warning("只能选择一条数据");
+          return;
+        }
+        this.menuTreeObj = [];
+        this.menuClientObj = [];
+        this.dataScopeTreeObj = [];
+        this.apiScopeTreeObj = [];
+        this.tableOwnerObj = [];
+        grantTree()
+          .then(res => {
+            this.menuGrantList = res.data.data.menu;
+            this.menuClientList = res.data.data.usermenu;
+            this.tableOwnerList = res.data.data.tableOwners;
+            this.dataScopeGrantList = res.data.data.dataScope;
+            this.apiScopeGrantList = res.data.data.apiScope;
+            getRole(this.ids).then(res => {
+              this.menuTreeObj = res.data.data.menu;
+              this.menuClientObj = res.data.data.usermenu;
+              this.tableOwnerObj = res.data.data.tableOwners;
+              this.dataScopeTreeObj = res.data.data.dataScope;
+              this.apiScopeTreeObj = res.data.data.apiScope;
+              this.box = true;
+            });
+          });
+      },
+
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      currentChange(currentPage) {
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize) {
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          this.data = res.data.data;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
     }
-  }
-};
+  };
 </script>

+ 66 - 0
src/views/formula/component/funComponent/datasReme.vue

@@ -0,0 +1,66 @@
+<template>
+  <div>
+    <div>
+      <span class="mg-r-20">去空</span>
+      <!-- <el-button size="small" type="info" @click="showSelectEle">选择参数</el-button> -->
+      <el-switch
+        v-model="value1"
+        active-text="开"
+        inactive-text="关"
+        @change="switchChange"
+        >
+      </el-switch>
+    </div>
+    
+  </div>
+</template>
+
+<script>
+export default {
+  name: "dateFormat",
+  props: {
+    formulainfo: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+    curele: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+  },
+  data(){
+    return{
+      value1:true
+    }
+  },
+  mounted(){
+    //console.log(this.formulainfo.arguments[0])
+    //console.log(this.formulainfo.arguments[1])
+    if(this.formulainfo.isOn === false){
+      this.value1 = false;
+    }
+
+  },
+  methods:{
+    showSelectEle(){
+      this.$set(this.formulainfo,'showSelectEle',!this.formulainfo.showSelectEle);
+    },
+
+    switchChange(value){
+      this.formulainfo.isOn = value;
+      
+    },
+
+    setELe(){
+
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+  
+</style>

+ 66 - 0
src/views/formula/component/funComponent/datasRepeat.vue

@@ -0,0 +1,66 @@
+<template>
+  <div>
+    <div>
+      <span class="mg-r-20">去重</span>
+      <!-- <el-button size="small" type="info" @click="showSelectEle">选择参数</el-button> -->
+      <el-switch
+        v-model="value1"
+        active-text="开"
+        inactive-text="关"
+        @change="switchChange"
+        >
+      </el-switch>
+    </div>
+    
+  </div>
+</template>
+
+<script>
+export default {
+  name: "dateFormat",
+  props: {
+    formulainfo: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+    curele: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+  },
+  data(){
+    return{
+      value1:true
+    }
+  },
+  mounted(){
+    //console.log(this.formulainfo.arguments[0])
+    //console.log(this.formulainfo.arguments[1])
+    if(this.formulainfo.isOn === false){
+      this.value1 = false;
+    }
+
+  },
+  methods:{
+    showSelectEle(){
+      this.$set(this.formulainfo,'showSelectEle',!this.formulainfo.showSelectEle);
+    },
+
+    switchChange(value){
+      this.formulainfo.isOn = value;
+      
+    },
+
+    setELe(){
+
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+  
+</style>

+ 149 - 0
src/views/formula/component/funComponent/dateDeviation.vue

@@ -0,0 +1,149 @@
+<template>
+  <div>
+    <div>
+      <span class="mg-r-10">日期增减</span>
+      <el-button size="small" type="info" @click="showSelectEle">选择参数</el-button>
+    </div>
+    <div class="text-warning">
+      输入某个固定日期/选择引用某个日期参数+/-固定天数(可选择引用某个参数值,也可输入固定值)
+    </div>
+    <div class="mg-t-10 flex">
+      <template>
+        <el-tag closable v-if="arg0Name" @close="deleteEle('0')">{{arg0Name}}</el-tag>
+        <el-input v-else :value="''" @focus="curFocusIndex = 1" placeholder="引用参数名称" size="medium" style="width:100px"></el-input>
+      </template>
+      
+      <span style="font-size:35px" class="mg-l-20 mg-r-20">/</span>
+      <el-date-picker v-model="dateValue" type="date" size="medium" placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd" @change="dateChange"></el-date-picker>
+      <el-select v-model="operator" @change="operChange" placeholder="请选择" size="medium" style="width:100px" class="mg-l-20 mg-r-20">
+        <el-option label="+" value="+"></el-option>
+        <el-option label="-" value="-"></el-option>
+      </el-select>
+
+      <template>
+        <el-tag closable v-if="arg1Name" @close="deleteEle('1')">{{arg1Name}}</el-tag>
+        <el-input v-else :value="''" @focus="curFocusIndex = 2" size="medium" placeholder="参数名称" style="width:100px"></el-input>
+      </template>
+
+      <span style="font-size:35px" class="mg-l-20 mg-r-20">/</span>
+      <el-input v-model="input" placeholder="输入值" size="medium" @change="inputChange" style="width:100px"></el-input>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "dateDeviation",
+  props: {
+    formulainfo: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+    curele: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+  },
+  data(){
+    return{
+      dateValue:'',
+      operator:'+',
+      input:'',
+      arg0Name:"",
+      arg1Name:"",
+
+      curFocusIndex:0,
+    }
+  },
+  mounted(){
+    //console.log(this.formulainfo.arguments[0])
+    //console.log(this.formulainfo.arguments[1])
+    let arg0 = this.formulainfo.arguments[0];
+    let arg1 = this.formulainfo.arguments[1];
+    if(this.isELe(arg0)){
+      this.arg0Name = arg0.name;
+    }else{
+      this.dateValue = arg0;
+    }
+
+    if(this.isELe(arg1)){
+      this.arg1Name = arg1.name;
+    }else{
+      this.input = arg1;
+    }
+  },
+  methods:{
+    showSelectEle(){
+      this.$set(this.formulainfo,'showSelectEle',!this.formulainfo.showSelectEle);
+    },
+
+    deleteEle(type){
+      if(type == '0'){
+        this.arg0Name = '';
+        this.formulainfo.arguments[0] = undefined;
+      }else if(type == '1'){
+        this.arg1Name = '';
+        this.formulainfo.arguments[1] = undefined;
+      }
+    },
+
+    isELe(ele){
+      if(typeof ele == 'object' && ele != null){
+        return true;
+      }
+      return false;
+    },
+
+    dateChange(value){
+      this.arg0Name = '';
+      this.formulainfo.arguments[0] = value;
+    },
+
+    inputChange(value){
+      this.arg1Name = '';
+      this.formulainfo.arguments[1] = value;
+    },
+
+    operChange(value){
+      if(!this.isELe(this.formulainfo.arguments[1])){
+        if(value == '-'){
+          this.formulainfo.arguments[1] = value + this.input;
+        }else{
+          this.formulainfo.arguments[1] = this.input;
+        }
+      }
+    },
+
+    setELe(ele){
+      if(this.curFocusIndex){
+        let obj = {
+          type:'Element',
+          name:ele.eName,
+          id:ele.id,
+          selected:false,
+          tableElementKey:ele.tableElementKey,
+          children:[],
+        }
+        if(this.curFocusIndex == 1){
+          this.formulainfo.arguments[0] = obj;
+          this.arg0Name = obj.name;
+          this.dateValue = '';
+        }else if(this.curFocusIndex == 2){
+          this.formulainfo.arguments[1] = obj;
+          this.arg1Name = obj.name;
+          this.input = '';
+        }
+
+        this.curFocusIndex = 0;
+      }
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+  
+</style>

+ 85 - 0
src/views/formula/component/funComponent/dateFormat.vue

@@ -0,0 +1,85 @@
+<template>
+  <div>
+    <div>
+      <span class="mg-r-10">日期格式转换</span>
+      <!-- <el-button size="small" type="info" @click="showSelectEle">选择参数</el-button> -->
+    </div>
+    <div class="text-warning mg-t-10 mg-b-10">
+      选择转成过后的格式
+    </div>
+    <div class="mg-t-10 flex">
+      <el-select v-model="formatText" @change="formatChange" allow-create filterable placeholder="请选择" size="medium" style="width:300px" class=" mg-r-20">
+        <el-option label="xxxx年xx月xx日" value="xxxx年xx月xx日"></el-option>
+        <el-option label="xxxx/xx/xx" value="xxxx/xx/xx"></el-option>
+        <el-option label="xxxx-xx-xx" value="xxxx-xx-xx"></el-option>
+        <el-option label="xxxx.xx.xx" value="xxxx.xx.xx"></el-option>
+      </el-select>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "dateFormat",
+  props: {
+    formulainfo: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+    curele: {
+      type: Object,
+      default: function () {
+        return {};
+      }
+    },
+  },
+  data(){
+    return{
+      formatText:'',
+
+      fromatReg:/[xyY]{4}([^xyYmM]*)[xmM]{1,2}([^xmMdD]*)[xdD]{1,2}([^xdD]*)/,
+    }
+  },
+  mounted(){
+    //console.log(this.formulainfo.arguments[0])
+    //console.log(this.formulainfo.arguments[1])
+    let arg1 = this.formulainfo.arguments[1];
+    if(arg1){
+      let regRes = arg1.match(this.fromatReg);
+      //console.log(regRes)
+      this.formatText = 'xxxx' + regRes[1] + 'xx' + regRes[2] + 'xx' + regRes[3];
+    }
+
+  },
+  methods:{
+    showSelectEle(){
+      this.$set(this.formulainfo,'showSelectEle',!this.formulainfo.showSelectEle);
+    },
+
+    formatChange(value){
+      if(this.fromatReg.test(value)){
+        let regRes = value.match(this.fromatReg);
+        //console.log(regRes)
+        this.formulainfo.arguments[1] = 'yyyy' + regRes[1] + 'MM' + regRes[2] + 'dd' + regRes[3];
+      }else{
+        this.$message({
+          type: "error",
+          message: "格式不正确"
+        });
+        this.formulainfo.arguments[1] = '';
+        this.formatText = '';
+      }
+      
+    },
+
+    setELe(){
+
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+  
+</style>

+ 77 - 4
src/views/formula/edit.vue

@@ -161,9 +161,50 @@
     <div v-if="!operationVisible && showFunDetail">
       <el-tabs v-model="actiFunIndex" closable @tab-remove="removeFun" :before-leave="funLeave">
         <el-tab-pane v-for="(item,index) in equationSelectEle.children" :key="index" :label="item.name" :name="index.toString()">
-          <formula-template :formulainfo="item" :curele="equationSelectEle" @sele-ele-handle="showChooseEle">
-            
-          </formula-template>
+          <template v-if="!componentMap[item.name]">
+            <formula-template ref="dynamiccomponent" :formulainfo="item" :curele="equationSelectEle" @sele-ele-handle="showChooseEle">
+            </formula-template>
+          </template>
+          <template v-else>
+            <div class="flex">
+              <div class="flex flex-d-c">
+                <component ref="dynamiccomponent" v-bind:is="componentMap[item.name]" :formulainfo="item" :curele="equationSelectEle" class="flex1"></component>
+                <div v-show="item.showSelectEle">
+                  <el-select v-model="eleTableId" @change="getTableEleComp" placeholder="请选择元素表" style="width:100%">
+                    <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
+                  </el-select>
+                  <div class="mg-t-10 mg-b-10 no-mb-col" style="width:900px">
+                    <el-scrollbar style="max-height: 210px;min-height:100px">
+                      <el-row>
+                        <el-col :span="6" v-for="item in eleListComp" :key="item.id">
+                          <div class="ele-box">
+                            <span>{{item.eName}}</span>
+                            <el-checkbox @change="value => setComponentEle(value,item,index)"></el-checkbox>
+                          </div>
+                        </el-col>
+                      </el-row>
+                    </el-scrollbar>
+                  </div>
+                </div>
+              </div>
+              <div class="flex1" v-show="item.showSelectEle">
+                <el-scrollbar style="height: 460px">
+                  <el-tree
+                    class="filter-tree"
+                    lazy
+                    :load="loadNode"
+                    @node-click="getNodeDetail"
+                    :props="defaultProps"
+                    :expand-on-click-node="false"
+                    highlight-current
+                    node-key="id"
+                    ref="tree"
+                  >
+                  </el-tree>
+                </el-scrollbar>
+              </div>
+            </div>
+          </template>
         </el-tab-pane>
       </el-tabs>
     </div>
@@ -235,12 +276,22 @@ import {mapGetters} from "vuex";
 import formulaItem from "./component/formulaItem"
 import formulaTemplate from "./component/formulaTemplate"
 
+import dateDeviation from "./component/funComponent/dateDeviation"
+import dateFormat from "./component/funComponent/dateFormat"
+import datasRepeat from "./component/funComponent/datasRepeat"
+import datasReme from "./component/funComponent/datasReme"
+
 import {formulaArrayToString} from "./formulaArrayToString"
 import {formulaStringToArray} from "./formulaStringToArray"
 export default {
   components: {
     formulaItem,
-    formulaTemplate
+    formulaTemplate,
+
+    dateDeviation,
+    dateFormat,
+    datasRepeat,
+    datasReme,
   },
   data() {
     return {
@@ -287,6 +338,14 @@ export default {
       symbolReg:/(\+|-|\*|\/)(.+)/,
       operatorReg : /^\+|-|\*|%/,//加减乘除
       startFCRegExp : /^FC\.([a-zA-Z]+)\(/,// 匹配开始的FC.xxx(
+
+      componentMap:{
+        '日期偏移':'date-deviation',
+        '日期格式化':'date-format',
+        '去重':'datas-repeat',
+        '去空':'datas-reme',
+      },
+      eleListComp:[],
     };
   },
   computed: {
@@ -700,6 +759,14 @@ export default {
       }
     },
 
+
+    //设置动态组件里面的元素
+    setComponentEle(value,item,index){
+      if(value){
+        this.$refs.dynamiccomponent[index].setELe(item);
+      }
+    },
+
     getNodeDetail(data) {
       selectByNodeTable(data.id).then((res)=>{
         if(res.data.data.length){
@@ -730,6 +797,12 @@ export default {
       })
     },
 
+    getTableEleComp(tableId){
+      selectFormElements(tableId).then((res)=>{
+        this.eleListComp = res.data.data;
+      })
+    },
+
     getTypeMap(){
       return new Promise((resolve)=>{
         getTypeMap().then((res)=>{

+ 5 - 0
src/views/formula/formulaArrayToString.js

@@ -5,6 +5,11 @@ function transformArguments(children,curEle,eleMap){
   let fcText = '';
   for (let i = (children.length-1); i >= 0; i--) {
     let ele = children[i];
+
+    if(ele.isOn === false){
+      //点击了开关关闭的,跳过
+      continue;
+    }
     //console.log(ele.name)
     let tmpArr = fcReg.exec(ele.template.ft);
     fcText = tmpArr[1] + fcText;//fc.XX( 左括号部分