田源
2024-04-11 5a00f7eec311c7b71b40df4beaded505eca5329c
Merge remote-tracking branch 'origin/master'
已修改7个文件
278 ■■■■ 文件已修改
Source/ProjectWeb/src/actions/base/AddAction.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/actions/base/BaseAction.js 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/components/dynamic-components/dynamic-TreeTable.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/components/dynamic-components/dynamic-tree.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/views/base/UIContentArea.vue 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/ProjectWeb/src/actions/base/AddAction.js
@@ -1,4 +1,54 @@
/**
 * 按钮处理 业务类型新增
 */
import BaseAction from './BaseAction';
import {callPreEvent,callPostEvent} from './BaseAction';
import {validatenull} from "@/util/validate";
export const doAction = (options) => {
  let paramVOS = Object.assign({
    url: 'uiDataController/addSave',
    method: 'post',
    uploadFileUrl: 'vciFileUploadController/uploadFile'
  }, options.paramVOS)
  options.paramVOS = paramVOS;
  callPreEvent(options, doBefore,function (options) {
    doAdd(options, function () {
      callPostEvent(options,doAfter, options.callback);
    });
  });
};
/**
 * 执行
 * @param options 按钮的配置信息
 * @param callback 回调
 */
export const doAdd = (options,callback)=> {
  this.$message.success('执行增加');
  if(callback){
    callback(options);
  }
}
/**
 * 前置事件
 * @param options 按钮的配置信息
 * @param callback 回调
 */
export const doBefore = (options,callback)=> {
  this.$message.success('执行前置事件');
  if(callback){
    callback(options);
  }
}
/**
 * 后置事件
 * @param options 按钮的配置信息
 * @param callback 回调
 */
export const doAfter = (options,callback)=> {
  this.$message.success('执行后置事件');
  if(callback){
    callback(options);
  }
}
Source/ProjectWeb/src/actions/base/BaseAction.js
@@ -1,9 +1,36 @@
import {validatenull} from "@/util/validate";
import {findArray} from "@/util/util";
/**
 * 按钮的基础服务
 */
/**
 * action通用入口
 */
export const doAction = (button,options) => {
  debugger;
  if(button.url && button.url!='null'){
    let buttonParse = parseEventByUrl(button.url,options,false);
    import("../"+buttonParse.jsPath).then(module => {
      module.doAction(options);
    })
  }else {
    const handlers = {
      add: () => {import("@/actions/base/AddAction").then(module => {
        module.doAction(options);
      })},
      edit: () => {},
      delete: () => {},
    };
    if(handlers[button.actionVO.id]){
      handlers[button.actionVO.id]()
    }else{
      this.$message.error('未找到对应action,请重新配置按钮!');
    }
  }
};
/**
 * 替换文本中的${xxx}
@@ -28,7 +55,7 @@
      let temp = text.substring(0, text.indexOf(reg));
      let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}"));
      let end = text.substring(text.indexOf("}") + 1);
      field = replaceData[field] || sourceData[field] || '';
      field = sourceData[field] || '';
      text = temp + field + end;
    }
    reg = "sourceData.${";
@@ -36,7 +63,7 @@
      let temp = text.substring(0, text.indexOf(reg));
      let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}"));
      let end = text.substring(text.indexOf("}") + 1);
      field = replaceData[field] || sourceData[field] || '';
      field = sourceData[field] || '';
      text = temp + field + end;
    }
    reg = "${";
@@ -44,7 +71,7 @@
      let temp = text.substring(0, text.indexOf(reg));
      let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}"));
      let end = text.substring(text.indexOf("}") + 1);
      field = replaceData[field] || sourceData[field] || '';
      field = replaceData[field] || '';
      text = temp + field + end;
    }
  }
@@ -70,23 +97,26 @@
/**
 * 执行前置事件
 * @param options 按钮的配置信息,前置事件里配置的参数会替换这个里的参数的信息
 * @param buttonTarget 按钮js所在的对象
 * @param fnTarget 执行方法
 * @param callback 回调,如果存在前置事件,会在执行完成后执行回调,否则直接回调
 * @param preEventName 前置事件名称,默认beforeevent
 */
