ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
@@ -2,6 +2,7 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; @@ -40,6 +41,12 @@ public R<List<GetSiteListDTO>> getSiteListByUserId(Long userId) { return null; } @Override public R<Partner> getPartnerR(Integer id) { return R.fail("根据合作商id获取合作商详情失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
@@ -2,14 +2,12 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.factory.SiteFallbackFactory; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -37,4 +35,6 @@ @GetMapping("/site/getSiteList/byUserId") R<List<GetSiteListDTO>> getSiteListByUserId(@RequestParam("userId") Long userId); @GetMapping("/getPartnerR/{id}") R<Partner> getPartnerR(@PathVariable("id") Integer id); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/SettlementConfirmAdd.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.order.api.dto; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.order.api.model.TSettlementConfirm; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel(value = "SettlementConfirmAdd生成结算确认表对象",description = "管理后台-财务结算生成结算确认表对象") public class SettlementConfirmAdd { @ApiModelProperty(value = "站点id") private Integer siteId; @ApiModelProperty(value = "费用归属日期类型 1开始 2结束") private Integer type; @ApiModelProperty(value = "开始时间2020-01-01 00:00:00") private String startTime; @ApiModelProperty(value = "结束时间2020-01-01 23:59:59") private String endTime; @ApiModelProperty(value = "点击去生成 传1 填完表格数据点击保存 传2") private Integer state; @ApiModelProperty(value = "保存的数据") private TSettlementConfirm data; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -6,6 +6,7 @@ import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingBillVO; @@ -96,6 +97,11 @@ public R<TChargingOrder> getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { return R.fail("根据车牌号和时间查询有效的充电数据失败:" + throwable.getMessage()); } @Override public R<TSettlementConfirm> downloadSettlement(String uid) { return R.fail("通过id查询结算确认失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -7,6 +7,7 @@ import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingBillVO; @@ -105,4 +106,12 @@ */ @PostMapping("/t-charging-order/getChargingOrderByLicensePlate") R<TChargingOrder> getChargingOrderByLicensePlate(@RequestBody GetChargingOrderByLicensePlate query); /** * 获取充电结算记录 * @param uid * @return */ @GetMapping(value = "/financial/settlement/downloadSettlement/{uid}") public R<TSettlementConfirm> downloadSettlement(@PathVariable("uid") String uid); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TSettlementConfirm.java
New file @@ -0,0 +1,182 @@ package com.ruoyi.order.api.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.domain.BasePojo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> * * </p> * * @author xiaochen * @since 2024-08-07 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("t_settlement confirm") @ApiModel(value="TSettlementConfirm对象", description="") public class TSettlementConfirm extends BasePojo { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "站点id") @TableField("site_id") private Integer siteId; @ApiModelProperty(value = "合作商id") @TableField("partner_id") private Integer partnerId; @ApiModelProperty(value = "结算电费备注") @TableField("remark") private String remark; @ApiModelProperty(value = "结算服务费备注") @TableField("service_remark") private String serviceRemark; @ApiModelProperty(value = "计量电量(电量合计)") @TableField("metering_electronic") private BigDecimal meteringElectronic; @ApiModelProperty(value = "充电电量") @TableField("charging_electronic") private BigDecimal chargingElectronic; @ApiModelProperty(value = "电损电量") @TableField("loss_electronic") private BigDecimal lossElectronic; @ApiModelProperty(value = "收入合计") @TableField("income") private BigDecimal income; @ApiModelProperty(value = "场地费") @TableField("venue") private BigDecimal venue; @ApiModelProperty(value = "计量电费") @TableField("metering") private BigDecimal metering; @ApiModelProperty(value = "清洁费") @TableField("clean") private BigDecimal clean; @ApiModelProperty(value = "日常维护费") @TableField("maintain") private BigDecimal maintain; @ApiModelProperty(value = "成本(可分配合计)") @TableField("cost") private BigDecimal cost; @ApiModelProperty(value = "利润") @TableField("profit_money") private BigDecimal profitMoney; @ApiModelProperty(value = "新能源利润") @TableField("new_money") private BigDecimal newMoney; @ApiModelProperty(value = "新能源结算金额") @TableField("new_Settlement") private BigDecimal newSettlement; @ApiModelProperty(value = "供电局结算电费") @TableField("supply_electronic") private BigDecimal supplyElectronic; @ApiModelProperty(value = "合作商承担电损占比") @TableField("proportion_partner") private BigDecimal proportionPartner; @ApiModelProperty(value = "承担金额") @TableField("proportion_money") private BigDecimal proportionMoney; @ApiModelProperty(value = "本期结算电费总金额 (实际电费转账)") @TableField("total_electronic") private BigDecimal totalElectronic; @ApiModelProperty(value = "本期结算服务费总金额(实际服务费转账)") @TableField("total_service") private BigDecimal totalService; @ApiModelProperty(value = "合作商充电服务费根据合同约定分成比例") @TableField("service_partner") private BigDecimal servicePartner; @ApiModelProperty(value = "合作商充电服务费根据合同约定分成金额") @TableField("service_money") private BigDecimal serviceMoney; @ApiModelProperty(value = "三方收费(合计三方平台收费)") @TableField("sharing_amount") private BigDecimal sharingAmount; @ApiModelProperty(value = " 交易手续费 三方收费*0.06%") @TableField("commission_amount") private BigDecimal commissionAmount; @ApiModelProperty(value = "充电电费计费(平台合计电费)") @TableField("electrovalence") private BigDecimal electrovalence; @ApiModelProperty(value = "充电服务费计费(实收服务费)") @TableField("service_charge") private BigDecimal serviceCharge; @ApiModelProperty(value = "交易手续费计费") @TableField("order_commission") private BigDecimal orderCommission; @ApiModelProperty(value = "会员抵扣") @TableField("vip_discount") private BigDecimal vipDiscount; @ApiModelProperty(value = "优惠券抵扣") @TableField("coupon_discount") private BigDecimal couponDiscount; @ApiModelProperty(value = "类型(1=开始,2=结束)") @TableField("type") private Integer type; @ApiModelProperty(value = "开始时间") @TableField("start_time") private LocalDateTime startTime; @ApiModelProperty(value = "结束时间") @TableField("end_time") private LocalDateTime endTime; @ApiModelProperty(value = "站点名称") @TableField(exist = false) private String siteName; @ApiModelProperty(value = "合作商名称") @TableField(exist = false) private String partnerName; @ApiModelProperty(value = "uid") @TableField(exist = false) private String uid; @ApiModelProperty(value = "合计可分配金额") @TableField(exist = false) private BigDecimal distribution; @ApiModelProperty(value = "结账日期 2024年09月06日17:10:06至2024年09月06日17:10:06") @TableField(exist = false) private String time; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/SettlementListQuery.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.order.api.query; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel(value = "SettlementListQuery结算表记录列表查询对象",description = "管理后台-财务结算-结算表记录列表查询对") public class SettlementListQuery extends BasePage { @ApiModelProperty(value = "类型(1=开始,2=结束)") private Integer type; @ApiModelProperty(value = "站点ids 选择全部 不传") private List<Integer> siteIds; @ApiModelProperty(value = "合作商id ") private Integer partnerId; @ApiModelProperty(value = "开始时间2020-01-01 00:00:00") private String startTime; @ApiModelProperty(value = "结束时间2021-01-01 23:59:59") private String endTime; } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
@@ -9,6 +9,7 @@ import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.service.IPartnerService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; @@ -68,6 +69,12 @@ Partner partner = partnerService.getPartner(id); return AjaxResult.success(partner); } @ResponseBody @GetMapping("/getPartnerR/{id}") public R<Partner> getPartnerR(@PathVariable("id") Integer id){ Partner partner = partnerService.getPartner(id); return R.ok(partner); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
@@ -1,7 +1,12 @@ package com.ruoyi.chargingPile.controller; import java.math.BigDecimal; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.vo.ChargingBillListVO; @@ -50,6 +55,7 @@ import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; @@ -70,6 +76,8 @@ private final RedisService redisService; @Resource private ChargingOrderClient chargingOrderClient; @Resource private SiteClient siteClient; @Autowired public TApplyChargingPileController(TApplyChargingPileService applyChargingPileService, TokenService tokenService, RedisService redisService) { @@ -272,6 +280,55 @@ } return R.ok(); } @ApiOperation(value = "下载", tags = {"管理后台-结算表记录"}) @GetMapping("/downloadSettlement") public R downloadSettlement(String uid,HttpServletResponse response) { TSettlementConfirm data = chargingOrderClient.downloadSettlement(uid).getData(); List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(data.getSiteId())).getData(); if (!data1.isEmpty()){ data.setSiteName(data1.get(0).getName()); } Partner data2 = siteClient.getPartnerR(data.getPartnerId()).getData(); if (data2!=null){ data.setPartnerName(data2.getName()); } List<TSettlementConfirm> chargingBillVOS = new ArrayList<>(); chargingBillVOS.add(data); try { response.setCharacterEncoding(Constants.UTF8); response.setContentType("application/vnd.ms-excel"); response.setHeader("Access-Control-Expose-Headers", "Content-disposition"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("结算确认单", CharEncoding.UTF_8) + ".xlsx"); } catch (UnsupportedEncodingException e) { return R.fail("excel导出失败!"); } try { // excel模板封装 ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream()); InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"运营商名称1-充电桩名称1-结算对账单明细-结算月份1" + ".xlsx"); // 自动释放资源 try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) { WriteSheet writeSheet = EasyExcel.writerSheet().build(); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); excelWriter.fill(new FillWrapper("data1", chargingBillVOS), fillConfig, writeSheet); excelWriter.fill(new FillWrapper("data2", chargingBillVOS), fillConfig, writeSheet); excelWriter.finish(); } catch (Exception e) { return R.fail("excel导出失败!"); } } catch (IOException e) { return R.fail("excel导出失败!"); } return R.ok(); } @ApiOperation(value = "下载-未出账", tags = {"管理后台-充电算账单"}) @GetMapping("/download") public R download(String uid,HttpServletResponse response) ruoyi-service/ruoyi-chargingPile/src/main/resources/template/运营商名称1-充电桩名称1-结算对账单明细-结算月份1.xlsxBinary files differ
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java
@@ -20,15 +20,15 @@ */ private String sk; /** * endpoint配置 938d8d39e2.iotda.cn-north-4.myhuaweicloud.com * endpoint配置 94cb3eb5f9.st1.iotda-app.cn-south-1.myhuaweicloud.com */ private String endpoint; /** * project_id配置 0cc59978c61e4b4da24e8c3d02937b45 * project_id配置 f31c21e190e04fb0aebf8c0b1e7959cd */ private String projectId; /** * Instance-Id配置 c60f266a-57a2-460c-a24e-eabda84602eb * Instance-Id配置 d21a37d3-c578-43aa-a1ab-be3854e7c337 */ private String instanceId; ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java
@@ -5,9 +5,9 @@ import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.iam.v3.model.*; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.integration.iotda.constant.IotConstant; import com.ruoyi.integration.iotda.builder.IotBuilder; import com.ruoyi.integration.iotda.config.IotAccountConfig; import com.ruoyi.integration.iotda.constant.IotConstant; import com.ruoyi.integration.iotda.utils.time.UtcToSeconds; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
@@ -7,9 +7,14 @@ import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.model.ChargingListQuery; @@ -18,6 +23,7 @@ import com.ruoyi.payment.api.feignClient.WxPaymentClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -38,59 +44,43 @@ @Resource private TChargingOrderService chargingOrderService; @Autowired private TokenService tokenService; @Autowired private TOrderEvaluateService orderEvaluateService; @Resource private WxPaymentClient wxPaymentClient; @Resource private RedisService redisService; @Resource private AliPaymentClient aliPaymentClient; @Resource private TShoppingOrderService shoppingOrderService; @Resource private AppUserClient appUserClient; @Resource private TVipOrderService vipOrderService; @Resource private ParkingLotClient parkingLotClient; @Resource private TChargingOrderRefundService chargingOrderRefundService; @Resource private TShoppingOrderRefundService shoppingOrderRefundService; @Resource private TVipOrderRefundService vipOrderRefundService; @Resource private SiteClient siteClient; @Resource private ChargingPileClient chargingPileClient; @Resource private ChargingGunClient chargingGunClient; @Resource private AppUserCarClient appUserCarClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @ResponseBody private TSettlementConfirmService tSettlementConfirmService; @PostMapping(value = "/chargingList") @ApiOperation(value = "充电时段统计列表", tags = {"管理后台-财务结算"}) public AjaxResult<ChargingOrderTimeVO> chargingList(@RequestBody ChargingListQuery dto) { ChargingOrderTimeVO res = chargingOrderService.chargingList(dto); return AjaxResult.success(res); } @ResponseBody @GetMapping(value = "/chargingInfo") @ApiOperation(value = "充电时段统计列表-查看详情", tags = {"管理后台-财务结算"}) public AjaxResult<ChargingOrderListInfoVO> chargingInfo(String uid) { ChargingOrderListInfoVO res = chargingOrderService.chargingInfo(uid); return AjaxResult.success(res); } @GetMapping(value = "/settlementTotal") @ApiOperation(value = "结算确认表-列表查询", tags = {"管理后台-财务结算"}) @ApiParam(name = "time", value = "汇报时间yyyy-MM") public AjaxResult<ChargingOrderListInfoVO> settlementTotal(String time) { return AjaxResult.success(null); } @PostMapping(value = "/settlementAdd") @ApiOperation(value = "结算确认表-生成/保存结算确认表", tags = {"管理后台-财务结算"}) public R<TSettlementConfirm> settlementAdd(@RequestBody SettlementConfirmAdd dto) { TSettlementConfirm res = chargingOrderService.settlementAdd(dto); return R.ok(res); } @PostMapping(value = "/settlementList") @ApiOperation(value = "结算表记录-列表查询", tags = {"管理后台-财务结算"}) public R<PageInfo<TSettlementConfirm>> settlementList(@RequestBody SettlementListQuery dto) { PageInfo<TSettlementConfirm> res = chargingOrderService.settlementList(dto); return R.ok(res); } @GetMapping(value = "/downloadSettlement/{uid}") public R<TSettlementConfirm> downloadSettlement(@PathVariable("uid") String uid) { return R.ok(tSettlementConfirmService.getById(uid)); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TSettlementConfirmMapper.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.VipShoppingOrderQuery; import com.ruoyi.order.dto.SixVipDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import javax.validation.constraints.Pattern; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * <p> * Mapper 接口 * </p> * * @author xiaochen * @since 2024-08-07 */ @Mapper public interface TSettlementConfirmMapper extends BaseMapper<TSettlementConfirm> { List<TSettlementConfirm> settlementList(@Param("pageInfo") PageInfo<TSettlementConfirm> pageInfo, @Param("req") SettlementListQuery dto); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -6,10 +6,13 @@ import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; @@ -165,4 +168,8 @@ */ TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query); TSettlementConfirm settlementAdd(SettlementConfirmAdd dto); PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TSettlementConfirmService.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.order.api.query.VipShoppingOrderQuery; import com.ruoyi.order.dto.SixVipDto; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * <p> * 服务类 * </p> * * @author xiaochen * @since 2024-08-07 */ public interface TSettlementConfirmService extends IService<TSettlementConfirm> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1,7 +1,9 @@ package com.ruoyi.order.service.impl; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -29,14 +31,17 @@ import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.*; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.mapper.TSettlementConfirmMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; import com.ruoyi.order.service.TChargingOrderRefundService; import com.ruoyi.order.service.TChargingOrderService; @@ -47,6 +52,7 @@ import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.other.api.domain.TIntegralRule; import com.ruoyi.other.api.feignClient.IntegralRuleClient; import com.ruoyi.other.api.feignClient.OtherClient; import com.ruoyi.other.api.feignClient.RoleSiteClient; import com.ruoyi.other.api.feignClient.UserSiteClient; import com.ruoyi.payment.api.feignClient.AliPaymentClient; @@ -93,9 +99,12 @@ @Resource private ChargingGunClient chargingGunClient; @Resource private TSettlementConfirmMapper tSettlementConfirmMapper; @Resource private SiteClient siteClient; @Resource private AppUserCarClient appUserCarClient; @@ -104,7 +113,6 @@ @Resource private ChargingPileClient chargingPileClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @@ -117,7 +125,6 @@ @Resource private AliPaymentClient aliPaymentClient; @Resource private AppCouponClient appCouponClient; @@ -1630,4 +1637,153 @@ .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, -1)); return one; } @Override public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) { List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData(); TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); if (!data.isEmpty()){ tSettlementConfirm.setSiteName(data.get(0).getName()); tSettlementConfirm.setPartnerId(data.get(0).getPartnerId()); if (data.get(0).getPartnerId()!=null){ Partner data1 = siteClient.getPartnerR(data.get(0).getPartnerId()).getData(); if (data1!=null){ tSettlementConfirm.setPartnerName(data1.getName()); tSettlementConfirm.setPartnerId(data1.getId()); } } } String startTime = dto.getStartTime(); String endTime = dto.getEndTime(); // 将这两个时间转化为localDateTime tSettlementConfirm.setStartTime(LocalDateTime.parse(startTime)); tSettlementConfirm.setEndTime(LocalDateTime.parse(endTime)); // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表 QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() .eq("site_id", dto.getSiteId()) .eq("recharge_payment_status",2); switch (dto.getType()){ case 1: eq.between("start_time", startTime, endTime); break; case 2: eq.between("end_time", startTime, endTime); break; } List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq); // 充电电量 度 BigDecimal chargingElectronic = new BigDecimal("0"); // 三方收费 分佣 BigDecimal sharingAmount = new BigDecimal("0"); // 三方交易手续费 三方收费*0.6% BigDecimal commissionAmount = new BigDecimal("0"); // 累计电费 BigDecimal electrovalence = new BigDecimal("0"); // 累计服务费 BigDecimal serviceCharge = new BigDecimal("0"); // 订单手续费 订单支付金额*0.6% BigDecimal orderCommission = new BigDecimal("0"); // 会员抵扣 BigDecimal vipDiscount = new BigDecimal("0"); // 优惠券抵扣 BigDecimal couponDiscount = new BigDecimal("0"); // 支付订单金额 需要减去退款金额 BigDecimal paymentAmount = new BigDecimal("0"); for (TChargingOrder tChargingOrder : tChargingOrders) { // 累加充电总度数 chargingElectronic = chargingElectronic.add(tChargingOrder.getChargingCapacity()); // 累加分佣 sharingAmount = sharingAmount.add(tChargingOrder.getSharingAmount()); // 累加电费 electrovalence = electrovalence.add(tChargingOrder.getElectrovalence()); // 累加服务费 serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge()); // 累加会员折扣 if (tChargingOrder.getVipDiscountAmount()!=null){ vipDiscount = vipDiscount.add(tChargingOrder.getVipDiscountAmount()); } // 累加优惠券折扣 if (tChargingOrder.getCouponDiscountAmount()!=null){ couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount()); } if (tChargingOrder.getRefundStatus() == 2){ // 如果成功退款 那么减去退款金额 paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount())); }else{ paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); } } // 三方交易手续费 三方收费*0.6% commissionAmount = sharingAmount.multiply(new BigDecimal("0.006")); // 订单手续费 订单支付金额 - 退款金额*0.6% orderCommission = paymentAmount.multiply(new BigDecimal("0.006")); tSettlementConfirm.setSharingAmount(sharingAmount); tSettlementConfirm.setCommissionAmount(commissionAmount); tSettlementConfirm.setElectrovalence(electrovalence); // 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣 tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount)); tSettlementConfirm.setOrderCommission(orderCommission); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setSiteId(dto.getSiteId()); tSettlementConfirm.setMeteringElectronic(dto.getData().getMeteringElectronic()); tSettlementConfirm.setChargingElectronic(chargingElectronic); tSettlementConfirm.setLossElectronic(dto.getData().getLossElectronic()); tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge)); tSettlementConfirm.setVenue(dto.getData().getVenue()); tSettlementConfirm.setMetering(dto.getData().getMetering()); tSettlementConfirm.setClean(dto.getData().getClean()); tSettlementConfirm.setMaintain(dto.getData().getMaintain()); tSettlementConfirm.setCost(dto.getData().getCost()); tSettlementConfirm.setProfitMoney(new BigDecimal("0")); tSettlementConfirm.setNewMoney(new BigDecimal("0")); tSettlementConfirm.setNewSettlement(new BigDecimal("0")); tSettlementConfirm.setVipDiscount(vipDiscount); tSettlementConfirm.setCouponDiscount(couponDiscount); tSettlementConfirm.setSupplyElectronic(dto.getData().getSupplyElectronic()); tSettlementConfirm.setType(dto.getType()); tSettlementConfirm.setProportionPartner(dto.getData().getProportionPartner()); tSettlementConfirm.setProportionMoney(dto.getData().getProportionMoney()); tSettlementConfirm.setTotalElectronic(dto.getData().getTotalElectronic()); tSettlementConfirm.setTotalService(dto.getData().getTotalService()); tSettlementConfirm.setRemark(dto.getData().getRemark()); tSettlementConfirm.setServicePartner(dto.getData().getServicePartner()); tSettlementConfirm.setServiceMoney(dto.getData().getServiceMoney()); tSettlementConfirm.setTotalService(dto.getData().getTotalService()); tSettlementConfirm.setServiceRemark(dto.getData().getServiceRemark()); if (dto.getState() == 2){ tSettlementConfirmMapper.insert(tSettlementConfirm); } return tSettlementConfirm; } @Override public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) { PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto); for (TSettlementConfirm tSettlementConfirm : list) { tSettlementConfirm.setUid(tSettlementConfirm.getId().toString()); Partner data = siteClient.getPartnerR(tSettlementConfirm.getPartnerId()).getData(); List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); if (!data1.isEmpty()){ tSettlementConfirm.setSiteName(data1.get(0).getName()); } if (data!=null){ tSettlementConfirm.setPartnerName(data.getName()); } String format = tSettlementConfirm.getStartTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); String format1 = tSettlementConfirm.getEndTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); tSettlementConfirm.setTime(format+"至"+format1); } pageInfo.setRecords(list); return null; } public static void main(String[] args) { String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); System.err.println(format+"至"+format1); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TSettlementConfirmServiceImpl.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.order.api.query.VipShoppingOrderQuery; import com.ruoyi.order.dto.SixVipDto; import com.ruoyi.order.mapper.TSettlementConfirmMapper; import com.ruoyi.order.mapper.TVipOrderMapper; import com.ruoyi.order.service.TSettlementConfirmService; import com.ruoyi.order.service.TVipOrderService; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.VipClient; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; /** * <p> * 服务实现类 * </p> * * @author xiaochen * @since 2024-08-07 */ @Service public class TSettlementConfirmServiceImpl extends ServiceImpl<TSettlementConfirmMapper, TSettlementConfirm> implements TSettlementConfirmService { } ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TSettlementConfirmMapper.xml
New file @@ -0,0 +1,32 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.TSettlementConfirmMapper"> <select id="pageList" resultType="com.ruoyi.order.api.model.TSettlementConfirm"> select t1.* from t_settlement_confirm t1 where 1=1 <if test="req.type != null "> and t1.type = #{req.type} </if> <if test="req.partnerId != null "> and t1.partnerId = #{req.partnerId} </if> <if test="req.type == 1 "> <if test="req.startTime != null and req.startTime!=''"> and (t1.start_time between #{req.startTime} and #{req.endTime} </if> </if> <if test="req.siteIds != null and req.siteIds.size() > 0"> AND t1.site_id IN <foreach collection="req.siteIds" item="siteId" open="(" separator="," close=")"> #{siteId} </foreach> </if> <if test="req.type == 2 "> <if test="req.startTime != null and req.startTime!=''"> and (t1.end_time between #{req.startTime} and #{req.endTime} </if> </if> </select> </mapper>