Procházet zdrojové kódy

增加站点切换

zuy před 2 roky
rodič
revize
07e409a8dd

+ 114 - 55
admin-web/src/layout/navBars/breadcrumb/toolbar.vue

@@ -1,73 +1,97 @@
 <template>
   <div class="layout-navbars-breadcrumb-user pr15" :style="{ flex: layoutUserFlexNum }">
-    <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onComponentSizeChange">
+
+    <!--    站点切换-->
+    <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="handleStationChange">
       <div class="layout-navbars-breadcrumb-user-icon">
-<!--        <i class="iconfont icon-ziti" :title="$t('message.user.title0')"></i>-->
-        <el-icon class="el-icon--right"><ele-Switch /></el-icon>
+        <!--        <i class="iconfont icon-ziti" :title="$t('message.user.title0')"></i>-->
+        <SvgIcon name="ele-Location"></SvgIcon>
+        <span style="color:var(--el-text-color-primary)">{{ state.currentStation.stationName }} </span>
+        <!--        <el-icon class="el-icon&#45;&#45;right"><ele-Location />    </el-icon>-->
       </div>
       <template #dropdown>
         <el-dropdown-menu>
-          <el-dropdown-item command="large" :disabled="state.disabledSize === 'large'">{{ $t('message.user.dropdownLarge') }}</el-dropdown-item>
-          <el-dropdown-item command="default" :disabled="state.disabledSize === 'default'">{{ $t('message.user.dropdownDefault') }}</el-dropdown-item>
-          <el-dropdown-item command="small" :disabled="state.disabledSize === 'small'">{{ $t('message.user.dropdownSmall') }}</el-dropdown-item>
+          <el-dropdown-item v-for="station in state.stationList" :key="station.stationId" :command="station.stationId" :disabled="state.currentStation.stationId == station.stationId">{{ station.stationName }}</el-dropdown-item>
         </el-dropdown-menu>
       </template>
     </el-dropdown>
 
-<!--    <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange">
+
+    <!--    字体大小-->
+    <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onComponentSizeChange">
       <div class="layout-navbars-breadcrumb-user-icon">
-        <i
-            class="iconfont"
-            :class="state.disabledI18n === 'en' ? 'icon-fuhao-yingwen' : 'icon-fuhao-zhongwen'"
-            :title="$t('message.user.title1')"
-        ></i>
+        <!--        <i class="iconfont icon-ziti" :title="$t('message.user.title0')"></i>-->
+        <el-icon class="el-icon--right">
+          <ele-Switch/>
+        </el-icon>
       </div>
       <template #dropdown>
         <el-dropdown-menu>
-          <el-dropdown-item command="zh-cn" :disabled="state.disabledI18n === 'zh-cn'">简体中文</el-dropdown-item>
-          <el-dropdown-item command="en" :disabled="state.disabledI18n === 'en'">English</el-dropdown-item>
-          <el-dropdown-item command="zh-tw" :disabled="state.disabledI18n === 'zh-tw'">繁體中文</el-dropdown-item>
+          <el-dropdown-item command="large" :disabled="state.disabledSize === 'large'">{{ $t('message.user.dropdownLarge') }}</el-dropdown-item>
+          <el-dropdown-item command="default" :disabled="state.disabledSize === 'default'">{{ $t('message.user.dropdownDefault') }}</el-dropdown-item>
+          <el-dropdown-item command="small" :disabled="state.disabledSize === 'small'">{{ $t('message.user.dropdownSmall') }}</el-dropdown-item>
         </el-dropdown-menu>
       </template>
-    </el-dropdown>-->
+    </el-dropdown>
 
-<!--    <div class="layout-navbars-breadcrumb-user-icon" @click="onSearchClick">
-      <el-icon :title="$t('message.user.title2')">
-        <ele-Search/>
-      </el-icon>
-    </div>-->
+    <!--    <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange">
+          <div class="layout-navbars-breadcrumb-user-icon">
+            <i
+                class="iconfont"
+                :class="state.disabledI18n === 'en' ? 'icon-fuhao-yingwen' : 'icon-fuhao-zhongwen'"
+                :title="$t('message.user.title1')"
+            ></i>
+          </div>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item command="zh-cn" :disabled="state.disabledI18n === 'zh-cn'">简体中文</el-dropdown-item>
+              <el-dropdown-item command="en" :disabled="state.disabledI18n === 'en'">English</el-dropdown-item>
+              <el-dropdown-item command="zh-tw" :disabled="state.disabledI18n === 'zh-tw'">繁體中文</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>-->
+
+    <!--    <div class="layout-navbars-breadcrumb-user-icon" @click="onSearchClick">
+          <el-icon :title="$t('message.user.title2')">
+            <ele-Search/>
+          </el-icon>
+        </div>-->
 
     <template v-if="admin">
       <div class="layout-navbars-breadcrumb-user-icon" @click="onLayoutSetingClick">
