shinnosuke
2026-07-14 536ccba67784671f743709f7be093ca2475e806d
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -26,11 +26,13 @@
import com.ruoyi.chargingPile.service.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.log.enums.OperatorType;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.service.TokenService;
@@ -111,7 +113,15 @@
   private AppUserClient appUserClient;
   @Resource
   private AppUserVipDetailClient vipDetailClient;
   // 远程新增临时站点
   @ResponseBody
   @PostMapping("/addSiteTemp")
   @ApiOperation(value = "添加站点", tags = {"管理后台-站点管理"})
   @Log(title = "【站点管理】添加站点", businessType = BusinessType.INSERT)
   public R addSiteTemp(@RequestBody Site site){
      siteService.save(site);
      return R.ok(site.getId());
   }
   /**
    * 根据站点id 查询所有充电桩
    * @param siteId
@@ -127,14 +137,19 @@
    * @param number
    * @return
    */
   @Log(title = "【扫一扫】通过桩编号获取电站信息", businessType = BusinessType.OTHER,operatorType = OperatorType.MOBILE)
   @GetMapping("/getSiteInfoByNumber")
   @ApiOperation(value = "扫一扫后通过桩编号获取电站信息", tags = {"小程序-扫一扫"})
   public R<SiteInfoVO> getSiteInfoByNumber(@RequestParam("number") String number){
      SiteInfoVO siteInfoVO = new SiteInfoVO();
      TChargingGun chargingGun = chargingGunService.getOne(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getFullNumber, number));
      Site site = siteService.getById(chargingGun.getSiteId());
      Integer accountingStrategyId = chargingGun.getAccountingStrategyId();
      if(null == accountingStrategyId){
         accountingStrategyId = site.getAccountingStrategyId();
      }
      TChargingPile one = chargingPileService.getById(chargingGun.getChargingPileId());
      Site byId = siteService.getById(chargingGun.getSiteId());
      TAccountingStrategy byId1 = accountingStrategyService.getById(chargingGun.getAccountingStrategyId());
      TAccountingStrategy byId1 = accountingStrategyService.getById(accountingStrategyId);
      List<TAccountingStrategyDetail> list = accountingStrategyDetailService.lambdaQuery().eq(TAccountingStrategyDetail::getAccountingStrategyId, byId1.getId()).list();
      list.stream().filter(item -> "00:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59"));
      for (TAccountingStrategyDetail tAccountingStrategyDetail : list) {
@@ -143,36 +158,45 @@
               && DateUtils.string2LocalTime(tAccountingStrategyDetail.getEndTime() + ("23:59:59".equals(tAccountingStrategyDetail.getEndTime())?"":":00")).compareTo(LocalTime.now()) > 0){
            siteInfoVO.setElectrovalence(tAccountingStrategyDetail.getElectrovalence().add(tAccountingStrategyDetail.getServiceCharge()).setScale(4, BigDecimal.ROUND_HALF_UP));
            // 获取当前登录用户id
            Long userId = tokenService.getLoginUserApplet().getUserId();
            // 根据id查询用户信息
            TAppUser appUser = appUserClient.getUserById(userId).getData();
            if(Objects.nonNull(byId1.getDiscount())){
               siteInfoVO.setVipElectrovalence((tAccountingStrategyDetail.getServiceCharge().multiply(byId1.getDiscount()).add(tAccountingStrategyDetail.getElectrovalence())).setScale(4, BigDecimal.ROUND_HALF_UP));
            }else {
               siteInfoVO.setVipElectrovalence((tAccountingStrategyDetail.getServiceCharge().add(tAccountingStrategyDetail.getElectrovalence())).setScale(4, BigDecimal.ROUND_HALF_UP));
            }
            if(Objects.nonNull(appUser)){
            String token = SecurityUtils.getToken(ServletUtils.getRequest());
            if(StringUtils.isNotEmpty(token)){
               Long userId = tokenService.getLoginUserApplet().getUserId();
               // 根据id查询用户信息
               TAppUser appUser = appUserClient.getUserById(userId).getData();
               if(Objects.nonNull(byId1.getDiscount())){
                  siteInfoVO.setVipElectrovalence((tAccountingStrategyDetail.getServiceCharge().multiply(byId1.getDiscount()).add(tAccountingStrategyDetail.getElectrovalence())).setScale(4, BigDecimal.ROUND_HALF_UP));
               }else {
                  siteInfoVO.setVipElectrovalence((tAccountingStrategyDetail.getServiceCharge().add(tAccountingStrategyDetail.getElectrovalence())).setScale(4, BigDecimal.ROUND_HALF_UP));
               }
               TVip vip = null;
               if(Objects.nonNull(appUser)){
//               TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
               GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
               getAppUserVipDetail.setAppUserId(userId);
               getAppUserVipDetail.setVipId(appUser.getVipId());
               R<TAppUserVipDetail> appUserVipDetail = vipDetailClient.getAppUserVipDetail(getAppUserVipDetail);
               TAppUserVipDetail data1 = appUserVipDetail.getData();
               if(Objects.nonNull(data1)){
                  String vipJson = data1.getVipJson();
                  TVip vip = JSON.parseObject(vipJson, TVip.class);
                  if(Objects.nonNull(vip) && vip.getType() == 2){
                     siteInfoVO.setVipElectrovalence(vip.getDiscount().divide(new BigDecimal(10)).multiply(tAccountingStrategyDetail.getServiceCharge()).add(tAccountingStrategyDetail.getElectrovalence()));
                  GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
                  getAppUserVipDetail.setAppUserId(userId);
                  getAppUserVipDetail.setVipId(appUser.getVipId());
                  R<TAppUserVipDetail> appUserVipDetail = vipDetailClient.getAppUserVipDetail(getAppUserVipDetail);
                  TAppUserVipDetail data1 = appUserVipDetail.getData();
                  if(Objects.nonNull(data1)){
                     String vipJson = data1.getVipJson();
                     vip = JSON.parseObject(vipJson, TVip.class);
                  }
               }
               if(Objects.nonNull(vip) && vip.getType() == 2){
                  siteInfoVO.setVipElectrovalence(vip.getDiscount().divide(new BigDecimal(10)).multiply(tAccountingStrategyDetail.getServiceCharge()).add(tAccountingStrategyDetail.getElectrovalence()));
               }
            }
         }
      }
      siteInfoVO.setChargingGunId(chargingGun.getId());
      siteInfoVO.setChargingPileId(one.getId());
      siteInfoVO.setName(byId.getName());
      siteInfoVO.setName(site.getName());
      siteInfoVO.setNumber(one.getNumber().toString());
      siteInfoVO.setSpaceChargeExplain(byId.getSpaceChargeExplain());
      siteInfoVO.setSpaceChargeExplain(site.getSpaceChargeExplain());
      siteInfoVO.setSupportOrder(site.getSupportOrder());
      siteInfoVO.setReservationStartTime(site.getReservationStartTime());
      siteInfoVO.setReservationEndTime(site.getReservationEndTime());
      siteInfoVO.setVinFlag(one.getVinFlag());
      return R.ok(siteInfoVO);
   }
   /**
@@ -184,8 +208,13 @@
   public R<SiteInfoVO> getSiteInfoByNumber1(@RequestParam("number") String number){
      SiteInfoVO siteInfoVO = new SiteInfoVO();
      TChargingPile one = chargingPileService.lambdaQuery().eq(TChargingPile::getCode, number).one();
      Site byId = siteService.getById(one.getSiteId());
      TAccountingStrategy byId1 = accountingStrategyService.getById(byId.getAccountingStrategyId());
      TChargingGun chargingGun = chargingGunService.getOne(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, one.getId()).last(" limit 0, 1"));
      Site site = siteService.getById(chargingGun.getSiteId());
      Integer accountingStrategyId = chargingGun.getAccountingStrategyId();
      if(null == accountingStrategyId){
         accountingStrategyId = site.getAccountingStrategyId();
      }
      TAccountingStrategy byId1 = accountingStrategyService.getById(accountingStrategyId);
      List<TAccountingStrategyDetail> list = accountingStrategyDetailService.lambdaQuery().eq(TAccountingStrategyDetail::getAccountingStrategyId, byId1.getId()).list();
      list.stream().filter(item -> "00:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59"));
      for (TAccountingStrategyDetail tAccountingStrategyDetail : list) {
@@ -194,29 +223,34 @@
               && DateUtils.string2LocalTime(tAccountingStrategyDetail.getEndTime() + ("23:59:59".equals(tAccountingStrategyDetail.getEndTime())?"":":00")).compareTo(LocalTime.now()) > 0){
            siteInfoVO.setElectrovalence(tAccountingStrategyDetail.getElectrovalence().add(tAccountingStrategyDetail.getServiceCharge()).setScale(4, BigDecimal.ROUND_HALF_UP));
            // 获取当前登录用户id
            Long userId = tokenService.getLoginUserApplet().getUserId();
            // 根据id查询用户信息
            TAppUser appUser = appUserClient.getUserById(userId).getData();
            String token = SecurityUtils.getToken(ServletUtils.getRequest());
            if(StringUtils.isNotEmpty(token)){
               Long userId = tokenService.getLoginUserApplet().getUserId();
               // 根据id查询用户信息
               TAppUser appUser = appUserClient.getUserById(userId).getData();
               if(Objects.nonNull(appUser)){
//               TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                  GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
                  getAppUserVipDetail.setAppUserId(userId);
                  getAppUserVipDetail.setVipId(appUser.getVipId());
                  R<TAppUserVipDetail> appUserVipDetail = vipDetailClient.getAppUserVipDetail(getAppUserVipDetail);
                  TAppUserVipDetail data1 = appUserVipDetail.getData();
                  if(Objects.nonNull(data1)){
                     String vipJson = data1.getVipJson();
                     TVip vip = JSON.parseObject(vipJson, TVip.class);
                     if(Objects.nonNull(vip) && vip.getType() == 2){
                        siteInfoVO.setVipElectrovalence(vip.getDiscount().divide(new BigDecimal(10)).multiply(tAccountingStrategyDetail.getServiceCharge()).add(tAccountingStrategyDetail.getElectrovalence()));
                     }
                  }
               }
            }
            if(Objects.nonNull(byId1.getDiscount())){
               siteInfoVO.setVipElectrovalence((tAccountingStrategyDetail.getServiceCharge().multiply(byId1.getDiscount()).add(tAccountingStrategyDetail.getElectrovalence())).setScale(4, BigDecimal.ROUND_HALF_UP));
            }else {
               siteInfoVO.setVipElectrovalence((tAccountingStrategyDetail.getServiceCharge().add(tAccountingStrategyDetail.getElectrovalence())).setScale(4, BigDecimal.ROUND_HALF_UP));
            }
            if(Objects.nonNull(appUser)){
//               TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
               GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
               getAppUserVipDetail.setAppUserId(userId);
               getAppUserVipDetail.setVipId(appUser.getVipId());
               R<TAppUserVipDetail> appUserVipDetail = vipDetailClient.getAppUserVipDetail(getAppUserVipDetail);
               TAppUserVipDetail data1 = appUserVipDetail.getData();
               if(Objects.nonNull(data1)){
                  String vipJson = data1.getVipJson();
                  TVip vip = JSON.parseObject(vipJson, TVip.class);
                  if(Objects.nonNull(vip) && vip.getType() == 2){
                     siteInfoVO.setVipElectrovalence(vip.getDiscount().divide(new BigDecimal(10)).multiply(tAccountingStrategyDetail.getServiceCharge()).add(tAccountingStrategyDetail.getElectrovalence()));
                  }
               }
            }
         }
      }
      List<TVip> vips = vipClient.getVipList().getData();
@@ -232,15 +266,19 @@
         siteInfoVO.setCouponCount(num);
      }
      siteInfoVO.setChargingPileId(one.getId());
      siteInfoVO.setName(byId.getName());
      siteInfoVO.setName(site.getName());
      siteInfoVO.setNumber(one.getNumber().toString());
      siteInfoVO.setSpaceChargeExplain(byId.getSpaceChargeExplain());
      siteInfoVO.setSpaceChargeExplain(site.getSpaceChargeExplain());
      siteInfoVO.setSupportOrder(site.getSupportOrder());
      siteInfoVO.setReservationStartTime(site.getReservationStartTime());
      siteInfoVO.setReservationEndTime(site.getReservationEndTime());
      siteInfoVO.setVinFlag(one.getVinFlag());
      return R.ok(siteInfoVO);
   }
   
   @RequiresPermissions(value = {"/systemUserManagement/update", "/site", "/platformRevenueAnalysis", "/chargingOperationAnalysis",
         "/chargingUserAnalysis", "/operationMaintenanceAnalysis", "/chargingEquipmentMonitoring", "/activityExpense", "/chargeEvaluation/list",
         "/parkingLot", "/workbench"}, logical = Logical.OR)
         "/parkingLot", "/parkingRecord", "/workbench", "/invoiceManagement"}, logical = Logical.OR)
   @GetMapping("/getSiteList")
   @ApiOperation(value = "获取站点列表", tags = {"管理后台-站点管理"})
   public AjaxResult<PageInfo<GetSiteListDTO>> getSiteList(GetSiteList siteList){
@@ -332,8 +370,7 @@
      return R.ok(divide);
   }
   @Resource
    private SiteClient siteClient;
   
@@ -447,7 +484,6 @@
      int isLogin = StringUtils.isEmpty(SecurityUtils.getToken(request)) ? 0 : 1;
      return AjaxResult.success(siteService.pageList(query,isLogin));
   }
   
   
   @ApiOperation(value = "获取站点列表", tags = {"小程序-站点管理-地图导航站点"})
@@ -456,6 +492,8 @@
      int isLogin = StringUtils.isEmpty(SecurityUtils.getToken(request)) ? 0 : 1;
      return AjaxResult.success(siteService.getMapSiteList(query,isLogin));
   }
   @ApiOperation(value = "获取站点详细信息", tags = {"小程序-站点管理-站点详情"})
   @PostMapping("/getDetailById")
   public AjaxResult<SiteDetailVO> getDetailById(@Validated @RequestBody SiteDetailQuery query){
@@ -476,7 +514,8 @@
      }
      return AjaxResult.success(siteDetailVO);
   }
   @ApiOperation(value = "获取站点下充电桩及充电枪列表", tags = {"小程序-站点管理-站点详情"})
   @GetMapping("/getChargingGunList")
   public AjaxResult<List<TChargingPileVO>> getChargingGunList(@RequestParam(value = "siteId")@ApiParam(value = "站点id", required = true)Integer siteId,
@@ -489,6 +528,7 @@
   public AjaxResult<Map<String,ChargingGunCountVO>> getChargingGunCount(@RequestParam(value = "siteId")@ApiParam(value = "站点id", required = true)Integer siteId){
      return AjaxResult.success(chargingGunService.getChargingGunCount(siteId));
   }
   
   @ApiOperation(value = "获取站点下充电枪数量统计", tags = {"小程序-站点管理-站点详情"})
   @GetMapping("/getChargingGunCount1")
@@ -518,7 +558,37 @@
   
   
   
      @RequiresPermissions(value = {"/site/update"}, logical = Logical.OR)
   @ResponseBody
   @PostMapping("/getReservationSetting/{id}")
   @ApiOperation(value = "获取站点预约设置", tags = {"管理后台-站点管理"})
   public AjaxResult<Site> getReservationSetting(@PathVariable Integer id){
      Site site = siteService.lambdaQuery()
            .select(Site::getId, Site::getName, Site::getSupportOrder, Site::getReservationStartTime, Site::getReservationEndTime)
            .eq(Site::getId, id)
            .eq(Site::getDelFlag, 0)
            .one();
      return AjaxResult.success(site);
   }
   @RequiresPermissions(value = {"/site/update"}, logical = Logical.OR)
   @ResponseBody
   @PostMapping("/saveReservationSetting")
   @ApiOperation(value = "保存站点预约设置", tags = {"管理后台-站点管理"})
   public AjaxResult saveReservationSetting(@RequestBody Site site){
      if (site == null || site.getId() == null) {
         return AjaxResult.error("站点id不能为空");
      }
      boolean success = siteService.lambdaUpdate()
            .eq(Site::getId, site.getId())
            .eq(Site::getDelFlag, 0)
            .set(Site::getSupportOrder, site.getSupportOrder())
            .set(Site::getReservationStartTime, site.getReservationStartTime())
            .set(Site::getReservationEndTime, site.getReservationEndTime())
            .update();
      return success ? AjaxResult.success() : AjaxResult.error("保存预约设置失败");
   }
@RequiresPermissions(value = {"/site/update"}, logical = Logical.OR)
   @ResponseBody
   @PostMapping("/editSite")
   @ApiOperation(value = "编辑站点", tags = {"管理后台-站点管理"})
@@ -556,10 +626,20 @@
      siteService.setAccountingStrategy(id, accountingStrategyId);
      return AjaxResult.success();
   }
   @RequiresPermissions(value = {"/site/accounting_strategy"}, logical = Logical.OR)
   @PostMapping("/batchSetAccountingStrategy")
   @ApiOperation(value = "批量设置站点计费策略", tags = {"管理后台-站点管理"})
   @Log(title = "【站点管理】批量设置站点计费策略", businessType = BusinessType.UPDATE)
   public AjaxResult batchSetAccountingStrategy(@RequestParam("ids") List<Integer> ids, @RequestParam("accountingStrategyId") Integer accountingStrategyId){
      siteService.batchSetAccountingStrategy(ids, accountingStrategyId);
      return AjaxResult.success();
   }
   
   
   @RequiresPermissions(value = {"/roleManagement/add", "/roleManagement/info", "/roleManagement/update", "/systemNotification", "/chargingPeriodStatistics",
         "/parkingPaymentOrder", "/generateStatement", "/chargingPile/add", "/chargingPile/select", "/chargingPile/update"}, logical = Logical.OR)
         "/parkingPaymentOrder", "/generateStatement", "/chargingPile/add", "/chargingPile/select", "/chargingPile/update",
         "/appUserWhitelist/add", "/appUserWhitelist/update", "/appUserWhitelist/import"}, logical = Logical.OR)
   @ResponseBody
   @GetMapping("/getAllSiteList")
   @ApiOperation(value = "获取所有站点数据", tags = {"管理后台-充电桩信息", "管理后台-系统用户管理", "管理后台-角色管理", "管理后台-系统通知", "管理后台-充电评价"})
@@ -599,6 +679,70 @@
      List<Site> sites = siteService.list(new LambdaQueryWrapper<Site>().in(Site::getId, ids).eq(Site::getDelFlag, 0));
      return R.ok(sites);
   }
   @GetMapping("/getSitesByIds")
   @ApiOperation(value = "小程序批量获取站点基础信息", tags = {"小程序-收藏"})
   public R<List<Site>> getSitesByIds(@RequestParam String ids) {
      List<Integer> siteIds = Arrays.stream(ids.split(","))
            .filter(StringUtils::isNotEmpty)
            .map(Integer::valueOf)
            .collect(Collectors.toList());
      if (siteIds.isEmpty()) {
         return R.ok(Collections.emptyList());
      }
      return R.ok(siteService.list(new LambdaQueryWrapper<Site>()
            .in(Site::getId, siteIds)
            .eq(Site::getDelFlag, 0)));
   }
   @PostMapping("/favoriteSitePrices")
   @ApiOperation(value = "批量获取收藏站点当前价格", tags = {"内部接口-收藏"})
   public R<List<FavoriteSitePriceVO>> favoriteSitePrices(@RequestBody List<Integer> ids) {
      if (CollectionUtils.isEmpty(ids)) {
         return R.ok(Collections.emptyList());
      }
      List<Site> sites = siteService.list(new LambdaQueryWrapper<Site>()
            .in(Site::getId, ids)
            .eq(Site::getDelFlag, 0));
      List<FavoriteSitePriceVO> result = sites.stream().map(site -> {
         FavoriteSitePriceVO vo = new FavoriteSitePriceVO();
         vo.setSiteId(site.getId());
         vo.setSiteName(site.getName());
         vo.setStatus(site.getStatus());
         vo.setCurrentPrice(getCurrentSitePrice(site));
         return vo;
      }).collect(Collectors.toList());
      return R.ok(result);
   }
   private BigDecimal getCurrentSitePrice(Site site) {
      if (site.getAccountingStrategyId() == null) {
         return null;
      }
      LocalTime now = LocalTime.now();
      List<TAccountingStrategyDetail> details = accountingStrategyDetailService.lambdaQuery()
            .eq(TAccountingStrategyDetail::getAccountingStrategyId, site.getAccountingStrategyId())
            .list();
      for (TAccountingStrategyDetail detail : details) {
         LocalTime start = parsePriceTime(detail.getStartTime(), false);
         LocalTime end = parsePriceTime(detail.getEndTime(), true);
         if (start != null && end != null && !now.isBefore(start) && !now.isAfter(end)) {
            return detail.getElectrovalence().add(detail.getServiceCharge())
                  .setScale(4, BigDecimal.ROUND_HALF_UP);
         }
      }
      return null;
   }
   private LocalTime parsePriceTime(String value, boolean endTime) {
      if (StringUtils.isEmpty(value)) {
         return null;
      }
      if (endTime && "00:00".equals(value)) {
         return LocalTime.of(23, 59, 59);
      }
      return LocalTime.parse(value.length() == 5 ? value + ":00" : value);
   }
   
   
   /**
@@ -611,4 +755,35 @@
      List<Site> list = siteService.list(new LambdaQueryWrapper<Site>().eq(Site::getDelFlag, 0));
      return R.ok(list);
   }
   /**
    * 分页查询站电数据
    * @param PageNo
    * @param PageSize
    * @return
    */
   @PostMapping("/getSiteListPaging")
   public PageInfo<Site> getSiteListPaging(@RequestParam("PageNo") Integer PageNo, @RequestParam("PageSize") Integer PageSize,
                                           @RequestParam("ids") List<String> ids, @RequestParam("isOpenSynchronization") Integer isOpenSynchronization){
      PageInfo<Site> pageInfo = new PageInfo<>(PageNo, PageSize);
      PageInfo<Site> page = siteService.lambdaQuery().eq(Site::getStatus, 1)
            .in(ids.size() > 0, Site::getId, ids)
            .eq(-1 != isOpenSynchronization, Site::getIsOpenSynchronization, isOpenSynchronization)
            .ne(Site::getSiteType, 2).page(pageInfo);
      return page;
   }
   /**
    * 分页查询站电数据
    * @param PageNo
    * @param PageSize
    * @return
    */
   @PostMapping("/getSiteListPagingJianGuan")
   public PageInfo<Site> getSiteListPagingJianGuan(@RequestParam("PageNo") Integer PageNo, @RequestParam("PageSize") Integer PageSize,
                                           @RequestParam("ids") List<String> ids){
      PageInfo<Site> pageInfo = new PageInfo<>(PageNo, PageSize);
      PageInfo<Site> page = siteService.lambdaQuery().eq(Site::getStatus, 1).in(ids.size() > 0, Site::getId, ids).page(pageInfo);
      return page;
   }
}