Przeglądaj źródła

[Mod 0000] 局部风机详情页样式优化,根据配置动态设置模态框样式

hongrunxia 16 godzin temu
rodzic
commit
3f6c6d67d4

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "name": "jeecgboot-vue3",
   "version": "6.0.0",
-  "projectVersion": "6.0.1.0",
+  "projectVersion": "6.0.1.1",
   "author": {
     "name": "jeecg",
     "email": "jeecgos@163.com",

+ 6 - 5
src/hooks/setting/index.ts

@@ -47,12 +47,13 @@ const getUrl = () => {
   });
 };
 
+let _remoteSettingPromise: Promise<void> | null = null;
 export async function getRemoteSetting() {
-  // if (!sysOrgCode) {
-  try {
-    await getUrl();
-  } catch (error) {}
-  // }
+  if (_remoteSettingPromise) {
+    return _remoteSettingPromise;
+  }
+  _remoteSettingPromise = getUrl().catch(() => {});
+  return _remoteSettingPromise;
 }
 
 export const useGlobSetting = (): Readonly<GlobConfig> => {

+ 11 - 7
src/layouts/default/header/index.vue

@@ -58,10 +58,14 @@
   <div :class="`${prefixCls}-action`" style="position: fixed; top: 25px; right: 20px; z-index: 999999">
     <div class="right-position">
       <!-- 公司端不显示语音播报功能 weatherBroadcast.vue-->
-      <a-radio-group v-if="hasPermission('show:modalChange')" v-model:value="programModalType" @change="changeModalType" style="display: flex">
-        <a-radio :value="true">2.5D</a-radio>
-        <a-radio :value="false">3D</a-radio>
-      </a-radio-group>
+      <!-- <a-radio-group v-if="hasPermission('show:modalChange')" v-model:value="programModalType" @change="changeModalType" style="display: flex">
+        <a-radio :value="true">快速模式</a-radio>
+        <a-radio :value="false">特效模式</a-radio>
+      </a-radio-group> -->
+      <div v-if="hasPermission('show:modalChange')" @click="changeModalType" style="width: 92px; color: #fff; cursor: pointer">
+        <div v-if="programModalType == true"> <span class="icon">⚡</span>快速模式</div>
+        <div v-if="programModalType == false"> <span class="icon">✨</span>特效模式</div>
+      </div>
       <WeatherBroadcast v-if="sysOrgCode != 'sdmtjtgsd' && isShowQy && portValue != '8062' && hasPermission('show:weather')" />
       <VoiceBroadcast v-if="sysOrgCode != 'sdmtjtgsd' && portValue != '8062'" />
       <AIChat v-if="hasPermission('show:AIChat')" />
@@ -242,9 +246,9 @@
         return window.self === window.top;
       });
 
