Browse Source

复制按钮同步;对话框选择器优化;修复对话框报错;对话框回显修复

cyy 1 year ago
parent
commit
19aa7d0aa9

+ 101 - 41
src/business/platform/data/data-template/field-formatter.vue

@@ -25,7 +25,11 @@ import {
   queryDataById as getDataById,
   queryLinkageData as getLinkDataByKey
 } from '@/api/platform/data/dataTemplate'
-
+import {
+  loadDataTemplateByKey,
+  getDataTemplateListTemplate,
+  buildDataTemplateFields
+} from '@/business/platform/data/utils'
 var WorldDistricts = null
 var DICTIONARY_CACHE = {}
 var ATTACHMENT_CACHE = {}
@@ -56,11 +60,16 @@ export default {
       default: ' '
     },
     fieldType: String,
+    fieldOptions:Object,
     tem: Object,
     tag: String
   },
   data() {
+    const { roleList, deptList, userList } = this.$store.getters
     return {
+      roleList,
+      deptList,
+      userList,
       label: ''
     }
   },
@@ -88,8 +97,8 @@ export default {
         this.label = value
         return
       }
-      const fieldType = field.field_type
-      const fieldOptions = field.field_options
+      const fieldType = this.fieldType
+      const fieldOptions = this.fieldOptions
       if (
         this.$utils.isEmpty(value) ||
         this.$utils.isEmpty(fieldType) ||
@@ -252,18 +261,24 @@ export default {
         this.label = SELECTOR_CACHE[key]
       } else {
         if (type === 'user' || type === 'employee') {
-          getUserById({ employeeId: id })
-            .then(response => {
-              const data = response.data
-              data[nameKey] = data['name']
-              if (data) {
-                SELECTOR_CACHE[key] = data[nameKey]
-                this.label = data[nameKey]
-              }
-            })
-            .catch(e => {
-              console.error(e)
-            })
+          this.userList.forEach((item, i) => {
+            if(id.includes(item.userId)){
+              this.label += item.userName + ','
+              // SELECTOR_CACHE[key] = item.NAME_ + ','
+            }
+          })
+          // getUserById({ employeeId: id })
+          //   .then(response => {
+          //     const data = response.data
+          //     data[nameKey] = data['name']
+          //     if (data) {
+          //       SELECTOR_CACHE[key] = data[nameKey]
+          //       this.label = data[nameKey]
+          //     }
+          //   })
+          //   .catch(e => {
+          //     console.error(e)
+          //   })
         } else if (type === 'org') {
           getOrgById({ orgId: id })
             .then(response => {
@@ -277,29 +292,41 @@ export default {
               console.error(e)
             })
         } else if (type === 'position') {
-          getPositionById({ positionId: id })
-            .then(response => {
-              const data = response.data
-              if (data) {
-                this.label = data[nameKey]
-                SELECTOR_CACHE[key] = data[nameKey]
-              }
-            })
-            .catch(e => {
-              console.error(e)
-            })
+          this.deptList.forEach((item, i) => {
+            if(id.includes(item.positionId)){
+              this.label += item.positionName + ','
+              // SELECTOR_CACHE[key] = item.NAME_ + ','
+            }
+          })
+          // getPositionById({ positionId: id })
+          //   .then(response => {
+          //     const data = response.data
+          //     if (data) {
+          //       this.label = data[nameKey]
+          //       SELECTOR_CACHE[key] = data[nameKey]
+          //     }
+          //   })
+          //   .catch(e => {
+          //     console.error(e)
+          //   })
         } else if (type === 'role') {
-          getRoleById({ roleId: id })
-            .then(response => {
-              const data = response.data
-              if (data) {
-                this.label = data[nameKey]
-                SELECTOR_CACHE[key] = data[nameKey]
-              }
-            })
-            .catch(e => {
-              console.error(e)
-            })
+          this.roleList.forEach((item, i) => {
+            if(id.includes(item.ID_)){
+              this.label += item.NAME_ + ','
+              // SELECTOR_CACHE[key] = item.NAME_ + ','
+            }
+          })
+          // getRoleById({ roleId: id })
+          //   .then(response => {
+          //     const data = response.data
+          //     if (data) {
+          //       this.label = data[nameKey]
+          //       SELECTOR_CACHE[key] = data[nameKey]
+          //     }
+          //   })
+          //   .catch(e => {
+          //     console.error(e)
+          //   })
         }
       }
     },
@@ -348,14 +375,47 @@ export default {
       this.formatterDataTemplateValue(value, dialog)
       // }
     },
+    exp(data,dataTitle) {
+      const d = dataTitle.split(/(\$[0-9a-zA-Z._]+#[0-9A-Fa-f]*)/g)
+      const rtn = []
+
+      d.forEach(n => {
+        let a = n
+        if (/^\$(_widget_)/.test(n)) {
+          // 对字段进行处理
+          const f = n.replace("$_widget_", "").split("#")
+          a = data[f[0]] || ""
+        }
+        rtn.push(a)
+      });
+
+      return rtn.join("")
+    },
     // 处理对话框id值
     formatterDataTemplateValue: function(value, key) {
       this.label = ''
       value.split(',').forEach(id => {
-        const labelKeys = buildLabelTitle(this.tem)
-        const a = this.handleLabel(this.data, labelKeys)
-
-        this.label += this.$utils.isNotEmpty(a) ? a : ''
+        if(key){
+          getDataById({ id: id, key: key }).then(response => {
+            const responseData = response.data
+            const data = responseData.data[0]
+            // const data = response.data
+            const variables = response.data
+            if (this.$utils.isNotEmpty(data)) {
+              // TODO 多个字段组合处理
+              const a = this.exp(data,variables['title'].name)
+              const val = variables['title'] || ''
+              this.label += this.$utils.isNotEmpty(a) ? a  : ''
+            }
+          }).catch((e) => {
+            console.error(e)
+          })
+        }else{
+          const labelKeys = buildLabelTitle(this.tem)
+          const a = this.handleLabel(this.data, labelKeys)
+          this.label += this.$utils.isNotEmpty(a) ? a : ''
+        }
+        
         // getDataById({ id: id, key: key })
         //   .then(response => {
         //     const responseData = response.data

+ 23 - 7
src/business/platform/data/data-template/template.vue

@@ -78,6 +78,9 @@
                         :label-key="item.bt"
                         :data="data"
                         :template-fields="templateFields"
+                        :field-options="item.fieldOptions"
+                        :field-type="item.fieldType"
+                        :tem ="tem"
                       />
                       <!-- <span
                         v-if="
@@ -138,6 +141,8 @@ v-else-if="i !== 'id_'"
                 :label-key="labelKey"
                 :data="data"
                 :template-fields="templateFields"
+                :tem ="tem"
+                :tag = "'Y'"
                 class="van-cell-text"
               />
             </template>
@@ -252,7 +257,7 @@ export default {
         const checked = this.checkbox[0]
 
         this.labelKeys = buildLabelTitle(this.tem)
-        const a = this.handleLabel(this.dataList[this.childrenIndex])
+        const a = this.dataList.length>0&& this.childrenIndex!=-1 ?this.handleLabel(this.dataList[this.childrenIndex]):''
 
         return this.$utils.isNotEmpty(checked)
           ? this.cacheData[checked]
@@ -297,6 +302,13 @@ export default {
         }
       },
       deep: true
+    },
+    valueKey:{
+      handler(val, oldVal) {
+        this.initData()
+      },
+      deep: true,
+      // immediate: true
     }
   },
   created() {
@@ -316,11 +328,11 @@ export default {
         return
       }
       data.forEach(v => {
-        if (this.cacheData[v]) {
-          this.checkedValue.push(v)
-        } else {
+        // if (this.cacheData[v]) {
+        //   this.checkedValue.push(v)
+        // } else {
           this.getDataInfo(v)
-        }
+        // }
       })
       this.checkbox = data || []
     },
@@ -363,7 +375,10 @@ export default {
               key = data[this.valueKey]
             }
             this.cacheData[key] = data
-            this.checkedValue.push(data[this.valueKey])
+            if(data[this.valueKey]){
+              this.checkedValue.push(data[this.valueKey])
+            }
+            
             this.emitInitData(this.getSelectedData(this.checkedValue))
           }
         })
@@ -433,7 +448,8 @@ export default {
                       label: it.label,
                       bt: it.name,
                       val: {},
-                      fieldType: it.field_type
+                      fieldType: it.field_type,
+                      fieldOptions: it.field_options
                     }
                     b.val[it.name] = d[it.name]
                     fb.showlabel[it.name] = b

+ 35 - 7
src/business/platform/data/templaterender/custom-dialog/index.vue

@@ -60,14 +60,15 @@
           size="medium"
           plain
         >
-          <field-formatter
+        <span>{{handleLabel(item, showLableKey)}}</span>
+          <!-- <field-formatterr
             :label-key="showLableKey"
             :data="item"
             :tem="tem"
             :tag="'Y'"
             :field-type="fieldType"
             :template-fields="templateFields"
-          />
+          /> -->
         </van-tag>
       </div>
       <input
@@ -123,12 +124,15 @@ import {
 } from '@/business/platform/data/utils'
 import DataTemplatePopup from '@/business/platform/data/data-template/template'
 import FieldFormatter from '@/business/platform/data/data-template/field-formatter'
-
+import FieldFormatterr from '@/business/platform/data/data-template/field-formatter'
+import { buildLabelTitle } from '../utils/index'
 export default {
   name: 'ibps-custom-dialog',
   components: {
     DataTemplatePopup,
-    FieldFormatter
+    FieldFormatter,
+    FieldFormatterr
+
   },
   mixins: [FieldMixin],
   props: {
@@ -188,7 +192,9 @@ export default {
       )
     },
     showLableKey() {
-      return this.labelKey
+      const labelKeys = buildLabelTitle(this.tem)
+      // const a = this.handleLabel(this.data, labelKeys)
+      return labelKeys
     }
   },
   watch: {
@@ -208,13 +214,24 @@ export default {
     this.loadData(this.templateKey)
   },
   methods: {
+    handleLabel(data, labelKeys) {
+      const config = labelKeys
+      if (typeof config === 'function') {
+        return config(data)
+      } else if (typeof config === 'string') {
+        return data[config]
+      } else if (typeof config === 'undefined') {
+        const dataProp = data['name']
+        return dataProp === undefined ? '' : dataProp
+      }
+    },
     // 加载加载配置数据
     loadData(key) {
       const params = {}
       loadDataTemplateByKey(key, params)
         .then(data => {
           const template = getDataTemplateListTemplate(data)
-          this.tem = template
+          this.tem ={...template}
           this.templateFields = buildDataTemplateFields(data.fields)
           this.buildKey(data, template)
         })
@@ -223,6 +240,7 @@ export default {
         })
     },
     buildKey(dataTemplate, template) {
+      
       this.idKey = this.valueKey = dataTemplate['unique']
       this.queryKey = this.getQueryKey(template['query_columns'])
       if (dataTemplate.showType === 'tree') {
@@ -301,6 +319,17 @@ export default {
           res.push(v[this.valueKey])
         })
         return res.join(this.storeSeparator)
+        // if (this.$utils.isEmpty(value)) {
+        //             return ''
+        //         }
+        //         if (this.multiple) {
+        //             value.forEach(v => {
+        //                 res.push(v[this.valueKey])
+        //             })
+        //         } else {
+        //             res.push(value[this.valueKey])
+        //         }
+        //         return res.join(this.storeSeparator)
       } else if (this.store === 'arrayId') {
         // 数组id
         return value.map(d => {
@@ -330,7 +359,6 @@ export default {
         return
       }
       this.showPopup = false
-
       this.selectedData = selectedData
       this.setInputValue(this.getStoreValue(selectedData))
     },

+ 142 - 124
src/business/platform/data/utils/index.js

@@ -1,86 +1,103 @@
-import { getByKey, getById } from '@/api/platform/data/dataTemplate'
-import { getFormDataByFormKey } from '@/api/platform/form/formDef'
-import FormOptions from '@/business/platform/form/constants/formOptions'
-import Utils from '@/utils/util'
-import { Dialog } from 'vant'
+import { getByKey, getById } from "@/api/platform/data/dataTemplate";
+import { getFormDataByFormKey } from "@/api/platform/form/formDef";
+import FormOptions from "@/business/platform/form/constants/formOptions";
+import Utils from "@/utils/util";
+import { Dialog } from "vant";
 
 var TemplateUtils = {
   getById(id, params, resolve, reject) {
     getById({
       dataTemplateId: id
-    }).then(response => {
-      const dataTemplate = Utils.parseData(response.data)
-      this.buildData({
-        dataTemplate: dataTemplate,
-        fields: this.datasets2Fields(dataTemplate.datasets)
-      }, resolve, reject)
-    }).catch((e) => {
-      // TODO 异常
-      console.error(e)
-      reject(e)
     })
+      .then(response => {
+        const dataTemplate = Utils.parseData(response.data);
+        this.buildData(
+          {
+            dataTemplate: dataTemplate,
+            fields: this.datasets2Fields(dataTemplate.datasets)
+          },
+          resolve,
+          reject
+        );
+      })
+      .catch(e => {
+        // TODO 异常
+        console.error(e);
+        reject(e);
+      });
   },
   getByKey(key, params, resolve, reject) {
     getByKey({
       dataTemplateKey: key
-    }).then(response => {
-      const dataTemplate = Utils.parseData(response.data)
-      this.buildData({
-        dataTemplate: dataTemplate,
-        fields: this.datasets2Fields(dataTemplate.datasets)
-      }, resolve, reject)
-    }).catch((e) => {
-      // TODO 异常
-      console.error(e)
-      reject(e)
     })
+      .then(response => {
+        const dataTemplate = Utils.parseData(response.data);
+        this.buildData(
+          {
+            dataTemplate: dataTemplate,
+            fields: this.datasets2Fields(dataTemplate.datasets)
+          },
+          resolve,
+          reject
+        );
+      })
+      .catch(e => {
+        // TODO 异常
+        console.error(e);
+        reject(e);
+      });
   },
   /**
- * 数据源数据,转字段数据
- * @param {*} datasets
- */
+   * 数据源数据,转字段数据
+   * @param {*} datasets
+   */
   datasets2Fields(datasets) {
-    if (Utils.isEmpty(datasets)) { return [] }
-    const fields = []
-    let dataset = {}
+    if (Utils.isEmpty(datasets)) {
+      return [];
+    }
+    const fields = [];
+    let dataset = {};
     for (var _i = 0, _len = datasets.length; _i < _len; _i++) {
-      dataset = datasets[_i]
-      if (dataset.attrType === 'column') {
-        fields.push(dataset)
+      dataset = datasets[_i];
+      if (dataset.attrType === "column") {
+        fields.push(dataset);
       }
     }
-    return fields
+    return fields;
   },
   buildData({ dataTemplate, fields }, resolve, reject) {
     if (dataTemplate.templates) {
-      let template = {}
-      if (dataTemplate.showType === 'compose') { // 如果是组合
-        var tpl = {}
-        if (dataTemplate.composeType === 'treeList') {
-          tpl = dataTemplate.templates[1]
-        } else if (dataTemplate.composeType === 'listTree') {
-          tpl = dataTemplate.templates[0]
+      let template = {};
+      if (dataTemplate.showType === "compose") {
+        // 如果是组合
+        var tpl = {};
+        if (dataTemplate.composeType === "treeList") {
+          tpl = dataTemplate.templates[1];
+        } else if (dataTemplate.composeType === "listTree") {
+          tpl = dataTemplate.templates[0];
         }
         if (!tpl) {
-          Dialog.alert('未设置模版!')
-          return
+          Dialog.alert("未设置模版!");
+          return;
         }
 
-        if (tpl.dataTemplate['bind_template'] === 'Y') {
-          this.getByKey(tpl.attrs['bind_template_key'])
+        if (tpl.dataTemplate["bind_template"] === "Y") {
+          this.getByKey(tpl.attrs["bind_template_key"]);
         } else {
-          template = tpl
+          template = tpl;
         }
-      } else { // 不是组合
-        template = dataTemplate.templates[0]
+      } else {
+        // 不是组合
+        template = dataTemplate.templates[0];
         this.buildTemplateData(
           {
             dataTemplate: dataTemplate,
-            key: dataTemplate.type + '_' + dataTemplate.showType,
+            key: dataTemplate.type + "_" + dataTemplate.showType,
             template: template,
             fields: fields
-          }, resolve
-        )
+          },
+          resolve
+        );
 
         // conditions = template.filter_conditions
 
@@ -95,96 +112,96 @@ var TemplateUtils = {
       }
     }
   },
-  buildTemplateData({
-    dataTemplate,
-    key,
-    template,
-    fields
-  }, resolve) {
-    const conditions = template.filter_conditions
+  buildTemplateData({ dataTemplate, key, template, fields }, resolve) {
+    const conditions = template.filter_conditions;
 
-    const dynamicParams = this.buildDynamicParams(conditions)
-    const data = { ...dataTemplate }
-    data['templates'] = null
+    const dynamicParams = this.buildDynamicParams(conditions);
+    const data = { ...dataTemplate };
+    data["templates"] = null;
 
-    data.dynamicParams = dynamicParams
-    data[key] = template
-    data['fields'] = fields
-    this.initFelds(data, resolve)
+    data.dynamicParams = dynamicParams;
+    data[key] = template;
+    data["fields"] = fields;
+    this.initFelds(data, resolve);
   },
   initFelds(data, resolve) {
     if (data.attrs && Utils.isNotEmpty(data.attrs.form_key)) {
       getFormDataByFormKey({
         formKey: data.attrs.form_key
-      }).then(response => {
-        const formData = Utils.parseData(response.data)
-        const fields = this.buildFelds(formData.fields, data.fields)
-        data.fields = fields
-        resolve(data)
-      }).catch(() => {
       })
+        .then(response => {
+          const formData = Utils.parseData(response.data);
+          const fields = this.buildFelds(formData.fields, data.fields);
+          data.fields = fields;
+          resolve(data);
+        })
+        .catch(() => {});
     } else {
-      resolve(data)
+      resolve(data);
     }
   },
   buildFelds(fields, datasets) {
-    const fieldMap = {}
-    const columns = this.getColumns(fields)
+    const fieldMap = {};
+    const columns = this.getColumns(fields);
 
     columns.forEach(field => {
       if (Utils.isNotEmpty(field.field_name)) {
-        fieldMap[field.field_name.toLowerCase()] = field
+        fieldMap[field.field_name.toLowerCase()] = field;
       }
-    })
-    const rtn = []
+    });
+    const rtn = [];
     datasets.forEach(dataset => {
-      let field = fieldMap[dataset.name]
+      let field = fieldMap[dataset.name];
       if (Utils.isNotEmpty(dataset.name)) {
-        field = fieldMap[dataset.name.toLowerCase()]
+        field = fieldMap[dataset.name.toLowerCase()];
       }
       if (Utils.isNotEmpty(field)) {
-        dataset.field_name = Utils.isNotEmpty(field.name) ? field.name.toLowerCase() : field.name
-        dataset.form_field_name = field.name
-        dataset.field_type = field.field_type
-        dataset.field_options = field.field_options
+        dataset.field_name = Utils.isNotEmpty(field.name)
+          ? field.name.toLowerCase()
+          : field.name;
+        dataset.form_field_name = field.name;
+        dataset.field_type = field.field_type;
+        dataset.field_options = field.field_options;
       }
-      rtn.push(dataset)
-    })
-    return rtn
+      rtn.push(dataset);
+    });
+    return rtn;
   },
   /**
    * 获取所有字段
    * @param {*} columns
    */
   getColumns(columns) {
-    const formColumns = []
-    const traverse = (fields) => {
-      fields.forEach((field) => {
+    const formColumns = [];
+    const traverse = fields => {
+      fields.forEach(field => {
         if (FormOptions.t.NESTED_FIELD_TYPES.includes(field.field_type)) {
-          const childColumns = field.field_options.columns
+          const childColumns = field.field_options.columns;
           childColumns.forEach(child => {
-            traverse(child.fields)
-          })
+            traverse(child.fields);
+          });
         } else {
-          formColumns.push(field)
+          formColumns.push(field);
         }
-      })
-    }
-    traverse(columns)
-    return formColumns
+      });
+    };
+    traverse(columns);
+    return formColumns;
   },
   buildDynamicParams(conditions) {
-    const dynamicParams = {}
-    if (Utils.isNotEmpty(conditions)) { return dynamicParams }
-    const filterConditions = Utils.isNotEmpty(conditions) ? conditions[0] : {}
-    const	filter = filterConditions.filter
-    if (filter) { this._createDynamicParams(dynamicParams, filter) }
-    return dynamicParams
+    const dynamicParams = {};
+    if (Utils.isNotEmpty(conditions)) {
+      return dynamicParams;
+    }
+    const filterConditions = Utils.isNotEmpty(conditions) ? conditions[0] : {};
+    const filter = filterConditions.filter;
+    if (filter) {
+      this._createDynamicParams(dynamicParams, filter);
+    }
+    return dynamicParams;
   },
-  _createDynamicParams(dynamicParams, filter) {
-
-  }
-}
+  _createDynamicParams(dynamicParams, filter) {}
+};
 
 /**
  * 通过模版key 获取数据模版
@@ -192,36 +209,37 @@ var TemplateUtils = {
  */
 export function loadDataTemplateByKey(key, params) {
   return new Promise((resolve, reject) => {
-    TemplateUtils.getByKey(key, params, resolve, reject)
-  })
+    TemplateUtils.getByKey(key, params, resolve, reject);
+  });
 }
 
 export function loadDataTemplateById(id, params) {
   return new Promise((resolve, reject) => {
-    TemplateUtils.getById(id, params, resolve, reject)
-  })
+    TemplateUtils.getById(id, params, resolve, reject);
+  });
 }
 
 export function getDataTemplateListTemplate(dataTemplate) {
-  if (dataTemplate.showType === 'compose') { // 如果是组合
-  } else { //
-    const type = dataTemplate.type
-    const showType = dataTemplate.showType
-    return dataTemplate[type + '_' + showType]
+  if (dataTemplate.showType === "compose") {
+    // 如果是组合
+  } else {
+    //
+    const type = dataTemplate.type;
+    const showType = dataTemplate.showType;
+    return dataTemplate[type + "_" + showType];
   }
 }
 
 /**
  * 构建数据模版字段
  */
-export function buildDataTemplateFields(fields, key = 'name') {
+export function buildDataTemplateFields(fields, key = "name") {
   if (Utils.isEmpty(fields)) {
-    return {}
+    return {};
   }
-  const res = {}
+  const res = {};
   fields.forEach(field => {
-    res[field[key]] = field
-  })
-  return res
+    res[field[key]] = field;
+  });
+  return res;
 }
