From 116fcea940e47c89e5ee4cb09e08257b540e8013 Mon Sep 17 00:00:00 2001 From: gong <1157756119@qq.com> Date: Thu, 18 Dec 2025 20:05:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A5=97=E9=A4=90=E6=8E=A8=E5=B9=BF=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/user/UPpPackageController.java | 20 ++- .../controller/admin/PpOrderController.java | 84 +++++++++++++ .../controller/user/UPpOrderController.java | 104 ++++++++++++++++ .../com/czg/market/dto/PpPackageOrderDTO.java | 6 +- .../com/czg/market/entity/PpPackageOrder.java | 5 + .../market/service/PpHelpRecordService.java | 2 + .../market/service/PpPackageOrderService.java | 29 ++++- .../com/czg/order/dto/CommonRefundDTO.java | 1 + .../czg/order/enums/PaymentPayTypeEnum.java | 6 + .../java/com/czg/enums/OrderNoPrefixEnum.java | 1 + .../service/impl/PpHelpRecordServiceImpl.java | 13 +- .../impl/PpPackageOrderServiceImpl.java | 114 ++++++++++++++++-- .../impl/OrderInfoCustomServiceImpl.java | 5 + 13 files changed, 368 insertions(+), 22 deletions(-) create mode 100644 cash-api/order-server/src/main/java/com/czg/controller/admin/PpOrderController.java create mode 100644 cash-api/order-server/src/main/java/com/czg/controller/user/UPpOrderController.java diff --git a/cash-api/market-server/src/main/java/com/czg/controller/user/UPpPackageController.java b/cash-api/market-server/src/main/java/com/czg/controller/user/UPpPackageController.java index 0213d19a9..3f07aa27f 100644 --- a/cash-api/market-server/src/main/java/com/czg/controller/user/UPpPackageController.java +++ b/cash-api/market-server/src/main/java/com/czg/controller/user/UPpPackageController.java @@ -1,5 +1,6 @@ package com.czg.controller.user; +import com.alibaba.fastjson2.JSONObject; import com.czg.market.dto.PpPackageOrderDTO; import com.czg.market.service.PpPackageOrderService; import com.czg.market.service.PpPackageService; @@ -9,11 +10,10 @@ import com.czg.market.vo.PpPackageVO; import com.czg.order.dto.GbOrderQueryParam; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; +import com.czg.utils.AssertUtil; import com.mybatisflex.core.paginate.Page; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 用户端/套餐推广 @@ -31,6 +31,18 @@ public class UPpPackageController { @Resource private PpPackageOrderService ppPackageOrderService; + /** + * 创建套餐推广订单 + * 参数: {"packageId": 123} + */ + @PostMapping("/order") + public CzgResult createOrder(@RequestBody JSONObject params) { + AssertUtil.isNull(params, "参数不能为空"); + Long packageId = params.getLong("packageId"); + AssertUtil.isNull(packageId, "参数错误"); + return CzgResult.success(ppPackageOrderService.createPackageOrder(packageId)); + } + /** * 获取套餐列表 */ @@ -68,6 +80,6 @@ public class UPpPackageController { */ @GetMapping("/order/detail") public CzgResult getOrderDetail(Long orderId) { - return CzgResult.success(ppPackageOrderService.getOrderDetailById(orderId)); + return CzgResult.success(ppPackageOrderService.getOrderDetailById(orderId, StpKit.USER.getLoginIdAsLong())); } } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/PpOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/PpOrderController.java new file mode 100644 index 000000000..9c1c641b0 --- /dev/null +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/PpOrderController.java @@ -0,0 +1,84 @@ +package com.czg.controller.admin; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.czg.annotation.SaAdminCheckPermission; +import com.czg.enums.OrderNoPrefixEnum; +import com.czg.log.annotation.OperationLog; +import com.czg.market.dto.PpPackageOrderDTO; +import com.czg.market.service.PpPackageOrderService; +import com.czg.order.dto.CommonRefundDTO; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.czg.service.order.service.PayService; +import com.czg.utils.AssertUtil; +import com.czg.utils.CzgRandomUtils; +import jakarta.annotation.Resource; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 管理端/套餐推广 + * + * @author yjjie + * @date 2025/12/18 19:26 + */ +@RestController +@RequestMapping("/admin/ppOrder") +public class PpOrderController { + + @DubboReference + private PpPackageOrderService ppPackageOrderService; + + @Resource + private PayService payService; + + /** + * 确认退单 + */ + @PostMapping("/confirmRefund") + @Transactional + public CzgResult confirmRefund(@RequestBody @Validated CommonRefundDTO param) { + PpPackageOrderDTO detail = ppPackageOrderService.getOrderDetailById(param.getRecordId(), StpKit.USER.getLoginIdAsLong()); + if (detail == null) { + return CzgResult.failure("订单不存在"); + } + + ppPackageOrderService.confirmRefund(param.getRecordId(), StpKit.USER.getShopId()); + + //退钱 + String refPayOrderNo = CzgRandomUtils.snowflake(OrderNoPrefixEnum.REPP); + payService.unifyRefund(detail.getShopId(), detail.getId(), detail.getPayOrderId(), refPayOrderNo, + StrUtil.isBlankIfStr(detail.getRefundReason()) ? "拼团退款" : detail.getRefundReason(), detail.getFinalPrice()); + + return CzgResult.success(); + } + + /** + * 驳回退单 + */ + @PostMapping("/rejectRefund") + public CzgResult rejectRefund(@RequestBody @Validated CommonRefundDTO param) { + return CzgResult.success(ppPackageOrderService.cancelRefund(param.getRecordId(), + StpKit.USER.getLoginIdAsLong(), param.getReason())); + } + + /** + * 套餐推广-核销 + */ + @PostMapping("checkout") + @OperationLog("套餐推广-核销") + @SaAdminCheckPermission(parentName = "套餐推广", value = "market:package:checkout", name = "套餐推广-核销") + public CzgResult checkout(@RequestBody JSONObject param) { + AssertUtil.isNull(param, "核销码不能为空"); + String verifyCode = param.getString("verifyCode"); + AssertUtil.isBlank(verifyCode, "核销码不能为空"); + return CzgResult.success(ppPackageOrderService.checkout(verifyCode, StpKit.USER.getShopId())); + } + +} diff --git a/cash-api/order-server/src/main/java/com/czg/controller/user/UPpOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/user/UPpOrderController.java new file mode 100644 index 000000000..c1679fc10 --- /dev/null +++ b/cash-api/order-server/src/main/java/com/czg/controller/user/UPpOrderController.java @@ -0,0 +1,104 @@ +package com.czg.controller.user; + +import com.czg.market.dto.PpPackageOrderDTO; +import com.czg.market.entity.PpPackageOrder; +import com.czg.market.service.PpPackageOrderService; +import com.czg.market.vo.PpPackageVO; +import com.czg.order.dto.CommonRefundDTO; +import com.czg.order.dto.LtPayOtherDTO; +import com.czg.order.enums.PaymentPayTypeEnum; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.czg.service.order.service.PayService; +import com.czg.utils.ServletUtil; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +/** + * 用户端/套餐推广 + * + * @author yjjie + * @date 2025/12/18 18:54 + */ +@RestController +@RequestMapping("/user/ppOrder") +public class UPpOrderController { + + @DubboReference + private PpPackageOrderService ppPackageOrderService; + + @Resource + private PayService payService; + + /** + * 小程序支付 + * payType 必填 支付方式,aliPay 支付宝,wechatPay 微信 + * openId 必填 + */ + @PostMapping("/pay") + @Transactional + public CzgResult> exchange(HttpServletRequest request, @Validated @RequestBody LtPayOtherDTO param) { + param.setUserId(StpKit.USER.getLoginIdAsLong()); + param.setIp(ServletUtil.getClientIP(request)); + param.setRecordId(param.getParamId()); + + PpPackageOrderDTO detail = ppPackageOrderService.getOrderDetailById(param.getRecordId(), StpKit.USER.getLoginIdAsLong()); + + PpPackageVO packageInfo = detail.getPackageInfo(); + // 计算订单金额 + BigDecimal price = packageInfo.getPrice(); + // 如果存在优惠层级 并且 分享人数大于 0 则计算新的价格 + if (packageInfo.getTieredDiscount() != null && !packageInfo.getTieredDiscount().isEmpty() && detail.getShareNum() > 0) { + // 倒序遍历优惠层级 + for (int i = packageInfo.getTieredDiscount().size() - 1; i >= 0; i--) { + PpPackageVO.TieredDiscount tieredDiscount = packageInfo.getTieredDiscount().get(i); + if (detail.getShareNum() >= tieredDiscount.getPeopleNum()) { + price = tieredDiscount.getPrice(); + break; + } + } + } + param.setPrice(price); + + CzgResult> result = CzgResult.success(); + CzgResult> mapCzgResult = payService.ltPayOther(param, PaymentPayTypeEnum.SourceType.PP, "套餐推广购买"); + if (200 != mapCzgResult.getCode()) { + return mapCzgResult; + } + Map resultMap = new HashMap<>(1); + resultMap.put("payInfo", mapCzgResult.getData()); + result.setData(resultMap); + + PpPackageOrder order = ppPackageOrderService.getById(param.getRecordId()); + order.setFinalPrice(price); + + return result; + } + + /** + * 申请退单 + */ + @PostMapping("/applyRefund") + public CzgResult applyRefund(@RequestBody @Validated CommonRefundDTO param) { + return CzgResult.success(ppPackageOrderService.applyRefund(param.getRecordId(), StpKit.USER.getLoginIdAsLong(), param.getReason())); + } + + /** + * 取消退单 + */ + @PostMapping("/cancelRefund") + public CzgResult cancelRefund(@RequestBody @Validated CommonRefundDTO param) { + return CzgResult.success(ppPackageOrderService.cancelRefund(param.getRecordId(), StpKit.USER.getLoginIdAsLong(), "")); + } +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/PpPackageOrderDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/PpPackageOrderDTO.java index 80835f5db..321a473be 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/dto/PpPackageOrderDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/dto/PpPackageOrderDTO.java @@ -12,7 +12,6 @@ import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.List; /** * 套餐推广订单 实体类。 @@ -121,6 +120,11 @@ public class PpPackageOrderDTO implements Serializable { @JSONField(format = "yyyy-MM-dd HH:mm:ss") private LocalDateTime expireTime; + /** + * 申请退款原因 + */ + private String refundReason; + /** * 是否可以助力:0: 不可以 1: 可以 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/PpPackageOrder.java b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/PpPackageOrder.java index 973048d5f..6938df164 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/entity/PpPackageOrder.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/entity/PpPackageOrder.java @@ -124,4 +124,9 @@ public class PpPackageOrder implements Serializable { @JSONField(format = "yyyy-MM-dd HH:mm:ss") private LocalDateTime expireTime; + /** + * 申请退款原因 + */ + private String refundReason; + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpHelpRecordService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpHelpRecordService.java index 8fd0cf5d0..a5bf308cd 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpHelpRecordService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpHelpRecordService.java @@ -14,4 +14,6 @@ public interface PpHelpRecordService extends IService { boolean canHelp(Long userId, Long orderId); boolean help(Long userId, Long orderId); + + void removeHelpRecord(Long orderId); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpPackageOrderService.java b/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpPackageOrderService.java index 785955f2e..934ecf08a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpPackageOrderService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/market/service/PpPackageOrderService.java @@ -23,7 +23,7 @@ public interface PpPackageOrderService extends IService { /** * 根据订单 Id 查询推广订单详情 */ - PpPackageOrderDTO getOrderDetailById(Long orderId); + PpPackageOrderDTO getOrderDetailById(Long orderId, Long userId); /** * 助力订单 @@ -38,5 +38,30 @@ public interface PpPackageOrderService extends IService { /** * 取消订单 */ - Boolean cancelOrder(Long orderId); + boolean cancelOrder(Long orderId); + + /** + * 申请退款 + */ + boolean applyRefund(Long orderId, Long userId, String refundReason); + + /** + * 确认退款 + */ + void confirmRefund(Long orderId, Long shopId); + + /** + * 取消退款 + */ + boolean cancelRefund(Long orderId, Long userId, String refundReason); + + /** + * 支付成功 + */ + void paySuccess(Long orderId, Long payOrderId); + + /** + * 核销 + */ + boolean checkout(String verifyCode, Long shopId); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/CommonRefundDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/CommonRefundDTO.java index bd7746bb8..cfa46b51f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/CommonRefundDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/CommonRefundDTO.java @@ -24,4 +24,5 @@ public class CommonRefundDTO { private String reason; + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/enums/PaymentPayTypeEnum.java b/cash-common/cash-common-service/src/main/java/com/czg/order/enums/PaymentPayTypeEnum.java index 721cbda11..93148afa7 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/enums/PaymentPayTypeEnum.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/enums/PaymentPayTypeEnum.java @@ -40,6 +40,12 @@ public interface PaymentPayTypeEnum { * 拼团商品购买 */ public static final String WARE = "ware"; + + /** + * 套餐推广 + * package promotion + */ + public static final String PP = "pp"; } class PayType { diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/enums/OrderNoPrefixEnum.java b/cash-common/cash-common-tools/src/main/java/com/czg/enums/OrderNoPrefixEnum.java index e174ab3a8..55e7070c7 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/enums/OrderNoPrefixEnum.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/enums/OrderNoPrefixEnum.java @@ -17,6 +17,7 @@ public enum OrderNoPrefixEnum { BK("BK", "预约"), DH("DH", "积分商品兑换单号"), REP("REP", "积分商品退款"), + REPP("REPP", "套餐推广退款"), GB("GB", "拼团-团单号"), GBO("GBO", "拼团-订单号"), diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/PpHelpRecordServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/PpHelpRecordServiceImpl.java index 612741ff8..b5ac81c8e 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/PpHelpRecordServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/PpHelpRecordServiceImpl.java @@ -1,17 +1,16 @@ package com.czg.service.market.service.impl; import com.czg.account.dto.user.userinfo.UserInfoDTO; -import com.czg.account.service.SysUserService; import com.czg.account.service.UserInfoService; import com.czg.exception.CzgException; -import com.mybatisflex.core.query.QueryWrapper; -import com.mybatisflex.spring.service.impl.ServiceImpl; import com.czg.market.entity.PpHelpRecord; import com.czg.market.service.PpHelpRecordService; import com.czg.service.market.mapper.PpHelpRecordMapper; -import jakarta.annotation.Resource; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 套餐推广助力记录 服务层实现。 @@ -46,4 +45,10 @@ public class PpHelpRecordServiceImpl extends ServiceImpl implements PpPackageOrderService { @Resource @@ -77,8 +78,7 @@ public class PpPackageOrderServiceImpl extends ServiceImpl