ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java
@@ -14,6 +14,16 @@ public class ChargingOrderListVO { @ApiModelProperty(value = "电站名称") private String siteName; @ApiModelProperty(value = "电站id") private Integer siteId; @ApiModelProperty(value = "充电桩id") private Integer chargingPileId; @ApiModelProperty(value = "用户id") private Long appUserId; @ApiModelProperty(value = "用户车辆id") private Long appUserCarId; @ApiModelProperty(value = "充电枪id") private Integer chargingGunId; @ApiModelProperty(value = "订单编号") private String code; @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))") @@ -23,7 +33,7 @@ @ApiModelProperty(value = "充电时间 秒") private Long chargingSecond; @ApiModelProperty(value = "充电电流 度") private String chargingCapacity; private BigDecimal chargingCapacity; @ApiModelProperty(value = "车牌号") private String licensePlate; @ApiModelProperty(value = "客户手机号") @@ -35,11 +45,11 @@ @ApiModelProperty(value = "累计服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "平台手续费") private BigDecimal platFormMoney; private BigDecimal commissionAmount; @ApiModelProperty(value = "引流平台") private String platform; private String sourceName; @ApiModelProperty(value = "平台分佣") private BigDecimal platformCommission; private BigDecimal sharingAmount; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime startTime; @@ -54,4 +64,8 @@ private Integer endMode; @ApiModelProperty(value = "电流占比") private String electronicProportion; @ApiModelProperty(value = "订单id") private Long id; @ApiModelProperty(value = "订单uid") private String uid; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.order.api.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.page.PageInfo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Data @ApiModel(value = "ChargingOrderTimeVO对象",description = "充电时段统计VO") public class ChargingOrderTimeVO { @ApiModelProperty(value = "订单数量") private Integer orderCount; @ApiModelProperty(value = "充电总度数") private BigDecimal chargingCapacity; @ApiModelProperty(value = "充电到账金额") private BigDecimal paymentAmount; @ApiModelProperty(value = "累计电费") private BigDecimal electrovalence; @ApiModelProperty(value = "累计服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "尖峰平谷充电量") private String capacityProportion; @ApiModelProperty(value = "尖峰平谷服务费") private String serviceProportion; @ApiModelProperty(value = "尖峰平谷充电到账") private String electronicProportion; @ApiModelProperty(value = "列表数据") private PageInfo<ChargingOrderListVO> list; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
@@ -14,6 +14,8 @@ import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.order.api.query.VipShoppingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.dto.ChargingListQuery; import com.ruoyi.order.dto.PayOrderDto; import com.ruoyi.order.dto.PayOrderQueryDto; import com.ruoyi.order.service.*; @@ -87,8 +89,9 @@ @ResponseBody @PostMapping(value = "/chargingList") @ApiOperation(value = "充电时段统计列表", tags = {"管理后台-财务结算"}) public R<PageInfo<PayOrderDto>> payOrderList(@RequestBody PayOrderQueryDto payOrderQueryDto) { return chargingOrderService.payOrderQuery(payOrderQueryDto); public AjaxResult<ChargingOrderTimeVO> chargingList(@RequestBody ChargingListQuery dto) { ChargingOrderTimeVO res = chargingOrderService.chargingList(dto); return AjaxResult.success(res); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
New file @@ -0,0 +1,38 @@ package com.ruoyi.order.dto; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; import java.util.List; @Data public class ChargingListQuery extends BasePage { @ApiModelProperty("订单编号") private String code; @ApiModelProperty("电站id") private Integer siteId; @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") private Integer status; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("车牌号") private String licensePlate; @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))") private Integer orderType; @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String startTime; @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String endTime; @ApiModelProperty("用户ids 前端忽略") private List<Long> userIds; @ApiModelProperty("车辆ids 前端忽略") private List<Long> carIds; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -5,11 +5,9 @@ import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.dto.ChargingRefundDto; import com.ruoyi.order.dto.GetNoInvoicedOrder; import com.ruoyi.order.dto.PayOrderDto; import com.ruoyi.order.dto.PayOrderQueryDto; import com.ruoyi.order.dto.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -55,4 +53,8 @@ List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto); List<TChargingOrderRefund> getRefundList(@Param("pageInfo")PageInfo<TChargingOrderRefund> pageInfo,@Param("data") ChargingRefundDto chargingRefundDto); List<ChargingOrderListVO> chargingList(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); List<ChargingOrderListVO> chargingList1( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -8,6 +8,7 @@ import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.*; @@ -90,4 +91,6 @@ R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto); R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto); ChargingOrderTimeVO chargingList(ChargingListQuery dto); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -33,6 +33,8 @@ import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.model.TOrderEvaluate; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.*; @@ -80,6 +82,10 @@ private AppUserCarClient appUserCarClient; @Resource private AppUserClient appUserClient; @Resource private ChargingPileClient chargingPileClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @@ -92,9 +98,6 @@ @Resource private AliPaymentClient aliPaymentClient; @Resource private ChargingPileClient chargingPileClient; @Resource @@ -569,6 +572,12 @@ BigDecimal electronicMoney = new BigDecimal("0"); BigDecimal serviceMoney = new BigDecimal("0"); for (ChargingOrderVO chargingOrderVO : list) { TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData(); TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData(); if (data2!=null && data3!=null){ chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName()); } if (chargingOrderVO.getChargingCapacity()!=null){ total = total.add(chargingOrderVO.getChargingCapacity()); } @@ -579,14 +588,8 @@ BigDecimal electronicMoney1 = new BigDecimal("0"); // 单个订单累计服务费 BigDecimal serviceMoney1 = new BigDecimal("0"); LocalDateTime startTime = chargingOrderVO.getStartTime(); LocalDateTime endTime = chargingOrderVO.getEndTime(); // 计算时间差 秒 充电时长 if (startTime!=null && endTime!=null){ long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingOrderVO.setChargingSecond(between); time += between; } // todo 调用第三方获取充电时长 秒 // 总收入 if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){ income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount())); @@ -651,4 +654,166 @@ return R.ok(pageInfo); } @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; String startTime2 = null; String endTime1 = null; String endTime2 = null; if (StringUtils.hasLength(dto.getStartTime())){ String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } if (StringUtils.hasLength(dto.getEndTime())){ String[] split = dto.getEndTime().split(" - "); endTime1 = split[0]; endTime2 = split[1]; } ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO(); PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); for (ChargingOrderListVO chargingOrderListVO : list) { List<Integer> integers = new ArrayList<>(); integers.add(chargingOrderListVO.getSiteId()); List<Site> data = siteClient.getSiteByIds(integers).getData(); if (!data.isEmpty()) { chargingOrderListVO.setSiteName(data.get(0).getName()); } TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData(); TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData(); if (data2 != null && data1 != null) { chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName()); } // todo 充电时长 调用第三方获取 TAppUser data3 = appUserClient.getUserById(chargingOrderListVO.getAppUserId()).getData(); List<Long> carId = new ArrayList<>(); if (chargingOrderListVO.getAppUserCarId() != null) { carId.add(chargingOrderListVO.getAppUserCarId()); List<TAppUserCar> data4 = appUserCarClient.getCarByIds(carId).getData(); if (!data4.isEmpty()) chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate()); } if (data3 != null) chargingOrderListVO.setPhone(data3.getPhone()); List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list(); // 尖峰平谷充电量 度数 BigDecimal jian = new BigDecimal("0"); BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); BigDecimal total = new BigDecimal("0"); for (TChargingOrderAccountingStrategy temp : list2) { switch (temp.getType()) { case 1: jian = jian.add(temp.getChargingCapacity()); break; case 2: feng = feng.add(temp.getChargingCapacity()); break; case 3: ping = ping.add(temp.getChargingCapacity()); break; case 4: gu = gu.add(temp.getChargingCapacity()); break; } } total = total.add(jian).add(feng).add(ping).add(gu); chargingOrderListVO.setElectronicProportion( jian.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(尖)/" +feng.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(峰)/" +ping.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(平)/" +gu.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(谷)"); } // 不分页 List<ChargingOrderListVO> list1 = this.baseMapper.chargingList1(dto,startTime1,startTime2,endTime1,endTime2); chargingOrderTimeVO.setOrderCount(list1.size()); // 计算充电总度数 BigDecimal electronic = new BigDecimal("0"); // 支付金额 BigDecimal paymentAmount = new BigDecimal("0"); // 电费 BigDecimal electrovalence = new BigDecimal("0"); // 服务费 BigDecimal serviceCharge = new BigDecimal("0"); // 尖峰平谷充电到账 BigDecimal jianElectronic = new BigDecimal("0"); BigDecimal fengElectronic = new BigDecimal("0"); BigDecimal pingElectronic = new BigDecimal("0"); BigDecimal guElectronic = new BigDecimal("0"); // 尖峰平谷服务费 BigDecimal jianService = new BigDecimal("0"); BigDecimal fengService = new BigDecimal("0"); BigDecimal pingService = new BigDecimal("0"); BigDecimal guService = new BigDecimal("0"); // 尖峰平谷充电量 度数 BigDecimal jian = new BigDecimal("0"); BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); for (ChargingOrderListVO chargingOrderListVO : list1) { electronic = electronic.add(chargingOrderListVO.getChargingCapacity()); paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount()); electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence()); serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge()); List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list(); for (TChargingOrderAccountingStrategy temp : list2) { switch (temp.getType()){ case 1: jian = jian.add(temp.getChargingCapacity()); jianElectronic = jianElectronic.add(temp.getChargingCapacity()); jianService = jianService.add(temp.getChargingCapacity()); break; case 2: feng = feng.add(temp.getChargingCapacity()); fengElectronic = fengElectronic.add(temp.getChargingCapacity()); fengService = fengService.add(temp.getChargingCapacity()); break; case 3: ping = ping.add(temp.getChargingCapacity()); pingElectronic = pingElectronic.add(temp.getChargingCapacity()); pingService = pingService.add(temp.getChargingCapacity()); break; case 4: gu = gu.add(temp.getChargingCapacity()); guElectronic = guElectronic.add(temp.getChargingCapacity()); guService = guService.add(temp.getChargingCapacity()); break; } } } chargingOrderTimeVO.setChargingCapacity(electronic); chargingOrderTimeVO.setPaymentAmount(paymentAmount); chargingOrderTimeVO.setElectrovalence(electrovalence); chargingOrderTimeVO.setServiceCharge(serviceCharge); // 计算尖峰平谷充电量占比 BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic); // 计算尖峰平谷服务费占比 BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService); // 计算尖峰平谷充电到账占比 BigDecimal add2 = jian.add(feng).add(ping).add(gu); chargingOrderTimeVO.setCapacityProportion(jianElectronic+"度/"+fengElectronic+"度/"+pingElectronic+"度/"+guElectronic+"度-" +jianElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +fengElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +pingElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +guElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setServiceProportion(jianService+"元/"+fengService+"元/"+pingService+"元/"+guService+"元-" +jianService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +fengService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +pingService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +guService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setElectronicProportion(jian+"元/"+feng+"元/"+ping+"元/"+gu+"元-" +jian.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +feng.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +ping.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +gu.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setList(pageInfo); return chargingOrderTimeVO; } } ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -233,4 +233,78 @@ </select> <select id="chargingList" resultType="com.ruoyi.order.api.vo.ChargingOrderListVO"> select t1.* from t_charging_order t1 where 1=1 <if test="null != req.code and req.code!=''"> and t1.code LIKE CONCAT('%',#{req.code},'%') </if> <if test="null != req.carIds and req.carIds.size()>0" > and t1.app_user_car_id in <foreach collection="req.carIds" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </if> <if test="null != req.userIds and req.userIds.size()>0" > and t1.app_user_id in <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </if> <if test="req.orderType != null "> and t1.order_type = #{req.orderType} </if> <if test="req.status != null "> and t1.status = #{status} </if> <if test="req.status != null "> and t1.status = #{req.status} </if> <if test="req.siteId != null "> and t1.site_id = #{req.siteId} </if> <if test="startTime1 != null and startTime1!=''"> and (t1.start_time between #{startTime1} and #{startTime2}) </if> <if test="endTime1 != null and endTime1!=''"> and (t1.end_time between #{endTime1} and #{endTime2}) </if> </select> <select id="chargingList1" resultType="com.ruoyi.order.api.vo.ChargingOrderListVO"> select t1.* from t_charging_order t1 where 1=1 <if test="null != req.code and req.code!=''"> and t1.code LIKE CONCAT('%',#{req.code},'%') </if> <if test="null != req.carIds and req.carIds.size()>0" > and t1.app_user_car_id in <foreach collection="req.carIds" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </if> <if test="null != req.userIds and req.userIds.size()>0" > and t1.app_user_id in <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </if> <if test="req.orderType != null "> and t1.order_type = #{req.orderType} </if> <if test="req.status != null "> and t1.status = #{status} </if> <if test="req.status != null "> and t1.status = #{req.status} </if> <if test="req.siteId != null "> and t1.site_id = #{req.siteId} </if> <if test="startTime1 != null and startTime1!=''"> and (t1.start_time between #{startTime1} and #{startTime2}) </if> <if test="endTime1 != null and endTime1!=''"> and (t1.end_time between #{endTime1} and #{endTime2}) </if> </select> </mapper>