export const callPreEvent = (options,buttonTarget,callback,preEventName) => {
export const callPreEvent = (options,fnTarget,callback,preEventName) => {
  const params = paramLow(options.paramVOS);
  options.paramVOS = params;
  let beforeEvent = params[preEventName || 'beforeevent'];
  if(beforeEvent) {
    let buttonParse = parseEventByUrl(beforeEvent,options,true);
    buttonParse.options.callback = callback;
    if(validatenull(buttonParse)){
      buttonTarget[buttonParse.methodName](buttonParse);
    if(validatenull(buttonParse.jsPath)){
      fnTarget(buttonParse,callback);
    }else{
      layui.use(buttonParse.jsPath,function () {
        layui[buttonParse.jsPath][buttonParse.methodName](options);
      });
      try {
        import("../"+buttonParse.jsPath).then(module => {
          module[buttonParse.methodName](options,callback);
        })
      } catch (error) {
        this.$message.error('未找到前置事件执行js');
      }
    }
  }else{
    if(callback){
@@ -95,22 +125,28 @@
  }
};
/**
 * 执行后置时间
 * 执行后置事件
 * @param options 按钮的配置信息,后置事件里配置的参数会替换这个里的参数的信息
 * @param buttonTarget 按钮Js所在的对象
 * @param fnTarget 执行方法
 * @param callback 回调,如果存在后置事件,会在执行完成后执行回调,否则直接回调
 * @param preEventName 后置事件名称,默认 afterevent
 */
export const callPostEvent = (options,buttonTarget,callback,postEventName)=>{
export const callPostEvent = (options,fnTarget,callback,postEventName)=>{
  const params = paramLow(options.paramVOS);
  options.paramVOS = params;
  var afterEvent = params[postEventName || 'afterevent'];
  let afterEvent = params[postEventName || 'afterevent'];
  if(afterEvent) {
    var buttonParse = parseEventByUrl(afterEvent,options,false);
    if(validatenull(buttonParse)){
      buttonTarget[buttonParse.methodName](buttonParse);
    let buttonParse = parseEventByUrl(afterEvent,options,false);
    if(validatenull(buttonParse.jsPath)){
      fnTarget(buttonParse,callback);
    }else{
      layui.use(buttonParse.jsPath,function () {
        layui[buttonParse.jsPath][buttonParse.methodName](options);
      });
      try {
        import("../"+buttonParse.jsPath).then(module => {
          module[buttonParse.methodName](options,callback);
        })
      } catch (error) {
        this.$message.error('未找到后置事件执行js');
      }
    }
  }else{
    if(callback){
@@ -127,13 +163,13 @@
 */
export const parseEventByUrl = (url,options,isBefore) => {
  //根据配置格式化事件
  var jsPath = url;
  var methodName = isBefore?"doBefore":"doAfter";
  var params = {};
  let jsPath = url;
  let methodName = isBefore?"doBefore":"doAfter";
  let params = {};
  if (url.indexOf("?")) {
    var temp = url.substring(0, url.indexOf("?"));
    let temp = url.substring(0, url.indexOf("?"));
    if (temp.indexOf("#") > -1) {
      var array = temp.split("#");
      let array = temp.split("#");
      if(array.length == 1){
        jsPath = array[0];
      }else{
@@ -143,17 +179,17 @@
    }else{
      jsPath = temp;
    }
    var paramArray = url.substring(url.indexOf("?") + 1).split("&");
    layui.each(paramArray, function (_index, _item) {
    let paramArray = url.substring(url.indexOf("?") + 1).split("&");
    paramArray.forEach(_item=>{
      if (_item.indexOf("=") < 0) {
        this.$message.error(isBefore?"前置事件":"后置事件" + "的参数配置错误,需要要xxx=yyy&zzz=a的方式");
        return true;
      }
      params[_item.split("=")[0]] = _item.split("=")[1];
    });
    })
  }else{
    if (url.indexOf("#") > -1) {
      var array = url.split("#");
      let array = url.split("#");
      if(array.length == 1){
        jsPath = array[0];
      }else{
Source/ProjectWeb/src/components/dynamic-components/dynamic-TreeTable.vue
@@ -396,6 +396,7 @@
      this.TreeSelectList = row;
      this.$emit("setDataStore", {
        area: this.areasName,
        type:this.componentVO.uiComponentType,
        dataStore:row
      });
    },
Source/ProjectWeb/src/components/dynamic-components/dynamic-button.vue
@@ -56,6 +56,7 @@
<script>
import func from "@/util/func";
import {validatenull} from "@/util/validate";
import {doAction} from '@/actions/base/BaseAction';
export default {
  name: "dynamic-button",
@@ -278,18 +279,14 @@
      this.$refs.dynamicForm.form = row;
    },
    buttonClick(item) {
      // 根据 type 条件动态引入不同的JS文件,并传递 item this 参数
      if (this.type === 'table') {
        import('@/views/base/buttonTable').then(module => {
          const buttonClickTable = module.default;
          buttonClickTable.buttonClick(item,this);
        })
      } else if (this.type === 'form') {
        import('@/views/base/buttonForm').then(module => {
          const buttonClickForm = module.default;
          buttonClickForm.buttonClick(item,this);
        })
      }
      doAction(item,{
        paramVOS: item.paramVOS,
        dataStore: [],
        sourceData: {},
        callback: function (){
        }
      });
    }
  },
}
Source/ProjectWeb/src/components/dynamic-components/dynamic-table.vue
@@ -555,14 +555,14 @@
    },
    selectChange(row) {
      this.selectList = row;
    },
    searchChange(form,done){
      console.log(form)
      done()
      this.$emit("setDataStore", {
        area: this.areasName,
        type:this.componentVO.uiComponentType,
        dataStore:row
      });
    },
    searchChange(form,done){
      done();
    }
  }
}
Source/ProjectWeb/src/components/dynamic-components/dynamic-tree.vue
@@ -75,6 +75,7 @@
        if(newval) {
          this.$emit("setDataStore", {
            area: this.areasName,
            type:this.componentVO.uiComponentType,
            dataStore:newval
          });
        }
Source/ProjectWeb/src/views/base/UIContentArea.vue
@@ -1,7 +1,7 @@
<template>
  <basic-container :cradStyle="cradStyle" cardBodyStyle="height:100%;box-sizing: border-box;padding-bottom:5px;">
    <el-tabs style="height: 100%;" class="UITabs" v-if="areasData.length>1" v-model="activeName" type="card" @tab-click="tabHandleClick">
      <el-tab-pane style="height:100%;overflow: auto" v-for="(areaItem,index) in areasData" :key="areaItem.oid" :label="areaItem.name" :name="areasName+'-Tab-'+index">
    <el-tabs style="height: 100%;" class="UITabs" v-if="newAreasData.length>1" v-model="activeName" type="card" @tab-click="tabHandleClick">
      <el-tab-pane style="height:100%;overflow: auto" v-for="(areaItem,index) in newAreasData" :key="areaItem.oid" :label="areaItem.name" :name="areasName+'-Tab-'+index">
        <el-collapse class="UI-collapse" :key="areaItem.oid+'-collapse'" v-model="collapseActiveNames" v-if="areaItem.componentVOs.length>1" @change="handleChange">
          <el-collapse-item v-for="(componentVO,componentIndex) in areaItem.componentVOs" :name="areasName+'-collapse-'+componentIndex">
            <template slot="title">
@@ -11,7 +11,7 @@
              <compoent-index :key="areasName+'componentVO-'+componentVO.oid"
                              :inDialog="inDialog"
                              :componentVO="componentVO"
                              :sourceData="sourceData"
                              :sourceData="newSourceData"
                              :dataStore="dataStore"
                              :areasName="areasName"
                              :paramVOS="paramVOS"
@@ -24,7 +24,7 @@
          <compoent-index :key="areasName+'componentVO-'+areaItem.componentVOs[0].oid"
                          :inDialog="inDialog"
                          :componentVO="areaItem.componentVOs[0]"
                          :sourceData="sourceData"
                          :sourceData="newSourceData"
                          :dataStore="dataStore"
                          :areasName="areasName"
                          :paramVOS="paramVOS"
@@ -33,9 +33,9 @@
        </div>
      </el-tab-pane>
    </el-tabs>
    <div v-else style="height:100%;overflow: auto">
      <el-collapse class="UI-collapse" :key="areasData[0].oid+'-collapse'" v-model="collapseActiveNames" v-if="areasData[0].componentVOs.length>1" @change="handleChange">
        <el-collapse-item v-for="(componentVO,componentIndex) in areasData[0].componentVOs" :name="areasName+'-collapse-'+componentIndex">
    <div v-else-if="newAreasData.length===1" style="height:100%;overflow: auto">
      <el-collapse class="UI-collapse" :key="newAreasData[0].oid+'-collapse'" v-model="collapseActiveNames" v-if="newAreasData[0].componentVOs.length>1" @change="handleChange">
        <el-collapse-item v-for="(componentVO,componentIndex) in newAreasData[0].componentVOs" :name="areasName+'-collapse-'+componentIndex">
          <template slot="title">
            {{componentVO.name}}
          </template>
@@ -43,7 +43,7 @@
            <compoent-index :key="areasName+'componentVO-'+componentVO.oid"
                            :inDialog="inDialog"
                            :componentVO="componentVO"
                            :sourceData="sourceData"
                            :sourceData="newSourceData"
                            :dataStore="dataStore"
                            :areasName="areasName"
                            :paramVOS="paramVOS"
@@ -53,10 +53,10 @@
        </el-collapse-item>
      </el-collapse>
      <div v-else class="componentVO">
        <compoent-index :key="areasName+'componentVO-'+areasData[0].componentVOs[0].oid"
        <compoent-index :key="areasName+'componentVO-'+newAreasData[0].componentVOs[0].oid"
                        :inDialog="inDialog"
                        :componentVO="areasData[0].componentVOs[0]"
                        :sourceData="sourceData"
                        :componentVO="newAreasData[0].componentVOs[0]"
                        :sourceData="newSourceData"
                        :dataStore="dataStore"
                        :areasName="areasName"
                        :paramVOS="paramVOS"
@@ -64,11 +64,42 @@
                        :isShow="true"></compoent-index>
      </div>
    </div>
    <div v-else>
      <el-alert
        v-if="areasData.length==0"
        class="alert"
        :closable="false"
        title="配置错误"
        type="error"
        show-icon
        description="该区域没有配置显示的内容">
      </el-alert>
      <el-alert
        v-else-if="Object.keys(newSourceData).length === 0"
        class="alert"
        :closable="false"
        title="源数据为空"
        type="error"
        show-icon
        description="不满足显示表达式条件,没有可显示的内容">
      </el-alert>
      <el-alert
        v-else
        class="alert"
        :closable="false"
        title=""
        type="error"
        show-icon
        description="不满足显示表达式条件,没有可显示的内容。">
      </el-alert>
      {{newSourceData}}
    </div>
  </basic-container>
</template>
<script>
import compoentIndex from "@/components/dynamic-components/index"
import {validatenull, verifyNotNull} from "@/util/validate";
export default {
  name: "UIContentArea",
  components:{compoentIndex},
@@ -107,10 +138,54 @@
      collapseActiveNames:[this.areasName+'-collapse-0']
    }
  },
  computed:{
    newAreasData(){
      let newAreasData = [];
      this.areasData.forEach(areaData => {
        //验证显式表达式
        if (!validatenull(areaData.displayExpression)) {
          if (this.checkDisplayExpression(areaData.displayExpression)) {
            newAreasData.push(areaData)
          }
        } else {
          newAreasData.push(areaData)
        }
      })
     return newAreasData;
    },
    newSourceData(){
      if(this.sourceData.attributes && this.sourceData.parentId!=undefined && this.sourceData.parentId !=null){
        //源数据是树节点
        return this.sourceData.attributes
      }
      return this.sourceData;
    }
  },
  created() {
  },
  mounted() {
    // console.log(this.areasData);
  },
  methods:{
    checkDisplayExpression(displayExpressionStr){
      //"${folderbusinesstype}"<>"workunit" and "${folderbusinesstype}"<>"part"  and "${folderbusinesstype}"<>"Terminology" and  "${folderbusinesstype}"<>"AssMaterial" and  "${folderbusinesstype}"<>"resourcelib" and  "${folderbusinesstype}"<>"material"  and "${folderbusinesstype}"<>"machine"
      // "${folderbusinesstype}"="AssMaterial" or "${folderbusinesstype}"="assmaterial"
      //"${folderbusinesstype}"="material"
      //${folderbusinesstype}为源数据中的属性
      let checkdisplay=false;
      //替换and和or
      let newDisplayExpressionStr=displayExpressionStr.replace(/"\s*and\s*"/g,'" && "').replace(/"\s*AND\s*"/g,'" && "').replace(/"\s*or\s*"/g,'" || "').replace(/"\s*OR\s*"/g,'" || "');
      newDisplayExpressionStr=newDisplayExpressionStr.replace(/"\s*<>\s*"/g,'" != "').replace(/"\s*=\s*"/g,'" == "');
      newDisplayExpressionStr=newDisplayExpressionStr.replace(/"\$\{/g,'this.newSourceData.').replace(/\}"/g,'')
      const sandbox = {};
      if(eval('('+newDisplayExpressionStr+')')){
        checkdisplay=true;
      }
      return checkdisplay;
    },
    tabHandleClick(tab, event) {
      // console.log(tab, event);
    },