-        <el-icon class="el-icon--right"><ele-Tools /></el-icon>
+        <el-icon class="el-icon--right">
+          <ele-Tools/>
+        </el-icon>
       </div>
     </template>
 
-<!--
+    <!--
 
-    <div class="layout-navbars-breadcrumb-user-icon">
-      <el-popover placement="bottom" trigger="click" transition="el-zoom-in-top" :width="300" :persistent="false">
-        <template #reference>
-          <el-badge :is-dot="true">
-            <el-icon :title="$t('message.user.title4')">
-              <ele-Bell/>
-            </el-icon>
-          </el-badge>
-        </template>
-        <template #default>
-          <Notification/>
-        </template>
-      </el-popover>
-    </div>
--->
+        <div class="layout-navbars-breadcrumb-user-icon">
+          <el-popover placement="bottom" trigger="click" transition="el-zoom-in-top" :width="300" :persistent="false">
+            <template #reference>
+              <el-badge :is-dot="true">
+                <el-icon :title="$t('message.user.title4')">
+                  <ele-Bell/>
+                </el-icon>
+              </el-badge>
+            </template>
+            <template #default>
+              <Notification/>
+            </template>
+          </el-popover>
+        </div>
+    -->
 
     <div class="layout-navbars-breadcrumb-user-icon mr10" @click="onScreenfullClick">
-      <el-icon class="el-icon--right"><ele-FullScreen /></el-icon>
-<!--      <i
-          class="iconfont"
-          :title="state.isScreenfull ? $t('message.user.title6') : $t('message.user.title5')"
-          :class="!state.isScreenfull ? 'icon-fullscreen' : 'icon-tuichuquanping'"
-      ></i>-->
+      <el-icon class="el-icon--right">
+        <ele-FullScreen/>
+      </el-icon>
+      <!--      <i
+                class="iconfont"
+                :title="state.isScreenfull ? $t('message.user.title6') : $t('message.user.title5')"
+                :class="!state.isScreenfull ? 'icon-fullscreen' : 'icon-tuichuquanping'"
+            ></i>-->
     </div>
 
     <el-dropdown :show-timeout="70" :hide-timeout="50" @command="onHandleCommandClick">
@@ -82,16 +106,16 @@
 			</span>
       <template #dropdown>
         <el-dropdown-menu>
-<!--          <el-dropdown-item>
-            <RouterLink target="_blank" to="/admin?oid=">
-              <el-link type="primary">管理设置</el-link>
-            </RouterLink>
-          </el-dropdown-item>-->
+          <!--          <el-dropdown-item>
+                      <RouterLink target="_blank" to="/admin?oid=">
+                        <el-link type="primary">管理设置</el-link>
+                      </RouterLink>
+                    </el-dropdown-item>-->
           <!--					<el-dropdown-item command="/admin/home">{{ $t('message.user.dropdown1') }}</el-dropdown-item>-->
           <!--					<el-dropdown-item command="wareHouse">{{ $t('message.user.dropdown6') }}</el-dropdown-item>-->
-<!--          <el-dropdown-item command="/personal">{{ $t('message.user.dropdown2') }}</el-dropdown-item>
-          <el-dropdown-item command="/404">{{ $t('message.user.dropdown3') }}</el-dropdown-item>
-          <el-dropdown-item command="/401">{{ $t('message.user.dropdown4') }}</el-dropdown-item>-->
+          <!--          <el-dropdown-item command="/personal">{{ $t('message.user.dropdown2') }}</el-dropdown-item>
+                    <el-dropdown-item command="/404">{{ $t('message.user.dropdown3') }}</el-dropdown-item>
+                    <el-dropdown-item command="/401">{{ $t('message.user.dropdown4') }}</el-dropdown-item>-->
           <el-dropdown-item divided command="logOut">
             <el-icon color="#409EFC">
               <ele-SwitchButton/>
@@ -118,6 +142,7 @@ import other from '/@/utils/other';
 import mittBus from '/@/utils/mitt';
 import {Session, Local} from '/@/utils/storage';
 import u from "/@/utils/u";
+import {$get} from "/@/utils/request";
 
 // 引入组件
 const Notification = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/notification.vue'));
@@ -143,16 +168,18 @@ const state = reactive({
   isScreenfull: false,
   disabledI18n: 'zh-cn',
   disabledSize: 'large',
+  stationList: [],
+  currentStation: {}
 });
 