-      const changeModalType = (e) => {
-        appStore.setModalType(e.target['value']);
-        programModalType.value = e.target['value'];
+      const changeModalType = () => {
+        programModalType.value = !Boolean(programModalType.value);
+        appStore.setModalType(programModalType.value);
         window.location.reload();
       };
 

+ 1 - 1
src/utils/http/axios/index.ts

@@ -350,7 +350,7 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
           // 接口拼接地址
           urlPrefix: urlPrefix,
           //  是否加入时间戳
-          joinTime: true,
+          joinTime: false,
           // 忽略重复请求
           ignoreCancelToken: true,
           // 是否携带token

+ 6 - 1
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -372,7 +372,12 @@
     style="z-index: 999; position: absolute; top: 100px; right: 15px; width: 100%; height: 100%; margin: auto; pointer-events: none"
   >
   </div>
-  <a-modal v-model:visible="modalIsShow" :title="modalTitle" :maskStyle="{ backgroundColor: '#000000aa', backdropFilter: 'blur(3px)' }">
+
+  <a-modal
+    v-model:visible="modalIsShow"
+    :title="modalTitle"
+    :maskStyle="hasPermission('fanLocal:gasAlarmSet') ? { backgroundColor: '#000000aa', backdropFilter: 'blur(3px)' } : {}"
+  >
     <template #footer>
       <div v-if="controlType != 'startFan'">
         <a-button key="back" @click="cancel">返回</a-button>

+ 88 - 174
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -3,29 +3,43 @@
   <div class="scene-box">
     <div class="top-box">
       <div class="top-center row">
-        <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(1)">打开前门</div>
-        <div v-if="hasPermission('btn:control')" class="button-box" @click="playAnimation(2)">关闭前门</div>
-        <div v-if="hasPermission('btn:control') && selectData.ndoorcount == '3'" class="button-box" @click="playAnimation(8)">打开中间门</div>
-        <div v-if="hasPermission('btn:control') && selectData.ndoorcount == '3'" class="button-box" @click="playAnimation(9)">关闭中间门</div>
+        <div v-if="hasPermission('btn:control')" class="button-box" @click="setControl('frontGateOpen_S', '打开前门')">打开前门</div>
+        <div v-if="hasPermission('btn:control')" class="button-box" @click="setControl('frontGateClose_S', '关闭前门')">关闭前门</div>
+        <div v-if="hasPermission('btn:control_stop')" class="button-box" @click="setControl('frontGateStop_S', '暂停前门')">暂停前门</div>
+        <div v-if="hasPermission('btn:control') && selectData.ndoorcount == '3'" class="button-box" @click="setControl('midGateOpen_S', '打开中间门')"
+          >打开中间门
+        </div>
+        <div
+          v-if="hasPermission('btn:control') && selectData.ndoorcount == '3'"
+          class="button-box"
+          @click="setControl('midGateClose_S', '关闭中间门')"
+          >关闭中间门
+        </div>
         <div
           v-if="hasPermission('btn:control') && (selectData.ndoorcount == '2' || selectData.ndoorcount == '3')"
           class="button-box"
-          @click="playAnimation(3)"
+          @click="setControl('rearGateOpen_S', '打开后门')"
           >打开后门
         </div>
         <div
           v-if="hasPermission('btn:control') && (selectData.ndoorcount == '2' || selectData.ndoorcount == '3')"
           class="button-box"
-          @click="playAnimation(4)"
+          @click="setControl('rearGateClose_S', '关闭后门')"
           >关闭后门
         </div>
+        <div
+          v-if="hasPermission('btn:control_stop') && (selectData.ndoorcount == '2' || selectData.ndoorcount == '3')"
+          class="button-box"
+          @click="setControl('rearGateStop_S', '暂停后门')"
+          >暂停后门
+        </div>
         <div
           v-if="
             hasPermission('btn:totalControl') ||
             (selectData['isShowGatesContrl'] == 1 && (selectData.ndoorcount == '2' || selectData.ndoorcount == '3'))
           "
           class="button-box"
-          @click="playAnimation(5)"
+          @click="setControl('sameTimeOpen', '同时打开')"
           >同时打开
         </div>
         <div
@@ -34,19 +48,19 @@
             (selectData['isShowGatesContrl'] == 1 && (selectData.ndoorcount == '2' || selectData.ndoorcount == '3'))
           "
           class="button-box"
-          @click="playAnimation(6)"
+          @click="setControl('sameTimeClose', '同时关闭')"
           >同时关闭
         </div>
         <template v-if="selectData['gateStyle'] && selectData['gateStyle'].includes('fm_fc')">
           <template v-if="selectData['nwindownum'] == 4">
-            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(10)">A窗控制</div>
-            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(11)">B窗控制</div>
-            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(12)">C窗控制</div>
-            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(13)">D窗控制</div>
+            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="setControl('frontSetValue1', 'A窗控制')">A窗控制</div>
+            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="setControl('frontSetValue2', 'B窗控制')">B窗控制</div>
+            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="setControl('rearSetValue1', 'C窗控制')">C窗控制</div>
+            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="setControl('rearSetValue2', 'D窗控制')">D窗控制</div>
           </template>
           <template v-if="selectData['nwindownum'] == 2">
-            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(14)">前窗控制</div>
-            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="playAnimation(15)">后窗控制</div>
+            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="setControl('frontSetValue', '前窗控制')">前窗控制</div>
+            <div v-if="hasPermission('btn:controlWindow')" class="button-box" @click="setControl('rearSetValue', '后窗控制')">后窗控制</div>
           </template>
         </template>
       </div>
@@ -60,7 +74,7 @@
               <a-radio :value="item.value" :disabled="true">{{ item.text }}</a-radio>
             </template>
           </a-radio-group>
-          <div class="button-box" @click="playAnimation(7)">切换模式</div>
+          <div class="button-box" @click="setControlMode()">切换模式</div>
         </div>
         <!-- 控制指令是多个,每个状态需要下发单独的指令 -->
         <div class="vent-flex-m row" v-else-if="selectData.contrlMod == 'codeCtrl' && modelList.length > 0">
@@ -70,7 +84,7 @@
               <a-radio :value="item.value" :disabled="true">{{ item.text }}</a-radio>
             </template>
           </a-radio-group>
-          <div class="button-box" v-for="(item, index) in modelList" @click="playAnimation(7, item.value)" :key="index"> {{ item.text }}</div>
+          <div class="button-box" v-for="(item, index) in modelList" @click="setControlMode(item.value)" :key="index"> {{ item.text }}</div>
         </div>
         <!-- 济南嘉鸿远程、就地、自动控制,自动切换,点位为true就是选中状态 -->
         <div class="vent-flex-m row" v-else-if="selectData.contrlMod == 'jnjhCtrl' && modelList.length > 0">
@@ -78,7 +92,7 @@
           <a-radio v-model:checked="selectData['autoRoManual']" :disabled="true">远程</a-radio>
           <a-radio v-model:checked="selectData['autoRoManual1']" :disabled="true">自动</a-radio>
           <a-radio v-model:checked="selectData['autoRoManual2']" :disabled="true">手动</a-radio>
-          <div class="button-box" @click="playAnimation(7)">模式切换</div>
+          <div class="button-box" @click="setControlMode()">模式切换</div>
         </div>
         <div class="vent-flex-m row" v-else-if="modelList.length > 0">
           <div class="control-title">控制模式:</div>
@@ -87,7 +101,7 @@
               <a-radio :value="item.value" :disabled="true">{{ item.text }}</a-radio>
             </template>
           </a-radio-group>
-          <div class="button-box" v-for="(item, index) in modelList" @click="playAnimation(7, item.value)" :key="index"> {{ item.text }}</div>
+          <div class="button-box" v-for="(item, index) in modelList" @click="setControlMode(item.value)" :key="index"> {{ item.text }}</div>
         </div>
       </div>
       <div v-if="hasPermission('gate:overhaul')" class="run-type row">
@@ -466,47 +480,28 @@
     },
   };
 
