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 new file mode 100644 index 00000000..e0ce6d03 --- /dev/null +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopUserController.java @@ -0,0 +1,70 @@ +package com.czg.controller.admin; + +import com.czg.account.dto.shopuser.ShopUserEditDTO; +import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; +import com.czg.account.dto.shopuser.ShopUserSummaryDTO; +import com.czg.account.entity.ShopUser; +import com.czg.account.service.ShopUserService; +import com.czg.annotation.SaAdminCheckPermission; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.mybatisflex.core.paginate.Page; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 店铺用户管理 + * @author Administrator + */ +@RestController +@RequestMapping("/admin/shopUser") +public class ShopUserController { + + @Resource + private ShopUserService shopUserService; + + /** + * 获取店铺用户概述信息 + * @param isVip 0 非vip 1 vip + * @return 概述信息 + */ + @SaAdminCheckPermission("shopUser:summary") + @GetMapping("/summary") + public CzgResult summary(Integer isVip) { + return CzgResult.success(shopUserService.getSummary(StpKit.USER.getShopId(), isVip)); + } + + /** + * 获取店铺用户列表 + * @param key 昵称或手机号 + * @param isVip 0 非vip 1 vip + * @return 用户列表 + */ + @SaAdminCheckPermission("shopUser:list") + @GetMapping + public CzgResult> list(String key, Integer isVip) { + return CzgResult.success(shopUserService.getPage(key, isVip)); + } + + /** + * 店铺用户信息修改 + * @return 是否成功 + */ + @SaAdminCheckPermission("shopUser:edit") + @PutMapping + public CzgResult edit(@RequestBody @Validated ShopUserEditDTO shopUserEditDTO) { + return CzgResult.success(shopUserService.updateInfo(StpKit.USER.getShopId(), shopUserEditDTO)); + } + + /** + * 店铺用户余额修改 + * @return 是否成功 + */ + @SaAdminCheckPermission("shopUser:editFlow") + @PutMapping("/money") + public CzgResult editMoney(@RequestBody @Validated ShopUserMoneyEditDTO shopUserMoneyEditDTO) { + return CzgResult.success(shopUserService.updateMoney(StpKit.USER.getShopId(), shopUserMoneyEditDTO)); + } + +} 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 new file mode 100644 index 00000000..811615e0 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/flow/ShopUserFlowDTO.java @@ -0,0 +1,59 @@ + +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 lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 用户余额流水 实体类。 + * + * @author zs + * @since 2025-02-13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShopUserFlowDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + + private Long userId; + + private Long shopId; + + private BigDecimal amount; + + private BigDecimal balance; + + /** + * 类型:cashIn 会员充值,awardIn 充值奖励,wechatIn 微信小程序充值,alipayIn 支付宝小程序充值,orderPay 订单消费,orderRefund 订单退款,rechargeRefund 充值退款 adminOp 管理员手动增减 + */ + private String bizCode; + + /** + * 加减号 + */ + private String type; + + private String remark; + + /** + * 关联订单编号,支付单号,退款单号 + */ + private String relationOrderNo; + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserEditDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserEditDTO.java new file mode 100644 index 00000000..72287e1a --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserEditDTO.java @@ -0,0 +1,28 @@ +package com.czg.account.dto.shopuser; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author Administrator + */ +@Data +public class ShopUserEditDTO { + /** + * 对应shopUserid + */ + @NotNull + private Long id; + /** + * 昵称 + */ + private String nickName; + /** + * 性别 0女 1男 + */ + private Integer sex; + /** + * 生日 + */ + private String birthDay; +} 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 new file mode 100644 index 00000000..dddb13a2 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserMoneyEditDTO.java @@ -0,0 +1,38 @@ +package com.czg.account.dto.shopuser; + +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author Administrator + */ +@Data +public class ShopUserMoneyEditDTO { + /** + * 对应shopUserid + */ + @NotNull + private Long id; + /** + * 0减少 1增加 + */ + @NotNull + private Integer type; + /** + * 浮动金额 + */ + @NotNull + @DecimalMin("0.01") + @DecimalMax("9999") + private BigDecimal money; + /** + * 备注 + */ + private String remark; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserSummaryDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserSummaryDTO.java new file mode 100644 index 00000000..91ebb701 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/shopuser/ShopUserSummaryDTO.java @@ -0,0 +1,15 @@ +package com.czg.account.dto.shopuser; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author Administrator + */ +@Data +public class ShopUserSummaryDTO { + private Integer userTotal; + private Integer chargeTotal; + private BigDecimal balanceTotal; +} 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 59bd3c69..f9d5c9f2 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 @@ -36,6 +36,31 @@ public class ShopUser implements Serializable { @Id(keyType = KeyType.Auto) private Long id; + /** + * 用户头像 + */ + private String headImg; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 电话号码 + */ + private String phone; + + /** + * 会员生日 + */ + private String birthDay; + + /** + * 0-女 1男 + */ + private Integer sex; + /** * 店铺Id */ 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 new file mode 100644 index 00000000..86257860 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopUserFlow.java @@ -0,0 +1,65 @@ +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.math.BigDecimal; +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-13 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("tb_shop_user_flow") +public class ShopUserFlow 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; + + /** + * 类型:cashIn 会员充值,awardIn 充值奖励,wechatIn 微信小程序充值,alipayIn 支付宝小程序充值,orderPay 订单消费,orderRefund 订单退款,rechargeRefund 充值退款 adminOp 管理员手动增减 + */ + private String bizCode; + + /** + * 加减号 + */ + private String type; + + private String remark; + + /** + * 关联订单编号,支付单号,退款单号 + */ + private String relationOrderNo; + + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + +} 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 new file mode 100644 index 00000000..337d20a8 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopUserFlowService.java @@ -0,0 +1,14 @@ +package com.czg.account.service; + +import com.mybatisflex.core.service.IService; +import com.czg.account.entity.ShopUserFlow; + +/** + * 用户余额流水 服务层。 + * + * @author zs + * @since 2025-02-13 + */ +public interface ShopUserFlowService 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 a0e4cf2f..f352776c 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 @@ -1,6 +1,10 @@ package com.czg.account.service; +import com.czg.account.dto.shopuser.ShopUserEditDTO; +import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; +import com.czg.account.dto.shopuser.ShopUserSummaryDTO; import com.czg.account.entity.ShopUser; +import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; /** @@ -11,4 +15,11 @@ import com.mybatisflex.core.service.IService; */ public interface ShopUserService extends IService { + Page getPage(String key, Integer isVip); + + Boolean updateInfo(Long shopId, ShopUserEditDTO shopUserEditDTO); + + Boolean updateMoney(Long shopId, ShopUserMoneyEditDTO shopUserEditDTO); + + ShopUserSummaryDTO getSummary(Long shopId, Integer isVip); } diff --git a/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java b/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java new file mode 100644 index 00000000..05a26f03 --- /dev/null +++ b/cash-common/cash-common-tools/src/main/java/com/czg/enums/ShopUserFlowBizEnum.java @@ -0,0 +1,25 @@ +package com.czg.enums; + +import lombok.Getter; + +/** + * @author Administrator + */ + +@Getter +public enum ShopUserFlowBizEnum { + // 会员充值 + CASH_IN("cashIn"), + AWARD_IN("awardIn"), + WECHAT_IN("wechatIn"), + ALIPAY_IN("alipayIn"), + ORDER_PAY("orderPay"), + ORDER_REFUND("orderRefund"), + RECHARGE_REFUND("rechargeRefund"), + ADMIN_IN("adminIn"); + private final String code; + + ShopUserFlowBizEnum(String code) { + this.code = code; + } +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserFlowMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserFlowMapper.java new file mode 100644 index 00000000..f60f08f1 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserFlowMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.account.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.account.entity.ShopUserFlow; + +/** + * 用户余额流水 映射层。 + * + * @author zs + * @since 2025-02-13 + */ +public interface ShopUserFlowMapper extends BaseMapper { + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java index db7dc3b7..10e954ed 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopUserMapper.java @@ -1,7 +1,13 @@ package com.czg.service.account.mapper; +import com.czg.account.dto.shopuser.ShopUserSummaryDTO; import com.czg.account.entity.ShopUser; import com.mybatisflex.core.BaseMapper; +import com.mybatisflex.core.paginate.Page; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.time.LocalDateTime; /** * 商户储值会员 映射层。 @@ -11,4 +17,11 @@ import com.mybatisflex.core.BaseMapper; */ public interface ShopUserMapper extends BaseMapper { + Page selectPageByKeyAndIsVip(Page objectPage, @Param("key") String key, @Param("isVip") Integer isVip, + @Param("shopId") Long shopId); + + int incrAccount(@Param("shopId") long shopId, @Param("id") Long id, @Param("time") LocalDateTime time, @Param("money") BigDecimal money); + int decrAccount(@Param("shopId") long shopId, @Param("id") Long id, @Param("time") LocalDateTime time, @Param("money") BigDecimal money); + + ShopUserSummaryDTO selectUserSummary(@Param("shopId") Long shopId, @Param("isVip") Integer isVip); } 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 new file mode 100644 index 00000000..9d3b562e --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopUserFlowServiceImpl.java @@ -0,0 +1,18 @@ +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 org.springframework.stereotype.Service; + +/** + * 用户余额流水 服务层实现。 + * + * @author zs + * @since 2025-02-13 + */ +@Service +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 b58da37e..ff8585d5 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 @@ -1,11 +1,26 @@ package com.czg.service.account.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.czg.account.dto.shopuser.ShopUserEditDTO; +import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; +import com.czg.account.dto.shopuser.ShopUserSummaryDTO; import com.czg.account.entity.ShopUser; +import com.czg.account.entity.ShopUserFlow; +import com.czg.account.service.ShopUserFlowService; import com.czg.account.service.ShopUserService; +import com.czg.enums.ShopUserFlowBizEnum; +import com.czg.exception.ApiNotPrintException; +import com.czg.sa.StpKit; import com.czg.service.account.mapper.ShopUserMapper; +import com.czg.utils.PageUtil; +import com.mybatisflex.core.paginate.Page; import com.mybatisflex.spring.service.impl.ServiceImpl; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.math.RoundingMode; + /** * 商户储值会员 服务层实现。 * @@ -14,5 +29,58 @@ import org.springframework.stereotype.Service; */ @Service public class ShopUserServiceImpl extends ServiceImpl implements ShopUserService { + @Resource + private ShopUserFlowService shopUserFlowService; + private ShopUser getUserInfo(Long shopUserId, Long shopId) { + ShopUser shopUser = queryChain().eq(ShopUser::getShopId, shopId).eq(ShopUser::getId, shopUserId).one(); + if (shopUser == null) { + throw new ApiNotPrintException("用户信息不存在"); + } + + return shopUser; + } + + @Override + public Page getPage(String key, Integer isVip) { + return mapper.selectPageByKeyAndIsVip(PageUtil.buildPage(), key, isVip, StpKit.USER.getShopId()); + } + + @Override + public Boolean updateInfo(Long shopId, ShopUserEditDTO shopUserEditDTO) { + ShopUser shopUser = getUserInfo(shopId, shopUserEditDTO.getId()); + BeanUtil.copyProperties(shopUserEditDTO, shopUser); + return updateById(shopUser); + } + + @Override + public Boolean 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; + if (shopUserEditDTO.getType() == 0) { + flag = mapper.decrAccount(shopId, shopUserEditDTO.getId(), DateUtil.date().toLocalDateTime(), shopUserEditDTO.getMoney()); + }else { + flag = mapper.incrAccount(shopId, shopUserEditDTO.getId(), DateUtil.date().toLocalDateTime(), shopUserEditDTO.getMoney()); + } + if (flag == 0) { + throw new ApiNotPrintException("增减用户余额操作失败"); + } + + userFlow.setUserId(userInfo.getUserId()); + userFlow.setShopId(userInfo.getShopId()); + userFlow.setAmount(shopUserEditDTO.getMoney()); + userFlow.setBalance(shopUserEditDTO.getType() == 0 ? userInfo.getAmount().subtract(shopUserEditDTO.getMoney()) : userInfo.getAmount().add(shopUserEditDTO.getMoney())); + userFlow.setBizCode(ShopUserFlowBizEnum.ADMIN_IN.getCode()); + userFlow.setType(shopUserEditDTO.getType() == 0 ? "-" : "+"); + userFlow.setRemark(shopUserEditDTO.getRemark()); + return shopUserFlowService.save(userFlow); + } + + @Override + public ShopUserSummaryDTO getSummary(Long shopId, Integer isVip) { + return mapper.selectUserSummary(shopId, isVip); + } } diff --git a/cash-service/account-service/src/main/resources/mapper/ShopUserFlowMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopUserFlowMapper.xml new file mode 100644 index 00000000..b6f68759 --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/ShopUserFlowMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml index a8368ece..fe6d23fa 100644 --- a/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml +++ b/cash-service/account-service/src/main/resources/mapper/ShopUserMapper.xml @@ -3,5 +3,39 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + update tb_shop_user + set amount=amount + #{money}, + update_time=#{time} + where id = #{id} + and shop_id = #{shopId} + + + update tb_shop_user + set amount=amount - #{money}, + update_time=#{time} + where id = #{id} + and shop_id = #{shopId} + and amount - #{money} >= 0 + + +