ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/ChargingGunCountVO.java
@@ -10,7 +10,7 @@ public class ChargingGunCountVO extends Site { @ApiModelProperty(value = "充电枪在线数量") private Integer onlineCount; private Integer freeCount; @ApiModelProperty(value = "充电枪总数数量") private Integer totalCount; ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TChargingPileVO.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.chargingPile.api.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.ruoyi.chargingPile.api.model.TChargingGun; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; @Data @ApiModel(value = "TChargingPileVO对象",description = "充电桩信息") public class TChargingPileVO implements Serializable { @ApiModelProperty(value = "充电桩id") private Integer id; @ApiModelProperty(value = "设备编号") private String code; @ApiModelProperty(value = "充电设备名称") private String name; @ApiModelProperty(value = "桩号") private Integer number; @ApiModelProperty(value = "充电枪信息列表") private List<TChargingGun> chargingGunList; } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java
New file @@ -0,0 +1,46 @@ package com.ruoyi.common.core.enums.status; import lombok.Getter; /** * @Description * @Author xiaochen * @Date 2023/6/8 16:42 */ public enum ChargingGunModeEnum { SUPER_SUFFICIENT(1, "超级快充"), FAST_SUFFICIENT(2, "快充"), SLOW_SUFFICIENT(3, "慢充"); @Getter private String desc; @Getter private int code; ChargingGunModeEnum(int code, String desc) { this.code = code; this.desc = desc; } /** * 通过code获取枚举 * * @param code * @return */ public static ChargingGunModeEnum fromCode(Integer code) { ChargingGunModeEnum[] resultTypes = ChargingGunModeEnum.values(); for (ChargingGunModeEnum resultType : resultTypes) { if (code.equals(resultType.getCode())) { return resultType; } } return null; } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java
New file @@ -0,0 +1,50 @@ package com.ruoyi.common.core.enums.status; import lombok.Getter; /** * @Description * @Author xiaochen * @Date 2023/6/8 16:42 */ public enum ChargingGunStatusEnum { OFFLINE(1, "离线"), IDLE(2, "空闲"), OCCUPATION_UNCHARGED(3, "占用(未充电)"), OCCUPATION_CHARGING(4, "占用(充电中)"), OCCUPATION_FULL(5, "占用(已充满)"), OCCUPATION_LOCK(6, "占用(预约锁定)"), FAULT(7, "故障"); @Getter private String desc; @Getter private int code; ChargingGunStatusEnum(int code, String desc) { this.code = code; this.desc = desc; } /** * 通过code获取枚举 * * @param code * @return */ public static ChargingGunStatusEnum fromCode(Integer code) { ChargingGunStatusEnum[] resultTypes = ChargingGunStatusEnum.values(); for (ChargingGunStatusEnum resultType : resultTypes) { if (code.equals(resultType.getCode())) { return resultType; } } return null; } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/GeodesyUtil.java
@@ -4,7 +4,6 @@ import org.gavaghan.geodesy.GeodeticCalculator; import org.gavaghan.geodesy.GeodeticCurve; import org.gavaghan.geodesy.GlobalCoordinates; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @@ -12,7 +11,6 @@ /** * 计算两个金纬度坐标之间的直线距离 */ @Component public class GeodesyUtil { @@ -22,7 +20,7 @@ * @param toLonLat * @return */ public Map<String, Double> getDistance(String fromLonLat, String toLonLat){ public static Map<String, Double> getDistance(String fromLonLat, String toLonLat){ Map<String, Double> map = null; if(StringUtils.isNotEmpty(fromLonLat) && StringUtils.isNotEmpty(toLonLat)){ map = new HashMap<>(); @@ -59,7 +57,7 @@ } private double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){ private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){ //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离 GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo); return geoCurve.getEllipsoidalDistance(); ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -3,14 +3,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.GetSiteList; import com.ruoyi.chargingPile.api.query.SiteDetailQuery; import com.ruoyi.chargingPile.api.query.SiteQuery; import com.ruoyi.chargingPile.api.vo.ChargingGunCountVO; import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; import com.ruoyi.chargingPile.api.vo.TChargingPileVO; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.common.core.utils.GeodesyUtil; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; @@ -19,11 +26,13 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** * @author zhibing.pu @@ -42,11 +51,10 @@ @Resource private SysUserClient sysUserClient; @Autowired private TChargingPileService chargingPileService; @Autowired private TChargingGunService chargingGunService; @ResponseBody @GetMapping("/getSiteList") @@ -62,15 +70,29 @@ return AjaxResult.success(siteService.pageList(query)); } @ApiOperation(value = "获取站点详细信息", tags = {"小程序-站点管理"}) @GetMapping("/getDetailById") @ApiOperation(value = "获取站点详细信息", tags = {"小程序-站点管理-站点详情"}) @PostMapping("/getDetailById") public AjaxResult<SiteDetailVO> getDetailById(@Validated @RequestBody SiteDetailQuery query){ SiteDetailVO siteDetailVO = siteService.getDetailById(query.getSiteId()); // 计算距离 Map<String, Double> distance = GeodesyUtil.getDistance(query.getLat() + "," + query.getLon(), siteDetailVO.getLat() + "," + siteDetailVO.getLon()); siteDetailVO.setDistance(distance.get("WGS84")); // TODO 查询绑定车牌提示文案 return AjaxResult.success(siteDetailVO); } @ApiOperation(value = "获取站点下充电桩及充电枪列表", tags = {"小程序-站点管理-站点详情"}) @GetMapping("/getChargingGunList") public AjaxResult<List<TChargingPileVO>> getChargingGunList(@RequestParam(name = "siteId",value = "站点id")Integer siteId){ return AjaxResult.success(chargingPileService.getChargingGunList(siteId)); } @ApiOperation(value = "获取站点下充电枪数量统计", tags = {"小程序-站点管理-站点详情"}) @GetMapping("/getChargingGunCount") public AjaxResult<Map<String,ChargingGunCountVO>> getChargingGunCount(@RequestParam(name = "siteId",value = "站点id")Integer siteId){ return AjaxResult.success(chargingGunService.getChargingGunCount(siteId)); } @ResponseBody @PostMapping("/getSiteList") ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingPileMapper.java
@@ -4,6 +4,7 @@ import com.ruoyi.chargingPile.api.dto.PageChargingPileListDTO; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.PageChargingPileList; import com.ruoyi.chargingPile.api.vo.TChargingPileVO; import com.ruoyi.common.core.web.page.PageInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -36,4 +37,11 @@ * @return */ TChargingPile getChargingPile(Integer id); /** * 获取站点下充电桩及充电枪列表 * @param siteId * @return */ List<TChargingPileVO> getChargingGunList(@Param("siteId")Integer siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingGunService.java
@@ -4,10 +4,13 @@ import com.ruoyi.chargingPile.api.dto.TChargingGunDTO; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.query.TChargingGunQuery; import com.ruoyi.chargingPile.api.vo.ChargingGunCountVO; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import org.springframework.web.bind.annotation.RequestBody; import java.util.Map; /** * <p> @@ -40,4 +43,11 @@ * @return */ AjaxResult update(TChargingGunDTO dto); /** * 获取站点下充电枪数量统计 * @param siteId * @return */ Map<String, ChargingGunCountVO> getChargingGunCount(Integer siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileService.java
@@ -5,10 +5,13 @@ import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.BatchSetAccountingStrategy; import com.ruoyi.chargingPile.api.query.PageChargingPileList; import com.ruoyi.chargingPile.api.vo.TChargingPileVO; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; /** * <p> @@ -66,4 +69,12 @@ * @param setAccountingStrategy */ void batchSetAccountingStrategy(BatchSetAccountingStrategy setAccountingStrategy); /** * 获取站点下充电桩及充电枪列表 * @param siteId * @return */ List<TChargingPileVO> getChargingGunList(Integer siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -1,16 +1,20 @@ package com.ruoyi.chargingPile.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.dto.TChargingGunDTO; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.query.TChargingGunQuery; import com.ruoyi.chargingPile.api.vo.ChargingGunCountVO; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.api.vo.TMonitoringEquipmentVO; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.TChargingGunMapper; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.common.core.enums.status.ChargingGunModeEnum; import com.ruoyi.common.core.enums.status.ChargingGunStatusEnum; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; @@ -20,7 +24,10 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -107,6 +114,39 @@ return AjaxResult.success(); } @Override public Map<String, ChargingGunCountVO> getChargingGunCount(Integer siteId) { Map<String, ChargingGunCountVO> map = new HashMap<>(4); // 查询全部充电枪 List<TChargingGun> list = this.list(Wrappers.lambdaQuery(TChargingGun.class).eq(TChargingGun::getSiteId, siteId)); int freeCount = 0; // 超级充 ChargingGunCountVO superSufficient = getGunCount(ChargingGunModeEnum.SUPER_SUFFICIENT.getCode(), list); freeCount += superSufficient.getFreeCount(); map.put("superSufficient", superSufficient); // 快充 ChargingGunCountVO fastSufficient = getGunCount(ChargingGunModeEnum.FAST_SUFFICIENT.getCode(), list); freeCount += fastSufficient.getFreeCount(); map.put("fastSufficient", fastSufficient); // 慢充 ChargingGunCountVO slowSufficient = getGunCount(ChargingGunModeEnum.SLOW_SUFFICIENT.getCode(), list); freeCount += slowSufficient.getFreeCount(); map.put("slowSufficient", slowSufficient); ChargingGunCountVO chargingGunCountVO = new ChargingGunCountVO(); chargingGunCountVO.setTotalCount(list.size()); chargingGunCountVO.setFreeCount(freeCount); map.put("totalSufficient", chargingGunCountVO); return map; } private ChargingGunCountVO getGunCount(Integer chargeMode, List<TChargingGun> list){ ChargingGunCountVO chargingGunCountVO = new ChargingGunCountVO(); chargingGunCountVO.setTotalCount(list.stream().filter(tChargingGun -> tChargingGun.getChargeMode().equals(chargeMode)).collect(Collectors.toList()).size()); chargingGunCountVO.setFreeCount(list.stream().filter(tChargingGun -> tChargingGun.getChargeMode().equals(chargeMode) && tChargingGun.getStatus()== ChargingGunStatusEnum.IDLE.getCode()).collect(Collectors.toList()).size()); return chargingGunCountVO; } /** * 校验必填项 * @param dto ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -1,12 +1,15 @@ package com.ruoyi.chargingPile.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.dto.PageChargingPileListDTO; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.BatchSetAccountingStrategy; import com.ruoyi.chargingPile.api.query.PageChargingPileList; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.api.vo.TChargingPileVO; import com.ruoyi.chargingPile.domain.SiteMenu; import com.ruoyi.chargingPile.mapper.TChargingPileMapper; import com.ruoyi.chargingPile.service.IPartnerService; @@ -192,4 +195,17 @@ } chargingGunService.updateBatchById(list); } @Override public List<TChargingPileVO> getChargingGunList(Integer siteId) { List<TChargingPileVO> chargingPileVOS = this.baseMapper.getChargingGunList(siteId); List<TChargingGun> chargingGuns = chargingGunService.list(Wrappers.lambdaQuery(TChargingGun.class) .eq(TChargingGun::getSiteId, siteId)); // 查询充电枪信息 chargingPileVOS.forEach(item -> { List<TChargingGun> gunList = chargingGuns.stream().filter(gun -> gun.getChargingPileId().equals(item.getId())).collect(Collectors.toList()); item.setChargingGunList(gunList); }); return chargingPileVOS; } } ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingPileMapper.xml
@@ -75,4 +75,8 @@ left join t_site b on (a.site_id = b.id) left join t_partner c on (a.partner_id = c.id) </select> <select id="getChargingGunList" resultType="com.ruoyi.chargingPile.api.vo.TChargingPileVO"> select id,code, `name`, `number` from t_charging_pile where del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} and site_id = #{siteId} </select> </mapper>