-  /** 控制类型枚举 */
-  enum GateControlType {
-    FRONT_GATE_OPEN = 1, // 打开前门
-    FRONT_GATE_CLOSE = 2, // 关闭前门
-    REAR_GATE_OPEN = 3, // 打开后门
-    REAR_GATE_CLOSE = 4, // 关闭后门
-    MID_GATE_OPEN = 8, // 打开中间门
-    MID_GATE_CLOSE = 9, // 关闭中间门
-    GATES_OPEN_TOGETHER = 5, // 同时打开
-    GATES_CLOSE_TOGETHER = 6, // 同时关闭
-    CONTROL_MODE_SWITCH = 7, // 控制模式切换
-    WINDOW_A_CONTROL = 10, // A窗控制
-    WINDOW_B_CONTROL = 11, // B窗控制
-    WINDOW_C_CONTROL = 12, // C窗控制
-    WINDOW_D_CONTROL = 13, // D窗控制
-    FRONT_WINDOW_CONTROL = 14, // 前窗控制
-    REAR_WINDOW_CONTROL = 15, // 后窗控制
-    OVERHAUL_CONTROL = 16, // 检修控制
-    MANUAL_AUTO_MODE_SWITCH = 17, // 手自控制模式切换
-  }
+  /** 封装通用的模态框打开方法(setControl 模式:点位code直接传参) */
+  const openGateControlModal = (paramcode: string, title: string) => {
+    modalType.value = paramcode;
+    modalTitle.value = title;
+    modalIsShow.value = true;
 
-  /** 控制类型-标题映射配置 */
-  const GATE_CONTROL_CONFIG_MAP = {
-    [GateControlType.FRONT_GATE_OPEN]: '打开前门',
-    [GateControlType.FRONT_GATE_CLOSE]: '关闭前门',
-    [GateControlType.REAR_GATE_OPEN]: '打开后门',
-    [GateControlType.REAR_GATE_CLOSE]: '关闭后门',
-    [GateControlType.MID_GATE_OPEN]: '打开中间门',
-    [GateControlType.MID_GATE_CLOSE]: '关闭中间门',
-    [GateControlType.GATES_OPEN_TOGETHER]: '同时打开',
-    [GateControlType.GATES_CLOSE_TOGETHER]: '同时关闭',
-    [GateControlType.CONTROL_MODE_SWITCH]: '控制模式切换',
-    [GateControlType.WINDOW_A_CONTROL]: 'A窗控制',
-    [GateControlType.WINDOW_B_CONTROL]: 'B窗控制',
-    [GateControlType.WINDOW_C_CONTROL]: 'C窗控制',
-    [GateControlType.WINDOW_D_CONTROL]: 'D窗控制',
-    [GateControlType.FRONT_WINDOW_CONTROL]: '前窗控制',
-    [GateControlType.REAR_WINDOW_CONTROL]: '后窗控制',
-    [GateControlType.OVERHAUL_CONTROL]: '检修控制',
-    [GateControlType.MANUAL_AUTO_MODE_SWITCH]: '手动/自动模式切换',
-  } as const;
+    // 模拟密码模式下直接执行操作
+    if (globalConfig?.simulatedPassword) {
+      handleOK('', paramcode);
+    }
+  };
+
+  /** 统一控制入口:点位code + 标题 直接传参(与 windowMonitor 的 setControl 模式一致) */
+  const setControl = (paramcode: string, title: string) => {
+    openGateControlModal(paramcode, title);
+  };
+
+  /** 控制模式切换(paramcode 需根据 contrlMod + contrlValue 动态决定) */
+  const setControlMode = (value?: string) => {
+    contrlValue = value;
+    openGateControlModal('modeSwitch', '控制模式切换');
+  };
 
   const [registerModal, { openModal, closeModal }] = useModal();
 
