大大的豆芽 3 months ago
parent
commit
2dc2081bbc
49 changed files with 896 additions and 868 deletions
  1. 0 87
      yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderClothController.java
  2. 1 3
      yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderRechargeController.java
  3. 0 8
      yiqi-admin/src/main/java/com/yiqi/admin/controller/recharge/RechargeCardBatchRecordController.java
  4. 3 6
      yiqi-api/src/main/java/com/yiqi/api/controller/order/WeAppOrderRechargeController.java
  5. 0 26
      yiqi-common/src/main/java/com/yiqi/app/domain/AppUserBillMstr.java
  6. 20 1
      yiqi-common/src/main/java/com/yiqi/app/service/IAppCouponItemService.java
  7. 0 8
      yiqi-common/src/main/java/com/yiqi/app/service/IAppUserBillMstrService.java
  8. 2 2
      yiqi-common/src/main/java/com/yiqi/common/enums/ClothOrderStatusType.java
  9. 1 1
      yiqi-common/src/main/java/com/yiqi/common/enums/OrderGoodsStatusType.java
  10. 3 4
      yiqi-common/src/main/java/com/yiqi/common/enums/OrderRechargeStatus.java
  11. 1 1
      yiqi-common/src/main/java/com/yiqi/common/enums/PayStatus.java
  12. 6 5
      yiqi-common/src/main/java/com/yiqi/common/enums/RechargeRefundStatusType.java
  13. 12 0
      yiqi-common/src/main/java/com/yiqi/core/service/ISettlementManageBillService.java
  14. 10 1
      yiqi-common/src/main/java/com/yiqi/order/domain/OrderActivity.java
  15. 2 2
      yiqi-common/src/main/java/com/yiqi/order/domain/OrderCloth.java
  16. 8 0
      yiqi-common/src/main/java/com/yiqi/order/domain/OrderGoods.java
  17. 12 5
      yiqi-common/src/main/java/com/yiqi/order/domain/OrderRecharge.java
  18. 7 50
      yiqi-common/src/main/java/com/yiqi/order/domain/dto/PayOrderFaceToFaceDTO.java
  19. 1 1
      yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderClothAppointmentVO.java
  20. 0 1
      yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderPayResultVO.java
  21. 7 0
      yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderRechargeListVO.java
  22. 7 0
      yiqi-common/src/main/java/com/yiqi/order/service/IOrderRechargeRefundService.java
  23. 1 1
      yiqi-common/src/main/java/com/yiqi/order/service/IOrderRechargeService.java
  24. 2 1
      yiqi-common/src/main/java/com/yiqi/order/service/IPayService.java
  25. 5 0
      yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/BillMstrOrderDTO.java
  26. 0 6
      yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargeCardBatchRecordService.java
  27. 0 12
      yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargePasswordCardService.java
  28. 98 0
      yiqi-common/src/main/java/com/yiqi/settlement/domain/dto/OrderStatisticsVO.java
  29. 73 0
      yiqi-common/src/main/java/com/yiqi/settlement/domain/dto/PaymentStatisticsVO.java
  30. 41 0
      yiqi-common/src/main/java/com/yiqi/settlement/domain/dto/StoreBillStatistics.java
  31. 30 2
      yiqi-core/src/main/java/com/yiqi/app/service/impl/AppCouponItemServiceImpl.java
  32. 4 44
      yiqi-core/src/main/java/com/yiqi/app/service/impl/AppUserBillMstrServiceImpl.java
  33. 7 4
      yiqi-core/src/main/java/com/yiqi/app/service/impl/AppUserPointLogServiceImpl.java
  34. 301 11
      yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageBillServiceImpl.java
  35. 5 5
      yiqi-core/src/main/java/com/yiqi/delay/impl/DelayTaskRunService.java
  36. 5 15
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderActivityServiceImpl.java
  37. 12 53
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderClothServiceImpl.java
  38. 5 24
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderGoodsServiceImpl.java
  39. 12 1
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeRefundServiceImpl.java
  40. 104 241
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeServiceImpl.java
  41. 62 5
      yiqi-core/src/main/java/com/yiqi/order/service/impl/PayServiceImpl.java
  42. 1 1
      yiqi-core/src/main/java/com/yiqi/payment/AliPayService.java
  43. 1 1
      yiqi-core/src/main/java/com/yiqi/payment/WechatPayService.java
  44. 0 37
      yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargeCardBatchRecordServiceImpl.java
  45. 0 170
      yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java
  46. 4 20
      yiqi-core/src/main/resources/mapper/core/GoodsInfoMapper.xml
  47. 2 2
      yiqi-core/src/main/resources/mapper/order/OrderRechargeMapper.xml
  48. 1 0
      yiqi-core/src/main/resources/mapper/recharge/OrderRechargeRefundMapper.xml
  49. 17 0
      yiqi-framework/src/main/java/com/yiqi/framework/config/JacksonConfig.java

+ 0 - 87
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderClothController.java

@@ -1,16 +1,13 @@
 package com.yiqi.admin.controller.order;
 
-import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.app.domain.*;
 import com.yiqi.app.service.*;
-import com.yiqi.common.core.domain.AuthHolder;
 import com.yiqi.common.exception.ServiceException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.yiqi.app.domain.vo.AppUserInfoVO;
 import com.yiqi.common.annotation.Log;
 import com.yiqi.common.constant.UrlConstants;
 import com.yiqi.common.core.controller.BaseController;
@@ -23,7 +20,6 @@ import com.yiqi.common.utils.*;
 import com.yiqi.common.utils.poi.ExcelUtil;
 import com.yiqi.core.domain.dto.wx.IntracityExpressAddOrderRequest;
 import com.yiqi.core.domain.vo.ClothHangerOrderRelationVO;
-import com.yiqi.core.domain.vo.wx.IntracityExpressBaseResult;
 import com.yiqi.core.domain.vo.wx.IntracityExpressCreateOrderResult;
 import com.yiqi.core.service.ISysStoreIntracityExpressService;
 import com.yiqi.order.domain.OrderCloth;
@@ -169,88 +165,6 @@ public class OrderClothController extends BaseController {
     @ApiOperation("第三方快递配送")
     @PostMapping(value = "/setThirdDelivery")
     public R setThirdDelivery(@RequestBody @Valid OrderClothThirdDeliverySendDTO orderClothThirdDeliverySendDTO) throws Exception {
-//        OrderCloth orderCloth = orderClothService.getOne(new QueryWrapper<OrderCloth>().lambda()
-//                .eq(OrderCloth::getOrderNo, orderClothThirdDeliverySendDTO.getOrderNo())
-//                .eq(OrderCloth::getOrgId, SecurityUtils.getLoginUser().getOrgId())
-//                .eq(OrderCloth::getSourceType, SecurityUtils.getLoginUser().getSourceType()));
-//        if (orderCloth == null) {
-//            throw new ServiceException("未查询到订单信息");
-//        }
-//        if (!orderCloth.getSourceType().equals(SourceType.FACTORY.getCode())) {
-//            throw new ServiceException("该订单不是云洗订单,无法快递配送派单");
-//        }
-////        ManageFactory factory = manageFactoryService.getOne(new QueryWrapper<ManageFactory>().lambda().eq(ManageFactory::getId,orderCloth.getOrgId()));
-////        if(factory == null){
-////            throw new ServiceException("未查询到工厂");
-////        }
-//        switch (EnumUtils.getEnumByType(orderCloth.getOrderStatus(), ClothOrderStatusType.class)) {
-//            case APPOINTMENT: {
-//                OrderClothDeliveryAddress orderClothDeliveryAddress = orderClothDeliveryAddressService
-//                        .getOne(new QueryWrapper<OrderClothDeliveryAddress>().lambda()
-//                                .eq(OrderClothDeliveryAddress::getOrderNo, orderClothThirdDeliverySendDTO.getOrderNo())
-//                                .eq(OrderClothDeliveryAddress::getClothOrderType, ClothOrderDeliveryType.collectCloth.getCode()));
-//                if (orderClothDeliveryAddress == null) {
-//                    throw new ServiceException("未查询到配送信息");
-//                }
-//                orderClothDeliveryAddress.setThirdDeliveryOrderNo(orderNoUtils.getDeliveryOrderNo());
-//                orderClothDeliveryAddress.setDeliveryWay(ClothOrderDeliveryWay.thirdExpress.getCode());
-//                orderClothDeliveryAddress.setDeliveryId(orderClothThirdDeliverySendDTO.getDeliveryId());
-//                orderClothDeliveryAddress.setDeliveryName(orderClothThirdDeliverySendDTO.getDeliveryCompany());
-//                orderClothDeliveryAddress.setServiceType(orderClothThirdDeliverySendDTO.getServiceType());
-//                orderClothDeliveryAddress.setServiceName(orderClothThirdDeliverySendDTO.getServiceName());
-//                orderClothDeliveryAddressService.updateById(orderClothDeliveryAddress);
-//                if (!ClothTakeWay.DELIVERY.getCode().equals(orderCloth.getTakeClothWay())) {
-//                    throw new ServiceException("该订单客户未选择上门取衣,无法分配配送员");
-//                }
-//                //这里进行快递下单
-//                AppUserInfoVO appUserInfo = appUserService.getAppUserInfoById(orderCloth.getAppUserId());
-//                OrderThirdDeliveryAddDTO orderThirdDeliveryAddDTO = OrderThirdDeliveryAddDTO
-//                        .buildDeliveryOrderByClothOrder(orderCloth, orderClothDeliveryAddress, orderClothThirdDeliverySendDTO
-//                                , getDeliveryInfoByOrg(SecurityUtils.getLoginUser().getOrgId(), SecurityUtils.getLoginUser().getSourceType()), appUserInfo);
-//                WxMaExpressOrderInfoResult result = thirdDeliveryService.addDeliveryOrder(orderThirdDeliveryAddDTO);
-//                orderClothDeliveryAddress.setWaybillNo(result.getWaybillId());
-//                orderClothDeliveryAddressService.updateById(orderClothDeliveryAddress);
-//                orderClothService.update(new UpdateWrapper<OrderCloth>().lambda()
-//                        .eq(OrderCloth::getId, orderCloth.getId())
-//                        .set(OrderCloth::getOrderStatus, ClothOrderStatusType.WAITING_TO_DOOR.getCode()));
-//
-//                return R.ok();
-//            }
-//            case WAITING_TO_SEND: {
-//                OrderClothDeliveryAddress orderClothDeliveryAddress = orderClothDeliveryAddressService
-//                        .getOne(new QueryWrapper<OrderClothDeliveryAddress>().lambda()
-//                                .eq(OrderClothDeliveryAddress::getOrderNo, orderClothThirdDeliverySendDTO.getOrderNo())
-//                                .eq(OrderClothDeliveryAddress::getClothOrderType, ClothOrderDeliveryType.takeCloth.getCode()));
-//                if (orderClothDeliveryAddress == null) {
-//                    throw new ServiceException("未查询到配送信息");
-//                }
-//                orderClothDeliveryAddress.setThirdDeliveryOrderNo(orderNoUtils.getDeliveryOrderNo());
-//                orderClothDeliveryAddress.setDeliveryWay(ClothOrderDeliveryWay.thirdExpress.getCode());
-//                orderClothDeliveryAddress.setDeliveryId(orderClothThirdDeliverySendDTO.getDeliveryId());
-//                orderClothDeliveryAddress.setDeliveryName(orderClothThirdDeliverySendDTO.getDeliveryCompany());
-//                orderClothDeliveryAddress.setServiceType(orderClothThirdDeliverySendDTO.getServiceType());
-//                orderClothDeliveryAddress.setServiceName(orderClothThirdDeliverySendDTO.getServiceName());
-//                orderClothDeliveryAddressService.updateById(orderClothDeliveryAddress);
-//                if (!ClothTakeWay.DELIVERY.getCode().equals(orderCloth.getSendClothWay())) {
-//                    throw new ServiceException("该订单客户未选择送货上门,无法分配配送员");
-//                }
-//                //这里进行快递下单
-//                AppUserInfoVO appUserInfo = appUserService.getAppUserInfoById(orderCloth.getAppUserId());
-//                OrderThirdDeliveryAddDTO orderThirdDeliveryAddDTO = OrderThirdDeliveryAddDTO
-//                        .buildDeliveryOrderByClothOrder(orderCloth, orderClothDeliveryAddress, orderClothThirdDeliverySendDTO
-//                                , getDeliveryInfoByOrg(SecurityUtils.getLoginUser().getOrgId(), SecurityUtils.getLoginUser().getSourceType()), appUserInfo);
-//                WxMaExpressOrderInfoResult result = thirdDeliveryService.addDeliveryOrder(orderThirdDeliveryAddDTO);
-//                orderClothDeliveryAddress.setWaybillNo(result.getWaybillId());
-//                orderClothDeliveryAddressService.updateById(orderClothDeliveryAddress);
-//                orderClothService.update(new UpdateWrapper<OrderCloth>().lambda()
-//                        .eq(OrderCloth::getId, orderCloth.getId())
-//                        .set(OrderCloth::getOrderStatus, ClothOrderStatusType.SENDING.getCode()));
-//                return R.ok();
-//            }
-//            default: {
-//                throw new ServiceException("订单状态不正确,无法派单");
-//            }
-//        }
         return R.ok("三方配送已弃用");
     }
 
@@ -482,7 +396,6 @@ public class OrderClothController extends BaseController {
                 .eq(OrderCloth::getDelFlag, DeleteStatus.OK.getCode())));
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @PreAuthorize("@ss.hasPermi('order:cloth:collectCloth')")
     @ApiOperation("创建收衣订单")
     @PostMapping(value = "/collectCloth")

+ 1 - 3
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderRechargeController.java

@@ -102,9 +102,7 @@ public class OrderRechargeController extends BaseController {
         orderRechargeCreateDTO.setOrderSource(OrderSourceType.OFFLINE.getCode());
         orderRechargeCreateDTO.setOrgId(SecurityUtils.getLoginUser().getOrgId());
         // 2. 创建并处理充值订单
-        OrderPayResultVO resultVO = new OrderPayResultVO();
-        OrderRecharge orderRecharge = orderRechargeService.createRechargeOrder(orderRechargeCreateDTO);
-        BeanUtils.copyProperties(orderRecharge, resultVO);
+        OrderPayResultVO resultVO = orderRechargeService.createRechargeOrder(orderRechargeCreateDTO);
         return R.ok(resultVO);
     }
 

+ 0 - 8
yiqi-admin/src/main/java/com/yiqi/admin/controller/recharge/RechargeCardBatchRecordController.java

