diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/OrderController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/OrderController.java index d5ee2b825..98443c8bb 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/OrderController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/OrderController.java @@ -50,7 +50,7 @@ public class OrderController extends BaseController { */ @PostMapping("/generateOrder") public RestApiResponse generateOrder(HttpServletRequest request, @RequestBody GenerateOrderDTO dto) { - logger.info("生成订单 param:{}", JSON.toJSONString(dto)); + // logger.info("生成订单 param:{}", JSON.toJSONString(dto)); RestApiResponse response; try { if ((StringUtils.isBlank(dto.getPileSn()) || StringUtils.isBlank(dto.getConnectorCode())) && StringUtils.isBlank(dto.getPileConnectorCode())) { @@ -80,7 +80,7 @@ public class OrderController extends BaseController { logger.error("生成订单 error, param:{}", JSON.toJSONString(dto), e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_GENERATE_ORDER_ERROR); } - logger.info("生成订单 result:{}", JSON.toJSONString(response)); + logger.info("生成订单, param:{}, result:{}", JSON.toJSONString(dto), JSON.toJSONString(response)); return response; } @@ -137,7 +137,7 @@ public class OrderController extends BaseController { */ @PostMapping("/getOrderList") public RestApiResponse getOrderInfo(HttpServletRequest request, @RequestBody UniAppQueryOrderDTO dto) { - logger.info("查询订单信息 param:{}", JSON.toJSONString(dto)); + // logger.info("查询订单信息 param:{}", JSON.toJSONString(dto)); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); @@ -154,7 +154,7 @@ public class OrderController extends BaseController { logger.error("查询订单信息 error", e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_GET_ORDER_INFO_BY_MEMBER_ID_ERROR); } - logger.info("查询订单信息, result:{}", JSON.toJSONString(response)); + logger.info("查询订单信息, param:{}, result:{}", JSON.toJSONString(dto), JSON.toJSONString(response)); return response; } @@ -167,7 +167,7 @@ public class OrderController extends BaseController { */ @PostMapping("/getOrderDetail") public RestApiResponse getOrderDetail(HttpServletRequest request, @RequestBody UniAppQueryOrderDTO dto) { - logger.info("小程序获取订单详情 param:{}", JSON.toJSONString(dto)); + // logger.info("小程序获取订单详情 param:{}", JSON.toJSONString(dto)); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); @@ -194,27 +194,27 @@ public class OrderController extends BaseController { * @param dto * @return */ - @PostMapping("/getOrderDetailV2") - public RestApiResponse getOrderDetailV2(HttpServletRequest request, @RequestBody UniAppQueryOrderDTO dto) { - logger.info("小程序获取订单详情V2 param:{}", JSON.toJSONString(dto)); - RestApiResponse response = null; - try { - String memberId = getMemberIdByAuthorization(request); - if (StringUtils.isBlank(memberId)) { - throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); - } - UniAppOrderDetailVO uniAppOrderDetail = orderService.getUniAppOrderDetailV2(dto.getOrderCode()); - response = new RestApiResponse<>(uniAppOrderDetail); - } catch (BusinessException e) { - logger.warn("小程序获取订单详情V2 warn", e); - response = new RestApiResponse<>(e.getCode(), e.getMessage()); - } catch (Exception e) { - logger.error("小程序获取订单详情V2 error", e); - response = new RestApiResponse<>(ReturnCodeEnum.CODE_GET_ORDER_DETAIL_ERROR); - } - logger.info("小程序获取订单详情V2, result:{}", JSON.toJSONString(response)); - return response; - } + // @PostMapping("/getOrderDetailV2") + // public RestApiResponse getOrderDetailV2(HttpServletRequest request, @RequestBody UniAppQueryOrderDTO dto) { + // logger.info("小程序获取订单详情V2 param:{}", JSON.toJSONString(dto)); + // RestApiResponse response = null; + // try { + // String memberId = getMemberIdByAuthorization(request); + // if (StringUtils.isBlank(memberId)) { + // throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); + // } + // UniAppOrderDetailVO uniAppOrderDetail = orderService.getUniAppOrderDetailV2(dto.getOrderCode()); + // response = new RestApiResponse<>(uniAppOrderDetail); + // } catch (BusinessException e) { + // logger.warn("小程序获取订单详情V2 warn", e); + // response = new RestApiResponse<>(e.getCode(), e.getMessage()); + // } catch (Exception e) { + // logger.error("小程序获取订单详情V2 error", e); + // response = new RestApiResponse<>(ReturnCodeEnum.CODE_GET_ORDER_DETAIL_ERROR); + // } + // logger.info("小程序获取订单详情V2, result:{}", JSON.toJSONString(response)); + // return response; + // } /** * 根据订单号查询充电桩启动状态 @@ -268,7 +268,7 @@ public class OrderController extends BaseController { */ @PostMapping("/closeStartFailedOrder") public RestApiResponse closeStartFailedOrder(@RequestBody QueryOrderDTO dto) { - logger.info("关闭支付未启动的订单 param:{}", JSON.toJSONString(dto)); + // logger.info("关闭支付未启动的订单 param:{}", JSON.toJSONString(dto)); RestApiResponse response = null; try { orderService.closeStartFailedOrder(dto); @@ -277,7 +277,7 @@ public class OrderController extends BaseController { logger.error("关闭支付未启动的订单 error", e); response = new RestApiResponse<>("00300002", "关闭支付未启动的订单异常"); } - logger.info("关闭支付未启动的订单 result:{}", response); + logger.info("关闭支付未启动的订单, param:{}, result:{}", JSON.toJSONString(dto), response); return response; } @@ -305,6 +305,7 @@ public class OrderController extends BaseController { logger.error("查询未开发票订单 error", e); response = new RestApiResponse<>("00300003", "查询未开发票订单异常"); } + logger.info("查询未开发票订单 param:{}, result:{}", JSON.toJSONString(dto), JSON.toJSONString(response)); return response; } @@ -317,7 +318,7 @@ public class OrderController extends BaseController { */ @PostMapping("/queryUninvoicedStationList") public RestApiResponse queryUninvoicedStationList(HttpServletRequest request, @RequestBody QueryOrderDTO dto) { - logger.info("查询未开发票的站点list param:{}", JSON.toJSONString(dto)); + // logger.info("查询未开发票的站点list param:{}", JSON.toJSONString(dto)); RestApiResponse response; try { String memberId = getMemberIdByAuthorization(request); @@ -334,6 +335,7 @@ public class OrderController extends BaseController { logger.error("查询未开发票的站点list error", e); response = new RestApiResponse<>("00300004", "查询未开发票的站点list异常"); } + logger.info("查询未开发票的站点list param:{}, result:{}", JSON.toJSONString(dto), JSON.toJSONString(response)); return response; } diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/PersonPileController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/PersonPileController.java index 99b0d8075..ed35d10e2 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/PersonPileController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/PersonPileController.java @@ -13,6 +13,8 @@ import com.jsowell.common.util.StringUtils; import com.jsowell.pile.dto.*; import com.jsowell.pile.service.PileBasicInfoService; import com.jsowell.pile.service.PileMerchantInfoService; +import com.jsowell.pile.service.PileReservationInfoService; +import com.jsowell.pile.vo.PileReservationInfoVO; import com.jsowell.pile.vo.uniapp.customer.PersonPileConnectorSumInfoVO; import com.jsowell.pile.vo.uniapp.customer.PersonPileRealTimeVO; import com.jsowell.pile.vo.uniapp.customer.PersonalPileInfoVO; @@ -43,6 +45,9 @@ public class PersonPileController extends BaseController { @Autowired private PileBasicInfoService pileBasicInfoService; + @Autowired + private PileReservationInfoService pileReservationInfoService; + /** * 用户绑定个人桩 @@ -117,7 +122,7 @@ public class PersonPileController extends BaseController { if (StringUtils.isNotBlank(appId)) { String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByWxAppId(appId); if (StringUtils.isNotBlank(firstLevelMerchantId)) { - dto.setMerchantId(firstLevelMerchantId); + dto.setFirstLevelMerchantId(firstLevelMerchantId); } } String memberId = getMemberIdByAuthorization(request); @@ -136,6 +141,8 @@ public class PersonPileController extends BaseController { } + + /** * 通过memberId查个人桩列表 *

@@ -162,7 +169,6 @@ public class PersonPileController extends BaseController { /** * 获取枪口实时数据 - *

* http://localhost:8080/uniapp/personalPile/getConnectorRealTimeInfo * * @param request @@ -171,7 +177,6 @@ public class PersonPileController extends BaseController { */ @PostMapping("/getConnectorRealTimeInfo") public RestApiResponse getConnectorRealTimeInfo(HttpServletRequest request, @RequestBody QueryPersonPileDTO dto) { - logger.info("获取个人桩枪口实时数据 params:{}", JSON.toJSONString(dto)); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); @@ -179,13 +184,13 @@ public class PersonPileController extends BaseController { PersonPileRealTimeVO connectorRealTimeInfo = pileService.getConnectorRealTimeInfo(dto); response = new RestApiResponse<>(connectorRealTimeInfo); } catch (BusinessException e) { - logger.error("获取个人桩枪口实时数据 error", e); + logger.error("获取个人桩枪口实时数据 warn:{}", e.getMessage()); response = new RestApiResponse<>(e.getCode(), e.getMessage()); } catch (Exception e) { logger.error("获取个人桩枪口实时数据 error", e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_GET_PERSONAL_PILE_CONNECTOR_INFO_ERROR); } - logger.info("获取个人桩枪口实时数据 result:{}", response); + logger.info("获取个人桩枪口实时数据 params:{}, result:{}", JSON.toJSONString(dto), JSON.toJSONString(response)); return response; } @@ -248,7 +253,7 @@ public class PersonPileController extends BaseController { } /** - * 个人桩启动充电 + * 个人桩启动充电/个人桩一键启动 * http://localhost:8080/uniapp/personalPile/startPersonalPileCharging */ @PostMapping("/startPersonalPileCharging") @@ -268,25 +273,56 @@ public class PersonPileController extends BaseController { logger.error("个人桩启动充电error, params:{}", dto, e); } catch (Exception e) { logger.error("个人桩启动充电error, params:{}", dto, e); - response = new RestApiResponse<>(ReturnCodeEnum.CODE_CREATE_RESERVED_ERROR); + response = new RestApiResponse<>(ReturnCodeEnum.CODE_START_PERSONAL_PILE_CHARGING_ERROR); } logger.info("个人桩启动充电params:{}, result:{}", dto, response); return response; } + /** + * 个人桩停止充电 + * http://localhost:8080/uniapp/personalPile/personPileStopCharging + * 管理员可以停自己启动的和别人启动的 + * 其他人员只能停止自己启动的 + */ + @PostMapping("/personPileStopCharging") + public RestApiResponse personPileStopCharging(HttpServletRequest request, @RequestBody PersonPileStopChargingDTO dto) { + RestApiResponse response = null; + try { + String appId = request.getHeader("appId"); + if (StringUtils.isNotBlank(appId)) { + String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByWxAppId(appId); + if (StringUtils.isNotBlank(firstLevelMerchantId)) { + dto.setFirstLevelMerchantId(firstLevelMerchantId); + } + } + String memberId = getMemberIdByAuthorization(request); + dto.setMemberId(memberId); + pileReservationInfoService.personPileStopCharging(dto); + response = new RestApiResponse<>(); + } catch (BusinessException e) { + logger.error("个人桩停止充电error", e); + response = new RestApiResponse<>(e.getCode(), e.getMessage()); + } catch (Exception e) { + logger.error("个人桩停止充电error", e); + response = new RestApiResponse<>(ReturnCodeEnum.CODE_PERSON_PILE_STOP_CHARGING_ERROR); + } + return response; + } + + /** * 添加预约充电 * http://localhost:8080/uniapp/personalPile/createReserved */ @PostMapping("/createReserved") public RestApiResponse createReserved(HttpServletRequest request, @RequestBody CreateReservedDTO dto) { - // logger.info("修改预约充电状态params:{}", dto); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); dto.setMemberId(memberId); - int reservedId = pileService.createReserved(dto); + int reservedId = pileReservationInfoService.createReservation(dto); response = new RestApiResponse<>(ImmutableMap.of("reservedId", reservedId)); } catch (BusinessException e) { logger.error("添加预约充电error, params:{}", dto, e); @@ -305,12 +341,11 @@ public class PersonPileController extends BaseController { */ @PostMapping("/queryReservedList") public RestApiResponse queryReservedList(HttpServletRequest request, @RequestBody PileReservationDTO dto) { - // logger.info("修改预约充电状态params:{}", dto); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); dto.setMemberId(memberId); - PageResponse pageResponse = pileService.queryReservedList(dto); + PageResponse pageResponse = pileReservationInfoService.queryReservationList(dto); response = new RestApiResponse<>(pageResponse); } catch (BusinessException e) { logger.error("查询预约列表error, params:{}", dto, e); @@ -323,18 +358,40 @@ public class PersonPileController extends BaseController { return response; } + /** + * 修改预约充电 + * http://localhost:8080/uniapp/personalPile/updateReservation + */ + @PostMapping("/updateReservation") + public RestApiResponse updateReservation(HttpServletRequest request, @RequestBody PileReservationDTO dto) { + RestApiResponse response = null; + try { + String memberId = getMemberIdByAuthorization(request); + dto.setMemberId(memberId); + pileReservationInfoService.updateReservation(dto); + response = new RestApiResponse<>(); + } catch (BusinessException e) { + logger.error("修改预约充电信息error, params:{}", dto, e); + response = new RestApiResponse<>(e.getCode(), e.getMessage()); + } catch (Exception e) { + logger.error("修改预约充电信息error, params:{}", dto, e); + response = new RestApiResponse<>(ReturnCodeEnum.CODE_UPDATE_RESERVED_STATUS_ERROR); + } + logger.info("修改预约充电信息params:{}, result:{}", dto, response); + return response; + } + /** * 修改预约充电状态 * http://localhost:8080/uniapp/personalPile/updateReservedStatus */ @PostMapping("/updateReservedStatus") public RestApiResponse updateReservedStatus(HttpServletRequest request, @RequestBody PileReservationDTO dto) { - // logger.info("修改预约充电状态params:{}", dto); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); dto.setMemberId(memberId); - pileService.updateReservedStatus(dto); + pileReservationInfoService.updateReservationStatus(dto); response = new RestApiResponse<>(); } catch (BusinessException e) { logger.error("修改预约充电状态error, params:{}", dto, e); @@ -353,23 +410,43 @@ public class PersonPileController extends BaseController { */ @PostMapping("/deleteReservation") public RestApiResponse deleteReservation(HttpServletRequest request, @RequestBody PileReservationDTO dto) { - // logger.info("修改预约充电状态params:{}", dto); RestApiResponse response = null; try { String memberId = getMemberIdByAuthorization(request); dto.setMemberId(memberId); - pileService.deleteReservation(dto); + pileReservationInfoService.deleteReservation(dto); response = new RestApiResponse<>(); } catch (BusinessException e) { - logger.error("修改预约充电状态error, params:{}", dto, e); + logger.error("删除预约error, params:{}", dto, e); response = new RestApiResponse<>(e.getCode(), e.getMessage()); } catch (Exception e) { - logger.error("修改预约充电状态error, params:{}", dto, e); + logger.error("删除预约error, params:{}", dto, e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_UPDATE_RESERVED_STATUS_ERROR); } - logger.info("修改预约充电状态params:{}, result:{}", dto, response); + logger.info("删除预约params:{}, result:{}", dto, response); return response; } - + /** + * 根据充电桩查询预约信息 + * http://localhost:8080/uniapp/personalPile/queryReservationInfo + */ + @PostMapping("/queryReservationInfo") + public RestApiResponse queryReservationInfo(HttpServletRequest request, @RequestBody PileReservationDTO dto) { + RestApiResponse response = null; + try { + String memberId = getMemberIdByAuthorization(request); + dto.setMemberId(memberId); + PileReservationInfoVO vo = pileReservationInfoService.queryReservationInfo(dto); + response = new RestApiResponse<>(vo); + } catch (BusinessException e) { + logger.error("根据充电桩查询预约状态error, params:{}", dto, e); + response = new RestApiResponse<>(e.getCode(), e.getMessage()); + } catch (Exception e) { + logger.error("根据充电桩查询预约状态error, params:{}", dto, e); + response = new RestApiResponse<>(ReturnCodeEnum.CODE_QUERY_RESERVATION_STATUS_ERROR); + } + logger.info("根据充电桩查询预约状态params:{}, result:{}", dto, response); + return response; + } } diff --git a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java index 765b38bb6..a7a2f25ff 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/OrderService.java @@ -557,12 +557,29 @@ public class OrderService { throw new BusinessException(ReturnCodeEnum.CODE_QUERY_ORDER_INFO_IS_NULL); } + String pileSn = orderBasicInfo.getPileSn(); + String connectorCode = orderBasicInfo.getConnectorCode(); + + // 异步发送获取实时数据指令 + if (StringUtils.equals(orderBasicInfo.getOrderStatus(), OrderStatusEnum.IN_THE_CHARGING.getValue())) { + CompletableFuture.runAsync(() -> { + try { + pileRemoteService.getRealTimeMonitorData(pileSn, connectorCode); + } catch (Exception e) { + log.error("异步发送获取实时数据指令error", e); + } + }); + } + vo.setOrderCode(orderBasicInfo.getOrderCode()); - vo.setPileSn(orderBasicInfo.getPileSn()); - vo.setConnectorCode(orderBasicInfo.getConnectorCode()); - vo.setPileConnectorCode(orderBasicInfo.getPileSn() + orderBasicInfo.getConnectorCode()); + vo.setPileSn(pileSn); + vo.setConnectorCode(connectorCode); + vo.setPileConnectorCode(pileSn + connectorCode); String orderStatus = orderBasicInfo.getOrderStatus(); vo.setOrderStatus(orderStatus); + // 订单状态描述 + String orderStatusDescribe = orderBasicInfoService.transformOrderStatusDescribe(orderStatus, orderBasicInfo.getPayStatus()); + vo.setOrderStatusDescribe(orderStatusDescribe); if (Objects.nonNull(orderBasicInfo.getChargeStartTime())) { vo.setStartChargingTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, orderBasicInfo.getChargeStartTime())); } @@ -583,9 +600,6 @@ public class OrderService { if (StringUtils.isNotBlank(String.valueOf(stationInfo.getOccupyFee()))) { vo.setOccupyFee(stationInfo.getOccupyFee()); } - // 订单状态描述 - String orderStatusDescribe = orderBasicInfoService.transformOrderStatusDescribe(orderStatus, orderBasicInfo.getPayStatus()); - vo.setOrderStatusDescribe(orderStatusDescribe); // 获取充电桩枪口信息 PileConnectorDetailVO pileConnectorDetailVO = pileService.queryPileConnectorDetail(vo.getPileConnectorCode()); @@ -661,19 +675,6 @@ public class OrderService { return vo; } - /** - * 小程序订单详情V2 - * - * @param orderCode - * @return - */ - public UniAppOrderDetailVO getUniAppOrderDetailV2(String orderCode) { - UniAppOrderDetailVO resultVO = new UniAppOrderDetailVO(); - - - return resultVO; - } - /** * 根据订单号查询充电桩启动状态 * diff --git a/jsowell-admin/src/main/java/com/jsowell/service/PileService.java b/jsowell-admin/src/main/java/com/jsowell/service/PileService.java index a125815ee..96d879290 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/PileService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/PileService.java @@ -20,7 +20,6 @@ import com.jsowell.pile.util.SnUtils; import com.jsowell.pile.service.*; import com.jsowell.pile.transaction.dto.PileTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; -import com.jsowell.pile.vo.PileReservedVO; import com.jsowell.pile.vo.base.ConnectorInfoVO; import com.jsowell.pile.vo.base.MerchantInfoVO; import com.jsowell.pile.vo.base.PileInfoVO; @@ -40,7 +39,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; -import java.sql.Time; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -339,7 +337,7 @@ public class PileService { */ public void adminIssuePile(PileMemberBindingDTO dto) { // 通过前端传的手机号查询是否有此用户 - MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getPhoneNumber(), dto.getMerchantId()); + MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getPhoneNumber(), dto.getFirstLevelMerchantId()); if (memberBasicInfo == null) { // 为空说明此用户未注册平台账号 throw new BusinessException(ReturnCodeEnum.CODE_USER_IS_NOT_REGISTER); @@ -377,7 +375,7 @@ public class PileService { PileMemberRelation info = new PileMemberRelation(); info.setPileSn(dto.getPileSn()); info.setMemberId(memberBasicInfo.getMemberId()); - info.setType("2"); + info.setType(Constants.TWO); pileMemberRelationService.insertPileMemberRelation(info); } } @@ -390,7 +388,7 @@ public class PileService { public PersonPileRealTimeVO getConnectorRealTimeInfo(QueryPersonPileDTO dto) { // 根据memberId查出该用户 正在充电、个人桩启动(白名单支付方式)的订单号 OrderBasicInfo orderBasicInfo = OrderBasicInfo.builder() - .memberId(dto.getMemberId()) + // .memberId(dto.getMemberId()) .orderStatus(OrderStatusEnum.IN_THE_CHARGING.getValue()) .pileConnectorCode(dto.getPileConnectorCode()) .payMode(OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue()) // 3- 白名单支付 @@ -399,7 +397,6 @@ public class PileService { if (basicInfo == null){ throw new BusinessException(ReturnCodeEnum.CODE_NO_CHARGING_ORDER_ERROR); } - String orderCode = basicInfo.getOrderCode(); // 根据订单号从redis中获取实时数据信息(默认时间倒叙排列,所以取第一条) List chargingRealTimeData = orderBasicInfoService.getChargingRealTimeData(basicInfo.getTransactionCode()); if (CollectionUtils.isEmpty(chargingRealTimeData)) { @@ -414,6 +411,8 @@ public class PileService { .instantCurrent(realTimeMonitorData.getOutputCurrent()) .instantVoltage(realTimeMonitorData.getOutputVoltage()) .instantPower(realTimeMonitorData.getOutputPower()) + .status(orderBasicInfo.getOrderStatus()) + .soc(realTimeMonitorData.getSOC()) .build(); return vo; } @@ -569,60 +568,6 @@ public class PileService { } } - public int createReserved(CreateReservedDTO dto) { - PileReservationInfo reservedInfo = new PileReservationInfo(); - reservedInfo.setMemberId(dto.getMemberId()); - reservedInfo.setPileSn(dto.getPileSn()); - reservedInfo.setPileConnectorCode(dto.getPileConnectorCode()); - reservedInfo.setStatus(Constants.ZERO); // 默认未生效 - // reservedInfo.setStartTime(DateUtils.parseDate(dto.getStartTime())); - reservedInfo.setStartTime(Time.valueOf(dto.getStartTime())); - // reservedInfo.setEndTime(DateUtils.parseDate(dto.getEndTime())); - if (StringUtils.isNotBlank(dto.getEndTime())) { - reservedInfo.setEndTime(Time.valueOf(dto.getEndTime())); - } - if (StringUtils.isNotBlank(dto.getFreq())) { - reservedInfo.setReservationType("recurring"); - reservedInfo.setFreq(dto.getFreq()); - } else { - reservedInfo.setReservationType("single"); - reservedInfo.setFreq(null); - } - reservedInfo.setCreateBy(dto.getMemberId()); - pileReservationInfoService.insertSelective(reservedInfo); - return reservedInfo.getId(); - } - - public PageResponse queryReservedList(PileReservationDTO dto) { - int pageNo = dto.getPageNo() == null ? Constants.one : dto.getPageNo(); - int pageSize = dto.getPageSize() == null ? 10 : dto.getPageSize(); - PageHelper.startPage(pageNo, pageSize); - List list = pileReservationInfoService.getReservationsByMemberIdAndPileSn(dto.getMemberId(), dto.getPileSn()); - PageInfo pageInfo = new PageInfo<>(list); - - PageResponse pageResponse = new PageResponse(); - pageResponse.setPageNum(pageInfo.getPageNum()); - pageResponse.setPageSize(pageInfo.getPageSize()); - pageResponse.setPages(pageInfo.getPages()); - pageResponse.setTotal(pageInfo.getTotal()); - - List resultList = Lists.newArrayList(); - for (PileReservationInfo reservedInfo : pageInfo.getList()) { - resultList.add( - PileReservedVO.builder() - .reservedId(reservedInfo.getId() + "") - .pileSn(reservedInfo.getPileSn()) - .startTime(reservedInfo.getStartTime().toString()) - .endTime(reservedInfo.getEndTime().toString()) - .freq(reservedInfo.getFreq()) - .status(reservedInfo.getStatus()) - .build() - ); - } - pageResponse.setList(resultList); - return pageResponse; - } - public void deleteReservation(PileReservationDTO dto) { pileReservationInfoService.deleteReservation(dto); } @@ -656,4 +601,5 @@ public class PileService { // System.out.println(i); return String.valueOf(i); } + } diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderPileOccupyController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderPileOccupyController.java index 6bf4fb91e..437ea31b8 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderPileOccupyController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/OrderPileOccupyController.java @@ -111,4 +111,14 @@ public class OrderPileOccupyController extends BaseController { // { // return toAjax(orderPileOccupyService.deleteByPrimaryKey(ids)); // } + + /** + * 重新计算占桩金额 + * retryCalculateOccupyPileOrderAmount + */ + @PreAuthorize("@ss.hasPermi('pile:occupy:edit')") + @PostMapping("/retryCalculateOccupyPileOrderAmount") + public AjaxResult retryCalculateOccupyPileOrderAmount(@RequestBody MakeOrderFreeDTO dto) { + return toAjax(orderPileOccupyService.retryCalculateOccupyPileOrderAmount(dto.getOccupyCode())); + } } diff --git a/jsowell-admin/src/main/resources/application.yml b/jsowell-admin/src/main/resources/application.yml index de9bc248c..a11aaecb3 100644 --- a/jsowell-admin/src/main/resources/application.yml +++ b/jsowell-admin/src/main/resources/application.yml @@ -106,6 +106,7 @@ weixin: sendMsg: startChargingTmpId: BGgZe98QHr0I1S1GrtGps0y3uhvURtQNkbMAzI2D8g8 stopChargingTmpId: UyBPbADlZfsCj89rh_xvfR2ZP1iwtmPcMFA0sUOJwog + startupResultTmpId: BGgZe98QHr0I1S1GrtGps-Av8-Y6WoD2Ny8DZWvdhoQ #Sim卡信息 xunzhong: diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 7885257f1..71a3f4076 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -260,6 +260,17 @@ public class SpringBootTestController { @Autowired private PileReservationInfoService pileReservationInfoService; + @Test + public void personPileStopChargingTest() { + String memberId = "84085683"; + String pileConnectorCode = "8823000000141001"; + PersonPileStopChargingDTO dto = PersonPileStopChargingDTO.builder() + .memberId(memberId) + .pileConnectorCode(pileConnectorCode) + .build(); + pileReservationInfoService.personPileStopCharging(dto); + } + @Test public void selectMemberPlateNumberRelationTest() { String memberId = "25950857"; diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java index 8b67ff87c..81349b3fc 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java +++ b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/YKCFrameTypeCode.java @@ -71,8 +71,11 @@ public enum YKCFrameTypeCode { BILLING_TEMPLATE_SETTING_CODE(0x58, "计费模型设置"), BILLING_TEMPLATE_SETTING_ANSWER_CODE(0x57, "计费模型设置应答"), - RESERVE_CHARGING_CODE(0x60, "预约充电设置"), - RESERVE_CHARGING_ANSWER_CODE(0x59, "预约充电设置响应"), + RESERVATION_CHARGING_CODE(0x60, "预约充电设置"), + RESERVATION_CHARGING_ANSWER_CODE(0x59, "预约充电设置响应"), // RESERVATION + + RESERVATION_CHARGING_STARTUP_RESULT_ANSWER_CODE(0x64, "预约充电启动结果上传响应"), // 平台响应 + RESERVATION_CHARGING_STARTUP_RESULT_CODE(0x65, "预约充电启动结果上传"), // 桩 -> 平台 GROUND_LOCK_DATA_UPLOAD_CODE(0x61, "地锁数据上送"), REMOTE_CONTROL_GROUND_LOCK_LIFTING_CODE(0x62, "遥控地锁升降"), @@ -167,8 +170,12 @@ public enum YKCFrameTypeCode { // 交易记录 TRANSACTION_RECORDS(TRANSACTION_RECORDS_CODE.getCode(), TRANSACTION_RECORDS_CONFIRM_CODE.getCode()), // 远程账户更新 - REMOTE_ACCOUNT_BALANCE_UPDATE(REMOTE_ACCOUNT_BALANCE_UPDATE_CODE.getCode(), REMOTE_ACCOUNT_BALANCE_UPDATE_ANSWER_CODE.getCode()); + REMOTE_ACCOUNT_BALANCE_UPDATE(REMOTE_ACCOUNT_BALANCE_UPDATE_CODE.getCode(), REMOTE_ACCOUNT_BALANCE_UPDATE_ANSWER_CODE.getCode()), + // 预约充电启动结果 + RESERVATION_CHARGING_STARTUP_RESULT(RESERVATION_CHARGING_STARTUP_RESULT_CODE.getCode(), RESERVATION_CHARGING_STARTUP_RESULT_ANSWER_CODE.getCode()), + + ; // 请求帧类型 private int requestFrameType; diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java index 72c8b2676..f877b4d3a 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java @@ -153,7 +153,7 @@ public enum ReturnCodeEnum { CODE_USER_HAS_BEEN_THIS_PILE("00400004", "此用户已绑定该桩,请检查!"), - CODE_NO_CHARGING_ORDER_ERROR("00400005", "当前无正在充电的订单"), + CODE_NO_CHARGING_ORDER_ERROR("00400005", "当前无正在充电的记录"), CODE_NO_REAL_TIME_INFO("00400006", "未查到充电枪口实时信息"), @@ -179,6 +179,12 @@ public enum ReturnCodeEnum { CODE_RESERVATION_ALREADY_EXISTS_ERROR("00400017", "已经存在生效中的预约,请关闭后再试"), + CODE_PERSON_PILE_STOP_CHARGING_ERROR("00400018", "个人桩停止充电异常"), + + CODE_QUERY_RESERVATION_STATUS_ERROR("00400019", "根据充电桩查询预约状态异常"), + + CODE_START_PERSONAL_PILE_CHARGING_ERROR("00400020", "个人桩启动充电异常"), + /* 个人桩 end */ CODE_THIS_CARNO_HAS_BEEN_BINDING("00500001", "当前车牌号已经绑定,请检查!"), diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReserveChargingHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java similarity index 83% rename from jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReserveChargingHandler.java rename to jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java index b77bcb6df..ea06e0a96 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReserveChargingHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingHandler.java @@ -12,9 +12,9 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -public class ReserveChargingHandler extends AbstractHandler{ +public class ReservationChargingHandler extends AbstractHandler{ - private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVE_CHARGING_CODE.getBytes()); + private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_CODE.getBytes()); @Override public void afterPropertiesSet() throws Exception { diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java new file mode 100644 index 000000000..97ef357c2 --- /dev/null +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingResponseHandler.java @@ -0,0 +1,70 @@ +package com.jsowell.netty.handler.yunkuaichong; + +import com.jsowell.common.core.domain.ykc.YKCDataProtocol; +import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode; +import com.jsowell.common.util.BytesUtil; +import com.jsowell.common.util.YKCUtils; +import com.jsowell.netty.factory.YKCOperateFactory; +import io.netty.channel.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 预约充电响应 + */ +@Slf4j +@Component +public class ReservationChargingResponseHandler extends AbstractHandler{ + + private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_ANSWER_CODE.getBytes()); + + @Override + public void afterPropertiesSet() throws Exception { + YKCOperateFactory.register(type, this); + } + + @Override + public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, Channel channel) { + // log.info("[====远程更新应答====] param:{}, channel:{}", JSON.toJSONString(ykcDataProtocol), channel.toString()); + // 消息体 + byte[] msgBody = ykcDataProtocol.getMsgBody(); + + int startIndex = 0; + int length = 16; + + // 交易流水号 + byte[] transactionCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String transactionCode = BytesUtil.bcd2Str(transactionCodeByteArr); + + // 桩编码 + startIndex += length; + length = 7; + byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String pileSn = BytesUtil.bcd2Str(pileSnByteArr); + + // 保存时间 + saveLastTimeAndCheckChannel(pileSn, channel); + + // 枪口号 + startIndex += length; + length = 1; + byte[] connectorCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String connectorCode = BytesUtil.bcd2Str(connectorCodeByteArr); + + // 启动结果 + startIndex += length; + length = 1; + byte[] resultCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String resultCode = BytesUtil.bcd2Str(resultCodeByteArr); + + // 失败原因 + startIndex += length; + length = 1; + byte[] failedReasonByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String failedReason = BytesUtil.bcd2Str(failedReasonByteArr); + + log.info("0x59预约充电响应, 交易流水号:{}, 桩SN:{}, 枪口号:{}, 结果:{}, 失败原因:{}", + transactionCode, pileSn, connectorCode, resultCode, failedReason); + return null; + } +} diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingStartupResultHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingStartupResultHandler.java new file mode 100644 index 000000000..ba3cd3944 --- /dev/null +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReservationChargingStartupResultHandler.java @@ -0,0 +1,105 @@ +package com.jsowell.netty.handler.yunkuaichong; + +import com.alibaba.fastjson2.JSON; +import com.google.common.primitives.Bytes; +import com.jsowell.common.constant.Constants; +import com.jsowell.common.core.domain.ykc.YKCDataProtocol; +import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode; +import com.jsowell.common.util.BytesUtil; +import com.jsowell.common.util.YKCUtils; +import com.jsowell.netty.factory.YKCOperateFactory; +import com.jsowell.pile.dto.ReservationChargingStartupResult; +import com.jsowell.pile.service.PileBasicInfoService; +import io.netty.channel.Channel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 预约充电启动结果上送 + */ +@Slf4j +@Component +public class ReservationChargingStartupResultHandler extends AbstractHandler{ + + private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_STARTUP_RESULT_CODE.getBytes()); + + @Autowired + private PileBasicInfoService pileBasicInfoService; + + @Override + public void afterPropertiesSet() throws Exception { + YKCOperateFactory.register(type, this); + } + + @Override + public byte[] supplyProcess(YKCDataProtocol ykcDataProtocol, Channel channel) { + log.info("[===预约充电启动结果上送===] param:{}, channel:{}", JSON.toJSONString(ykcDataProtocol), channel.toString()); + // 消息体 + byte[] msgBody = ykcDataProtocol.getMsgBody(); + + int startIndex = 0; + int length = 16; + + // 交易流水号 + byte[] transactionCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String transactionCode = BytesUtil.bcd2Str(transactionCodeByteArr); + + // 桩编码 + startIndex += length; + length = 7; + byte[] pileSnByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String pileSn = BytesUtil.bcd2Str(pileSnByteArr); + + // 保存时间 + saveLastTimeAndCheckChannel(pileSn, channel); + + // 枪号 + startIndex += length; + length = 1; + byte[] connectorCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String connectorCode = BytesUtil.bcd2Str(connectorCodeByteArr); + + // vin + startIndex += length; + length = 17; + byte[] vinCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String vinCode = BytesUtil.bcd2Str(vinCodeByteArr); + + // 启动结果 + startIndex += length; + length = 1; + byte[] startupResultByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String startupResult = BytesUtil.bcd2Str(startupResultByteArr); + + // 失败原因 + startIndex += length; + length = 1; + byte[] failReasonByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String failReason = BytesUtil.bcd2Str(failReasonByteArr); + + log.info("[===预约充电启动结果上送===]交易流水号:{}, 桩编号:{}, 枪号:{}, vin:{}, 启动结果:{}, 失败原因:{}", + transactionCode, pileSn, connectorCode, vinCode, startupResult, failReason); + + + ReservationChargingStartupResult chargingStartupResult = ReservationChargingStartupResult.builder() + .transactionCode(transactionCode) + .pileSn(pileSn) + .connectorCode(connectorCode) + .vinCode(vinCode) + .startupResult(startupResult) + .failReason(failReason) + .build(); + pileBasicInfoService.startupResult(chargingStartupResult); + + + /* + 应答 + 确认结果 0x00 成功 0x01 失败 + */ + byte[] confirmResultBytes = Constants.zeroByteArray; + byte[] concatMsgBody = Bytes.concat(transactionCodeByteArr, pileSnByteArr, connectorCodeByteArr, confirmResultBytes); + + return getResult(ykcDataProtocol, concatMsgBody); + } +} diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReserveChargingResponseHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReserveChargingResponseHandler.java deleted file mode 100644 index 65d2600c2..000000000 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/ReserveChargingResponseHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.jsowell.netty.handler.yunkuaichong; - -import com.jsowell.common.core.domain.ykc.YKCFrameTypeCode; -import com.jsowell.common.util.YKCUtils; -import com.jsowell.netty.factory.YKCOperateFactory; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 预约充电响应 - */ -@Slf4j -@Component -public class ReserveChargingResponseHandler extends AbstractHandler{ - - private final String type = YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVE_CHARGING_ANSWER_CODE.getBytes()); - - @Override - public void afterPropertiesSet() throws Exception { - YKCOperateFactory.register(type, this); - } -} diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java index 8caae9a3a..7bf8a722c 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/TransactionRecordsRequestHandler.java @@ -330,8 +330,8 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { int length = 16; // 交易流水号 - byte[] orderCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); - String transactionCode = BytesUtil.bcd2Str(orderCodeByteArr); + byte[] transactionCodeByteArr = BytesUtil.copyBytes(msgBody, startIndex, length); + String transactionCode = BytesUtil.bcd2Str(transactionCodeByteArr); // 桩编码 startIndex += length; @@ -582,7 +582,7 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { 2022年12月15日11点28分发现返回 01非法账单,充电桩会持续上传交易记录,后面产生的交易记录被阻塞 */ byte[] confirmResultBytes = Constants.zeroByteArray; - byte[] concatMsgBody = Bytes.concat(orderCodeByteArr, confirmResultBytes); + byte[] concatMsgBody = Bytes.concat(transactionCodeByteArr, confirmResultBytes); return getResult(ykcDataProtocol, concatMsgBody); } @@ -597,7 +597,7 @@ public class TransactionRecordsRequestHandler extends AbstractHandler { PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn); if (StringUtils.equals(pileBasicInfo.getBusinessType(), Constants.TWO)) { personalChargingRecordService.processPersonalChargingRecord(data); - return; + // return; } String transactionCode = data.getTransactionCode(); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileReservationInfo.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileReservationInfo.java index 2cc088337..a911a1a84 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileReservationInfo.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/PileReservationInfo.java @@ -3,6 +3,7 @@ package com.jsowell.pile.domain; import java.sql.Time; import java.util.Date; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @@ -14,6 +15,7 @@ import lombok.experimental.SuperBuilder; @Data @Accessors(chain = true) @SuperBuilder +@Builder @AllArgsConstructor @NoArgsConstructor public class PileReservationInfo { @@ -47,6 +49,11 @@ public class PileReservationInfo { */ private String reservationType; + /** + * 验证身份(1-是; 0-否) + */ + private String verifyIdentity; + /** * 预约开始时间 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ykcCommond/ReservationChargingCommand.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ykcCommond/ReservationChargingCommand.java index 95bef6804..078557ede 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/ykcCommond/ReservationChargingCommand.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/ykcCommond/ReservationChargingCommand.java @@ -46,6 +46,11 @@ public class ReservationChargingCommand { */ private String reservationType; + /** + * 身份验证 + */ + private String verifyIdentity; + /** * vin1 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/CreateReservedDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/CreateReservedDTO.java index 64a96d440..d13ae5ec5 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/CreateReservedDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/CreateReservedDTO.java @@ -40,6 +40,11 @@ public class CreateReservedDTO { */ private String freq; + /** + * 验证身份(1-是; 0-否) + */ + private String verifyIdentity; + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.JSON_STYLE) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PersonPileStopChargingDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PersonPileStopChargingDTO.java new file mode 100644 index 000000000..8f275fa29 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PersonPileStopChargingDTO.java @@ -0,0 +1,24 @@ +package com.jsowell.pile.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PersonPileStopChargingDTO { + private String memberId; + private String firstLevelMerchantId; + + private String pileSn; + + private String ConnectorCode; + + /** + * 桩枪口号 + */ + private String pileConnectorCode; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileMemberBindingDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileMemberBindingDTO.java index 8bfa748f0..d3a5d1e5a 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileMemberBindingDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileMemberBindingDTO.java @@ -38,5 +38,5 @@ public class PileMemberBindingDTO { /** * 一级运营商id */ - private String merchantId; + private String firstLevelMerchantId; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileReservationDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileReservationDTO.java index 056097d81..7e28dbab9 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileReservationDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/PileReservationDTO.java @@ -23,11 +23,31 @@ public class PileReservationDTO { */ private String status; + /** + * 验证身份(1-是; 0-否) + */ + private String verifyIdentity; + /** * 桩编号 */ private String pileSn; + /** + * 充电桩枪口编号 + */ + private String pileConnectorCode; + + /** + * 开始时间 hh:mm:ss + */ + private String startTime; + + /** + * 结束时间 hh:mm:ss + */ + private String endTime; + private Integer pageNo; private Integer pageSize; @@ -38,6 +58,11 @@ public class PileReservationDTO { .append("memberId", memberId) .append("reservedId", reservedId) .append("status", status) + .append("pileSn", pileSn) + .append("startTime", startTime) + .append("endTime", endTime) + .append("pageNo", pageNo) + .append("pageSize", pageSize) .toString(); } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/ReservationChargingStartupResult.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/ReservationChargingStartupResult.java new file mode 100644 index 000000000..089788305 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/ReservationChargingStartupResult.java @@ -0,0 +1,42 @@ +package com.jsowell.pile.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ReservationChargingStartupResult { + /** + * 交易流水号 + */ + private String transactionCode; + + /** + * 桩编号 + */ + private String pileSn; + + /** + * 枪口号 + */ + private String connectorCode; + + /** + * vin + */ + private String vinCode; + + /** + * 启动结果 + */ + private String startupResult; + + /** + * 失败原因 + */ + private String failReason; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileReservationInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileReservationInfoMapper.java index da44e5ff2..fa7939072 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileReservationInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileReservationInfoMapper.java @@ -34,4 +34,6 @@ public interface PileReservationInfoMapper { List findByMemberIdAndPileSn(@Param("memberId") String memberId, @Param("pileSn") String pileSn); PileReservationInfo selectActiveReservationByPileConnectorCode(String pileConnectorCode); + + PileReservationInfo selectByPileConnectorCode(String pileConnectorCode); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java index 306c8f817..80d99d371 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderPileOccupyService.java @@ -66,6 +66,8 @@ public interface OrderPileOccupyService{ void stopOccupyPileOrder(OrderPileOccupy orderPileOccupy); + int retryCalculateOccupyPileOrderAmount(String occupyCode); + /** * 通过memberid查询挂起状态订单 * @param memberId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java index 4d9653b0c..2c1e5a179 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PersonalChargingRecordService.java @@ -3,6 +3,7 @@ package com.jsowell.pile.service; import java.util.List; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; +import com.jsowell.pile.domain.OrderBasicInfo; import com.jsowell.pile.domain.PersonalChargingRecord; public interface PersonalChargingRecordService{ @@ -35,4 +36,6 @@ public interface PersonalChargingRecordService{ * @param data */ void processPersonalChargingRecord(TransactionRecordsData data); + + void processPersonalChargingRecord(OrderBasicInfo orderBasicInfo); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileBasicInfoService.java index e049d2d21..d0ff490df 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileBasicInfoService.java @@ -2,10 +2,7 @@ package com.jsowell.pile.service; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; import com.jsowell.pile.domain.PileBasicInfo; -import com.jsowell.pile.dto.IndexQueryDTO; -import com.jsowell.pile.dto.QueryPileDTO; -import com.jsowell.pile.dto.ReplaceMerchantStationDTO; -import com.jsowell.pile.dto.StartPersonPileDTO; +import com.jsowell.pile.dto.*; import com.jsowell.pile.thirdparty.ConnectorInfo; import com.jsowell.pile.thirdparty.EquipmentInfo; import com.jsowell.pile.thirdparty.ZDLConnectorInfo; @@ -222,4 +219,6 @@ public interface PileBasicInfoService { List getConnectorListForZDL(String pileSn); String startPersonalPileCharging(StartPersonPileDTO dto); + + void startupResult(ReservationChargingStartupResult chargingStartupResult); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java index 193cad20b..60cd18d25 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileRemoteService.java @@ -72,7 +72,6 @@ public class PileRemoteService { .build(); ykcPushCommandService.pushGetRealTimeMonitorDataCommand(command); } - } /** @@ -95,7 +94,7 @@ public class PileRemoteService { log.warn("远程启动充电, 充电桩编号和枪口号不能为空"); return; } - log.info("=====平台下发指令=====: 远程启动充电, 桩号:{}, 枪口号:{}", pileSn, connectorCode); + log.info("【=====平台下发指令=====】: 远程启动充电, 桩号:{}, 枪口号:{}", pileSn, connectorCode); StartChargingCommand startChargingCommand = StartChargingCommand.builder() .pileSn(pileSn) .connectorCode(connectorCode) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileReservationInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileReservationInfoService.java index 516535ae4..6f04543cd 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileReservationInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileReservationInfoService.java @@ -2,8 +2,12 @@ package com.jsowell.pile.service; import java.util.List; +import com.jsowell.common.core.page.PageResponse; +import com.jsowell.pile.dto.CreateReservedDTO; +import com.jsowell.pile.dto.PersonPileStopChargingDTO; import com.jsowell.pile.dto.PileReservationDTO; import com.jsowell.pile.domain.PileReservationInfo; +import com.jsowell.pile.vo.PileReservationInfoVO; public interface PileReservationInfoService { int deleteByPrimaryKey(Integer id); @@ -55,5 +59,17 @@ public interface PileReservationInfoService { void cancelOneTimeReservation(String pileConnectorCode); void deleteReservation(PileReservationDTO dto); + + int createReservation(CreateReservedDTO dto); + + PageResponse queryReservationList(PileReservationDTO dto); + + void updateReservationStatus(PileReservationDTO dto); + + void updateReservation(PileReservationDTO dto); + + void personPileStopCharging(PersonPileStopChargingDTO dto); + + PileReservationInfoVO queryReservationInfo(PileReservationDTO dto); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java index fcfa82324..3dbd24fc4 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPileOccupyServiceImpl.java @@ -282,6 +282,26 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService { orderPileOccupyMapper.updateByPrimaryKeySelective(orderPileOccupy); } + @Override + public int retryCalculateOccupyPileOrderAmount(String occupyCode) { + OrderPileOccupy orderPileOccupy = queryByOccupyCode(occupyCode); + // 计算金额 + BigDecimal orderAmount = calculateOccupyPileOrderAmount(orderPileOccupy); + + if (orderAmount.compareTo(BigDecimal.ZERO) > 0) { + // 需要支付金额,订单挂起 + orderPileOccupy.setStatus(Constants.TWO); // 2-订单挂起 + } else { + // 订单金额为0 + orderPileOccupy.setPayStatus(Constants.TWO); // 2-无需支付 + orderPileOccupy.setStatus(Constants.ONE); // 1-订单完成 + } + orderPileOccupy.setOrderAmount(orderAmount); + // 更新数据库 + int i = orderPileOccupyMapper.updateByPrimaryKeySelective(orderPileOccupy); + return i; + } + /** * 计算占桩订单金额 * calculateTheAmountOfTheOccupancyOrder @@ -325,8 +345,8 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService { dto.setStartTime(DateUtils.formatDateTime(startTime)); dto.setEndTime(DateUtils.formatDateTime(endTime)); List orderListVOS = orderBasicInfoService.queryOrderByOccupyTime(dto); - log.info("查询会员在占用时段内有没有充电订单, 占桩订单编号:{}, 占桩开始时间:{}, 占桩结束时间:{}, result:{}", - occupyCode, DateUtils.formatDateTime(startTime), DateUtils.formatDateTime(endTime), JSON.toJSONString(orderListVOS)); + log.info("查询会员在占用时段内有没有充电订单, 占桩订单编号:{}, memberId:{}, stationId:{}, 占桩开始时间:{}, 占桩结束时间:{}, result:{}", + occupyCode, orderPileOccupy.getMemberId(), orderPileOccupy.getStationId(), DateUtils.formatDateTime(startTime), DateUtils.formatDateTime(endTime), JSON.toJSONString(orderListVOS)); /* 计算充电时长 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java index 757b753b9..cd8a45f8f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PersonalChargingRecordServiceImpl.java @@ -1,8 +1,9 @@ package com.jsowell.pile.service.impl; +import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; -import com.jsowell.common.util.Cp56Time2a.Cp56Time2aUtil; import com.jsowell.common.util.DateUtils; +import com.jsowell.pile.domain.OrderBasicInfo; import com.jsowell.pile.domain.PileBasicInfo; import com.jsowell.pile.service.PileBasicInfoService; import org.springframework.beans.factory.annotation.Autowired; @@ -82,8 +83,7 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord } /** - * 处理个人桩充电记录 - * + * 收到交易记录时, 处理个人桩充电记录 * @param data */ @Override @@ -133,4 +133,48 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord personalChargingRecordMapper.insertOrUpdateSelective(chargingRecord); } + /** + * 一键启动时, 处理个人桩充电记录 + * @param orderBasicInfo + */ + @Override + public void processPersonalChargingRecord(OrderBasicInfo orderBasicInfo) { + // 根据交易流水号查询,如果数据库没有就入库 + PersonalChargingRecord chargingRecord = new PersonalChargingRecord(); + + // 处理数据 + chargingRecord.setTransactionCode(orderBasicInfo.getTransactionCode()); + chargingRecord.setStatus(Constants.ONE); + chargingRecord.setMemberId(orderBasicInfo.getMemberId()); + chargingRecord.setStationId(orderBasicInfo.getStationId()); + chargingRecord.setMerchantId(orderBasicInfo.getMerchantId()); + chargingRecord.setPileSn(orderBasicInfo.getPileSn()); + chargingRecord.setConnectorCode(orderBasicInfo.getConnectorCode()); + chargingRecord.setPileConnectorCode(orderBasicInfo.getPileConnectorCode()); + chargingRecord.setLogicCard(orderBasicInfo.getLogicCard()); + chargingRecord.setVinCode(orderBasicInfo.getVinCode()); + chargingRecord.setStartMode(orderBasicInfo.getStartMode()); + chargingRecord.setPlateNumber(orderBasicInfo.getPlateNumber()); + chargingRecord.setChargeStartTime(orderBasicInfo.getChargeStartTime()); + chargingRecord.setChargeEndTime(orderBasicInfo.getChargeEndTime()); + chargingRecord.setStartType(orderBasicInfo.getStartType()); + chargingRecord.setReservationStartTime(orderBasicInfo.getReservedStartTime()); + chargingRecord.setReservationEndTime(orderBasicInfo.getReservedEndTime()); + chargingRecord.setStartSoc(orderBasicInfo.getStartSoc()); + chargingRecord.setEndSoc(null); + // BigDecimal sharpUsedElectricity = new BigDecimal(data.getSharpUsedElectricity()); + // chargingRecord.setSharpUsedElectricity(sharpUsedElectricity); + // BigDecimal peakUsedElectricity = new BigDecimal(data.getPeakUsedElectricity()); + // chargingRecord.setPeakUsedElectricity(peakUsedElectricity); + // BigDecimal flatUsedElectricity = new BigDecimal(data.getFlatUsedElectricity()); + // chargingRecord.setFlatUsedElectricity(flatUsedElectricity); + // BigDecimal valleyUsedElectricity = new BigDecimal(data.getValleyUsedElectricity()); + // chargingRecord.setValleyUsedElectricity(valleyUsedElectricity); + // BigDecimal totalUsedElectricity = sharpUsedElectricity.add(peakUsedElectricity).add(flatUsedElectricity).add(valleyUsedElectricity); + // chargingRecord.setTotalUsedElectricity(totalUsedElectricity); + // chargingRecord.setReason(data.getStopReasonMsg()); + // 创建或更新 + personalChargingRecordMapper.insertOrUpdateSelective(chargingRecord); + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileBasicInfoServiceImpl.java index 0c8baba83..10a7f37fb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileBasicInfoServiceImpl.java @@ -18,10 +18,7 @@ import com.jsowell.pile.domain.PileBasicInfo; import com.jsowell.pile.domain.PileConnectorInfo; import com.jsowell.pile.domain.PileModelInfo; import com.jsowell.pile.domain.PileSimInfo; -import com.jsowell.pile.dto.IndexQueryDTO; -import com.jsowell.pile.dto.QueryPileDTO; -import com.jsowell.pile.dto.ReplaceMerchantStationDTO; -import com.jsowell.pile.dto.StartPersonPileDTO; +import com.jsowell.pile.dto.*; import com.jsowell.pile.mapper.PileBasicInfoMapper; import com.jsowell.pile.service.*; import com.jsowell.pile.service.programlogic.AbstractProgramLogic; @@ -37,6 +34,7 @@ import com.jsowell.pile.vo.uniapp.customer.GroundLockInfoVO; import com.jsowell.pile.vo.uniapp.customer.PersonalPileInfoVO; import com.jsowell.pile.vo.uniapp.customer.PileConnectorDetailVO; import com.jsowell.pile.vo.web.*; +import com.jsowell.wxpay.service.WxAppletRemoteService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; @@ -89,6 +87,9 @@ public class PileBasicInfoServiceImpl implements PileBasicInfoService { @Autowired private PileReservationInfoService pileReservationInfoService; + @Autowired + private WxAppletRemoteService wxAppletRemoteService; + /** * 查询设备管理 * @@ -1211,4 +1212,13 @@ public class PileBasicInfoServiceImpl implements PileBasicInfoService { String orderCode = orderLogic.startPersonalPileCharging(dto); return orderCode; } + + /** + * 预约充电启动结果 + */ + @Override + public void startupResult(ReservationChargingStartupResult chargingStartupResult) { + // 小程序通知 + wxAppletRemoteService.reservationStartupResultSendMsg(); + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMemberRelationServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMemberRelationServiceImpl.java index acee2f8a0..33f709e77 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMemberRelationServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMemberRelationServiceImpl.java @@ -1,6 +1,8 @@ package com.jsowell.pile.service.impl; +import com.google.common.collect.Lists; import com.jsowell.common.util.DateUtils; +import com.jsowell.common.util.StringUtils; import com.jsowell.pile.domain.PileMemberRelation; import com.jsowell.pile.mapper.PileMemberRelationMapper; import com.jsowell.pile.service.PileConnectorInfoService; @@ -108,10 +110,12 @@ public class PileMemberRelationServiceImpl implements PileMemberRelationService @Override public List selectPileMemberRelationByPileSn(String pileSn) { + if (StringUtils.isBlank(pileSn)) { + return Lists.newArrayList(); + } PileMemberRelation pileMemberRelation = new PileMemberRelation(); pileMemberRelation.setPileSn(pileSn); return selectPileMemberRelationList(pileMemberRelation); } - } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java index 0e3117c54..1aad1138e 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileReservationInfoServiceImpl.java @@ -1,18 +1,26 @@ package com.jsowell.pile.service.impl; +import com.alibaba.fastjson2.JSON; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; +import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; +import com.jsowell.common.core.page.PageResponse; +import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.DelFlagEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.StringUtils; +import com.jsowell.pile.domain.PileMemberRelation; import com.jsowell.pile.domain.ykcCommond.ReservationChargingCommand; +import com.jsowell.pile.dto.CreateReservedDTO; +import com.jsowell.pile.dto.PersonPileStopChargingDTO; import com.jsowell.pile.dto.PileReservationDTO; import com.jsowell.pile.dto.StartPersonPileDTO; -import com.jsowell.pile.service.MemberPlateNumberRelationService; -import com.jsowell.pile.service.PileBasicInfoService; -import com.jsowell.pile.service.PileRemoteService; +import com.jsowell.pile.service.*; +import com.jsowell.pile.vo.PileReservationInfoVO; import com.jsowell.pile.vo.uniapp.customer.MemberPlateNumberVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -20,15 +28,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.sql.Date; import java.sql.Time; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import com.jsowell.pile.mapper.PileReservationInfoMapper; import com.jsowell.pile.domain.PileReservationInfo; -import com.jsowell.pile.service.PileReservationInfoService; @Slf4j @Service @@ -46,6 +56,12 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic @Autowired private MemberPlateNumberRelationService memberPlateNumberRelationService; + @Autowired + private PileMemberRelationService pileMemberRelationService; + + @Autowired + private RedisCache redisCache; + @Override public int deleteByPrimaryKey(Integer id) { return pileReservationInfoMapper.deleteByPrimaryKey(id); @@ -63,6 +79,11 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic @Override public int insertOrUpdateSelective(PileReservationInfo record) { + if (record.getId() == null) { + record.setCreateTime(DateUtils.getNowDate()); + } else { + record.setUpdateTime(DateUtils.getNowDate()); + } return pileReservationInfoMapper.insertOrUpdateSelective(record); } @@ -106,24 +127,28 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic return pileReservationInfoMapper.findByMemberIdAndPileSn(memberId, pileSn); } + public PileReservationInfo selectByPileConnectorCode(String pileConnectorCode) { + return pileReservationInfoMapper.selectByPileConnectorCode(pileConnectorCode); + } + /** * 启用预约/开启预约/启动预约 */ @Override public void activateReserved(PileReservationDTO dto) { // 查询其他生效中的预约 - List infoList = pileReservationInfoMapper.findByMemberIdAndPileSnAndStatus(dto.getMemberId(), dto.getPileSn(), "1"); - if (CollectionUtils.isNotEmpty(infoList)) { - throw new BusinessException(ReturnCodeEnum.CODE_RESERVATION_ALREADY_EXISTS_ERROR); - } + // List infoList = pileReservationInfoMapper.findByMemberIdAndPileSnAndStatus(dto.getMemberId(), dto.getPileSn(), "1"); + // if (CollectionUtils.isNotEmpty(infoList)) { + // throw new BusinessException(ReturnCodeEnum.CODE_RESERVATION_ALREADY_EXISTS_ERROR); + // } PileReservationInfo pileReservationInfo = pileReservationInfoMapper.selectByPrimaryKey(Integer.parseInt(dto.getReservedId())); if (pileReservationInfo == null) { return; } - if (!StringUtils.equals(dto.getMemberId(), pileReservationInfo.getMemberId())) { - return; - } + // if (!StringUtils.equals(dto.getMemberId(), pileReservationInfo.getMemberId())) { + // return; + // } pileReservationInfo.setStatus(Constants.ONE); // 保存之前,校验时间是否重叠 int i = saveReservation(pileReservationInfo); @@ -151,6 +176,7 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic .connectorCode(pileReservationInfo.getPileConnectorCode().replace(pileReservationInfo.getPileSn(), "")) .operation("01") .reservationType(type) + .verifyIdentity(pileReservationInfo.getVerifyIdentity()) .vin1(vinCodes.get(0)) .vin2(vinCodes.get(1)) .vin3(vinCodes.get(2)) @@ -171,9 +197,9 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic if (pileReservationInfo == null) { return; } - if (!StringUtils.equals(dto.getMemberId(), pileReservationInfo.getMemberId())) { - return; - } + // if (!StringUtils.equals(dto.getMemberId(), pileReservationInfo.getMemberId())) { + // return; + // } // 校验通过可以修改预约 pileReservationInfo.setStatus(Constants.ZERO); int i = pileReservationInfoMapper.updateByPrimaryKeySelective(pileReservationInfo); @@ -201,6 +227,7 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic .connectorCode(pileReservationInfo.getPileConnectorCode().replace(pileReservationInfo.getPileSn(), "")) .operation("02") .reservationType(type) + .verifyIdentity(pileReservationInfo.getVerifyIdentity()) .vin1(vinCodes.get(0)) .vin2(vinCodes.get(1)) .vin3(vinCodes.get(2)) @@ -291,5 +318,217 @@ public class PileReservationInfoServiceImpl implements PileReservationInfoServic pileReservationInfo.setDelFlag(DelFlagEnum.DELETE.getValue()); pileReservationInfoMapper.updateByPrimaryKey(pileReservationInfo); } + + @Override + public int createReservation(CreateReservedDTO dto) { + PileReservationInfo reservedInfo = selectByPileConnectorCode(dto.getPileConnectorCode()); + if (reservedInfo == null) { + reservedInfo = new PileReservationInfo(); + reservedInfo.setCreateBy(dto.getMemberId()); + } else { + reservedInfo.setUpdateBy(dto.getMemberId()); + } + reservedInfo.setMemberId(dto.getMemberId()); + reservedInfo.setPileSn(dto.getPileSn()); + reservedInfo.setPileConnectorCode(dto.getPileConnectorCode()); + reservedInfo.setStatus(Constants.ONE); // 默认生效 + // reservedInfo.setStartTime(DateUtils.parseDate(dto.getStartTime())); + reservedInfo.setStartTime(Time.valueOf(dto.getStartTime())); + // reservedInfo.setEndTime(DateUtils.parseDate(dto.getEndTime())); + if (StringUtils.isNotBlank(dto.getEndTime())) { + reservedInfo.setEndTime(Time.valueOf(dto.getEndTime())); + } + + // 2024年7月25日14点36分, 此段代码注释掉, 采用默认设置 + // if (StringUtils.isNotBlank(dto.getFreq())) { + // reservedInfo.setReservationType("recurring"); + // reservedInfo.setFreq(dto.getFreq()); + // } else { + // reservedInfo.setReservationType("single"); + // reservedInfo.setFreq(null); + // } + + // 默认每天 + reservedInfo.setReservationType("recurring"); + reservedInfo.setFreq("daily"); + + this.insertOrUpdateSelective(reservedInfo); + return reservedInfo.getId(); + } + + @Override + public PageResponse queryReservationList(PileReservationDTO dto) { + int pageNo = dto.getPageNo() == null ? Constants.one : dto.getPageNo(); + int pageSize = dto.getPageSize() == null ? 10 : dto.getPageSize(); + PageHelper.startPage(pageNo, pageSize); + List list = this.getReservationsByMemberIdAndPileSn(dto.getMemberId(), dto.getPileSn()); + PageInfo pageInfo = new PageInfo<>(list); + + PageResponse pageResponse = new PageResponse(); + pageResponse.setPageNum(pageInfo.getPageNum()); + pageResponse.setPageSize(pageInfo.getPageSize()); + pageResponse.setPages(pageInfo.getPages()); + pageResponse.setTotal(pageInfo.getTotal()); + + List resultList = Lists.newArrayList(); + for (PileReservationInfo reservedInfo : pageInfo.getList()) { + resultList.add( + PileReservationInfoVO.builder() + // .reservationId(reservedInfo.getId() + "") + .pileSn(reservedInfo.getPileSn()) + .startTime(reservedInfo.getStartTime().toString()) + .endTime(reservedInfo.getEndTime().toString()) + // .freq(reservedInfo.getFreq()) + .status(reservedInfo.getStatus()) + .build() + ); + } + pageResponse.setList(resultList); + return pageResponse; + } + + /** + * 修改预约状态 + * @param dto + */ + @Override + public void updateReservationStatus(PileReservationDTO dto) { + if (StringUtils.equals(dto.getStatus(), Constants.ZERO)) { + // 停用 + this.deactivateReserved(dto); + } else if (StringUtils.equals(dto.getStatus(), Constants.ONE)) { + // 启用 + this.activateReserved(dto); + } + } + + /** + * 修改预约充电信息 + * @param dto + */ + @Override + public void updateReservation(PileReservationDTO dto) { + PileReservationInfo pileReservationInfo = pileReservationInfoMapper.selectByPrimaryKey(Integer.valueOf(dto.getReservedId())); + if (pileReservationInfo == null) { + return; + } + + /** + * 操作 + * 0x01:启动 0x02:取消 0x03:修改 + */ + String operation = "03"; + + if (StringUtils.isNotBlank(dto.getStartTime())) { + pileReservationInfo.setStartTime(Time.valueOf(dto.getStartTime())); + operation = "03"; + } + if (StringUtils.isNotBlank(dto.getEndTime())) { + pileReservationInfo.setEndTime(Time.valueOf(dto.getEndTime())); + operation = "03"; + } + if (StringUtils.isNotBlank(dto.getStatus())) { + pileReservationInfo.setStatus(dto.getStatus()); + if (StringUtils.equals(dto.getStatus(), Constants.ZERO)) { + // 停用 + operation = "02"; + } else if (StringUtils.equals(dto.getStatus(), Constants.ONE)) { + // 启用 + operation = "01"; + } + } + if (StringUtils.isNotBlank(dto.getVerifyIdentity())) { + pileReservationInfo.setVerifyIdentity(dto.getVerifyIdentity()); + } + pileReservationInfo.setUpdateBy(dto.getMemberId()); + this.insertOrUpdateSelective(pileReservationInfo); + + // 查询会员的绑定vin列表 2024年7月30日11点04分 以当前请求会员的VIN为准 + List plateNumberVOList = memberPlateNumberRelationService.selectMemberPlateNumberRelation(dto.getMemberId()); + List vinCodes = Lists.newArrayList(); + int count = 0; + for (MemberPlateNumberVO vo : plateNumberVOList) { + if (count < 3 && StringUtils.isNotBlank(vo.getVinCode())) { + vinCodes.add(vo.getVinCode()); + count++; + } + } + // 如果 vinCodes 的数量少于 3,用 "0" 补足 + while (vinCodes.size() < 3) { + vinCodes.add(""); + } + + String type = StringUtils.equals(pileReservationInfo.getReservationType(), "single") ? "00" : "01"; + + // 发送指令 + ReservationChargingCommand command = ReservationChargingCommand.builder() + .transactionCode(Constants.ILLEGAL_TRANSACTION_CODE) + .pileSn(pileReservationInfo.getPileSn()) + .connectorCode(pileReservationInfo.getPileConnectorCode().replace(pileReservationInfo.getPileSn(), "")) + .operation(operation) + .reservationType(type) + .verifyIdentity(pileReservationInfo.getVerifyIdentity()) + .vin1(vinCodes.get(0)) + .vin2(vinCodes.get(1)) + .vin3(vinCodes.get(2)) + .reservedStartTime(pileReservationInfo.getStartTime().toLocalTime()) + .reservedEndTime(pileReservationInfo.getEndTime().toLocalTime()) + .amount(Constants.WHITELIST_DEFAULT_AMOUNT) + .build(); + pileRemoteService.reservationCharging(command); + } + + /** + * 个人桩停止充电 + * @param dto + */ + @Override + public void personPileStopCharging(PersonPileStopChargingDTO dto) { + String pileConnectorCode = dto.getPileConnectorCode(); + String pileSn = StringUtils.substring(pileConnectorCode, 0, pileConnectorCode.length() - 2); + String connectorCode = StringUtils.substring(pileConnectorCode, pileConnectorCode.length() - 2, pileConnectorCode.length()); + // 查询个人桩信息 + List pileMemberRelations = pileMemberRelationService.selectPileMemberRelationByPileSn(pileSn); + Map> listMap = pileMemberRelations.stream() + .collect(Collectors.groupingBy(PileMemberRelation::getType, Collectors.mapping(PileMemberRelation::getMemberId, Collectors.toList()))); + log.info("个人桩:{}, 使用者信息:{}", pileConnectorCode, JSON.toJSONString(listMap)); + // 发送请求的用户有没有权限停止充电 + boolean stopFlag = false; + List pileManager = listMap.get("1"); + List pileUsers = listMap.get("2"); + + if (CollectionUtils.isNotEmpty(pileManager) && CollectionUtils.containsAny(pileManager, dto.getMemberId())) { + log.info("memberId:() 为管理员"); + stopFlag = true; + } + if (CollectionUtils.isNotEmpty(pileUsers) && CollectionUtils.containsAny(pileUsers, dto.getMemberId())) { + log.info("memberId:() 为用户"); + stopFlag = true; + } + + if (stopFlag) { + String pileIsChargingKey = CacheConstants.PILE_IS_CHARGING + pileSn + connectorCode; + String redisResult = redisCache.getCacheObject(pileIsChargingKey); + // 发送停止充电指令 + log.info("发送停止指令, pileSn:{}, connectorCode:{}, transactionCode:{}", pileSn, connectorCode, redisResult); + pileRemoteService.remoteStopCharging(pileSn, connectorCode, redisResult); + } + } + + @Override + public PileReservationInfoVO queryReservationInfo(PileReservationDTO dto) { + PileReservationInfo pileReservationInfo = pileReservationInfoMapper.selectByPileConnectorCode(dto.getPileConnectorCode()); + PileReservationInfoVO build = PileReservationInfoVO.builder() + .reservedId(pileReservationInfo.getId() + "") + .pileSn(pileReservationInfo.getPileSn()) + .pileConnectorCode(pileReservationInfo.getPileConnectorCode()) + .startTime(pileReservationInfo.getStartTime().toString()) + .endTime(pileReservationInfo.getEndTime().toString()) + .verifyIdentity(pileReservationInfo.getVerifyIdentity()) + // .freq(pileReservationInfo.getFreq()) + .status(pileReservationInfo.getStatus()) + .build(); + return build; + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java index 9a26bc84b..20867b799 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/YKCPushCommandServiceImpl.java @@ -20,7 +20,6 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.aspectj.weaver.ast.Var; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -59,7 +58,7 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { YKCUtils.frameType2Str(YKCFrameTypeCode.REMOTE_RESTART_CODE.getBytes()), YKCUtils.frameType2Str(YKCFrameTypeCode.REMOTE_CONTROL_START_CODE.getBytes()), YKCUtils.frameType2Str(YKCFrameTypeCode.REMOTE_STOP_CHARGING_CODE.getBytes()), - YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVE_CHARGING_CODE.getBytes()) + YKCUtils.frameType2Str(YKCFrameTypeCode.RESERVATION_CHARGING_CODE.getBytes()) ); /** @@ -183,7 +182,7 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { } /** - * 发送停止ch + * 发送停止充电 * * @param command */ @@ -254,7 +253,7 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { // push消息 boolean result = this.push(msg, pileSn, YKCFrameTypeCode.REMOTE_ISSUE_QRCODE_CODE); - log.info("=====平台下发指令===== pileSn:{}, 下发二维码,地址为:{}", pileSn, qrCodePrefix); + log.info("【=====平台下发指令=====】 pileSn:{}, 下发二维码,地址为:{}", pileSn, qrCodePrefix); } /** @@ -330,7 +329,7 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { // 额定功率 String ratedPower = pileModelInfoVO.getRatedPower(); - int i = Integer.parseInt(ratedPower); + // int i = Integer.parseInt(ratedPower); // byte[] ratedPowerByteArr = Base64.getDecoder().decode(ratedPower); byte[] ratedPowerByteArr = BytesUtil.ensureLength(Constants.zeroByteArray, 2); @@ -506,6 +505,10 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { String reservationType = command.getReservationType(); byte[] reservationTypeByteArr = BytesUtil.str2Bcd(reservationType); + // 身份验证 + String verifyIdentity = command.getVerifyIdentity(); + byte[] verifyIdentityByteArr = BytesUtil.str2Bcd(verifyIdentity); + // VIN1 String vin1 = command.getVin1(); byte[] vin1ByteArr = BytesUtil.str2Asc(vin1); @@ -533,12 +536,12 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService { // 拼装msg信息 byte[] msg = Bytes.concat(transactionCodeArr, pileSnByteArr, connectorCodeByteArr, operateByteArr, - reservationTypeByteArr, vin1ByteArr, vin2ByteArr, vin3ByteArr, + reservationTypeByteArr, verifyIdentityByteArr, vin1ByteArr, vin2ByteArr, vin3ByteArr, reservedStartTimeByteArr, reservedEndTimeByteArr, amountByteArr); - this.push(msg, pileSn, YKCFrameTypeCode.RESERVE_CHARGING_CODE); + this.push(msg, pileSn, YKCFrameTypeCode.RESERVATION_CHARGING_CODE); - log.info("=====平台下发指令=====: 预约充电指令, 交易流水号:{}, 桩编号:{}, 枪口号:{}, 操作:{}, 开始时间:{}, 结束时间:{}, 启动金额:{}", - transactionCode, pileSn, connectorCode, operation, DateUtils.formatDateTime(reservedStartTime), DateUtils.formatDateTime(reservedEndTime), amount); + log.info("【=====平台下发指令=====】: 预约充电指令, 交易流水号:{}, 桩编号:{}, 枪口号:{}, 操作:{}, 身份验证:{}, 开始时间:{}, 结束时间:{}, 启动金额:{}", + transactionCode, pileSn, connectorCode, operation, verifyIdentity, DateUtils.formatDateTime(reservedStartTime), DateUtils.formatDateTime(reservedEndTime), amount); } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index cb750df5d..a9ffca059 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -105,7 +105,10 @@ public abstract class AbstractProgramLogic implements InitializingBean { protected MemberGroupService memberGroupService; @Autowired - private PileStationWhitelistService pileStationWhitelistService; + protected PileStationWhitelistService pileStationWhitelistService; + + @Autowired + protected PersonalChargingRecordService personalChargingRecordService; @Autowired protected RedisCache redisCache; @@ -475,6 +478,10 @@ public abstract class AbstractProgramLogic implements InitializingBean { BigDecimal tempAmount = new BigDecimal(orderAmount.toString()); // 临时金额 for (OrderPayRecord record : payRecordList) { + if (!StringUtils.equals(record.getPayMode(), OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())) { + // 不是本金支付, 进行下一个循环 + continue; + } List paymentInfos = orderPayRecordService.parseDeductionRecord(record.getDeductionRecord()); for (PaymentInfo object : paymentInfos) { String paymentId = object.getPaymentId(); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 12bec2532..de933a2b3 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -718,7 +718,8 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { // 查支付记录 List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); // 根据payMode分组 - Map> payRecordMap = payRecordList.stream().collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); + Map> payRecordMap = payRecordList.stream() + .collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); // 获取本金支付的记录 List principalPayRecordList = payRecordMap.get(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()); BigDecimal principalPay = null; @@ -737,7 +738,7 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { // 计算需要退回的金额 Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount, discountAmount); logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", - orderCode, orderAmount, principalPay, null, JSON.toJSONString(returnAmountMap)); + orderCode, orderAmount, principalPay, giftPay, JSON.toJSONString(returnAmountMap)); // 需要退回本金的金额 BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); @@ -843,7 +844,7 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { if (!b) { throw new BusinessException("00600006", "个人桩启动失败,无启动权限"); } - String orderCode; + // 生成订单 GenerateOrderDTO generateOrderDTO = new GenerateOrderDTO(); generateOrderDTO.setMemberId(dto.getMemberId()); @@ -852,18 +853,28 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { generateOrderDTO.setStartType(dto.getStartType()); generateOrderDTO.setPileSn(pileSn); generateOrderDTO.setConnectorCode(connectorCode); + + OrderBasicInfo orderBasicInfo; try { - OrderBasicInfo orderBasicInfo = generateOrder(generateOrderDTO); - orderCode = orderBasicInfo.getOrderCode(); + orderBasicInfo = generateOrder(generateOrderDTO); } catch (ParseException e) { throw new RuntimeException(e); } // 支付订单 PayOrderDTO payOrderDTO = new PayOrderDTO(); - payOrderDTO.setOrderCode(orderCode); + payOrderDTO.setOrderCode(orderBasicInfo.getOrderCode()); payOrderDTO.setPayMode(OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue()); payOrderDTO.setMemberId(dto.getMemberId()); payOrder(payOrderDTO); - return orderCode; + + // 插入个人桩充电记录表 + try { + personalChargingRecordService.processPersonalChargingRecord(orderBasicInfo); + } catch (Exception e) { + logger.error("插入个人桩充电记录表error, orderCode:{}, transactionCode:{}", + orderBasicInfo.getOrderCode(), orderBasicInfo.getTransactionCode()); + } + + return orderBasicInfo.getOrderCode(); } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 9b554e160..147db42fd 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -687,24 +687,35 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { // 查支付记录 List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); - Map payRecordMap = payRecordList.stream() - .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); - // 取出本金支付金额 - BigDecimal principalPay = null; + // 根据payMode分组 + Map> payRecordMap = payRecordList.stream() + .collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); // 获取本金支付的记录 - OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE); - if (principalPayRecord != null) { - principalPay = principalPayRecord.getPayAmount(); + List principalPayRecordList = payRecordMap.get(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()); + BigDecimal principalPay = null; + if (CollectionUtils.isNotEmpty(principalPayRecordList)) { + principalPay = principalPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); } + // 获取赠送金支付的记录 + List giftPayRecordList = payRecordMap.get(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()); + BigDecimal giftPay = null; + if (CollectionUtils.isNotEmpty(giftPayRecordList)) { + giftPay = giftPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + BigDecimal discountAmount = orderBasicInfo.getDiscountAmount() == null ? BigDecimal.ZERO : orderBasicInfo.getDiscountAmount(); + // 计算需要退回的金额 - Map returnAmountMap = calculateReturnAmount(principalPay, null, orderAmount); + Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount, discountAmount); logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", - orderCode, orderAmount, principalPay, null, JSON.toJSONString(returnAmountMap)); + orderCode, orderAmount, principalPay, giftPay, JSON.toJSONString(returnAmountMap)); // 需要退回本金的金额 BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); + // 需要退回赠送金的金额 + BigDecimal returnGift = returnAmountMap.get("returnGift"); // 更新会员钱包/余额退回到钱包 UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() @@ -712,6 +723,7 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 .updatePrincipalBalance(returnPrincipal) + .updateGiftBalance(returnGift) .relatedOrderCode(orderCode) .build(); memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/PileReservedVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/PileReservationInfoVO.java similarity index 71% rename from jsowell-pile/src/main/java/com/jsowell/pile/vo/PileReservedVO.java rename to jsowell-pile/src/main/java/com/jsowell/pile/vo/PileReservationInfoVO.java index 3e7387c15..4e32f9d39 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/PileReservedVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/PileReservationInfoVO.java @@ -7,7 +7,7 @@ import lombok.Setter; @Getter @Setter @Builder -public class PileReservedVO { +public class PileReservationInfoVO { private String reservedId; /** @@ -15,6 +15,11 @@ public class PileReservedVO { */ private String pileSn; + /** + * 充电桩枪口编号 + */ + private String pileConnectorCode; + /** * 预约开始时间 */ @@ -28,11 +33,16 @@ public class PileReservedVO { /** * 周期性预约的频率,对于单次预约,该字段可以为 NULL。可能的值包括 daily, weekly, monthly */ - private String freq; + // private String freq; /** * 状态(0-未生效;1-生效) */ private String status; + /** + * 验证身份(1-是; 0-否) + */ + private String verifyIdentity; + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/PersonPileRealTimeVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/PersonPileRealTimeVO.java index 7c258178c..d0b081dd5 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/PersonPileRealTimeVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/customer/PersonPileRealTimeVO.java @@ -45,4 +45,14 @@ public class PersonPileRealTimeVO { * 实时功率 */ private String instantPower; + + /** + * 枪口状态 + */ + private String status; + + /** + * soc + */ + private String soc; } diff --git a/jsowell-pile/src/main/java/com/jsowell/wxpay/service/WxAppletRemoteService.java b/jsowell-pile/src/main/java/com/jsowell/wxpay/service/WxAppletRemoteService.java index e8f5897f4..ee2f9f9e6 100644 --- a/jsowell-pile/src/main/java/com/jsowell/wxpay/service/WxAppletRemoteService.java +++ b/jsowell-pile/src/main/java/com/jsowell/wxpay/service/WxAppletRemoteService.java @@ -72,19 +72,14 @@ public class WxAppletRemoteService { @Value("${weixin.sendMsg.stopChargingTmpId}") private String stopChargingTmpId; + @Value("${weixin.sendMsg.startupResultTmpId}") + private String startupResultTmpId; /** * 获取accessToken * * @return */ public String getAccessToken() { - // String appid = Constants.APP_ID; - // String secret = Constants.APP_SECRET; - - // 这里我是从配置文件中取得appid和appsecret - // appid = properties.getAppId(); - // secret = properties.getAppSecret(); - //查询token是否存在 String redisKey = CacheConstants.ACCESS_TOKEN + appid; // 使用缓存先查询AccessToken是否存在 @@ -236,7 +231,6 @@ public class WxAppletRemoteService { return uniAppSendMsg(msgInfo); } - /** * 停止充电发送消息 * @param dto @@ -281,7 +275,15 @@ public class WxAppletRemoteService { } /** - * 小程序发送消息方法 + * 预约充电结果小程序服务通知 + */ + public Map reservationStartupResultSendMsg() { + AppletTemplateMessageSendDTO msgInfo = new AppletTemplateMessageSendDTO(); + return uniAppSendMsg(msgInfo); + } + + /** + * 小程序发送消息方法/小程序通知/服务通知 * @param dto * @return */ diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml index ba6bbbd10..40c71f0b0 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml @@ -2950,8 +2950,8 @@ where t1.del_flag = '0' and `t1`.`member_id` = #{memberId,jdbcType=VARCHAR} and `t1`.`station_id` = #{stationId,jdbcType=VARCHAR} - and `t1`.`create_time` = ]]> #{endTime,jdbcType=VARCHAR} - and `t1`.`update_time` #{startTime,jdbcType=VARCHAR} + and `t1`.`charge_start_time` #{endTime,jdbcType=VARCHAR} + and `t1`.`charge_end_time` = ]]> #{startTime,jdbcType=VARCHAR} @@ -38,16 +39,16 @@ - insert into pile_reservation_info (member_id, pile_sn, pile_connector_code, - `status`, reservation_type, start_time, - end_time, freq, create_by, - create_time, update_by, update_time, - del_flag) - values (#{memberId,jdbcType=VARCHAR}, #{pileSn,jdbcType=VARCHAR}, #{pileConnectorCode,jdbcType=VARCHAR}, - #{status,jdbcType=VARCHAR}, #{reservationType,jdbcType=VARCHAR}, #{startTime,jdbcType=TIME}, - #{endTime,jdbcType=TIME}, #{freq,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, - #{createTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, - #{delFlag,jdbcType=CHAR}) + insert into pile_reservation_info (member_id, pile_sn, pile_connector_code, + `status`, reservation_type, verify_identity, + start_time, end_time, freq, + create_by, create_time, update_by, + update_time, del_flag) + values (#{memberId,jdbcType=VARCHAR}, #{pileSn,jdbcType=VARCHAR}, #{pileConnectorCode,jdbcType=VARCHAR}, + #{status,jdbcType=VARCHAR}, #{reservationType,jdbcType=VARCHAR}, #{verifyIdentity,jdbcType=VARCHAR}, + #{startTime,jdbcType=TIME}, #{endTime,jdbcType=TIME}, #{freq,jdbcType=VARCHAR}, + #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}, + #{updateTime,jdbcType=TIMESTAMP}, #{delFlag,jdbcType=CHAR}) @@ -68,6 +69,9 @@ reservation_type, + + verify_identity, + start_time, @@ -109,6 +113,9 @@ #{reservationType,jdbcType=VARCHAR}, + + #{verifyIdentity,jdbcType=VARCHAR}, + #{startTime,jdbcType=TIME}, @@ -154,6 +161,9 @@ reservation_type = #{reservationType,jdbcType=VARCHAR}, + + verify_identity = #{verifyIdentity,jdbcType=VARCHAR}, + start_time = #{startTime,jdbcType=TIME}, @@ -185,18 +195,19 @@ update pile_reservation_info set member_id = #{memberId,jdbcType=VARCHAR}, - pile_sn = #{pileSn,jdbcType=VARCHAR}, - pile_connector_code = #{pileConnectorCode,jdbcType=VARCHAR}, - `status` = #{status,jdbcType=VARCHAR}, - reservation_type = #{reservationType,jdbcType=VARCHAR}, - start_time = #{startTime,jdbcType=TIME}, - end_time = #{endTime,jdbcType=TIME}, - freq = #{freq,jdbcType=VARCHAR}, - create_by = #{createBy,jdbcType=VARCHAR}, - create_time = #{createTime,jdbcType=TIMESTAMP}, - update_by = #{updateBy,jdbcType=VARCHAR}, - update_time = #{updateTime,jdbcType=TIMESTAMP}, - del_flag = #{delFlag,jdbcType=CHAR} + pile_sn = #{pileSn,jdbcType=VARCHAR}, + pile_connector_code = #{pileConnectorCode,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=VARCHAR}, + reservation_type = #{reservationType,jdbcType=VARCHAR}, + verify_identity = #{verifyIdentity,jdbcType=VARCHAR}, + start_time = #{startTime,jdbcType=TIME}, + end_time = #{endTime,jdbcType=TIME}, + freq = #{freq,jdbcType=VARCHAR}, + create_by = #{createBy,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + update_by = #{updateBy,jdbcType=VARCHAR}, + update_time = #{updateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=CHAR} where id = #{id,jdbcType=INTEGER} @@ -228,6 +239,11 @@ when id = #{item.id,jdbcType=INTEGER} then #{item.reservationType,jdbcType=VARCHAR} + + + when id = #{item.id,jdbcType=INTEGER} then #{item.verifyIdentity,jdbcType=VARCHAR} + + when id = #{item.id,jdbcType=INTEGER} then #{item.startTime,jdbcType=TIME} @@ -313,6 +329,13 @@ + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.verifyIdentity,jdbcType=VARCHAR} + + + @@ -378,15 +401,16 @@ insert into pile_reservation_info - (member_id, pile_sn, pile_connector_code, `status`, reservation_type, start_time, end_time, - freq, create_by, create_time, update_by, update_time, del_flag) + (member_id, pile_sn, pile_connector_code, `status`, reservation_type, verify_identity, + start_time, end_time, freq, create_by, create_time, update_by, update_time, del_flag + ) values - (#{item.memberId,jdbcType=VARCHAR}, #{item.pileSn,jdbcType=VARCHAR}, #{item.pileConnectorCode,jdbcType=VARCHAR}, - #{item.status,jdbcType=VARCHAR}, #{item.reservationType,jdbcType=VARCHAR}, #{item.startTime,jdbcType=TIME}, - #{item.endTime,jdbcType=TIME}, #{item.freq,jdbcType=VARCHAR}, #{item.createBy,jdbcType=VARCHAR}, - #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateBy,jdbcType=VARCHAR}, #{item.updateTime,jdbcType=TIMESTAMP}, - #{item.delFlag,jdbcType=CHAR}) + (#{item.memberId,jdbcType=VARCHAR}, #{item.pileSn,jdbcType=VARCHAR}, #{item.pileConnectorCode,jdbcType=VARCHAR}, + #{item.status,jdbcType=VARCHAR}, #{item.reservationType,jdbcType=VARCHAR}, #{item.verifyIdentity,jdbcType=VARCHAR}, + #{item.startTime,jdbcType=TIME}, #{item.endTime,jdbcType=TIME}, #{item.freq,jdbcType=VARCHAR}, + #{item.createBy,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateBy,jdbcType=VARCHAR}, + #{item.updateTime,jdbcType=TIMESTAMP}, #{item.delFlag,jdbcType=CHAR}) @@ -401,6 +425,7 @@ pile_connector_code, `status`, reservation_type, + verify_identity, start_time, end_time, freq, @@ -420,6 +445,7 @@ #{pileConnectorCode,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{reservationType,jdbcType=VARCHAR}, + #{verifyIdentity,jdbcType=VARCHAR}, #{startTime,jdbcType=TIME}, #{endTime,jdbcType=TIME}, #{freq,jdbcType=VARCHAR}, @@ -439,6 +465,7 @@ pile_connector_code = #{pileConnectorCode,jdbcType=VARCHAR}, `status` = #{status,jdbcType=VARCHAR}, reservation_type = #{reservationType,jdbcType=VARCHAR}, + verify_identity = #{verifyIdentity,jdbcType=VARCHAR}, start_time = #{startTime,jdbcType=TIME}, end_time = #{endTime,jdbcType=TIME}, freq = #{freq,jdbcType=VARCHAR}, @@ -471,6 +498,9 @@ reservation_type, + + verify_identity, + start_time, @@ -516,6 +546,9 @@ #{reservationType,jdbcType=VARCHAR}, + + #{verifyIdentity,jdbcType=VARCHAR}, + #{startTime,jdbcType=TIME}, @@ -561,6 +594,9 @@ reservation_type = #{reservationType,jdbcType=VARCHAR}, + + verify_identity = #{verifyIdentity,jdbcType=VARCHAR}, + start_time = #{startTime,jdbcType=TIME}, @@ -616,4 +652,12 @@ and status = '1' and pile_connector_code = #{pileConnectorCode,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/jsowell-ui/src/api/pile/occupy.js b/jsowell-ui/src/api/pile/occupy.js index 8348ce6c6..5a9654811 100644 --- a/jsowell-ui/src/api/pile/occupy.js +++ b/jsowell-ui/src/api/pile/occupy.js @@ -50,4 +50,13 @@ export function noNeedPay(data) { method: 'post', data: data }) -} \ No newline at end of file +} + +// 重新计算 +export function retryCalculateOccupyPileOrderAmount(data) { + return request({ + url: '/pile/occupy/retryCalculateOccupyPileOrderAmount', + method: 'post', + data: data + }) +} diff --git a/jsowell-ui/src/views/pile/card/index.vue b/jsowell-ui/src/views/pile/card/index.vue index a332bc96c..bea51da7c 100644 --- a/jsowell-ui/src/views/pile/card/index.vue +++ b/jsowell-ui/src/views/pile/card/index.vue @@ -185,7 +185,7 @@ export default { // 非单个禁用 single: true, // 非多个禁用 - multiple: true, + multiple: false, // 显示搜索条件 showSearch: true, // 总条数 @@ -302,7 +302,7 @@ export default { handleSelectionChange(selection) { this.ids = selection.map(item => item.id) this.single = selection.length !== 1 - this.multiple = !selection.length + // this.multiple = !selection.length }, /** 新增按钮操作 */ handleAdd() { diff --git a/jsowell-ui/src/views/pile/occupy/index.vue b/jsowell-ui/src/views/pile/occupy/index.vue index 7abeecf62..c5b2f3f51 100644 --- a/jsowell-ui/src/views/pile/occupy/index.vue +++ b/jsowell-ui/src/views/pile/occupy/index.vue @@ -22,14 +22,14 @@ placeholder="请选择占桩开始时间"> - - - - - - + + + + + @@ -106,6 +106,9 @@ 无需支付 + 重新计算占桩订单金额 + @@ -177,7 +180,15 @@