Forráskód Böngészése

Merge branch 'master' of https://a.leanwo.com:3000/prodog-client-2023/client-base-v4

# Conflicts:
#	src/window1/tabGridView/GridBody.vue
guozhibo 1 éve
szülő
commit
a29dd065d1

+ 13 - 0
src/client/MenuWidget.vue

@@ -73,6 +73,10 @@ import Language from '../common/Language.js';
 import MenuNode from './MenuNode.vue';
 import { Uuid } from 'pc-component-v3';
 
+import { useRoleStateSingleton } from './RoleState.js';
+
+
+
 export default {
   components: {
     MenuNode,
@@ -90,6 +94,7 @@ export default {
       selectedNode: {}, // 选择的节点
       searchText: '',
       logoUrl: '', // logo路径
+      roleStateInstance: useRoleStateSingleton,
     };
   },
 
@@ -97,6 +102,11 @@ export default {
     searchText: function (newVal, oldVal) {
       this.search(newVal);
     },
+    'roleStateInstance.userRoleOrTemplate': function(newValue, oldVal){
+
+      console.log(newValue);
+      this.loadMenuData();
+    },
   },
 
   mounted: function () {
@@ -110,10 +120,13 @@ export default {
     loadMenuData: function () {
       console.log('loadMenuData');
       var _self = this;
+      _self.rootNodes = [];
       $.ajax({
         url: Common.getApiURL('MenuResourceV2/listCanVist'),
         type: 'POST',
+        data: _self.roleStateInstance.userRoleOrTemplate == null ? null : JSON.stringify(_self.roleStateInstance.userRoleOrTemplate),
         dataType: 'json',
+        contentType: 'application/json',
         beforeSend: function (request) {
           Common.addTokenToRequest(request);
         },

+ 1 - 1
src/client/OrganizationEditPanel.vue

@@ -18,7 +18,7 @@
       option-filter-prop="label"
       style="width: 50%; margin-left: 16px"
       placeholder="请选择公司"
-      :options="companies.map((item) => ({ value: item.id, label: item.name }))"
+      :options="companies.map((item) => ({ value: item.roomId, label: item.roomName }))"
       @change="getClientId"
     />
     <a-button type="primary" style="margin-left: 8px" @click="editClient">

+ 20 - 0
src/client/RoleState.js

@@ -0,0 +1,20 @@
+import { reactive, ref } from 'vue';
+
+function useRoleState() {
+  const userRoleOrTemplate = ref();
+
+  function setUserRoleOrTemplate(newUserRoleOrTemplate) {
+    userRoleOrTemplate.value = newUserRoleOrTemplate;
+  }
+
+
+  return {
+    userRoleOrTemplate,
+    setUserRoleOrTemplate,
+  };
+}
+
+const useRoleStateSingleton = useRoleState();
+
+export {useRoleStateSingleton};
+

+ 4 - 1
src/client/TopNavigation.vue

@@ -34,6 +34,7 @@
           >
             <TopNavUserInfo :login-info="loginInfo" />
             <TopNavClientSelect :login-info="loginInfo" />
+            <TopNavRoleSelect />
             <TopNavMessage :login-info="loginInfo" />
             <TopNavVideoCallCenter />
             <TopNavDownload />
@@ -56,8 +57,9 @@ import TopNavUserInfo from './top-nav-user-info.vue';
 import TopNavMessage from './top-nav-message.vue';
 import TopNavVideoCallCenter from './top-nav-video-call-center.vue';
 import TopNavDownload from './top-nav-download.vue';
+import TopNavRoleSelect from './top-nav-role-select.vue';
 import LoginNotice from './LoginNotice.vue';
-
+;
 export default {
   components: {
     AuthImage,
@@ -67,6 +69,7 @@ export default {
     TopNavVideoCallCenter,
     TopNavDownload,
     LoginNotice,
+    TopNavRoleSelect,
   },
   emits: ['menuVisibleChanged'],
   data: function () {

+ 143 - 0
src/client/top-nav-role-select.vue

@@ -0,0 +1,143 @@
+<template>
+  <ul class="nav navbar-nav navbar-right">
+    <li class="dropdown">
+      <a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
+        {{ roleStateInstance.userRoleOrTemplate != null ? roleStateInstance.userRoleOrTemplate.roleOrTemplateName : '全部'
+        }}
+        <span class="caret" />
+      </a>
+      <ul v-if="userRoleOrTemplateList != null && userRoleOrTemplateList.length > 0" class="dropdown-menu">
+        <li
+          v-for="userRoleOrTemplate in userRoleOrTemplateList"
+          :key="userRoleOrTemplate.userRoleTemplateId + '-' + userRoleOrTemplate.userRoleId"
+        >
+          <a
+            @click="roleStateInstance.setUserRoleOrTemplate(userRoleOrTemplate); uploadSelectedRole(userRoleOrTemplate)"
+          >{{
+            userRoleOrTemplate.roleOrTemplateName }}</a>
+        </li>
+        <li>
+          <a @click="roleStateInstance.setUserRoleOrTemplate(null); uploadSelectedRole(null)">全部</a>
+        </li>
+      </ul>
+    </li>
+  </ul>
+</template>
+
+<script>
+
+import Common from '../common/Common.js';
+import ClientResourceV2 from '../api/base/ClientResourceV2.js';
+import TokenClientResource from '../api/base/TokenClientResource.js';
+import { Notify, Uuid } from 'pc-component-v3';
+import { useRoleStateSingleton } from './RoleState.js';
+import { UserStorageResource } from 'pc-component-v3';
+import { message } from 'ant-design-vue';
+
+export default {
+  props: {
+
+  },
+
+  data: function () {
+    return {
+      userRoleOrTemplateList: [],
+      loginClientName: '',
+      visible: false,
+      roleStateInstance: useRoleStateSingleton,
+    };
+  },
+
+
+  mounted: function () {
+    this.listUserRoleOrTemplate();
+  },
+
+  methods: {
+    /**
+     * 查询登录用户具备的角色OR角色模板
+     */
+    listUserRoleOrTemplate: function () {
+      var _self = this;
+      $.ajax({
+        url: Common.getApiURL('RoleResourceV3/listUserRoleOrTemplate'),
+        type: 'get',
+        contentType: 'application/json',
+        beforeSend: function (request) {
+          Common.addTokenToRequest(request);
+        },
+        success: function (response) {
+          if (response.errorCode === 0) {
+            _self.userRoleOrTemplateList = response.datas;
+            _self.downloadSelectedRole();
+          } else {
+            Notify.error('错误', response.errorMessage, false);
+          }
+        },
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
+          Common.processException(XMLHttpRequest);
+        },
+      });
+    },
+
+
+    /**
+     * 选择的用户权限存储只后端
+     * @author YangZhiJie
+     * @date 2024-10-14
+     */
+    uploadSelectedRole: function (userRoleOrTemplate) {
+      let key = 'UserSelectedRole';
+      let userStorageDtos = [
+        {
+          key: key,
+          value: userRoleOrTemplate == null ? null : JSON.stringify(userRoleOrTemplate),
+        },
+      ];
+      UserStorageResource.uploadUserStorage(userStorageDtos).then(successData => {
+        console.log(successData);
+      }, errorData => {
+        Common.processException(errorData);
+      });
+    },
+
+
+    /**
+     * 选择的用户权限存储只后端
+     * @author YangZhiJie
+     * @date 2024-10-14
+     */
+    downloadSelectedRole: function () {
+      var _self = this;
+      let key = 'UserSelectedRole';
+
+      UserStorageResource.uniqueByKey(key).then(
+        success => {
+          if (success.errorCode == 0) {
+            if (success.data) {
+              let userRoleTemplate = JSON.parse(success.data);
+              if(_self.userRoleOrTemplateList != null){
+                _self.userRoleOrTemplateList.forEach(item => {
+                  if(
+                    (item.userRoleTemplateId + '-' + item.userRoleId) == 
+                    (userRoleTemplate.userRoleTemplateId + '-' + userRoleTemplate.userRoleId)
+                  ){
+                    _self.roleStateInstance.setUserRoleOrTemplate(item);
+                  }
+                });
+              }
+            } else {
+              _self.roleStateInstance.setUserRoleOrTemplate(null);
+            }
+          } else {
+            message.warning(success.errorMessage);
+          }
+        },
+        error => {
+          Common.processException(error);
+        },
+      );
+    },
+  },
+};
+</script>

+ 34 - 0
src/window1/tabGridView/GridBody.vue

@@ -89,6 +89,40 @@
       </td>
     </template>
   </tr>
+  <Modal v-model:show="modal" :full="true">
+    <ProcessReportResultPreview
+      v-if="
+        processReportResult != null &&
+          (processReportResult.reportResults != null ||
+            processReportResult.processResult != null)
+      "
+      :process-report-result="processReportResult"
+      :pdf-only="false"
+      :excel-only="false"
+    />
+    <template #header>
+      {{ $t("lang.tabButton.executeResult") }}
+    </template>
+  </Modal>
+  <Modal
+    v-model:show="titleModal"
+    :show-canel-button="false"
+    :show-ok-button="false"
+  >
+    <template #header>
+      {{ tabButtonModel.tipsTitle }}
+    </template>
+    {{ tabButtonModel.tipsContent }}
+    <template #footer>      
+      <button type="button" class="btn btn-default" @click="titleModalClose">
+        {{ $t("lang.tabButton.cancel") }}
+      </button>
+      <button type="primary" class="btn btn-default" @click="executeProcess">
+        确认
+      </button>
+    </template>
+  </Modal>
+  <component :is="modal1Component" v-model:open="modal1Open" :model-data="modelData" @refresh-data="refreshDatas" />
 </template>
 
 <script>

+ 104 - 54
src/window1/tabGridView/NewTabButton.vue

@@ -169,26 +169,12 @@
     </template>
   </Modal>
 
-  <Modal
-    v-model:show="titleModal"
-    :show-canel-button="false"
-    :show-ok-button="false"
-  >
-    <template #header>
-      {{ tabButtonModel.tipsTitle }}
-    </template>
-    {{ tabButtonModel.tipsContent }}
-    <template #footer>      
-      <button type="button" class="btn btn-default" @click="titleModalClose">
-        {{ $t("lang.tabButton.cancel") }}
-      </button>
-      <button type="primary" class="btn btn-default" @click="executeProcess">
-        确认
-      </button>
-    </template>
-  </Modal>
-
-  <component :is="modal1Component" v-model:open="modal1Open" />
+  <component
+    :is="modal1Component"
+    v-model:open="modal1Open"
+    :model-data="selectDatas"
+    @refresh-data="refresh"
+  />
 </template>
 
 <script setup>
@@ -200,6 +186,7 @@ import {
   getCurrentInstance,
   defineAsyncComponent,
   h,
+  onMounted,
 } from 'vue';
 import Common from '../../common/Common';
 import DownloadService from '../../resource/file/DownloadService.js';
@@ -248,6 +235,12 @@ const props = defineProps({
       return null;
     },
   },
+  selectModelDatas: {
+    type: Array,
+    default: function () {
+      return null;
+    },
+  },
   showTabDto: {
     type: Object,
     default: function () {
@@ -281,6 +274,7 @@ const emit = defineEmits([
   'judgeIsHaveButtons',
 ]);
 
+const selectDatas = ref([]);
 const tabButtons = ref([]);
 const leftTabButton = ref([]);
 const rightTabButton = ref([]);
@@ -310,9 +304,15 @@ const deleteData = () => {
 const refresh = () => {
   emit('refreshDatas', false);
 };
-const closeModal = () => {
-  modal1Open.value = false;
-};
+
+watch(
+  () => props.selectModelDatas,
+  newV => {
+    selectDatas.value = newV;
+  },
+  { immediate: true, deep: true },
+);
+
 /**
  * 导出确认
  */
@@ -604,13 +604,22 @@ const openRemoteComponentModule = async function (tabButton) {
 //跳转或执行流程
 const execute = async function (tabButton) {
   tabButtonModel.value = tabButton;
-  if (tabButton.customerWindowNo != undefined && tabButton.customerWindowNo != '') {
+  if (
+    tabButton.customerWindowNo != undefined &&
+    tabButton.customerWindowNo != ''
+  ) {
     CustomerWindowResource.uniqueByNo(tabButton.customerWindowNo).then(
       successData => {
         tabButton.customerWindowRouteUrl = successData.routeUrl;
-        if(tabButton.customerWindowNo == '20221101_151823'){
-          localStorage.setItem('AssetInstance_ComplexFilterParams',JSON.stringify(props.complexFilterParams));
-          localStorage.setItem('AssetInstance_SimpleFilterParams', props.simpleFilterParams);
+        if (tabButton.customerWindowNo == '20221101_151823') {
+          localStorage.setItem(
+            'AssetInstance_ComplexFilterParams',
+            JSON.stringify(props.complexFilterParams),
+          );
+          localStorage.setItem(
+            'AssetInstance_SimpleFilterParams',
+            props.simpleFilterParams,
+          );
         }
         //跳转到tabButton.routeUrl
         if (props.viewType == 'Form' || props.viewType == 'EditForm') {
@@ -625,15 +634,18 @@ const execute = async function (tabButton) {
     );
   } else if (
     tabButton.processReportNo != undefined &&
-        tabButton.processReportNo != ''
-  ) {        
+    tabButton.processReportNo != ''
+  ) {
     // 判断流程报表是否有参数
     // 如果有参数则直接跳转到流程和报表的界面。
-    if (tabButton.routerRedirect == undefined || tabButton.routerRedirect == false) {
-      titleModal.value = true;      
-      if(tabButton.tipsTitle == undefined || tabButton.tipsTitle.length == 0){
+    if (
+      tabButton.routerRedirect == undefined ||
+      tabButton.routerRedirect == false
+    ) {
+      titleModal.value = true;
+      if (tabButton.tipsTitle == undefined || tabButton.tipsTitle.length == 0) {
         executeProcess();
-      }else{
+      } else {
         titleModal.value = true;
       }
     } else {
@@ -671,22 +683,43 @@ const execute = async function (tabButton) {
                   if (recordIds != null && recordIds.length > 0) {
                     recordIds = recordIds.substring(0, recordIds.length - 1);
                   } else {
-                    Notify.error(proxy.$t('lang.Notify.error'), proxy.$t('lang.tabButton.describe3'), true);
+                    Notify.error(
+                      proxy.$t('lang.Notify.error'),
+                      proxy.$t('lang.tabButton.describe3'),
+                      true,
+                    );
                     return;
                   }
-                  htmlWindowUrl = htmlWindowUrl.replace('{RecordIds}', recordIds);
+                  htmlWindowUrl = htmlWindowUrl.replace(
+                    '{RecordIds}',
+                    recordIds,
+                  );
                 } else {
                   var recordId = props.modelData.id;
-                  htmlWindowUrl = htmlWindowUrl.replace('{RecordIds}', recordId);
+                  htmlWindowUrl = htmlWindowUrl.replace(
+                    '{RecordIds}',
+                    recordId,
+                  );
                 }
               } else if (tempResult == '{Token}') {
-                htmlWindowUrl = htmlWindowUrl.replace('{Token}', Common.getToken());
+                htmlWindowUrl = htmlWindowUrl.replace(
+                  '{Token}',
+                  Common.getToken(),
+                );
               } else {
                 if (props.selectedModelDatas.length == 0) {
-                  Notify.error(proxy.$t('lang.Notify.error'), proxy.$t('lang.tabButton.describe3'), true);
+                  Notify.error(
+                    proxy.$t('lang.Notify.error'),
+                    proxy.$t('lang.tabButton.describe3'),
+                    true,
+                  );
                   return;
                 } else if (props.selectedModelDatas.length > 1) {
-                  Notify.error(proxy.$t('lang.Notify.error'), proxy.$t('lang.tabButton.describe2'), true);
+                  Notify.error(
+                    proxy.$t('lang.Notify.error'),
+                    proxy.$t('lang.tabButton.describe2'),
+                    true,
+                  );
                   return;
                 }
                 var tempResult1 = tempResult.replace('{', '').replace('}', '');
@@ -737,9 +770,7 @@ const switchFormRoute = async function (tabButton) {
     routeDate.path = routeDate.path + '/' + uuid;
   }
 
-  const frameUrl = Common.getRedirectUrl(
-    '#' + routeDate.path,
-  );
+  const frameUrl = Common.getRedirectUrl('#' + routeDate.path);
 
   // 供子页面iframe调用,修改modelData,(举例:生单界面修改参数)。
   // window.modelDataChanged = modelDataChanged;
@@ -749,11 +780,27 @@ const switchFormRoute = async function (tabButton) {
   // console.log(modelData1);
   // localStorage.setItem(props.uuid + '#GenerateDocumentTool', modelData1);
 
-  var iWidth = 1280;//弹出窗口的宽度;
+  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');
+  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);
 };
 // 执行流程
@@ -770,7 +817,10 @@ const executeProcess = async function () {
   }
   // props.loading=true;
 
-  ProcessReportResource.runProcessByIds(tabButtonModel.value.processReportNo, ids).then(
+  ProcessReportResource.runProcessByIds(
+    tabButtonModel.value.processReportNo,
+    ids,
+  ).then(
     successData => {
       modal.value = true;
       // _self.loading=false;
@@ -781,15 +831,15 @@ const executeProcess = async function () {
         processReportResult.value.reportResults.length > 0
       ) {
         processReportResult.value.reportResults.forEach(function (item, index) {
-          if(item.reportDefinitionType!=='ExcelReport'){
-            item.previewIndex=1;
-          }else{
-            item.previewIndex=2;
+          if (item.reportDefinitionType !== 'ExcelReport') {
+            item.previewIndex = 1;
+          } else {
+            item.previewIndex = 2;
           }
           if (index == 0) {
-            item.showPreview=true;
+            item.showPreview = true;
           } else {
-            item.showPreview=false;
+            item.showPreview = false;
           }
         });
       }
@@ -803,7 +853,7 @@ const executeProcess = async function () {
   // }
 };
 //关闭表头按钮提示框
-const titleModalClose = async function (){
+const titleModalClose = async function () {
   titleModal.value = false;
 };
 </script>

+ 14 - 0
src/window1/tabGridView/TabGridEdit.vue

@@ -43,6 +43,7 @@
           :window="window" :now-tab="nowTab" :simple-filter-params="searchText"
           :complex-filter-params="complexFilterParams" :uuid="uuid" :show-tab-dto="tab" :model-datas="modelDatas"
           :view-type="'Grid'" :curd-window-function-access="curdWindowFunctionAccess"
+          :select-model-datas="selectModelDatas"
           @create-record-in-window-edit="createRecordInWindowEdit" @delete-records="deleteRecords"
           @refresh-datas="refreshDatas" @judge-is-have-buttons="judgeIsHaveButtons"
         />
@@ -262,6 +263,7 @@ export default {
       dynamicComponent: null,
       dynamicComponentParam: null,
       dynamicComponentOpen: true,
+      selectModelDatas:[],
     };
   },
   computed: {
@@ -1195,6 +1197,8 @@ export default {
     // 刷新数据
     refreshDatas: function (flag) {
       this.queryGridData(flag);
+      // 刷新时传给远程模态框组件的值设为空数组
+      this.selectModelDatas = [];
     },
 
     // 删除选择的数据
@@ -1426,6 +1430,16 @@ export default {
         });
       }
       modelData.select = !currentStatus;
+
+      if (modelData.select === true) {
+        this.selectModelDatas.push(modelData);
+      } else {
+        this.selectModelDatas.forEach((item,index) =>{
+          if(item.id=== modelData.id) {
+            this.selectModelDatas.splice(index,1);
+          }
+        });
+      }
     },
 
     /**

+ 12 - 12
webpack.dev.js

@@ -62,71 +62,71 @@ module.exports = WebpackMerge.merge(baseConfig, {
     
     proxy: {
       '/api': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/static': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/content': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/dashboard': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/assets': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/mock': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/authApi': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/Dictionary': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/Files': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: false,
         changeOrigin: true,
         secure:true,
       },
       '/WebSocket': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: true,
         changeOrigin: true,
       },
       '/TrainVideo': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: true,
         changeOrigin: true,
       },
       '/module': {
-        target: 'http://192.168.1.108:10023/',
+        target: 'http://192.168.1.5:10025/',
         ws: true,
         changeOrigin: true,
         secure:true,