@@ -191,14 +191,6 @@ public class RechargeCardBatchRecordController extends BaseController {
         return R.ok(page);
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    @ApiOperation("批次号明细详情-充值卡撤单")
-    @GetMapping(value = "/refundCardByCardId")
-    public R refundCardByCardId(@RequestParam("rechargeCardId") Long rechargeCardId) {
-        rechargeCardBatchRecordService.refundCardByCardId(rechargeCardId);
-        return R.ok();
-    }
-
     @Transactional(rollbackFor = Exception.class)
     @ApiOperation("批次号明细详情-充值卡删除")
     @GetMapping(value = "/deleteCardByCardId")

+ 3 - 6
yiqi-api/src/main/java/com/yiqi/api/controller/order/WeAppOrderRechargeController.java

@@ -11,6 +11,7 @@ import com.yiqi.common.enums.*;
 import com.yiqi.common.exception.ServiceException;
 import com.yiqi.order.domain.OrderRecharge;
 import com.yiqi.order.domain.dto.OrderRechargeCreateDTO;
+import com.yiqi.order.domain.vo.OrderPayResultVO;
 import com.yiqi.order.domain.vo.weapp.AppOrderRechargeResultVO;
 import com.yiqi.order.domain.vo.weapp.WeAppOrderRechargeVO;
 import com.yiqi.order.service.IOrderRechargeService;
@@ -79,7 +80,7 @@ public class WeAppOrderRechargeController {
     @Log(title = "app套餐充值", businessType = BusinessType.INSERT)
     @PostMapping(value = "/payRechargeOrder")
     @ApiOperation(value = "app套餐充值")
-    public R<AppOrderRechargeResultVO> payRechargeOrder(@RequestBody @Valid WeAppRechargeDTO weAppRechargeDTO) {
+    public R<OrderPayResultVO> payRechargeOrder(@RequestBody @Valid WeAppRechargeDTO weAppRechargeDTO) {
         try {
             // 1. 构建充值订单参数
             OrderRechargeCreateDTO orderRechargeCreateDTO = new OrderRechargeCreateDTO();
@@ -90,12 +91,8 @@ public class WeAppOrderRechargeController {
             orderRechargeCreateDTO.setPayType(weAppRechargeDTO.getPayType());
             orderRechargeCreateDTO.setOrgId(weAppRechargeDTO.getOrgId());
             orderRechargeCreateDTO.setPlatform(weAppRechargeDTO.getPlatform());
-
             // 2. 创建并处理充值订单
-            AppOrderRechargeResultVO resultVO = new AppOrderRechargeResultVO();
-            OrderRecharge orderRecharge = orderRechargeService.createRechargeOrder(orderRechargeCreateDTO);
-            BeanUtils.copyProperties(orderRecharge, resultVO);
-
+            OrderPayResultVO resultVO = orderRechargeService.createRechargeOrder(orderRechargeCreateDTO);
             return R.ok(resultVO);
 
         } catch (ServiceException e) {

+ 0 - 26
yiqi-common/src/main/java/com/yiqi/app/domain/AppUserBillMstr.java

@@ -132,31 +132,5 @@ public class AppUserBillMstr extends BaseEntity
     @ApiModelProperty("是否为退款")
     private String isRefund;
 
-    /** 是否异店 */
-    @Excel(name = "是否异店")
-    @ApiModelProperty("是否异店")
-    private String isOtherStore;
-
-    /** 异店的费率 */
-    @Excel(name = "异店的费率")
-    @ApiModelProperty("异店的费率")
-    private BigDecimal otherStoreRate;
-
-    /** 异店抽取的金额 */
-    @Excel(name = "异店抽取的金额")
-    @ApiModelProperty("异店抽取的金额")
-    private BigDecimal otherStoreAmount;
-
-    /** 异店的门店ID */
-    @Excel(name = "异店的门店ID")
-    @ApiModelProperty("异店的门店ID")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long otherStoreOrgId;
-
-    /** 该条账单是否已经被退款 */
-    @Excel(name = "该条账单是否已经被退款")
-    @ApiModelProperty("该条账单是否已经被退款")
-    private String hasRefund;
-
 
 }

+ 20 - 1
yiqi-common/src/main/java/com/yiqi/app/service/IAppCouponItemService.java

@@ -1,6 +1,7 @@
 package com.yiqi.app.service;
 
 import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yiqi.app.domain.AppCouponItem;
 import com.yiqi.app.domain.dto.*;
@@ -40,6 +41,7 @@ public interface IAppCouponItemService extends IService<AppCouponItem> {
     public List<AppCouponItemVO> couponSendListByStore(AppCouponItemCountQueryDTO appCouponItemCountQueryDTO);
 
     public int countCouponSendListByStore(AppCouponItemCountQueryDTO appCouponItemCountQueryDTO);
+
     /**
      * 总部发放优惠券
      *
@@ -64,6 +66,23 @@ public interface IAppCouponItemService extends IService<AppCouponItem> {
      */
     public int updateAppCouponItem(AppCouponItem appCouponItem);
 
+    /**
+     * 优惠券核销
+     *
+     * @param couponId  优惠券ID
+     * @param appUserId 用户ID
+     * @return 结果
+     */
+    public int checkCouponItem(Long couponId, Long appUserId);
+
+    /**
+     * 重置优惠券使用状态
+     *
+     * @param couponId 优惠券ID
+     * @return 结果
+     */
+    public int resetCouponItem(Long couponId, Long appUserId);
+
     /**
      * 批量删除优惠券
      *
@@ -83,7 +102,7 @@ public interface IAppCouponItemService extends IService<AppCouponItem> {
 
     List<AppCouponItem> getMemberCouponInfoByRecharge(MemberCouponItemQueryDTO memberCouponItemQueryDTO);
 
-    int  countMemberCouponInfoByRecharge(MemberCouponItemQueryDTO memberCouponItemQueryDTO);
+    int countMemberCouponInfoByRecharge(MemberCouponItemQueryDTO memberCouponItemQueryDTO);
 
     int countTodaySendNumber(String dateTimeNow);
 

+ 0 - 8
yiqi-common/src/main/java/com/yiqi/app/service/IAppUserBillMstrService.java

@@ -24,14 +24,6 @@ public interface IAppUserBillMstrService extends IService<AppUserBillMstr> {
      */
     public R consumeRecord(ConsumeOrderDTO consumeOrderDTO);
 
-    /**
-     * 添加退款记录
-     * @param consumeOrderDTO
-     * @param refundBaseDTO
-     * @return
-     */
-    public R<String> refundRecord(ConsumeOrderDTO consumeOrderDTO, RefundBaseDTO refundBaseDTO);
-
     /**
      * 添加账单订单
      * @param billMstrOrderDTO

+ 2 - 2
yiqi-common/src/main/java/com/yiqi/common/enums/ClothOrderStatusType.java

@@ -7,7 +7,7 @@ public enum ClothOrderStatusType implements CodeEnum{
     , WAITING_TO_DOOR("1","待上门")
     , HAS_TO_DOOR("2","待取衣")
     , HAS_TAKING("3", "已取衣、待定价")
-    , WAITING_FOR_PAY("4", "已定价、待付")
+    , WAITING_FOR_PAY("4", "已定价、待付")
     , WAIT_FACTORY("5", "待入厂")
     , WASHING("6", "清洗中")
     , HAS_WASH("7", "已出厂")
@@ -16,7 +16,7 @@ public enum ClothOrderStatusType implements CodeEnum{
     , SENDING("10", "送衣中")
     , WAITING_FOR_COMMENT("11", "待评价")
     , FINISH("12", "已完成")
-    , CANCEL("100", "已取消");
+    , CANCEL("-1", "已取消");
 
     private final String code;
     private final String info;

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/common/enums/OrderGoodsStatusType.java

@@ -15,7 +15,7 @@ public enum OrderGoodsStatusType {
 
     , CONFIRM_RECEIVE("5", "已完成")
     , REFUND("6", "已退款")
-    , CANCEL_ORDER("100", "已取消")
+    , CANCEL_ORDER("-1", "已取消")
 ;
 
     private final String code;

+ 3 - 4
yiqi-common/src/main/java/com/yiqi/common/enums/OrderRechargeStatus.java

@@ -1,14 +1,13 @@
 package com.yiqi.common.enums;
 
 /**
- * 订单状态(0=待付款,1=已付款、待确认,2=已付款,100=已取消)',
+ * 订单状态(0=待付款,2=已付款, 9=已退款 -1=已取消)',
  */
 public enum OrderRechargeStatus {
     NO_PAY("0", "待付款"),
-    NO_CONFIRM("1", "待确认"),
     YES_PAY("2", "已付款"),
-    REFUND("3", "已退款"),
-    CANCEL("100", "已取消"),
+    REFUND("9", "已退款"),
+    CANCEL("-1", "已取消"),
     ;
 
     private final String code;

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/common/enums/PayStatus.java

@@ -6,7 +6,7 @@ package com.yiqi.common.enums;
  */
 public enum PayStatus {
     PAY_FAIL("-1", "支付失败"),
-    WAITING_TO_PAY("0", "支付"),
+    WAITING_TO_PAY("0", "支付"),
     HAS_PAY("1", "已支付"),
     ;
 

+ 6 - 5
yiqi-common/src/main/java/com/yiqi/common/enums/RechargeRefundStatusType.java

@@ -3,16 +3,17 @@ package com.yiqi.common.enums;
 /**
  * 用户状态
  *
+ *
  * @author ruoyi
  */
 public enum RechargeRefundStatusType {
     OK("0", "正常"),
     REFUND_APPLYING("1", "退款申请中"),
-    REFUND_AGREE("2", "退款成功"),
-    REFUND_REFUSE("3", "退款拒绝"),
-    REFUND_CANCEL("4", "退款取消"),
-    REFUNDING("5", "退款中"),
-    ERROR("6", "退款异常"),
+    REFUNDING("2", "退款处理中"),
+    REFUND_AGREE("3", "退款成功"),
+    REFUND_REFUSE("8", "退款拒绝"),
+    REFUND_CANCEL("9", "退款取消"),
+    ERROR("-1", "退款异常"),
 ;
     private final String code;
     private final String info;

+ 12 - 0
yiqi-common/src/main/java/com/yiqi/core/service/ISettlementManageBillService.java

@@ -1,9 +1,12 @@
 package com.yiqi.core.service;
 
+import java.util.Date;
 import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yiqi.core.domain.SettlementManageBill;
 import com.yiqi.core.domain.dto.SettlementBillAddDTO;
+import com.yiqi.settlement.domain.dto.StoreBillStatistics;
 
 /**
  * 结算管理Service接口
@@ -12,5 +15,14 @@ import com.yiqi.core.domain.dto.SettlementBillAddDTO;
  * @date 2024-02-15
  */
 public interface ISettlementManageBillService extends IService<SettlementManageBill> {
+
     void insertSettlementManageBill(SettlementBillAddDTO settlementBillAddDTO);
+
+    /**
+     * @param storeId
+     * @param startTime
+     * @param endTime
+     * @desc 店铺结算
+     */
+    StoreBillStatistics storeBillSettlement(Long storeId, Date startTime, Date endTime);
 }

+ 10 - 1
yiqi-common/src/main/java/com/yiqi/order/domain/OrderActivity.java

@@ -35,7 +35,9 @@ public class OrderActivity extends BaseEntity {
     @TableId(type = IdType.AUTO)
     private Long id;
 
-    /** 活动id */
+    /**
+     * 活动id
+     */
     @Excel(name = "活动id")
     @ApiModelProperty("活动id")
     @JsonSerialize(using = ToStringSerializer.class)
@@ -114,6 +116,13 @@ public class OrderActivity extends BaseEntity {
     @ApiModelProperty("订单状态(0=待付款,1=已付款、待确认,2=已付款,3=已完成,4=退款申请中,5=退款失败,6=已退款,100=已取消)")
     private String orderStatus;
 
+    /**
+     * 支付状态(0=待支付,1=支付成功,-1=支付失败)
+     */
+    @Excel(name = "支付状态", readConverterExp = "0=待支付,1=支付成功,-1=支付失败")
+    @ApiModelProperty("退款状态(0=待支付,1=支付成功,-1=支付失败)")
+    private String payStatus;
+
     /**
      * 退款状态(0=正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消)
      */

+ 2 - 2
yiqi-common/src/main/java/com/yiqi/order/domain/OrderCloth.java

@@ -154,8 +154,8 @@ public class OrderCloth extends BaseEntity
     private String isAppointment;
 
     /** 订单状态(0. 待下单  1. 已下单待送衣   2. 洗衣中   3.衣服已到店待取衣   8. 取衣完成待评价  9.已完成   100. 已取消) */
-    @Excel(name = "订单状态", readConverterExp = "0=预约处理中,1=已下单待送衣,2=洗衣中,3=衣服已到店待取衣,8=取衣完成待评价,9=已完成,100=已取消")
-    @ApiModelProperty("订单状态(0=预约待取,1=已取货、待门店定价,2=已定价、待支付,3=已支付、待工厂取货,4=工厂已取货、洗衣中,5=洗衣完成、待送店,6=已到店、待送衣,7=送衣中,8=已送达、待评价,9=已完成,100=已取消)")
+    @Excel(name = "订单状态", readConverterExp = "0=预约处理中,1=已下单待送衣,2=洗衣中,3=衣服已到店待取衣,8=取衣完成待评价,9=已完成,-1=已取消")
+    @ApiModelProperty("订单状态(0=预约待取,1=已取货、待门店定价,2=已定价、待支付,3=已支付、待工厂取货,4=工厂已取货、洗衣中,5=洗衣完成、待送店,6=已到店、待送衣,7=送衣中,8=已送达、待评价,9=已完成,-1=已取消)")
     private String orderStatus;
 
 

+ 8 - 0
yiqi-common/src/main/java/com/yiqi/order/domain/OrderGoods.java

@@ -143,6 +143,14 @@ public class OrderGoods extends BaseEntity {
     @ApiModelProperty("订单状态(0待支付,1支付待确认,2已支付、待配送,3配送中,4已到货,5确认收货,-1取消订单)")
     private String orderStatus;
 
+    /**
+     * 支付状态(0=待支付,1=支付成功,-1=支付失败)
+     */
+    @Excel(name = "支付状态", readConverterExp = "0=待支付,1=支付成功,-1=支付失败")
+    @ApiModelProperty("退款状态(0=待支付,1=支付成功,-1=支付失败)")
+    private String payStatus;
+
+
     @ApiModelProperty("预约时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
     private Date appointmentTime;

+ 12 - 5
yiqi-common/src/main/java/com/yiqi/order/domain/OrderRecharge.java

@@ -186,19 +186,26 @@ public class OrderRecharge extends BaseEntity {
     private String rechargeType;
 
     /**
-     * 订单状态(0=待付款,1=已付款、待确认,2=已付款,3=已完成,4=退款申请中,5=退款失败,6=已退款,100=已取消)
+     * 订单状态(0=待付款,2=已付款,9=已退款,-1=已取消)
      */
-    @Excel(name = "订单状态", readConverterExp = "0==待付款,1=已付款、待确认,2=已付款,3=已完成,4=退款申请中,5=退款失败,6=已退款,100=已取消")
-    @ApiModelProperty("订单状态(0=待付款,1=已付款、待确认,2=已付款,3=已完成,100=已取消)")
+    @Excel(name = "订单状态", readConverterExp = "0=待付款,2=已付款,9=已退款,-1=已取消")
+    @ApiModelProperty("订单状态(-1=已取消,0=待付款,2=已付款,9=已退款)")
     private String orderStatus;
 
     /**
      * 退款状态(0=正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消)
      */
-    @Excel(name = "退款状态", readConverterExp = "0==正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消")
-    @ApiModelProperty("退款状态(0=正常,1=退款申请中,2=退款同意,3=退款拒绝,4=退款取消)")
+    @Excel(name = "退款状态", readConverterExp = "0==正常,1=退款申请中,2=退款同意处理中,3=退款拒绝,-1=退款取消,9=退款成功")
+    @ApiModelProperty("退款状态(0=正常,1=退款申请中,2=退款同意处理中,9=退款成功 3=退款拒绝,-1=退款取消)")
     private String refundStatus;
 
+    /**
+     * 支付状态(0=待支付,1=支付成功,-1=支付失败)
+     */
+    @Excel(name = "支付状态", readConverterExp = "0=待支付,1=支付成功,-1=支付失败")
+    @ApiModelProperty("退款状态(0=待支付,1=支付成功,-1=支付失败)")
+    private String payStatus;
+
     /**
      * 退款申请时间
      */

+ 7 - 50
yiqi-common/src/main/java/com/yiqi/order/domain/dto/PayOrderFaceToFaceDTO.java

@@ -24,24 +24,6 @@ public class PayOrderFaceToFaceDTO extends PayOrderDTO {
     @ApiModelProperty("用户付款码")
     private String authCode;
 
-    /**
-     * 付款码支付
-     *
-     * @param orderCloth
-     * @param authCode
-     * @return
-     */
-    public static PayOrderFaceToFaceDTO buildClothOrderPayData(OrderCloth orderCloth, String authCode) {
-        PayOrderFaceToFaceDTO payOrderFaceToFaceDTO = new PayOrderFaceToFaceDTO();
-        payOrderFaceToFaceDTO.setOrderNo(orderCloth.getOrderNo());
-        payOrderFaceToFaceDTO.setPayAmount(orderCloth.getPayAmount());
-        payOrderFaceToFaceDTO.setSubjectTitle(OrderType.cloth.getInfo());
-        payOrderFaceToFaceDTO.setAuthCode(authCode);
-        payOrderFaceToFaceDTO.setPayType(orderCloth.getPayType());
-        payOrderFaceToFaceDTO.setExpireTime(DateUtils.addMinutes(DateUtils.getNowDate(), 5));
-        return payOrderFaceToFaceDTO;
-    }
-
     /**
      * 支付充值订单
      *
@@ -63,45 +45,20 @@ public class PayOrderFaceToFaceDTO extends PayOrderDTO {
     /**
      * 支付充值订单
      *
-     * @param instalment 传的都是每次支付的订单编号,非主订单编号
+     * @param rechargeSn 传的都是每次支付的订单编号,非主订单编号
      * @param authCode   付款码
      * @return
      */
-    public static PayOrderFaceToFaceDTO buildRechargeOrderPayData(OrderRechargeInstalment instalment, String authCode) {
+    public static PayOrderFaceToFaceDTO createRechargeOrderPayData(Long storeId, String rechargeSn, BigDecimal payAmount, String payType, String authCode) {
         PayOrderFaceToFaceDTO payOrderFaceToFaceDTO = new PayOrderFaceToFaceDTO();
-        payOrderFaceToFaceDTO.setOrderNo(instalment.getOrderNo());
-        payOrderFaceToFaceDTO.setPayAmount(instalment.getPayAmount());
+        payOrderFaceToFaceDTO.setStoreId(storeId);
+        payOrderFaceToFaceDTO.setOrderNo(rechargeSn);
+        payOrderFaceToFaceDTO.setPayAmount(payAmount);
         payOrderFaceToFaceDTO.setSubjectTitle(OrderType.recharge.getInfo());
-        payOrderFaceToFaceDTO.setPayType(instalment.getPayType());
-        payOrderFaceToFaceDTO.setExpireTime(DateUtils.addMinutes(instalment.getCreateTime(), 5));
+        payOrderFaceToFaceDTO.setPayType(payType);
+        payOrderFaceToFaceDTO.setExpireTime(DateUtils.addMinutes(DateUtils.getNowDate(), 5));
         payOrderFaceToFaceDTO.setAuthCode(authCode);
         return payOrderFaceToFaceDTO;
     }
-//    /**
-//     * 分段支付充值订单
-//     * @param instalment
-//     * @param authCode
-//     * @return
-//     */
-//    public static PayOrderFaceToFaceDTO buildRechargeOrderMorePayData(OrderRechargeInstalment instalment, String authCode){
-//        PayOrderFaceToFaceDTO payOrderFaceToFaceDTO = new PayOrderFaceToFaceDTO();
-//        payOrderFaceToFaceDTO.setOrderNo(instalment.getOrderNo());
-//        payOrderFaceToFaceDTO.setPayAmount(instalment.getPayAmount());
-//        payOrderFaceToFaceDTO.setSubjectTitle(OrderType.recharge.getInfo());
-//        payOrderFaceToFaceDTO.setPayType(instalment.getPayType());
-//        payOrderFaceToFaceDTO.setExpireTime(DateUtils.addMinutes(instalment.getCreateTime(), 5));
-//        payOrderFaceToFaceDTO.setAuthCode(authCode);
-//        return payOrderFaceToFaceDTO;
-//    }
 
-    public static PayOrderFaceToFaceDTO buildGoodsOrderPayData(OrderGoods orderGoods, String authCode) {
-        PayOrderFaceToFaceDTO payOrderFaceToFaceDTO = new PayOrderFaceToFaceDTO();
-        payOrderFaceToFaceDTO.setOrderNo(orderGoods.getOrderNo());
-        payOrderFaceToFaceDTO.setPayAmount(orderGoods.getPayAmount());
-        payOrderFaceToFaceDTO.setSubjectTitle(OrderType.recharge.getInfo());
-        payOrderFaceToFaceDTO.setPayType(orderGoods.getPayType());
-        payOrderFaceToFaceDTO.setExpireTime(DateUtils.addMinutes(orderGoods.getCreateTime(), 5));
-        payOrderFaceToFaceDTO.setAuthCode(authCode);
-        return payOrderFaceToFaceDTO;
-    }
 }

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderClothAppointmentVO.java

@@ -106,7 +106,7 @@ public class OrderClothAppointmentVO {
 
     @Excel(name = "支付状态", readConverterExp = "0==待支付,1=支付成功,2=支付失败")
     @ApiModelProperty("支付状态 0:待支付 1: 支付成功 -1:支付失败")
-    private String payStatus;
+    private String orderPayStatus;
 
     /** 收衣方式(0=到店,1=上门) */
     @Excel(name = "收衣方式", readConverterExp = "0=到店,1=上门")

+ 0 - 1
yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderPayResultVO.java

@@ -39,7 +39,6 @@ public class OrderPayResultVO {
     @ApiModelProperty("app支付返回对象")
     private AppPayRespVO appPayRespVO;
 
-
     public static OrderPayResultVO payError(String msg) {
         OrderPayResultVO orderPayResultVO = new OrderPayResultVO();
         orderPayResultVO.setPayMsg(msg);

+ 7 - 0
yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderRechargeListVO.java

@@ -92,6 +92,13 @@ public class OrderRechargeListVO extends BaseEntity {
     @ApiModelProperty("支付宝/微信支付订单号")
     private String outTradeOrderNo;
 
+    /**
+     * 支付状态(0=待支付,1=支付成功,-1=支付失败)
+     */
+    @Excel(name = "支付状态", readConverterExp = "0=待支付,1=支付成功,-1=支付失败")
+    @ApiModelProperty("退款状态(0=待支付,1=支付成功,-1=支付失败)")
+    private String payStatus;
+
     /**
      * 充值金额
      */

+ 7 - 0
yiqi-common/src/main/java/com/yiqi/order/service/IOrderRechargeRefundService.java

@@ -21,6 +21,13 @@ public interface IOrderRechargeRefundService extends IService<OrderRechargeRefun
      */
     public OrderRechargeRefund selectOrderRechargeRefundById(Long id);
 
+    /**
+     * 根据订单号查询充值卡退款管理
+     * @param orderNo
+     * @return
+     */
+    public OrderRechargeRefund selectOrderRechargeOrderNo(String orderNo);
+
     /**
      * 查询充值卡退款管理列表
      *

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/order/service/IOrderRechargeService.java

@@ -57,7 +57,7 @@ public interface IOrderRechargeService extends IService<OrderRecharge> {
      * @param orderRechargeCreateDTO 充值订单
      * @return 结果
      */
-    public OrderRecharge createRechargeOrder(OrderRechargeCreateDTO orderRechargeCreateDTO);
+    public OrderPayResultVO createRechargeOrder(OrderRechargeCreateDTO orderRechargeCreateDTO);
 
 
     /**

+ 2 - 1
yiqi-common/src/main/java/com/yiqi/order/service/IPayService.java

@@ -4,6 +4,7 @@ import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.yiqi.common.core.domain.R;
 import com.yiqi.order.domain.OrderPayInfo;
 import com.yiqi.order.domain.dto.*;
+import com.yiqi.order.domain.vo.OrderPayResultVO;
 import com.yiqi.order.domain.vo.weapp.AppPayRespVO;
 
 /**
@@ -15,7 +16,7 @@ public interface IPayService {
     /**
      * 当面付
      */
-    public PayResponseDTO faceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO);
+    public OrderPayResultVO faceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO);
 
     /**
      * 订单查询

+ 5 - 0
yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/BillMstrOrderDTO.java

@@ -27,6 +27,11 @@ public class BillMstrOrderDTO {
      */
     private String orderNo;
 
+    /**
+     * 支付类型
+     */
+    private String payType;
+
 
     /**
      * 账单标题

+ 0 - 6
yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargeCardBatchRecordService.java

@@ -45,12 +45,6 @@ public interface IRechargeCardBatchRecordService extends IService<RechargeCardBa
      */
     public int countCardDetailByBatchNo(RechargeBatchCardDetailListQueryDTO rechargeBatchCardDetailListQueryDTO);
 
-    /**
-     * 批次号明细详情-充值卡撤单
-     * @param rechargeCardId
-     */
-    void refundCardByCardId(Long rechargeCardId);
-
     /**
      * 批次号明细详情-充值卡删除
      * @param rechargeCardId

+ 0 - 12
yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargePasswordCardService.java

@@ -27,18 +27,6 @@ import com.yiqi.recharge.domain.vo.weapp.WeAppCardsUseRecordsVO;
  */
 public interface IRechargePasswordCardService extends IService<RechargePasswordCard> {
 
-    /**
-     * 退款余额
-     * @param consumeOrderDTO
-     */
-    public void refundBalance(ConsumeOrderDTO consumeOrderDTO);
-
-    /**
-     * 扣减余额
-     * @param consumeOrderDTO
-     */
-    public void deductBalance(ConsumeOrderDTO consumeOrderDTO);
-
     public List<RechargePasswordCardQueryVO> selectRechargePasswordCardList(PageVO pageVO);
 
     public List<RechargePasswordCardQueryVO> selectRechargePasswordCardList(MemberCardQueryDTO memberCardQueryDTO);

+ 98 - 0
yiqi-common/src/main/java/com/yiqi/settlement/domain/dto/OrderStatisticsVO.java

@@ -0,0 +1,98 @@
+package com.yiqi.settlement.domain.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 订单统计VO
+ */
+@Data
+public class OrderStatisticsVO {
+    /**
+     * 订单数量
+     */
+    private Integer orderCount;
+    
+    /**
+     * 交易笔数
+     */
+    private Long transactionCount;
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal transactionAmount;
+
+
+    /**
+     * 交易退款金额
+     */
+    private BigDecimal transactionRefundAmount;
+    
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+    
+    /**
+     * 微信支付金额
+     */
+    private BigDecimal wechatAmount;
+    
+    /**
+     * 支付宝支付金额
+     */
+    private BigDecimal alipayAmount;
+    
+    /**
+     * 现金支付金额
+     */
+    private BigDecimal cashAmount;
+    
+    /**
+     * 会员支付金额
+     */
+    private BigDecimal memberAmount;
+
+    /**
+     * 银联支付金额
+     */
+    private BigDecimal unionAmount;
+    
+    /**
+     * 退款笔数
+     */
+    private Integer refundCount;
+    
+    /**
+     * 退款金额
+     */
+    private BigDecimal refundAmount;
+
+
+    /**
+     * 微信退款金额
+     */
+    private BigDecimal wechatRefundAmount;
+
+    /**
+     * 支付宝退款金额
+     */
+    private BigDecimal alipayRefundAmount;
+
+    /**
+     * 现金退款金额
+     */
+    private BigDecimal cashRefundAmount;
+
+    /**
+     * 会员退款金额
+     */
+    private BigDecimal memberRefundAmount;
+
+    /**
+     * 银联退款金额
+     */
+    private BigDecimal unionRefundAmount;
+}

+ 73 - 0
yiqi-common/src/main/java/com/yiqi/settlement/domain/dto/PaymentStatisticsVO.java

@@ -0,0 +1,73 @@
+package com.yiqi.settlement.domain.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 支付统计VO
+ */
+@Data
+public class PaymentStatisticsVO {
+
+    /**
+     * 交易金额
+     */
+    private BigDecimal transactionAmount;
+
+
+    /**
+     * 交易退款金额
+     */
+    private BigDecimal transactionRefundAmount;
+
+    /**
+     * 微信支付金额
+     */
+    private BigDecimal wechatPayAmount;
+    
+    /**
+     * 支付宝支付金额
+     */
+    private BigDecimal alipayPayAmount;
+    
+    /**
+     * 现金支付金额
+     */
+    private BigDecimal cashPayAmount;
+    
+    /**
+     * 会员支付金额
+     */
+    private BigDecimal memberPayAmount;
+
+    /**
+     * 会员支付金额
+     */
+    private BigDecimal unionPayAmount;
+    
+    /**
+     * 微信退款金额
+     */
+    private BigDecimal wechatRefundAmount;
+    
+    /**
+     * 支付宝退款金额
+     */
+    private BigDecimal alipayRefundAmount;
+    
+    /**
+     * 现金退款金额
+     */
+    private BigDecimal cashRefundAmount;
+    
+    /**
+     * 会员退款金额
+     */
+    private BigDecimal memberRefundAmount;
+
+    /**
+     * 银联退款金额
+     */
+    private BigDecimal unionRefundAmount;
+}

+ 41 - 0
yiqi-common/src/main/java/com/yiqi/settlement/domain/dto/StoreBillStatistics.java

@@ -0,0 +1,41 @@
+package com.yiqi.settlement.domain.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 门店账单统计
+ */
+@Data
+public class StoreBillStatistics {
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+    
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+    
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    
+    /**
+     * 洗衣订单统计
+     */
+    private OrderStatisticsVO clothOrderStats;
+    
+    /**
+     * 商品订单统计
+     */
+    private OrderStatisticsVO goodsOrderStats;
+    
+    /**
+     * 支付统计
+     */
+    private PaymentStatisticsVO paymentStats;
+}

+ 30 - 2
yiqi-core/src/main/java/com/yiqi/app/service/impl/AppCouponItemServiceImpl.java

@@ -24,7 +24,9 @@ import com.yiqi.common.exception.ServiceException;
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.SecurityUtils;
 import com.yiqi.common.utils.StringUtils;
+import com.yiqi.order.domain.dto.OrderCouponDTO;
 import com.yiqi.system.domain.SysOrg;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -44,6 +46,7 @@ import static com.yiqi.common.utils.DateUtils.YYYY_MM_DD;
  * @date 2023-09-19
  */
 @Service
+@Slf4j
 public class AppCouponItemServiceImpl extends ServiceImpl<AppCouponItemMapper, AppCouponItem> implements IAppCouponItemService {
     @Autowired
     private IAppCouponTypeService appCouponTypeService;
@@ -128,7 +131,7 @@ public class AppCouponItemServiceImpl extends ServiceImpl<AppCouponItemMapper, A
         }
         Long createById = SecurityUtils.getUserId();
         String createBy = SecurityUtils.getUsername();
-        threadPoolTaskExecutor.execute(() -> this.buildAppCouponItem(appCouponItemSendDTO, appCouponType,  appUser,  createBy, createById));
+        threadPoolTaskExecutor.execute(() -> this.buildAppCouponItem(appCouponItemSendDTO, appCouponType, appUser, createBy, createById));
         appCouponTypeService.update(new UpdateWrapper<AppCouponType>().lambda()
                 .eq(AppCouponType::getId, appCouponItemSendDTO.getCouponTypeId())
                 .setSql("coupon_stock = coupon_stock - " + appCouponItemSendDTO.getSendNum())
@@ -176,7 +179,7 @@ public class AppCouponItemServiceImpl extends ServiceImpl<AppCouponItemMapper, A
         if (activityCouponInfoVO.getCouponStock().compareTo(Long.valueOf(appCouponItemSendDTO.getSendNum())) < 0) {
             throw new ServiceException("优惠券库存不足,无法发放");
         }
-        threadPoolTaskExecutor.execute(() -> this.buildAppCouponItem(appCouponItemSendDTO, appCouponType,  appUser,  createBy, createById));
+        threadPoolTaskExecutor.execute(() -> this.buildAppCouponItem(appCouponItemSendDTO, appCouponType, appUser, createBy, createById));
         activityCouponItemService.update(new UpdateWrapper<ActivityCouponItem>().lambda()
                 .eq(ActivityCouponItem::getCouponTypeId, appCouponItemSendDTO.getCouponTypeId())
                 .eq(ActivityCouponItem::getActivityId, appCouponItemSendDTO.getActivityId())
@@ -240,6 +243,31 @@ public class AppCouponItemServiceImpl extends ServiceImpl<AppCouponItemMapper, A
         return baseMapper.updateById(appCouponItem);
     }
 
+    @Override
+    public int checkCouponItem(Long couponId, Long appUserId) {
+        //优惠券使用完后,将优惠券修改为已使用状态
+        update(new UpdateWrapper<AppCouponItem>()
+                .lambda().set(AppCouponItem::getIsUsed, SysBoolType.YES.getCode())
+                .set(AppCouponItem::getUsedStoreId, SecurityUtils.getLoginUser().getOrgId())
+                .set(AppCouponItem::getUsedTime, DateUtils.getNowDate())
+                .eq(AppCouponItem::getAppUserId, appUserId)
+                .eq(AppCouponItem::getId, couponId));
+        //记录使用日志
+        log.info("优惠券使用成功,优惠券id:{}", couponId);
+        return 0;
+    }
+
+    @Override
+    public int resetCouponItem(Long couponId, Long appUserId) {
+        update(new UpdateWrapper<AppCouponItem>()
+                .lambda().set(AppCouponItem::getIsUsed, SysBoolType.NO.getCode())
+                .set(AppCouponItem::getUsedStoreId, null)
+                .set(AppCouponItem::getUsedTime, null)
+                .eq(AppCouponItem::getAppUserId, appUserId)
+                .eq(AppCouponItem::getId, couponId));
+        return 0;
+    }
+
     /**
      * 批量删除优惠券
      *

+ 4 - 44
yiqi-core/src/main/java/com/yiqi/app/service/impl/AppUserBillMstrServiceImpl.java

@@ -47,42 +47,6 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         return R.ok();
     }
 
-    @Override
-    public R<String> refundRecord(ConsumeOrderDTO consumeOrderDTO, RefundBaseDTO refundBaseDTO) {
-        if (SysBoolType.NO.getCode().equals(consumeOrderDTO.getIsRefund())) {
-            throw new ServiceException("该请求为消费订单,无法处理");
-        }
-        switch (EnumUtils.getEnumByType(consumeOrderDTO.getPayType(), PayType.class)) {
-
-            case BALANCE: {
-                rechargePasswordCardService.refundBalance(consumeOrderDTO);
-                break;
-            }
-            case WECHAT: {
-
-                String refundStatus = payService.refund(new PayRefundDTO(consumeOrderDTO.getPayType(), consumeOrderDTO.getOrderNo()
-                        , consumeOrderDTO.getAmount(), refundBaseDTO == null ? null : refundBaseDTO.getOutRequestNo()
-                        , consumeOrderDTO.getOrderNo(), refundBaseDTO == null ? null : refundBaseDTO.getRefundReason()));
-                return R.ok(refundStatus);
-            }
-            case ALIPAY: {
-
-                String refundStatus = payService.refund(new PayRefundDTO(consumeOrderDTO.getPayType(), consumeOrderDTO.getOrderNo()
-                        , consumeOrderDTO.getAmount(), refundBaseDTO == null ? null : refundBaseDTO.getOutRequestNo()
-                        , consumeOrderDTO.getOrderNo(), refundBaseDTO == null ? null : refundBaseDTO.getRefundReason()));
-                if (!OrderRefundStatus.REFUNDING.getCode().equals(refundStatus)) {//只要不是退款中的状态,直接修改订单状态回调
-                    payService.refundNotify(consumeOrderDTO.getOrderNo(), refundStatus);
-                }
-                return R.ok(refundStatus);
-            }
-            //其他支付方式,只记录
-            default: {
-                save(buildBillMstr(consumeOrderDTO));
-                break;
-            }
-        }
-        return R.ok(OrderRefundStatus.REFUND_SUCCESS.getCode());
-    }
 
     @Override
     public void saveBillMstrOrder(BillMstrOrderDTO billMstrOrderDTO) {
@@ -92,22 +56,17 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setBillType(OrderBillType.pay.getCode());
         appUserBillMstr.setPayTotalAmount(billMstrOrderDTO.getPayTotalAmount());
         appUserBillMstr.setCashPayAmount(BigDecimal.ZERO);
+        appUserBillMstr.setPayType(billMstrOrderDTO.getPayType());
         appUserBillMstr.setRechargePayAmount(billMstrOrderDTO.getRechargePayAmount());
         appUserBillMstr.setGivePayAmount(billMstrOrderDTO.getGivePayAmount());
         appUserBillMstr.setWelfarePayAmount(billMstrOrderDTO.getWelfarePayAmount());
-        appUserBillMstr.setHasRefund(SysBoolType.NO.getCode());
+        appUserBillMstr.setIsRefund(SysBoolType.NO.getCode());
         appUserBillMstr.setOrderNo(billMstrOrderDTO.getOrderNo());
         appUserBillMstr.setOrderType(billMstrOrderDTO.getOrderType());
         appUserBillMstr.setOrgId(billMstrOrderDTO.getStoreId());
         appUserBillMstr.setSourceType(SourceType.STORE.getCode());
         appUserBillMstr.setContent(billMstrOrderDTO.getRemark());
         appUserBillMstr.setRechargeCardNo(billMstrOrderDTO.getRechargeCardNo());
-        if(billMstrOrderDTO.getUseBindStoreId().equals(billMstrOrderDTO.getStoreId())){
-            appUserBillMstr.setIsOtherStore(SysBoolType.NO.getCode());
-        }else{
-            appUserBillMstr.setIsOtherStore(SysBoolType.YES.getCode());
-            appUserBillMstr.setOtherStoreOrgId(billMstrOrderDTO.getUseBindStoreId());
-        }
         switch (EnumUtils.getEnumByType(billMstrOrderDTO.getOrderType(), OrderType.class)) {
             case cloth: {
                 appUserBillMstr.setTitle("洗衣订单");
@@ -148,9 +107,10 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setCashPayAmount(BigDecimal.ZERO);
         appUserBillMstr.setRechargePayAmount(billMstrOrderDTO.getRechargePayAmount().negate());
         appUserBillMstr.setGivePayAmount(billMstrOrderDTO.getGivePayAmount().negate());
+        appUserBillMstr.setPayType(billMstrOrderDTO.getPayType());
         appUserBillMstr.setWelfarePayAmount(billMstrOrderDTO.getWelfarePayAmount().negate());
         appUserBillMstr.setRechargeCardNo(billMstrOrderDTO.getRechargeCardNo());
-        appUserBillMstr.setHasRefund(SysBoolType.NO.getCode());
+        appUserBillMstr.setIsRefund(SysBoolType.YES.getCode());
         appUserBillMstr.setOrderNo(billMstrOrderDTO.getOrderNo());
         appUserBillMstr.setOrderType(billMstrOrderDTO.getOrderType());
         appUserBillMstr.setOrgId(billMstrOrderDTO.getStoreId());

+ 7 - 4
yiqi-core/src/main/java/com/yiqi/app/service/impl/AppUserPointLogServiceImpl.java

@@ -97,6 +97,9 @@ public class AppUserPointLogServiceImpl extends ServiceImpl<AppUserPointLogMappe
 
     @Override
     public void addPoint(Long appUserId, Integer point, String relationId, MemberPointSourceEnum from, String remark) {
+        if (point <= 0) {
+            return;
+        }
         AppUserPointLog appUserPointLog = new AppUserPointLog();
         appUserPointLog.setAppUserId(appUserId);
         appUserPointLog.setPoint(point);
@@ -112,6 +115,9 @@ public class AppUserPointLogServiceImpl extends ServiceImpl<AppUserPointLogMappe
 
     @Override
     public void reducePoint(Long appUserId, Integer point, String relationId, MemberPointSourceEnum from, String remark) {
+        if (point <= 0) {
+            return;
+        }
         AppUserPointLog appUserPointLog = new AppUserPointLog();
         appUserPointLog.setAppUserId(appUserId);
         appUserPointLog.setPoint(point);
@@ -122,10 +128,7 @@ public class AppUserPointLogServiceImpl extends ServiceImpl<AppUserPointLogMappe
         appUserPointLog.buildCreateData();
         this.insertAppUserPointLog(appUserPointLog);
         // 更新用户积分
-        appUserMapper.updateUserPoint(appUserId, - point);
+        appUserMapper.updateUserPoint(appUserId, -point);
     }
 
-
-    //</editor-folder>
-
 }

+ 301 - 11
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageBillServiceImpl.java

@@ -22,6 +22,9 @@ import com.yiqi.recharge.domain.RechargePasswordCard;
 import com.yiqi.recharge.service.IRechargePasswordCardService;
 import com.yiqi.settlement.domain.SettlementFactoryRate;
 import com.yiqi.settlement.domain.SettlementStoreRate;
+import com.yiqi.settlement.domain.dto.OrderStatisticsVO;
+import com.yiqi.settlement.domain.dto.PaymentStatisticsVO;
+import com.yiqi.settlement.domain.dto.StoreBillStatistics;
 import com.yiqi.settlement.service.ISettlementFactoryRateService;
 import com.yiqi.settlement.service.ISettlementStoreRateService;
 import com.yiqi.system.domain.ManageFactory;
@@ -38,6 +41,7 @@ import com.yiqi.core.mapper.SettlementManageBillMapper;
 import com.yiqi.core.domain.SettlementManageBill;
 import com.yiqi.core.service.ISettlementManageBillService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.Data;
 
 /**
  * 结算管理Service业务层处理
@@ -76,8 +80,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
     @Autowired
     private IOrderClothService orderClothService;
     @Autowired
+    private IOrderClothRefundService orderClothRefundService;
+    @Autowired
     private IOrderGoodsService orderGoodsService;
     @Autowired
+    private IOrderGoodsRefundService orderGoodsRefundService;
+    @Autowired
     private ISettlementFactoryRateService settlementFactoryRateService;
 
     @Override
@@ -130,6 +138,239 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         }
     }
 
+    /**
+     * 门店交易数据汇总
+     */
+    @Override
+    public StoreBillStatistics storeBillSettlement(Long storeId, Date startTime, Date endTime) {
+        // 1. 查询洗衣订单
+        List<OrderCloth> orderClothList = orderClothService.list(new QueryWrapper<OrderCloth>().lambda()
+                .ne(OrderCloth::getOrderStatus, ClothOrderStatusType.CANCEL.getCode())
+                .eq(OrderCloth::getSourceType, SourceType.STORE.getCode())
+                .eq(OrderCloth::getOrgId, storeId)
+                .between(OrderCloth::getCreateTime, startTime, endTime));
+
+        // 2. 查询商品订单
+        List<OrderGoods> orderGoodsList = orderGoodsService.list(new QueryWrapper<OrderGoods>().lambda()
+                .ne(OrderGoods::getOrderStatus, OrderGoodsStatusType.CANCEL_ORDER.getCode())
+                .eq(OrderGoods::getSourceType, SourceType.STORE.getCode())
+                .eq(OrderGoods::getOrgId, storeId)
+                .between(OrderGoods::getCreateTime, startTime, endTime));
+
+        // 3. 查询衣服退款记录
+        List<OrderClothRefund> clothRefundList = orderClothRefundService.list(new QueryWrapper<OrderClothRefund>().lambda()
+                .eq(OrderClothRefund::getSourceType, SourceType.STORE.getCode())
+                .eq(OrderClothRefund::getOrgId, storeId)
+                .eq(OrderClothRefund::getRefundStatus, OrderRefundStatus.REFUND_SUCCESS.getCode())
+                .between(OrderClothRefund::getRefundTime, startTime, endTime));
+
+        // 4. 查询商品退款记录
+        List<OrderGoodsRefund> goodsRefundList = orderGoodsRefundService.list(new QueryWrapper<OrderGoodsRefund>().lambda()
+                .eq(OrderGoodsRefund::getOrgId, storeId)
+                .eq(OrderGoodsRefund::getSourceType, SourceType.STORE.getCode())
+                .eq(OrderGoodsRefund::getRefundStatus, OrderRefundStatus.REFUND_SUCCESS.getCode())
+                .between(OrderGoodsRefund::getRefundTime, startTime, endTime));
+
+        // 5. 统计洗衣订单数据
+        OrderStatisticsVO clothStats = calculateClothOrderStats(orderClothList, clothRefundList);
+
+        // 6. 统计商品订单数据
+        OrderStatisticsVO goodsStats = calculateGoodsOrderStats(orderGoodsList, goodsRefundList);
+
+        // 7. 汇总支付方式统计
+        PaymentStatisticsVO paymentStats = calculatePaymentStats(clothStats, goodsStats);
+
+        // 8. 保存统计结果
+        return saveStatisticsResult(storeId, startTime, endTime, clothStats, goodsStats, paymentStats);
+    }
+
+    /**
+     * 计算洗衣订单统计数据
+     */
+    private OrderStatisticsVO calculateClothOrderStats(List<OrderCloth> orderList, List<OrderClothRefund> refundList) {
+        OrderStatisticsVO stats = new OrderStatisticsVO();
+
+        // 1. 订单数量统计
+        stats.setOrderCount(orderList.size());
+        // 2. 交易订单数量统计
+        stats.setTransactionCount(orderList.stream()
+                .filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getOrderStatus()))
+                .count());
+
+        // 2. 订单金额统计
+        BigDecimal totalAmount = orderList.stream()
+                .map(OrderCloth::getPayAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        stats.setTotalAmount(totalAmount);
+
+        // 3. 支付方式统计
+        Map<String, BigDecimal> payTypeAmounts = calculateClothPayTypeAmounts(orderList);
+        stats.setWechatAmount(payTypeAmounts.getOrDefault("0", BigDecimal.ZERO)); // 微信
+        stats.setAlipayAmount(payTypeAmounts.getOrDefault("1", BigDecimal.ZERO)); // 支付宝
+        stats.setCashAmount(payTypeAmounts.getOrDefault("2", BigDecimal.ZERO)); // 现金
+        stats.setMemberAmount(payTypeAmounts.getOrDefault("3", BigDecimal.ZERO)); // 余额
+        stats.setUnionAmount(payTypeAmounts.getOrDefault("4", BigDecimal.ZERO)); // 银联
+        //循环获取总支付金额
+        payTypeAmounts.keySet().forEach(key -> {
+            stats.setTransactionAmount(stats.getTransactionAmount().add(payTypeAmounts.get(key)));
+        });
+
+        // 4. 退款方式统计
+        Map<String, BigDecimal> refundTypeAmounts = calculateClothRefundTypeAmounts(refundList);
+        stats.setWechatRefundAmount(refundTypeAmounts.getOrDefault("0", BigDecimal.ZERO)); // 微信
+        stats.setAlipayRefundAmount(refundTypeAmounts.getOrDefault("1", BigDecimal.ZERO)); // 支付宝
+        stats.setCashRefundAmount(refundTypeAmounts.getOrDefault("2", BigDecimal.ZERO)); // 现金
+        stats.setMemberRefundAmount(refundTypeAmounts.getOrDefault("3", BigDecimal.ZERO)); // 余额
+        stats.setUnionRefundAmount(refundTypeAmounts.getOrDefault("4", BigDecimal.ZERO)); // 银联
+        //循环获取总金额
+        refundTypeAmounts.keySet().forEach(key -> {
+            stats.setTransactionRefundAmount(stats.getTransactionRefundAmount().add(payTypeAmounts.get(key)));
+        });
+
+        // 5. 退款统计
+        Map<String, BigDecimal> refundAmounts = calculateClothRefundAmounts(refundList);
+        stats.setRefundCount(refundAmounts.get("count").intValue());
+        stats.setRefundAmount(refundAmounts.get("amount"));
+
+        return stats;
+    }
+
+    /**
+     * 计算商品订单统计数据
+     */
+    private OrderStatisticsVO calculateGoodsOrderStats(List<OrderGoods> orderList, List<OrderGoodsRefund> refundList) {
+        OrderStatisticsVO stats = new OrderStatisticsVO();
+
+        // 1. 订单数量统计
+        stats.setOrderCount(orderList.size());
+        stats.setTransactionCount(orderList.stream()
+                .filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getPayStatus()))
+                .count());
+
+        // 2. 订单金额统计
+        BigDecimal totalAmount = orderList.stream()
+                .map(OrderGoods::getPayAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        stats.setTotalAmount(totalAmount);
+
+        // 3. 支付方式统计
+        Map<String, BigDecimal> payTypeAmounts = calculateGoodsPayTypeAmounts(orderList);
+        stats.setWechatAmount(payTypeAmounts.getOrDefault("0", BigDecimal.ZERO)); // 微信
+        stats.setAlipayAmount(payTypeAmounts.getOrDefault("1", BigDecimal.ZERO)); // 支付宝
+        stats.setCashAmount(payTypeAmounts.getOrDefault("2", BigDecimal.ZERO)); // 现金
+        stats.setMemberAmount(payTypeAmounts.getOrDefault("3", BigDecimal.ZERO)); // 余额
+        stats.setUnionAmount(payTypeAmounts.getOrDefault("4", BigDecimal.ZERO)); // 银联
+        //循环获取总支付金额
+        payTypeAmounts.keySet().forEach(key -> {
+            stats.setTransactionAmount(stats.getTransactionAmount().add(payTypeAmounts.get(key)));
+        });
+
+        // 4. 退款方式统计
+        Map<String, BigDecimal> refundTypeAmounts = calculateGoodsRefundTypeAmounts(refundList);
+        stats.setWechatRefundAmount(refundTypeAmounts.getOrDefault("0", BigDecimal.ZERO)); // 微信
+        stats.setAlipayRefundAmount(refundTypeAmounts.getOrDefault("1", BigDecimal.ZERO)); // 支付宝
+        stats.setCashRefundAmount(refundTypeAmounts.getOrDefault("2", BigDecimal.ZERO)); // 现金
+        stats.setMemberRefundAmount(refundTypeAmounts.getOrDefault("3", BigDecimal.ZERO)); // 余额
+        stats.setUnionRefundAmount(refundTypeAmounts.getOrDefault("4", BigDecimal.ZERO)); // 银联
+        //循环获取总金额
+        refundTypeAmounts.keySet().forEach(key -> {
+            stats.setTransactionRefundAmount(stats.getTransactionRefundAmount().add(payTypeAmounts.get(key)));
+        });
+
+        // 5. 退款统计
+        Map<String, BigDecimal> refundAmounts = calculateGoodsRefundAmounts(refundList);
+        stats.setRefundCount(refundAmounts.get("count").intValue());
+        stats.setRefundAmount(refundAmounts.get("amount"));
+
+        return stats;
+    }
+
+    /**
+     * 计算洗衣订单支付方式金额
+     */
+    private Map<String, BigDecimal> calculateClothPayTypeAmounts(List<OrderCloth> orderList) {
+        return orderList.stream()
+                .filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getPayStatus()))
+                .collect(Collectors.groupingBy(
+                        OrderCloth::getPayType,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                OrderCloth::getPayAmount,
+                                BigDecimal::add
+                        )
+                ));
+    }
+
+    /**
+     * 计算商品订单支付方式金额
+     */
+    private Map<String, BigDecimal> calculateGoodsPayTypeAmounts(List<OrderGoods> orderList) {
+        return orderList.stream()
+                .filter(order -> PayStatus.HAS_PAY.getCode().equals(order.getPayStatus()))
+                .collect(Collectors.groupingBy(
+                        OrderGoods::getPayType,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                OrderGoods::getPayAmount,
+                                BigDecimal::add
+                        )
+                ));
+    }
+
+    /**
+     * 计算洗衣订单支付方式金额
+     */
+    private Map<String, BigDecimal> calculateClothRefundTypeAmounts(List<OrderClothRefund> orderList) {
+        return orderList.stream()
+                .collect(Collectors.groupingBy(
+                        OrderClothRefund::getPayType,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                OrderClothRefund::getRefundAmount,
+                                BigDecimal::add
+                        )
+                ));
+    }
+
+    /**
+     * 计算商品订单支付方式金额
+     */
+    private Map<String, BigDecimal> calculateGoodsRefundTypeAmounts(List<OrderGoodsRefund> orderList) {
+        return orderList.stream()
+                .collect(Collectors.groupingBy(
+                        OrderGoodsRefund::getPayType,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                OrderGoodsRefund::getRefundAmount,
+                                BigDecimal::add
+                        )
+                ));
+    }
+
+
+    /**
+     * 计算支付方式统计
+     */
+    private PaymentStatisticsVO calculatePaymentStats(OrderStatisticsVO clothStats,
+                                                      OrderStatisticsVO goodsStats) {
+        PaymentStatisticsVO stats = new PaymentStatisticsVO();
+        stats.setWechatPayAmount(clothStats.getWechatAmount().add(goodsStats.getWechatAmount()));
+        stats.setAlipayPayAmount(clothStats.getAlipayAmount().add(goodsStats.getAlipayAmount()));
+        stats.setCashPayAmount(clothStats.getCashAmount().add(goodsStats.getCashAmount()));
+        stats.setMemberPayAmount(clothStats.getMemberAmount().add(goodsStats.getMemberAmount()));
+        stats.setUnionPayAmount(clothStats.getUnionAmount().add(goodsStats.getUnionAmount()));
+        stats.setWechatRefundAmount(clothStats.getWechatRefundAmount().add(goodsStats.getWechatRefundAmount()));
+        stats.setAlipayRefundAmount(clothStats.getAlipayRefundAmount().add(goodsStats.getAlipayRefundAmount()));
+        stats.setCashRefundAmount(clothStats.getCashRefundAmount().add(goodsStats.getCashRefundAmount()));
+        stats.setMemberRefundAmount(clothStats.getMemberRefundAmount().add(goodsStats.getMemberRefundAmount()));
+        stats.setUnionRefundAmount(clothStats.getUnionRefundAmount().add(goodsStats.getUnionRefundAmount()));
+        stats.setTransactionAmount(clothStats.getTransactionAmount().add(goodsStats.getTransactionAmount()));
+        stats.setTransactionRefundAmount(clothStats.getTransactionRefundAmount().add(goodsStats.getTransactionRefundAmount()));
+        return stats;
+    }
+
     /**
      * 门店结算
      *
@@ -137,7 +378,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
      */
     private void handleCountStoreSettlement(SettlementManageBill settlementManageBill) {
         List<SysStore> storeList = storeService.list(new QueryWrapper<SysStore>().lambda()
-                .eq(SysStore::getStatus, StatusType.OK.getCode())
                 .eq(SysStore::getDelFlag, StatusType.OK.getCode()));
         if (CollUtil.isEmpty(storeList)) {
             return;
@@ -145,8 +385,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         for (SysStore store : storeList) {
             this.buildStoreSettlement(settlementManageBill, store);
         }
-
-
         // 计算门店结算明细
 //        threadPoolTaskExecutor.execute(() -> this.buildStoreSettlement(settlementManageBill, storeList));
     }
@@ -230,15 +468,12 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         List<AppUserBillMstr> crossReceiveBillMstrList = appUserBillMstrService.list(new QueryWrapper<AppUserBillMstr>().lambda()
                 .eq(AppUserBillMstr::getSourceType, SourceType.STORE.getCode())
                 .eq(AppUserBillMstr::getOrgId, sysStore.getId())
-                .eq(AppUserBillMstr::getIsOtherStore, SysBoolType.YES.getCode())
                 .eq(AppUserBillMstr::getPayType, PayType.BALANCE.getCode())
                 .ge(AppUserBillMstr::getCreateTime, settlementManageBill.getBeginTime())
                 .lt(AppUserBillMstr::getCreateTime, DateUtils.addDays(settlementManageBill.getEndTime(), 1)));
         // 查询门店跨店结算  分红 (给出去)记录
         List<AppUserBillMstr> crossSendBillMstrList = appUserBillMstrService.list(new QueryWrapper<AppUserBillMstr>().lambda()
                 .eq(AppUserBillMstr::getSourceType, SourceType.STORE.getCode())
-                .eq(AppUserBillMstr::getOtherStoreOrgId, sysStore.getId())
-                .eq(AppUserBillMstr::getIsOtherStore, SysBoolType.YES.getCode())
                 .eq(AppUserBillMstr::getPayType, PayType.BALANCE.getCode())
                 .ge(AppUserBillMstr::getCreateTime, settlementManageBill.getBeginTime())
                 .lt(AppUserBillMstr::getCreateTime, DateUtils.addDays(settlementManageBill.getEndTime(), 1)));
@@ -267,10 +502,9 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         // 洗衣费
         BigDecimal totalWashAmount = orderClothItemList.stream().map(OrderClothItem::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
         // 跨店结算金 -收
-        BigDecimal totalCrossReceive = crossReceiveBillMstrList.stream().map(AppUserBillMstr::getOtherStoreAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal totalCrossReceive = BigDecimal.ZERO;
         // 跨店结算金 -支付
-        BigDecimal totalCrossSend = crossSendBillMstrList.stream().map(AppUserBillMstr::getOtherStoreAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
-
+        BigDecimal totalCrossSend = BigDecimal.ZERO;
 
         // 设置 会员剩余金额 = 充值余额总和+福利金余额总和+赠送余额总和
         BigDecimal addMemberBalance = totalRechargeBalance.add(totalWelfareBalance).add(totalGiveBalance);
@@ -461,8 +695,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
             SettlementManageFactory settlementManageFactory = new SettlementManageFactory();
             this.buildFactorySettlementInfo(settlementManageFactory, settlementManageBill, factory);
             this.build0ClothFactory(settlementManageFactory);
-            settlementManageFactory.setStatus(SettlementStatusType.FAIL.getCode());
-            settlementManageFactory.setRemark("结算费率无效,结算失败");
             settlementManageFactoryService.save(settlementManageFactory);
         }
         if (CollUtil.isEmpty(orderClothItemList)) {
@@ -588,4 +820,62 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         settlementManageFactory.setStatus(SettlementStatusType.NO.getCode());
     }
 
+    /**
+     * 计算衣服退款金额
+     */
+    private Map<String, BigDecimal> calculateClothRefundAmounts(List<OrderClothRefund> refundList) {
+        Map<String, BigDecimal> result = new HashMap<>();
+
+        // 统计退款笔数
+        result.put("count", BigDecimal.valueOf(refundList.size()));
+
+        // 统计退款金额
+        BigDecimal refundAmount = refundList.stream()
+                .map(OrderClothRefund::getRefundAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        result.put("amount", refundAmount);
+
+        return result;
+    }
+
+    /**
+     * 计算商品退款金额
+     */
+    private Map<String, BigDecimal> calculateGoodsRefundAmounts(List<OrderGoodsRefund> refundList) {
+        Map<String, BigDecimal> result = new HashMap<>();
+
+        // 统计退款笔数
+        result.put("count", BigDecimal.valueOf(refundList.size()));
+
+        // 统计退款金额
+        BigDecimal refundAmount = refundList.stream()
+                .map(OrderGoodsRefund::getRefundAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        result.put("amount", refundAmount);
+
+        return result;
+    }
+
+    /**
+     * 保存统计结果
+     */
+    private StoreBillStatistics saveStatisticsResult(Long storeId, Date startTime, Date endTime,
+                                                     OrderStatisticsVO clothStats, OrderStatisticsVO goodsStats,
+                                                     PaymentStatisticsVO paymentStats) {
+        StoreBillStatistics statistics = new StoreBillStatistics();
+        statistics.setStoreId(storeId);
+        statistics.setStartTime(startTime);
+        statistics.setEndTime(endTime);
+        statistics.setClothOrderStats(clothStats);
+        statistics.setGoodsOrderStats(goodsStats);
+        statistics.setPaymentStats(paymentStats);
+
+        return statistics;
+    }
+
 }
+
+
+

+ 5 - 5
yiqi-core/src/main/java/com/yiqi/delay/impl/DelayTaskRunService.java

@@ -50,7 +50,7 @@ public class DelayTaskRunService {
 
             // 2. 根据任务类型处理
             switch (taskType) {
-                case ORDER_PAY_DELAY_QUEUE:
+            case ORDER_PAY_DELAY_QUEUE:
                     handleOrderPayQuery(delayMessage);
                     break;
                 case ORDER_REUND_DELAY_QUEUE_TASK:
@@ -72,7 +72,7 @@ public class DelayTaskRunService {
      */
     private void handleOrderPayQuery(DelayMessage delayMessage) {
         // 1. 解析任务数据
-        OrderPayInfo orderPayInfo = JSONUtil.toBean(delayMessage.getData(), OrderPayInfo.class);
+                OrderPayInfo orderPayInfo = JSONUtil.toBean(delayMessage.getData(), OrderPayInfo.class);
         log.info("开始处理支付查询任务: {}", orderPayInfo.getOrderNo());
 
         try {
@@ -161,7 +161,7 @@ public class DelayTaskRunService {
 
                 case RETRY:
                     handleTaskRetry(delayMessage, RefundQueryTimesEnum.class);
-                    break;
+                break;
             }
 
         } catch (Exception e) {
@@ -199,7 +199,7 @@ public class DelayTaskRunService {
      */
     private <T extends Enum<T>> void handleTaskRetry(DelayMessage delayMessage, Class<T> enumClass) {
         // 1. 更新重试次数
-        delayMessage.setPollingNum(delayMessage.getPollingNum() + 1);
+                        delayMessage.setPollingNum(delayMessage.getPollingNum() + 1);
 
         // 2. 检查重试次数是否超限
         int maxRetryCount = getMaxRetryCount(delayMessage.getTags());
@@ -255,7 +255,7 @@ public class DelayTaskRunService {
                 delays = payQueryDelays;
             } else if (enumClass == RefundQueryTimesEnum.class) {
                 delays = refundQueryDelays;
-            } else {
+                } else {
                 // 默认延迟时间配置
                 delays = new int[]{15, 30, 60, 120, 300};
             }

+ 5 - 15
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderActivityServiceImpl.java

@@ -1,7 +1,6 @@
 package com.yiqi.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.common.exception.ServiceException;
@@ -21,10 +20,8 @@ import com.yiqi.common.core.domain.R;
 import com.yiqi.common.enums.*;
 import com.yiqi.common.exception.GlobalException;
 import com.yiqi.common.utils.DateUtils;
-import com.yiqi.common.utils.EnumUtils;
 import com.yiqi.common.utils.OrderNoUtils;
 import com.yiqi.common.utils.SecurityUtils;
-import com.yiqi.delay.DelayMessage;
 import com.yiqi.delay.DelayQueueCache;
 import com.yiqi.order.domain.OrderActivity;
 import com.yiqi.order.domain.OrderActivityItem;
@@ -163,6 +160,10 @@ public class OrderActivityServiceImpl extends ServiceImpl<OrderActivityMapper, O
         if (orderActivity == null) {
             throw new ServiceException("活动订单不存在," + orderNo);
         }
+        if (PayStatus.HAS_PAY.getCode().equals(orderActivity.getPayStatus())) {
+            return R.ok();
+        }
+        orderActivity.setPayStatus(PayStatus.HAS_PAY.getCode());
         orderActivity.setOrderStatus(OrderActivityStatusType.CONFIRM_RECEIVE.getCode());
         orderActivity.setPayTime(DateUtils.getNowDate());
         orderActivity.buildUpdateData();
@@ -252,21 +253,10 @@ public class OrderActivityServiceImpl extends ServiceImpl<OrderActivityMapper, O
             payRefundDTO.setStoreId(orderActivity.getOrgId());
             RefundResponseDTO refundResponse = payService.refundApply(payRefundDTO);
 
-            if (refundResponse.getRefundResult().equals(PayResult.success.getCode())) {
-                refundSuccess(orderActivity.getOrderNo());
-            } else if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
+            if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
                 refundError(orderActivity.getOrderNo());
-            } else {
-                //增加到延迟支付查询队列
-                DelayMessage delayMessage = new DelayMessage(payRefundDTO.getOutRequestNo(), DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(), JSONUtil.toJsonStr(payRefundDTO));
-                //暂不执行
-                delayQueueCache.addDelayJob(delayMessage, RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
             }
-
         }
-
-//        // 退款内容
-//        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderActivityRefundData(orderActivity), new RefundBaseDTO(orderNoUtils.getActivityOrderNo()));
         return 1;
     }
 

+ 12 - 53
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderClothServiceImpl.java

@@ -5,13 +5,11 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.common.exception.ServiceException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.yiqi.app.domain.AppCouponItem;
 import com.yiqi.app.domain.AppUser;
 import com.yiqi.app.domain.dto.AppDeliveryManListQueryDTO;
 import com.yiqi.app.domain.vo.AppUserVO;
@@ -28,7 +26,6 @@ import com.yiqi.common.utils.pay.PayCodeUtils;
 import com.yiqi.core.domain.*;
 import com.yiqi.core.domain.vo.ClothHangerOrderRelationVO;
 import com.yiqi.core.service.*;
-import com.yiqi.delay.DelayMessage;
 import com.yiqi.delay.DelayQueueCache;
 import com.yiqi.order.domain.*;
 import com.yiqi.order.domain.dto.*;
@@ -48,6 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yiqi.order.mapper.OrderClothMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 洗衣订单Service业务层处理
@@ -160,9 +158,8 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
     public R paySuccess(String orderNo, String outTradeNo) {
         //查询订单
         OrderCloth orderCloth = getOne(new QueryWrapper<OrderCloth>().lambda().eq(OrderCloth::getOrderNo, orderNo));
-        if (!ClothOrderStatusType.WAITING_FOR_PAY.getCode().equals(orderCloth.getOrderStatus())
-                && !ClothOrderStatusType.CANCEL.getCode().equals(orderCloth.getOrderStatus())) {
-            return R.fail("订单状态不正确,无法支付执行支付成功操作");
+        if (orderCloth.getPayStatus().equals(PayStatus.HAS_PAY.getCode())) {
+            return R.ok();
         }
         return paySuccess(orderCloth);
     }
@@ -173,7 +170,7 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
             orderCloth.setOrderStatus(ClothOrderStatusType.WAIT_FACTORY.getCode());
         } else {
             //取衣付款
-            orderCloth.setOrderStatus(ClothOrderStatusType.HAS_WASH.getCode());
+            orderCloth.setOrderStatus(ClothOrderStatusType.WAITING_TO_SEND.getCode());
         }
         orderCloth.setPayStatus(PayStatus.HAS_PAY.getCode());
         orderCloth.setPayTime(DateUtils.getNowDate());
@@ -316,7 +313,8 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
     }
 
     @Override
-    public OrderCloth collectCloth(OrderClothDTO orderClothDTO) throws Exception {
+    @Transactional(rollbackFor = Exception.class)
+    public OrderCloth collectCloth(OrderClothDTO orderClothDTO) {
         OrderCloth orderCloth = null;
         if (SysBoolType.YES.getCode().equals(orderClothDTO.getIsAppointment())) {//匹配预约单号
             if (StringUtils.isEmpty(orderClothDTO.getOrderNo())) {
@@ -353,7 +351,6 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
 
         //配置工厂洗衣费等费率
 //        buildSettlement(orderCloth,orderClothItems);
-
         //所有的数据处理完后,将订单的总金额进行更新
         buildOrderTotalPrice(orderCloth, orderClothItems);
 
@@ -363,6 +360,7 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
         } else {
             orderCloth.setOrderStatus(ClothOrderStatusType.WAITING_FOR_PAY.getCode());
         }
+        buildOrderCoupon(orderCloth, orderClothItems, orderClothDTO.getOrderCouponDTOS());
 
         //取衣时再付款,直接配置订单状态为清洗中
 //        if(ClothOrderPayTimeType.send_cloth_pay.getCode().equals(orderClothDTO.getPayTimeType())){
@@ -442,20 +440,13 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
             payRefundDTO.setStoreId(orderCloth.getOrgId());
             RefundResponseDTO refundResponse = payService.refundApply(payRefundDTO);
 
-            if (refundResponse.getRefundResult().equals(PayResult.success.getCode())) {
-                refundSuccess(orderClothRefund.getRefundNo(), orderCloth.getOrderNo());
-            } else if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
+            if (refundResponse.getRefundResult().equals(PayResult.fail.getCode())) {
                 orderClothRefund.setRefundStatus(OrderRefundStatus.ERROR.getCode());
                 orderClothRefund.setRemark(refundResponse.getPayMsg());
                 orderClothRefundService.updateById(orderClothRefund);
 
                 orderCloth.setRefundStatus(OrderRefundStatus.ERROR.getCode());
                 baseMapper.updateById(orderCloth);
-            } else {
-                //增加到延迟支付查询队列
-                DelayMessage delayMessage = new DelayMessage(payRefundDTO.getOutRequestNo(), DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(), JSONUtil.toJsonStr(payRefundDTO));
-                //暂不执行
-                delayQueueCache.addDelayJob(delayMessage, RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
             }
         }
     }
@@ -564,28 +555,7 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
             orderCloth.setPayType(payType);
             this.updateById(orderCloth);
             try {
-                //创建支付订单,防止出现错误
-                OrderPayInfo orderPayInfo = orderPayInfoService.createOrderPayInfo(orderCloth.getOrgId(), orderCloth.getOrderNo(), orderCloth.getPayAmount(), orderCloth.getPayType());
-                //优先增加到延迟队列
-                DelayMessage delayMessage = new DelayMessage(orderPayInfo.getRequestNo(), DelayTagsEnum.ORDER_PAY_DELAY_QUEUE.getCode(), JSONUtil.toJsonStr(orderPayInfo));
-                //暂不执行
-                delayMessage.setIsRun(0);
-                delayQueueCache.addDelayJob(delayMessage, PayQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
-
-                PayResponseDTO payResponseDTO = payService.faceToFacePay(PayOrderFaceToFaceDTO.createRechargeOrderPayData(orderPayInfo.getRequestNo(), orderPayInfo.getPayAmount(), orderPayInfo.getPayType(), orderClothPayDTO.getAuthCode()));
-                if (payResponseDTO.getPayResult().equals(PayResult.success.getCode())) {
-                    paySuccess(orderCloth);
-                    delayQueueCache.deleteDelayJob(orderPayInfo.getRequestNo());
-                    return OrderPayResultVO.paySuccess(orderCloth.getOrderNo());
-                } else if (payResponseDTO.getPayResult().equals(PayResult.fail.getCode())) {
-                    delayQueueCache.deleteDelayJob(orderPayInfo.getRequestNo());
-                    return OrderPayResultVO.payError(payResponseDTO.getPayMsg());
-                } else {
-                    //更新开始执行查询
-                    delayMessage.setIsRun(1);
-                    delayQueueCache.addDelayJob(delayMessage, PayQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
-                    return OrderPayResultVO.payWait(orderCloth.getOrderNo());
-                }
+                return payService.faceToFacePay(PayOrderFaceToFaceDTO.createRechargeOrderPayData(orderCloth.getOrderNo(), orderCloth.getPayAmount(), orderCloth.getPayType(), orderClothPayDTO.getAuthCode()));
             } catch (Exception e) {
                 e.printStackTrace();
                 return OrderPayResultVO.payError("扫收款码支付失败");
@@ -645,11 +615,6 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
         if (orderCouponDTOS == null || orderCouponDTOS.size() == 0) {
             return;
         }
-        Map<Long, AppCouponItem> appCouponItemMap = appCouponItemService.list(new QueryWrapper<AppCouponItem>().lambda()
-                        .eq(AppCouponItem::getAppUserId, orderCloth.getAppUserId())
-                        .in(AppCouponItem::getId,
-                                orderCouponDTOS.stream().map(OrderCouponDTO::getId).collect(Collectors.toSet())))
-                .stream().collect(Collectors.toMap(AppCouponItem::getId, AppCouponItem -> AppCouponItem));
         BigDecimal discountAmount = BigDecimal.ZERO;
         List<OrderClothCouponRelation> orderClothCouponRelations = new ArrayList<>();
         List<OrderClothItemCouponRelation> orderClothItemCouponRelations = new ArrayList<>();
@@ -663,7 +628,7 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
 
             for (OrderCouponClothDTO orderCouponClothDTO : orderCouponDTO.getOrderCouponClothDTOS()) {
                 OrderClothItemCouponRelation orderClothItemCouponRelation = new OrderClothItemCouponRelation();
-                orderClothItemCouponRelation.setClothId(orderClothItems.get(orderCouponClothDTO.getClothIndex()).getClothItemId());
+                orderClothItemCouponRelation.setClothId(orderCouponClothDTO.getId());
                 orderClothItemCouponRelation.setOrderClothItemId(orderClothItems.get(orderCouponClothDTO.getClothIndex()).getId());
                 orderClothItemCouponRelation.setCouponItemId(orderCouponDTO.getId());
                 orderClothItemCouponRelation.setOrderId(orderCloth.getId());
@@ -676,7 +641,6 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
                 discountAmount = discountAmount.add(orderClothItemCouponRelation.getDiscountPrice());
             }
         }
-
         orderClothCouponRelationService.saveBatch(orderClothCouponRelations);
         orderClothItemCouponRelationService.saveBatch(orderClothItemCouponRelations);
 
@@ -685,13 +649,8 @@ public class OrderClothServiceImpl extends ServiceImpl<OrderClothMapper, OrderCl
                 .subtract(orderCloth.getCashDeductAmount()));
 
         //优惠券使用完后,将优惠券修改为已使用状态
-        appCouponItemService.update(new UpdateWrapper<AppCouponItem>()
-                .lambda().set(AppCouponItem::getIsUsed, SysBoolType.YES.getCode())
-                .set(AppCouponItem::getUsedStoreId, SecurityUtils.getLoginUser().getOrgId())
-                .set(AppCouponItem::getUsedTime, DateUtils.getNowDate())
-                .eq(AppCouponItem::getAppUserId, orderCloth.getAppUserId())
-                .in(AppCouponItem::getId, orderCouponDTOS.stream().map(OrderCouponDTO::getId)
-                        .collect(Collectors.toSet())));
+        orderCouponDTOS.forEach(orderCouponDTO -> appCouponItemService.checkCouponItem(orderCouponDTO.getId(), orderCloth.getAppUserId())
+        );
     }
 
     /**

+ 5 - 24
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderGoodsServiceImpl.java

@@ -297,28 +297,8 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
             this.updateById(orderGoods);
             try {
                 //创建支付订单,防止出现错误
-                OrderPayInfo orderPayInfo = orderPayInfoService.createOrderPayInfo(orderGoods.getOrgId(), orderGoods.getOrderNo(), orderGoods.getPayAmount(), orderGoods.getPayType());
-                //优先增加到延迟队列
-                DelayMessage delayMessage = new DelayMessage(orderPayInfo.getRequestNo(), DelayTagsEnum.ORDER_PAY_DELAY_QUEUE.getCode(), JSONUtil.toJsonStr(orderPayInfo));
-                //暂不执行
-                delayMessage.setIsRun(0);
-                delayQueueCache.addDelayJob(delayMessage, PayQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
-                PayResponseDTO payResponseDTO = payService.faceToFacePay(PayOrderFaceToFaceDTO.createRechargeOrderPayData(orderPayInfo.getRequestNo(), orderPayInfo.getPayAmount(), orderPayInfo.getPayType(), orderGoodsDTO.getAuthCode()));
-                if (payResponseDTO.getPayResult().equals(PayResult.success.getCode())) {
-                    this.handlePaySuccessUpdateOrderStatus(orderGoods.getOrderNo(), null);
-                    orderPayResultVO = OrderPayResultVO.paySuccess(orderGoods.getOrderNo());
-                    orderPayResultVO.setOrderId(orderGoods.getId());
-                    delayQueueCache.deleteDelayJob(orderPayInfo.getRequestNo());
-                    return orderPayResultVO;
-                } else if (payResponseDTO.getPayResult().equals(PayResult.fail.getCode())) {
-                    delayQueueCache.deleteDelayJob(orderPayInfo.getRequestNo());
-                    return OrderPayResultVO.payError(payResponseDTO.getPayMsg());
-                } else {
-                    //更新开始执行查询
-                    delayMessage.setIsRun(1);
-                    delayQueueCache.addDelayJob(delayMessage, PayQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
-                    return OrderPayResultVO.payWait(orderGoods.getOrderNo());
-                }
+                return payService.faceToFacePay(PayOrderFaceToFaceDTO.createRechargeOrderPayData(orderGoods.getOrderNo(), orderGoods.getPayAmount(), orderGoods.getPayType(), orderGoodsDTO.getAuthCode()));
+
             } catch (Exception e) {
                 e.printStackTrace();
                 return OrderPayResultVO.payError("扫收款码支付失败");
@@ -354,8 +334,8 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         if (orderGoods == null) {
             throw new ServiceException("商品订单不存在," + orderNo);
         }
-        if (!OrderGoodsStatusType.NO_PAY.getCode().equals(orderGoods.getOrderStatus())) {
-            return R.fail("订单状态异常,请稍后再试");
+        if (PayStatus.HAS_PAY.getCode().equals(orderGoods.getPayStatus())) {
+            return R.fail("订单已付款成功");
         }
         switch (Objects.requireNonNull(EnumUtils.getEnumByType(orderGoods.getGoodsType(), GoodsType.class))) {
             case NORMAL: {
@@ -373,6 +353,7 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
                 break;
             }
         }
+        orderGoods.setPayStatus(PayStatus.HAS_PAY.getCode());
         orderGoods.setPayTime(DateUtils.getNowDate());
         orderGoods.buildUpdateData();
         this.updateById(orderGoods);

+ 12 - 1
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeRefundServiceImpl.java

@@ -2,6 +2,7 @@ package com.yiqi.order.service.impl;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.yiqi.app.domain.AppUser;
 import com.yiqi.app.service.IAppUserService;
 import com.yiqi.common.utils.DateUtils;
@@ -39,7 +40,17 @@ public class OrderRechargeRefundServiceImpl extends ServiceImpl<OrderRechargeRef
      */
     @Override
     public OrderRechargeRefund selectOrderRechargeRefundById(Long id) {
-        return baseMapper.selectOrderRechargeRefundById(id);
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 查询充值卡退款管理列表
+     *
+     * @param orderNo 充值卡退款管理
+     */
+    @Override
+    public OrderRechargeRefund selectOrderRechargeOrderNo(String orderNo) {
+        return baseMapper.selectOne(new QueryWrapper<OrderRechargeRefund>().eq("order_no", orderNo).last("limit 1"));
     }
 
     /**

+ 104 - 241
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeServiceImpl.java

@@ -2,7 +2,6 @@ package com.yiqi.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.activity.domain.ActivityRechargeItem;
@@ -17,11 +16,10 @@ import com.yiqi.app.domain.AppCouponItem;
 import com.yiqi.app.service.IAppCouponItemService;
 import com.yiqi.common.core.domain.R;
 import com.yiqi.common.utils.CurrencyUtil;
-import com.yiqi.common.utils.pay.PayCodeUtils;
-import com.yiqi.delay.DelayMessage;
 import com.yiqi.delay.DelayQueueCache;
 import com.yiqi.lock.RedisLockUtil;
 import com.yiqi.order.domain.vo.*;
+import com.yiqi.order.domain.vo.weapp.AppPayRespVO;
 import com.yiqi.order.dto.RechargePackageInfo;
 import com.yiqi.order.service.IOrderRechargeCouponRelationService;
 import com.yiqi.app.service.IAppUserBillMstrService;
@@ -53,7 +51,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -216,7 +213,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
 
         orderRecharge.setUpdateTime(DateUtils.getNowDate());
 
-        orderRecharge.setRefundStatus(OrderRefundStatus.REFUND_REFUSE.getCode());
+        orderRecharge.setRefundStatus(RechargeRefundStatusType.REFUND_REFUSE.getCode());
         orderRecharge.buildUpdateData();
         baseMapper.updateById(orderRecharge);
 
@@ -245,17 +242,25 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
             OrderRecharge orderRecharge = validateRefundOrder(orderRechargeRefund.getOrderNo());
             RechargePasswordCard rechargeCard = validateRechargeCard(orderRecharge.getOrderNo());
 
-            // 3. 更新退款申请状态
-            updateRefundStatus(orderRechargeRefund, orderRecharge, rechargeCard);
-
-            // 4. 处理现金退款
+            // 3. 处理现金退款
             if (PayType.CASH.getCode().equals(orderRechargeRefund.getRefundType()) || PayType.RECHARGE_CARD.getCode().equals(orderRechargeRefund.getRefundType())) {
-                return handleCashRefund(orderRechargeRefund, orderRecharge, rechargeCard);
+                refundSuccess(orderRechargeRefund.getOrderNo());
+                return 1;
+            } else {
+                // 4. 更新退款申请状态
+                updateRefundStatus(orderRechargeRefund, orderRecharge, rechargeCard);
+
+                // 5. 发起第三方退款
+                // 1. 构建退款请求
+                PayRefundDTO refundDTO = buildRefundRequest(orderRechargeRefund, orderRecharge);
+
+                // 2. 发起退款
+                RefundResponseDTO response = payService.refundApply(refundDTO);
+                if (PayResult.fail.getCode() == (response.getRefundResult())) {
+                    // 退款失败
+                    refundError(refundDTO.getOrderNo());
+                }
             }
-
-            // 5. 发起第三方退款
-            processThirdPartyRefund(orderRechargeRefund, orderRecharge);
-
             return 1;
         } catch (Exception e) {
             log.error("退款审核处理失败, orderNo={}, error={}",
@@ -311,11 +316,6 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
                                     RechargePasswordCard card) {
         Date now = DateUtils.getNowDate();
 
-        // 1. 更新充值卡状态
-        card.setRechargeStatus(RechargeStatusType.FROZEN.getCode());
-        card.buildUpdateData();
-        rechargePasswordCardService.updateById(card);
-
         // 2. 更新订单状态
         orderRecharge.setUpdateTime(now);
         orderRecharge.setRefundStatus(OrderRefundStatus.REFUNDING.getCode());
@@ -351,21 +351,6 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         return 1;
     }
 
-    /**
-     * 处理第三方退款
-     */
-    private void processThirdPartyRefund(OrderRechargeRefund refundOrder,
-                                         OrderRecharge orderRecharge) {
-        // 1. 构建退款请求
-        PayRefundDTO refundDTO = buildRefundRequest(refundOrder, orderRecharge);
-
-        // 2. 发起退款
-        RefundResponseDTO response = payService.refundApply(refundDTO);
-
-        // 3. 处理退款结果
-        handleRefundResponse(response, refundOrder, orderRecharge);
-    }
-
     /**
      * 构建退款请求
      */
@@ -393,46 +378,6 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         return refundDTO;
     }
 
-    /**
-     * 处理退款响应
-     */
-    private void handleRefundResponse(RefundResponseDTO response,
-                                      OrderRechargeRefund refundOrder,
-                                      OrderRecharge orderRecharge) {
-        if (PayResult.success.getCode() == (response.getRefundResult())) {
-            // 退款成功
-            refundSuccess(refundOrder.getOrderNo());
-        } else if (PayResult.fail.getCode() == (response.getRefundResult())) {
-            // 退款失败
-            refundError(refundOrder.getOrderNo());
-            throw new ServiceException("退款失败:" + response.getPayMsg());
-        } else {
-            // 退款处理中,加入延迟队列
-            addRefundDelayTask(refundOrder, orderRecharge);
-        }
-    }
-
-    /**
-     * 添加退款延迟任务
-     */
-    private void addRefundDelayTask(OrderRechargeRefund refundOrder,
-                                    OrderRecharge orderRecharge) {
-        PayRefundDTO refundDTO = new PayRefundDTO();
-        refundDTO.setOrderNo(refundOrder.getOrderNo());
-        refundDTO.setOutRequestNo(refundOrder.getRefundNo());
-
-        DelayMessage delayMessage = new DelayMessage(
-                refundDTO.getOutRequestNo(),
-                DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(),
-                JSONUtil.toJsonStr(refundDTO)
-        );
-
-        delayQueueCache.addDelayJob(
-                delayMessage,
-                RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum())
-        );
-    }
-
 
     /**
      * 批量删除充值订单
@@ -466,12 +411,8 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public OrderRecharge createRechargeOrder(OrderRechargeCreateDTO createDTO) {
+    public OrderPayResultVO createRechargeOrder(OrderRechargeCreateDTO createDTO) {
         // 1. 校验参数
-        if (createDTO.getRechargeTypeId() == null) {
-            throw new ServiceException("请选择充值套餐");
-        }
-
         if (StringUtils.isEmpty(createDTO.getPayType())) {
             throw new ServiceException("请选择支付方式");
         }
@@ -483,15 +424,16 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         OrderRecharge orderRecharge = buildOrderRecharge(createDTO, packageInfo);
 
         // 4. 处理支付
-        handleRechargePayment(orderRecharge, createDTO);
-
-        return orderRecharge;
+        return handleRechargePayment(orderRecharge, createDTO);
     }
 
     /**
      * 获取充值套餐信息(包含活动)
      */
     private RechargePackageInfo getRechargePackageInfo(Long rechargeTypeId, Long orgId) {
+        if (rechargeTypeId == null) {
+            return null;
+        }
         // 1. 获取套餐基本信息
         RechargeType rechargeType = rechargeTypeService.getById(rechargeTypeId);
         if (rechargeType == null) {
@@ -523,30 +465,40 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         orderRecharge.setRechargeTypeId(createDTO.getRechargeTypeId());
         orderRecharge.setOrderSource(createDTO.getOrderSource());
         orderRecharge.setStoreId(createDTO.getOrgId());
+        orderRecharge.setRemark(createDTO.getRemark());
 
         // 2. 设置支付信息
         orderRecharge.setPayType(createDTO.getPayType());
         orderRecharge.setOrderStatus(OrderRechargeStatus.NO_PAY.getCode());
 
         // 3. 设置金额信息
-        RechargeType rechargeType = packageInfo.getRechargeType();
-        orderRecharge.setPayAmount(rechargeType.getRechargeAmount());
-        orderRecharge.setRechargeAmount(rechargeType.getRechargeAmount());
-        orderRecharge.setWelfareAmount(BigDecimal.ZERO);
-
-        // 4. 设置赠送信息
-        if (packageInfo.getActivityItem() != null) {
-            // 如果有活动,使用活动的赠送金额
-            orderRecharge.setGiveAmount(packageInfo.getActivityItem().getActivityGiveAmount());
-            orderRecharge.setActivityId(packageInfo.getActivityItem().getActivityId());
+        if (packageInfo == null) {
+            //如果套餐为空,则是直接充值
+            orderRecharge.setPayAmount(createDTO.getPayAmount());
+            orderRecharge.setRechargeAmount(createDTO.getRechargeAmount());
+            orderRecharge.setGiveAmount(BigDecimal.ZERO);
+            orderRecharge.setGivePointAmount(0);
+            orderRecharge.setWelfareAmount(createDTO.getWelfareAmount());
         } else {
-            orderRecharge.setGiveAmount(rechargeType.getGiveAmount());
+            RechargeType rechargeType = packageInfo.getRechargeType();
+            orderRecharge.setPayAmount(rechargeType.getRechargeAmount());
+            orderRecharge.setRechargeAmount(rechargeType.getRechargeAmount());
+            orderRecharge.setWelfareAmount(BigDecimal.ZERO);
+
+            // 4. 设置赠送信息
+            if (packageInfo.getActivityItem() != null) {
+                // 如果有活动,使用活动的赠送金额
+                orderRecharge.setGiveAmount(packageInfo.getActivityItem().getActivityGiveAmount());
+                orderRecharge.setActivityId(packageInfo.getActivityItem().getActivityId());
+            } else {
+                orderRecharge.setGiveAmount(rechargeType.getGiveAmount());
+            }
+            orderRecharge.setGivePointAmount(rechargeType.getGivePointAmount());
         }
-        orderRecharge.setGivePointAmount(rechargeType.getGivePointAmount());
-
         // 5. 设置支付渠道金额
         initializePayChannelAmount(orderRecharge);
-
+        orderRecharge.setDelFlag(DeleteStatus.OK.getCode());
+        orderRecharge.buildCreateData();
         save(orderRecharge);
         return orderRecharge;
     }
@@ -574,11 +526,16 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
     /**
      * 处理充值支付
      */
-    private void handleRechargePayment(OrderRecharge orderRecharge, OrderRechargeCreateDTO createDTO) {
+    private OrderPayResultVO handleRechargePayment(OrderRecharge orderRecharge, OrderRechargeCreateDTO createDTO) {
+        OrderPayResultVO resultVO = new OrderPayResultVO();
+        resultVO.setOrderId(orderRecharge.getId());
+        resultVO.setOrderNo(orderRecharge.getOrderNo());
         // 1. 现金支付直接完成
         if (PayType.CASH.getCode().equals(createDTO.getPayType())) {
             paySuccess(orderRecharge, null);
-            return;
+            resultVO.setPayResult(200);
+            resultVO.setPayMsg("支付成功");
+            return resultVO;
         }
 
         // 2. APP支付
@@ -587,78 +544,27 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
                     orderRecharge,
                     createDTO.getPlatform()
             );
-            payService.appPay(payDTO);
-            return;
+            AppPayRespVO appPayRespVO = payService.appPay(payDTO);
+            resultVO.setPayResult(0);
+            resultVO.setAppPayRespVO(appPayRespVO);
+            return resultVO;
         }
 
         // 3. 线下支付(微信/支付宝)
         if (OrderSourceType.OFFLINE.getCode().equals(createDTO.getOrderSource())) {
-            handleOfflinePayment(orderRecharge, createDTO);
-        }
-    }
-
-    /**
-     * 处理线下支付
-     */
-    private void handleOfflinePayment(OrderRecharge orderRecharge, OrderRechargeCreateDTO createDTO) {
-        try {
-            // 1. 创建支付订单
-            OrderPayInfo payInfo = orderPayInfoService.createOrderPayInfo(
-                    orderRecharge.getStoreId(),
-                    orderRecharge.getOrderNo(),
-                    orderRecharge.getPayAmount(),
-                    orderRecharge.getPayType()
-            );
-
             // 2. 发起支付
-            PayResponseDTO response = payService.faceToFacePay(
+            return payService.faceToFacePay(
                     PayOrderFaceToFaceDTO.createRechargeOrderPayData(
-                            payInfo.getRequestNo(),
-                            payInfo.getPayAmount(),
-                            payInfo.getPayType(),
+                            orderRecharge.getOrderNo(),
+                            orderRecharge.getPayAmount(),
+                            orderRecharge.getPayType(),
                             createDTO.getAuthCode()
                     )
             );
-
-            // 3. 处理支付结果
-            handlePaymentResponse(response, orderRecharge, payInfo);
-
-        } catch (Exception e) {
-            log.error("线下支付异常", e);
-            throw new ServiceException("支付失败,请重试");
         }
+        return resultVO;
     }
 
-    /**
-     * 处理支付结果
-     */
-    private void handlePaymentResponse(PayResponseDTO response, OrderRecharge orderRecharge,
-                                       OrderPayInfo payInfo) {
-
-        switch (PayResult.getPayResult(response.getPayResult())) {
-            case success:
-                // 支付成功
-                paySuccess(orderRecharge, response.getOutTradeNo());
-                delayQueueCache.deleteDelayJob(payInfo.getRequestNo());
-                break;
-
-            case fail:
-                // 支付失败
-                delayQueueCache.deleteDelayJob(payInfo.getRequestNo());
-                throw new ServiceException(response.getPayMsg());
-
-            default:
-                // 支付中,加入延迟队列
-                DelayMessage delayMessage = new DelayMessage(
-                        payInfo.getRequestNo(),
-                        DelayTagsEnum.ORDER_PAY_DELAY_QUEUE.getCode(),
-                        JSONUtil.toJsonStr(payInfo)
-                );
-                delayQueueCache.addDelayJob(delayMessage,
-                        PayQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
-                break;
-        }
-    }
 
     /**
      * 卡密充值处理
@@ -837,8 +743,8 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
 
     @Override
     public void paySuccess(OrderRecharge orderRecharge, String outTradeNo) {
-        if (orderRecharge.getOrderStatus().equals(OrderRechargeStatus.YES_PAY.getCode()) || orderRecharge.getOrderStatus().equals(OrderRechargeStatus.REFUND.getCode())) {
-            log.info("订单已支付或已退款,无需再次处理,订单号:{}", orderRecharge.getOrderNo());
+        if (orderRecharge.getPayStatus().equals(PayStatus.HAS_PAY.getCode()) ) {
+            log.error("订单已支付成功,无需再次处理,订单号:{}", orderRecharge.getOrderNo());
             return;
         }
         Date date = DateUtils.getNowDate();
@@ -859,6 +765,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         orderRecharge.setOutTradeOrderNo(outTradeNo);
         orderRecharge.setOrderStatus(OrderRechargeStatus.YES_PAY.getCode());
         orderRecharge.setPayTime(payTime);
+        orderRecharge.setPayStatus(PayStatus.HAS_PAY.getCode());
         try {
             this.updateById(orderRecharge);
         } catch (Exception e) {
@@ -878,6 +785,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         billMstrOrderDTO.setWelfarePayAmount(orderRecharge.getWelfareAmount());
         billMstrOrderDTO.setGivePayAmount(orderRecharge.getGiveAmount());
         billMstrOrderDTO.setRechargeCardNo(orderRecharge.getRechargeCardNo());
+        billMstrOrderDTO.setPayType(orderRecharge.getPayType());
         BigDecimal totalPayAmount = CurrencyUtil.add(orderRecharge.getRechargeAmount(), orderRecharge.getGiveAmount(), orderRecharge.getWelfareAmount());
         billMstrOrderDTO.setPayTotalAmount(totalPayAmount);
         billMstrOrderDTO.setRemark("充值卡:" + rechargePasswordCard.getCardNo() + ",储值到账" + totalPayAmount + "元");
@@ -963,6 +871,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         orderRecharge.setPayType(PayType.RECHARGE_CARD.getCode());
         orderRecharge.setDelFlag(DeleteStatus.OK.getCode());
         orderRecharge.setOrderStatus(OrderRechargeStatus.YES_PAY.getCode());
+        orderRecharge.setPayStatus(PayStatus.HAS_PAY.getCode());
         orderRecharge.setOrderSource(orderRechargeCreateDTO.getOrderSource());
         orderRecharge.setRechargeCardNo(rechargePasswordCard.getCardNo());
         orderRecharge.setPayAmount(rechargePasswordCard.getRechargeAmount());
@@ -1019,6 +928,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
             return;
         }
         orderRecharge.setOrderStatus(OrderRechargeStatus.YES_PAY.getCode());
+        orderRecharge.setPayStatus(PayStatus.HAS_PAY.getCode());
         orderRecharge.setPayTime(date);
         this.updateById(orderRecharge);
         // 同步生成密码卡
@@ -1335,74 +1245,6 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         }
     }
 
-    /**
-     * 处理退款
-     */
-    private void processRefund(OrderRecharge orderRecharge, OrderRechargeRefund refundOrder) {
-        // 现金退款直接完成
-        if (PayType.CASH.getCode().equals(orderRecharge.getPayType())) {
-            return;
-        }
-
-        // 构建退款请求
-        PayRefundDTO refundDTO = buildRefundRequest(orderRecharge, refundOrder);
-
-        // 发起退款
-        RefundResponseDTO response = payService.refundApply(refundDTO);
-
-        // 处理退款结果
-        handleRefundResponse(response, refundOrder.getRefundNo());
-    }
-
-    /**
-     * 构建退款请求
-     */
-    private PayRefundDTO buildRefundRequest(OrderRecharge orderRecharge,
-                                            OrderRechargeRefund refundOrder) {
-        PayRefundDTO refundDTO = new PayRefundDTO();
-        refundDTO.setPayType(orderRecharge.getPayType());
-        refundDTO.setOrderNo(orderRecharge.getOrderNo());
-        refundDTO.setRefundAmount(refundOrder.getRefundAmount());
-        refundDTO.setOutRequestNo(refundOrder.getRefundNo());
-        refundDTO.setOutTradeNo(orderRecharge.getOutTradeOrderNo());
-        refundDTO.setRefundReason(refundOrder.getRefundReason());
-        refundDTO.setTotalAmount(orderRecharge.getPayAmount());
-        refundDTO.setStoreId(orderRecharge.getStoreId());
-        return refundDTO;
-    }
-
-    /**
-     * 处理退款响应
-     */
-    private void handleRefundResponse(RefundResponseDTO response, String refundNo) {
-        if (PayResult.success.getCode() == (response.getRefundResult())) {
-            // 退款成功
-            refundSuccess(refundNo);
-        } else if (PayResult.fail.getCode() == (response.getRefundResult())) {
-            // 退款失败
-            refundError(refundNo);
-            throw new ServiceException("退款失败:" + response.getPayMsg());
-        } else {
-            // 退款处理中,加入延迟队列
-            addRefundDelayTask(refundNo);
-        }
-    }
-
-    /**
-     * 添加退款延迟任务
-     */
-    private void addRefundDelayTask(String refundNo) {
-        DelayMessage delayMessage = new DelayMessage(
-                refundNo,
-                DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(),
-                JSONUtil.toJsonStr(refundNo)
-        );
-
-        delayQueueCache.addDelayJob(
-                delayMessage,
-                RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum())
-        );
-    }
 
     @Override
     public R refundSuccess(String orderNo) {
@@ -1410,28 +1252,52 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         if (orderRecharge == null) {
             throw new ServiceException("未查询到订单");
         }
-        if (orderRecharge.getRefundStatus() != OrderRefundStatus.REFUNDING.getCode()
-                && orderRecharge.getRefundStatus() != OrderRefundStatus.REFUND_APPLYING.getCode()
-                && orderRecharge.getRefundStatus() != OrderRefundStatus.ERROR.getCode()) {//退款状态不正确,直接跳过
-            return R.ok();
+        if (orderRecharge.getRefundStatus() == OrderRefundStatus.REFUNDING.getCode()
+                || orderRecharge.getRefundStatus() == OrderRefundStatus.REFUND_SUCCESS.getCode()) {//退款状态不正确,直接跳过
+            throw new ServiceException("当前退款状态不正确");
         }
 
-        orderRecharge.setRefundStatus(OrderRefundStatus.REFUND_SUCCESS.getCode());
+        orderRecharge.setRefundStatus(RechargeRefundStatusType.REFUND_AGREE.getCode());
         this.updateById(orderRecharge);
 
+        //查询退款订单
+        OrderRechargeRefund orderRechargeRefund = orderRechargeRefundService.selectOrderRechargeOrderNo(orderNo);
+        // 3. 更新退款申请状态
+        orderRechargeRefund.setRefundStatus(RechargeRefundStatusType.REFUND_AGREE.getCode());
+        orderRechargeRefundService.updateById(orderRechargeRefund);
+
         RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.getOne(new QueryWrapper<RechargePasswordCard>().lambda()
                 .eq(RechargePasswordCard::getOrderNo, orderRecharge.getOrderNo())
                 .eq(RechargePasswordCard::getDelFlag, DeleteStatus.OK.getCode()), Boolean.FALSE);
         if (rechargePasswordCard == null) {
             log.error("充值卡退款成功,订单不存在:" + orderNo);
-            throw new GlobalException("充值卡不存在");
+            throw new ServiceException("充值卡不存在");
         }
         rechargePasswordCard.setRechargeStatus(RechargeStatusType.REFUND.getCode());
         rechargePasswordCardService.updateById(rechargePasswordCard);
         //退用户积分
         appUserPointLogService.reducePoint(orderRecharge.getAppUserId(), orderRecharge.getGivePointAmount().intValue(), orderRecharge.getOrderNo(), MemberPointSourceEnum.REFUND_DEDUCT, "会员储值退款扣除");
         //此处添加退款记录
-        appUserBillMstrService.save(appUserBillMstrService.buildBillMstr(ConsumeOrderDTO.buildOrderRechargeRefundData(orderRecharge)));
+
+        BillMstrOrderDTO billMstrOrderDTO = new BillMstrOrderDTO();
+        billMstrOrderDTO.setAppUserId(orderRecharge.getAppUserId());
+        billMstrOrderDTO.setStoreId(orderRecharge.getStoreId());
+        billMstrOrderDTO.setOrderNo(orderRecharge.getOrderNo());
+        billMstrOrderDTO.setOrderType(OrderType.recharge.getCode());
+        billMstrOrderDTO.setRechargePayAmount(orderRecharge.getRechargeAmount());
+        billMstrOrderDTO.setUseBindStoreId(rechargePasswordCard.getUseBindStoreId());
+        billMstrOrderDTO.setWelfarePayAmount(orderRechargeRefund.getWelfareBalance());
+        billMstrOrderDTO.setGivePayAmount(orderRechargeRefund.getWelfareBalance());
+        billMstrOrderDTO.setRechargeCardNo(orderRecharge.getRechargeCardNo());
+        billMstrOrderDTO.setPayType(orderRecharge.getPayType());
+        billMstrOrderDTO.setPayTotalAmount(orderRechargeRefund.getRefundAmount());
+        billMstrOrderDTO.setRemark("充值卡:" + rechargePasswordCard.getCardNo() + ",退款" + orderRechargeRefund.getRefundAmount() + "元");
+        try {
+            billMstrOrderService.saveRefundBillMstrOrder(billMstrOrderDTO);
+        } catch (Exception e) {
+            log.error("保存消费日志失败,订单号:{}", orderRecharge.getOrderNo(), e);
+            throw new ServiceException("保存消费日志失败");
+        }
         log.debug("充值订单{}" + orderNo + "退款完成");
         return R.ok();
     }
@@ -1449,12 +1315,9 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
 
     @Override
     public R refundError(String orderNo) {
-        OrderRecharge orderRecharge = getOne(new QueryWrapper<OrderRecharge>().lambda().eq(OrderRecharge::getOrderNo, orderNo));
-        if (orderRecharge == null) {
-            throw new ServiceException("未查询到订单");
-        }
-        orderRecharge.setRefundStatus(OrderRefundStatus.ERROR.getCode());
-        updateById(orderRecharge);
+        OrderRechargeRefund orderRechargeRefund = orderRechargeRefundService.selectOrderRechargeOrderNo(orderNo);
+        orderRechargeRefund.setRefundStatus(OrderRefundStatus.ERROR.getCode());
+        orderRechargeRefundService.updateById(orderRechargeRefund);
         return R.ok();
     }
 

+ 62 - 5
yiqi-core/src/main/java/com/yiqi/order/service/impl/PayServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yiqi.order.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
@@ -23,9 +24,12 @@ import com.yiqi.common.core.domain.R;
 import com.yiqi.common.utils.EnumUtils;
 import com.yiqi.common.utils.OrderNoUtils;
 import com.yiqi.common.utils.StringUtils;
+import com.yiqi.delay.DelayMessage;
+import com.yiqi.delay.DelayQueueCache;
 import com.yiqi.order.domain.OrderPayInfo;
 import com.yiqi.order.domain.OrderRefundInfo;
 import com.yiqi.order.domain.dto.*;
+import com.yiqi.order.domain.vo.OrderPayResultVO;
 import com.yiqi.order.domain.vo.weapp.AppPayRespVO;
 import com.yiqi.order.service.*;
 import com.yiqi.payment.AliPayService;
@@ -68,6 +72,8 @@ public class PayServiceImpl implements IPayService {
     private IOrderPayInfoService orderPayInfoService;
     @Autowired
     private IOrderRefundInfoService orderRefundInfoService;
+    @Autowired
+    private DelayQueueCache delayQueueCache;
 
     private static final Logger log = LoggerFactory.getLogger(PayServiceImpl.class);
 
@@ -155,10 +161,23 @@ public class PayServiceImpl implements IPayService {
     }
 
     @Override
-    public PayResponseDTO faceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO) {
+    public OrderPayResultVO faceToFacePay(PayOrderFaceToFaceDTO payOrderFaceToFaceDTO) {
         if (payOrderFaceToFaceDTO.getExpireTime() == null) {
             throw new ServiceException("支付缺少过期时间");
         }
+        OrderPayResultVO orderPayResultVO = new OrderPayResultVO();
+        orderPayResultVO.setPayResult(100);
+        // 1. 创建支付订单
+        OrderPayInfo payInfo = orderPayInfoService.createOrderPayInfo(
+                payOrderFaceToFaceDTO.getStoreId(),
+                payOrderFaceToFaceDTO.getOrderNo(),
+                payOrderFaceToFaceDTO.getPayAmount(),
+                payOrderFaceToFaceDTO.getPayType()
+        );
+        //优先增加到延迟队列
+        DelayMessage delayMessage = new DelayMessage(payInfo.getRequestNo(), DelayTagsEnum.ORDER_PAY_DELAY_QUEUE.getCode(), JSONUtil.toJsonStr(payInfo));
+        //暂不执行
+        payOrderFaceToFaceDTO.setRequestNo(payInfo.getRequestNo());
         PayResponseDTO payResponseDTO = null;
         switch (EnumUtils.getEnumByType(payOrderFaceToFaceDTO.getPayType(), PayType.class)) {
             case WECHAT: {
@@ -172,7 +191,25 @@ public class PayServiceImpl implements IPayService {
             default:
                 payResponseDTO = PayResponseDTO.payError("支付方式不能为空");
         }
-        return payResponseDTO;
+        if (payResponseDTO.getPayResult().equals(PayResult.success.getCode())) {
+            unifiePaySuccessNotify(payInfo.getRequestNo(), payOrderFaceToFaceDTO.getOrderNo(), payResponseDTO.getOutTradeNo());
+            orderPayResultVO = OrderPayResultVO.paySuccess(payOrderFaceToFaceDTO.getOrderNo());
+            return orderPayResultVO;
+        } else if (payResponseDTO.getPayResult().equals(PayResult.fail.getCode())) {
+            //支付失败
+            orderPayResultVO.setPayResult(101);
+            orderPayResultVO.setOrderNo(payOrderFaceToFaceDTO.getOrderNo());
+            orderPayResultVO.setPayMsg(payResponseDTO.getPayMsg());
+            return orderPayResultVO;
+        } else {
+            //支付中,更新开始执行查询
+            delayMessage.setIsRun(1);
+            delayQueueCache.addDelayJob(delayMessage, PayQueryTimesEnum.getDelayTime(delayMessage.getPollingNum()));
+            orderPayResultVO.setPayResult(100);
+            orderPayResultVO.setOrderNo(payOrderFaceToFaceDTO.getOrderNo());
+            orderPayResultVO.setPayMsg(payResponseDTO.getPayMsg());
+            return orderPayResultVO;
+        }
     }
 
     @Override
@@ -238,17 +275,37 @@ public class PayServiceImpl implements IPayService {
     public RefundResponseDTO refundApply(PayRefundDTO payRefundDTO) {
         OrderRefundInfo orderRefundInfo = orderRefundInfoService.createOrderRefundInfo(payRefundDTO);
         payRefundDTO.setOutRequestNo(orderRefundInfo.getRequestNo());
+        RefundResponseDTO response = new RefundResponseDTO();
         switch (EnumUtils.getEnumByType(payRefundDTO.getPayType(), PayType.class)) {
             case WECHAT: {
-                return wechatPayService.orderRefund(payRefundDTO);
+                response = wechatPayService.orderRefund(payRefundDTO);
             }
             case ALIPAY: {
-                return aliPayService.orderRefund(payRefundDTO);
+                response = aliPayService.orderRefund(payRefundDTO);
             }
             default: {
-                return RefundResponseDTO.refundError("不支持第三方APP退款");
+                response = RefundResponseDTO.refundError("不支持第三方APP退款");
             }
         }
+        if (PayResult.success.getCode() == (response.getRefundResult())) {
+            // 退款成功
+            unifieRefundSuccessNotify(payRefundDTO.getOutRequestNo(), payRefundDTO.getOrderNo(), payRefundDTO.getOutTradeNo());
+        } else if (PayResult.fail.getCode() == (response.getRefundResult())) {
+            // 退款失败
+        } else {
+            // 退款处理中,加入延迟队列
+            DelayMessage delayMessage = new DelayMessage(
+                    payRefundDTO.getOutRequestNo(),
+                    DelayTagsEnum.ORDER_REUND_DELAY_QUEUE_TASK.getCode(),
+                    JSONUtil.toJsonStr(payRefundDTO)
+            );
+
+            delayQueueCache.addDelayJob(
+                    delayMessage,
+                    RefundQueryTimesEnum.getDelayTime(delayMessage.getPollingNum())
+            );
+        }
+        return response;
     }
 
     /**

+ 1 - 1
yiqi-core/src/main/java/com/yiqi/payment/AliPayService.java

@@ -106,7 +106,7 @@ public class AliPayService {
 //        model.setStoreId("门店");
         model.setTimeoutExpress("5m");
         model.setAuthCode(payOrderFaceToFaceDTO.getAuthCode());
-        model.setOutTradeNo(payOrderFaceToFaceDTO.getOrderNo());
+        model.setOutTradeNo(payOrderFaceToFaceDTO.getRequestNo());
         model.setScene("bar_code");
         try {
             AlipayTradePayResponse response = AliPayApi.tradePayToResponse(model, aliNotifyUrl);

+ 1 - 1
yiqi-core/src/main/java/com/yiqi/payment/WechatPayService.java

@@ -89,7 +89,7 @@ public class WechatPayService {
                     .nonce_str(WxPayKit.generateStr())
                     .body(payOrderFaceToFaceDTO.getSubjectTitle())
                     .attach("")
-                    .out_trade_no(payOrderFaceToFaceDTO.getOrderNo())
+                    .out_trade_no(payOrderFaceToFaceDTO.getRequestNo())
                     .total_fee(totalFee.toString())
                     .spbill_create_ip(ip)
                     .auth_code(payOrderFaceToFaceDTO.getAuthCode())

+ 0 - 37
yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargeCardBatchRecordServiceImpl.java

@@ -69,43 +69,6 @@ public class RechargeCardBatchRecordServiceImpl extends ServiceImpl<RechargeCard
         return baseMapper.countCardDetailByBatchNo(rechargeBatchCardDetailListQueryDTO);
     }
 
-    @Override
-    public void refundCardByCardId(Long rechargeCardId) {
-        RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.getOne(new QueryWrapper<RechargePasswordCard>().lambda()
-                .eq(RechargePasswordCard::getId, rechargeCardId)
-                .eq(RechargePasswordCard::getDelFlag, StatusType.OK.getCode()), Boolean.FALSE);
-        if (rechargePasswordCard == null){
-            throw new ServiceException("未查询到该充值卡信息");
-        }
-        if (!StatusType.DELETED.getCode().equals(rechargePasswordCard.getRechargeStatus())){
-            throw new ServiceException("该充值卡未使用,无法操作撤单");
-        }
-        if (StrUtil.isEmpty(rechargePasswordCard.getOrderNo())){
-            throw new ServiceException("该充值卡未生成订单,无法操作撤单");
-        }
-
-        rechargePasswordCard.setRefundTime(DateUtils.getNowDate());
-//        rechargePasswordCard.setRefundDescribe("总部操作充值卡撤单");
-//        rechargePasswordCard.setRefundStatus(OrderRefundStatus.REFUNDING.getCode());
-        rechargePasswordCard.buildUpdateData();
-        rechargePasswordCardService.updateById(rechargePasswordCard);
-
-        OrderRecharge orderRecharge = orderRechargeService.getOne(new QueryWrapper<OrderRecharge>().lambda()
-                .eq(OrderRecharge::getOrderNo, rechargePasswordCard.getOrderNo()));
-
-//        orderRecharge.setOrderStatus(OrderRechargeStatus.REFUND.getCode());
-        orderRecharge.setRefundAmount(rechargePasswordCard.getRechargeBalance());
-        orderRecharge.setRefundApplyTime(DateUtils.getNowDate());
-        orderRecharge.setRefundTime(DateUtils.getNowDate());
-        orderRecharge.setRefundDescribe("总部操作充值卡撤单");
-        orderRecharge.setRefundStatus(OrderRefundStatus.REFUNDING.getCode());
-        orderRecharge.buildUpdateData();
-        orderRechargeService.updateById(orderRecharge);
-
-        // 执行退款
-        appUserBillMstrService.refundRecord(ConsumeOrderDTO.buildOrderRechargeRefundData(orderRecharge), new RefundBaseDTO(orderNoUtils.getRechargeOrderNo()));
-    }
-
     @Override
     public void deleteCardByCardId(Long rechargeCardId) {
         RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.getOne(new QueryWrapper<RechargePasswordCard>().lambda()

+ 0 - 170
yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java

@@ -81,169 +81,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
     @Autowired
     private IAppUserBillMstrService billMstrOrderService;
 
-    @Override
-    public void refundBalance(ConsumeOrderDTO consumeOrderDTO) {
-        List<AppUserBillMstr> consumeBillMstrs = appUserBillMstrService.list(new QueryWrapper<AppUserBillMstr>().lambda()
-                .eq(AppUserBillMstr::getOrderNo, consumeOrderDTO.getOrderNo())
-                .eq(AppUserBillMstr::getIsRefund, SysBoolType.NO.getCode())
-                .eq(AppUserBillMstr::getPayType, PayType.BALANCE.getCode()));
-        //修改消费记录为已被退款状态
-        appUserBillMstrService.update(new UpdateWrapper<AppUserBillMstr>().lambda()
-                .eq(AppUserBillMstr::getOrderNo, consumeOrderDTO.getOrderNo())
-                .eq(AppUserBillMstr::getPayTotalAmount, PayType.BALANCE.getCode())
-                .eq(AppUserBillMstr::getIsRefund, SysBoolType.NO.getCode())
-                .set(AppUserBillMstr::getHasRefund, SysBoolType.YES.getCode()));
-        if (consumeBillMstrs.size() == 0) {
-            return;
-        }
-
-        Map<Long, RechargePasswordCard> rechargePasswordCardMap = list(new QueryWrapper<RechargePasswordCard>().lambda()
-                .in(RechargePasswordCard::getId,
-                        consumeBillMstrs.stream()
-                                .map(AppUserBillMstr::getRechargeCardId)
-                                .collect(Collectors.toSet()))).stream()
-                .collect(Collectors.toMap(RechargePasswordCard::getId, RechargePasswordCard -> RechargePasswordCard));
-
-        List<AppUserBillMstr> appUserBillMstrs = new ArrayList<>();
-        for (AppUserBillMstr consumeBillMstr : consumeBillMstrs) {
-            if (OrderType.recharge.getCode().equals(consumeBillMstr.getOrderType())) {
-                appUserBillMstrs.add(
-                        buildBillMstr(consumeOrderDTO, consumeBillMstr, rechargePasswordCardMap.get(consumeBillMstr.getRechargeCardId())
-                                , consumeBillMstr.getRechargePayAmount()
-                                , consumeBillMstr.getGivePayAmount()
-                                , consumeBillMstr.getWelfarePayAmount()));
-            } else {
-                appUserBillMstrs.add(
-                        buildBillMstr(consumeOrderDTO, consumeBillMstr, rechargePasswordCardMap.get(consumeBillMstr.getRechargeCardId())
-                                , consumeBillMstr.getRechargePayAmount().multiply(new BigDecimal(-1))
-                                , consumeBillMstr.getGivePayAmount().multiply(new BigDecimal(-1))
-                                , consumeBillMstr.getWelfarePayAmount().multiply(new BigDecimal(-1))));
-            }
-        }
-        appUserBillMstrService.saveBatch(appUserBillMstrs);
-    }
-
-    @Override
-    public void deductBalance(ConsumeOrderDTO consumeOrderDTO) {
-        LambdaQueryWrapper<RechargePasswordCard> queryWrapper = new QueryWrapper<RechargePasswordCard>().lambda()
-                .eq(RechargePasswordCard::getRechargeUserId, consumeOrderDTO.getAppUserId())
-                .and(wrapper -> wrapper.gt(RechargePasswordCard::getRechargeBalance, BigDecimal.ZERO)
-                        .or()
-                        .gt(RechargePasswordCard::getGiveBalance, BigDecimal.ZERO))
-                .and(wrapper -> wrapper.ge(RechargePasswordCard::getExpireTime, DateUtils.getNowDate(DateUtils.YYYY_MM_DD))
-                        .or().isNull(RechargePasswordCard::getExpireTime))
-                .orderByDesc(RechargePasswordCard::getUseLevel)
-                .orderByAsc(RechargePasswordCard::getRechargeTime);
-        switch (EnumUtils.getEnumByType(consumeOrderDTO.getOrderType(), OrderType.class)) {
-            case cloth:
-            case delivery: {
-                queryWrapper.eq(RechargePasswordCard::getIsSupportCloth, SysBoolType.YES.getCode());
-                break;
-            }
-            case goods: {
-                queryWrapper.eq(RechargePasswordCard::getIsSupportGoods, SysBoolType.YES.getCode());
-                break;
-            }
-            case car: {
-                queryWrapper.eq(RechargePasswordCard::getIsSupportCar, SysBoolType.YES.getCode());
-                break;
-            }
-            case life: {
-                queryWrapper.eq(RechargePasswordCard::getIsSupportLife, SysBoolType.YES.getCode());
-                break;
-            }
-            default: {
-                throw new ServiceException("余额付款订单类型不正确");
-            }
-        }
-        List<RechargePasswordCard> list = list(queryWrapper);
-        BigDecimal amount = new BigDecimal(consumeOrderDTO.getAmount().doubleValue());
-        List<RechargePasswordCard> updateList = new ArrayList<>();//待修改余额的充值卡
-        List<AppUserBillMstr> appUserBillMstrs = new ArrayList<>();
-        for (RechargePasswordCard rechargePasswordCard : list) {
-            updateList.add(rechargePasswordCard);
-            rechargePasswordCard.setRechargeStatus(RechargeStatusType.HAS_USE.getCode());
-
-            BigDecimal useAmount = BigDecimal.ZERO;//本卡使用金额,如果涉及到异店消费,使用本卡使用金额计算
-            BigDecimal rechargeAmount = BigDecimal.ZERO, giveAmount = BigDecimal.ZERO, welfareAmount = BigDecimal.ZERO;
-            if (rechargePasswordCard.getRechargeBalance() != null
-                    && rechargePasswordCard.getRechargeBalance().doubleValue() > 0) {
-                //如果充值余额比需要支付的金额大
-                if (rechargePasswordCard.getRechargeBalance().doubleValue() >= amount.doubleValue()) {
-                    rechargePasswordCard.setRechargeBalance(rechargePasswordCard.getRechargeBalance().subtract(amount));
-                    rechargeAmount = rechargeAmount.add(amount);
-                    useAmount = useAmount.add(amount);
-                    amount = BigDecimal.ZERO;
-                    //如果现金余额已用完,则激活赠送余额到期时间
-                    if (rechargePasswordCard.getRechargeBalance().doubleValue() == 0) {
-                        rechargePasswordCard.setExpireTime(DateUtils.addYears(DateUtils.getNowDate(), 1));
-                    }
-                } else {
-                    amount = amount.subtract(rechargePasswordCard.getRechargeBalance());
-                    rechargeAmount = rechargeAmount.add(rechargePasswordCard.getRechargeBalance());
-                    rechargePasswordCard.setRechargeBalance(BigDecimal.ZERO);
-                }
-            }
-
-            //扣款完成
-            if (amount.doubleValue() == 0) {
-                updateList.add(rechargePasswordCard);
-                appUserBillMstrs.add(buildBillMstr(consumeOrderDTO, rechargePasswordCard, rechargeAmount, giveAmount, welfareAmount));
-                break;
-            }
-
-            //使用赠送余额
-            if (rechargePasswordCard.getGiveBalance() != null
-                    && rechargePasswordCard.getGiveBalance().doubleValue() > 0) {
-                if (rechargePasswordCard.getGiveBalance().doubleValue() >= amount.doubleValue()) {
-                    rechargePasswordCard.setGiveBalance(rechargePasswordCard.getGiveBalance().subtract(amount));
-                    giveAmount = giveAmount.add(amount);
-                    amount = BigDecimal.ZERO;
-                } else {
-                    amount = amount.subtract(rechargePasswordCard.getGiveBalance());
-                    giveAmount = giveAmount.add(rechargePasswordCard.getGiveBalance());
-                    rechargePasswordCard.setGiveBalance(BigDecimal.ZERO);
-                }
-            }
-
-            //扣款完成
-            if (amount.doubleValue() == 0) {
-                updateList.add(rechargePasswordCard);
-                appUserBillMstrs.add(buildBillMstr(consumeOrderDTO, rechargePasswordCard, rechargeAmount, giveAmount, welfareAmount));
-                break;
-            }
-            updateList.add(rechargePasswordCard);
-            appUserBillMstrs.add(buildBillMstr(consumeOrderDTO, rechargePasswordCard, rechargeAmount, giveAmount, welfareAmount));
-            if (amount.doubleValue() == 0) {//扣款完成
-                break;
-            }
-        }
-
-        /**
-         * 全部修改完成,如果还有金额没有扣完,则说明余额不足
-         */
-        if (amount.doubleValue() > 0) {
-            throw new ServiceException("余额不足");
-        }
-        updateBatchById(updateList);
-        appUserBillMstrService.saveBatch(appUserBillMstrs);
-    }
-
-    /**
-     * 余额退款专用
-     */
-    private AppUserBillMstr buildBillMstr(ConsumeOrderDTO consumeOrderDTO, AppUserBillMstr oldBillMstr
-            , RechargePasswordCard rechargePasswordCard
-            , BigDecimal rechargeAmount, BigDecimal giveAmount, BigDecimal welfareAmount) {
-        AppUserBillMstr appUserBillMstr = buildBillMstr(consumeOrderDTO, rechargePasswordCard, rechargeAmount, giveAmount, welfareAmount);
-        appUserBillMstr.setIsOtherStore(oldBillMstr.getIsOtherStore());
-        appUserBillMstr.setOtherStoreAmount(oldBillMstr.getOtherStoreAmount());
-        appUserBillMstr.setOtherStoreRate(oldBillMstr.getOtherStoreRate());
-        appUserBillMstr.setOtherStoreOrgId(oldBillMstr.getOtherStoreOrgId());
-        return appUserBillMstr;
-    }
-
-
     /**
      * 消费日志
      *
@@ -320,7 +157,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
         appUserBillMstr.setOrderType(consumeOrderDTO.getOrderType());
         appUserBillMstr.setOrgId(consumeOrderDTO.getStoreId());
         appUserBillMstr.setPayType(consumeOrderDTO.getPayType());
-        appUserBillMstr.setHasRefund(SysBoolType.NO.getCode());
         if (rechargePasswordCard != null) {
             appUserBillMstr.setRechargeCardId(rechargePasswordCard.getId());
         }
@@ -905,7 +741,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
     public Boolean orderRefundByBalance(String orderSn, BigDecimal refundAmount) {
         List<AppUserBillMstr> consumeBillMstrs = appUserBillMstrService.list(new QueryWrapper<AppUserBillMstr>().lambda()
                 .eq(AppUserBillMstr::getOrderNo, orderSn)
-                .eq(AppUserBillMstr::getHasRefund, SysBoolType.NO.getCode())
                 .eq(AppUserBillMstr::getBillType, "0")
         );
         BigDecimal remainRefundAmount = refundAmount;
@@ -944,11 +779,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
             rechargePasswordCard.setWelfareBalance(CurrencyUtil.sub(rechargePasswordCard.getWelfareBalance(), welfareRefundAmount));
             rechargePasswordCard.setRechargeStatus(RechargeStatusType.HAS_USE.getCode());
             baseMapper.updateById(rechargePasswordCard);
-            //更新为已退款
-            if (consumeBillMstr.getPayTotalAmount().compareTo(refundAmount) >= 0) {
-                consumeBillMstr.setHasRefund(SysBoolType.YES.getCode());
-                appUserBillMstrService.updateById(consumeBillMstr);
-            }
             //新增一个充值记录
             //保存日志
             consumeBillMstr.setRechargePayAmount(balanceRefundAmount);

+ 4 - 20
yiqi-core/src/main/resources/mapper/core/GoodsInfoMapper.xml

@@ -316,10 +316,9 @@
                g.sell_num,
                g.good_comment,
                g.create_time,
-               min(gss.sale_price) as min_sale_price,
-               max(gss.sale_price) as max_sale_price
+               min(sku.sale_price) as min_sale_price,
+               max(sku.sale_price) as max_sale_price
         from goods_sku as sku
-                 left join goods_sku_store as gss on gss.source_type = '00' and gss.goods_sku_id = sku.id
                  left join goods_info as g on g.id = sku.goods_id
         where gss.status='0' and g.del_flag='0'
             <if test="goodsType != null and goodsType != ''">
@@ -348,18 +347,10 @@
         select a.id as skuId,
                b.id as goodsId, b.goods_img as goodsImg, b.goods_name as goodsName,
                c.id as goodsCategoryId, c.category_name as goodsCategoryName,
-               e.spec as skuName, d.sale_price as marketPrice
+               a.specs as skuName, a.sale_price as marketPrice
         from goods_sku a
         left join goods_info b on a.goods_id = b.id
         left join goods_category c on b.goods_category_id = c.id and c.status = '0'
-        left join goods_sku_store d on d.goods_sku_id = a.id and d.source_type = '00'
-        left join ( select goods_sku_id, GROUP_CONCAT(CONCAT(spec_name,':',spec_value) SEPARATOR ' ') as spec
-                    FROM goods_sku_spec
-                    where del_flag = 0 and  goods_sku_id in
-                    <foreach item="item" collection="skuIdList" open="(" separator="," close=")">#{item}
-                    </foreach>
-                    GROUP BY goods_sku_id
-                    ) e on a.id = e.goods_sku_id
         where a.id in
         <foreach item="item" collection="skuIdList" open="(" separator="," close=")">#{item}
         </foreach>
@@ -368,18 +359,11 @@
         select a.id as skuId,
         b.id as goodsId, b.goods_img as goodsImg, b.goods_name as goodsName,
         c.id as goodsCategoryId, c.category_name as goodsCategoryName,
-        e.spec as skuName, d.sale_price as marketPrice
+        a.specs as skuName, d.sale_price as marketPrice
         from goods_sku a
         left join goods_info b on a.goods_id = b.id
         left join goods_category c on b.goods_category_id = c.id and c.status = '0'
         left join goods_sku_store d on d.goods_sku_id = a.id and d.source_type = #{sourceType} and d.target_id = #{orgId}
-        left join ( select goods_sku_id, GROUP_CONCAT(CONCAT(spec_name,':',spec_value) SEPARATOR ' ') as spec
-                    FROM goods_sku_spec
-                    where del_flag = 0 and  goods_sku_id in
-                    <foreach item="item" collection="skuIdList" open="(" separator="," close=")">#{item}
-                    </foreach>
-                    GROUP BY goods_sku_id
-                    ) e on a.id = e.goods_sku_id
         where a.id in
         <foreach item="item" collection="skuIdList" open="(" separator="," close=")">#{item}
         </foreach>

+ 2 - 2
yiqi-core/src/main/resources/mapper/order/OrderRechargeMapper.xml

@@ -47,7 +47,7 @@
         left join app_user u on a.app_user_id = u.id
         left join sys_store s on a.store_id = s.id
         <where>
-            and a.del_flag='0' and a.refund_status != '3'
+            and a.del_flag='0'
             <if test="orderNo != null  and orderNo != ''">
                 and a.order_no = #{orderNo}
             </if>
@@ -78,7 +78,7 @@
             <if test="endPayTime != null and endPayTime !=''">
                 <![CDATA[and a.pay_time <= concat(#{endPayTime}, ' 23:59:59')]]>
             </if>
-            order by a.create_time DESC
+            order by a.id DESC
 
             <if test="pageSizeExport != 0">
                 limit #{pageSizeExport}

+ 1 - 0
yiqi-core/src/main/resources/mapper/recharge/OrderRechargeRefundMapper.xml

@@ -93,6 +93,7 @@
                 and refund_time = #{refundTime}
             </if>
         </where>
+        order by id desc
     </select>
 
     <select id="selectOrderRechargeRefundById" parameterType="Long"

+ 17 - 0
yiqi-framework/src/main/java/com/yiqi/framework/config/JacksonConfig.java

@@ -0,0 +1,17 @@
+package com.yiqi.framework.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class JacksonConfig {
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        return mapper;
+    }
+}
+