-const onSwitchTheme = ()=>{
+const onSwitchTheme = () => {
   let dark = themeConfig.value.isIsDark;
   const body = document.documentElement as HTMLElement;
   if (!dark) body.setAttribute('data-theme', 'dark');
   else body.setAttribute('data-theme', '');
   themeConfig.value.isIsDark = !dark;
-  storesThemeConfig.setThemeConfig({ themeConfig: themeConfig.value});
-  Local.set('themeConfig',themeConfig.value)
+  storesThemeConfig.setThemeConfig({themeConfig: themeConfig.value});
+  Local.set('themeConfig', themeConfig.value)
 }
 
 const userInfos = computed(() => {
@@ -234,6 +261,20 @@ const onHandleCommandClick = (path: string) => {
 const onSearchClick = () => {
   searchRef.value.openSearch();
 };
+
+//站点切换
+const handleStationChange = (stationId: string) => {
+  console.log(stationId)
+
+  let station = state.stationList.find((k: any) => k.stationId === stationId)
+  if (station) {
+    state.currentStation = station;
+    Session.set("currentStationId",stationId)
+    mittBus.emit('stationChangeRefresh', stationId);
+  }
+}
+
+
 // 组件大小改变
 const onComponentSizeChange = (size: string) => {
   Local.remove('themeConfig');
@@ -261,7 +302,25 @@ onMounted(() => {
     initI18nOrSize('globalComponentSize', 'disabledSize');
     initI18nOrSize('globalI18n', 'disabledI18n');
   }
+
+  loadStationList();
 });
+
+const loadStationList = () => {
+  $get(`/station/listStation`, {pageNum: 1024}).then((res: any) => {
+    state.stationList = res;
+    if (res && res.length > 0) {
+      state.currentStation = res[0];
+      setTimeout(()=>{
+        mittBus.emit('stationChangeRefresh', res[0].stationId);
+        Session.set("currentStationId",res[0].stationId)
+      },200)
+
+    }
+  }).catch(e => {
+    console.error(e)
+  })
+}
 </script>
 
 <style scoped lang="scss">

+ 1 - 0
admin-web/src/types/mitt.d.ts

@@ -24,6 +24,7 @@ declare type MittType<T = any> = {
 	onTagsViewRefreshRouterView?: T;
 	onCurrentContextmenuClick?: T;
 	scheduleTemplateRefresh?: String;
+	stationChangeRefresh?: String;
 };
 
 // mitt 参数类型定义

+ 19 - 3
admin-web/src/views/admin/index.vue

@@ -75,6 +75,8 @@ import {useThemeConfig} from '/@/stores/themeConfig';
 import {useTagsViewRoutes} from '/@/stores/tagsViewRoutes';
 import {$get} from "/@/utils/request";
 import u from "/@/utils/u";
+import mittBus from "/@/utils/mitt";
+import {Session} from "/@/utils/storage";
 
 // 定义变量内容
 const homeLineRef = ref();
@@ -95,6 +97,7 @@ const defaultTime = ref<[Date, Date]>([
 ])
 
 const state = reactive({
+  currentStationId:null,
   dateRange: [u.date.format(start, "YYYY-MM-DD"), u.date.format(end, "YYYY-MM-DD")],
   global: {
     homeChartOne: null,
@@ -422,7 +425,7 @@ const initEchartsResize = () => {
 };
 
 const loadCurrentEquipmentStatus = () => {
-  $get(`equipment/statEquipmentStatus`).then((res: any) => {
+  $get(`equipment/statEquipmentStatus`,{stationId:state.currentStationId}).then((res: any) => {
     console.log(res)
     initPieChart(res || {});
   })
@@ -433,7 +436,7 @@ const loadStationStat = () => {
   let start = state.dateRange[0]
   let end = state.dateRange[1]
   let size = u.date.diff(new Date(start), new Date(end)) + 1;
-  $get(`stat/stationStat`, {startTime: start, endTime: end, type: 'day', pageSize: size}).then((res: any) => {
+  $get(`stat/stationStat`, {startTime: start, endTime: end, type: 'day', pageSize: size,stationId:state.currentStationId}).then((res: any) => {
     console.log(res)
     state.homeOneExtra = res.extraData
     initLineChart(res.list);
@@ -441,7 +444,7 @@ const loadStationStat = () => {
 }
 
 const loadStationStatToday = () => {
-  $get(`stat/stationTodayStat`).then((res: any) => {
+  $get(`stat/stationTodayStat`,{stationId:state.currentStationId}).then((res: any) => {
     console.log(res)
     if (!u.isEmptyOrNull(res)) {
       let {chargeUsers, totalOrders, totalPower, totalMoney, elecMoney, serviceMoney} = res
@@ -457,6 +460,10 @@ const loadStationStatToday = () => {
 }
 // 页面加载时
 onMounted(() => {
+  var currentStationId = Session.get("currentStationId");
+  if(currentStationId){
+    state.currentStationId = currentStationId;
+  }
   console.error("home onMounted")
   NProgress.done();
   initEchartsResize();
@@ -467,6 +474,15 @@ onMounted(() => {
 
   //加载充电桩状态
   loadCurrentEquipmentStatus();
+
+  mittBus.on('stationChangeRefresh', (stationId) => {
+    if(stationId){
+      state.currentStationId = stationId;
+      loadStationStat()
+      loadStationStatToday()
+      loadCurrentEquipmentStatus()
+    }
+  });
 });
 // 由于页面缓存原因,keep-alive
 onActivated(() => {

+ 2 - 2
admin/src/main/java/com/kym/admin/controller/EquipmentInfoController.java

@@ -43,8 +43,8 @@ public class EquipmentInfoController {
      * @return
      */
     @GetMapping("/statEquipmentStatus")
-    R statEquipment() {
-        return R.success(equipmentInfoService.statEquipmentStatus());
+    R statEquipment(String stationId) {
+        return R.success(equipmentInfoService.statEquipmentStatus(stationId));
     }
 
 }

+ 2 - 2
admin/src/main/java/com/kym/admin/controller/StatController.java

@@ -41,8 +41,8 @@ public class StatController {
      * @return
      */
     @GetMapping("/stationTodayStat")
-    R stationTodayStat() {
-        var res = chargeOrderService.stationTodayStat();
+    R stationTodayStat(String stationId) {
+        var res = chargeOrderService.stationTodayStat(stationId);
         return R.success(res);
     }
 }

+ 1 - 1
service/src/main/java/com/kym/service/admin/EquipmentInfoService.java

@@ -19,5 +19,5 @@ public interface EquipmentInfoService extends IService<EquipmentInfo> {
 
     PageBean<EquipmentInfo> listEquipment(EquipmentQueryParam params);
 
-    Map<Integer, Long> statEquipmentStatus();
+    Map<Integer, Long> statEquipmentStatus(String stationId);
 }

+ 6 - 3
service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
+import com.kym.common.utils.CommUtil;
 import com.kym.entity.admin.EquipmentInfo;
 import com.kym.entity.admin.queryParams.EquipmentQueryParam;
 import com.kym.entity.common.PageBean;
@@ -61,9 +62,11 @@ public class EquipmentInfoServiceImpl extends ServiceImpl<EquipmentInfoMapper, E
     }
 
     @Override
-    public Map<Integer, Long> statEquipmentStatus() {
-        // 判断数据权限
-        var stationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+    public Map<Integer, Long> statEquipmentStatus(String stationId) {
+        if (CommUtil.null2Long(stationId) <= 0) {
+            // 判断数据权限
+            stationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        }
         // 获取指定站点下的充电桩
         var equipmentInfos = lambdaQuery().eq(isNotNull(stationId), EquipmentInfo::getStationId, stationId).list();
         // 根据状态进行分组

+ 1 - 1
service/src/main/java/com/kym/service/miniapp/ChargeOrderService.java

@@ -33,7 +33,7 @@ public interface ChargeOrderService extends IService<ChargeOrder> {
 
     PageBean<StationStatVo> stationStat(StatQueryParam params);
 
-    Map<String, Object> stationTodayStat();
+    Map<String, Object> stationTodayStat(String  stationId);
 
     List<ChargeOrder> getChargeOrdersBySeqs(String[] startChargeSeqs);
 }

+ 8 - 3
service/src/main/java/com/kym/service/miniapp/impl/ChargeOrderServiceImpl.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
+import com.kym.common.utils.CommUtil;
 import com.kym.entity.admin.queryParams.CustomChargeOrdersQueryParam;
 import com.kym.entity.admin.queryParams.StatQueryParam;
 import com.kym.entity.admin.vo.CustomOrderVo;
@@ -22,6 +23,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+
 /**
  * <p>
  * 充电订单表 服务实现类
@@ -120,9 +122,12 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
      * @return
      */
     @Override
-    public Map<String, Object> stationTodayStat() {
-        // 判断数据权限
-        var stationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+    public Map<String, Object> stationTodayStat(String stationId) {
+        if (CommUtil.null2Long(stationId) <= 0) {
+            // 判断数据权限
+            stationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        }
+
         return baseMapper.stationTodayStat(stationId);
     }