@@ -684,145 +679,63 @@
     await getCamera(selectRow.deviceID, playerRef, renderPlayer);
   }
 
-  /** 封装通用的模态框打开方法 */
-  const openGateControlModal = (
-    controlType: GateControlType | number,
-    customTitle?: string // 自定义标题(可选)
-  ) => {
-    // 优先使用自定义标题,无则从配置读取
-    let finalTitle = customTitle;
-    if (!finalTitle) {
-      const configItem = GATE_CONTROL_CONFIG_MAP[controlType as keyof typeof GATE_CONTROL_CONFIG_MAP];
-      if (configItem) {
-        finalTitle = configItem;
-      } else {
-        message.warning(`未配置控制类型【${controlType}】的标题`);
-        return;
-      }
-    }
-
-    // 统一赋值逻辑
-    modalType.value = String(controlType);
-    modalTitle.value = finalTitle;
-    modalIsShow.value = true;
-
-    // 如果有模拟密码,则直接执行操作
-    if (globalConfig?.simulatedPassword) {
-      handleOK('', String(controlType));
-    }
-  };
-  // 播放动画
-  function playAnimation(handlerState: GateControlType | number, data: any = null) {
-    const value = data;
-    contrlValue = value;
-
-    // 使用封装的方法打开模态框
-    openGateControlModal(handlerState);
-  }
-
+  /** 检修切换 */
   const changeOverhaul = (e) => {
-    openGateControlModal(GateControlType.OVERHAUL_CONTROL);
+    // 检修值需要在打开模态框前设置(handleOK 中按 toggle 逻辑计算下发值)
+    openGateControlModal('overhaul', '检修控制');
     contrlValue = e;
   };
 