-

+ 100 - 3
src/business/platform/form/dynamic-form/form-table.vue

@@ -193,6 +193,7 @@
                         <div class="btn-pop-top" />
                         <div class="btn-pop">
                           <div
+                            v-if="button.key!='import'&&button.key!='export'"
                             v-for="(button,j) in getShowBtnByRemove().slice(num-1) "
                             :key="button.key+j"
                             class="btn-pop-text"
@@ -262,7 +263,7 @@ import FormFieldUtil from '../utils/formFieldUtil'
 import { hasPermission } from '../constants/buttonTypes'
 import { colorOptions } from '@/constants/btnColor'
 import clickoutside from '@/utils/clickoutside'
-
+import ActionUtils from '@/utils/action'
 const JForm = window.JForm
 // import JForm from '../utils/JForm'// 自定义脚本
 const COLLAPSE_NAME_KEY = 'table_'
@@ -342,7 +343,11 @@ export default {
       dialogTemplateAtts: {},
       inputValue: '',
       toggle: this._getItem(),
-      colorOptions
+      colorOptions,
+
+      actionCode: '',
+      actionPosition: 'toolbar',
+      actionButton: null
     }
   },
   computed: {
@@ -601,6 +606,11 @@ export default {
       return bs
     },
     handleActionEvent(button, index) {
+      // 起始下标
+      // const index = (this.currentPage - 1) * this.pageSize + buttonIndex
+      this.actionCode = button.key === 'custom' ? button.code || button.key + index : button.key
+      this.actionPosition = button.position || 'toolbar'
+      this.actionButton = button
       // 前置事件
       this.beforeScript(button, index, (result) => {
         if (!result) {
@@ -615,6 +625,10 @@ export default {
               this.handleAdd()
             }
             break
+          case 'copy':
+            // 复制已有数据(尾部插入)
+            this.handleCopyData(button, index)
+            break
           case 'edit':
             this.handleDialogMode(index)
             break
@@ -627,6 +641,12 @@ export default {
           case 'export':
             this.handleExport(button, index)
             break
+          case 'custom':
+            // 新增自定义对话框按钮
+            if (button.enabledCustom === 'Y') {
+              this.handleAddCustomDialog(button)
+            }
+            break
           default:
             break
         }
@@ -656,7 +676,41 @@ export default {
       // 后置事件
       this.afterScript('add', 'toolbar')
     },
-
+    // 复制已有数据
+    handleCopyData (button, index) {
+      const position = button.position
+      const selection = this.getSelection('block', index)
+      console.log(button, index,selection)
+      ActionUtils.selectedMultiRecord(selection).then((ids) => {
+        selection.forEach(i => {
+          const obj = this.dataModel[i]
+          delete obj.$index
+          delete obj.id
+          this.dataModel.push(obj)
+        })
+        // 初始化运行公式计算
+        this.initRunCalFormula(this.dataModel.length - 1)
+        // 后置事件
+        this.afterScript(this.actionCode, this.actionPosition)
+        if (this.$refs.elTable) {
+          this.$refs.elTable.doLayout()
+        }
+      }).catch(() => {})
+    },
+    getSelection (position, index) {
+      const selection = []
+      if (position === 'toolbar' && this.mode !== 'block') {
+        if (this.multipleSelection && this.multipleSelection.length > 0) {
+          const startIndex = (this.currentPage - 1) * this.pageSize
+          this.multipleSelection.forEach((row) => {
+            selection.push(row.$index + startIndex)
+          })
+        }
+      } else {
+        selection.push(index)
+      }
+      return selection
+    },
     handleRemove(button, index) {
       if (this.dataModel.length === 0) {
         return
@@ -682,6 +736,49 @@ export default {
       // 不需要字段的进行公式计算 比如获取但其当前时间,随机数
       FormUtil.runCalFormula(this, this.formula[FormUtil.NOT_NEED_FIELD], this.mainCode, row)
     },
+    handleImport () {
+      this.importTableDialogVisible = true
+    },
+    // 导出
+    handleExport (button, index) {
+      const position = button.position
+      const selection = this.getSelection(position, index)
+      if (selection.length > 0) {
+        this.exportData(selection)
+      } else {
+        this.exportData
+      }
+    },
+    /**
+     * 导出数据
+     */
+    exportData (ids) {
+      const columnMap = {}
+      const columns = []
+      this.nameColumns.forEach((column) => {
+        if (!this.columnHidden(column)) {
+          columns.push(column)
+        }
+        columnMap[column.name] = column
+      })
+      const exportData = JSON.parse(JSON.stringify(this.dataModel))
+      const data = ids
+        ? exportData.filter((d, i) => {
+          return ids.includes(i)
+        })
+        : exportData
+      // TODO: 需要格式化展示的数据
+      this.convertExportData(data, columnMap).then((data) => {
+        IbpsExport.excel({
+          columns: columns,
+          data: data,
+          nameKey: 'name',
+          title: this.field.label
+        }).then(() => {
+          ActionUtils.success('导出成功')
+        })
+      })
+    },
     // =====================对话框模式数据处理=====================
 
     handleDialogMode(index) {

+ 62 - 52
src/store/getters.js

@@ -1,58 +1,68 @@
 export default {
-    // 用户相关
-    userId: state =>
-        state.ibps.user.info && state.ibps.user.info.user
-            ? state.ibps.user.info.user.id
-            : '', // 用户ID
-    userName: state =>
-        state.ibps.user.info && state.ibps.user.info.employee
-            ? state.ibps.user.info.employee.name
-            : '', // 姓名
-    status: state =>
-        state.ibps.user.info && state.ibps.user.info.employee
-            ? state.ibps.user.info.employee.status
-            : '', // 用户状态
-    role: state => state.ibps.user.info ? state.ibps.user.info.role : [], // 用户信息
-    position: state => state.ibps.user.info && state.ibps.user.info.employee ? state.ibps.user.info.employee.positions : '', // 用户部门信息
-    mainPosition: state => state.ibps.user.info && state.ibps.user.info.employee ? state.ibps.user.info.mainPosition : {}, // 用户部门信息
-    isSuper: state =>
-        state.ibps.user.info && state.ibps.user.info.user
-            ? state.ibps.user.info.user.isSuper === 'Y'
-            : false, // 是否超级管理员
-    account: state =>
-        state.ibps.user.info && state.ibps.user.info.user
-            ? state.ibps.user.info.user.account
-            : '', // 用户名
+  // 用户相关
+  userId: state =>
+    state.ibps.user.info && state.ibps.user.info.user
+      ? state.ibps.user.info.user.id
+      : "", // 用户ID
+  userName: state =>
+    state.ibps.user.info && state.ibps.user.info.employee
+      ? state.ibps.user.info.employee.name
+      : "", // 姓名
+  status: state =>
+    state.ibps.user.info && state.ibps.user.info.employee
+      ? state.ibps.user.info.employee.status
+      : "", // 用户状态
+  role: state => (state.ibps.user.info ? state.ibps.user.info.role : []), // 用户信息
+  position: state =>
+    state.ibps.user.info && state.ibps.user.info.employee
+      ? state.ibps.user.info.employee.positions
+      : "", // 用户部门信息
+  mainPosition: state =>
+    state.ibps.user.info && state.ibps.user.info.employee
+      ? state.ibps.user.info.mainPosition
+      : {}, // 用户部门信息
+  isSuper: state =>
+    state.ibps.user.info && state.ibps.user.info.user
+      ? state.ibps.user.info.user.isSuper === "Y"
+      : false, // 是否超级管理员
+  account: state =>
+    state.ibps.user.info && state.ibps.user.info.user
+      ? state.ibps.user.info.user.account
+      : "", // 用户名
 
-    regOpen: state => state.ibps.user.regOpen, // 注册状态
+  regOpen: state => state.ibps.user.regOpen, // 注册状态
 
-    userInfo: state => state.ibps.user.info, // 用户信息
+  userInfo: state => state.ibps.user.info, // 用户信息
 
-    hasDataChange: state => state.ibps.app.hasDataChange, // 是否有数据修改
+  hasDataChange: state => state.ibps.app.hasDataChange, // 是否有数据修改
 
-    // ============ 表单
-    form: state => state.ibps.form,
+  // ============ 表单
+  form: state => state.ibps.form,
 
-    single: state => state.ibps.api.single, // 单体应用
-    baseApi: state => state.ibps.api.base, // baseAPI地址
-    websocket: state => state.ibps.api.websocket, // websocket地址
-
-    // 获取所有用户信息
-    userList: state =>
-        state.ibps.param && state.ibps.param.userList
-            ? state.ibps.param.userList
-            : [],
-    // 获取所有部门信息
-    deptList: state =>
-        state.ibps.param && state.ibps.param.deptList
-            ? state.ibps.param.deptList
-            : [],
-    // 获取所有流程信息
-    flowList: state =>
-        state.ibps.param && state.ibps.param.flowList
-            ? state.ibps.param.flowList
-            : [],
-    // 获取用户最高层级
-    level: state =>
-        state.ibps.param && state.ibps.param.level ? state.ibps.param.level : []
-}
+  single: state => state.ibps.api.single, // 单体应用
+  baseApi: state => state.ibps.api.base, // baseAPI地址
+  websocket: state => state.ibps.api.websocket, // websocket地址
+  // 获取所有角色信息
+  roleList: state =>
+    state.ibps.param && state.ibps.param.roleList
+      ? state.ibps.param.roleList
+      : [],
+  // 获取所有用户信息
+  userList: state =>
+    state.ibps.param && state.ibps.param.userList
+      ? state.ibps.param.userList
+      : [],
+  // 获取所有部门信息
+  deptList: state =>
+    state.ibps.param && state.ibps.param.deptList
+      ? state.ibps.param.deptList
+      : [],
+  // 获取所有流程信息
+  flowList: state =>
+    state.ibps.param && state.ibps.param.flowList
+      ? state.ibps.param.flowList
+      : [],
+  // 获取用户最高层级
+  level: state =>
+    state.ibps.param && state.ibps.param.level ? state.ibps.param.level : []
+};

+ 60 - 53
src/store/modules/ibps/modules/param.js

@@ -1,55 +1,62 @@
 export default {
-    namespaced: true,
-    state: {
-        // 所有菜单
-        myform: '',
-        // 所有用户信息
-        userList: [],
-        // 所有部门信息
-        deptList: [],
-        pitchDept: [],
-        flowList: [],
-        // 当前用户层级
-        level: {
-            first: '',
-            second: ''
-        }
-    },
-    mutations: {
-        myformSet (state, myform) {
-            state.myform = myform.myform || ''
-        },
-        userList (state, data) {
-            state.userList = data.length ? data : []
-        },
-        deptList (state, data) {
-            state.deptList = data.length ? data : []
-        },
-        pitchDept (state, data) {
-            state.pitchDept = data.length ? data : []
-        },
-        flowList (state, data) {
-            state.flowList = data.length ? data : []
-        },
-        level (state, data) {
-            state.level = data || { first: '', second: '' }
-        }
-    },
-    actions: {
-        setUserList ({ commit }, data) {
-            commit('userList', data)
-        },
-        setDeptList ({ commit }, data) {
-            commit('deptList', data)
-        },
-        setpitchDept ({ commit }, data) {
-            commit('pitchDept', data)
-        },
-        setLevel ({ commit }, data) {
-            commit('level', data)
-        },
-        setflowList ({ commit }, data) {
-            commit('flowList', data)
-        }
+  namespaced: true,
+  state: {
+    // 所有菜单
+    myform: "",
+    roleList: [],
+    // 所有用户信息
+    userList: [],
+    // 所有部门信息
+    deptList: [],
+    pitchDept: [],
+    flowList: [],
+    // 当前用户层级
+    level: {
+      first: "",
+      second: ""
     }
-}
+  },
+  mutations: {
+    myformSet(state, myform) {
+      state.myform = myform.myform || "";
+    },
+    roleList(state, data) {
+      state.roleList = data.length ? data : [];
+    },
+    userList(state, data) {
+      state.userList = data.length ? data : [];
+    },
+    deptList(state, data) {
+      state.deptList = data.length ? data : [];
+    },
+    pitchDept(state, data) {
+      state.pitchDept = data.length ? data : [];
+    },
+    flowList(state, data) {
+      state.flowList = data.length ? data : [];
+    },
+    level(state, data) {
+      state.level = data || { first: "", second: "" };
+    }
+  },
+  actions: {
+    setRoleList({ commit }, data) {
+      commit("roleList", data);
+    },
+    setUserList({ commit }, data) {
+      commit("userList", data);
+    },
+    setDeptList({ commit }, data) {
+      commit("deptList", data);
+    },
+    setpitchDept({ commit }, data) {
+      commit("pitchDept", data);
+    },
+    setLevel({ commit }, data) {
+      commit("level", data);
+    },
+    setflowList({ commit }, data) {
+      commit("flowList", data);
+    }
+  }
+};

+ 110 - 85
src/store/modules/ibps/modules/user.js

@@ -1,5 +1,5 @@
-import { getUserInfo } from '@/api/oauth2/user'
-import common from '@/utils/common'
+import { getUserInfo } from "@/api/oauth2/user";
+import common from "@/utils/common";
 
 export default {
   namespaced: true,
@@ -7,9 +7,9 @@ export default {
     // 用户信息
     info: {},
     // 帐号
-    account: '',
+    account: "",
     // 切换的账号
-    switchAccount: '',
+    switchAccount: "",
     // 是否开启注册
     regOpen: false
   },
@@ -22,21 +22,21 @@ export default {
     set({ state, dispatch }, info) {
       return new Promise(async resolve => {
         // store 赋值
-        state.info = info
+        state.info = info;
         // 持久化
         await dispatch(
-          'ibps/db/set',
+          "ibps/db/set",
           {
-            dbName: 'sys',
-            path: 'user.info',
+            dbName: "sys",
+            path: "user.info",
             value: info,
             user: true
           },
           { root: true }
-        )
+        );
         // end
-        resolve()
-      })
+        resolve();
+      });
     },
     /**
      * @description 从数据库取用户数据
@@ -46,72 +46,74 @@ export default {
       return new Promise(async resolve => {
         // store 赋值
         state.info = await dispatch(
-          'ibps/db/get',
+          "ibps/db/get",
           {
-            dbName: 'sys',
-            path: 'user.info',
+            dbName: "sys",
+            path: "user.info",
             defaultValue: {},
             user: true
           },
           { root: true }
-        )
+        );
         // end
-        resolve()
-      })
+        resolve();
+      });
     },
     /**
      * @description 从数据库取用户数据
      * @param {Object} context
      */
     load({ state, dispatch }) {
-      return new Promise(async(resolve, reject) => {
-        await dispatch('getAccount')
+      return new Promise(async (resolve, reject) => {
+        await dispatch("getAccount");
         getUserInfo(state.account)
           .then(async response => {
             if (!response) {
-              reject(response)
+              reject(response);
             }
-            const info = response.data
+            const info = response.data;
             // 设置当前
-            await dispatch('set', info)
-            let level = {}
+            await dispatch("set", info);
+            let level = {};
             if (info.positions && info.positions.length) {
               // 当存在第二级为空时,说明具备最高级权限
               const hasFirst = info.positions.some(
-                obj => obj.path.split('.')[1] === ''
-              )
+                obj => obj.path.split(".")[1] === ""
+              );
               level = {
                 first: [
-                  ...new Set(info.positions.map(obj => obj.path.split('.')[0]))
-                ].join(','),
+                  ...new Set(info.positions.map(obj => obj.path.split(".")[0]))
+                ].join(","),
                 second: hasFirst
-                  ? ''
+                  ? ""
                   : [
-                    ...new Set(
-                      info.positions.map(obj => obj.path.split('.')[1])
-                    )
-                  ].join(',')
-              }
-              await dispatch('ibps/param/setLevel', level, {
+                      ...new Set(
+                        info.positions.map(obj => obj.path.split(".")[1])
+                      )
+                    ].join(",")
+              };
+              await dispatch("ibps/param/setLevel", level, {
                 root: true
-              })
+              });
             }
             // 获取所有用户信息
-            await dispatch('getUserList', level)
+            await dispatch("getRoleList", level);
+            // 获取所有用户信息
+            await dispatch("getUserList", level);
             // 获取所有部门信息
-            await dispatch('getDeptList', level)
+            await dispatch("getDeptList", level);
             // 获取所有流程信息
-            await dispatch('getFlowList', level)
+            await dispatch("getFlowList", level);
             // // 获取当前子系统
             // await dispatch('ibps/system/loadSystem', null, {
             //   root: true
             // })
-            resolve(info)
+            resolve(info);
           })
           .catch(error => {
-            reject(error)
-          })
-      })
+            reject(error);
+          });
+      });
     },
     /**
      * 获取用户名
@@ -121,37 +123,60 @@ export default {
       return new Promise(async resolve => {
         // store 赋值
         state.account = await dispatch(
-          'ibps/db/get',
+          "ibps/db/get",
           {
-            dbName: 'sys',
-            path: 'account',
-            defaultValue: '',
+            dbName: "sys",
+            path: "account",
+            defaultValue: "",
             user: true
           },
           { root: true }
-        )
+        );
         // end
-        resolve()
-      })
+        resolve();
+      });
     },
     setAccount({ state, dispatch }, account) {
       return new Promise(async resolve => {
         // store 赋值
-        state.account = account
+        state.account = account;
         // 持久化
         await dispatch(
-          'ibps/db/set',
+          "ibps/db/set",
           {
-            dbName: 'sys',
-            path: 'account',
+            dbName: "sys",
+            path: "account",
             value: account,
             user: true
           },
           { root: true }
-        )
+        );
         // end
-        resolve()
-      })
+        resolve();
+      });
+    },
+    /**
+     * 获取所有角色
+     */
+    getRoleList({ state, dispatch }, { first, second }) {
+      const params = second
+        ? `'%${second}%' or entity.id_ = '${first}'`
+        : first
+        ? `'%${first}%'`
+        : "%%";
+      const sql = `select * from ibps_party_role`;
+      common
+        .request("sql", sql)
+        .then(res => {
+          const { data = [] } = res.variables || {};
+          dispatch("ibps/param/setRoleList", data, {
+            root: true
+          });
+        })
+        .catch(error => {
+          console.log(error);
+          alert("获取所有角色信息失败!");
+        });
     },
     /**
      * 获取所有系统用户账号
@@ -160,21 +185,21 @@ export default {
       const params = second
         ? `'%${second}%' or entity.id_ = '${first}'`
         : first
-          ? `'%${first}%'`
-          : '%%'
-      const sql = `select users.id_ as userId, users.name_ as userName, ifnull(users.mobile_, '') as phone, ifnull(group_concat(distinct positions.id_ order by positions.id_ separator ','), '') as positionId, ifnull(group_concat(distinct positions.name_ order by positions.id_ separator ','), '') as positions, ifnull(group_concat(distinct roles.id_ order by roles.role_note_ asc separator ','), '') as roleId, ifnull(group_concat(distinct roles.name_ order by roles.role_note_ asc separator ','), '') as roles, (select ifnull(people.qian_zi_tu_wen_, '') from t_ryjbqk as people where people.parent_id_ = users.id_) as signatureId, (select ifnull(files.file_name_, '') from ibps_file_attachment as files where files.id_ = signatureId) as signatureName from ibps_party_employee as users left join (select ur.user_id_, r.role_note_, group_concat(distinct r.id_ order by r.id_ separator ',') as id_, group_concat(distinct r.name_ order by r.id_ separator ',') as name_ from ibps_party_user_role as ur join ibps_party_role as r on ur.role_id_ = r.id_ group by ur.user_id_) as roles on users.id_ = roles.user_id_ left join ibps_party_entity as positions on find_in_set(positions.id_, users.positions_) where exists (select 1 from ibps_party_entity as entity where find_in_set(entity.id_, users.positions_) and (entity.path_ like ${params})) group by users.id_`
+        ? `'%${first}%'`
+        : "%%";
+      const sql = `select users.id_ as userId, users.name_ as userName, ifnull(users.mobile_, '') as phone, ifnull(group_concat(distinct positions.id_ order by positions.id_ separator ','), '') as positionId, ifnull(group_concat(distinct positions.name_ order by positions.id_ separator ','), '') as positions, ifnull(group_concat(distinct roles.id_ order by roles.role_note_ asc separator ','), '') as roleId, ifnull(group_concat(distinct roles.name_ order by roles.role_note_ asc separator ','), '') as roles, (select ifnull(people.qian_zi_tu_wen_, '') from t_ryjbqk as people where people.parent_id_ = users.id_) as signatureId, (select ifnull(files.file_name_, '') from ibps_file_attachment as files where files.id_ = signatureId) as signatureName from ibps_party_employee as users left join (select ur.user_id_, r.role_note_, group_concat(distinct r.id_ order by r.id_ separator ',') as id_, group_concat(distinct r.name_ order by r.id_ separator ',') as name_ from ibps_party_user_role as ur join ibps_party_role as r on ur.role_id_ = r.id_ group by ur.user_id_) as roles on users.id_ = roles.user_id_ left join ibps_party_entity as positions on find_in_set(positions.id_, users.positions_) where exists (select 1 from ibps_party_entity as entity where find_in_set(entity.id_, users.positions_) and (entity.path_ like ${params})) group by users.id_`;
       common
-        .request('sql', sql)
+        .request("sql", sql)
         .then(res => {
-          const { data = [] } = res.variables || {}
-          dispatch('ibps/param/setUserList', data, {
+          const { data = [] } = res.variables || {};
+          dispatch("ibps/param/setUserList", data, {
             root: true
-          })
+          });
         })
         .catch(error => {
-          console.log(error)
-          alert('获取所有用户信息失败!')
-        })
+          console.log(error);
+          alert("获取所有用户信息失败!");
+        });
     },
     /**
      * 获取所有系统部门信息
@@ -183,40 +208,40 @@ export default {
       const params = second
         ? ` and (pe.path_ like '%${second}%' or pe.id_ = '${first}')`
         : first
-          ? ` and pe.path_ like '%${first}%'`
-          : ''
+        ? ` and pe.path_ like '%${first}%'`
+        : "";
       // const sql = `select id_ as positionId, name_ as positionName, path_ as path, depth_ as depth, sn_ as sn from ibps_party_entity where party_type_ = 'position'${params} order by depth_ asc, sn_ asc`
-      const sql = `select pe.id_ as positionId, pe.name_ as positionName, pe.path_ as path, pe.depth_ as depth, pe.sn_ as sn, ifnull(r.name_, '') as manager, ifnull(r.id_, '') as managerId from ibps_party_entity as pe left join (select em.id_, em.positions_, em.name_ from ibps_party_employee as em left join ibps_party_user_role as ur on em.id_ = ur.user_id_ left join ibps_party_role as pr on pr.id_ = ur.role_id_ where role_alias_ in ('zhsfzr', 'syszr', 'zhglzzc')) as r on find_in_set(pe.id_, r.positions_) > 0 where pe.party_type_ = 'position'${params} group by pe.id_ order by pe.depth_ asc, pe.sn_ asc,pe.id_ asc`
+      const sql = `select pe.id_ as positionId, pe.name_ as positionName, pe.path_ as path, pe.depth_ as depth, pe.sn_ as sn, ifnull(r.name_, '') as manager, ifnull(r.id_, '') as managerId from ibps_party_entity as pe left join (select em.id_, em.positions_, em.name_ from ibps_party_employee as em left join ibps_party_user_role as ur on em.id_ = ur.user_id_ left join ibps_party_role as pr on pr.id_ = ur.role_id_ where role_alias_ in ('zhsfzr', 'syszr', 'zhglzzc')) as r on find_in_set(pe.id_, r.positions_) > 0 where pe.party_type_ = 'position'${params} group by pe.id_ order by pe.depth_ asc, pe.sn_ asc,pe.id_ asc`;
       common
-        .request('sql', sql)
+        .request("sql", sql)
         .then(res => {
-          const { data = [] } = res.variables || {}
-          dispatch('ibps/param/setDeptList', data, {
+          const { data = [] } = res.variables || {};
+          dispatch("ibps/param/setDeptList", data, {
             root: true
-          })
+          });
         })
         .catch(error => {
-          console.log(error)
-          alert('获取所有部门信息失败!')
-        })
+          console.log(error);
+          alert("获取所有部门信息失败!");
+        });
     },
     /**
      * 获取所有可展示流程信息
      */
     getFlowList({ state, dispatch }, { first, second }) {
-      const sql = `select * from t_applcgl`
+      const sql = `select * from t_applcgl`;
       common
-        .request('sql', sql)
+        .request("sql", sql)
         .then(res => {
-          const { data = [] } = res.variables || {}
-          dispatch('ibps/param/setflowList', data, {
+          const { data = [] } = res.variables || {};
+          dispatch("ibps/param/setflowList", data, {
             root: true
-          })
+          });
         })
         .catch(error => {
-          console.log(error)
-          alert('获取所有流程信息失败!')
-        })
+          console.log(error);
+          alert("获取所有流程信息失败!");
+        });
     }
   }
