diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java index b5533af5..da094974 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*; /** * 店铺用户管理 + * * @author Administrator */ @RestController @@ -28,6 +29,7 @@ public class ShopUserController { /** * 获取店铺用户概述信息 + * * @param isVip 0 非vip 1 vip * @return 概述信息 */ @@ -39,7 +41,8 @@ public class ShopUserController { /** * 获取店铺用户列表 - * @param key 昵称或手机号 + * + * @param key 昵称或手机号 * @param isVip 0 非vip 1 vip * @return 用户列表 */ @@ -51,6 +54,7 @@ public class ShopUserController { /** * 店铺用户信息添加 + * * @return 是否成功 */ @SaAdminCheckPermission("shopUser:add") @@ -61,6 +65,7 @@ public class ShopUserController { /** * 店铺用户信息修改 + * * @return 是否成功 */ @SaAdminCheckPermission("shopUser:edit") @@ -71,13 +76,14 @@ public class ShopUserController { /** * 店铺用户余额修改 + * * @return 是否成功 */ @SaAdminCheckPermission("shopUser:editFlow") @PutMapping("/money") public CzgResult editMoney(@RequestBody @Validated ShopUserMoneyEditDTO shopUserMoneyEditDTO) { shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.ADMIN_IN); - return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getShopId(), shopUserMoneyEditDTO)); + return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getShopId(), shopUserMoneyEditDTO) > 0L); } } diff --git a/cash-api/account-server/src/main/java/com/czg/controller/user/UserShopActivateController.java b/cash-api/account-server/src/main/java/com/czg/controller/user/UserShopActivateController.java index 513ebf3e..1a2ae03a 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/user/UserShopActivateController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/user/UserShopActivateController.java @@ -11,7 +11,8 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; /** - * 店铺充值活动管理 + * 用户店铺充值活动管理 + * * @author ww */ @RestController 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 eb2195d2..e5319b76 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 @@ -27,6 +27,15 @@ public class VipPayController { @Resource private PayService payService; + /** + * 现金充值 + */ + @PostMapping("cashPayVip") + public CzgResult cashPayVip(@Validated @RequestBody VipPayParamDTO payParam) { + payParam.setUserId(StpKit.USER.getLoginIdAsLong()); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); + return payService.cashPayVip(payParam); + } /** * js支付 @@ -36,7 +45,7 @@ public class VipPayController { @PostMapping("jsPayVip") public CzgResult> jsPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { payParam.setUserId(StpKit.USER.getLoginIdAsLong()); - payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); return payService.jsPayVip(ServletUtil.getClientIPByHeader(request), payParam); } @@ -48,7 +57,7 @@ public class VipPayController { @PostMapping("ltPayVip") public CzgResult> ltPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { payParam.setUserId(StpKit.USER.getLoginIdAsLong()); - payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); return payService.ltPayVip(ServletUtil.getClientIPByHeader(request), payParam); } @@ -58,7 +67,7 @@ public class VipPayController { @PostMapping("scanPayVip") public CzgResult> scanPayVip(HttpServletRequest request, @Validated @RequestBody VipPayParamDTO payParam) { payParam.setUserId(StpKit.USER.getLoginIdAsLong()); - payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); return payService.scanPayVip(ServletUtil.getClientIPByHeader(request), payParam); } @@ -69,7 +78,7 @@ public class VipPayController { @PostMapping("microPayVip") public CzgResult> microPayVip(@Validated @RequestBody VipPayParamDTO payParam) { payParam.setUserId(StpKit.USER.getLoginIdAsLong()); - payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(),"platformType")); + payParam.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); return payService.microPayVip(payParam); } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopActivateDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopActivateDTO.java index 436881d0..9cd1a369 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopActivateDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopActivateDTO.java @@ -12,6 +12,7 @@ import lombok.NoArgsConstructor; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -39,12 +40,12 @@ public class ShopActivateDTO implements Serializable { * 充值金额 */ @NotNull(message = "充值金额不能为空", groups = {InsertGroup.class, UpdateGroup.class}) - private Integer amount; + private BigDecimal amount; /** * 赠送金额 */ - private Integer giftAmount; + private BigDecimal giftAmount; /** * 赠送积分 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponDTO.java index ffff1ed3..021112f1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponDTO.java @@ -1,17 +1,18 @@ package com.czg.account.dto; -import java.io.Serializable; -import java.math.BigDecimal; -import java.sql.Time; -import java.time.LocalDateTime; import com.alibaba.fastjson2.annotation.JSONField; -import java.io.Serial; 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.sql.Time; +import java.time.LocalDateTime; + /** * 优惠券 实体类。 * @@ -37,18 +38,12 @@ public class ShopCouponDTO implements Serializable { */ private Integer status; - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - /** * 名称(无意义) */ private String title; - private String shopId; + private Long shopId; /** * 已使用数量 @@ -139,4 +134,11 @@ public class ShopCouponDTO implements Serializable { */ private String editor; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponProductDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponProductDTO.java new file mode 100644 index 00000000..c163a498 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ShopCouponProductDTO.java @@ -0,0 +1,52 @@ + +package com.czg.account.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +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 ww + * @since 2025-02-18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShopCouponProductDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * 活动Id + */ + private Long couponId; + + /** + * 商品id + */ + private Long productId; + + /** + * 数量 + */ + private Integer num; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopActivate.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopActivate.java index f2d6e3ed..c2e18507 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopActivate.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopActivate.java @@ -4,16 +4,16 @@ 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; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + /** * 活动 实体类。 * @@ -38,12 +38,12 @@ public class ShopActivate implements Serializable { /** * 充值金额 */ - private Integer amount; + private BigDecimal amount; /** * 赠送金额 */ - private Integer giftAmount; + private BigDecimal giftAmount; /** * 赠送积分 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCoupon.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCoupon.java index d6011828..32b6cc64 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCoupon.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCoupon.java @@ -1,22 +1,20 @@ package com.czg.account.entity; -import com.alibaba.fastjson2.annotation.JSONField; 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.sql.Time; -import java.time.LocalDateTime; - -import java.io.Serial; - 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.sql.Time; +import java.time.LocalDateTime; + /** * 优惠券 实体类。 * @@ -44,18 +42,12 @@ public class ShopCoupon implements Serializable { */ private Integer status; - @Column(onInsertValue = "now()") - private LocalDateTime createTime; - - @Column(onInsertValue = "now()", onUpdateValue = "now()") - private LocalDateTime updateTime; - /** * 名称(无意义) */ private String title; - private String shopId; + private Long shopId; /** * 已使用数量 @@ -80,7 +72,7 @@ public class ShopCoupon implements Serializable { /** * 有效天数 */ - private Integer validDays; + private Long validDays; /** * 隔多少天生效 @@ -142,4 +134,10 @@ public class ShopCoupon implements Serializable { */ private String editor; + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCouponProduct.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCouponProduct.java new file mode 100644 index 00000000..56041b98 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopCouponProduct.java @@ -0,0 +1,56 @@ +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 lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 活动赠送商品表 实体类。 + * + * @author ww + * @since 2025-02-18 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("tb_shop_coupon_product") +public class ShopCouponProduct implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 活动Id + */ + private Long couponId; + + /** + * 商品id + */ + private Long productId; + + /** + * 数量 + */ + private Integer num; + + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopActivateService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopActivateService.java index 714eea03..a5d6194d 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopActivateService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopActivateService.java @@ -4,6 +4,7 @@ import com.czg.account.dto.ShopActivateDTO; import com.czg.account.entity.ShopActivate; import com.mybatisflex.core.service.IService; +import java.math.BigDecimal; import java.util.List; /** @@ -20,5 +21,13 @@ public interface ShopActivateService extends IService { Boolean edit(ShopActivateDTO activateDTO); + /** + * @param memAmount 充值金额 + * @param relationId 关联Id + * 霸王餐时 订单id + * 充值奖励 的关联id 是tb_shop_user_flow的充值 记录id + * 支付/退款 tb_order_payment.id + */ + void giveActivate(Long shopId, Long vipId, BigDecimal memAmount, Long relationId); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopCouponProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopCouponProductService.java new file mode 100644 index 00000000..cd8f71f9 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopCouponProductService.java @@ -0,0 +1,14 @@ +package com.czg.account.service; + +import com.czg.account.entity.ShopCouponProduct; +import com.mybatisflex.core.service.IService; + +/** + * 活动赠送商品表 服务层。 + * + * @author ww + * @since 2025-02-18 + */ +public interface ShopCouponProductService extends IService { + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserService.java index 1dc513c0..b39aa1e1 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserService.java @@ -17,7 +17,10 @@ public interface ShopUserService extends IService { Boolean updateInfo(Long shopId, ShopUserEditDTO shopUserEditDTO); - Boolean updateMoney(Long shopId, ShopUserMoneyEditDTO shopUserEditDTO); + /** + * 返回流水Id + */ + Long updateMoney(Long shopId, ShopUserMoneyEditDTO shopUserEditDTO); ShopUserSummaryDTO getSummary(Long shopId, Integer isVip); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/vo/CouponProductVo.java b/cash-common/cash-common-service/src/main/java/com/czg/account/vo/CouponProductVo.java new file mode 100644 index 00000000..f638267a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/vo/CouponProductVo.java @@ -0,0 +1,20 @@ +package com.czg.account.vo; + + +import lombok.Data; + +/** + * @author ww + * @description + */ +@Data +public class CouponProductVo { + /** + * 商品id + */ + private Long productId; + /** + * 数量 + */ + private Integer num; +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopCouponProductMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopCouponProductMapper.java new file mode 100644 index 00000000..0b445616 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopCouponProductMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.account.mapper; + +import com.czg.account.entity.ShopCouponProduct; +import com.mybatisflex.core.BaseMapper; + +/** + * 活动赠送商品表 映射层。 + * + * @author ww + * @since 2025-02-18 + */ +public interface ShopCouponProductMapper extends BaseMapper { + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java index d869d401..e73beab7 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopActivateServiceImpl.java @@ -1,15 +1,29 @@ package com.czg.service.account.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson2.JSONObject; import com.czg.account.dto.ShopActivateDTO; +import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; import com.czg.account.entity.ShopActivate; -import com.czg.account.service.ShopActivateService; +import com.czg.account.entity.ShopActivateInRecord; +import com.czg.account.entity.ShopCoupon; +import com.czg.account.entity.ShopCouponProduct; +import com.czg.account.service.*; +import com.czg.account.vo.CouponProductVo; +import com.czg.enums.ShopUserFlowBizEnum; import com.czg.sa.StpKit; import com.czg.service.account.mapper.ShopActivateMapper; import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; /** @@ -21,6 +35,15 @@ import java.util.List; @DubboService public class ShopActivateServiceImpl extends ServiceImpl implements ShopActivateService { + @Resource + private ShopCouponService couponService; + @Resource + private ShopActivateInRecordService inRecordService; + @Resource + private ShopCouponProductService couProductService; + @Resource + private ShopUserService shopUserService; + @Override public List getList() { return queryChain().select() @@ -42,4 +65,106 @@ public class ShopActivateServiceImpl extends ServiceImpl activate.getNum()) { + LocalDateTime start = LocalDateTime.now().with(LocalTime.MIN); + LocalDateTime end = null; + if ("fixed".equals(shopCoupon.getValidityType())) { + //固定时间 + end = LocalDateTimeUtil.offset(start, shopCoupon.getValidDays(), ChronoUnit.DAYS).with(LocalTime.MAX); + } else if ("custom".equals(shopCoupon.getValidityType())) { + //自定义时间 + start = shopCoupon.getValidStartTime(); + end = shopCoupon.getValidEndTime(); + } + List actGiveRecords = new ArrayList<>(); + if (shopCoupon.getType() == 1) { + //满减 + ShopActivateInRecord record = new ShopActivateInRecord(); + record.setVipUserId(vipId); + record.setCouponId(shopCoupon.getId()); + record.setName("满" + shopCoupon.getFullAmount() + "减" + shopCoupon.getDiscountAmount()); + record.setFullAmount(shopCoupon.getFullAmount()); + record.setDiscountAmount(shopCoupon.getDiscountAmount()); + record.setType(1); + record.setNum(activate.getNum()); + record.setOverNum(activate.getNum()); + record.setShopId(shopId); + record.setSourceActId(activate.getId()); + record.setSourceFlowId(relationId); + record.setUseStartTime(start); + record.setUseEndTime(end); + record.setSource("activate"); + record.setCouponJson(getCouponJson(activate, shopCoupon, null)); + actGiveRecords.add(record); + } else if (shopCoupon.getType() == 2) { + List couponProducts = couProductService.queryChain() + .select(ShopCouponProduct::getProductId, ShopCouponProduct::getNum) + .eq(ShopCouponProduct::getCouponId, shopCoupon.getId()) + .listAs(CouponProductVo.class); + //商品券 + for (CouponProductVo actPro : couponProducts) { + ShopActivateInRecord record = new ShopActivateInRecord(); + record.setVipUserId(vipId); + record.setCouponId(shopCoupon.getId()); + record.setName("商品券"); + record.setType(2); + record.setProId(actPro.getProductId()); + record.setNum(actPro.getNum() * activate.getNum()); + record.setOverNum(actPro.getNum() * activate.getNum()); + record.setShopId(shopId); + record.setSourceActId(activate.getId()); + record.setSourceFlowId(relationId); + record.setUseStartTime(start); + record.setUseEndTime(end); + record.setSource("activate"); + record.setCouponJson(getCouponJson(activate, shopCoupon, actPro)); + actGiveRecords.add(record); + } + } + inRecordService.saveBatch(actGiveRecords); + shopCoupon.setLeftNumber(shopCoupon.getLeftNumber() - activate.getNum()); + couponService.updateChain() + .set(ShopCoupon::getLeftNumber, shopCoupon.getLeftNumber() - activate.getNum()) + .eq(ShopCoupon::getId, shopCoupon.getId()) + .update(); + } + } + //赠送金额 + if (activate.getGiftAmount() != null && activate.getGiftAmount().compareTo(BigDecimal.ZERO) > 0) { + ShopUserMoneyEditDTO shopUserMoneyEditDTO = ShopUserMoneyEditDTO.builder() + .id(vipId) + .money(activate.getGiftAmount()) + .type(1) + .remark("充值活动赠送") + .relationId(relationId) + .bizEnum(ShopUserFlowBizEnum.AWARD_IN) + .build(); + //更新会员余额 并生成流水 + shopUserService.updateMoney(shopId, shopUserMoneyEditDTO); + } + } + + + private String getCouponJson(ShopActivate activate, ShopCoupon tbShopCoupon, CouponProductVo couProduct) { + JSONObject result = new JSONObject(); + result.put("activate", JSONObject.toJSONString(activate)); + result.put("coupon", JSONObject.toJSONString(tbShopCoupon)); + if (couProduct != null) { + result.put("couProduct", JSONObject.toJSONString(couProduct)); + } + return result.toJSONString(); + } } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopCouponProductServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopCouponProductServiceImpl.java new file mode 100644 index 00000000..06b075d0 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopCouponProductServiceImpl.java @@ -0,0 +1,18 @@ +package com.czg.service.account.service.impl; + +import com.czg.account.entity.ShopCouponProduct; +import com.czg.account.service.ShopCouponProductService; +import com.czg.service.account.mapper.ShopCouponProductMapper; +import com.mybatisflex.spring.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * 活动赠送商品表 服务层实现。 + * + * @author ww + * @since 2025-02-18 + */ +@Service +public class ShopCouponProductServiceImpl extends ServiceImpl implements ShopCouponProductService { + +} 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 618e099e..362da665 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 @@ -2,7 +2,6 @@ package com.czg.service.account.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.czg.account.dto.shopuser.*; @@ -13,7 +12,6 @@ import com.czg.account.service.ShopUserFlowService; import com.czg.account.service.ShopUserService; import com.czg.account.service.UserInfoService; import com.czg.config.RedisCst; -import com.czg.enums.ShopUserFlowBizEnum; import com.czg.exception.ApiNotPrintException; import com.czg.sa.StpKit; import com.czg.service.RedisService; @@ -21,12 +19,10 @@ import com.czg.service.account.mapper.ShopUserMapper; import com.czg.utils.AssertUtil; import com.czg.utils.PageUtil; import com.mybatisflex.core.paginate.Page; -import com.mybatisflex.core.query.QueryCondition; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; import jakarta.annotation.Resource; import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.stereotype.Service; import java.math.RoundingMode; @@ -77,12 +73,12 @@ public class ShopUserServiceImpl extends ServiceImpl i } @Override - public Boolean updateMoney(Long shopId, ShopUserMoneyEditDTO shopUserEditDTO) { + public Long updateMoney(Long shopId, ShopUserMoneyEditDTO shopUserEditDTO) { shopUserEditDTO.setMoney(shopUserEditDTO.getMoney().setScale(2, RoundingMode.DOWN)); ShopUser userInfo = getUserInfo(shopId, shopUserEditDTO.getId()); ShopUserFlow userFlow = new ShopUserFlow(); - int flag = 0; + int flag; if (shopUserEditDTO.getType() == 0) { flag = mapper.decrAccount(shopId, shopUserEditDTO.getId(), DateUtil.date().toLocalDateTime(), shopUserEditDTO.getMoney()); } else { @@ -100,7 +96,8 @@ public class ShopUserServiceImpl extends ServiceImpl i userFlow.setType(shopUserEditDTO.getType() == 0 ? "-" : "+"); userFlow.setRemark(shopUserEditDTO.getRemark()); userFlow.setRelationId(shopUserEditDTO.getRelationId()); - return shopUserFlowService.save(userFlow); + shopUserFlowService.save(userFlow); + return userFlow.getId(); } @Override diff --git a/cash-service/account-service/src/main/resources/mapper/ShopCouponProductMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopCouponProductMapper.xml new file mode 100644 index 00000000..9d598b8b --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/ShopCouponProductMapper.xml @@ -0,0 +1,7 @@ + + + + + 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 2cdb342c..0d6719be 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 @@ -1,6 +1,7 @@ package com.czg.service.order.service; -import com.czg.entity.resp.*; +import com.czg.entity.resp.CzgBaseResp; +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; @@ -11,6 +12,7 @@ import java.util.Map; /** * 支付 + * * @author ww */ public interface PayService { @@ -39,6 +41,12 @@ public interface PayService { */ CzgResult> microPayOrder(OrderPayParamDTO payParam); + + /** + * 现金充值 + */ + CzgResult cashPayVip(VipPayParamDTO payParam); + /** * js支付 */ @@ -63,7 +71,7 @@ public interface PayService { /** * 订单退款 */ - CzgResult refundOrder(Long shopId, Long orderId,String refundReason,BigDecimal refundAmount); + CzgResult refundOrder(Long shopId, Long orderId, String refundReason, BigDecimal refundAmount); /** 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 b1fb2f25..e7a0177d 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; import com.czg.account.entity.ShopUser; +import com.czg.account.service.ShopActivateService; import com.czg.account.service.ShopUserService; import com.czg.entity.notify.CzgPayNotifyDTO; import com.czg.enums.ShopUserFlowBizEnum; @@ -51,6 +52,8 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByPage(OrderInfoQueryDTO param) { @@ -111,10 +114,12 @@ public class OrderInfoServiceImpl extends ServiceImpl> h5PayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); @@ -67,6 +74,7 @@ public class PayServiceImpl implements PayService { @Override + @Transactional public CzgResult> jsPayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); @@ -80,6 +88,7 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult> ltPayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); @@ -91,6 +100,7 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult> scanPayOrder(@NonNull String clintIp, OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); @@ -102,6 +112,7 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult> microPayOrder(OrderPayParamDTO payParam) { OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId()); AssertUtil.isNull(orderInfo, "订单不存在"); @@ -114,10 +125,37 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional + public CzgResult cashPayVip(VipPayParamDTO payParam) { + ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) + .eq(ShopUser::getUserId, payParam.getUserId()).one(); + AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在"); + if (shopUser.getIsVip().equals(0)) { + shopUserService.updateChain() + .set(ShopUser::getIsVip, 1) + .eq(ShopUser::getId, payParam.getShopId()) + .update(); + } + ShopUserMoneyEditDTO shopUserMoneyEditDTO = ShopUserMoneyEditDTO.builder() + .id(shopUser.getId()) + .money(payParam.getAmount()) + .type(1) + .remark("现金充值") + .bizEnum(ShopUserFlowBizEnum.CASH_IN) + .build(); + //更新会员余额 并生成流水 + Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO); + //会员活动 + shopActivateService.giveActivate(shopUser.getShopId(), shopUser.getId(), payParam.getAmount(), flowId); + return CzgResult.success(); + } + + @Override + @Transactional public CzgResult> jsPayVip(String clintIp, VipPayParamDTO payParam) { ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) - .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); - AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + .eq(ShopUser::getUserId, payParam.getUserId()).one(); + AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在"); AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空"); AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空"); String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); @@ -127,10 +165,11 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult> ltPayVip(String clintIp, VipPayParamDTO payParam) { ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) - .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); - AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + .eq(ShopUser::getUserId, payParam.getUserId()).one(); + AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在"); AssertUtil.isBlank(payParam.getOpenId(), "用户小程序ID不能为空"); AssertUtil.isBlank(payParam.getPayType(), "支付方式不能为空"); String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); @@ -140,10 +179,11 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult> scanPayVip(String clintIp, VipPayParamDTO payParam) { ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) - .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); - AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + .eq(ShopUser::getUserId, payParam.getUserId()).one(); + AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在"); String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, "", payParam.getAmount())); return scanPay(payParam.getShopId(), new CzgScanPayReq(payOrderNo, payParam.getAmount().multiply(MONEY_RATE).longValue(), @@ -151,10 +191,11 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult> microPayVip(VipPayParamDTO payParam) { ShopUser shopUser = shopUserService.queryChain().eq(ShopUser::getShopId, payParam.getShopId()) - .eq(ShopUser::getUserId, payParam.getShopUserId()).one(); - AssertUtil.isNull(shopUser,"充值失败 该店铺用户不存在"); + .eq(ShopUser::getUserId, payParam.getUserId()).one(); + AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在"); AssertUtil.isBlank(payParam.getAuthCode(), "扫描码不能为空"); String payOrderNo = payParam.getPlatformType() + IdUtil.getSnowflakeNextId(); initOrderPayment(new OrderPayment(payParam.getShopId(), shopUser.getId(), "memberIn", payOrderNo, payParam.getAuthCode(), payParam.getAmount())); @@ -164,6 +205,7 @@ public class PayServiceImpl implements PayService { @Override + @Transactional public CzgResult refundOrder(@NonNull Long shopId, @NonNull Long orderId, @NonNull String refundReason, @NonNull BigDecimal refundAmount) { // refund(shopId, new CzgRefundReq("1", refundReason, refundAmount.multiply(MONEY_RATE).longValue(), @@ -172,12 +214,14 @@ public class PayServiceImpl implements PayService { } @Override + @Transactional public CzgResult queryPayOrder(@NonNull Long shopId, String payOrderId, String mchOrderNo) { ShopMerchant shopMerchant = shopMerchantService.getById(shopId); return czgPayService.queryPayOrder(shopMerchant.getAppId(), shopMerchant.getAppSecret(), payOrderId, mchOrderNo); } @Override + @Transactional public CzgResult queryRefund(@NonNull Long shopId, String mchRefundNo, String refundOrderId) { ShopMerchant shopMerchant = shopMerchantService.getById(shopId); return czgPayService.queryRefundOrder(shopMerchant.getAppId(), shopMerchant.getAppSecret(), mchRefundNo, refundOrderId); @@ -250,7 +294,7 @@ public class PayServiceImpl implements PayService { } else if (firstTwoDigits >= 25 && firstTwoDigits <= 30) { //支付宝支付 bizData.setSubAppid(shopMerchant.getAlipaySmallAppid()); - }else { + } else { throw new ValidateException("扫描码非法或暂不支持"); } CzgResult czgScanPayResult = czgPayService.microPay(shopMerchant.getAppId(), shopMerchant.getAppSecret(), bizData);