ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -33,6 +33,11 @@ return new ChargingGunClient() { @Override public R<Integer> addGunTemp(TChargingGun gun) { return R.fail("添加临时枪数据失败:" + throwable.getMessage()); } @Override public R<List<TChargingGun>> getAllGun() { return R.fail("获取数据失败:" + throwable.getMessage()); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java
@@ -29,6 +29,11 @@ return new ChargingPileClient() { @Override public R<Integer> addPileTemp(TChargingPile chargingPile) { return R.fail("添加临时桩数据失败:"+throwable.getMessage()); } @Override public R<List<TChargingPile>> getChargingPileBySiteId(Integer siteId) { return R.fail("通过站点id获取充电桩列表失败:"+throwable.getMessage()); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
@@ -31,6 +31,11 @@ return new SiteClient() { @Override public R addSiteTemp(Site site) { return R.fail("新增临时站点失败:" + throwable.getMessage()); } @Override public R<List<TChargingPile>> getPileListBySiteId(Integer siteId) { return R.fail("根据站点id 查询所有充电桩:" + throwable.getMessage()); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
@@ -20,6 +20,13 @@ @FeignClient(contextId = "ChargingGunClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = ChargingGunFallbackFactory.class) public interface ChargingGunClient { /** * 新增临时枪 * @return */ @PostMapping("/t-charging-gun/addGunTemp") @ResponseBody R<Integer> addGunTemp(@RequestBody TChargingGun gun); /** * 获取所有枪 * @return */ ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java
@@ -19,6 +19,12 @@ */ @FeignClient(contextId = "ChargingPileClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = ChargingPileFallbackFactory.class) public interface ChargingPileClient { /** * 临时添加充电桩 */ @PostMapping(value = "/t-charging-pile/addPileTemp") @ResponseBody R<Integer> addPileTemp(@RequestBody TChargingPile chargingPile); /** * 管理后台-通过站点id获取充电桩列表 不分页 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
@@ -8,6 +8,8 @@ import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.page.PageInfo; import io.swagger.annotations.ApiOperation; import lombok.extern.java.Log; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -19,9 +21,11 @@ */ @FeignClient(contextId = "SiteClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = SiteFallbackFactory.class) public interface SiteClient { @ResponseBody @PostMapping("/site/addSiteTemp") public R<Integer> addSiteTemp(@RequestBody Site site); @GetMapping("/site/getPileListBySiteId/{siteId}") public R<List<TChargingPile>> getPileListBySiteId(@PathVariable("siteId")Integer siteId); /** * 根据id集合获取数据 * @param ids ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -113,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 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -67,11 +67,21 @@ @Autowired private FileUploadConfig fileUploadConfig; /** * 新增临时枪 * @return */ @PostMapping("/addGunTemp") @ResponseBody R<Integer> addGunTemp(@RequestBody TChargingGun gun){ chargingGunService.save(gun); return R.ok(gun.getId()); } /** * 查询所有枪 */ @PostMapping(value = "/getAllGun") @ResponseBody public R<List<TChargingGun>> getAllGun() { return R.ok(chargingGunService.list()); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -101,7 +101,15 @@ this.chargingPileService = chargingPileService; this.chargingGunService = chargingGunService; } /** * 临时添加充电桩 */ @PostMapping(value = "/addPileTemp") @ResponseBody public R<Integer> addPileTemp(@RequestBody TChargingPile chargingPile){ chargingPileService.save(chargingPile); return R.ok(chargingPile.getId()); } /** * 查询充电桩列表 */ ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/tulaidian/util/ChargePileHttpUtil.java
@@ -44,9 +44,9 @@ */ public String getToken(){ String token = redisService.getCacheObject(ChargePileInterface.TOKEN_KEY); if(StringUtils.hasLength(token)){ return token; } // if(StringUtils.hasLength(token)){ // return token; // } JSONObject jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("OperatorSecret", OperatorSecret); ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/constant/ChargePileInterface.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.jianguan.constant; public class ChargePileInterface { public static final String TOKEN_KEY = "charge_token:"; public static final String OperatorID = "734810353"; // 获取token public static final String QUERY_TOKEN = "http://tld.itsou.top/evcs/tld/query_token"; // 查询充电站信息 public static final String QUERY_STATIONS_INFO = "http://tld.itsou.top/evcs/tld/query_stations_info"; public static final String QUERY_ORDER_LIST = "http://tld.itsou.top/evcs/tld/query_finish_orders"; // 设备接口状态查询 public static final String QUERY_STATION_STATUS = "http://tld.itsou.top/evcs/tld/query_station_status"; // 查询业务策略信息 public static final String QUERY_EQUIP_BUSINESS_POLICY = "http://tld.itsou.top/evcs/tld/query_equip_business_policy"; // 请求设备认证 public static final String QUERY_EQUIP_AUTH = "http://tld.itsou.top/evcs/tld/query_equip_auth"; // 请求启动充电 public static final String QUERY_START_CHARGE = "http://tld.itsou.top/evcs/tld/query_start_charge"; // 查询充电状态 public static final String QUERY_EQUIP_CHARGE_STATUS = "http://tld.itsou.top/evcs/tld/query_equip_charge_status"; // 请求停止充电 public static final String QUERY_STOP_CHARGE = "http://tld.itsou.top/evcs/tld/query_stop_charge"; // 自助备案车牌号 public static final String QUERY_MERCHANT_VEHICLES = "http://tld.itsou.top/evcs/tld/query_merchant_vehicles"; // 获取商户企业账户余额 public static final String QUERY_CASHBALANCE = "http://tld.itsou.top/evcs/tld/query_cashbalance"; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/controller/ChargingPileInfoController.java
New file @@ -0,0 +1,608 @@ package com.ruoyi.jianguan.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.jianguan.dto.*; import com.ruoyi.jianguan.service.ISiteService; import com.ruoyi.jianguan.service.TChargingGunService; import com.ruoyi.jianguan.service.TChargingPileService; import com.ruoyi.jianguan.util.ChargePileHttpUtil; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; import com.ruoyi.other.api.domain.Region; import com.ruoyi.other.api.feignClient.OtherClient; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** * 站桩枪、订单 临时数据接口 * * @author stylefeng * @Date 2018/7/20 23:39 */ @RestController @RequestMapping("/chargingPileInfo") @Slf4j public class ChargingPileInfoController { @Autowired private ChargePileHttpUtil chargePileHttpUtil; @Autowired private ChargingOrderAccountingStrategyClient chargingOrderAccountingStrategyClient; @Autowired private ChargingGunClient chargingGunClient; @Autowired private ChargingPileClient chargingPileClient; @Autowired private SiteClient siteClient; @Autowired private ChargingOrderClient chargingOrderClient; @Autowired private OtherClient otherClient; private static final double EARTH_RADIUS = 6371.0; // 地球半径,单位为千米 /** * 计算两点之间的距离,单位为千米 * * @param lat1 第一个点的纬度 * @param lon1 第一个点的经度 * @param lat2 第二个点的纬度 * @param lon2 第二个点的经度 * @return 两点之间的距离,单位为千米 */ public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) { double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); lat1 = Math.toRadians(lat1); lat2 = Math.toRadians(lat2); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return EARTH_RADIUS * c; } /** * 司机端-获取充电桩列表 */ @ResponseBody @PostMapping("/orderList") @ApiOperation(value = "获取充电订单", tags = {"司机端-获取充电订单"}, notes = "") public R<String> chargingPileList(){ List<TChargingGun> chargingGun = chargingGunClient.getAllGun().getData(); List<ChargeOrder> result = getOrderList(); List<TChargingOrder> orders = new ArrayList<>(); List<TChargingOrderAccountingStrategy> accountingStrategies = new ArrayList<>(); // 封装订单数据 for (ChargeOrder chargeOrder : result) { TChargingOrder chargingOrder = new TChargingOrder(); chargingOrder.setOrderType(1); chargingOrder.setOrderClassification(1); // chargingOrder.setAppUserId(1L); // chargingOrder.setAppUserCarId(1L); chargingOrder.setRefundAmount(new BigDecimal(chargeOrder.getTotalMoney())); chargingOrder.setRechargeSerialNumber("4200002747202505247686188393"); chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); chargingOrder.setVipDiscount(BigDecimal.ZERO); chargingOrder.setVipDiscountAmount(BigDecimal.ZERO); chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); chargingOrder.setCommissionAmount(BigDecimal.ZERO); chargingOrder.setSharingAmount(BigDecimal.ZERO); chargingOrder.setDelFlag(false); chargingOrder.setNeedElec(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setStartSoc(BigDecimal.ZERO); chargingOrder.setEndSoc(new BigDecimal("100")); chargingOrder.setPower(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setElectricity(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setVoltage(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setCurrent(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setChargingPower(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setChargingCapacity(new BigDecimal(chargeOrder.getTotalPower())); chargingOrder.setCode(chargeOrder.getStartChargeSeq()); chargingOrder.setOrderSource(2); chargingOrder.setOperatorId(999); chargingOrder.setTripartitePlatformName("途来电"); chargingOrder.setStartChargeSeq(chargeOrder.getStartChargeSeq()); chargingOrder.setSourceName("途来电"); chargingOrder.setStartTime(DateUtils.stringToLocalDateTime(chargeOrder.getStartTime())); chargingOrder.setEndTime(DateUtils.stringToLocalDateTime(chargeOrder.getEndTime())); chargingOrder.setStatus(5); chargingOrder.setEndMode(1); chargingOrder.setElectrovalence(new BigDecimal(chargeOrder.getElecMoney())); chargingOrder.setServiceCharge(new BigDecimal(chargeOrder.getSeviceMoney())); chargingOrder.setTotalElectricity(new BigDecimal(chargeOrder.getElecMoney())); chargingOrder.setPaymentAmount(new BigDecimal(chargeOrder.getTotalMoney())); chargingOrder.setRechargePaymentType(1); chargingOrder.setRechargePaymentStatus(2); chargingOrder.setChargeAmount(new BigDecimal(chargeOrder.getTotalMoney())); chargingOrder.setOrderAmount(new BigDecimal(chargeOrder.getTotalMoney())); chargingOrder.setResidualAmount(BigDecimal.ZERO); chargingOrder.setPaymentAmount(new BigDecimal(chargeOrder.getTotalMoney())); chargingOrder.setPayTime(LocalDateTime.now()); // 通过枪编号查询枪 TChargingGun tChargingGun = chargingGun.stream().filter(e -> e.getConnectorID().equals(chargeOrder.getConnectorID())) .findFirst().orElse(null); if(Objects.nonNull(tChargingGun)){ chargingOrder.setChargingGunId(tChargingGun.getId()); chargingOrder.setChargingPileId(tChargingGun.getChargingPileId()); chargingOrder.setSiteId(tChargingGun.getSiteId()); }else{ continue; } R<Long> orderIdR = chargingOrderClient.addChargingOrder(chargingOrder); if(orderIdR.getCode() == 200){ // 充电明细 List<com.ruoyi.jianguan.dto.ChargeDetail> chargeDetails = chargeOrder.getChargeDetails(); if(!CollectionUtils.isEmpty(chargeDetails)){ List<TChargingOrderAccountingStrategy> accountingStrategyList = new ArrayList<>(); for (ChargeDetail chargeDetail : chargeDetails) { TChargingOrderAccountingStrategy accountingStrategy = new TChargingOrderAccountingStrategy(); accountingStrategy.setChargingOrderId(orderIdR.getData()); accountingStrategy.setAccountingStrategyDetailId(232); accountingStrategy.setType(1); accountingStrategy.setStartTime(chargeDetail.getDetailStartTime()); accountingStrategy.setEndTime(chargeDetail.getDetailEndTime()); accountingStrategy.setElectrovalence(chargeDetail.getElecPrice()); accountingStrategy.setServiceCharge(chargeDetail.getSevicePrice()); accountingStrategy.setCostServiceCharge(chargeDetail.getDetailSeviceMoney()); accountingStrategy.setChargingCapacity(chargeDetail.getDetailPower()); accountingStrategy.setPeriodElectricPrice(chargeDetail.getDetailElecMoney()); accountingStrategy.setCouponDiscountAmount(BigDecimal.ZERO); accountingStrategy.setVipDiscountAmount(BigDecimal.ZERO); accountingStrategy.setPeriodServicePrice(chargeDetail.getDetailSeviceMoney()); accountingStrategy.setPeriodOriginalServicePrice(chargeDetail.getDetailSeviceMoney()); accountingStrategy.setCreateTime(LocalDateTime.now()); accountingStrategyList.add(accountingStrategy); } chargingOrderAccountingStrategyClient.addChargingOrderAccountingStrategy(accountingStrategyList); } } } return R.ok(); } @ResponseBody @PostMapping("/chargingPileList") @ApiOperation(value = "获取充电桩列表", tags = {"获取充电桩列表"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "电站类型 0=不限 1=公共 50=个人 100=公交 101=环卫(专用) 102=物流(专用) 103=出租车(专用) 255=其他", name = "type", required = false, dataType = "string"), @ApiImplicitParam(value = "电站距离 不限=0 1km内=1 2km内=2 3km内=3 5km内=4 10km内=5 50km内=6 100km内=7 ", name = "distance", required = false, dataType = "int"), @ApiImplicitParam(value = "设备状态 不限=0 1=只看空闲", name = "status", required = false, dataType = "int"), @ApiImplicitParam(value = "电站名称/目标地址", name = "name", required = false, dataType = "string"), @ApiImplicitParam(value = "pageNo", name = "pageNo", required = false, dataType = "string"), @ApiImplicitParam(value = "pageSize", name = "pageSize", required = false, dataType = "string"), @ApiImplicitParam(value = "lon", name = "经度", required = false, dataType = "string"), @ApiImplicitParam(value = "lat", name = "纬度", required = false, dataType = "string"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) public R<String> chargingPileList(String type, Integer distance, Integer status, String name, String lon, String lat, Integer pageNo, Integer pageSize){ PageInfo pageInfo = new PageInfo(); List<StationInfos> result = getStationInfos(); // 电站类型 if (StringUtils.hasLength(type) && (!type.equals("0"))){ List<Integer> list = Arrays.stream(type.split(",")).map(Integer::parseInt).collect(Collectors.toList()); result = result.stream().filter(item -> list.contains(item.getStationType())).collect(Collectors.toList()); } // 电站名称/目标地址 if(StringUtils.hasLength(name)){ result = result.stream().filter(item -> item.getStationName().contains(name) || item.getAddress().contains(name)).collect(Collectors.toList()); } for (StationInfos stationInfo : result) { if (StringUtils.hasLength(lon)){ double v = calculateDistance( stationInfo.getStationLat(), stationInfo.getStationLng(), Double.parseDouble(lat), Double.parseDouble(lon) ); stationInfo.setDistance(String.valueOf(Math.abs(v))); }else { stationInfo.setDistance("0"); } List<EquipmentInfos> equipmentInfos = stationInfo.getEquipmentInfos(); int a = 0; int b = 0; for (EquipmentInfos equipmentInfo : equipmentInfos) { if (equipmentInfo.getEquipmentType()==1){ a++; } if (equipmentInfo.getEquipmentType()==2){ b++; } } stationInfo.setFastTotal(a); stationInfo.setSnowTotal(b); stationInfo.setFast(a); stationInfo.setSnow(b); } if(Objects.nonNull(distance) && distance != 0){ switch (distance){ case 1: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 1).collect(Collectors.toList()); break; case 2: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 2).collect(Collectors.toList()); break; case 3: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 3).collect(Collectors.toList()); break; case 4: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 5).collect(Collectors.toList()); break; case 5: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 10).collect(Collectors.toList()); break; case 6: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 50).collect(Collectors.toList()); break; case 7: result = result.stream().filter(item -> Double.parseDouble(item.getDistance()) <= 100).collect(Collectors.toList()); break; } } List<String> stationIDs = result.stream() .map(StationInfos::getStationID) .collect(Collectors.toList()); String obj = chargePileHttpUtil.queryStationStatus(stationIDs); JSONObject jsonObject1 = JSONObject.parseObject(obj); JSONArray stationStatusInfos = jsonObject1.getJSONArray("StationStatusInfos"); for (StationInfos stationInfo : result) { for (EquipmentInfos equipmentInfo : stationInfo.getEquipmentInfos()) { for (ConnectorInfo connectorInfo : equipmentInfo.getConnectorInfos()) { for (Object stationStatusInfo : stationStatusInfos) { JSONObject jsonObject2 = (JSONObject) stationStatusInfo; String stationID = jsonObject2.getString("StationID"); JSONArray connectorStatusInfos = jsonObject2.getJSONArray("ConnectorStatusInfos"); if (connectorStatusInfos != null) { for (Object connectorStatusInfo : connectorStatusInfos) { JSONObject jsonObject3 = (JSONObject) connectorStatusInfo; String status1 = jsonObject3.getString("ConnectorID"); if (connectorInfo.getConnectorID().equals(status1)){ Integer status2 = jsonObject3.getInteger("Status"); if (status2==1){ connectorInfo.setStatus(1); }else { connectorInfo.setStatus(2); } break; } } } } } } } // 电站状态 if (Objects.nonNull(status) && status == 1) { Iterator<StationInfos> iterator1 = result.iterator(); while (iterator1.hasNext()) { StationInfos next = iterator1.next(); for (Object stationStatusInfo : stationStatusInfos) { JSONObject jsonObject2 = (JSONObject) stationStatusInfo; String stationID = jsonObject2.getString("StationID"); if (stationID != null && stationID.equals(next.getStationID())) { JSONArray connectorStatusInfos = jsonObject2.getJSONArray("ConnectorStatusInfos"); if (connectorStatusInfos != null) { for (Object connectorStatusInfo : connectorStatusInfos) { JSONObject jsonObject3 = (JSONObject) connectorStatusInfo; Integer status1 = jsonObject3.getInteger("Status"); if (status1 != null && status1 == 1) { break; }else { iterator1.remove(); break; } } } } } } } result.sort(Comparator.comparing(StationInfos::getDistance)); pageInfo.setTotal(result.size()); // List<StationInfos> testing = testing(result.size(), pageNo, pageSize, result); Map<String, Region> regionMap = otherClient.listAllRegion().getData() .stream().collect(Collectors.toMap(Region::getCode, e -> e)); Map<Integer, Region> regionIdMap = otherClient.listAllRegion().getData() .stream().collect(Collectors.toMap(Region::getId, e -> e)); List<Site> sites = new ArrayList<>(); List<TChargingPile> piles = new ArrayList<>(); List<TChargingGun> guns = new ArrayList<>(); for (StationInfos stationInfos : result) { if (StringUtils.hasLength(stationInfos.getAreaCode())){ if (stationInfos.getAreaCode().equals("0")){ continue; } } Site site = new Site(); site.setStationID(stationInfos.getStationID()); site.setPartnerId(26); Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); String dateTime = dateFormat.format(calendar.getTime()); dateTime = dateTime.substring(2); String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000); timestampPart = timestampPart.replace(".", "").replace("E", ""); timestampPart = timestampPart.substring(0, 4); site.setCode(dateTime+timestampPart); site.setName(stationInfos.getStationName()); site.setSiteType(stationInfos.getStationType()); site.setBusinessCategory(2); site.setStatus(1); site.setConstructionSite(1); site.setImgUrl(""); Region region = regionMap.get(stationInfos.getAreaCode()); if (region!=null){ site.setDistricts(region.getName()); site.setDistrictsCode(region.getCode()); Integer parentId = region.getParentId(); Region parentRegion = regionIdMap.get(parentId); if (parentRegion != null) { site.setCity(parentRegion.getName()); site.setCityCode(parentRegion.getCode()); Region region1 = regionIdMap.get(parentRegion.getParentId()); if (region1!=null){ site.setProvince(region1.getName()); site.setProvinceCode(region1.getCode()); } } } site.setLon(stationInfos.getStationLng()+""); site.setLat(stationInfos.getStationLat()+""); site.setAddress(stationInfos.getAddress()); // site.setCountryCode(); site.setPhone(stationInfos.getServiceTel()); site.setServicePhone(stationInfos.getServiceTel()); site.setGuide(stationInfos.getSiteGuide()); site.setStartServiceTime("24小时"); // site.setEndServiceTime(); // site.setServiceDescription(); // site.setVehicleDescription(); site.setParkingSpace(stationInfos.getParkNums()); // site.setRateDescription(); // site.setSpaceChargeExplain(); // todo 临时写死一个 site.setAccountingStrategyId(232); // site.setEstablishmentTime(); site.setSort(180); // site.setRemark(); // site.setMark(); // site.setAreaCodeCountryside(); site.setStationClassification(1); site.setGeneralApplicationType(1); site.setSwapMatchCars(stationInfos.getMatchCars()); site.setRoundTheClock(1); site.setParkType(4); // site.setParkFee(); // site.setParkFeeFree(); site.setBusinessExpandType(1); site.setElectricityType(1); site.setCapacity(new BigDecimal("1250")); site.setRatedPower(new BigDecimal("1200")); site.setPeriodFee(1); site.setOfficialRunTime("2025-06-22"); // site.setStationOrientation(); // site.setStationArea(); site.setHavePerson(1); site.setVideoMonitor(1); // site.setSupportingFacilities(); site.setPrinterFlag(1); site.setBarrierFlag(1); site.setParkingLockFlag(1); // site.setElectricityFee(); site.setEquipmentOwnerName("途来电"); site.setSupplyType(1); site.setResidentNo("0110043462"); site.setWattHourMeterNo("MX01D05054000217"); site.setForwardPower(new BigDecimal("0")); site.setServiceFee("0:00-23:59:\"0.20\""); Calendar calendar1 = Calendar.getInstance(); SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyyMMdd"); String dateTime1 = dateFormat1.format(calendar1.getTime()); dateTime1 = dateTime1.substring(2); String timestampPart1 = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000); timestampPart1 = timestampPart1.replace(".", "").replace("E", ""); timestampPart1 = timestampPart1.substring(0, 4); site.setRecordUniqueNo(dateTime+timestampPart); site.setPayment(1); site.setSupportOrder(1); // site.setSerAreaCode(); site.setIsOpenSynchronization(0); site.setIsEnergyStorage(0); if (site.getProvince()==null){ continue; } Integer siteId = siteClient.addSiteTemp(site).getData(); sites.add(site); int i = 1; for (EquipmentInfos equipmentInfo : stationInfos.getEquipmentInfos()) { TChargingPile chargingPile = new TChargingPile(); Calendar calendar2 = Calendar.getInstance(); SimpleDateFormat dateFormat3 = new SimpleDateFormat("yyyyMMddHHmmss"); String dateTime4 = dateFormat3.format(calendar2.getTime()); dateTime4 = dateTime4.substring(2); String timestampPart5 = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000); timestampPart5 = timestampPart5.replace(".", "").replace("E", ""); timestampPart5 = timestampPart5.substring(0, 4); chargingPile.setCode(dateTime4+timestampPart5); chargingPile.setName(equipmentInfo.getEquipmentName()); chargingPile.setNumber(i); chargingPile.setType(equipmentInfo.getEquipmentType()); chargingPile.setSiteId(siteId); chargingPile.setPartnerId(26); chargingPile.setManufacturerCode(equipmentInfo.getManufacturerID()); chargingPile.setManufacturer(equipmentInfo.getManufacturerName()); chargingPile.setEquipmentType(equipmentInfo.getEquipmentModel()); String productionDate = equipmentInfo.getProductionDate(); if (StringUtils.hasLength(productionDate)){ // 转化为LocalDate chargingPile.setProductionDate(LocalDate.parse(productionDate)); } chargingPile.setRatedPower(new BigDecimal(120)); // chargingPile.setChargingStationNumber(); chargingPile.setStatus(1); // chargingPile.setIotdDeviceId(); chargingPile.setEquipmentClassification(1); // chargingPile.setEquipmentUniqueNumber(equipmentInfo.getEquipmentID()); chargingPile.setEquipmentLng(equipmentInfo.getEquipmentLng()+""); chargingPile.setEquipmentLat(equipmentInfo.getEquipmentLat()+""); // chargingPile.setEquipmentProductCode(); chargingPile.setEquipmentPurpose(1); chargingPile.setNewNationalStandard(1); chargingPile.setVinFlag(1); chargingPile.setName(site.getName()+chargingPile.getNumber()+"号桩"); Integer pileId = chargingPileClient.addPileTemp(chargingPile).getData(); piles.add(chargingPile); i++; int j = 1; for (ConnectorInfo connectorInfo : equipmentInfo.getConnectorInfos()) { TChargingGun gun = new TChargingGun(); gun.setConnectorID(connectorInfo.getConnectorID()); gun.setCode(j+""); gun.setSiteId(siteId); gun.setPartnerId(26); gun.setChargingPileId(pileId); gun.setName(connectorInfo.getConnectorName()); gun.setType(connectorInfo.getConnectorType()); gun.setStatus(2); gun.setChargeMode(connectorInfo.getGunType()); // todo 临时写死 gun.setAccountingStrategyId(232); gun.setUpperRatedVoltage(new BigDecimal("240")); gun.setLowerLimitOfRatedVoltage(new BigDecimal("200")); gun.setRatedCurrent(new BigDecimal("32")); gun.setRatedPower(new BigDecimal("7")); gun.setChargingPower(new BigDecimal("200")); gun.setParkingNumber("39"); gun.setParkingStatus(1); gun.setParkingLockState(0); gun.setNationalStandard("3"); // gun.setRemark(); // gun.setSoc(); gun.setFullNumber(chargingPile.getNumber()+j+""); gun.setEquipmentClassification(1); gun.setConstantVoltageUpperLimits(new BigDecimal("240")); gun.setConstantVoltageLowerLimits(new BigDecimal("200")); gun.setConstantCurrentUpperLimits(new BigDecimal("32")); gun.setConstantCurrentLowerLimits(new BigDecimal("7")); gun.setAuxPower(3); gun.setOpreateStatus(50); gun.setChargeMode(2); // gun.setOpreateHours(); guns.add(gun); chargingGunClient.addGunTemp(gun); j++; } } } log.info("新增的站点数据:{}", sites); log.info("新增的桩数据:{}", piles); log.info("新增的枪数据:{}", guns); return R.ok(); } private List<StationInfos> getStationInfos(){ String s = chargePileHttpUtil.queryStationsInfo(1, 199); // 将s字符串转化为json 然后转化为实体类PageInfo JSONObject jsonObject = JSONObject.parseObject(s); com.ruoyi.jianguan.domain.PageInfo pageInfo = JSON.parseObject(jsonObject.toJSONString(), com.ruoyi.jianguan.domain.PageInfo.class); List<StationInfos> result = new ArrayList<>(); int itemSize = pageInfo.getItemSize(); if(itemSize>199){ result.addAll(pageInfo.getStationInfos()); int i = itemSize / 199; // int k =1; for (int j = 2; j < i + 2; j++) { s = chargePileHttpUtil.queryStationsInfo(j, 199); // 将s字符串转化为json 然后转化为实体类PageInfo jsonObject = JSONObject.parseObject(s); pageInfo = JSON.parseObject(jsonObject.toJSONString(), com.ruoyi.jianguan.domain.PageInfo.class); result.addAll(pageInfo.getStationInfos()); // if (k==10){ // break; // } // k++; } }else { result.addAll(pageInfo.getStationInfos()); } return result; } private List<ChargeOrder> getOrderList(){ String s = chargePileHttpUtil.getOrderList(1, 199); // 将s字符串转化为json 然后转化为实体类PageInfo JSONObject jsonObject = JSONObject.parseObject(s); com.ruoyi.jianguan.domain.PageInfo pageInfo = JSON.parseObject(jsonObject.toJSONString(), com.ruoyi.jianguan.domain.PageInfo.class); List<ChargeOrder> result = new ArrayList<>(); int itemSize = pageInfo.getItemSize(); int temp = 0; if(itemSize>199){ result.addAll(pageInfo.getChargeOrders()); int i = itemSize / 199; for (int j = 2; j < i + 2; j++) { s = chargePileHttpUtil.getOrderList(j, 199); // 将s字符串转化为json 然后转化为实体类PageInfo jsonObject = JSONObject.parseObject(s); pageInfo = JSON.parseObject(jsonObject.toJSONString(), com.ruoyi.jianguan.domain.PageInfo.class); result.addAll(pageInfo.getChargeOrders()); if (temp==30){ break; } temp++; } }else { result.addAll(pageInfo.getChargeOrders()); } return result; } } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/domain/PageInfo.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.jianguan.domain; import com.ruoyi.jianguan.dto.ChargeOrder; import com.ruoyi.jianguan.dto.StationInfos; import io.swagger.annotations.ApiModel; import lombok.Data; import java.util.List; @Data @ApiModel(value = "分页对象") public class PageInfo { private int pageNo; private int pageCount; private int itemSize; private int total; private List<StationInfos> stationInfos; private List<ChargeOrder> chargeOrders; public PageInfo(int pageNo, int pageCount) { this.pageNo = pageNo; this.pageCount = pageCount; } public PageInfo() { } } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ChargeDetail.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(description = "充电详情实体类") public class ChargeDetail { @ApiModelProperty(value = "开始时间", example = "2017-08-08 11:29:29") private String DetailStartTime; @ApiModelProperty(value = "结束时间") private String DetailEndTime; @ApiModelProperty(value = "时段电价") private BigDecimal ElecPrice; @ApiModelProperty(value = "时段服务费价格") private BigDecimal SevicePrice; @ApiModelProperty(value = "时段充电量") private BigDecimal DetailPower; @ApiModelProperty(value = "时段电费") private BigDecimal DetailElecMoney; @ApiModelProperty(value = "时段服务费") private BigDecimal DetailSeviceMoney; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ChargeOrder.java
New file @@ -0,0 +1,59 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @ApiModel(description = "充电订单实体") @Data public class ChargeOrder { @ApiModelProperty(value = "启动充电序列号", example = "1726204696124142") private String startChargeSeq; @ApiModelProperty(value = "启动充电序列状态", example = "4") private Integer startChargeSeqStat; @ApiModelProperty(value = "连接器状态", example = "1") private Integer connectorStatus; @ApiModelProperty(value = "连接器ID", example = "9227171651855801") private String connectorID; @ApiModelProperty(value = "当前电流A", example = "0.0") private String currentA; @ApiModelProperty(value = "电压A", example = "0.0") private String voltageA; @ApiModelProperty(value = "电池电量百分比", example = "0.00") private String soc; @ApiModelProperty(value = "开始时间", example = "2024-09-13 13:18:16") private String startTime; @ApiModelProperty(value = "结束时间", example = "2026-01-27 10:42:05") private String endTime; @ApiModelProperty(value = "总功率", example = "0.0000") private String totalPower; @ApiModelProperty(value = "电费", example = "0.00") private String elecMoney; @ApiModelProperty(value = "服务费", example = "0.00") private String seviceMoney; @ApiModelProperty(value = "总费用", example = "0.00") private String totalMoney; @ApiModelProperty(value = "车辆识别码", example = "null") private String vin; @ApiModelProperty(value = "充电详情列表") private List<ChargeDetail> chargeDetails; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ChargeRecord.java
New file @@ -0,0 +1,48 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; @ApiModel(description = "充电记录实体类") @Data public class ChargeRecord { @ApiModelProperty(value = "充电订单号\n" + "\n", example = "395815801201708081212000874") private String startChargeSeq; @ApiModelProperty(value = "连接器ID", example = "3702120244206") private String connectorID; @ApiModelProperty(value = "开始时间", example = "2017-08-08 11:29:29") private String startTime; @ApiModelProperty(value = "结束时间", example = "2017-08-08 11:30:30") private String endTime; @ApiModelProperty(value = "总电量", example = "0.00") private BigDecimal totalPower; @ApiModelProperty(value = "电费总额", example = "0.00") private BigDecimal totalElecMoney; @ApiModelProperty(value = "服务费总额", example = "0.00") private BigDecimal totalSeviceMoney; @ApiModelProperty(value = "总金额", example = "0.00") private BigDecimal totalMoney; @ApiModelProperty(value = "停止原因", example = "2") private Integer stopReason; @ApiModelProperty(value = "总时长", example = "0") private Integer sumPeriod; @ApiModelProperty(value = "充电详情列表") private List<ChargeDetail> chargeDetails; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ChargeStartResponse.java
New file @@ -0,0 +1,43 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(description = "请求停止充电返回对象") public class ChargeStartResponse { @ApiModelProperty(value = "充电订单状态 1:启动中\n" + "\n" + "2:充电中\n" + "\n" + "3:停止中\n" + "\n" + "4:已结束\n" + "\n" + "5:未知") private int startChargeSeqStat; @ApiModelProperty(value = "充电订单号") private String startChargeSeq; @ApiModelProperty(value = "连接器ID", example = "3702120244401") private String connectorID; @ApiModelProperty(value = "操作结果0:成功 1:失败") private int succStat; @ApiModelProperty(value = "失败原因 0:无;\n" + "\n" + "1:此设备不存在;\n" + "\n" + "2:此设备离线:\n" + "\n" + "3:设备已停止充电;\n" + "\n" + "4~99:自定义") private int failReason; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ChargeStatus.java
New file @@ -0,0 +1,61 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @ApiModel(value = "充电订单对象") @Data public class ChargeStatus { @ApiModelProperty(value = "累计充电时间") private Long chargingTime; @ApiModelProperty(value = "充电站名称") private String stationName; @ApiModelProperty(value = "桩名称") private String pileName; @ApiModelProperty(value = "桩编号") private String equipmentID; @ApiModelProperty(value = "枪名称") private String gunName; @ApiModelProperty(value = "枪编号") private String connectorID; @ApiModelProperty(value = "电费总额") private Double elecMoney; @ApiModelProperty(value = "充电总度数") private Double totalPower; @ApiModelProperty(value = "充电订单状态 1:启动中; 2:充电中; 3:停止中;4:已结束 5:未知 6:启动失败") private Integer startChargeSeqStat; @ApiModelProperty(value = "电池剩余电量") private Integer soc; @ApiModelProperty(value = "启动充电失败原因") private String identCode; @ApiModelProperty(value = "订单id") private Long id; @ApiModelProperty(value = "充电订单号") private String startChargeSeq; @ApiModelProperty(value = "充电设备接口 状态 1:空闲; 2:占用(未充电) 3:占用(充电中) 4:占用(预约锁定); 255:故障") private Integer connectorStatus; @ApiModelProperty(value = "电流A相") private Double currentA; @ApiModelProperty(value = "电流B相") private Double currentB; @ApiModelProperty(value = "电流C相") private Double currentC; @ApiModelProperty(value = "电压A相") private Double voltageA; @ApiModelProperty(value = "电压B相") private Double voltageB; @ApiModelProperty(value = "电压C相") private Double voltageC; @ApiModelProperty(value = "充电开始时间") private String startTime; @ApiModelProperty(value = "充电采样时间") private String endTime; @ApiModelProperty(value = "服务费总额") private Double seviceMoney; @ApiModelProperty(value = "总金额") private Double totalMoney; @ApiModelProperty(value = "时段数N") private Integer sumPeriod; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ConnectorInfo.java
New file @@ -0,0 +1,42 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class ConnectorInfo { @ApiModelProperty(value = "连接器ID") private String connectorID; @ApiModelProperty(value = "连接器名称") private String connectorName; @ApiModelProperty(value = "连接器类型 1:家用插座(模式2);\n" + "2:交流接口插座(模式3,连 接方式B);\n" + "3:交流接口插头(带枪线, 模式3,连接方式C);\n" + "4:直流接口枪头(带枪线, 模式4);\n" + "5:无线充电座; 6:其他") private int connectorType; @ApiModelProperty(value = "电压上限") private int voltageUpperLimits; @ApiModelProperty(value = "电压下限") private int voltageLowerLimits; @ApiModelProperty(value = "电流") private int current; @ApiModelProperty(value = "功率") private double power; @ApiModelProperty(value = "停车位编号") private String parkNo; @ApiModelProperty(value = "状态 1空闲 2占用") private Integer status; @ApiModelProperty(value = "国家标准") private int nationalStandard; @ApiModelProperty(value = "枪类型 1=快充 2=慢充") private Integer gunType; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/ConnectorStatusInfos.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data public class ConnectorStatusInfos implements Serializable { @ApiModelProperty(value = "充电设备接口编码") private String ConnectorID; @ApiModelProperty(value = "接口状态 0:离网; 1:空闲; 2:占用(未充电); 3:占用(充电中); 4:占用(预约锁定); 255:故障") private Integer Status; @ApiModelProperty(value = "车位状态 0:未知 10:空闲 50:占用") private Integer ParkStatus; @ApiModelProperty(value = "地锁状态 0:未知 10:已解锁 50:已上锁") private Integer LockStatus; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/EquipmentInfos.java
New file @@ -0,0 +1,49 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel(value = "充电站对象") public class EquipmentInfos { @ApiModelProperty(value = "设备ID") private String equipmentID; @ApiModelProperty(value = "设备名称") private String equipmentName; @ApiModelProperty(value = "制造商ID") private String manufacturerID; @ApiModelProperty(value = "制造商名称") private String manufacturerName; @ApiModelProperty(value = "设备型号") private String equipmentModel; @ApiModelProperty(value = "生产日期") private String productionDate; @ApiModelProperty(value = "设备类型 1:直流设备; 2:交流设备;\n" + "3:交直流一体设备; 4:无线设备;\n" + "5:其他") private int equipmentType; @ApiModelProperty(value = "设备经度") private double equipmentLng; @ApiModelProperty(value = "设备纬度") private double equipmentLat; @ApiModelProperty(value = "功率") private double power; @ApiModelProperty(value = "枪类型 1=快充 2=慢充") private Integer gunType; @ApiModelProperty(value = "连接器信息列表") private List<ConnectorInfo> connectorInfos; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/OperatorData.java
New file @@ -0,0 +1,64 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel(description = "推送统一接收实体类") public class OperatorData { @ApiModelProperty(value = "运营商ID", example = "395815801") private String OperatorID; @ApiModelProperty(value = "数据内容", example = "MdtylP2lneRGc9XzcskU+I+sLFM0lW0OmxV4yRCW7Yoqy7XWGbN4g0sNMxyALuT59PsBJ1Oy4uNbCcvjTD2eJFnSSx0UDBOMu4KFkIjYrJp2IWroDD/960epFXvTEldX+c92DmO2HI9yUiVDYMHdt3P4in69l4RVRUy9Czos7H4T5GApCizy42jXEGv1UgON") private String Data; @ApiModelProperty(value = "时间戳", example = "20180517090848") private String TimeStamp; @ApiModelProperty(value = "序列号", example = "0001") private String Seq; @ApiModelProperty(value = "签名", example = "AD80102D05D1C31C2056DE130333A8CE") private String Sig; // Getters and Setters public String getOperatorID() { return OperatorID; } public void setOperatorID(String operatorID) { OperatorID = operatorID; } public String getData() { return Data; } public void setData(String data) { Data = data; } public String getTimeStamp() { return TimeStamp; } public void setTimeStamp(String timeStamp) { TimeStamp = timeStamp; } public String getSeq() { return Seq; } public void setSeq(String seq) { Seq = seq; } public String getSig() { return Sig; } public void setSig(String sig) { Sig = sig; } } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/PageInfo.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import lombok.Data; import java.util.List; @Data @ApiModel(value = "分页对象") public class PageInfo { private int pageNo; private int pageCount; private int itemSize; private int total; private List<StationInfos> stationInfos; private List<ChargeOrder> chargeOrders; public PageInfo(int pageNo, int pageCount) { this.pageNo = pageNo; this.pageCount = pageCount; } public PageInfo() { } } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/StationInfos.java
New file @@ -0,0 +1,116 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @ApiModel(value = "充电站对象") @Data public class StationInfos { @ApiModelProperty(value = "距离我xxKM") private String distance; @ApiModelProperty(value = "站点ID") private String stationID; @ApiModelProperty(value = "运营商ID") private String operatorID; @ApiModelProperty(value = "设备所有者ID") private String equipmentOwnerID; @ApiModelProperty(value = "站点名称") private String stationName; @ApiModelProperty(value = "国家代码") private String countryCode; @ApiModelProperty(value = "区域代码") private String areaCode; @ApiModelProperty(value = "地址") private String address; @ApiModelProperty(value = "站点电话") private String stationTel; @ApiModelProperty(value = "服务电话") private String serviceTel; @ApiModelProperty(value = "站点类型 1:公共; 50:个人;\n" + "100:公交(专用);\n" + "101:环卫(专用);\n" + "102:物流(专用);\n" + "103:出租车(专用); 255:其他") private int stationType; @ApiModelProperty(value = "站点状态 0:未知;\n" + "1:建设中;\n" + "5:关闭下线; 6:维护中;\n" + "50:正常使用") private int stationStatus; @ApiModelProperty(value = "停车位数量") private int parkNums; @ApiModelProperty(value = "站点经度") private double stationLng; @ApiModelProperty(value = "站点纬度") private double stationLat; @ApiModelProperty(value = "站点引导") private String siteGuide; @ApiModelProperty(value = "建设情况 1:居民区;\n" + "2:公共机构;\n" + "3:企事业单位;\n" + "4:写字楼;\n" + "5:工业园区; 6:交通枢纽;\n" + "7:大型文体设施; 8:城市绿地;\n" + "9:大型建筑配建停车场; 10:路边停车位;\n" + "11:城际高速服务区; 255:其他") private int construction; @ApiModelProperty(value = "匹配车型") private String matchCars; @ApiModelProperty(value = "停车场信息") private String parkInfo; @ApiModelProperty(value = "营业时间") private String busineHours; @ApiModelProperty(value = "电费价格说明") private String electricityFee; @ApiModelProperty(value = "服务费价格说明") private String serviceFee; @ApiModelProperty(value = "停车费价格说明") private String parkFee; @ApiModelProperty(value = "支付方式") private String payment; @ApiModelProperty(value = "是否支持预约") private int supportOrder; @ApiModelProperty(value = "备注") private String remark; @ApiModelProperty(value = "图片") private List<String> pictures; @ApiModelProperty(value = "快充总数") private Integer fastTotal; @ApiModelProperty(value = "快充数量") private Integer fast; @ApiModelProperty(value = "慢充数量") private Integer snow; @ApiModelProperty(value = "慢充总数") private Integer snowTotal; @ApiModelProperty(value = "设备信息列表") private List<EquipmentInfos> equipmentInfos; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/SupportOrder.java
New file @@ -0,0 +1,119 @@ package com.ruoyi.jianguan.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @ApiModel(description = "查询业务策略信息") @Data public class SupportOrder { @ApiModelProperty(value = "设备业务序列号", example = "123456789201805081628123456") private String EquipBizSeq; @ApiModelProperty(value = "连接器ID", example = "3702120244401") private String ConnectorID; @ApiModelProperty(value = "成功状态", example = "0") private int SuccStat; @ApiModelProperty(value = "失败原因", example = "0") private int FailReason; @ApiModelProperty(value = "总周期", example = "15") private int SumPeriod; @ApiModelProperty(value = "策略信息列表") private List<PolicyInfo> PolicyInfos; // Getters and Setters public String getEquipBizSeq() { return EquipBizSeq; } public void setEquipBizSeq(String equipBizSeq) { EquipBizSeq = equipBizSeq; } public String getConnectorID() { return ConnectorID; } public void setConnectorID(String connectorID) { ConnectorID = connectorID; } public int getSuccStat() { return SuccStat; } public void setSuccStat(int succStat) { SuccStat = succStat; } public int getFailReason() { return FailReason; } public void setFailReason(int failReason) { FailReason = failReason; } public int getSumPeriod() { return SumPeriod; } public void setSumPeriod(int sumPeriod) { SumPeriod = sumPeriod; } public List<PolicyInfo> getPolicyInfos() { return PolicyInfos; } public void setPolicyInfos(List<PolicyInfo> policyInfos) { PolicyInfos = policyInfos; } // Inner class for PolicyInfo @ApiModel(description = "策略信息") public static class PolicyInfo { @ApiModelProperty(value = "开始时间", example = "090000") private String StartTime; @ApiModelProperty(value = "电价", example = "0.5000") private String ElecPrice; @ApiModelProperty(value = "服务费", example = "0.4000") private String SevicePrice; // Getters and Setters public String getStartTime() { return StartTime; } public void setStartTime(String startTime) { StartTime = startTime; } public String getElecPrice() { return ElecPrice; } public void setElecPrice(String elecPrice) { ElecPrice = elecPrice; } public String getSevicePrice() { return SevicePrice; } public void setSevicePrice(String sevicePrice) { SevicePrice = sevicePrice; } } } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/dto/TContent.java
New file @@ -0,0 +1,47 @@ package com.ruoyi.jianguan.dto; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; /** * <p> * 部门表 * </p> * * @author stylefeng * @since 2017-07-11 */ @TableName("t_content") @Data public class TContent extends Model<TContent> { private static final long serialVersionUID = 1L; /** * 主键id */ @TableId(value="id", type= IdType.AUTO) private Integer id; /** * 类型1推送订单结束 2订单状态 3设备状态 */ private Integer type; /** * 内容 */ private String content; /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") @TableField("createTime") private Date createTime; } ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/ChargePileHttpUtil.java
New file @@ -0,0 +1,296 @@ package com.ruoyi.jianguan.util; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.utils.HttpUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.jianguan.constant.ChargePileInterface; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.List; import java.util.concurrent.TimeUnit; /** * 通用http发送方法 * * @author ruoyi */ @Component @Slf4j public class ChargePileHttpUtil { private static final String OperatorID = "MA01H3BQ3"; private static final String OperatorSecret = "f1331ef0b37c2d2"; private static final String SigSecret = "a6fedf0e1b27d6f8"; private static final String DataSecret = "50a61b93919c9606"; private static final String DataSecretIV = "7c8ac6861661d586"; // @Autowired // private RedisService redisService; /** * 验签 * @return */ public static boolean checkSig(){ return true; } /** * 获取token * @return */ public String getToken(){ String token =""; // String token = redisService.getCacheObject(ChargePileInterface.TOKEN_KEY); // if(StringUtils.hasLength(token)){ // return token; // } JSONObject jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("OperatorSecret", OperatorSecret); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_TOKEN, jsonObject.toJSONString()); log.info("获取token请求结果:{}",result); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); JSONObject tokenResult = JSONObject.parseObject(decrypt); token = tokenResult.getString("AccessToken"); // Integer TokenAvailableTime = tokenResult.getInteger("TokenAvailableTime"); // redisService.setCacheObject(ChargePileInterface.TOKEN_KEY,token,Long.valueOf(TokenAvailableTime)-60L, TimeUnit.SECONDS); return token; } /** * 获取充电桩 * @return */ public String queryStationsInfo(Integer PageNo, Integer PageSize){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("PageNo", PageNo); jsonObject.put("PageSize", PageSize); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_STATIONS_INFO, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } /** * 获取充电桩 * @return */ public String getOrderList(Integer PageNo, Integer PageSize){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("PageNo", PageNo); jsonObject.put("PageSize", PageSize); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_ORDER_LIST, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } /** * 获取充电桩 * @return */ public String queryStationStatus(List<String> StationIDs){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("StationIDs", StationIDs); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_STATION_STATUS, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } /** * 请求设备认证 * @param EquipAuthSeq 设备认证流水号 格式“运营商ID+唯一编号”,27字符 * @param ConnectorID 充电设备接口编码 格式“6位行政区编码,4位电站编码,3位终端编码”,13位字符 * @return */ public String queryEquipAuth(String EquipAuthSeq,String ConnectorID){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("EquipAuthSeq", EquipAuthSeq); jsonObject.put("ConnectorID", ConnectorID); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_EQUIP_AUTH, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } /** * 请求充电 * @param StartChargeSeq 充电订单号 格式“运营商ID+唯一编号”,27字符 * @param ConnectorID 充电设备接口编码 格式“6位行政区编码,4位电站编码,3位终端编码”,13位字符 * @param QRCode 二维码其他信息 二维码中含有自定义部分的,需要将二维码自定义部分的原文传输。 * @param PhoneNum 手机号 个人支付必传,格式确保正确 * @param PlateNum 车牌号 停车减免必传,格式确保正确 * @return */ public String queryStartCharge(String StartChargeSeq,String ConnectorID,String QRCode,String PhoneNum,String PlateNum,BigDecimal money){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("StartChargeSeq", StartChargeSeq); jsonObject.put("ConnectorID", ConnectorID); jsonObject.put("QRCode", QRCode); jsonObject.put("PhoneNum", PhoneNum); jsonObject.put("PlateNum", PlateNum); jsonObject.put("chargingAmt", money); String params = jsonObject.toJSONString(); String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_START_CHARGE, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } /** * 请求停止充电 * @param StartChargeSeq 充电订单号 格式“运营商ID+唯一编号”,27字符 * @param ConnectorID 充电设备接口编码 格式“6位行政区编码,4位电站编码,3位终端编码”,13位字符 * @return */ public String queryStopCharge(String StartChargeSeq,String ConnectorID){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("StartChargeSeq", StartChargeSeq); jsonObject.put("ConnectorID", ConnectorID); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_STOP_CHARGE, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } /** * 查询订单状态 */ public String queryEquipChargeStatus(String StartChargeSeq){ String token = getToken(); JSONObject jsonObject = new JSONObject(); jsonObject.put("StartChargeSeq", StartChargeSeq); String params = jsonObject.toJSONString(); // 参数加密 String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params); // 获取签名 String timeStamp = System.currentTimeMillis() + ""; SequenceGenerator generator = new SequenceGenerator(); String nextSequence = generator.getNextSequence(); String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret); jsonObject = new JSONObject(); jsonObject.put("OperatorID", OperatorID); jsonObject.put("Data", data); jsonObject.put("TimeStamp", timeStamp); jsonObject.put("Seq", nextSequence); jsonObject.put("Sig", hmacMD5); String result = HttpUtils.sendPost(ChargePileInterface.QUERY_EQUIP_CHARGE_STATUS, jsonObject.toJSONString(),token); String string = JSONObject.parseObject(result).getString("Data"); String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string); System.err.println(decrypt); return decrypt; } }