Sfoglia il codice sorgente

表单界面增加操作列

guozhibo 1 anno fa
parent
commit
534e4f41d5

+ 20 - 2
src/window1/tabFormEdit/TabFormFieldEdit.vue

@@ -244,7 +244,16 @@
         :readonly="isReadOnly"
         @value-changed="valueChanged"
       />
-
+      <div v-if="fieldUtil.isGridButtonEditor(field)" style="display: inline-block">
+        <template v-for="tabFormButtonItem in field.tabFormButtonDtos" :key="tabFormButtonItem.name">
+          <a-button
+            v-if="tabFormButtonItem.action === 'OPEN_NEW_VIEW_EDIT'" type="link"
+            @click="openNewViewEdit(tabFormButtonItem)"
+          >
+            {{ tabFormButtonItem.name }}
+          </a-button>
+        </template>
+      </div>
       <p v-show="!validateMandatory" class="required-mark required-error">
         该字段为必填字段
       </p>
@@ -536,7 +545,16 @@ export default {
       return this.modelData.data[this.field.fieldName].displayValue[this.field.entityFieldIndex];
     },
 
-
+    /**
+     * 打开新界面编辑
+     * @param tabButton 
+     */
+    openNewViewEdit:function(tabButton){
+      //打开新界面编辑Url
+      var openNewViewEditUrl = tabButton.openNewViewEditUrl;
+      //modelData过去,编辑完成后把modelData带回来
+      //待开发
+    },
     // 值改变事件
     valueChanged: function (newFieldValue) {
       // this.fieldValue = newFieldValue;

+ 307 - 4
src/window1/tabFormView/TabFormFieldView.vue

@@ -32,7 +32,8 @@
             !fieldUtil.isFileType(field) &&
             !fieldUtil.isRichTextAreaEditor(field) &&
             !fieldUtil.isNumberType(field) && 
-            !fieldUtil.isButtonType(field) 
+            !fieldUtil.isButtonType(field) && 
+            !fieldUtil.isGridButtonEditor(field)             
         "
         v-tooltip.left="getFieldStringValue()"
         class="form-control-static input-group-item"
@@ -183,16 +184,62 @@
           @execute-callout="executeCallout"
         />
       </div>
+      
+      <div v-if="fieldUtil.isGridButtonEditor(field)" style="display: inline-block">
+        <template v-for="(tabFormButtonItem, index) in field.tabFormButtonDtos" :key="tabFormButtonItem.name">
+          <template v-if="visible[index]">
+            <a-button v-if="tabFormButtonItem.action === 'EDIT'" type="link" @click="editRecord">
+              {{ tabFormButtonItem.name
+              }}
+            </a-button>
+            <a-button
+              v-if="tabFormButtonItem.action === 'RUN_PROCESS_REPORT'" type="link"
+              @click="execute(tabFormButtonItem)"
+            >
+              {{ tabFormButtonItem.name }}
+            </a-button>
+            <a-button
+              v-if="tabFormButtonItem.action === 'OPEN_CUSTOMER_WINDOW'" type="link"
+              @click="execute(tabFormButtonItem)"
+            >
+              {{ tabFormButtonItem.name }}
+            </a-button>
+            <a-button
+              v-if="tabFormButtonItem.action === 'OPEN_HTML_WINDOW'" type="link"
+              @click="execute(tabFormButtonItem)"
+            >
+              {{ tabFormButtonItem.name }}
+            </a-button>
+            <a-button
+              v-if="tabFormButtonItem.action === 'OPEN_REMOTE_COMPONENT_MODULE_IN_MODAL'" type="link"
+              @click="openRemoteComponentModule(tabFormButtonItem)"
+            >
+              {{ tabFormButtonItem.name }}
+            </a-button>
+            <a-button
+              v-if="tabFormButtonItem.action === 'OPEN_NEW_VIEW_EDIT'" type="link"
+              @click="openNewViewEdit(tabFormButtonItem)"
+            >
+              {{ tabFormButtonItem.name }}
+            </a-button>
+          </template>
+        </template>
+      </div>
     </div>
   </div>
+  <component :is="modal1Component" v-model:open="modal1Open" :class-name="className" :model-data="modelData" @refresh-data="refreshDatas" />
 </template>
 
 <script>
+import {
+  ref,
+  defineAsyncComponent,
+} from 'vue';
 import fieldUtil from '../../resource/dictionary/FieldUtil.js';
 import WindowClientUtil from '../../resource/dictionary/WindowClientUtil.js';
 import Language from '../../common/Language.js';
 import Context from '../common/Context.js';
-
+import { Spin as ASpin, Empty as AEmpty } from 'ant-design-vue';
 import EnumSelectWidget from '../tabFormWidget/EnumSelectWidget.vue';
 import SelectWidget from '../tabFormWidget/SelectWidget.vue';
 import EnumRadioGroupWidget from '../tabFormWidget/EnumRadioGroupWidget.vue';
@@ -204,7 +251,12 @@ import ImageViewWidget from '../tabFormWidget/ImageViewWidget.vue';
 import ImageListViewWidget from '../tabFormWidget/ImageListViewWidget.vue';
 import JsUtil from '../../common/JsUtil.js';
 import { SqlApi } from 'pc-component-v3';
-import { Notify, Uuid } from 'pc-component-v3';
+import { Notify, Uuid , CssUtil} from 'pc-component-v3';
+import Common from '../../common/Common.js';
+import CustomerWindowResource from '../../api/dic/CustomerWindowResource.js';
+import HtmlWindowResource from '../../api/dic/HtmlWindowResource.js';
+import ProcessReportResource from '../../api/dic/ProcessReportResource.js';
+
 export default {
   components: {
     ImageViewWidget,
@@ -215,6 +267,10 @@ export default {
     VideoListWidget,
     FileListWidget,
     ButtonWidget,
+    Common,
+    CustomerWindowResource,
+    HtmlWindowResource,
+    ProcessReportResource,
   },
 
   props: {
@@ -248,7 +304,7 @@ export default {
     },
   },
 
-  emits: ['executeCallout'],
+  emits: ['executeCallout', 'refreshDatas'],
 
   data: function () {
     this.Language = Language;
@@ -266,6 +322,9 @@ export default {
       fieldValue: fieldValue,
       fieldUtil: fieldUtil,
       showField: true, // 显示字段
+      visible:[],
+      modal1Open: false,
+      modal1Component: null,
     };
   },
 
@@ -355,6 +414,19 @@ export default {
         this.showLogical();
       },
     },
+    'field.tabFormButtonDtos': {
+
+      immediate: true,
+      handler(curVal, oldVal) {
+        const _self = this;
+        this.visible.splice(0, this.visible.length);
+        if (curVal != null) {
+          curVal.forEach(item => {
+            _self.visible.push(true);
+          });
+        }
+      },
+    },
   },
 
   mounted: function () {
@@ -372,7 +444,238 @@ export default {
     executeCallout: function (field) {
       this.$emit('executeCallout', field);
     },
+    refreshDatas: function () {
+      this.$emit('refreshDatas');
+    },
+    /**
+     * 打开新界面编辑
+     * @param tabButton 
+     */
+    openNewViewEdit:function(tabButton){
+      //打开新界面编辑Url
+      var openNewViewEditUrl = tabButton.openNewViewEditUrl;
+      //传递modelData,调接口
+      //待开发
+    },
+    /**
+     * 远程加载ES VUE组件模块,并在模态框中打开。
+     * @param jsUrl js路径
+     * @param cssUrl css路径
+     */
+    openRemoteComponentModule: function (tabButton) {
+      var _self = this;
+      let jsUrl = tabButton.remoteComponentModuleJsUrl;
+      let cssUrl = tabButton.remoteComponentModuleCssUrl;
+
+      // 显示模态框
+      // 异步的加载js组件
+      //let jsUrl = './static/client-eam-module-v3/dist/AssetCheckCreate.js';
+      //let cssUrl = './static/client-eam-module-v3/dist/AssetCheckCreate.css';
+
+      if (cssUrl != null && cssUrl.length > 0) {
+        let cssUrlHash = _self.getHash(cssUrl);
+        CssUtil.dynamicLoadCss(cssUrl, cssUrlHash);
+      }
+      // webpackIgnore:设置为 true 时,禁用动态导入解析。
+      // const testAsyncRemoteComponent  = await import(/* webpackIgnore: true */ jsUrl);
+
+      // console.log(testAsyncRemoteComponent);
+      if (jsUrl != null && jsUrl.length > 0) {
+        const testAsyncRemoteComponent = defineAsyncComponent({
+          // 加载函数
+          loader: () => {
+            return import(/* webpackIgnore: true */ jsUrl);
+          },
+          // 加载异步组件时使用的组件
+          loadingComponent: ASpin,
+          // 展示加载组件前的延迟时间,默认为 200ms
+          delay: 200,
+          // 加载失败后展示的组件
+          errorComponent: AEmpty,
+          // 如果提供了一个 timeout 时间限制,并超时了
+          // 也会显示这里配置的报错组件,默认值是:Infinity
+          timeout: 10000,
+        });
+
+        _self.modal1Component = testAsyncRemoteComponent;
+        _self.modal1Open = true;
+        console.log(_self.modal1Component);
+      }
+    },
+
+    //跳转或执行流程
+    execute: function (tabButton) {
+      var _self = this;
+      _self.tabButtonModel = tabButton;
+      if (tabButton.customerWindowNo != undefined && tabButton.customerWindowNo != '') {
+        CustomerWindowResource.uniqueByNo(tabButton.customerWindowNo).then(
+          successData => {
+            if (successData.errorCode == 0) {
+              tabButton.customerWindowRouteUrl = successData.data.routeUrl;
+              if (tabButton.customerWindowNo == '20221101_151823') {
+                localStorage.setItem('AssetInstance_ComplexFilterParams', JSON.stringify(_self.complexFilterParams));
+                localStorage.setItem('AssetInstance_SimpleFilterParams', _self.simpleFilterParams);
+              }
+              //跳转到tabButton.routeUrl
+              _self.switchFormRoute(tabButton);
+            }else{
+              Notify.error(_self.$t('lang.Notify.error'), successData.errorMessage, true);
+            }
+            
+          },
+          errorData => {
+            Common.processException(errorData);
+          },
+        );
+      } else if (
+        tabButton.processReportNo != undefined &&
+      tabButton.processReportNo != ''
+      ) {
+      // 判断流程报表是否有参数
+      // 如果有参数则直接跳转到流程和报表的界面。
+        if (tabButton.routerRedirect == undefined || tabButton.routerRedirect == false) {
+          if (tabButton.tipsTitle == undefined || tabButton.tipsTitle.length == 0) {
+            _self.executeProcess();
+          } else {
+            _self.titleModal = true;
+          }
+        } else {
+          this.$router.push({
+            path: '/desktop/process-report/' + tabButton.processReportNo,
+          });
+        }
+      } else if (tabButton.htmlWindowNo != undefined) {
+        HtmlWindowResource.uniqueByNo(tabButton.htmlWindowNo).then(
+          response => {
+            if (response.errorCode != 0) {
+              Notify.error(_self.$t('lang.Notify.dataDictionaryError'), response.errorMessage, true);
+              return;
+            }
+
+            const htmlWindowDto = response.data;
+            if (htmlWindowDto != undefined) {
+              var htmlWindowUrl = htmlWindowDto.htmlFileName;
+              var autoCloseInterval = htmlWindowDto.autoCloseInterval;
+              var regExp = new RegExp('[{].*?[}]', 'g');
+              var result = htmlWindowUrl.match(regExp);
+              if (htmlWindowUrl != undefined && htmlWindowUrl != '') {
+                for (var index = 0, len = result.length; index < len; index++) {
+                  var tempResult = result[index];
+                  console.log('{' + tempResult + '}匹配');
+                  if (tempResult == '{URL}') {
+                    htmlWindowUrl = htmlWindowUrl.replace(
+                      '{URL}',
+                      Common.getHostPageBaseURL(),
+                    );
+                  } else if (tempResult == '{RecordIds}') {
+                    var recordId = _self.modelData.id;
+                    htmlWindowUrl = htmlWindowUrl.replace('{RecordIds}', recordId);
+                  } else if (tempResult == '{Token}') {
+                    htmlWindowUrl = htmlWindowUrl.replace('{Token}', Common.getToken());
+                  } else {
+                    if (_self.selectedModelDatas.length == 0) {
+                      Notify.error(_self.$t('lang.Notify.error'), _self.$t('lang.tabButton.describe3'), true);
+                      return;
+                    } else if (_self.selectedModelDatas.length > 1) {
+                      Notify.error(_self.$t('lang.Notify.error'), _self.$t('lang.tabButton.describe2'), true);
+                      return;
+                    }
+                    var tempResult1 = tempResult.replace('{', '').replace('}', '');
+                    htmlWindowUrl = htmlWindowUrl.replace(
+                      tempResult,
+                      _self.getFirstSelectModelDataFieldValue(tempResult1),
+                    );
+                  }
+                }
+
+                var openWindow = window.open(htmlWindowUrl);
+
+                // 自动关闭
+                if (autoCloseInterval != undefined) {
+                  setTimeout(function () {
+                    openWindow.close();
+                    openWindow = undefined;
+                  }, autoCloseInterval * 1000);
+                }
+              }
+            }
+          },
+          errorData => {
+            Common.processException(errorData);
+          },
+        );
+      }
+    },
+    // 执行流程
+    executeProcess: function () {
+      var _self = this;
+      var ids = [_self.modelData.id];
+      ProcessReportResource.runProcessByIds(_self.tabButtonModel.processReportNo, ids).then(
+        successData => {
+          _self.modal = true;
+          _self.processReportResult = successData;
+
+          if (
+            _self.processReportResult.reportResults != undefined &&
+          _self.processReportResult.reportResults.length > 0
+          ) {
+            _self.processReportResult.reportResults.forEach(function (item, index) {
+              if (item.reportDefinitionType !== 'ExcelReport') {
+                item.previewIndex = 1;
+              } else {
+                item.previewIndex = 2;
+              }
+              if (index == 0) {
+                item.showPreview = true;
+              } else {
+                item.showPreview = false;
+              }
+            });
+          }
+          _self.titleModal = false;
+          _self.refreshDatas();
+        },
+        errorData => {
+          _self.titleModal = false;
+          Common.processException(errorData);
+        },
+      );
+    // }
+    },
+    // 切换到Form表单的路由
+    switchFormRoute: function (tabButton) {
+      const _self = this;
+      var routeDate = {
+        path: tabButton.customerWindowRouteUrl,
+        params: {
+          modelData: this.modelData,
+        },
+      };
+      // 请勿修改,会影响生单的功能
+      var uuid = _self.uuid;
+      if (uuid != undefined) {
+        routeDate.path = routeDate.path + '/' + uuid;
+      }
+
+      const frameUrl = Common.getRedirectUrl(
+        '#' + routeDate.path,
+      );
 
+      // 供子页面iframe调用,修改modelData,(举例:生单界面修改参数)。
+      // window.modelDataChanged = this.modelDataChanged;
+
+      // window.getModelData = this.getModelData;
+      let modelData = JSON.stringify(this.modelData);
+      console.log(modelData);
+      localStorage.setItem(_self.uuid + '#GenerateDocumentTool', modelData);
+
+      var iWidth = 1280;//弹出窗口的宽度;
+      var iHeight = 720; //弹出窗口的高度;
+      var iTop = (window.screen.availHeight - 30 - iHeight) / 2;//获得窗口的垂直位置;
+      var iLeft = (window.screen.availWidth - 10 - iWidth) / 2; //获得窗口的水平位置;
+      window.open(frameUrl, '_blank', 'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no');
+    // window.open(frameUrl);
+    },
     // 获取String字符串
     getFieldStringValue: function () {
       var value = '';

+ 17 - 0
src/window1/tabGridView/CellTextItem.vue

@@ -116,6 +116,12 @@
           >
             {{ tabGridButtonItem.name }}
           </a-button>
+          <a-button
+            v-if="tabGridButtonItem.action === 'OPEN_NEW_VIEW_EDIT'" type="link"
+            @click="openNewViewEdit(tabGridButtonItem)"
+          >
+            {{ tabGridButtonItem.name }}
+          </a-button>
         </template>
       </template>
     </div>
@@ -580,6 +586,17 @@ export default {
       }
     },
 
+    /**
+     * 打开新界面编辑
+     * @param tabButton 
+     */
+    openNewViewEdit:function(tabButton){
+      //打开新界面编辑Url
+      var openNewViewEditUrl = tabButton.openNewViewEditUrl;
+      //传递modelData,调接口
+      //待开发
+    },
+
     /**
      * 获取字符串的哈希值
      * @param input