Merge remote-tracking branch 'origin/2.0' into 2.0.1
# Conflicts:
# ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
| | |
| | | private BigDecimal thirdPayAmount; |
| | | @ApiModelProperty(value = "余额支付金额") |
| | | private BigDecimal balancePayAmount; |
| | | @ApiModelProperty(value = "余额收入") |
| | | private BigDecimal balanceIncome; |
| | | @ApiModelProperty(value = "余额赠送收入") |
| | | private BigDecimal balanceGiftIncome; |
| | | @ApiModelProperty(value = "充电后剩余金额") |
| | | private BigDecimal residualAmount; |
| | | @ApiModelProperty(value = "累计电费") |
| New file |
| | |
| | | package com.ruoyi.order.api.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | public class SixIncomeCircleDto { |
| | | private String name; |
| | | private BigDecimal paymentAmount; |
| | | } |
| | |
| | | |
| | | import cn.afterturn.easypoi.excel.ExcelExportUtil; |
| | | import cn.afterturn.easypoi.excel.entity.ExportParams; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.ruoyi.account.api.feignClient.AppUserCarClient; |
| | | import com.ruoyi.account.api.feignClient.AppUserClient; |
| | | import com.ruoyi.account.api.model.TAppUser; |
| | | import com.ruoyi.account.api.model.TAppUserCar; |
| | | import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; |
| | | import com.ruoyi.chargingPile.api.feignClient.SiteClient; |
| | | import com.ruoyi.chargingPile.api.model.Partner; |
| | | import com.ruoyi.chargingPile.api.model.Site; |
| | | import com.ruoyi.chargingPile.api.model.TChargingGun; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.utils.DateUtils; |
| | | import com.ruoyi.common.core.utils.WebUtils; |
| | |
| | | import java.time.temporal.ChronoUnit; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | @Resource |
| | | private AppUserClient appUserClient; |
| | | @Resource |
| | | private ChargingGunClient chargingGunClient; |
| | | @Resource |
| | | private AppUserCarClient appUserCarClient; |
| | | @Resource |
| | | private AccountingStrategyOrderService accountingStrategyOrderService; |
| | | @Resource |
| | | private TChargingOrderAccountingStrategyService tChargingOrderAccountingStrategyService; |
| | | |
| | | |
| | | |
| | |
| | | public void export(@RequestBody ChargingListQuery dto) { |
| | | List<TChargingOrderExport> tChargingOrderExports = new ArrayList<>(); |
| | | List<ChargingOrderListVO> exportList = chargingOrderService.export(dto); |
| | | int i = 1; |
| | | List<TChargingGun> data = chargingGunClient.getAllGun().getData(); |
| | | List<Site> data9 = siteClient.getSiteAll().getData(); |
| | | List<TAppUser> data6 = appUserClient.getAllUser().getData(); |
| | | List<Partner> data7 = siteClient.getAllPartner().getData(); |
| | | // List<Long> collect = exportList.stream().map(ChargingOrderListVO::getId).collect(Collectors.toList()); |
| | | // List<TChargingOrderAccountingStrategy> stageCostAll = tChargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>() |
| | | // .in("charging_order_id", collect)); |
| | | List<TVip> data5 = vipClient.getAllVip().getData(); |
| | | List<TAppUserCar> data8 = appUserCarClient.getAllCar().getData(); |
| | | for (ChargingOrderListVO chargingOrderListVO : exportList) { |
| | | TChargingOrderExport tChargingOrderExport = new TChargingOrderExport(); |
| | | Site site = data9.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null); |
| | | TAppUser data3 = data6.stream().filter(e->e.getId().equals(chargingOrderListVO.getAppUserId())).findFirst().orElse(null); |
| | | TChargingGun data4 = data.stream().filter(e->e.getId().equals(chargingOrderListVO.getChargingGunId())).findFirst().orElse(null); |
| | | if (site!=null){ |
| | | tChargingOrderExport.setSiteCode(site.getCode()); |
| | | tChargingOrderExport.setSiteName(chargingOrderListVO.getSiteName()); |
| | | tChargingOrderExport.setCity(site.getCity()); |
| | | tChargingOrderExport.setCityName(site.getDistricts()); |
| | | tChargingOrderExport.setSiteType(site.getSiteType()); |
| | | tChargingOrderExport.setStatus(site.getStatus()+""); |
| | | Partner data2 = data7.stream().filter(e->e.getId().equals(site.getPartnerId())).findFirst().orElse(null); |
| | | if (data2!=null){ |
| | | tChargingOrderExport.setPartner(data2.getName()); |
| | | } |
| | | } |
| | | tChargingOrderExport.setSaleType("1"); |
| | | tChargingOrderExport.setBusinessCategory("1"); |
| | | tChargingOrderExport.setId(i); |
| | | tChargingOrderExport.setCode(chargingOrderListVO.getCode()); |
| | | tChargingOrderExport.setTerminalName(chargingOrderListVO.getTerminalName()); |
| | | tChargingOrderExport.setName(chargingOrderListVO.getAccountingStrategyName()); |
| | | tChargingOrderExport.setOrderClassification("1"); |
| | | tChargingOrderExport.setStartType("扫码"); |
| | | tChargingOrderExport.setOne("小程序"); |
| | | if (chargingOrderListVO.getRechargePaymentType()!=null){ |
| | | if (chargingOrderListVO.getOrderSource()!=null&&chargingOrderListVO.getOrderSource().equals(2)){ |
| | |
| | | String s3 = DateUtils.localDateTimeToString(chargingOrderListVO.getEndTime()); |
| | | tChargingOrderExport.setEndTime(s3); |
| | | } |
| | | tChargingOrderExport.setRechargePaymentStatus(chargingOrderListVO.getRechargePaymentStatus()+""); |
| | | tChargingOrderExport.setType("充电订单"); |
| | | tChargingOrderExport.setChargingType("单桩双充"); |
| | | tChargingOrderExport.setEndmode(chargingOrderListVO.getEndMode()+""); |
| | | tChargingOrderExport.setChargingEndAccount("平台"); |
| | | tChargingOrderExport.setIsFree("否"); |
| | | tChargingOrderExport.setElectrovalence(chargingOrderListVO.getElectrovalence()+""); |
| | | tChargingOrderExport.setServiceCharge(chargingOrderListVO.getServiceCharge()+""); |
| | | tChargingOrderExport.setTotal(chargingOrderListVO.getPaymentAmount()+""); |
| | | tChargingOrderExport.setChargingCapacity(chargingOrderListVO.getElectricity()+""); |
| | | // List<TChargingOrderAccountingStrategy> stageCost = stageCostAll.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId())).collect(Collectors.toList()); |
| | | // if (!stageCost.isEmpty()){ |
| | | // // 累加时段电费单价 取平均值 |
| | | // BigDecimal bigDecimal1 = new BigDecimal("0"); |
| | | // BigDecimal bigDecimal2 = new BigDecimal("0"); |
| | | // BigDecimal bigDecimal3 = new BigDecimal("0"); |
| | | // BigDecimal size = new BigDecimal(stageCost.size()); |
| | | // |
| | | // for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : stageCost) { |
| | | // bigDecimal1 = bigDecimal1.add(tChargingOrderAccountingStrategy.getPeriodElectricPrice()); |
| | | // bigDecimal2 = bigDecimal2.add(tChargingOrderAccountingStrategy.getPeriodServicePrice()); |
| | | // bigDecimal3 = bigDecimal3.add(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice()); |
| | | // } |
| | | // BigDecimal divide1 = bigDecimal1.divide(size, 2, RoundingMode.HALF_DOWN); |
| | | // BigDecimal divide2 = bigDecimal2.divide(size, 2, RoundingMode.HALF_DOWN); |
| | | // BigDecimal divide3 = bigDecimal3.divide(size, 2, RoundingMode.HALF_DOWN); |
| | | // tChargingOrderExport.setElectrovalencePrice(divide1+""); |
| | | // tChargingOrderExport.setServiceChargePrice(divide2+""); |
| | | // tChargingOrderExport.setServiceChargePriceLook(divide3+""); |
| | | // } |
| | | tChargingOrderExport.setElectrovalencePrice(""); |
| | | tChargingOrderExport.setServiceChargePrice(""); |
| | | tChargingOrderExport.setServiceChargePriceLook(""); |
| | | tChargingOrderExport.setCumulativeChargingTime(chargingOrderListVO.getChargingSecond() + ""); |
| | | tChargingOrderExport.setRefundAmount(null != chargingOrderListVO.getRefundAmount() ? chargingOrderListVO.getRefundAmount().toString() : ""); |
| | | tChargingOrderExport.setStartSoc(chargingOrderListVO.getStartSoc()); |
| | | tChargingOrderExport.setEndtSoc(chargingOrderListVO.getEndSoc()); |
| | | tChargingOrderExport.setIsSoc("否"); |
| | | tChargingOrderExport.setIsSocType(""); |
| | | tChargingOrderExport.setIsSocNum("0"); |
| | | tChargingOrderExport.setUserType("普通个人用户"); |
| | | if (data3!=null&&data3.getVipId()!=null){ |
| | | TVip data1 = data5.stream().filter(e->e.getId().equals(data3.getVipId())).findFirst().orElse(null); |
| | | if (data1!=null){ |
| | |
| | | } |
| | | tChargingOrderExport.setIsPlus(chargingOrderListVO.getVipDiscountAmount().compareTo(BigDecimal.ZERO)>0?"是":"否"); |
| | | if (data3!=null){ |
| | | tChargingOrderExport.setRealName(data3.getName()); |
| | | tChargingOrderExport.setPhone(data3.getPhone()); |
| | | tChargingOrderExport.setNickName(data3.getName()); |
| | | } |
| | | if (data4!=null){ |
| | | tChargingOrderExport.setDeviceCode(data4.getCode()); |
| | | } |
| | | tChargingOrderExport.setAccountType("个人"); |
| | | TAppUserCar tAppUserCar = data8.stream().filter(e -> e.getId().equals(chargingOrderListVO.getAppUserId())).findFirst().orElse(null); |
| | | if (tAppUserCar!=null){ |
| | | tChargingOrderExport.setCarNumber(tAppUserCar.getLicensePlate()); |
| | | } |
| | | tChargingOrderExport.setBalanceIncome(formatMoney(chargingOrderListVO.getBalanceIncome())); |
| | | tChargingOrderExport.setBalanceGiftIncome(formatMoney(chargingOrderListVO.getBalanceGiftIncome())); |
| | | tChargingOrderExport.setTripartiteCommission(formatMoney(chargingOrderListVO.getSharingAmount())); |
| | | tChargingOrderExport.setOrderCode(chargingOrderListVO.getStartChargeSeq()); |
| | | tChargingOrderExport.setIsSingle("是"); |
| | | tChargingOrderExport.setPayTime(chargingOrderListVO.getPayTime()+""); |
| | | tChargingOrderExport.setSharingAmount(formatMoney(chargingOrderListVO.getSharingAmount())); |
| | | tChargingOrderExport.setIsWhitelist(Integer.valueOf(1).equals(chargingOrderListVO.getIsWhitelist()) ? "是" : "否"); |
| | |
| | | @ApiOperation(value = "电站收入分析", tags = {"后台-数据分析-平台收入分析"}) |
| | | public R<List<SixChargingDto>> charge(Integer siteId) { |
| | | Long userId = tokenService.getLoginUser().getUserid(); |
| | | //如果没传siteId,获取当前登陆人所有的siteIds |
| | | List<Integer> siteIds = new ArrayList<>(); |
| | | if (siteId==null){ |
| | | List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); |
| | | for (GetSiteListDTO datum : data) { |
| | | siteIds.add(datum.getId()); |
| | | } |
| | | }else { |
| | | siteIds.add(siteId); |
| | | } |
| | | if (siteIds.isEmpty()){ |
| | | siteIds.add(-1); |
| | | } |
| | | SysUser sysUser = sysUserClient.getSysUser(userId).getData(); |
| | | List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, siteId); |
| | | LocalDate sixBefore = PreviousSixMonths.get(); |
| | | //通过siteIds进行sql查询统计 |
| | | List<SixChargingDto> sixChargingDtos = generateLastSixMonths(); |
| | |
| | | @ApiOperation(value = "电站收入占比", tags = {"后台-数据分析-平台收入分析"}) |
| | | public R<List<SixCircleDto>> circle() { |
| | | Long userId = tokenService.getLoginUser().getUserid(); |
| | | //获取当前登录的siteIds |
| | | List<Integer> siteIds = new ArrayList<>(); |
| | | List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); |
| | | for (GetSiteListDTO datum : data) { |
| | | siteIds.add(datum.getId()); |
| | | } |
| | | //进行统计groupBySiteId |
| | | SysUser sysUser = sysUserClient.getSysUser(userId).getData(); |
| | | List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, null); |
| | | LocalDate sixBefore = PreviousSixMonths.get(); |
| | | if (siteIds.isEmpty()){ |
| | | siteIds.add(-1); |
| | | } |
| | | List<SixCircleDto> sixCircleDtos = chargingOrderService.circle(siteIds,sixBefore); |
| | | for (SixCircleDto sixCircleDto : sixCircleDtos) { |
| | | Site site = siteClient.getSiteByIds(Arrays.asList(sixCircleDto.getSiteId())).getData().get(0); |
| | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 查询平台收入分析底部数据分类,充电订单金额由数据库聚合,避免全量订单和计费明细加载超时。 |
| | | */ |
| | | @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) |
| | | @ResponseBody |
| | | @GetMapping(value = "/six/total") |
| | |
| | | //count近6个月的数据 |
| | | Long userId = tokenService.getLoginUser().getUserid(); |
| | | SysUser sysUser = sysUserClient.getSysUser(userId).getData(); |
| | | //获取当前登录的siteIds |
| | | List<Integer> siteIds = new ArrayList<>(); |
| | | List<GetSiteListDTO> data9 = siteClient.getSiteListByUserId(userId).getData(); |
| | | for (GetSiteListDTO datum : data9) { |
| | | siteIds.add(datum.getId()); |
| | | } |
| | | //进行统计groupBySiteId |
| | | if (siteIds.isEmpty()){ |
| | | siteIds.add(-1); |
| | | } |
| | | List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, null); |
| | | Map<String,Object> map = chargingOrderService.countAll(siteIds); |
| | | if(1 == sysUser.getObjectId()){ |
| | | boolean platformVisible = 1 == sysUser.getObjectId(); |
| | | if(platformVisible){ |
| | | BigDecimal data = parkingLotClient.getRecordAmount().getData(); |
| | | if (map ==null){ |
| | | map = new HashMap<String,Object>(); |
| | |
| | | map.put("shopAmount",0); |
| | | map.put("vipAmount",0); |
| | | } |
| | | List<TChargingOrder> list = chargingOrderService.lambdaQuery().eq(TChargingOrder::getStatus, 5).eq(TChargingOrder::getDelFlag, 0) |
| | | .eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getSiteId, siteIds).list(); |
| | | BigDecimal sharingAmount = BigDecimal.ZERO; |
| | | BigDecimal commissionAmount = BigDecimal.ZERO; |
| | | //计算list中electrovalence的总和 |
| | | BigDecimal totalElectrovalence = BigDecimal.ZERO; |
| | | //计算list中serviceCharge的总和 |
| | | BigDecimal totalServiceCharge = BigDecimal.ZERO; |
| | | List<TChargingOrderAccountingStrategy> accountingStrategyList = chargingOrderAccountingStrategyService.list(); |
| | | for (TChargingOrder order : list) { |
| | | List<TChargingOrderAccountingStrategy> collect = accountingStrategyList.stream().filter(s -> s.getChargingOrderId().equals(order.getId())).collect(Collectors.toList()); |
| | | BigDecimal periodElectricPrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | BigDecimal periodServicePrice = collect.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | totalElectrovalence = totalElectrovalence.add(periodElectricPrice); |
| | | if(2 != order.getOrderSource()){ |
| | | totalServiceCharge = totalServiceCharge.add(periodServicePrice); |
| | | commissionAmount = commissionAmount.add((periodElectricPrice.add(periodServicePrice)).multiply(new BigDecimal("0.006"))); |
| | | }else{ |
| | | totalServiceCharge = totalServiceCharge.add(periodServicePrice.multiply(new BigDecimal("0.8"))); |
| | | sharingAmount = sharingAmount.add(periodServicePrice.multiply(new BigDecimal("0.2"))); |
| | | } |
| | | } |
| | | map.put("service_charge",totalServiceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | map.put("electrovalence",totalElectrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | map.put("commission_amount",commissionAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | map.put("sharing_amount",sharingAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN)); |
| | | map.put("platformIncomeVisible", platformVisible); |
| | | return R.ok(map); |
| | | } |
| | | |
| | | @RequiresPermissions(value = {"/platformRevenueAnalysis"}, logical = Logical.OR) |
| | | @ResponseBody |
| | | @GetMapping(value = "/six/pay-type-circle") |
| | | @ApiOperation(value = "收入类型占比", tags = {"后台-数据分析-平台收入分析"}) |
| | | public R<List<SixIncomeCircleDto>> payTypeCircle() { |
| | | Long userId = tokenService.getLoginUser().getUserid(); |
| | | SysUser sysUser = sysUserClient.getSysUser(userId).getData(); |
| | | List<Integer> siteIds = resolvePlatformRevenueSiteIds(userId, sysUser, null); |
| | | LocalDate sixBefore = PreviousSixMonths.get(); |
| | | return R.ok(chargingOrderService.payTypeCircle(sixBefore, siteIds)); |
| | | } |
| | | |
| | | /** |
| | | * 解析平台收入分析页面允许查看的站点范围。 |
| | | * 合作商使用授权站点,其他后台账号沿用用户站点列表;传入站点时需做授权校验。 |
| | | */ |
| | | private List<Integer> resolvePlatformRevenueSiteIds(Long userId, SysUser sysUser, Integer siteId) { |
| | | List<Integer> siteIds = new ArrayList<>(); |
| | | if (sysUser != null && Integer.valueOf(2).equals(sysUser.getRoleType())) { |
| | | Set<Integer> authSiteIds = partnerClient.authSite(sysUser.getObjectId(), SiteMenu.SITE_LIST.getValue()).getData(); |
| | | if (authSiteIds != null) { |
| | | siteIds.addAll(authSiteIds); |
| | | } |
| | | } else { |
| | | List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData(); |
| | | if (data != null) { |
| | | for (GetSiteListDTO datum : data) { |
| | | siteIds.add(datum.getId()); |
| | | } |
| | | } |
| | | } |
| | | if (siteId != null) { |
| | | return siteIds.contains(siteId) ? Collections.singletonList(siteId) : Collections.singletonList(-1); |
| | | } |
| | | if (siteIds.isEmpty()) { |
| | | siteIds.add(-1); |
| | | } |
| | | return siteIds; |
| | | } |
| | | |
| | | |
| | | @RequiresPermissions(value = {"/chargeOrderMonitoring"}, logical = Logical.OR) |
| | | @ResponseBody |
| | |
| | | private String replaceUser; |
| | | @Excel(name = "车架号",width = 30) |
| | | private String carSiteName; |
| | | @Excel(name = "余额收入",width = 30) |
| | | private String balanceIncome; |
| | | @Excel(name = "余额赠送收入",width = 30) |
| | | private String balanceGiftIncome; |
| | | @Excel(name = "引流平台分佣",width = 30) |
| | | private String tripartiteCommission; |
| | | @Excel(name = "车架号来源",width = 30) |
| | | private String carSiteSource; |
| | | @Excel(name = "车牌号",width = 30) |
| | |
| | | |
| | | Map<String, Object> countAll(List<Integer> siteIds); |
| | | |
| | | List<SixIncomeCircleDto> payTypeCircle(LocalDate sixBefore, List<Integer> siteIds); |
| | | |
| | | List<Map<String, Object>> getSumByType(LocalDate start,LocalDate end,List<Integer> siteIds); |
| | | |
| | | List<Map<String, Object>> getDateData(LocalDate start,LocalDate end,List<Integer> siteIds); |
| | |
| | | return tCharingOrderVO; |
| | | } |
| | | |
| | | /** |
| | | * 填充充电桩订单列表余额收入,余额收入按真实充值余额统计,赠送余额单独展示。 |
| | | */ |
| | | private void fillChargingOrderBalanceIncome(List<ChargingOrderVO> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return; |
| | |
| | | dto.setSiteIds(siteIds); |
| | | } |
| | | |
| | | /** |
| | | * 查询充电桩订单余额收入明细,余额收入按真实充值余额统计,赠送收入单独展示。 |
| | | */ |
| | | @Override |
| | | public List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto) { |
| | | String startTime1 = null; |
| | |
| | | tCharingOrderVO.setWhitelistRefund(BigDecimal.ZERO); |
| | | } |
| | | |
| | | /** |
| | | * 汇总充电桩订单余额收入,兑换码使用记录的usedAmount包含赠送余额,SQL中需扣除giftUsedAmount。 |
| | | */ |
| | | private Map<String, Object> getExchangeCodeBalanceSummary(ChargingOrderQuery dto, String startTime1, String startTime2, String endTime1, String endTime2) { |
| | | Map<String, Object> totalMap = new HashMap<>(); |
| | | totalMap.put("balanceIncome", BigDecimal.ZERO); |
| | |
| | | @Override |
| | | public Map<String, Object> countAll(List<Integer> siteIds) { |
| | | return this.baseMapper.countAll(siteIds); |
| | | } |
| | | |
| | | /** |
| | | * 统计近六月订单收入支付方式占比;服务层聚合避免复杂CASE SQL在当前数据库驱动中转换异常。 |
| | | */ |
| | | @Override |
| | | public List<SixIncomeCircleDto> payTypeCircle(LocalDate sixBefore, List<Integer> siteIds) { |
| | | if (siteIds == null || siteIds.isEmpty()) { |
| | | return buildPayTypeCircleData(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO); |
| | | } |
| | | List<TChargingOrder> orders = this.lambdaQuery() |
| | | .select(TChargingOrder::getRechargePaymentType, TChargingOrder::getPayMethod, |
| | | TChargingOrder::getThirdPayAmount, TChargingOrder::getThirdRefundAmount, |
| | | TChargingOrder::getBalancePayAmount, TChargingOrder::getBalanceRefundAmount, |
| | | TChargingOrder::getPaymentAmount, TChargingOrder::getRechargeAmount, |
| | | TChargingOrder::getRefundAmount) |
| | | .eq(TChargingOrder::getDelFlag, 0) |
| | | .eq(TChargingOrder::getRechargePaymentStatus, 2) |
| | | .eq(TChargingOrder::getStatus, 5) |
| | | .ge(sixBefore != null, TChargingOrder::getCreateTime, sixBefore == null ? null : sixBefore.atStartOfDay()) |
| | | .in(TChargingOrder::getSiteId, siteIds) |
| | | .list(); |
| | | BigDecimal wechatAmount = BigDecimal.ZERO; |
| | | BigDecimal alipayAmount = BigDecimal.ZERO; |
| | | BigDecimal balanceAmount = BigDecimal.ZERO; |
| | | for (TChargingOrder order : orders) { |
| | | BigDecimal thirdPayAmount = getThirdPayNetAmount(order); |
| | | BigDecimal balancePayAmount = getBalancePayNetAmount(order); |
| | | Integer rechargePaymentType = order.getRechargePaymentType(); |
| | | if (Integer.valueOf(1).equals(rechargePaymentType)) { |
| | | wechatAmount = wechatAmount.add(thirdPayAmount); |
| | | } |
| | | if (Integer.valueOf(2).equals(rechargePaymentType) || Integer.valueOf(3).equals(rechargePaymentType)) { |
| | | alipayAmount = alipayAmount.add(thirdPayAmount); |
| | | } |
| | | Integer payMethod = order.getPayMethod(); |
| | | if (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod)) { |
| | | balanceAmount = balanceAmount.add(balancePayAmount); |
| | | } |
| | | } |
| | | return buildPayTypeCircleData(wechatAmount, alipayAmount, balanceAmount); |
| | | } |
| | | |
| | | /** |
| | | * 构造固定三类支付方式数据,保证前端饼图在无订单时也有稳定结构。 |
| | | */ |
| | | private List<SixIncomeCircleDto> buildPayTypeCircleData(BigDecimal wechatAmount, BigDecimal alipayAmount, BigDecimal balanceAmount) { |
| | | List<SixIncomeCircleDto> data = new ArrayList<>(); |
| | | data.add(buildIncomeCircleDto("微信支付", wechatAmount)); |
| | | data.add(buildIncomeCircleDto("支付宝支付", alipayAmount)); |
| | | data.add(buildIncomeCircleDto("余额支付", balanceAmount)); |
| | | return data; |
| | | } |
| | | |
| | | /** |
| | | * 构造单个饼图项并统一金额精度。 |
| | | */ |
| | | private SixIncomeCircleDto buildIncomeCircleDto(String name, BigDecimal paymentAmount) { |
| | | SixIncomeCircleDto dto = new SixIncomeCircleDto(); |
| | | dto.setName(name); |
| | | dto.setPaymentAmount(nullToZero(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | return dto; |
| | | } |
| | | |
| | | /** |
| | | * 计算第三方渠道实收:优先使用拆分字段,兼容旧订单回退到paymentAmount/rechargeAmount。 |
| | | */ |
| | | private BigDecimal getThirdPayNetAmount(TChargingOrder order) { |
| | | BigDecimal payAmount = order.getThirdPayAmount(); |
| | | if (payAmount == null && Integer.valueOf(3).equals(order.getPayMethod())) { |
| | | payAmount = firstNonNull(order.getPaymentAmount(), order.getRechargeAmount()); |
| | | } |
| | | BigDecimal refundAmount = order.getThirdRefundAmount(); |
| | | if (refundAmount == null && Integer.valueOf(3).equals(order.getPayMethod())) { |
| | | refundAmount = order.getRefundAmount(); |
| | | } |
| | | return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount))); |
| | | } |
| | | |
| | | /** |
| | | * 计算余额渠道实收:组合支付优先使用拆分字段,兼容旧余额订单回退到paymentAmount。 |
| | | */ |
| | | private BigDecimal getBalancePayNetAmount(TChargingOrder order) { |
| | | BigDecimal payAmount = order.getBalancePayAmount(); |
| | | Integer payMethod = order.getPayMethod(); |
| | | if (payAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) { |
| | | payAmount = order.getPaymentAmount(); |
| | | } |
| | | BigDecimal refundAmount = order.getBalanceRefundAmount(); |
| | | if (refundAmount == null && (Integer.valueOf(1).equals(payMethod) || Integer.valueOf(2).equals(payMethod))) { |
| | | refundAmount = order.getRefundAmount(); |
| | | } |
| | | return nonNegative(nullToZero(payAmount).subtract(nullToZero(refundAmount))); |
| | | } |
| | | |
| | | private BigDecimal firstNonNull(BigDecimal first, BigDecimal second) { |
| | | return first != null ? first : second; |
| | | } |
| | | |
| | | private BigDecimal nullToZero(BigDecimal value) { |
| | | return value == null ? BigDecimal.ZERO : value; |
| | | } |
| | | |
| | | private BigDecimal nonNegative(BigDecimal value) { |
| | | return value.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : value; |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | dto.setSiteIds(siteIds); |
| | | List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2); |
| | | fillChargingPeriodExportBalanceIncome(list1); |
| | | return list1; |
| | | } |
| | | |
| | | /** |
| | | * 充电时段统计导出补充余额收入;兑换码usedAmount包含赠送金额,需沿用订单列表口径拆分。 |
| | | */ |
| | | private void fillChargingPeriodExportBalanceIncome(List<ChargingOrderListVO> list) { |
| | | if (list == null || list.isEmpty()) { |
| | | return; |
| | | } |
| | | List<Long> orderIds = list.stream().map(ChargingOrderListVO::getId).filter(Objects::nonNull).collect(Collectors.toList()); |
| | | if (orderIds.isEmpty()) { |
| | | return; |
| | | } |
| | | Map<Long, Map<String, Object>> incomeMap = new HashMap<>(); |
| | | List<Map<String, Object>> rows = this.baseMapper.exchangeCodeBalanceIncomeByOrderIds(orderIds); |
| | | if (rows != null) { |
| | | for (Map<String, Object> row : rows) { |
| | | Long orderId = getSummaryLong(row, "orderId"); |
| | | if (orderId != null) { |
| | | incomeMap.put(orderId, row); |
| | | } |
| | | } |
| | | } |
| | | for (ChargingOrderListVO item : list) { |
| | | Map<String, Object> row = incomeMap.get(item.getId()); |
| | | item.setBalanceIncome(getSummaryDecimal(row, "balanceIncome")); |
| | | item.setBalanceGiftIncome(getSummaryDecimal(row, "balanceGiftIncome")); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | refundAmount = recordedRefundAmount; |
| | | chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | | chargingOrder.setThirdRefundAmount(thirdRefundAmount.setScale(2, RoundingMode.HALF_UP)); |
| | | chargingOrder.setPaymentAmount(actualThirdPayAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | // paymentAmount用于小程序展示实际消费金额,需包含第三方实扣和余额实扣,不能只取第三方渠道金额。 |
| | | chargingOrder.setPaymentAmount(actualThirdPayAmount.add(actualBalancePayAmount).setScale(2, RoundingMode.HALF_EVEN)); |
| | | chargingOrder.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN)); |
| | | chargingOrder.setRefundStatus(channelRefundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2); |
| | | UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc"); |
| | |
| | | </select> |
| | | <select id="charge" resultType="com.ruoyi.order.dto.SixChargingDto"> |
| | | SELECT |
| | | DATE_FORMAT( subquery.create_time, '%m' ) AS MONTH, |
| | | SUM(electrovalence) AS electrovalence, |
| | | DATE_FORMAT(a.create_time, '%m') AS MONTH, |
| | | SUM(IFNULL(b.period_electric_price, 0)) AS electrovalence, |
| | | SUM( |
| | | CASE |
| | | WHEN subquery.order_source = 0 THEN subquery.service_charge |
| | | WHEN subquery.order_source = 1 THEN subquery.service_charge |
| | | ELSE subquery.service_charge * 0.8 |
| | | WHEN a.order_source = 0 THEN IFNULL(b.period_service_price, 0) |
| | | WHEN a.order_source = 1 THEN IFNULL(b.period_service_price, 0) |
| | | ELSE IFNULL(b.period_service_price, 0) * 0.8 |
| | | END |
| | | ) AS service_charge |
| | | |
| | | FROM |
| | | ( |
| | | SELECT |
| | | a.create_time, |
| | | b.period_electric_price as electrovalence, |
| | | b.period_service_price as service_charge, |
| | | a.order_source |
| | | FROM |
| | | t_charging_order a |
| | | left join (select charging_order_id, sum(period_electric_price) as period_electric_price, |
| | | sum(period_service_price) as period_service_price, sum(period_electric_price + period_service_price) as money |
| | | from t_charging_order_accounting_strategy group by charging_order_id) b on (a.id = b.charging_order_id) |
| | | LEFT JOIN t_charging_order_accounting_strategy b ON a.id = b.charging_order_id |
| | | <where> |
| | | a.del_flag = 0 and a.recharge_payment_status = 2 and a.status = 5 |
| | | <if test="sixBefore != null"> |
| | |
| | | </foreach> |
| | | </if> |
| | | </where> |
| | | ) AS subquery |
| | | GROUP BY |
| | | DATE_FORMAT( subquery.create_time, '%m' ) |
| | | DATE_FORMAT(a.create_time, '%m') |
| | | |
| | | |
| | | </select> |
| | | <select id="circle" resultType="com.ruoyi.order.dto.SixCircleDto"> |
| | | SELECT |
| | | site_id as siteId, |
| | | a.site_id as siteId, |
| | | ROUND(SUM(CASE |
| | | WHEN a.order_source = 0 THEN b.money |
| | | WHEN a.order_source = 1 THEN b.money |
| | | ELSE (b.period_electric_price + b.period_service_price * 0.8) |
| | | WHEN a.order_source = 0 THEN IFNULL(b.period_electric_price, 0) + IFNULL(b.period_service_price, 0) |
| | | WHEN a.order_source = 1 THEN IFNULL(b.period_electric_price, 0) + IFNULL(b.period_service_price, 0) |
| | | ELSE (IFNULL(b.period_electric_price, 0) + IFNULL(b.period_service_price, 0) * 0.8) |
| | | END), 2) AS paymentAmount |
| | | FROM |
| | | t_charging_order a |
| | | left join (select charging_order_id, sum(period_electric_price) as period_electric_price, |
| | | sum(period_service_price) as period_service_price, sum(period_electric_price + period_service_price) as money |
| | | from t_charging_order_accounting_strategy group by charging_order_id) b on (a.id = b.charging_order_id) |
| | | LEFT JOIN t_charging_order_accounting_strategy b ON a.id = b.charging_order_id |
| | | <where> |
| | | a.del_flag = 0 and a.recharge_payment_status = 2 and a.status = 5 |
| | | <if test="siteIds != null and siteIds.size() > 0"> |
| | |
| | | </foreach> |
| | | </if> |
| | | <if test="sixBefore != null"> |
| | | AND create_time >= #{sixBefore} |
| | | AND a.create_time >= #{sixBefore} |
| | | </if> |
| | | </where> |
| | | GROUP BY a.site_id |
| | |
| | | |
| | | </select> |
| | | <select id="countAll" resultType="java.util.Map"> |
| | | select sum(electrovalence) as electrovalence,sum(service_charge) as |
| | | service_charge,ROUND(sum(electrovalence+service_charge) * 0.006, 2) as commission_amount,sum(sharing_amount) as |
| | | sharing_amount |
| | | from t_charging_order |
| | | where del_flag = 0 and recharge_payment_status = 2 and status = 5 |
| | | SELECT |
| | | ROUND(SUM(IFNULL(b.period_electric_price, 0)), 2) AS electrovalence, |
| | | ROUND(SUM(CASE |
| | | WHEN a.order_source = 2 THEN IFNULL(b.period_service_price, 0) * 0.8 |
| | | ELSE IFNULL(b.period_service_price, 0) |
| | | END), 2) AS service_charge, |
| | | ROUND(SUM(CASE |
| | | WHEN a.order_source = 2 THEN 0 |
| | | ELSE IFNULL(b.period_electric_price, 0) + IFNULL(b.period_service_price, 0) |
| | | END) * 0.006, 2) AS commission_amount, |
| | | ROUND(SUM(CASE |
| | | WHEN a.order_source = 2 THEN IFNULL(b.period_service_price, 0) * 0.2 |
| | | ELSE 0 |
| | | END), 2) AS sharing_amount |
| | | FROM t_charging_order a |
| | | LEFT JOIN t_charging_order_accounting_strategy b ON a.id = b.charging_order_id |
| | | WHERE a.del_flag = 0 AND a.recharge_payment_status = 2 AND a.status = 5 |
| | | <if test="siteIds != null and siteIds.size() > 0"> |
| | | AND site_id IN |
| | | AND a.site_id IN |
| | | <foreach collection="siteIds" item="siteId" open="(" separator="," close=")"> |
| | | #{siteId} |
| | | </foreach> |
| | |
| | | e.refund_amount as residualAmount, |
| | | h.electrovalence as electrovalence, |
| | | CASE WHEN a.order_source = 1 THEN h.serviceCharge ELSE h.serviceCharge * 0.8 END as serviceCharge, |
| | | CASE WHEN a.order_source = 2 THEN h.serviceCharge * 0.2 ELSE 0 END as sharingAmount, |
| | | 0 as commissionAmount, |
| | | <!-- 引流平台分佣按三方订单原始服务费的20%计算,导出需展示在白名单字段前。 --> |
| | | CASE WHEN a.order_source = 2 THEN IFNULL(h.serviceCharge, 0) * 0.2 ELSE 0 END as sharingAmount, |
| | |
| | | |
| | | <select id="exchangeCodeBalanceSummary" resultType="map"> |
| | | select |
| | | sum(CASE WHEN change_type = 2 THEN IFNULL(used_amount, 0) WHEN change_type = 3 THEN -IFNULL(used_amount, 0) ELSE 0 END) as balanceIncome, |
| | | sum(CASE WHEN change_type = 2 THEN IFNULL(used_amount, 0) - IFNULL(gift_used_amount, 0) WHEN change_type = 3 THEN -(IFNULL(used_amount, 0) - IFNULL(gift_used_amount, 0)) ELSE 0 END) as balanceIncome, |
| | | sum(CASE WHEN change_type = 2 THEN IFNULL(gift_used_amount, 0) WHEN change_type = 3 THEN -IFNULL(gift_used_amount, 0) ELSE 0 END) as balanceGiftIncome |
| | | from `charging_pile_other`.t_exchange_code_use_record |
| | | where del_flag = 0 and change_type in (2, 3) |
| | |
| | | <select id="exchangeCodeBalanceIncomeByOrderIds" resultType="map"> |
| | | select |
| | | order_id as orderId, |
| | | sum(CASE WHEN change_type = 2 THEN IFNULL(used_amount, 0) WHEN change_type = 3 THEN -IFNULL(used_amount, 0) ELSE 0 END) as balanceIncome, |
| | | sum(CASE WHEN change_type = 2 THEN IFNULL(used_amount, 0) - IFNULL(gift_used_amount, 0) WHEN change_type = 3 THEN -(IFNULL(used_amount, 0) - IFNULL(gift_used_amount, 0)) ELSE 0 END) as balanceIncome, |
| | | sum(CASE WHEN change_type = 2 THEN IFNULL(gift_used_amount, 0) WHEN change_type = 3 THEN -IFNULL(gift_used_amount, 0) ELSE 0 END) as balanceGiftIncome |
| | | from `charging_pile_other`.t_exchange_code_use_record |
| | | where del_flag = 0 and order_id is not null and order_id != 0 and change_type in (2, 3) |
| | |
| | | select |
| | | p.id as packageId, |
| | | p.package_name as packageName, |
| | | sum(CASE WHEN r.change_type = 2 THEN IFNULL(r.used_amount, 0) WHEN r.change_type = 3 THEN -IFNULL(r.used_amount, 0) ELSE 0 END) as balanceIncome, |
| | | sum(CASE WHEN r.change_type = 2 THEN IFNULL(r.used_amount, 0) - IFNULL(r.gift_used_amount, 0) WHEN r.change_type = 3 THEN -(IFNULL(r.used_amount, 0) - IFNULL(r.gift_used_amount, 0)) ELSE 0 END) as balanceIncome, |
| | | sum(CASE WHEN r.change_type = 2 THEN IFNULL(r.gift_used_amount, 0) WHEN r.change_type = 3 THEN -IFNULL(r.gift_used_amount, 0) ELSE 0 END) as giftIncome |
| | | from `charging_pile_other`.t_exchange_code_use_record r |
| | | left join `charging_pile_other`.t_exchange_code_detail d on r.detail_id = d.id |