| | |
| | | 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; |
| | | } |
| | |
| | | tChargingOrderExport.setCarType(tAppUserCar.getVehicleModel()); |
| | | tChargingOrderExport.setCarBrand(tAppUserCar.getVehicleBrand()); |
| | | } |
| | | 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()+""); |
| | |
| | | @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("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()); |
| | | } |
| | | } |
| | | } |
| | | 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)); |
| | | return R.ok(map); |
| | | if (siteId != null) { |
| | | return siteIds.contains(siteId) ? Collections.singletonList(siteId) : Collections.singletonList(-1); |
| | | } |
| | | if (siteIds.isEmpty()) { |
| | | siteIds.add(-1); |
| | | } |
| | | return siteIds; |
| | | } |
| | | |
| | | |
| | |
| | | @Data |
| | | @ApiModel(value = "充电时段统计-导出") |
| | | public class TChargingOrderExport implements Serializable { |
| | | @Excel(name = "序号",width = 30) |
| | | private Integer id; |
| | | @Excel(name = "订单编号",width = 30) |
| | | private String code; |
| | | @Excel(name = "电站编号",width = 30) |
| | | private String siteCode; |
| | | @Excel(name = "电站名称",width = 30) |
| | | private String siteName; |
| | | |
| | | @Excel(name = "终端名称",width = 30) |
| | | private String terminalName; |
| | | @Excel(name = "所属城市",width = 30) |
| | | private String city; |
| | | @Excel(name = "市区名称",width = 30) |
| | | private String cityName; |
| | | @Excel(name = "所属合作商",width = 30) |
| | | private String partner; |
| | | @Excel(name = "电站类型",width = 30,replace = {"其他_0","公共_1","个人_2","公交_3","环卫_4","物流_5","出租车_6"}) |
| | | private Integer siteType; |
| | | @Excel(name = "售电模式",width = 30,replace = {"正常使用_1","维修中_2","关闭下线_3"}) |
| | | private String saleType; |
| | | @Excel(name = "站点状态",width = 30,replace = {"正常使用_1","维修中_2","关闭下线_3"}) |
| | | private String status; |
| | | @Excel(name = "运营类型",width = 30,replace = {"直营_1","非直营_2"}) |
| | | private String businessCategory; |
| | | @Excel(name = "计费模板",width = 30) |
| | | private String name; |
| | | @Excel(name = "收款方式",width = 30,replace = {"线上_1","线下_2"}) |
| | | private String orderClassification; |
| | | @Excel(name = "充电启动方式",width = 30) |
| | | private String startType; |
| | | @Excel(name = "一级来源",width = 30) |
| | | private String one; |
| | |
| | | private String startTime; |
| | | @Excel(name = "充电结束时间",width = 30) |
| | | private String endTime; |
| | | @Excel(name = "订单状态",width = 30,replace = {"待支付_1","已支付_2"}) |
| | | private String rechargePaymentStatus; |
| | | @Excel(name = "订单类型",width = 30) |
| | | private String type; |
| | | @Excel(name = "充电形式",width = 30) |
| | | private String chargingType; |
| | | @Excel(name = "判定结束原因",width = 30,replace = {"异常终止_0","主动终止_1","满电终止_2","费用不足终止_3"}) |
| | | private String endmode; |
| | | @Excel(name = "充电结束账号",width = 30) |
| | | private String chargingEndAccount; |
| | | @Excel(name = "是否是免费订单",width = 30) |
| | | private String isFree; |
| | | @Excel(name = "充电电费(元)",width = 30) |
| | | private String electrovalence; |
| | |
| | | private String total; |
| | | @Excel(name = "充电电量(度)",width = 30) |
| | | private String chargingCapacity; |
| | | @Excel(name = "平均电费单价(元)",width = 30) |
| | | private String electrovalencePrice; |
| | | @Excel(name = "平均服务费实际单价(元)",width = 30) |
| | | private String serviceChargePrice; |
| | | @Excel(name = "平均服务费挂牌单价(元)",width = 30) |
| | | private String serviceChargePriceLook; |
| | | @Excel(name = "充电时长(分钟)",width = 30) |
| | | private String cumulativeChargingTime; |
| | |
| | | private String startSoc; |
| | | @Excel(name = "充电后soc",width = 30) |
| | | private String endtSoc; |
| | | @Excel(name = "是否限制soc",width = 30) |
| | | private String isSoc; |
| | | @Excel(name = "限制soc方式",width = 30) |
| | | private String isSocType; |
| | | @Excel(name = "限制soc值",width = 30) |
| | | private String isSocNum; |
| | | @Excel(name = "客户类型",width = 30) |
| | | private String userType; |
| | | @Excel(name = "会员类型",width = 30) |
| | | private String vipType; |
| | | @Excel(name = "是否PLUS订单",width = 30) |
| | | private String isPlus; |
| | | @Excel(name = "客户编号",width = 30) |
| | | private String userCode; |
| | | @Excel(name = "真实姓名",width = 30) |
| | | private String realName; |
| | | @Excel(name = "设备号",width = 30) |
| | | private String deviceCode; |
| | | @Excel(name = "手机号",width = 30) |
| | | private String phone; |
| | | @Excel(name = "昵称",width = 30) |
| | | private String nickName; |
| | | @Excel(name = "企业编号",width = 30) |
| | | private String companyCode; |
| | | @Excel(name = "企业名称",width = 30) |
| | | private String companyName; |
| | | @Excel(name = "扣费账户类型",width = 30) |
| | | private String accountType; |
| | | @Excel(name = "使用人",width = 30) |
| | | private String useUser; |
| | | @Excel(name = "卡号",width = 30) |
| | | private String bankCard; |
| | | @Excel(name = "代充使用人",width = 30) |
| | | 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) |
| | | private String carNumber; |
| | | @Excel(name = "发动机号",width = 30) |
| | | private String carEngineNumber; |
| | | @Excel(name = "车辆自编号",width = 30) |
| | | private String carNumberCode; |
| | | @Excel(name = "第三方商户订单",width = 30) |
| | | private String orderCode; |
| | | @Excel(name = "判定车牌号",width = 30) |
| | | private String carNumberSource; |
| | | @Excel(name = "是否单枪",width = 30) |
| | | private String isSingle; |
| | | @Excel(name = "选择车型",width = 30) |
| | | private String carType; |
| | | @Excel(name = "车辆品牌",width = 30) |
| | | private String carBrand; |
| | | @Excel(name = "判定车系",width = 30) |
| | | private String carSeries; |
| | | @Excel(name = "判定车系来源",width = 30) |
| | | private String carSeriesSource; |
| | | @Excel(name = "收款时间",width = 30) |
| | | private String payTime; |
| | | @Excel(name = "电费结算方编码",width = 30) |
| | | private String electrovalenceSiteCode; |
| | | @Excel(name = "电费结算方名称",width = 30) |
| | | private String electrovalenceSiteName; |
| | | @Excel(name = "管理公司",width = 30) |
| | | private String companyNameAdmin; |
| | | @Excel(name = "计费方式",width = 30) |
| | | private String moneyType; |
| | | @Excel(name = "设备接入方式",width = 30) |
| | | private String deviceType; |
| | | @Excel(name = "核算公司",width = 30) |
| | | private String settlementCompanyName; |
| | | @Excel(name = "预支付类型",width = 30) |
| | | private String prePaymentType; |
| | | @Excel(name = "是否安全防护订单",width = 30) |
| | | private String isSecurity; |
| | | } |
| | |
| | | |
| | | 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 = thirdRefundAmount.add(balanceRefundAmount); |
| | | 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(1); |
| | | 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 |
| | | END |
| | | CASE |
| | | 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, |
| | | a.tripartite_platform_name as tripartitePlatformName, |
| | | a.create_time as createTime, |
| | |
| | | |
| | | <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 |