From d537e1d9956af57bbb4e45f0283e7a4a4f9515e7 Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Mon, 14 Aug 2023 16:44:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=A0=E6=A1=A9=E8=AE=A2=E5=8D=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsowell/pile/domain/OrderPileOccupy.java | 13 +- .../pile/mapper/OrderPileOccupyMapper.java | 8 ++ .../pile/service/OrderPileOccupyService.java | 3 +- .../impl/OrderPileOccupyServiceImpl.java | 118 +++++++++++++++- .../pile/vo/web/BillingTemplateVO.java | 6 + .../mapper/pile/OrderPileOccupyMapper.xml | 132 +++++++++++++++--- .../mapper/pile/PileBillingTemplateMapper.xml | 2 + 7 files changed, 255 insertions(+), 27 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderPileOccupy.java b/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderPileOccupy.java index 239191715..37c197bec 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderPileOccupy.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/domain/OrderPileOccupy.java @@ -2,6 +2,7 @@ package com.jsowell.pile.domain; import lombok.*; +import java.math.BigDecimal; import java.util.Date; /** @@ -24,7 +25,7 @@ public class OrderPileOccupy { private String occupyCode; /** - * 状态(0-占桩中;1-订单完成) + * 状态(0-占桩中;1-订单完成; 2-订单挂起) */ private String status; @@ -33,6 +34,11 @@ public class OrderPileOccupy { */ private String memberId; + /** + * 充电站id + */ + private String stationId; + /** * 订单号 */ @@ -58,6 +64,11 @@ public class OrderPileOccupy { */ private String payStatus; + /** + * 占桩订单金额 + */ + private BigDecimal orderAmount; + /** * 充电桩编号 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPileOccupyMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPileOccupyMapper.java index e149e41b2..09f0e16cc 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPileOccupyMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPileOccupyMapper.java @@ -68,4 +68,12 @@ public interface OrderPileOccupyMapper { OrderPileOccupy queryByOccupyCode(@Param("occupyCode") String occupyCode); List queryOccupyOrderList(@Param("dto") QueryOccupyOrderDTO dto); + + /** + * 根据桩号和枪号查询占桩中的订单 + * + * @param pileSn + * @param connectorCode + */ + OrderPileOccupy queryOccupiedOrder(@Param("pileSn") String pileSn, @Param("connectorCode") String connectorCode); } \ 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 e260e8726..668cbaa71 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 @@ -36,5 +36,6 @@ public interface OrderPileOccupyService{ */ void generateOccupyPileOrder(String memberId, String pileSn, String connectorCode); - void stopOccupyPileOrder(String occupyCode); + void stopOccupyPileOrder(String pileSn, String connectorCode); + } 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 754b27b00..0a9a6c9c3 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 @@ -3,15 +3,25 @@ package com.jsowell.pile.service.impl; import com.jsowell.common.constant.Constants; import com.jsowell.common.enums.DelFlagEnum; import com.jsowell.common.util.DateUtils; +import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; import com.jsowell.pile.domain.OrderPileOccupy; import com.jsowell.pile.dto.QueryOccupyOrderDTO; +import com.jsowell.pile.dto.QueryOrderDTO; import com.jsowell.pile.mapper.OrderPileOccupyMapper; +import com.jsowell.pile.service.IOrderBasicInfoService; +import com.jsowell.pile.service.IPileBasicInfoService; +import com.jsowell.pile.service.IPileBillingTemplateService; import com.jsowell.pile.service.OrderPileOccupyService; +import com.jsowell.pile.vo.base.PileInfoVO; +import com.jsowell.pile.vo.web.BillingTemplateVO; +import com.jsowell.pile.vo.web.OrderListVO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; import java.util.List; @Slf4j @@ -21,6 +31,15 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ @Resource private OrderPileOccupyMapper orderPileOccupyMapper; + @Resource + private IPileBasicInfoService pileBasicInfoService; + + @Resource + private IOrderBasicInfoService orderBasicInfoService; + + @Resource + private IPileBillingTemplateService pileBillingTemplateService; + @Override public int deleteByPrimaryKey(Integer id) { return orderPileOccupyMapper.deleteByPrimaryKey(id); @@ -83,6 +102,9 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ */ @Override public OrderPileOccupy queryByOccupyCode(String occupyCode) { + if (StringUtils.isBlank(occupyCode)) { + return null; + } return orderPileOccupyMapper.queryByOccupyCode(occupyCode); } @@ -113,6 +135,10 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ orderPileOccupy.setStatus(Constants.ZERO); // 占桩中 orderPileOccupy.setPayStatus(Constants.ZERO); // 未支付 orderPileOccupy.setPileSn(pileSn); + PileInfoVO pileInfoVO = pileBasicInfoService.selectPileInfoBySn(pileSn); + if (pileInfoVO != null) { + orderPileOccupy.setStationId(pileInfoVO.getStationId()); + } orderPileOccupy.setConnectorCode(connectorCode); orderPileOccupy.setPileConnectorCode(pileSn + connectorCode); orderPileOccupy.setStartTime(DateUtils.getNowDate()); @@ -121,16 +147,34 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ } /** + * 收到地锁升起指令,调用这个方法,停止计时 * 占桩订单停止计费/停止占桩订单计费 + * @param pileSn + * @param connectorCode */ @Override - public void stopOccupyPileOrder(String occupyCode) { - OrderPileOccupy orderPileOccupy = queryByOccupyCode(occupyCode); + public void stopOccupyPileOrder(String pileSn, String connectorCode) { + // 根据充电站sn和枪口号,查询占桩中的占桩订单 + OrderPileOccupy orderPileOccupy = orderPileOccupyMapper.queryOccupiedOrder(pileSn, connectorCode); if (orderPileOccupy == null) { - log.error("根据占桩订单编号:{}, 查询为空", occupyCode); return; } + // 设置结束时间 orderPileOccupy.setEndTime(DateUtils.getNowDate()); + + // 计算金额 + 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); + // 更新数据库 orderPileOccupyMapper.updateByPrimaryKeySelective(orderPileOccupy); } @@ -138,8 +182,74 @@ public class OrderPileOccupyServiceImpl implements OrderPileOccupyService{ * 计算占桩订单金额 * calculateTheAmountOfTheOccupancyOrder */ - public void calculateOccupyPileOrderAmount(String occupyCode) { + private BigDecimal calculateOccupyPileOrderAmount(OrderPileOccupy orderPileOccupy) { + BigDecimal resultAmount = BigDecimal.ZERO; + String occupyCode = orderPileOccupy.getOccupyCode(); + Date startTime = orderPileOccupy.getStartTime(); // 占桩开始时间 + Date endTime = orderPileOccupy.getEndTime(); // 占桩结束时间 + /* + 查新站点计费模板 + */ + BillingTemplateVO billingTemplate = pileBillingTemplateService.queryUsedBillingTemplate(orderPileOccupy.getStationId()); + if (billingTemplate == null) { + log.info("计算占桩订单金额-查询站点:{}计费模板为空, 不收取占桩费用", orderPileOccupy.getStationId()); + return resultAmount; + } + Integer freeTime = billingTemplate.getFreeTime(); // 免费时长 + BigDecimal occupyFee = billingTemplate.getOccupyFee(); // 占桩费率 + if (freeTime == null || occupyFee == null) { + log.info("计算占桩订单金额-站点:{}计费模板未设置免费时长和占桩费率, 不收取占桩费用", orderPileOccupy.getStationId()); + return resultAmount; + } + + // 占桩时长 + long occupyTime = DateUtils.intervalTime(startTime, endTime); + if (freeTime > occupyTime) { + log.info("计算占桩订单金额-站点:{}的占桩订单:{}, 免费时长:{}大于占桩时长:{}, 不收取占桩费用", orderPileOccupy.getStationId(), occupyCode, freeTime, occupyTime); + return resultAmount; + } + + /* + 查询会员在占用时段内有没有充电订单 + */ + QueryOrderDTO dto = new QueryOrderDTO(); + dto.setMemberId(orderPileOccupy.getMemberId()); + dto.setStationId(orderPileOccupy.getStationId()); + // 查询在占桩期间创建的订单 + dto.setStartTime(DateUtils.formatDateTime(startTime)); + dto.setEndTime(DateUtils.formatDateTime(endTime)); + List orderListVOS = orderBasicInfoService.selectOrderBasicInfoList(dto); + + /* + 计算充电时长 + */ + long sumChargingTime = 0; + for (OrderListVO orderListVO : orderListVOS) { + String chargeStartTime = orderListVO.getChargeStartTime(); + String chargeEndTime = orderListVO.getChargeEndTime(); + // 如果没有开始时间或者结束时间,就不计入充电时长 + if (StringUtils.isBlank(chargeStartTime) || StringUtils.isNotBlank(chargeEndTime)) { + continue; + } + long l = DateUtils.intervalTime(chargeStartTime, chargeEndTime); + sumChargingTime = sumChargingTime + l; + } + + /* + 计算应收金额 + 应收金额 = (总占用时长 - (免费时长 + 充电时长)) * 占桩费率 + */ + BigDecimal totalOccupyTime = new BigDecimal(occupyTime + ""); + BigDecimal totalFreeTime = new BigDecimal(freeTime).add(new BigDecimal(sumChargingTime)); + if (totalFreeTime.compareTo(totalOccupyTime) >= 0) { + log.info("计算占桩订单金额-站点:{}的占桩订单:{}, 总免费时长:{}大于占桩时长:{}, 不收取占桩费用", orderPileOccupy.getStationId(), occupyCode, totalFreeTime, totalOccupyTime); + return resultAmount; + } + // 需要计费的时间 + BigDecimal time = totalOccupyTime.subtract(totalFreeTime); + resultAmount = time.multiply(occupyFee); + return resultAmount; } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BillingTemplateVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BillingTemplateVO.java index c5f834978..bb4cf54b0 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BillingTemplateVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BillingTemplateVO.java @@ -43,6 +43,12 @@ public class BillingTemplateVO { // 设备类型 1-电动汽车桩;2-电动自行车桩 private String deviceType; + // 免费时长(单位:分钟) + private Integer freeTime; + + // 占桩费率(单位:元/分钟) + private BigDecimal occupyFee; + // 尖时段电费 private BigDecimal sharpElectricityPrice; // 尖时段服务费 diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderPileOccupyMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderPileOccupyMapper.xml index 6e7bb5ab2..5bd2afb42 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderPileOccupyMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderPileOccupyMapper.xml @@ -8,11 +8,13 @@ + + @@ -24,9 +26,9 @@ - id, occupy_code, `status`, member_id, order_code, transaction_code, start_time, end_time, - pay_status, pile_sn, connector_code, pile_connector_code, create_time, create_by, - update_time, update_by, del_flag + id, occupy_code, `status`, member_id, station_id, order_code, transaction_code, start_time, + end_time, pay_status, order_amount, pile_sn, connector_code, pile_connector_code, + create_time, create_by, update_time, update_by, del_flag + + \ No newline at end of file diff --git a/jsowell-pile/src/main/resources/mapper/pile/PileBillingTemplateMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/PileBillingTemplateMapper.xml index 6659342b6..fa445a80c 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/PileBillingTemplateMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/PileBillingTemplateMapper.xml @@ -495,6 +495,8 @@ t2.name as templateName, t2.remark as remark, t2.type as deviceType, + t2.free_time as freeTime, + t2.occupy_fee as occupyFee, t2.publish_time as publishTime, t3.electricity_price AS sharpElectricityPrice, t3.service_price AS sharpServicePrice,