+  /** 统一下发控制指令(仿 windowMonitor 模式:handlerState 即点位code,特殊情况单独判断) */
   function handleOK(passWord, handlerState, value?) {
     if (!passWord && !globalConfig?.simulatedPassword) {
       message.warning('请输入密码');
       return;
     }
+
     const data = {
       deviceid: selectData.deviceID,
       devicetype: selectData.deviceType,
       paramcode: '',
-      value: contrlValue,
+      value: value ?? null,
       password: passWord || globalConfig?.simulatedPassword,
       masterComputer: selectData.masterComputer,
     };
-    let handler = () => {};
 
-    switch (handlerState) {
-      case '1': // 打开前门
-        data.paramcode = 'frontGateOpen_S';
-        break;
-      case '2': // 关闭前门
-        data.paramcode = 'frontGateClose_S';
-        break;
-      case '3': // 打开后门
-        data.paramcode = 'rearGateOpen_S';
-        break;
-      case '4': // 关闭后门
-        data.paramcode = 'rearGateClose_S';
-        break;
-      case '8': // 打开中间门
-        data.paramcode = 'midGateOpen_S';
-        break;
-      case '9': // 关闭中间门
-        data.paramcode = 'midGateClose_S';
-        break;
-      case '5': // 打开前后门
-        data.paramcode = 'sameTimeOpen';
-        break;
-      case '6': // 关闭前后门
-        data.paramcode = 'sameTimeClose';
-        break;
-      case '7': // 远程与就地
-        if (selectData.contrlMod == 'codeCtrl') {
-          if (contrlValue == '1') {
-            data.paramcode = 'autoRoManualControl1';
-          } else if (contrlValue == '0') {
-            data.paramcode = 'autoRoManualControl2';
-          } else {
-            data.paramcode = 'autoRoManualControl0';
-          }
-          data.value = '';
-          selectData.autoRoManual = null;
-        } else if (selectData.contrlMod == 'loopCtrl' || selectData.contrlMod == 'jnjhCtrl') {
-          data.paramcode = 'autoRoManualControl';
-          data.value = '';
-          selectData.autoRoManual = null;
+    // 特殊:控制模式切换(paramcode 根据 contrlMod + contrlValue 动态决定)
+    if (handlerState === 'modeSwitch') {
+      if (selectData.contrlMod == 'codeCtrl') {
+        if (contrlValue == '1') {
+          data.paramcode = 'autoRoManualControl1';
+        } else if (contrlValue == '0') {
+          data.paramcode = 'autoRoManualControl2';
         } else {
-          data.paramcode = 'autoRoManualControl';
-          data.value = contrlValue;
-          selectData.autoRoManual = null;
+          data.paramcode = 'autoRoManualControl0';
         }
-        break;
-      case '10': // 前(A)窗控制
-        data.paramcode = 'frontSetValue1';
-        data.value = value;
-        break;
-      case '11': // 后(B)窗控制
-        data.paramcode = 'frontSetValue2';
-        data.value = value;
-        break;
-      case '12': // 后(B)窗控制
-        data.paramcode = 'rearSetValue1';
-        data.value = value;
-        break;
-      case '13': // 后(B)窗控制
-        data.paramcode = 'rearSetValue2';
-        data.value = value;
-        break;
-      case '14': // 后(B)窗控制
-        data.paramcode = 'frontSetValue';
-        data.value = value;
-        break;
-      case '15': // 后(B)窗控制
-        data.paramcode = 'rearSetValue';
-        data.value = value;
-        break;
-      case '16': // 检修控制
-        data.paramcode = 'runRoRecondition_S';
-        data.value = selectData['runRoRecondition'] == 0 ? '1' : '0';
-        break;
-      case '17': // 手动自动模式切换
-        data.paramcode = 'manualAutoMode_w';
-        break;
+        data.value = '';
+      } else if (selectData.contrlMod == 'loopCtrl' || selectData.contrlMod == 'jnjhCtrl') {
+        data.paramcode = 'autoRoManualControl';
+        data.value = '';
+      } else {
+        data.paramcode = 'autoRoManualControl';
+        data.value = contrlValue;
+      }
+      selectData.autoRoManual = null;
+    }
+    // 特殊:检修控制(value 取反 toggle)
+    else if (handlerState === 'overhaul') {
+      data.paramcode = 'runRoRecondition_S';
+      data.value = selectData['runRoRecondition'] == 0 ? '1' : '0';
+    }
+    // 默认:handlerState 即点位code(setControl 直接传参)
+    else {
+      data.paramcode = handlerState;
+      data.value = value ?? contrlValue;
     }
 
     if (data.paramcode) {
       deviceControlApi(data)
         .then((res) => {
-          // 模拟时开启
           if (res.success) {
             modalIsShow.value = false;
             if (globalConfig.History_Type == 'remote') {
@@ -972,7 +885,8 @@
   }
 
   const handleSwitchChange = (checked: boolean) => {
-    playAnimation(17, checked);
+    contrlValue = checked;
+    setControl('manualAutoMode_w', '手动/自动模式切换');
   };
 
   onMounted(async () => {

+ 6 - 1
src/views/vent/monitorManager/gateMonitor/modal.vue

@@ -5,7 +5,7 @@
         <ExclamationCircleFilled style="color: #ffb700; font-size: 30px" />
         <div class="warning-text">您是否要进行{{ title }}操作?</div>
       </div>
-      <div v-if="type == '10' || type == '11' || type == '12' || type == '13' || type == '14' || type == '15'">
+      <div v-if="isWindowControlType(type)">
         <div class="vent-flex-row input-box">
           <div class="label">风窗开启角度:</div>
           <a-input-number size="small" placeholder="0" :min="0" v-model:value="value" />
@@ -45,6 +45,11 @@
 
   const emit = defineEmits(['handleOk', 'handleCancel']);
 
+  /** 风窗控制类型(需要输入角度值的点位code) */
+  const WINDOW_CONTROL_CODES = ['frontSetValue1', 'frontSetValue2', 'rearSetValue1', 'rearSetValue2', 'frontSetValue', 'rearSetValue'];
+
+  const isWindowControlType = (type: string) => WINDOW_CONTROL_CODES.includes(type);
+
   const visible = ref<Boolean>(false);
   const title = ref<String>('');
   const type = ref<String>('');

+ 0 - 12
vite.config.ts

@@ -69,18 +69,6 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
       // Load proxy configuration from .env
       proxy: {
         ...createProxy(VITE_PROXY),
-        '/res': {
-          target: 'http://182.92.126.35:9999/',
-          ws: true,
-          changeOrigin: true,
-          rewrite: (path) => path.replace(/^\/res/, ''),
-          configure: (proxy, options) => {
-            // 可以在这里对代理进行额外的配置
-            proxy.on('proxyReq', (proxyReq, req, res) => {
-              proxyReq.setHeader('Content-Type', 'application/force-download');
-            });
-          },
-        },
       },
     },
     build: {