ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/InfoCouponDto.java
@@ -15,7 +15,7 @@ @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Long id; private String id; @ApiModelProperty(value = "优惠券名称") @TableField("name") private String name; @@ -42,4 +42,7 @@ @TableField("start_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private LocalDateTime startTime; @ApiModelProperty(value = "最高优惠金额") @TableField("maximum_discount_amount") private BigDecimal maximumDiscountAmount; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
@@ -3,6 +3,7 @@ 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 io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -57,10 +58,12 @@ @ApiModelProperty(value = "会员开始时间") @TableField("start_time") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDateTime startTime; @ApiModelProperty(value = "会员结束时间") @TableField("end_time") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDateTime endTime; @TableField("create_time") @@ -74,6 +77,8 @@ @ApiModelProperty(value = "要赠送的优惠卷") @TableField("coupon_ids") private String couponIds; @TableField(exist = false) private String vipName; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TInvoiceInformation.java
@@ -38,7 +38,11 @@ @ApiModelProperty(value = "发票类型(1=增值税普通发票,2=增值税专用发票)") @TableField("invoice_type") private Integer invoiceType; private String invoiceType; @ApiModelProperty(value = "发票类型(1=增值税普通发票,2=增值税专用发票)") @TableField("invoice_type_id") private Integer invoiceTypeId; @ApiModelProperty(value = "抬头类型(1=个人,2=企业)") @TableField("invoicing_object_type") ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/InvoiceInformationVo.java
New file @@ -0,0 +1,62 @@ package com.ruoyi.account.api.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.web.domain.BasePojo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * * </p> * * @author luodangjia * @since 2024-08-06 */ @Data public class InvoiceInformationVo { private String id; @ApiModelProperty(value = "用户id") private Long appUserId; @ApiModelProperty(value = "发票类型(1=增值税普通发票,2=增值税专用发票)") private String invoiceType; @ApiModelProperty(value = "发票类型id") private Integer invoiceTypeId; @ApiModelProperty(value = "抬头类型(1=个人,2=企业)") private Integer invoicingObjectType; @ApiModelProperty(value = "名称") private String name; @ApiModelProperty(value = "纳税识别号") private String taxIdentificationNumber; @ApiModelProperty(value = "公司地址") private String companyAddress; @ApiModelProperty(value = "公司电话") private String companyPhone; @ApiModelProperty(value = "开户银行") private String depositBank; @ApiModelProperty(value = "银行账户") private String bankAccount; @ApiModelProperty(value = "设置默认(0=否,1=是)") private Integer isDefault; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -4,6 +4,7 @@ import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,6 +37,11 @@ public R<TChargingGun> getChargingGunById(Integer id) { return R.fail("根据id获取充电枪失败:" + throwable.getMessage()); } @Override public R<SiteNameVO> getAllInfoById(Integer id) { return R.fail("通过枪id获取站点、桩、枪的名称失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
@@ -2,6 +2,7 @@ import com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; @@ -32,4 +33,13 @@ */ @PostMapping("/t-charging-gun/getChargingGunById/{id}") R<TChargingGun> getChargingGunById(@PathVariable("id") Integer id); /** * 通过枪id获取站点、桩、枪的名称VO * @param id * @return */ @PostMapping("/t-charging-gun/getAllInfoById/{id}") R<SiteNameVO> getAllInfoById(@PathVariable("id") Integer id); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/SiteNameVO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.chargingPile.api.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data @ApiModel(value = "获取站点、桩、枪的名称VO") public class SiteNameVO implements Serializable { @ApiModelProperty(value = "站点名称") private String siteName; @ApiModelProperty(value = "桩名称") private String pileName; @ApiModelProperty(value = "桩号") private Integer pileNumber; @ApiModelProperty(value = "枪名称") private String gunName; @ApiModelProperty(value = "枪号") private String gunNumber; } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/ChargingHandshakeFallbackFactory.java
New file @@ -0,0 +1,37 @@ package com.ruoyi.integration.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; /** * 充电桩服务降级处理 * * @author ruoyi */ @Component public class ChargingHandshakeFallbackFactory implements FallbackFactory<ChargingHandshakeClient> { private static final Logger log = LoggerFactory.getLogger(ChargingHandshakeFallbackFactory.class); @Override public ChargingHandshakeClient create(Throwable throwable) { log.error("调用充电握手数据失败:{}", throwable.getMessage()); return new ChargingHandshakeClient() { @Override public R<ChargingHandshake> getDataByOrderCode(String code) { return R.fail("根据订单号查询充电握手数据失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.integration.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient; import com.ruoyi.integration.api.feignClient.SendMessageClient; import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.api.model.PlatformStartCharging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; /** * 充电桩服务降级处理 * * @author ruoyi */ @Component public class SendMessageFallbackFactory implements FallbackFactory<SendMessageClient> { private static final Logger log = LoggerFactory.getLogger(SendMessageFallbackFactory.class); @Override public SendMessageClient create(Throwable throwable) { log.error("发送充电桩消息失败:{}", throwable.getMessage()); return new SendMessageClient() { @Override public void platformStartCharging(PlatformStartCharging platformStartCharging) { } }; } } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/ChargingHandshakeClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.integration.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory; import com.ruoyi.integration.api.model.ChargingHandshake; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/8/28 10:46 */ @FeignClient(contextId = "ChargingHandshakeClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = ChargingHandshakeFallbackFactory.class) public interface ChargingHandshakeClient { /** * 根据订单号查询充电握手数据 * @param code * @return */ @PostMapping("/chargingHandshake/getDataByOrderCode") R<ChargingHandshake> getDataByOrderCode(@RequestParam("code") String code); } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.integration.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.integration.api.factory.SendMessageFallbackFactory; import com.ruoyi.integration.api.model.EndCharge; import com.ruoyi.integration.api.model.PlatformStartCharging; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * @author zhibing.pu * @Date 2024/8/28 16:53 */ @FeignClient(contextId = "SendMessageClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = SendMessageFallbackFactory.class) public interface SendMessageClient { /** * 远程控制启动充电 * @param platformStartCharging * @return */ @PostMapping("/sendMessage/platformStartCharging") void platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging); } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingHandshake.java
@@ -2,6 +2,7 @@ import lombok.Data; import lombok.experimental.Accessors; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.math.BigDecimal; @@ -14,7 +15,7 @@ @Document(collection = "charging_handshake") //指定要对应的文档名(表名) @Accessors(chain = true) public class ChargingHandshake extends BaseModel { @Id private String transaction_serial_number;// 交易流水号 private String charging_pile_code;// 桩编码 private String charging_gun_code;// 抢号 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/PlatformStartCharging.java
@@ -2,6 +2,7 @@ import lombok.Data; import lombok.experimental.Accessors; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.math.BigDecimal; @@ -15,6 +16,7 @@ @Accessors(chain = true) public class PlatformStartCharging extends BaseModel { @Id private String transaction_serial_number; // 交易流水号 private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,2 +1,4 @@ com.ruoyi.integration.api.factory.IntegrationFallbackFactory com.ruoyi.integration.api.factory.UploadRealTimeMonitoringDataFallbackFactory com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory com.ruoyi.integration.api.factory.SendMessageFallbackFactory ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java
@@ -36,6 +36,6 @@ * @param days * @return */ @PostMapping("/t-charging-order-getDailyChargingDegree-strategy/getUtilizationTrend/{days}") @PostMapping("/t-charging-order-accounting-strategy/getDailyChargingDegree/{days}") R<List<Double>> getDailyChargingDegree(@PathVariable("days") Integer days, @RequestParam("siteIds") Set<Integer> siteIds); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -182,5 +182,11 @@ @TableField("pay_time") private LocalDateTime payTime; @ApiModelProperty(value = "累计服务费") @TableField("service_charge") private BigDecimal serviceCharge; @ApiModelProperty(value = "累计电费") @TableField("electrovalence") private BigDecimal electrovalence; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
@@ -72,5 +72,17 @@ @TableField("period_service_price") private BigDecimal periodServicePrice; @ApiModelProperty(value = "会员抵扣") @TableField(exist = false) private BigDecimal vipDiscount; @ApiModelProperty(value = "优惠券抵扣") @TableField(exist = false) private BigDecimal couponDiscount; @ApiModelProperty(value = "最终服务费") @TableField(exist = false) private BigDecimal finalService; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TExchangeOrder.java
@@ -113,6 +113,15 @@ @ApiModelProperty(value = "取消人") @TableField(exist = false) private String cancellationName; @ApiModelProperty(value = "商品名称") @TableField(exist = false) private String name; @ApiModelProperty(value = "下单手机号") @TableField(exist = false) private String phone; @ApiModelProperty(value = "订单id") @TableField(exist = false) private String uid; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderAppeal.java
@@ -70,6 +70,8 @@ @ApiModelProperty(value = "申诉反馈") @TableField("feedback") private String feedback; @TableField(exist = false) private String uid; @ApiModelProperty(value = "反馈人id") @TableField("feedback_user_id") ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrder.java
@@ -162,7 +162,12 @@ @TableField("pay_time") private LocalDateTime payTime; @ApiModelProperty(value = "下单手机号") @TableField(exist = false) private String phone; @ApiModelProperty(value = "商品/优惠券名称") @TableField(exist = false) private String name; @ApiModelProperty(value = "收货人") @TableField(exist = false) private String receivingName; @@ -175,5 +180,8 @@ @ApiModelProperty(value = "取消人") @TableField(exist = false) private String cancellationName; @ApiModelProperty(value = "订单id") @TableField(exist = false) private String uid; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java
@@ -29,6 +29,14 @@ @ApiModelProperty(value = "主键") @TableField("id") private Long id; @ApiModelProperty(value = "支付时间") @TableField("pay_time") private LocalDateTime payTime; @ApiModelProperty(value = "支付流水号") @TableField("pay_code") private String payCode; @ApiModelProperty(value = "累计退款金额") @TableField("pay_amount") ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java
@@ -89,5 +89,14 @@ @ApiModelProperty(value = "退款金额") @TableField("refund_amount") private BigDecimal refundAmount; @ApiModelProperty(value = "会员类型名称") @TableField(exist = false) private String name; @ApiModelProperty(value = "uid") @TableField(exist = false) private String uid; @ApiModelProperty(value = "userUid") @TableField(exist = false) private String userUid; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java
@@ -9,7 +9,7 @@ import java.util.List; @Data @ApiModel(value = "ChargingOrderQuery对象",description = "管理后台充电订单查询对象") @ApiModel(value = "ChargingOrderQuery充电桩订单查询对象",description = "管理后台充电桩订单查询对象") public class ChargingOrderQuery extends BasePage { @ApiModelProperty(value = "订单编号") private String code; ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderInfoVO.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.order.api.vo; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data @ApiModel(value = "充电桩订单列表查看详情",description = "充电桩订单列表查看详情") public class ChargingOrderInfoVO { @ApiModelProperty(value = "充电电流") private String cdElectronic; @ApiModelProperty(value = "充电电压") private String cdVoltage; @ApiModelProperty(value = "剩余电量") private String surplus; @ApiModelProperty(value = "实时总功率") private String totalPower; @ApiModelProperty(value = "车牌号") private String licensePlate; @ApiModelProperty(value = "车辆品牌") private String vehicleBrand; @ApiModelProperty(value = "车辆类型") private String vehicleModel; @ApiModelProperty(value = "用车类型") private String vehicleUse; @ApiModelProperty(value = "充电明细列表") private List<TChargingOrderAccountingStrategy> list; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java
New file @@ -0,0 +1,71 @@ package com.ruoyi.order.api.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.order.api.model.TChargingOrder; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @ApiModel(value = "ChargingOrderListVO对象",description = "充电时段统计列表VO") public class ChargingOrderListVO { @ApiModelProperty(value = "电站名称") private String siteName; @ApiModelProperty(value = "电站id") private Integer siteId; @ApiModelProperty(value = "充电桩id") private Integer chargingPileId; @ApiModelProperty(value = "用户id") private Long appUserId; @ApiModelProperty(value = "用户车辆id") private Long appUserCarId; @ApiModelProperty(value = "充电枪id") private Integer chargingGunId; @ApiModelProperty(value = "订单编号") private String code; @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))") private String orderType; @ApiModelProperty(value = "充电终端名称 桩+枪") private String terminalName; @ApiModelProperty(value = "充电时间 秒") private Long chargingSecond; @ApiModelProperty(value = "充电电流 度") private BigDecimal chargingCapacity; @ApiModelProperty(value = "车牌号") private String licensePlate; @ApiModelProperty(value = "客户手机号") private String phone; @ApiModelProperty(value = "充电到账金额") private BigDecimal paymentAmount; @ApiModelProperty(value = "累计电费") private BigDecimal electrovalence; @ApiModelProperty(value = "累计服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "平台手续费") private BigDecimal commissionAmount; @ApiModelProperty(value = "引流平台") private String sourceName; @ApiModelProperty(value = "平台分佣") private BigDecimal sharingAmount; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime startTime; @ApiModelProperty(value = "结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime endTime; @ApiModelProperty(value = "开始soc") private String startSoc; @ApiModelProperty(value = "结束soc") private String endSoc; @ApiModelProperty(value = "结束原因 (0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)") private Integer endMode; @ApiModelProperty(value = "电流占比") private String electronicProportion; @ApiModelProperty(value = "订单id") private Long id; @ApiModelProperty(value = "订单uid") private String uid; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.order.api.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.page.PageInfo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Data @ApiModel(value = "ChargingOrderTimeVO对象",description = "充电时段统计VO") public class ChargingOrderTimeVO { @ApiModelProperty(value = "订单数量") private Integer orderCount; @ApiModelProperty(value = "充电总度数") private BigDecimal chargingCapacity; @ApiModelProperty(value = "充电到账金额") private BigDecimal paymentAmount; @ApiModelProperty(value = "累计电费") private BigDecimal electrovalence; @ApiModelProperty(value = "累计服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "尖峰平谷充电量") private String capacityProportion; @ApiModelProperty(value = "尖峰平谷服务费") private String serviceProportion; @ApiModelProperty(value = "尖峰平谷充电到账") private String electronicProportion; @ApiModelProperty(value = "列表数据") private PageInfo<ChargingOrderListVO> list; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
@@ -13,7 +13,7 @@ import java.util.List; @Data @ApiModel(value = "SiteDetailEvaluateVO对象",description = "站点详情订单评价") @ApiModel(value = "ChargingOrderVO对象",description = "充电订单列表VO") public class ChargingOrderVO extends TChargingOrder { @ApiModelProperty(value = "站点名称") private String siteName; @@ -38,5 +38,4 @@ private Integer count; @ApiModelProperty(value = "1明星充电 2快电 3新电途") private Integer orderSource; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java
@@ -8,7 +8,7 @@ import java.math.BigDecimal; @Data @ApiModel(value = "TOrderAppealVO对象", description = "充电桩订单VO") @ApiModel(value = "充电桩订单列表对象", description = "充电桩订单VO") public class TCharingOrderVO { @ApiModelProperty(value = "分页列表") private PageInfo<ChargingOrderVO> list; ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderAppealVO.java
@@ -4,10 +4,15 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.Getter; import lombok.Setter; @Data @ApiModel(value = "TOrderAppealVO对象", description = "订单申诉VO对象") public class TOrderAppealVO extends TOrderAppeal { @ApiModelProperty(value = "uid") private String uid; @ApiModelProperty(value = "充电订单") private TChargingOrder chargingOrder; @@ -15,10 +20,20 @@ @ApiModelProperty(value = "购物订单") private TShoppingOrder shoppingOrder; @ApiModelProperty(value = "兑换订单") private TExchangeOrder exchangeOrder; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "商品图片") private String goodsPicture; @ApiModelProperty(value = "会员订单") private TVipOrder vipOrder; @ApiModelProperty(value = "站点名称") private String siteName; @ApiModelProperty(value = "桩名称") private String pileName; @ApiModelProperty(value = "桩号") private Integer pileNumber; @ApiModelProperty(value = "枪名称") private String gunName; @ApiModelProperty(value = "枪号") private String gunNumber; } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
@@ -35,6 +35,11 @@ public R<List<Integer>> getCouponIdsByName(String name) { return R.fail("根据名称查询优惠券ids:" + throwable.getMessage()); } @Override public R updateCoupon(TCoupon coupon) { throw new RuntimeException("修改优惠券失败"); } }; } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
@@ -33,6 +33,11 @@ public R<List<Integer>> getGoodsIdsByName(String name) { return R.fail("根据商品名称获取商品ids失败:" + throwable.getMessage()); } @Override public R updateGoods(TGoods goods) { throw new RuntimeException("修改商品异常"); } }; } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java
@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -28,4 +29,13 @@ R<TCoupon> getCouponById1(@PathVariable("id") Integer id); @PostMapping("/t-coupon/getCouponIdsByName/{name}") R<List<Integer>> getCouponIdsByName(@PathVariable("name")String name); /** * 修改优惠券 * @param coupon * @return */ @PostMapping("/t-coupon/updateCoupon") R updateCoupon(@RequestBody TCoupon coupon); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -32,4 +33,13 @@ */ @PostMapping("/t-goods/getGoodsIdsByName/{name}") public R<List<Integer>> getGoodsIdsByName(@PathVariable("name")String name); /** * 修改商品 * @param goods * @return */ @PostMapping("/t-goods/updateGoods") R updateGoods(@RequestBody TGoods goods); } ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
@@ -5,6 +5,7 @@ import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; import com.ruoyi.payment.api.vo.PaymentOrder; import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -58,6 +59,11 @@ return R.fail("微信退款失败:" + throwable.getMessage()); } @Override public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) { return R.fail("微信退款回调失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
@@ -6,6 +6,7 @@ import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; import com.ruoyi.payment.api.vo.PaymentOrder; import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -65,4 +66,10 @@ @ApiOperation("订单退款") @PostMapping(value = "/wx/refundOrderR") public R<String> refundOrderR(@RequestBody WxPaymentRefundModel model); @ApiOperation("订单退款回调") @PostMapping(value = "/wx/refund/notify") R<WxRefundNotifyResp> refundNotify(HttpServletRequest request); } ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.payment.api.vo; import lombok.Data; /** * @author zhibing.pu * @Date 2024/8/28 14:54 */ @Data public class WxRefundNotifyResp { /** * 支付单号 */ private String out_trade_no; /** * 退款单号 */ private String out_refund_no; /** * 支付流水号 */ private String transaction_id; /** * 退款流水号 */ private String refund_id; /** * 退款状态 */ private String tradeState; /** * 退款时间 */ private String success_time; } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ExchangeDto.java
@@ -10,7 +10,7 @@ @ApiModelProperty("商品id") Integer goodId; @ApiModelProperty("地址id") Integer addressId; Long addressId; @ApiModelProperty("备注") String remark; @ApiModelProperty(hidden = true) ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserAddressController.java
@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; /** * <p> @@ -68,8 +69,11 @@ Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUserAddress appUserAddress = appUserAddressService.getOne(Wrappers.<TAppUserAddress>lambdaQuery().eq(TAppUserAddress::getAppUserId, userId) .eq(TAppUserAddress::getDefaultAddress, 1)); if(Objects.isNull(appUserAddress)){ return AjaxResult.success(); } appUserAddress.setUid(appUserAddress.getId().toString()); return AjaxResult.ok(appUserAddress); return AjaxResult.success(appUserAddress); } @@ -106,6 +110,8 @@ @ApiOperation(tags = {"小程序-用户地址"},value = "修改用户地址") @PostMapping(value = "/update") public AjaxResult<Boolean> update(@RequestBody TAppUserAddress dto) { // 用户id dto.setAppUserId(tokenService.getLoginUserApplet().getUserId()); // 修改用户默认地址 appUserAddressService.updateDefaultAddress(dto.getDefaultAddress(),dto.getAppUserId()); return AjaxResult.ok(appUserAddressService.updateById(dto)); @@ -127,7 +133,7 @@ */ @ApiOperation(tags = {"小程序-用户地址"},value = "删除用户地址") @DeleteMapping(value = "/deleteById") public AjaxResult<Boolean> deleteById(@RequestParam("id") Integer id) { public AjaxResult<Boolean> deleteById(@RequestParam("id") Long id) { return AjaxResult.ok(appUserAddressService.removeById(id)); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -544,7 +544,7 @@ TCoupon coupon = JSON.toJavaObject(JSON.parseObject(tAppCoupon.getCouponJson()), TCoupon.class); InfoCouponDto infoCouponDto = new InfoCouponDto(); BeanUtils.copyProperties(coupon, infoCouponDto); infoCouponDto.setId(tAppCoupon.getId()); infoCouponDto.setId(tAppCoupon.getId().toString()); infoCouponDto.setEndTime(tAppCoupon.getEndTime()); couponDtos1.add(infoCouponDto); @@ -558,7 +558,7 @@ TCoupon coupon = JSON.toJavaObject(JSON.parseObject(tAppCoupon.getCouponJson()), TCoupon.class); InfoCouponDto infoCouponDto = new InfoCouponDto(); BeanUtils.copyProperties(coupon, infoCouponDto); infoCouponDto.setId(tAppCoupon.getId()); infoCouponDto.setId(tAppCoupon.getId().toString()); infoCouponDto.setEndTime(tAppCoupon.getEndTime()); couponDtos2.add(infoCouponDto); } @@ -566,7 +566,7 @@ TCoupon coupon = JSON.toJavaObject(JSON.parseObject(tAppCoupon.getCouponJson()), TCoupon.class); InfoCouponDto infoCouponDto = new InfoCouponDto(); BeanUtils.copyProperties(coupon, infoCouponDto); infoCouponDto.setId(tAppCoupon.getId()); infoCouponDto.setId(tAppCoupon.getId().toString()); infoCouponDto.setEndTime(tAppCoupon.getEndTime()); couponDtos2.add(infoCouponDto); } @@ -586,7 +586,7 @@ @ApiOperation(value = "优惠卷详情(1可使用2不可用)", tags = {"小程序-个人中心"}) @PostMapping(value = "/user/coupon/getById") @GetMapping(value = "/user/coupon/getById") public R<TAppCoupon> couponGetById(@RequestParam("id")Long id) { TAppCoupon appCoupon = appCouponService.getById(id); return R.ok(appCoupon); @@ -628,7 +628,7 @@ } @ApiOperation(value = "已赠送列表", tags = {"小程序-个人中心-邀请好友"}) @PostMapping(value = "/user/invite/info") @GetMapping(value = "/user/invite/info") public R<InviteInfoDto> inviteInfo() { Long userId = tokenService.getLoginUserApplet().getUserId(); Integer point = 0; ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java
@@ -5,12 +5,14 @@ import com.ruoyi.account.api.vo.GetAppUserVipDetail; import com.ruoyi.account.service.TAppUserVipDetailService; import com.ruoyi.common.core.domain.R; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.VipClient; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * @author zhibing.pu @@ -22,6 +24,8 @@ @Resource private TAppUserVipDetailService appUserVipDetailService; @Resource private TokenService tokenService; /** * 获取用户当前有效的vip明细 @@ -37,5 +41,21 @@ return R.ok(one); } @Resource private VipClient vipClient; @GetMapping("/getVipUseDetail") @ApiOperation(value = "生效会员列表", tags = {"小程序-个人中心"}) public R<List<TAppUserVipDetail>> getVipUseDetail(){ Long userId = tokenService.getLoginUserApplet().getUserId(); List<TAppUserVipDetail> list = appUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, userId).last(" and now() between start_time and end_time order by start_time desc").list(); for (TAppUserVipDetail tAppUserVipDetail : list) { TVip data = vipClient.getInfo1(tAppUserVipDetail.getVipId()).getData(); tAppUserVipDetail.setVipName(data.getName()); } return R.ok(list); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInvoiceInformationController.java
@@ -3,13 +3,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.TInvoiceInformation; import com.ruoyi.account.api.vo.InvoiceInformationVo; import com.ruoyi.account.service.TInvoiceInformationService; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.security.service.TokenService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** @@ -34,10 +37,17 @@ @ResponseBody @GetMapping(value = "/getInvoiceInformationList") @ApiOperation(value = "获取开票抬头数据列表", tags = {"小程序-充电发票"}) public AjaxResult<List<TInvoiceInformation>> getInvoiceInformationList(){ public AjaxResult<List<InvoiceInformationVo>> getInvoiceInformationList(){ Long userId = tokenService.getLoginUserApplet().getUserId(); List<TInvoiceInformation> list = invoiceInformationService.list(new LambdaQueryWrapper<TInvoiceInformation>().eq(TInvoiceInformation::getAppUserId, userId).eq(TInvoiceInformation::getDelFlag, 0)); return AjaxResult.success(list); List<InvoiceInformationVo> lists = new ArrayList<>(); for (TInvoiceInformation tInvoiceInformation : list) { InvoiceInformationVo vo = new InvoiceInformationVo(); BeanUtils.copyProperties(tInvoiceInformation, vo); vo.setId(tInvoiceInformation.getId().toString()); lists.add(vo); } return AjaxResult.success(lists); } @@ -48,7 +58,7 @@ public AjaxResult addInvoiceInformation(@RequestBody TInvoiceInformation invoiceInformation){ Long userId = tokenService.getLoginUserApplet().getUserId(); //如果当前是默认抬头,则需要去除其他的默认配置 if(1 == invoiceInformation.getIsDefault()){ if(null != invoiceInformation.getIsDefault() && 1 == invoiceInformation.getIsDefault()){ TInvoiceInformation one = invoiceInformationService.getOne(new LambdaQueryWrapper<TInvoiceInformation>().eq(TInvoiceInformation::getDelFlag, 0) .eq(TInvoiceInformation::getIsDefault, 1).eq(TInvoiceInformation::getAppUserId, userId)); if(null != one){ ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -4,10 +4,13 @@ import cn.hutool.core.img.ImgUtil; import cn.hutool.core.io.FileUtil; import com.ruoyi.chargingPile.api.dto.TChargingGunDTO; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.TChargingGunQuery; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.chargingPile.util.QRCodeUtils; @@ -52,6 +55,8 @@ @Resource private TChargingPileService chargingPileService; @Resource private ISiteService siteService; @Autowired public TChargingGunController(TChargingGunService chargingGunService) { @@ -184,5 +189,24 @@ TChargingGun chargingGun = chargingGunService.getById(id); return R.ok(chargingGun); } /** * 根据id获取充电枪详情 * @param id * @return */ @ResponseBody @PostMapping(value = "/getAllInfoById/{id}") public R<SiteNameVO> getAllInfoById(@PathVariable Integer id){ SiteNameVO siteNameVO = new SiteNameVO(); TChargingGun chargingGun = chargingGunService.getById(id); siteNameVO.setGunName(chargingGun.getName()); siteNameVO.setGunNumber(chargingGun.getCode()); TChargingPile chargingPile = chargingPileService.getById(id); siteNameVO.setPileName(chargingPile.getName()); siteNameVO.setPileNumber(chargingPile.getNumber()); Site site = siteService.getById(id); siteNameVO.setSiteName(site.getName()); return R.ok(siteNameVO); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -64,7 +64,7 @@ throw new ServiceException("未查询到计费策略"); } List<TAccountingStrategyDetailVO> list = this.queryAccountingStrategyDetailByStrategyId(accountingStrategy.getId()); list.stream().filter(item -> "24:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59")); list.stream().filter(item -> "00:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59")); // 获取当前登录用户id Long userId = tokenService.getLoginUserApplet().getUserId(); // 根据id查询用户信息 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -40,6 +40,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; @@ -304,7 +305,12 @@ chargeMonitoring.setNotCharged(total.size() - charging.size()); chargeMonitoring.setRatedPower(ratedPower.setScale(4, RoundingMode.HALF_EVEN)); chargeMonitoring.setRealTimePower(realTimePower.setScale(4, RoundingMode.HALF_EVEN)); chargeMonitoring.setDemandPowerSatisfactionRate(realTimePower.divide(ratedPower).multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN)); if(ratedPower.equals(BigDecimal.ZERO)){ chargeMonitoring.setDemandPowerSatisfactionRate(BigDecimal.ZERO); }else{ chargeMonitoring.setDemandPowerSatisfactionRate(realTimePower.divide(ratedPower, new MathContext(2, RoundingMode.HALF_EVEN)) .multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN)); } List<String> dates = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd"); @@ -325,9 +331,13 @@ List<Double> data = chargingOrderAccountingStrategyClient.getDailyChargingDegree(6, siteIds).getData(); List<Double> value2 = new ArrayList<>(); for (Double datum : data) { if(list.size() == 0){ value2.add(0D); }else{ Double datum1 = new BigDecimal(datum).divide(new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24))).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); value2.add(datum1); } } Map<String, Object> utilizationTrend = new HashMap<>(); utilizationTrend.put("date", dates); utilizationTrend.put("value", value2); ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/SiteMapper.xml
@@ -163,6 +163,7 @@ </if> AND ts.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} AND ts.status = ${@com.ruoyi.common.core.enums.status.SiteStatusEnum@NORMAL_USE.getCode()} AND ts.accounting_strategy_id IS NOT NULL </where> <if test="query.sortType != null"> <choose> ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/ChargingHandshakeController.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.integration.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.mongodb.service.ChargingHandshakeService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @author zhibing.pu * @Date 2024/8/28 9:50 */ @RestController @RequestMapping("/chargingHandshake") public class ChargingHandshakeController { @Resource private ChargingHandshakeService chargingHandshakeService; /** * 根据订单编号获取充电握手数据 * @param code * @return */ @PostMapping("/getDataByOrderCode") public R<ChargingHandshake> getDataByOrderCode(@RequestParam("code") String code){ ChargingHandshake chargingHandshake = chargingHandshakeService.findById(code); return R.ok(chargingHandshake); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/ChargingHandshakeService.java
@@ -4,4 +4,6 @@ import com.ruoyi.integration.mongodb.base.BaseService; public interface ChargingHandshakeService extends BaseService<ChargingHandshake> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
New file @@ -0,0 +1,97 @@ package com.ruoyi.order.controller; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; 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.model.TVipOrder; import com.ruoyi.order.api.query.VipShoppingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.dto.ChargingListQuery; import com.ruoyi.order.dto.PayOrderDto; import com.ruoyi.order.dto.PayOrderQueryDto; import com.ruoyi.order.service.*; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Arrays; import java.util.List; /** * <p> * 前端控制器 * </p> * * @author xiaochen * @since 2024-08-07 */ @Api(tags = "财务结算") @RestController @RequestMapping("/financial/settlement") public class FinancialSettlementController { @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 @PostMapping(value = "/chargingList") @ApiOperation(value = "充电时段统计列表", tags = {"管理后台-财务结算"}) public AjaxResult<ChargingOrderTimeVO> chargingList(@RequestBody ChargingListQuery dto) { ChargingOrderTimeVO res = chargingOrderService.chargingList(dto); return AjaxResult.success(res); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1,4 +1,6 @@ package com.ruoyi.order.controller; import com.google.common.collect.Lists; import java.math.BigDecimal; import java.time.DayOfWeek; import java.time.LocalDate; @@ -35,6 +37,7 @@ import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.vo.ChargingOrderInfoVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.GetMyChargingOrderList; @@ -64,6 +67,7 @@ import java.time.YearMonth; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -99,8 +103,6 @@ @Resource private TShoppingOrderService shoppingOrderService; @Autowired private AppUserClient appUserClient; @Resource private TVipOrderService vipOrderService; @@ -126,7 +128,8 @@ @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @ResponseBody @PostMapping(value = "/pay/order/list") @@ -186,11 +189,12 @@ // payOrderInfoDto3.setRefundAmount(new BigDecimal("0")); } return R.ok(); } @ResponseBody @GetMapping(value = "/pay/order/refund/detail") @ApiOperation(value = "退款信息", tags = {"管理后台-支付订单-订单信息"}) @@ -223,8 +227,10 @@ payOrderChargingInfo.setChargingName(data1.getName()); TChargingGun data2 = chargingGunClient.getChargingGunById(byId.getChargingGunId()).getData(); payOrderChargingInfo.setGunName(data2.getName()); if (byId.getAppUserCarId()!=null) { List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(byId.getAppUserCarId())).getData(); payOrderChargingInfo.setCarNum(data3.get(0).getLicensePlate()); } return R.ok(); } @@ -237,6 +243,7 @@ } @ResponseBody @PostMapping(value = "/pay/order/refund/list") @ApiOperation(value = "充电信息", tags = {"管理后台-支付订单-退款订单"}) @@ -244,6 +251,9 @@ return chargingOrderService.getRefundList(chargingRefundDto); } @ResponseBody @@ -259,9 +269,19 @@ @ResponseBody @PostMapping(value = "/chargingOrderInfo") @ApiOperation(value = "充电桩订单列表查看详情", tags = {"管理后台-订单管理"}) public AjaxResult<TCharingOrderVO> chargingOrderInfo(String orderId) { return AjaxResult.success(); public AjaxResult<ChargingOrderInfoVO> chargingOrderInfo(String orderId) { ChargingOrderInfoVO chargingOrderInfoVO = new ChargingOrderInfoVO(); chargingOrderInfoVO.setCdElectronic(""); chargingOrderInfoVO.setCdVoltage(""); chargingOrderInfoVO.setSurplus(""); chargingOrderInfoVO.setTotalPower(""); chargingOrderInfoVO.setLicensePlate(""); chargingOrderInfoVO.setVehicleBrand(""); chargingOrderInfoVO.setVehicleModel(""); chargingOrderInfoVO.setVehicleUse(""); List<TChargingOrderAccountingStrategy> tChargingOrderAccountingStrategies = new ArrayList<>(); chargingOrderInfoVO.setList(tChargingOrderAccountingStrategies); return AjaxResult.success(chargingOrderInfoVO); } @ResponseBody @@ -272,9 +292,9 @@ orderEvaluateService.addOrderEvaluate(dto); return AjaxResult.success(); } /** * 查询用户最近一次充电记录使用的车辆 * * @param * @return */ @@ -305,7 +325,6 @@ .between(TChargingOrder::getStartTime, req.getStartTime(), req.getEndTime())).size(); return R.ok(size); } //用户订单数量 @PostMapping(value = "/useOrderCount") public R<Long> useOrderCount(@RequestParam("userId") Long userId) { @@ -313,7 +332,6 @@ return R.ok(count); } //订单详情 @PostMapping(value = "/detail") public R<TChargingOrder> detail(@RequestParam("orderId") Long orderId) { @@ -347,6 +365,8 @@ } @ResponseBody @GetMapping(value = "/getMyChargingOrderList") @ApiOperation(value = "获取充电记录列表", tags = {"小程序-充电记录"}) @@ -365,6 +385,7 @@ } @ResponseBody @GetMapping(value = "/getNoInvoicedOrder") @ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"}) @@ -372,6 +393,7 @@ List<MyChargingOrderList> list = chargingOrderService.getNoInvoicedOrder(query); return AjaxResult.success(list); } @ResponseBody @@ -437,6 +459,7 @@ } @ResponseBody @GetMapping(value = "/getChargingDetails/{id}") @ApiOperation(value = "获取充电中页面数据", tags = {"小程序-扫一扫"}) ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java
@@ -38,10 +38,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.*; import java.util.stream.Collectors; /** @@ -96,7 +93,7 @@ } @Resource private SysUserClient sysUserClient; @PostMapping("/getShoppingOrderInfoById") @GetMapping("/getShoppingOrderInfoById") @ApiOperation(value = "根据订单id查看订单详情", tags = {"管理后台-兑换订单"}) public AjaxResult<TExchangeOrder> getShoppingOrderList(String id) { TExchangeOrder byId = exchangeOrderService.getById(id); @@ -145,8 +142,10 @@ } @GetMapping("/consignerShoppingOrder") @ApiOperation(value = "发货", tags = {"管理后台-兑换订单"}) public AjaxResult consignerShoppingOrder(String id) { public AjaxResult consignerShoppingOrder(String id,String companyName,String code) { TExchangeOrder byId = exchangeOrderService.getById(id); byId.setExpressCompany(companyName); byId.setExpressNumber(code); Long userid = tokenService.getLoginUser().getUserid(); byId.setConsignerId(userid); byId.setConsignerTime(LocalDateTime.now()); @@ -281,7 +280,7 @@ tExchangeOrder.setPoints(exchangeDto.getPoint()); tExchangeOrder.setRemark(""); if (exchangeDto.getGoodType()==1){ tExchangeOrder.setStatus(0); tExchangeOrder.setStatus(1); }else { tExchangeOrder.setStatus(3); } @@ -296,8 +295,8 @@ @GetMapping("/getMyExchangeOrder") @ApiOperation(value = "获取兑换记录列表", tags = {"小程序-兑换记录"}) public AjaxResult<List<MyExchangeOrderList>> getMyExchangeOrder(GetMyExchangeOrder query){ List<MyExchangeOrderList> list = exchangeOrderService.getMyExchangeOrder(query); public AjaxResult<Map<String, Object>> getMyExchangeOrder(GetMyExchangeOrder query){ Map<String, Object> list = exchangeOrderService.getMyExchangeOrder(query); return AjaxResult.success(list); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
@@ -9,18 +9,19 @@ import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.order.api.model.TOrderAppeal; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.TOrderAppealQuery; import com.ruoyi.order.api.vo.TOrderAppealVO; import com.ruoyi.order.dto.ManageFeedbackDto; import com.ruoyi.order.dto.ManageOrderAppealQuery; import com.ruoyi.order.service.TOrderAppealService; import com.ruoyi.order.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Arrays; /** * <p> @@ -38,6 +39,16 @@ private final TokenService tokenService; @Resource private AppUserClient appUserClient; @Resource private TChargingOrderService chargingOrderService; @Resource private TShoppingOrderService shoppingOrderService; @Resource private TExchangeOrderService exchangeOrderService; @Resource private TVipOrderService vipOrderService; @Autowired public TOrderAppealController(TOrderAppealService orderAppealService, TokenService tokenService) { @@ -53,9 +64,19 @@ .like(manageOrderAppealQuery.getPhone() != null, TOrderAppeal::getPhone, manageOrderAppealQuery.getPhone()) .eq(manageOrderAppealQuery.getOrderType() != null, TOrderAppeal::getOrderType, manageOrderAppealQuery.getOrderType()) .in(TOrderAppeal::getOrderType, 1, 2).page(Page.of(manageOrderAppealQuery.getPageCurr(), manageOrderAppealQuery.getPageSize())); for (TOrderAppeal record : page.getRecords()) { record.setUid(record.getId().toString()); } return R.ok(page); } @ApiOperation(tags = {"后台-订单管理-订单申诉"},value = "删除") @DeleteMapping (value = "/manage/delete") public R<Page<TOrderAppeal>> delete(String ids) { orderAppealService.removeBatchByIds(Arrays.asList(ids.split(","))); return R.ok(); } @ApiOperation(tags = {"后台-订单管理-订单申诉"},value = "后台-订单管理-订单申诉") @@ -73,8 +94,7 @@ @ApiOperation(tags = {"小程序-订单申诉"},value = "查询订单申诉分页列表") @PostMapping(value = "/pageList") public AjaxResult<PageInfo<TOrderAppealVO>> pageList(@RequestBody TOrderAppealQuery query) { // TODO 用户id 获取小程序当前登录用户id Long userId = tokenService.getLoginUser().getUserid(); Long userId = tokenService.getLoginUserApplet().getUserId(); query.setAppUserId(userId); return AjaxResult.ok(orderAppealService.pageList(query)); } @@ -84,7 +104,7 @@ */ @GetMapping(value = "/getDetailById") @ApiOperation(tags = {"小程序-订单申诉"},value = "查询订单申诉详情") public AjaxResult<TOrderAppealVO> getDetailById(Integer id) { public AjaxResult<TOrderAppealVO> getDetailById(String id) { return AjaxResult.ok(orderAppealService.getDetailById(id)); } @@ -99,6 +119,20 @@ orderAppeal.setAppUserId(appUserId); orderAppeal.setStatus(1); orderAppeal.setPhone(data.getPhone()); if (orderAppeal.getOrderType()==1){ TChargingOrder byId = chargingOrderService.getById(orderAppeal.getOrderId()); orderAppeal.setCode(byId.getCode()); }else if(orderAppeal.getOrderType()==2){ TShoppingOrder byId = shoppingOrderService.getById(orderAppeal.getOrderId()); orderAppeal.setCode(byId.getCode()); }else if(orderAppeal.getOrderType()==3){ TExchangeOrder byId = exchangeOrderService.getById(orderAppeal.getOrderId()); orderAppeal.setCode(byId.getCode()); }else if(orderAppeal.getOrderType()==4){ TVipOrder byId = vipOrderService.getById(orderAppeal.getOrderId()); orderAppeal.setCode(byId.getCode()); } orderAppealService.save(orderAppeal); return AjaxResult.success(); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderEvaluateController.java
@@ -54,7 +54,7 @@ @GetMapping(value = "/getPageList") @PostMapping(value = "/getPageList") @ApiOperation(value = "获取充电评价列表", tags = {"管理后台-充电评价"}) public AjaxResult<PageInfo<GetOrderEvaluatePageListDTO>> getPageList(@RequestBody GetOrderEvaluatePageList pageList){ PageInfo<GetOrderEvaluatePageListDTO> list = orderEvaluateService.getPageList(pageList); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -3,6 +3,8 @@ import java.time.LocalDateTime; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUserAddress; @@ -24,6 +26,7 @@ import com.ruoyi.payment.api.model.RefundReq; import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.swagger.annotations.Api; @@ -33,9 +36,8 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import java.util.*; /** * <p> @@ -84,7 +86,7 @@ } @Resource private SysUserClient sysUserClient; @PostMapping("/getShoppingOrderInfoById") @GetMapping("/getShoppingOrderInfoById") @ApiOperation(value = "根据订单id查看订单详情", tags = {"管理后台-购物订单"}) public AjaxResult<TShoppingOrder> getShoppingOrderList(String id) { TShoppingOrder byId = shoppingOrderService.getById(id); @@ -142,6 +144,9 @@ // todo 部署到线上之后写回调地址 // wxPaymentRefundModel.setNotify_url(""); String string = byId.getPaymentAmount().multiply(new BigDecimal("100")).toString(); if (string.contains(".")){ string = string.substring(0,string.indexOf(".")); } int i = Integer.parseInt(string); WxPaymentRefundModel.RefundAmount refundAmount = new WxPaymentRefundModel.RefundAmount(); refundAmount.setTotal(i); @@ -176,8 +181,10 @@ } @GetMapping("/consignerShoppingOrder") @ApiOperation(value = "发货", tags = {"管理后台-购物订单"}) public AjaxResult consignerShoppingOrder(String id) { public AjaxResult consignerShoppingOrder(String id,String companyName,String code) { TShoppingOrder byId = shoppingOrderService.getById(id); byId.setExpressCompany(companyName); byId.setExpressNumber(code); Long userid = tokenService.getLoginUser().getUserid(); byId.setConsignerId(userid); byId.setConsignerTime(LocalDateTime.now()); @@ -187,9 +194,26 @@ } @GetMapping("/getMyShoppingOrderList") @ApiOperation(value = "获取购买订单列表", tags = {"小程序-商城购买订单"}) public AjaxResult<List<MyShoppingOrderList>> getMyShoppingOrderList(GetMyShoppingOrderList query){ List<MyShoppingOrderList> list = shoppingOrderService.getMyShoppingOrderList(query); public AjaxResult<Map<String, Object>> getMyShoppingOrderList(GetMyShoppingOrderList query){ Map<String, Object> list = shoppingOrderService.getMyShoppingOrderList(query); return AjaxResult.success(list); } @GetMapping("/getMyShoppingOrderListNum") @ApiOperation(value = "获取购买订单列表数量", tags = {"小程序-商城购买订单"}) public AjaxResult<Map<String, Object>> getMyShoppingOrderListNum(){ Long userId = tokenService.getLoginUserApplet().getUserId(); long dfh = shoppingOrderService.count(new LambdaQueryWrapper<TShoppingOrder>().eq(TShoppingOrder::getDelFlag, 0) .eq(TShoppingOrder::getStatus, 1).eq(TShoppingOrder::getAppUserId, userId)); long dsh = shoppingOrderService.count(new LambdaQueryWrapper<TShoppingOrder>().eq(TShoppingOrder::getDelFlag, 0) .eq(TShoppingOrder::getStatus, 2).eq(TShoppingOrder::getAppUserId, userId)); long ywc = shoppingOrderService.count(new LambdaQueryWrapper<TShoppingOrder>().eq(TShoppingOrder::getDelFlag, 0) .eq(TShoppingOrder::getStatus, 3).eq(TShoppingOrder::getAppUserId, userId)); Map<String, Object> map = new HashMap<>(); map.put("dfh", dfh); map.put("dsh", dsh); map.put("ywc", ywc); return AjaxResult.success(map); } @@ -228,6 +252,21 @@ return shoppingOrderService.cancelOrder(id); } /** * 商城订单取消微信退款回调 */ @PostMapping("/cancelShoppingOrderWxRefund") public void cancelShoppingOrderWxRefund(HttpServletRequest request){ WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData(); if(null != data){ String out_refund_no = data.getOut_refund_no(); String refund_id = data.getRefund_id(); String tradeState = data.getTradeState(); String success_time = data.getSuccess_time(); shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time); } } @ResponseBody @@ -250,7 +289,7 @@ shoppingOrder.setCouponId(exchangeDto.getGoodId()); } shoppingOrder.setPurchaseQuantity(exchangeDto.getNum()); shoppingOrder.setAppUserAddressId(Long.valueOf(exchangeDto.getAddressId())); shoppingOrder.setAppUserAddressId(exchangeDto.getAddressId()); shoppingOrder.setOrderAmount(exchangeDto.getOrderPrice()); if (exchangeDto.getCouponId()!=null) { shoppingOrder.setAppCouponId(exchangeDto.getCouponId()); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -52,7 +52,7 @@ @PostMapping("/addVipOrder") @ApiOperation(value = "添加会员订单", tags = {"管理后台-会员订单"}) public AjaxResult addVipOrder(@RequestBody TVipOrder dto) { vipOrderService.save(dto); vipOrderService.saveOrUpdate(dto); return AjaxResult.success(); } @GetMapping("/deleteVipOrder") ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingDetails.java
@@ -26,7 +26,7 @@ @ApiModelProperty("续航") private BigDecimal endurance; @ApiModelProperty("剩余充电时间") private Long remainingChargeTime; private Integer remainingChargeTime; @ApiModelProperty("充电枪名") private String name; @ApiModelProperty("订单编号") @@ -34,9 +34,9 @@ @ApiModelProperty("已充电度数") private BigDecimal chargedDegrees; @ApiModelProperty("已充电时间") private Long chargedTime; private Integer chargedTime; @ApiModelProperty("充电费用") private BigDecimal ChargingCost; private BigDecimal chargingCost; @ApiModelProperty("充电状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") private Integer status; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
New file @@ -0,0 +1,38 @@ package com.ruoyi.order.dto; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; import java.util.List; @Data public class ChargingListQuery extends BasePage { @ApiModelProperty("订单编号") private String code; @ApiModelProperty("电站id") private Integer siteId; @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") private Integer status; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("车牌号") private String licensePlate; @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))") private Integer orderType; @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String startTime; @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String endTime; @ApiModelProperty("用户ids 前端忽略") private List<Long> userIds; @ApiModelProperty("车辆ids 前端忽略") private List<Long> carIds; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyChargingOrderList.java
@@ -31,4 +31,10 @@ private BigDecimal payMoney; @ApiModelProperty("订单时间") private String createTime; @ApiModelProperty("评价状态(1=待评价,2=已评价)") private Long evaluate; @ApiModelProperty("电费") private BigDecimal electricCharge; @ApiModelProperty("服务费") private BigDecimal serviceCharge; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
@@ -39,6 +39,8 @@ private String code; @ApiModelProperty("下单时间") private String createTime; @ApiModelProperty("订单金额") private BigDecimal orderAmount; @ApiModelProperty("支付金额") private BigDecimal paymentAmount; @ApiModelProperty("备注") ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
@@ -19,6 +19,8 @@ private String imgUrl; @ApiModelProperty("商品名称") private String name; @ApiModelProperty("商品类型(1=商品,2=优惠券)") private Integer orderType; @ApiModelProperty("状态(1=待发货,2=待收货,3=已完成,4=已取消)") private Integer status; @ApiModelProperty("单价") @@ -27,4 +29,6 @@ private Integer number; @ApiModelProperty("支付金额") private BigDecimal paymentAmount; @ApiModelProperty("订单时间") private String createTime; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
@@ -31,5 +31,7 @@ private LocalDateTime endTime; @ApiModelProperty("支付时间") private LocalDateTime payTime; private Integer refundStatus; private Double finalAmount; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java
@@ -80,7 +80,7 @@ return; } } filterChain.doFilter(request, response); filterChain.doFilter(servletRequest, servletResponse); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -7,6 +7,7 @@ import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.dto.*; import org.apache.ibatis.annotations.Mapper; @@ -74,4 +75,8 @@ List<Map<String, BigDecimal>> getMonthData(List<Long> chargingOrderIds); List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds); List<ChargingOrderListVO> chargingList(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); List<ChargingOrderListVO> chargingList1( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -10,6 +10,7 @@ import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.*; @@ -112,4 +113,6 @@ List<Map<String, BigDecimal>> getMonthData(List<Long> chargingOrderIds); List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds); ChargingOrderTimeVO chargingList(ChargingListQuery dto); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TExchangeOrderService.java
@@ -9,6 +9,7 @@ import com.ruoyi.order.dto.MyExchangeOrderList; import java.util.List; import java.util.Map; /** * <p> @@ -26,7 +27,7 @@ * @param query * @return */ List<MyExchangeOrderList> getMyExchangeOrder(GetMyExchangeOrder query); Map<String, Object> getMyExchangeOrder(GetMyExchangeOrder query); /** ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderAppealService.java
@@ -28,5 +28,5 @@ * @param id * @return */ TOrderAppealVO getDetailById(Integer id); TOrderAppealVO getDetailById(String id); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
@@ -15,6 +15,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; import java.util.Map; /** * <p> @@ -34,7 +35,7 @@ * @param query * @return */ List<MyShoppingOrderList> getMyShoppingOrderList(GetMyShoppingOrderList query); Map<String, Object> getMyShoppingOrderList(GetMyShoppingOrderList query); /** @@ -54,6 +55,18 @@ /** * 商城订单取消订单微信退款处理 * @param out_refund_no 退款单号 * @param refund_id 退款流水号 * @param refund_status 退款状态 SUCCESS:退款成功 CLOSED:退款关闭 ABNORMAL:退款异常 * @param success_time 退款成功时间 * @return */ AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time); /** * 获取未开票的订单列表 * @param query * @return ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java
@@ -71,21 +71,21 @@ map2.put("name", "峰"); BigDecimal value2 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 2) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map1.put("value", value2.setScale(2, RoundingMode.HALF_EVEN)); map2.put("value", value2.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map2); Map<String, Object> map3 = new HashMap<>(); map3.put("name", "平"); BigDecimal value3 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 3) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map1.put("value", value3.setScale(2, RoundingMode.HALF_EVEN)); map3.put("value", value3.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map3); Map<String, Object> map4 = new HashMap<>(); map4.put("name", "谷"); BigDecimal value4 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 4) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map1.put("value", value4.setScale(2, RoundingMode.HALF_EVEN)); map4.put("value", value4.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map4); list2.add(datas); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderRefundServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.mapper.TChargingOrderRefundMapper; import com.ruoyi.order.service.TChargingOrderRefundService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @date 2024/8/28 15:18 */ @Service public class TChargingOrderRefundServiceImpl extends ServiceImpl<TChargingOrderRefundMapper, TChargingOrderRefund> implements TChargingOrderRefundService { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -25,18 +25,26 @@ 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.integration.api.feignClient.ChargingHandshakeClient; import com.ruoyi.integration.api.feignClient.SendMessageClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.model.TOrderEvaluate; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.vo.*; @@ -80,6 +88,10 @@ private AppUserClient appUserClient; @Resource private ChargingPileClient chargingPileClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @Resource @@ -91,8 +103,7 @@ @Resource private AliPaymentClient aliPaymentClient; @Resource private ChargingPileClient chargingPileClient; @Resource @@ -104,6 +115,14 @@ @Resource private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; @Resource private ChargingHandshakeClient chargingHandshakeClient; @Resource private SendMessageClient sendMessageClient; @Resource private TOrderEvaluateService orderEvaluateService; @@ -135,9 +154,14 @@ BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); myChargingOrderList.setPayMoney(payMoney); myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); long count = orderEvaluateService.count(new LambdaQueryWrapper<TOrderEvaluate>().eq(TOrderEvaluate::getOrderType, 1) .eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0)); myChargingOrderList.setEvaluate(count + 1L); orderLists.add(myChargingOrderList); } list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), null, null); map.put("list", orderLists); map.put("totle", list.size()); return map; } @@ -207,7 +231,7 @@ map.put("time", time.get(i)); //soc map.put("soc", soc.get(i)); //电压 //功率 map.put("power", po.get(i)); power.add(map); } @@ -241,6 +265,8 @@ BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); myChargingOrderList.setPayMoney(payMoney); myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); myChargingOrderList.setElectricCharge(tChargingOrder.getElectrovalence()); myChargingOrderList.setServiceCharge(tChargingOrder.getServiceCharge()); list.add(myChargingOrderList); } return list; @@ -414,10 +440,25 @@ preChargeCheck.setSecureConnectionDetection(false); String key = "AQJC_" + chargingOrder.getChargingGunId(); redisService.setCacheObject(key, preChargeCheck); //开始检测充电桩状,将检查状态写入缓存。检测完成后开始开启充电 //充电结束后需要计算退款剩余金额 // todo 需要完善 //根据当前充值的金额和计费模板算出充电的金额 BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); //计算充电金额,会员需要将折扣金额加入到充电总金额中 // TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); // if(){ // appUser.getVipId() // } // // // //调用远程启动充电消息 // PlatformStartCharging platformStartCharging = new PlatformStartCharging(); // platformStartCharging.setTransaction_serial_number(chargingOrder.getCode()); // platformStartCharging.setCharging_pile_code(); // platformStartCharging.setCharging_gun_code(); // platformStartCharging.setCard_number(); // platformStartCharging.setAccount_balance() // sendMessageClient.platformStartCharging(platformStartCharging); return AjaxResult.success(); } @@ -435,7 +476,6 @@ if(null == one){ return null; } // todo 需要完善充电实时数据 ChargingDetails chargingDetails = new ChargingDetails(); chargingDetails.setId(one.getId().toString()); TChargingGun chargingGun = chargingGunClient.getChargingGunById(id).getData(); @@ -444,6 +484,27 @@ chargingDetails.setName(site.getName() + "-" + chargingPile.getName()); chargingDetails.setCode(one.getCode()); chargingDetails.setStatus(one.getStatus()); UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData(); if(null != data){ chargingDetails.setChargeCurrent(data.getOutput_current()); chargingDetails.setChargeVoltage(data.getOutput_voltage()); BigDecimal power = data.getOutput_current().multiply(data.getOutput_voltage()).divide(new BigDecimal(1000)); chargingDetails.setChargePower(power); chargingDetails.setCompletionRatio(data.getSoc()); chargingDetails.setRemainingChargeTime(data.getTime_remaining()); chargingDetails.setChargedDegrees(data.getCharging_degree()); chargingDetails.setChargedTime(data.getCumulative_charging_time()); chargingDetails.setChargingCost(data.getPaid_amount()); } ChargingHandshake chargingHandshake = chargingHandshakeClient.getDataByOrderCode(one.getCode()).getData(); if(null != chargingHandshake && null != data && null != one.getAppUserCarId()){ BigDecimal bms_battery_capacity = chargingHandshake.getBms_battery_capacity(); TAppUserCar appUserCar = appUserCarClient.getCarByIds(Arrays.asList(one.getAppUserCarId())).getData().get(0); // 续航 = 电池容量 / 续航里程 * soc BigDecimal divide = bms_battery_capacity.divide(new BigDecimal(appUserCar.getEndurance())); BigDecimal multiply = new BigDecimal(data.getSoc() / 100).multiply(divide); chargingDetails.setEndurance(multiply); } return chargingDetails; } @@ -467,6 +528,14 @@ // todo 待完善 return AjaxResult.success(); } public void endCharge(){ } @Override @@ -506,6 +575,12 @@ BigDecimal electronicMoney = new BigDecimal("0"); BigDecimal serviceMoney = new BigDecimal("0"); for (ChargingOrderVO chargingOrderVO : list) { TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData(); TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData(); if (data2!=null && data3!=null){ chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName()); } if (chargingOrderVO.getChargingCapacity()!=null){ total = total.add(chargingOrderVO.getChargingCapacity()); } @@ -516,14 +591,8 @@ BigDecimal electronicMoney1 = new BigDecimal("0"); // 单个订单累计服务费 BigDecimal serviceMoney1 = new BigDecimal("0"); LocalDateTime startTime = chargingOrderVO.getStartTime(); LocalDateTime endTime = chargingOrderVO.getEndTime(); // 计算时间差 秒 充电时长 if (startTime!=null && endTime!=null){ long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingOrderVO.setChargingSecond(between); time += between; } // todo 调用第三方获取充电时长 秒 // 总收入 if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){ income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount())); @@ -634,4 +703,166 @@ public List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds) { return this.baseMapper.getYearData(chargingOrderIds); } @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; String startTime2 = null; String endTime1 = null; String endTime2 = null; if (StringUtils.hasLength(dto.getStartTime())){ String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } if (StringUtils.hasLength(dto.getEndTime())){ String[] split = dto.getEndTime().split(" - "); endTime1 = split[0]; endTime2 = split[1]; } ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO(); PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); for (ChargingOrderListVO chargingOrderListVO : list) { List<Integer> integers = new ArrayList<>(); integers.add(chargingOrderListVO.getSiteId()); List<Site> data = siteClient.getSiteByIds(integers).getData(); if (!data.isEmpty()) { chargingOrderListVO.setSiteName(data.get(0).getName()); } TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData(); TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData(); if (data2 != null && data1 != null) { chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName()); } // todo 充电时长 调用第三方获取 TAppUser data3 = appUserClient.getUserById(chargingOrderListVO.getAppUserId()).getData(); List<Long> carId = new ArrayList<>(); if (chargingOrderListVO.getAppUserCarId() != null) { carId.add(chargingOrderListVO.getAppUserCarId()); List<TAppUserCar> data4 = appUserCarClient.getCarByIds(carId).getData(); if (!data4.isEmpty()) chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate()); } if (data3 != null) chargingOrderListVO.setPhone(data3.getPhone()); List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list(); // 尖峰平谷充电量 度数 BigDecimal jian = new BigDecimal("0"); BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); BigDecimal total = new BigDecimal("0"); for (TChargingOrderAccountingStrategy temp : list2) { switch (temp.getType()) { case 1: jian = jian.add(temp.getChargingCapacity()); break; case 2: feng = feng.add(temp.getChargingCapacity()); break; case 3: ping = ping.add(temp.getChargingCapacity()); break; case 4: gu = gu.add(temp.getChargingCapacity()); break; } } total = total.add(jian).add(feng).add(ping).add(gu); chargingOrderListVO.setElectronicProportion( jian.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(尖)/" +feng.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(峰)/" +ping.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(平)/" +gu.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(谷)"); } // 不分页 List<ChargingOrderListVO> list1 = this.baseMapper.chargingList1(dto,startTime1,startTime2,endTime1,endTime2); chargingOrderTimeVO.setOrderCount(list1.size()); // 计算充电总度数 BigDecimal electronic = new BigDecimal("0"); // 支付金额 BigDecimal paymentAmount = new BigDecimal("0"); // 电费 BigDecimal electrovalence = new BigDecimal("0"); // 服务费 BigDecimal serviceCharge = new BigDecimal("0"); // 尖峰平谷充电到账 BigDecimal jianElectronic = new BigDecimal("0"); BigDecimal fengElectronic = new BigDecimal("0"); BigDecimal pingElectronic = new BigDecimal("0"); BigDecimal guElectronic = new BigDecimal("0"); // 尖峰平谷服务费 BigDecimal jianService = new BigDecimal("0"); BigDecimal fengService = new BigDecimal("0"); BigDecimal pingService = new BigDecimal("0"); BigDecimal guService = new BigDecimal("0"); // 尖峰平谷充电量 度数 BigDecimal jian = new BigDecimal("0"); BigDecimal feng = new BigDecimal("0"); BigDecimal ping = new BigDecimal("0"); BigDecimal gu = new BigDecimal("0"); for (ChargingOrderListVO chargingOrderListVO : list1) { electronic = electronic.add(chargingOrderListVO.getChargingCapacity()); paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount()); electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence()); serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge()); List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list(); for (TChargingOrderAccountingStrategy temp : list2) { switch (temp.getType()){ case 1: jian = jian.add(temp.getChargingCapacity()); jianElectronic = jianElectronic.add(temp.getChargingCapacity()); jianService = jianService.add(temp.getChargingCapacity()); break; case 2: feng = feng.add(temp.getChargingCapacity()); fengElectronic = fengElectronic.add(temp.getChargingCapacity()); fengService = fengService.add(temp.getChargingCapacity()); break; case 3: ping = ping.add(temp.getChargingCapacity()); pingElectronic = pingElectronic.add(temp.getChargingCapacity()); pingService = pingService.add(temp.getChargingCapacity()); break; case 4: gu = gu.add(temp.getChargingCapacity()); guElectronic = guElectronic.add(temp.getChargingCapacity()); guService = guService.add(temp.getChargingCapacity()); break; } } } chargingOrderTimeVO.setChargingCapacity(electronic); chargingOrderTimeVO.setPaymentAmount(paymentAmount); chargingOrderTimeVO.setElectrovalence(electrovalence); chargingOrderTimeVO.setServiceCharge(serviceCharge); // 计算尖峰平谷充电量占比 BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic); // 计算尖峰平谷服务费占比 BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService); // 计算尖峰平谷充电到账占比 BigDecimal add2 = jian.add(feng).add(ping).add(gu); chargingOrderTimeVO.setCapacityProportion(jianElectronic+"度/"+fengElectronic+"度/"+pingElectronic+"度/"+guElectronic+"度-" +jianElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +fengElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +pingElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +guElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setServiceProportion(jianService+"元/"+fengService+"元/"+pingService+"元/"+guService+"元-" +jianService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +fengService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +pingService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +guService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setElectronicProportion(jian+"元/"+feng+"元/"+ping+"元/"+gu+"元-" +jian.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +feng.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +ping.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/" +gu.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%"); chargingOrderTimeVO.setList(pageInfo); return chargingOrderTimeVO; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TExchangeOrderServiceImpl.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserAddressClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserAddress; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; @@ -25,7 +27,9 @@ import javax.annotation.Resource; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p> @@ -50,7 +54,8 @@ @Resource private AppUserAddressClient appUserAddressClient; @Resource private AppUserClient appUserClient; @@ -61,7 +66,7 @@ * @return */ @Override public List<MyExchangeOrderList> getMyExchangeOrder(GetMyExchangeOrder query) { public Map<String, Object> getMyExchangeOrder(GetMyExchangeOrder query) { Long userid = tokenService.getLoginUserApplet().getUserId(); LambdaQueryWrapper<TExchangeOrder> wrapper = new LambdaQueryWrapper<TExchangeOrder>().eq(TExchangeOrder::getDelFlag, 0).eq(TExchangeOrder::getAppUserId, userid); if(query.getStatus() == 0){ @@ -69,7 +74,9 @@ }else{ wrapper.eq(TExchangeOrder::getStatus, query.getStatus()); } List<TExchangeOrder> list = this.list(wrapper.orderByDesc(TExchangeOrder::getCreateTime).last(" limit " + query.getPageCurr() + "," + query.getPageSize())); long count = this.count(wrapper); Integer pageCurr = (query.getPageCurr() - 1) * query.getPageSize(); List<TExchangeOrder> list = this.list(wrapper.orderByDesc(TExchangeOrder::getCreateTime).last(" limit " + pageCurr + "," + query.getPageSize())); List<MyExchangeOrderList> pageList = new ArrayList<>(); for (TExchangeOrder tExchangeOrder : list) { MyExchangeOrderList exchangeOrderList = new MyExchangeOrderList(); @@ -94,7 +101,10 @@ exchangeOrderList.setImgUrl(imgUrl); pageList.add(exchangeOrderList); } return pageList; Map<String, Object> map = new HashMap<>(); map.put("list", pageList); map.put("total", count); return map; } @@ -109,10 +119,12 @@ ExchangeOrderGoodsInfo info = new ExchangeOrderGoodsInfo(); info.setId(id); info.setStatus(exchangeOrder.getStatus()); if(null != exchangeOrder.getAppUserAddressId()){ TAppUserAddress userAddress = appUserAddressClient.getAppUserAddressById(exchangeOrder.getAppUserAddressId()).getData(); info.setConsignee(userAddress.getName()); info.setPhone(userAddress.getPhone()); info.setAddress(userAddress.getAddress()); } info.setExpressCompany(exchangeOrder.getExpressCompany()); info.setExpressNumber(exchangeOrder.getExpressNumber()); String name = ""; @@ -137,8 +149,12 @@ info.setCreateTime(exchangeOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); info.setPoints(exchangeOrder.getPoints()); info.setRemark(exchangeOrder.getRemark()); if(null != exchangeOrder.getConsignerTime()){ info.setDeliveryTime(exchangeOrder.getConsignerTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } if(null != exchangeOrder.getReceivingTime()){ info.setFinishTime(exchangeOrder.getReceivingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } return info; } @@ -155,7 +171,29 @@ } PageInfo<TExchangeOrder> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TExchangeOrder> list = this.baseMapper.pageList(pageInfo,query,startTime1,startTime2); for (TExchangeOrder tShoppingOrder : list) { tShoppingOrder.setUid(tShoppingOrder.getId().toString()); switch (tShoppingOrder.getOrderType()){ case 1: TGoods data = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData(); if (data!=null){ tShoppingOrder.setName(data.getName()); } break; case 2: TCoupon data1 = couponClient.getCouponById1(tShoppingOrder.getCouponId()).getData(); if (data1!=null){ tShoppingOrder.setName(data1.getName()); } break; } if (tShoppingOrder.getAppUserId() != null){ TAppUser data = appUserClient.getUserById(tShoppingOrder.getAppUserId()).getData(); if (data!=null){ tShoppingOrder.setPhone(data.getPhone()); } } } pageInfo.setRecords(list); return pageInfo; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderAppealServiceImpl.java
@@ -2,6 +2,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.vo.SiteNameVO; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.TOrderAppealQuery; @@ -9,11 +13,14 @@ import com.ruoyi.order.mapper.*; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderAppealService; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.api.feignClient.GoodsClient; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** @@ -30,11 +37,11 @@ @Autowired private TChargingOrderMapper chargingOrderMapper; @Autowired private TExchangeOrderMapper exchangeOrderMapper; @Autowired private TShoppingOrderMapper shoppingOrderMapper; @Autowired private TVipOrderMapper vipOrderMapper; private GoodsClient goodsClient; @Autowired private ChargingGunClient chargingGunClient; @Override public PageInfo<TOrderAppealVO> pageList(TOrderAppealQuery query) { @@ -44,29 +51,32 @@ // 查询当前页的订单 List<TChargingOrder> chargingOrders = chargingOrderMapper.selectList(Wrappers.lambdaQuery(TChargingOrder.class) .in(TChargingOrder::getId, orderIds)); List<TExchangeOrder> exchangeOrders = exchangeOrderMapper.selectList(Wrappers.lambdaQuery(TExchangeOrder.class) .in(TExchangeOrder::getId, orderIds)); List<TShoppingOrder> shoppingOrders = shoppingOrderMapper.selectList(Wrappers.lambdaQuery(TShoppingOrder.class) .in(TShoppingOrder::getId, orderIds)); List<TVipOrder> vipOrders = vipOrderMapper.selectList(Wrappers.lambdaQuery(TVipOrder.class) .in(TVipOrder::getId, orderIds)); list.forEach(item -> { if (item.getOrderType() == 1) { TChargingOrder tChargingOrder = chargingOrders.stream().filter(chargingOrder -> chargingOrder.getId().equals(item.getOrderId())).findFirst().orElse(null); if(Objects.nonNull(tChargingOrder)){ item.setChargingOrder(chargingOrders.stream().filter(chargingOrder -> chargingOrder.getId().equals(item.getOrderId())).findFirst().orElse(null)); SiteNameVO siteNameVO = chargingGunClient.getAllInfoById(tChargingOrder.getChargingGunId()).getData(); item.setGunName(siteNameVO.getGunName()); item.setGunNumber(siteNameVO.getGunNumber()); item.setPileName(siteNameVO.getPileName()); item.setPileNumber(siteNameVO.getPileNumber()); item.setSiteName(siteNameVO.getSiteName()); } } else if (item.getOrderType() == 2) { item.setExchangeOrder(exchangeOrders.stream().filter(exchangeOrder -> exchangeOrder.getId().equals(item.getOrderId())).findFirst().orElse(null)); }else if (item.getOrderType() == 3) { item.setShoppingOrder(shoppingOrders.stream().filter(shoppingOrder -> shoppingOrder.getId().equals(item.getOrderId())).findFirst().orElse(null)); }else if (item.getOrderType() == 4) { item.setVipOrder(vipOrders.stream().filter(vipOrder -> vipOrder.getId().equals(item.getOrderId())).findFirst().orElse(null)); TShoppingOrder tShoppingOrder = shoppingOrders.stream().filter(shoppingOrder -> shoppingOrder.getId().equals(item.getOrderId())).findFirst().orElse(null); setGoodsInfo(item,tShoppingOrder); } }); list.forEach(e->e.setUid(e.getId().toString())); pageInfo.setRecords(list); return pageInfo; } @Override public TOrderAppealVO getDetailById(Integer id) { public TOrderAppealVO getDetailById(String id) { TOrderAppeal orderAppeal = this.baseMapper.selectById(id); TOrderAppealVO orderAppealVO = new TOrderAppealVO(); BeanUtils.copyProperties(orderAppeal,orderAppealVO); @@ -74,12 +84,21 @@ if (orderAppeal.getOrderType() == 1) { orderAppealVO.setChargingOrder(chargingOrderMapper.selectById(orderAppeal.getOrderId())); } else if (orderAppeal.getOrderType() == 2) { orderAppealVO.setExchangeOrder(exchangeOrderMapper.selectById(orderAppeal.getOrderId())); }else if (orderAppeal.getOrderType() == 3) { orderAppealVO.setShoppingOrder(shoppingOrderMapper.selectById(orderAppeal.getOrderId())); }else if (orderAppeal.getOrderType() == 4) { orderAppealVO.setVipOrder(vipOrderMapper.selectById(orderAppeal.getOrderId())); TShoppingOrder tShoppingOrder = shoppingOrderMapper.selectById(orderAppeal.getOrderId()); setGoodsInfo(orderAppealVO,tShoppingOrder); } return orderAppealVO; } private void setGoodsInfo(TOrderAppealVO orderAppealVO,TShoppingOrder tShoppingOrder){ if(Objects.nonNull(tShoppingOrder)){ orderAppealVO.setShoppingOrder(tShoppingOrder); TGoods goods = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData(); if(Objects.nonNull(goods)){ orderAppealVO.setGoodsName(goods.getName()); orderAppealVO.setGoodsPicture(goods.getCoverPicture()); } } } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -90,7 +90,7 @@ public AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice) { Long userId = tokenService.getLoginUserApplet().getUserId(); String orders = addOrderInvoice.getOrders(); if(StringUtils.isNotEmpty(orders)){ if(StringUtils.isEmpty(orders)){ return AjaxResult.error("请选择有效的订单"); } JSONArray parse = JSONArray.parse(orders); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderRefundServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.api.model.TShoppingOrderRefund; import com.ruoyi.order.mapper.TShoppingOrderRefundMapper; import com.ruoyi.order.service.TShoppingOrderRefundService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @date 2024/8/28 15:16 */ @Service public class TShoppingOrderRefundServiceImpl extends ServiceImpl<TShoppingOrderRefundMapper, TShoppingOrderRefund> implements TShoppingOrderRefundService { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -6,12 +6,16 @@ import com.ruoyi.account.api.dto.GrantCouponDto; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserAddressClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserAddress; 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.service.TokenService; import com.ruoyi.order.api.model.TExchangeOrder; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.model.TShoppingOrderRefund; import com.ruoyi.order.api.query.ShoppingOrderQuery; import com.ruoyi.order.api.query.TActivityStatisticsQuery; import com.ruoyi.order.api.vo.ChargingOrderVO; @@ -19,22 +23,32 @@ import com.ruoyi.order.api.vo.TActivityVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TShoppingOrderMapper; import com.ruoyi.order.service.TShoppingOrderRefundService; import com.ruoyi.order.service.TShoppingOrderService; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.api.feignClient.CouponClient; import com.ruoyi.other.api.feignClient.GoodsClient; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.model.RefundReq; import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.AliQueryOrder; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; import io.seata.spring.annotation.GlobalTransactional; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.*; import java.util.stream.Collectors; /** * <p> @@ -55,11 +69,22 @@ @Resource private CouponClient couponClient; @Resource private AppUserClient appUserClient; @Resource private AppUserAddressClient appUserAddressClient; @Resource private AppCouponClient appCouponClient; @Resource private WxPaymentClient wxPaymentClient; @Resource private AliPaymentClient aliPaymentClient; @Resource private TShoppingOrderRefundService shoppingOrderRefundService; @@ -168,14 +193,16 @@ * @return */ @Override public List<MyShoppingOrderList> getMyShoppingOrderList(GetMyShoppingOrderList query) { public Map<String, Object> getMyShoppingOrderList(GetMyShoppingOrderList query) { Long userId = tokenService.getLoginUserApplet().getUserId(); LambdaQueryWrapper<TShoppingOrder> wrapper = new LambdaQueryWrapper<TShoppingOrder>().eq(TShoppingOrder::getDelFlag, 0) .eq(TShoppingOrder::getAppUserId, userId); if(query.getStatus() != 0){ wrapper.eq(TShoppingOrder::getStatus, query.getStatus()); } List<TShoppingOrder> list = this.list(wrapper.orderByDesc(TShoppingOrder::getCreateTime).last(" limit " + query.getPageCurr() + ", " + query.getPageSize())); long count = this.count(wrapper); Integer pageCurr = (query.getPageCurr() - 1) * query.getPageSize(); List<TShoppingOrder> list = this.list(wrapper.orderByDesc(TShoppingOrder::getCreateTime).last(" limit " + pageCurr + ", " + query.getPageSize())); List<MyShoppingOrderList> pageList = new ArrayList<>(); for (TShoppingOrder tShoppingOrder : list) { MyShoppingOrderList myShoppingOrderList = new MyShoppingOrderList(); @@ -187,7 +214,7 @@ name = goods.getName(); imgUrl = goods.getCoverPicture(); }else{ TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getGoodsId()).getData(); TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getCouponId()).getData(); name = coupon.getName(); imgUrl = coupon.getCoverPicture(); } @@ -198,9 +225,13 @@ myShoppingOrderList.setUnitPrice(unitPrice); myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity()); myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount()); myShoppingOrderList.setOrderType(tShoppingOrder.getOrderType()); pageList.add(myShoppingOrderList); } return pageList; Map<String, Object> map = new HashMap<>(); map.put("list", pageList); map.put("total", count); return map; } @@ -228,7 +259,7 @@ name = goods.getName(); imgUrl = goods.getCoverPicture(); }else{ TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getGoodsId()).getData(); TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData(); info.setCouponType(coupon.getType()); info.setDays(coupon.getDays()); info.setEndTime(coupon.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); @@ -242,10 +273,15 @@ info.setUnitPrice(unitPrice); info.setCode(shoppingOrder.getCode()); info.setCreateTime(shoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); info.setOrderAmount(shoppingOrder.getOrderAmount()); info.setPaymentAmount(shoppingOrder.getPaymentAmount()); info.setRemark(shoppingOrder.getRemark()); if(null != shoppingOrder.getConsignerTime()){ info.setDeliveryTime(shoppingOrder.getConsignerTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } if(null != shoppingOrder.getReceivingTime()){ info.setFinishTime(shoppingOrder.getReceivingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } return info; } @@ -264,25 +300,143 @@ if(shoppingOrder.getStatus() == 3){ return AjaxResult.error("订单已完成,不能取消"); } if(shoppingOrder.getStatus() == 4){ //退款状态并且所有金额退完 List<TShoppingOrderRefund> list = shoppingOrderRefundService.list(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getShoppingOrderId, id).eq(TShoppingOrderRefund::getRefundStatus, 2)); BigDecimal bigDecimal = list.stream().map(TShoppingOrderRefund::getRefundAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_EVEN); if(shoppingOrder.getPaymentAmount().compareTo(bigDecimal) == 0 && shoppingOrder.getStatus() == 4){ return AjaxResult.error("订单已取消,不能重复操作"); } //退款金额 BigDecimal refundAmount = shoppingOrder.getPaymentAmount().subtract(bigDecimal); //先查询第三方订单状态订单是否退款 //支付方式(1=微信,2=支付宝) todo 待完善 //支付方式(1=微信,2=支付宝) Integer paymentType = shoppingOrder.getPaymentType(); if(1 == paymentType){ NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(shoppingOrder.getCode()).getData(); String trade_state = data.getTrade_state(); if("NOTPAY".equals(trade_state) || "REVOKED".equals(trade_state) || "PAYERROR".equals(trade_state)){ return AjaxResult.error("订单还未支付,不能操作退款"); } if("CLOSED".equals(trade_state)){ return AjaxResult.error("订单支付已关闭,不能操作退款"); } if("USERPAYING".equals(trade_state)){ return AjaxResult.error("订单正在支付中,不能操作退款"); } } if(2 == paymentType){ AliQueryOrder aliQueryOrder = aliPaymentClient.query(shoppingOrder.getCode()).getData(); String tradeStatus = aliQueryOrder.getTradeStatus(); if("TRADE_CLOSED".equals(tradeStatus)){ return AjaxResult.error("订单还未支付,不能操作退款"); } if("TRADE_FINISHED".equals(tradeStatus)){ return AjaxResult.error("订单支付已关闭,不能操作退款"); } if("WAIT_BUYER_PAY".equals(tradeStatus)){ return AjaxResult.error("订单正在支付中,不能操作退款"); } } //退款成功后需要判断商品库存类型后决定是否需要回退库存 //加redis锁处理高并发 //构建退款明细 TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund(); shoppingOrderRefund.setPayTime(shoppingOrder.getPayTime()); shoppingOrderRefund.setPayCode(shoppingOrder.getSerialNumber()); shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType()); shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); shoppingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Math.random() * 1000)); shoppingOrderRefund.setRefundAmount(refundAmount); shoppingOrderRefund.setRefundStatus(1); shoppingOrderRefund.setCode(shoppingOrder.getCode()); shoppingOrderRefund.setRefundTitle("取消订单"); shoppingOrderRefund.setRefundContent("取消订单"); shoppingOrderRefund.setRefundReason("取消订单"); shoppingOrderRefund.setRefundRemark("全额退款"); shoppingOrderRefund.setRefundTotalAmount(refundAmount.add(bigDecimal)); shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount()); if(1 == paymentType){ WxPaymentRefundModel model = new WxPaymentRefundModel(); model.setOut_trade_no(shoppingOrder.getCode()); model.setOut_refund_no(shoppingOrderRefund.getRefundCode()); model.setReason("取消订单"); model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); amount.setCurrency("CNY"); model.setAmount(amount); R<String> orderR = wxPaymentClient.refundOrderR(model); if(200 == orderR.getCode()){ shoppingOrderRefundService.save(shoppingOrderRefund); } } if(2 == paymentType){ RefundReq dto = new RefundReq(); dto.setOutTradeNo(shoppingOrder.getCode()); dto.setOutRequestNo(shoppingOrderRefund.getCode()); dto.setRefundAmount(refundAmount.toString()); dto.setRefundReason("取消订单"); RefundResp resp = aliPaymentClient.refund(dto).getData(); if(null != resp){ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); AjaxResult success = cancelShoppingOrderWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); if(success.isSuccess()){ shoppingOrderRefundService.save(shoppingOrderRefund); } } } return AjaxResult.success(); } /** * 商城订单取消订单微信退款处理 * @param out_refund_no 退款单号 * @param refund_id 退款流水号 * @param refund_status 退款状态 SUCCESS:退款成功 CLOSED:退款关闭 ABNORMAL:退款异常 * @param success_time 退款成功时间 * @return */ @Override @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 public AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time) { if("SUCCESS".equals(refund_status)){ TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no)); one.setRefundSerialNumber(refund_id); one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE"))); shoppingOrderRefundService.updateById(one); //判断是否需要回退库存 TShoppingOrder shoppingOrder = this.getById(one.getShoppingOrderId()); //商品 if(shoppingOrder.getOrderType() == 1){ // todo 需完善redis锁 //redis锁 和支付使用同一个锁 TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData(); Integer inventory = goods.getInventory(); if(-1 != inventory){ goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity()); goodsClient.updateGoods(goods); } //解锁 } //优惠券 if(shoppingOrder.getOrderType() == 2){ //redis锁 TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData(); Integer inventory = coupon.getInventoryQuantity(); if(-1 != inventory){ coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity()); couponClient.updateCoupon(coupon); } //解锁 } } return AjaxResult.success(); } /** * 获取未开票的订单列表 @@ -315,6 +469,7 @@ myShoppingOrderList.setUnitPrice(unitPrice); myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity()); myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount()); myShoppingOrderList.setCreateTime(tShoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"))); pageList.add(myShoppingOrderList); } return pageList; @@ -352,7 +507,30 @@ } PageInfo<TShoppingOrder> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TShoppingOrder> list = this.baseMapper.pageList(pageInfo,query,startTime1,startTime2); for (TShoppingOrder tShoppingOrder : list) { tShoppingOrder.setUid(tShoppingOrder.getId().toString()); switch (tShoppingOrder.getOrderType()){ case 1: TGoods data = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData(); if (data!=null){ tShoppingOrder.setName(data.getName()); } break; case 2: TCoupon data1 = couponClient.getCouponById1(tShoppingOrder.getCouponId()).getData(); if (data1!=null){ tShoppingOrder.setName(data1.getName()); } break; } if (tShoppingOrder.getAppUserId() != null){ TAppUser data = appUserClient.getUserById(tShoppingOrder.getAppUserId()).getData(); if (data!=null){ tShoppingOrder.setPhone(data.getPhone()); } } } pageInfo.setRecords(list); return pageInfo; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderRefundServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.api.model.TVipOrderRefund; import com.ruoyi.order.mapper.TVipOrderRefundMapper; import com.ruoyi.order.service.TVipOrderRefundService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @date 2024/8/28 15:19 */ @Service public class TVipOrderRefundServiceImpl extends ServiceImpl<TVipOrderRefundMapper, TVipOrderRefund> implements TVipOrderRefundService { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java
@@ -8,11 +8,14 @@ import com.ruoyi.order.dto.SixVipDto; import com.ruoyi.order.mapper.TVipOrderMapper; 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 java.math.BigDecimal; import java.time.LocalDate; import javax.annotation.Resource; import java.util.List; /** @@ -26,6 +29,8 @@ @Service public class TVipOrderServiceImpl extends ServiceImpl<TVipOrderMapper, TVipOrder> implements TVipOrderService { @Resource private VipClient vipClient; @Override public PageInfo<TVipOrder> pageList(VipShoppingOrderQuery query) { String startTime1 = null; @@ -39,7 +44,14 @@ } PageInfo<TVipOrder> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TVipOrder> list = this.baseMapper.pageList(pageInfo,query,startTime1,startTime2); for (TVipOrder tVipOrder : list) { tVipOrder.setUid(tVipOrder.getId().toString()); tVipOrder.setUserUid(tVipOrder.getAppUserId().toString()); TVip data = vipClient.getInfo(tVipOrder.getVipId()).getData(); if (data!=null){ tVipOrder.setName(data.getName()); } } pageInfo.setRecords(list); return pageInfo; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
@@ -204,5 +204,15 @@ } /** * 修改优惠券 * @param coupon * @return */ @PostMapping(value = "/updateCoupon") public R updateCoupon(@RequestBody TCoupon coupon){ tCouponService.updateById(coupon); return R.ok(); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEvaluationTagController.java
@@ -107,8 +107,9 @@ @ResponseBody @GetMapping("/getRandomEvaluationTag") @ApiOperation(value = "获取随机的4个评价标签", tags = {"小程序-充电记录"}) public AjaxResult<List<TEvaluationTag>> getRandomEvaluationTag(){ List<TEvaluationTag> list = evaluationTagService.list(new LambdaQueryWrapper<TEvaluationTag>().last(" order by RAND() limit 0, 4")); public AjaxResult<List<TEvaluationTag>> getRandomEvaluationTag(Integer type){ List<TEvaluationTag> list = evaluationTagService.list(new LambdaQueryWrapper<TEvaluationTag>().eq(TEvaluationTag::getType, type) .last(" order by RAND() limit 0, 4")); return AjaxResult.success(list); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -239,7 +239,7 @@ Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUser user = appUserClient.getUserById(userId).getData(); boolean isVip = false; if (user.getVipEndTime().isAfter(LocalDateTime.now())){ if (user.getVipEndTime()!=null&&user.getVipEndTime().isAfter(LocalDateTime.now())){ isVip = true; } //计算价格 @@ -256,7 +256,7 @@ originalPrice = good.getVipPrice(); } } orderPrice.add(originalPrice.multiply(BigDecimal.valueOf(exchangeDto.getNum()))); orderPrice = orderPrice.add(originalPrice.multiply(BigDecimal.valueOf(exchangeDto.getNum()))); }else { TCoupon coupon = couponService.getById(exchangeDto.getGoodId()); BigDecimal originalPrice = coupon.getPaymentAmount(); @@ -266,7 +266,7 @@ originalPrice = coupon.getVipPaymentAmount(); } } orderPrice.add(originalPrice); orderPrice = orderPrice.add(originalPrice); } exchangeDto.setOrderPrice(orderPrice); @@ -286,6 +286,7 @@ exchangeDto.setPayPrice(payPrice); exchangeDto.setDiscountPrice(discountPrice); exchangeDto.setVipDiscount(vipDiscount); exchangeDto.setUserId(userId); //创建订单 TShoppingOrder shopOrder = orderClient.shopCreate(exchangeDto).getData(); if (exchangeDto.getPayMethod()==1) { @@ -317,5 +318,17 @@ TGoods goods = goodsService.getById(id); return R.ok(goods); } /** * 修改商品 * @param goods * @return */ @PostMapping("/updateGoods") public R updateGoods(@RequestBody TGoods goods){ goodsService.updateById(goods); return R.ok(); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TInvoiceTypeController.java
@@ -80,7 +80,7 @@ @ResponseBody @DeleteMapping("/getInvoiceTypeList") @GetMapping("/getInvoiceTypeList") @ApiOperation(value = "获取开票类型", tags = {"小程序-充电发票"}) public AjaxResult<List<TInvoiceType>> getInvoiceTypeList(){ List<TInvoiceType> list = invoiceTypeService.list(new LambdaQueryWrapper<TInvoiceType>() ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.payment.api.vo.PaymentOrder; import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import com.ruoyi.payment.wx.enums.RefundEnum; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.wx.resp.NotifyV3PayDecodeRespBody; @@ -149,12 +150,12 @@ * 退款回调 */ @PostMapping("refund/notify") public void refundNotify(HttpServletRequest request) throws IOException { public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) throws IOException { try { Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() { }); // 商户订单号 String tradeNo = params.get("out_trade_no").toString(); String out_trade_no = params.get("out_trade_no").toString(); // 商户退款单号 String out_refund_no = params.get("out_refund_no").toString(); // 微信支付订单号 @@ -167,21 +168,22 @@ // 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下 String success_time = params.get("success_time").toString(); if (tradeState.equals(RefundEnum.SUCCESS.name())) { String substring = out_refund_no.substring(0, 2); switch (substring){ case "GW": break; } // TODO 退款成功处理 WxRefundNotifyResp resp = new WxRefundNotifyResp(); resp.setOut_trade_no(out_trade_no); resp.setOut_refund_no(out_refund_no); resp.setTradeState(tradeState); resp.setTransaction_id(transaction_id); resp.setRefund_id(refund_id); resp.setSuccess_time(success_time); wxV3Pay.ack(); return R.ok(resp); } else { wxV3Pay.ack(false, "不是成功的退款状态"); } } catch (Exception e) { wxV3Pay.ack(false, e.getMessage()); } return R.fail(); } /**