-}
+};

+ 1 - 1
src/views/platform/bpmn/handled/index.vue

@@ -279,7 +279,7 @@ export default {
             return v.split('#')[1] || ''
         },
         onClick(item) {
-            this.instId = item.procInstId
+            this.instId = item.id
             this.formrenderTitle = item.taskName
             this.formrenderVisible = true
         }

+ 1 - 1
src/views/platform/bpmn/mixin/utils.js

@@ -101,7 +101,7 @@ export default {
       if (!arr[2]) {
         return "";
       }
-      const result = JSON.parse(`{${arr[2]}}`);
+      const result = JSON.parse(`{${arr[2].replace(/:/g, ":")}}`);
       if (!result.dept) {
         return "";
       }

+ 6 - 3
src/views/platform/message/inner/receive.vue

@@ -115,13 +115,16 @@ export default {
       tabActive: '2',
       tabDatas: [{
         name: '2',
-        title: '全部'
+        title: '全部',
+        val: 0
       }, {
         name: '0',
-        title: '未读'
+        title: '未读',
+        val: 0
       }, {
         name: '1',
-        title: '已读'
+        title: '已读',
+        val: 0
       }],
       subject: '',
       moreParams: {},

+ 6 - 3
src/views/platform/notice/index.vue

@@ -162,15 +162,18 @@ export default {
       tabDatas: [
         {
           name: 'publish',
-          title: this.$t('platform.notice.notices')
+          title: this.$t('platform.notice.notices'),
+          val: 0
         },
         {
           name: 'expired',
-          title: this.$t('platform.notice.expired')
+          title: this.$t('platform.notice.expired'),
+          val: 0
         },
         {
           name: 'drafts',
-          title: this.$t('platform.notice.drafts')
+          title: this.$t('platform.notice.drafts'),
+          val: 0
         }
       ],