From 9470735feb2e2d3563037ff1afcf458e5889ac33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 19 Feb 2025 17:14:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=BD=BD=E5=85=A5?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/MerchantRegisterController.java | 2 +- .../czg/annotation/SaAdminCheckPermission.java | 2 ++ .../src/main/java/com/czg/LoadingRole.java | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/MerchantRegisterController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/MerchantRegisterController.java index 8ab797bd..428ea3de 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/MerchantRegisterController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/MerchantRegisterController.java @@ -33,7 +33,7 @@ public class MerchantRegisterController { * @return 激活码列表 */ @SaAdminCheckRole("管理员") - @SaAdminCheckPermission("merchantRegister:list") + @SaAdminCheckPermission(value = "merchantRegister:list", name = "激活码列表") @GetMapping public CzgResult> get(PageDTO pageDTO, Integer state, String startTime, String endTime) { return CzgResult.success(merchantRegisterService.get(pageDTO, state, startTime, endTime)); diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/annotation/SaAdminCheckPermission.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/annotation/SaAdminCheckPermission.java index a90005cf..22a1bb1a 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/annotation/SaAdminCheckPermission.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/annotation/SaAdminCheckPermission.java @@ -28,6 +28,8 @@ public @interface SaAdminCheckPermission { @AliasFor(annotation = SaCheckPermission.class) String [] value() default {}; + String name() default ""; + /** * 验证模式:AND | OR,默认AND * @return 验证模式 diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/LoadingRole.java b/cash-common/cash-common-tools/src/main/java/com/czg/LoadingRole.java index 6a72f6ca..cd3793fa 100644 --- a/cash-common/cash-common-tools/src/main/java/com/czg/LoadingRole.java +++ b/cash-common/cash-common-tools/src/main/java/com/czg/LoadingRole.java @@ -1,6 +1,7 @@ package com.czg; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import com.mybatisflex.core.row.Db; import com.mybatisflex.core.row.Row; import lombok.extern.slf4j.Slf4j; @@ -41,12 +42,15 @@ public class LoadingRole implements CommandLineRunner { Method valueMethod = annotationClass.getMethod("value"); String[] permissions = (String[]) valueMethod.invoke(annotation); + Method nameMethod = annotationClass.getMethod("name"); + String permissionName = (String) nameMethod.invoke(annotation); + for (String s : permissions) { String sql = "select * from sys_menu where permission=?"; Row menu1 = Db.selectOneBySql(sql, s); if (menu1 != null) { Long menuId = menu1.getLong("menu_id"); - String name = menu1.getString("name"); + String title = menu1.getString("title"); String permission = menu1.getString("permission"); String listSql = "select * from sys_roles_menus where menu_id=? and role_id=?"; List count1 = Db.selectListBySql(listSql, menuId, 1L); @@ -54,14 +58,20 @@ public class LoadingRole implements CommandLineRunner { if (count1.isEmpty()) { sql = "INSERT INTO `sys_roles_menus` (`menu_id`, `role_id`) VALUES (?, ?);"; Db.insertBySql(sql, menu1, 1L); - log.info("接口菜单添加成功, 菜单名称: {}, 菜单权限: {}", name, permission); + log.info("接口菜单添加成功, 菜单名称: {}, 菜单权限: {}", title, permission); + } + + if (StrUtil.isNotBlank(permissionName) && !title.equals(permissionName)) { + sql = "update sys_menu set title=? where menu_id=?"; + Db.updateBySql(sql, permissionName, menuId); + log.info("接口菜单修改成功, 旧名称: {}, 新菜单名称: {}", title, permissionName); } continue; } sql = "INSERT INTO `czg_cashier`.`sys_menu` ( `sub_count`, `type`, `title`, `name`, `component`, `menu_sort`, `icon`, `path`, `i_frame`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `active_menu`, `is_shop`) VALUES " + "(0, 2, ?, NULL, '', 2, '', '', b'0', b'0', b'0', ?, NULL, NULL, ?, NULL, NULL, 0);"; - Db.insertBySql(sql, s, s, DateUtil.date()); + Db.insertBySql(sql, StrUtil.isNotBlank(permissionName) ? permissionName : s, s, DateUtil.date()); sql = "select * from sys_menu where permission=?"; Row info = Db.selectOneBySql(sql, s); Long menuId = info.getLong("menu_id"); From 1ef28891a5ee10add3ab4b4a36bdbd4347dcb1d0 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 19 Feb 2025 17:15:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=9A=E5=91=98=E9=80=80=E6=AC=BE=20?= =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/czg/controller/NotifyController.java | 11 +- .../com/czg/controller/VipPayController.java | 34 +++++- .../czg/account/dto/flow/ShopUserFlowDTO.java | 54 ++++++++-- .../dto/shopuser/ShopUserMoneyEditDTO.java | 5 + .../java/com/czg/account/entity/ShopUser.java | 7 ++ .../com/czg/account/entity/ShopUserFlow.java | 56 +++++++--- .../account/service/ShopUserFlowService.java | 2 +- .../czg/order/service/OrderInfoService.java | 6 +- .../service/impl/ShopUserFlowServiceImpl.java | 5 +- .../service/impl/ShopUserServiceImpl.java | 5 +- .../czg/service/order/dto/VipRefundDTO.java | 47 ++++++++ .../czg/service/order/service/PayService.java | 11 ++ .../service/impl/OrderInfoServiceImpl.java | 21 +++- .../order/service/impl/PayServiceImpl.java | 100 +++++++++++++++++- 14 files changed, 323 insertions(+), 41 deletions(-) create mode 100644 cash-service/order-service/src/main/java/com/czg/service/order/dto/VipRefundDTO.java diff --git a/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java b/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java index 9660121b..56661bb1 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/NotifyController.java @@ -28,9 +28,18 @@ public class NotifyController { @RequestMapping("/payCallBack") public String notifyCallBack(@RequestBody CzgBaseRespParams respParams){ JSONObject czg = CzgPayUtils.getCzg(respParams); - AssertUtil.isNull(czg, "回调数据为空"); + AssertUtil.isNull(czg, "支付回调数据为空"); log.info("支付回调数据为:{}", czg); orderInfoService.payCallBackOrder(czg.getString("mchOrderNo"), czg); return SUCCESS; } + + @RequestMapping("/refundCallBack") + public String refundCallBack(@RequestBody CzgBaseRespParams respParams){ + JSONObject czg = CzgPayUtils.getCzg(respParams); + AssertUtil.isNull(czg, "退款回调数据为空"); + log.info("退款回调数据为:{}", czg); + orderInfoService.refundCallBackOrder(czg.getString("mchOrderNo"), czg); + return SUCCESS; + } } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java b/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java index 6af84095..18b0b3cf 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/VipPayController.java @@ -2,6 +2,7 @@ package com.czg.controller; import com.czg.resp.CzgResult; import com.czg.service.order.dto.VipPayParamDTO; +import com.czg.service.order.dto.VipRefundDTO; import com.czg.service.order.service.PayService; import com.czg.utils.AssertUtil; import com.czg.utils.ServletUtil; @@ -13,6 +14,7 @@ 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.Map; /** @@ -68,7 +70,7 @@ public class VipPayController { @PostMapping("/scanPayVip") public CzgResult> scanPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { AssertUtil.isNull(payParam.getShopUserId(), "充值失败 未指定店铺用户Id"); - payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(request, "platformType")); return payService.scanPayVip(ServletUtil.getClientIPByHeader(request), payParam); } @@ -82,4 +84,34 @@ public class VipPayController { payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); return payService.microPayVip(payParam); } + + /** + * 退款前置 + * 最大退款金额 为 充值金额 inAmount + */ + @PostMapping("/refundVipBefore") + public CzgResult> refundVipBefore(@Validated @RequestBody VipRefundDTO payParam) { + return payService.refundVipBefore(payParam); + } + + /** + * cashRefund 是否是现金退款 + * 会员退款(先调用 退款前置接口 refundVipBefore) + * 最大退款金额为 充值金额 inAmount + * 理论可退最大金额为 + * 用户余额-赠送金额 >充值金额 则可退充值金额 + * 实际可退最大金额为 充值金额 + * 如果实际 大于 理论 则 需要勾选 outOfRange 超额退款 为true 默认为false + */ + @PostMapping("/refundVip") + public CzgResult refundVip(HttpServletRequest request, @Validated @RequestBody VipRefundDTO payParam) { + AssertUtil.isNull(payParam.getRefAmount(), "退款金额不能为空"); + if (payParam.getRefAmount().compareTo(BigDecimal.ZERO) <= 0) { + return CzgResult.failure("退款金额必须大于0"); + } else if (payParam.getRefAmount().compareTo(new BigDecimal("10001")) > 0) { + return CzgResult.failure("退款金额过大"); + } + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(request, "platformType")); + return payService.refundVip(payParam); + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/flow/ShopUserFlowDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/flow/ShopUserFlowDTO.java index 811615e0..da5a2109 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/flow/ShopUserFlowDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/flow/ShopUserFlowDTO.java @@ -1,16 +1,19 @@ package com.czg.account.dto.flow; -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; import com.alibaba.fastjson2.annotation.JSONField; -import java.io.Serial; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + /** * 用户余额流水 实体类。 * @@ -26,27 +29,56 @@ public class ShopUserFlowDTO implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Id(keyType = KeyType.Auto) private Long id; private Long userId; private Long shopId; - + /** + * 充值金额 + */ private BigDecimal amount; - + /** + * 当前余额 + */ private BigDecimal balance; + /** + * 已退款金额 + */ + private BigDecimal refundAmount; /** - * 类型:cashIn 会员充值,awardIn 充值奖励,wechatIn 微信小程序充值,alipayIn 支付宝小程序充值,orderPay 订单消费,orderRefund 订单退款,rechargeRefund 充值退款 adminOp 管理员手动增减 + * 类型: + * cashIn 现金充值, + * wechatIn 微信小程序充值, + * alipayIn 支付宝小程序充值, + * awardIn 充值奖励, + * rechargeRefund 充值退款 + *

+ * orderPay 订单消费, + * orderRefund 订单退款, + *

+ * adminIn 管理员充值 + * adminOut管理员消费 */ private String bizCode; + /** + * 备注 + */ + private String remark; /** - * 加减号 + * 关联id, + * 订单支付/订单退款/霸王餐时 订单id + * 支付/退款 tb_order_payment.id */ - private String type; - - private String remark; + private Long relationId; + /** + * 充值记录id 当前表的id + * 退款使用 + */ + private Long rechargeId; /** * 关联订单编号,支付单号,退款单号 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java index 4c33a3e5..7c41f0c9 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java @@ -31,6 +31,11 @@ public class ShopUserMoneyEditDTO { * 支付/退款 tb_order_payment.id */ private Long relationId; + /** + * 充值记录id 当前表的id + * 退款使用 + */ + private Long rechargeId; /** * 浮动金额 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java index 6bd1a52d..2599c7e2 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUser.java @@ -127,4 +127,11 @@ public class ShopUser implements Serializable { @Column(onInsertValue = "now()", onUpdateValue = "now()") private LocalDateTime updateTime; + + public BigDecimal getAmount() { + if (amount == null) { + return BigDecimal.ZERO; + } + return amount; + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java index ba90c595..c5f3e6a6 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java @@ -4,6 +4,7 @@ import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; + import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -37,36 +38,67 @@ public class ShopUserFlow implements Serializable { private Long userId; private Long shopId; - + /** + * 充值金额 + */ private BigDecimal amount; - + /** + * 当前余额 + */ private BigDecimal balance; + /** + * 已退款金额 + */ + private BigDecimal refundAmount; /** - * 类型:cashIn 会员充值,awardIn 充值奖励,wechatIn 微信小程序充值,alipayIn 支付宝小程序充值,orderPay 订单消费,orderRefund 订单退款,rechargeRefund 充值退款 adminOp 管理员手动增减 + * 类型: + * cashIn 现金充值, + * wechatIn 微信小程序充值, + * alipayIn 支付宝小程序充值, + * awardIn 充值奖励, + * rechargeRefund 充值退款 + *

+ * orderPay 订单消费, + * orderRefund 订单退款, + *

+ * adminIn 管理员充值 + * adminOut管理员消费 */ private String bizCode; - /** - * 加减号 + * 备注 */ - private String type; - private String remark; - /** - * 是否可退款 - */ - private Integer isCanRefund; - /** * 关联id, * 订单支付/订单退款/霸王餐时 订单id * 支付/退款 tb_order_payment.id */ private Long relationId; + /** + * 充值记录id 当前表的id + * 退款使用 + */ + private Long rechargeId; + @Column(onInsertValue = "now()") private LocalDateTime createTime; + + public BigDecimal getAmount() { + if (amount == null) { + return BigDecimal.ZERO; + } + return amount; + } + + public BigDecimal getRefundAmount() { + if (refundAmount == null) { + return BigDecimal.ZERO; + } + return refundAmount; + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserFlowService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserFlowService.java index 337d20a8..c9a1e6b4 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserFlowService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserFlowService.java @@ -1,7 +1,7 @@ package com.czg.account.service; -import com.mybatisflex.core.service.IService; import com.czg.account.entity.ShopUserFlow; +import com.mybatisflex.core.service.IService; /** * 用户余额流水 服务层。 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java index 83ffd62e..77fe124b 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java @@ -7,6 +7,8 @@ import com.czg.order.enums.PayEnums; import com.czg.order.vo.OrderInfoVo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; +import jakarta.validation.constraints.NotBlank; +import org.jetbrains.annotations.NotNull; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -21,9 +23,9 @@ public interface OrderInfoService extends IService { Page getOrderByPage(OrderInfoQueryDTO param); - void payCallBackOrder(String orderNo, JSONObject resultJson); + void payCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson); - void refundCallBackOrder(); + void refundCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson); void upOrderInfo(Long orderId, BigDecimal payAmount, LocalDateTime payTime, Long payOrderId, PayEnums payType); } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java index cad26f82..648d04d2 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java @@ -1,11 +1,10 @@ package com.czg.service.account.service.impl; -import com.mybatisflex.spring.service.impl.ServiceImpl; import com.czg.account.entity.ShopUserFlow; import com.czg.account.service.ShopUserFlowService; import com.czg.service.account.mapper.ShopUserFlowMapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.stereotype.Service; /** * 用户余额流水 服务层实现。 @@ -14,6 +13,6 @@ import org.springframework.stereotype.Service; * @since 2025-02-13 */ @DubboService -public class ShopUserFlowServiceImpl extends ServiceImpl implements ShopUserFlowService{ +public class ShopUserFlowServiceImpl extends ServiceImpl implements ShopUserFlowService { } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java index 5b238a61..13d9db48 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserServiceImpl.java @@ -91,15 +91,14 @@ public class ShopUserServiceImpl extends ServiceImpl i throw new ApiNotPrintException("增减用户余额操作失败"); } - userFlow.setIsCanRefund(0); userFlow.setUserId(userInfo.getUserId()); userFlow.setShopId(userInfo.getShopId()); - userFlow.setAmount(shopUserEditDTO.getMoney()); + userFlow.setAmount(shopUserEditDTO.getType() == 0 ? shopUserEditDTO.getMoney().negate() : shopUserEditDTO.getMoney()); userFlow.setBalance(shopUserEditDTO.getType() == 0 ? userInfo.getAmount().subtract(shopUserEditDTO.getMoney()) : userInfo.getAmount().add(shopUserEditDTO.getMoney())); userFlow.setBizCode(shopUserEditDTO.getBizEnum().getCode()); -// userFlow.setType(shopUserEditDTO.getType() == 0 ? "-" : "+"); userFlow.setRemark(shopUserEditDTO.getRemark()); userFlow.setRelationId(shopUserEditDTO.getRelationId()); + userFlow.setRechargeId(shopUserEditDTO.getRechargeId()); shopUserFlowService.save(userFlow); return userFlow.getId(); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipRefundDTO.java b/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipRefundDTO.java new file mode 100644 index 00000000..b9e609db --- /dev/null +++ b/cash-service/order-service/src/main/java/com/czg/service/order/dto/VipRefundDTO.java @@ -0,0 +1,47 @@ +package com.czg.service.order.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author ww + * @description + */ +@Data +public class VipRefundDTO { + /** + * 店铺id + */ + @NotNull(message = "店铺不能为空") + private Long shopId; + /** + * 店铺用户id + */ + @NotNull(message = "店铺用户不能为空") + private Long shopUserId; + /** + * 退款id 会员流水id tb_shop_user_flow.id + */ + @NotNull(message = "会员流水不能为空") + private Long flowId; + /** + * 退款金额 + */ + private BigDecimal refAmount; + + /** + * 退款原因 + */ + private String remark; + /** + * 超额退款 + */ + private boolean outOfRange; + //现金退款 + private boolean cashRefund; + + + private String platformType; +} diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java index 141d91f4..cd5cd4a3 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/PayService.java @@ -5,6 +5,7 @@ import com.czg.entity.resp.CzgRefundResp; import com.czg.resp.CzgResult; import com.czg.service.order.dto.OrderPayParamDTO; import com.czg.service.order.dto.VipPayParamDTO; +import com.czg.service.order.dto.VipRefundDTO; import java.math.BigDecimal; import java.util.Map; @@ -75,6 +76,16 @@ public interface PayService { */ CzgResult> microPayVip(VipPayParamDTO payParam); + /** + * 退款前校验 + */ + CzgResult> refundVipBefore(VipRefundDTO payParam); + + /** + * 会员退款 + */ + CzgResult refundVip(VipRefundDTO payParam); + /** * 订单退款 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index 082492bc..5773ff94 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -10,6 +10,7 @@ import com.czg.account.service.ShopActivateService; import com.czg.account.service.ShopUserService; import com.czg.config.RabbitPublisher; import com.czg.entity.notify.CzgPayNotifyDTO; +import com.czg.entity.notify.CzgRefundNotifyDTO; import com.czg.enums.ShopUserFlowBizEnum; import com.czg.order.dto.OrderInfoQueryDTO; import com.czg.order.entity.OrderDetail; @@ -33,6 +34,7 @@ import jakarta.annotation.Resource; import jakarta.validation.constraints.NotBlank; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -97,7 +99,7 @@ public class OrderInfoServiceImpl extends ServiceImpl> refundVipBefore(VipRefundDTO payParam) { + Map resultMap = new HashMap<>(5); + ShopUser shopUser = shopUserService.getById(payParam.getShopUserId()); + AssertUtil.isNull(shopUser, "该店铺用户不存在"); + ShopUserFlow inFlow = userFlowService.queryChain().select(ShopUserFlow::getAmount) + .eq(ShopUserFlow::getId, payParam.getFlowId()).one(); + AssertUtil.isNull(inFlow, "充值记录不存在"); + ShopUserFlow giftFlow = userFlowService.queryChain().select(ShopUserFlow::getAmount) + .eq(ShopUserFlow::getRelationId, payParam.getFlowId()) + .eq(ShopUserFlow::getBizCode, ShopUserFlowBizEnum.AWARD_IN.getCode()) + .one(); + resultMap.put("amount", shopUser.getAmount()); + resultMap.put("inAmount", inFlow.getAmount( )); + resultMap.put("inRefundAmount", inFlow.getRefundAmount()); + resultMap.put("giftAmount", giftFlow == null ? BigDecimal.ZERO : giftFlow.getAmount()); + resultMap.put("giftRefundAmount", giftFlow == null ? BigDecimal.ZERO : giftFlow.getRefundAmount()); + return CzgResult.success(resultMap); + } + + @Override + public CzgResult refundVip(VipRefundDTO refPayParam) { + ShopUser shopUser = shopUserService.getById(refPayParam.getShopUserId()); + ShopUserFlow inFlow = userFlowService.queryChain().select(ShopUserFlow::getAmount) + .eq(ShopUserFlow::getId, refPayParam.getFlowId()).one(); + AssertUtil.isNull(inFlow, "充值记录不存在"); + ShopUserFlow giftFlow = userFlowService.queryChain().select(ShopUserFlow::getAmount) + .eq(ShopUserFlow::getRelationId, refPayParam.getFlowId()) + .eq(ShopUserFlow::getBizCode, ShopUserFlowBizEnum.AWARD_IN.getCode()) + .one(); + + if ((inFlow.getAmount().subtract(inFlow.getRefundAmount())).compareTo(refPayParam.getRefAmount()) < 0) { + return CzgResult.failure("退款失败,退款金额不可大于可退金额"); + } + //用户余额减去赠送金额 小于 退款金额 则需要勾选 超额退款 + if (giftFlow != null) { + if (shopUser.getAmount().subtract(giftFlow.getAmount().subtract(giftFlow.getRefundAmount())).compareTo(refPayParam.getRefAmount()) < 0 && !refPayParam.isOutOfRange()) { + return CzgResult.failure("超额退款,请勾选 超额退款后重试"); + } + } else { + if (shopUser.getAmount().compareTo(refPayParam.getRefAmount()) < 0 && !refPayParam.isOutOfRange()) { + return CzgResult.failure("超额退款,请勾选 超额退款后重试"); + } + } + Long refPaymentId = null; + if (!refPayParam.isCashRefund()) { + OrderPayment payment = null; + if (inFlow.getRelationId() != null) { + payment = paymentService.getById(inFlow.getRelationId()); + } else { + return CzgResult.failure("退款失败,该充值记录不存在"); + } + String refPayOrderNo = "REF" + refPayParam.getPlatformType() + IdUtil.getSnowflakeNextId(); + refPaymentId = initOrderPayment(new OrderPayment(refPayParam.getShopId(), refPayParam.getShopUserId(), + "memberRefund", refPayOrderNo, null, refPayParam.getRefAmount())); + CzgResult res = refund(refPayParam.getShopId(), new CzgRefundReq(refPayOrderNo, refPayParam.getRemark(), + refPayParam.getRefAmount().multiply(MONEY_RATE).longValue(), payment.getOrderNo(), "")); + if (res.getCode() != 200 || res.getData() == null) { + return CzgResult.failure(res.getMsg()); + } + } else { + ShopUserMoneyEditDTO shopUserMoneyEditDTO = ShopUserMoneyEditDTO.builder() + .id(shopUser.getId()) + .money(refPayParam.getRefAmount()) + .type(0) + .remark("退款") + .bizEnum(ShopUserFlowBizEnum.RECHARGE_REFUND) + .relationId(refPaymentId) + .rechargeId(inFlow.getId()) + .build(); + //更新会员余额 并生成流水 + shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO); + + userFlowService.updateChain() + .setRaw(ShopUserFlow::getRefundAmount, "refund_amount" + refPayParam.getRefAmount()) + .eq(ShopUserFlow::getId, inFlow.getId()) + .update(); + if (giftFlow != null) { + userFlowService.updateChain() + .setRaw(ShopUserFlow::getRefundAmount, "refund_amount" + giftFlow.getAmount()) + .eq(ShopUserFlow::getId, giftFlow.getId()) + .update(); + } + inRecordService.updateChain() + .set(ShopActivateInRecord::getOverNum, 0) + .eq(ShopActivateInRecord::getId, inFlow.getId()) + .update(); + } + return CzgResult.success(); + } @Override @Transactional From a6c0143d29223c236eacfd98b201ae0c962942c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 19 Feb 2025 17:31:39 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=BA=97=E9=93=BA=E8=A3=85=E4=BF=AE?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/ShopExtendController.java | 51 ++++++++++++ .../czg/account/dto/extend/ShopExtendDTO.java | 42 ++++++++++ .../com/czg/account/entity/ShopExtend.java | 78 +++++++++++++++++++ .../account/service/ShopExtendService.java | 17 ++++ .../account/mapper/ShopExtendMapper.java | 14 ++++ .../service/impl/ShopExtendServiceImpl.java | 33 ++++++++ .../resources/mapper/ShopExtendMapper.xml | 7 ++ .../src/main/java/com/czg/Main.java | 2 +- 8 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 cash-api/account-server/src/main/java/com/czg/controller/admin/ShopExtendController.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/dto/extend/ShopExtendDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopExtend.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopExtendService.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopExtendMapper.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopExtendServiceImpl.java create mode 100644 cash-service/account-service/src/main/resources/mapper/ShopExtendMapper.xml diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopExtendController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopExtendController.java new file mode 100644 index 00000000..8b65e8ec --- /dev/null +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopExtendController.java @@ -0,0 +1,51 @@ +package com.czg.controller.admin; + +import cn.hutool.core.util.StrUtil; +import com.czg.account.dto.extend.ShopExtendDTO; +import com.czg.account.entity.ShopExtend; +import com.czg.account.service.ShopExtendService; +import com.czg.annotation.SaAdminCheckPermission; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.mybatisflex.core.query.QueryWrapper; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 店铺拓展配置/装修 + * @author Administrator + */ +@RestController +@RequestMapping("/admin/shopExtend") +public class ShopExtendController { + @Resource + private ShopExtendService shopExtendService; + + /** + * 获取当前店铺拓展参数 + * @param autoKey key名称 + * @return 参数列表 + */ + @SaAdminCheckPermission(value = "shopExtend:list", name = "店铺拓展参数列表") + @GetMapping + public CzgResult> list(String autoKey) { + QueryWrapper queryWrapper = new QueryWrapper().eq(ShopExtend::getShopId, StpKit.USER.getShopId()); + if (StrUtil.isNotBlank(autoKey)) { + queryWrapper.eq(ShopExtend::getAutoKey, autoKey); + } + return CzgResult.success(shopExtendService.list(queryWrapper)); + } + + /** + * 店铺拓展参数修改 + * @return 是否成功 + */ + @SaAdminCheckPermission(value = "shopExtend:edit", name = "店铺拓展参数修改") + @PutMapping + public CzgResult edit(@RequestBody @Validated ShopExtendDTO shopExtendDTO) { + return CzgResult.success(shopExtendService.edit(StpKit.USER.getShopId(), shopExtendDTO)); + } +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/extend/ShopExtendDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/extend/ShopExtendDTO.java new file mode 100644 index 00000000..2a7fbecc --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/extend/ShopExtendDTO.java @@ -0,0 +1,42 @@ + +package com.czg.account.dto.extend; + +import com.alibaba.fastjson2.annotation.JSONField; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 店铺扩展信息 实体类。 + * + * @author zs + * @since 2025-02-19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShopExtendDTO { + + /** + * 自增id + */ + @NotNull + private String autokey; + + /** + * 值 + */ + @NotEmpty + private String value; + + + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopExtend.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopExtend.java new file mode 100644 index 00000000..2b0975e2 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopExtend.java @@ -0,0 +1,78 @@ +package com.czg.account.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.time.LocalDateTime; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 店铺扩展信息 实体类。 + * + * @author zs + * @since 2025-02-19 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("tb_shop_extend") +public class ShopExtend implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 自增id + */ + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 商户Id + */ + private Integer shopId; + + /** + * img:图片;text:文本; + */ + private String type; + + /** + * 描述 + */ + private String name; + + /** + * 自定义key + */ + private String autoKey; + + /** + * 值 + */ + private String value; + + /** + * 更新时间 + */ + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + private String detail; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopExtendService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopExtendService.java new file mode 100644 index 00000000..21e25bbd --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopExtendService.java @@ -0,0 +1,17 @@ +package com.czg.account.service; + +import com.czg.account.dto.extend.ShopExtendDTO; +import com.mybatisflex.core.service.IService; +import com.czg.account.entity.ShopExtend; + +/** + * 店铺扩展信息 服务层。 + * + * @author zs + * @since 2025-02-19 + */ +public interface ShopExtendService extends IService { + + Boolean edit(Long shopId, ShopExtendDTO shopExtendDTO); + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopExtendMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopExtendMapper.java new file mode 100644 index 00000000..f6b25e86 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopExtendMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.account.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.account.entity.ShopExtend; + +/** + * 店铺扩展信息 映射层。 + * + * @author zs + * @since 2025-02-19 + */ +public interface ShopExtendMapper extends BaseMapper { + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopExtendServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopExtendServiceImpl.java new file mode 100644 index 00000000..176bb022 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopExtendServiceImpl.java @@ -0,0 +1,33 @@ +package com.czg.service.account.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.czg.account.dto.extend.ShopExtendDTO; +import com.czg.exception.ApiNotPrintException; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.account.entity.ShopExtend; +import com.czg.account.service.ShopExtendService; +import com.czg.service.account.mapper.ShopExtendMapper; +import org.springframework.stereotype.Service; + +/** + * 店铺扩展信息 服务层实现。 + * + * @author zs + * @since 2025-02-19 + */ +@Service +public class ShopExtendServiceImpl extends ServiceImpl implements ShopExtendService{ + + @Override + public Boolean edit(Long shopId, ShopExtendDTO shopExtendDTO) { + ShopExtend shopExtend = queryChain().eq(ShopExtend::getShopId, shopId).eq(ShopExtend::getAutoKey, shopExtendDTO.getAutokey()).one(); + if (shopExtend == null) { + throw new ApiNotPrintException("key有误"); + } + + BeanUtil.copyProperties(shopExtendDTO, shopExtend); + shopExtend.setAutoKey(null); + return update(shopExtend, new QueryWrapper().eq(ShopExtend::getShopId, shopId).eq(ShopExtend::getAutoKey, shopExtendDTO.getAutokey())); + } +} diff --git a/cash-service/account-service/src/main/resources/mapper/ShopExtendMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopExtendMapper.xml new file mode 100644 index 00000000..3702399d --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/ShopExtendMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/cash-service/code-generator/src/main/java/com/czg/Main.java b/cash-service/code-generator/src/main/java/com/czg/Main.java index 77f751e0..21bcd3e0 100644 --- a/cash-service/code-generator/src/main/java/com/czg/Main.java +++ b/cash-service/code-generator/src/main/java/com/czg/Main.java @@ -28,7 +28,7 @@ public class Main { // String packageName = "product"; // String packageName = "order"; - String tableName = "tb_shop_table_code"; + String tableName = "tb_shop_extend"; String author = "zs"; //是否生成DTO实体 默认生成 boolean isGenerateDto = true;