فهرست منبع

添加 hongbao 模块

reghao 1 سال پیش
والد
کامیت
ca2bc580e8

+ 1 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/config/mybatis/SqlSessionConfig.java

@@ -25,6 +25,7 @@ import java.util.Map;
         "cn.reghao.tnb.content.app.chat.db.mapper",
         "cn.reghao.tnb.content.app.exam.db.mapper",
         "cn.reghao.tnb.content.app.mall.db.mapper",
+        "cn.reghao.tnb.content.app.hb.db.mapper",
         "cn.reghao.tnb.content.app.geo.db.mapper"
 },
         sqlSessionFactoryRef = "sqlSessionFactory")

+ 35 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/controller/HongbaoController.java

@@ -0,0 +1,35 @@
+package cn.reghao.tnb.content.app.hb.controller;
+
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.jutil.web.WebResult;
+import cn.reghao.tnb.content.app.hb.model.dto.HongbaoDto;
+import cn.reghao.tnb.content.app.hb.service.HongbaoService;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:28:53
+ */
+@RestController
+@RequestMapping("/api/data/hongbao")
+public class HongbaoController {
+    private final HongbaoService hongbaoService;
+
+    public HongbaoController(HongbaoService hongbaoService) {
+        this.hongbaoService = hongbaoService;
+    }
+
+    @PostMapping(value = "/add", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String addHongbao(@RequestBody @Validated HongbaoDto hongbaoDto) {
+        Result result = hongbaoService.addHongbao(hongbaoDto);
+        return WebResult.result(result);
+    }
+
+    @PostMapping(value = "/get/{hongbaoId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getHongbao(@PathVariable("hongbaoId") Long hongbaoId) {
+        Result result = hongbaoService.getHongbao(hongbaoId);
+        return WebResult.result(result);
+    }
+}

+ 16 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/db/mapper/HongbaoMapper.java

@@ -0,0 +1,16 @@
+package cn.reghao.tnb.content.app.hb.db.mapper;
+
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.tnb.content.app.hb.model.po.Hongbao;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:41:47
+ */
+@Mapper
+public interface HongbaoMapper extends BaseMapper<Hongbao> {
+    void updateHongbaoRemainDecr(@Param("hongbaoId") long hongbaoId);
+    Hongbao findHongbaoById(long hongbaoId);
+}

+ 16 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/db/mapper/HongbaoReceiverMapper.java

@@ -0,0 +1,16 @@
+package cn.reghao.tnb.content.app.hb.db.mapper;
+
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.tnb.content.app.hb.model.po.HongbaoReceiver;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:57:42
+ */
+@Mapper
+public interface HongbaoReceiverMapper extends BaseMapper<HongbaoReceiver> {
+    List<HongbaoReceiver> findByHongbaoId(long hongbaoId);
+}

+ 54 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/model/constant/ReceiverType.java

@@ -0,0 +1,54 @@
+package cn.reghao.tnb.content.app.hb.model.constant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:36:28
+ */
+public enum ReceiverType {
+    Group(1, "群红包"),
+    Single(2, "个人红包");
+
+    private final int code;
+    private final String desc;
+    private static final Map<Integer, ReceiverType> map = new HashMap<>();
+    static {
+        for (ReceiverType type : ReceiverType.values()) {
+            map.put(type.code, type);
+        }
+    }
+
+    ReceiverType(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getName() {
+        return this.name();
+    }
+
+    /**
+     * 提供给 @ValidEnum 调用
+     *
+     * @param
+     * @return
+     * @date 2023-10-11 14:44:42
+     */
+    public int getValue() {
+        return this.code;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static ReceiverType getByCode(int code) {
+        return map.get(code);
+    }
+}

+ 30 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/model/dto/HongbaoDto.java

@@ -0,0 +1,30 @@
+package cn.reghao.tnb.content.app.hb.model.dto;
+
+import cn.reghao.jutil.validator.ValidEnum;
+import cn.reghao.tnb.content.app.hb.model.constant.ReceiverType;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:31:28
+ */
+@NoArgsConstructor
+@Setter
+@Getter
+public class HongbaoDto {
+    @ValidEnum(value = ReceiverType.class, message = "红包接收人不正确")
+    private Integer receiverType;
+    @NotNull
+    private Long receiverId;
+    @NotNull
+    private Double amount;
+    @NotNull
+    private Integer num;
+    @Size(min = 1, max = 20, message = "祝福语不能超过20个字符")
+    private String remark;
+}

+ 43 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/model/po/Hongbao.java

@@ -0,0 +1,43 @@
+package cn.reghao.tnb.content.app.hb.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.hb.model.dto.HongbaoDto;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:41:06
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Setter
+@Getter
+public class Hongbao extends BaseObject<Integer> {
+    private long hongbaoId;
+    private Integer receiverType;
+    private Long receiverId;
+    private Double amount;
+    private Integer num;
+    private Integer remain;
+    private String remark;
+    private long createBy;
+    private LocalDateTime createAt;
+
+    public Hongbao(long hongbaoId, HongbaoDto hongbaoDto) {
+        this.hongbaoId = hongbaoId;
+        this.receiverType = hongbaoDto.getReceiverType();
+        this.receiverId = hongbaoDto.getReceiverId();
+        this.amount = hongbaoDto.getAmount();
+        this.num = hongbaoDto.getNum();
+        this.remain = hongbaoDto.getNum();
+        this.remark = hongbaoDto.getRemark();
+        this.createBy = UserContext.getUser();
+        this.createAt = LocalDateTime.now();
+    }
+}

+ 32 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/model/po/HongbaoReceiver.java

@@ -0,0 +1,32 @@
+package cn.reghao.tnb.content.app.hb.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import cn.reghao.tnb.common.auth.UserContext;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:56:39
+ */
+@NoArgsConstructor
+@Setter
+@Getter
+public class HongbaoReceiver extends BaseObject<Integer> {
+    private long hongbaoId;
+    private Long receiverId;
+    private Double amount;
+    private String remark;
+    private LocalDateTime createAt;
+
+    public HongbaoReceiver(long hongbaoId, double amount) {
+        this.hongbaoId = hongbaoId;
+        this.receiverId = UserContext.getUser();
+        this.amount = amount;
+        this.remark = "";
+        this.createAt = LocalDateTime.now();
+    }
+}

+ 61 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/hb/service/HongbaoService.java

@@ -0,0 +1,61 @@
+package cn.reghao.tnb.content.app.hb.service;
+
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.jutil.tool.id.SnowFlake;
+import cn.reghao.tnb.content.app.hb.db.mapper.HongbaoMapper;
+import cn.reghao.tnb.content.app.hb.db.mapper.HongbaoReceiverMapper;
+import cn.reghao.tnb.content.app.hb.model.dto.HongbaoDto;
+import cn.reghao.tnb.content.app.hb.model.po.Hongbao;
+import cn.reghao.tnb.content.app.hb.model.po.HongbaoReceiver;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author reghao
+ * @date 2024-12-03 14:30:38
+ */
+@Service
+public class HongbaoService {
+    private final SnowFlake idGenerator;
+    private final HongbaoMapper hongbaoMapper;
+    private final HongbaoReceiverMapper hongbaoReceiverMapper;
+
+    public HongbaoService(HongbaoMapper hongbaoMapper, HongbaoReceiverMapper hongbaoReceiverMapper) {
+        this.idGenerator = new SnowFlake(1L, 1L);
+        this.hongbaoMapper = hongbaoMapper;
+        this.hongbaoReceiverMapper = hongbaoReceiverMapper;
+    }
+
+    public Result addHongbao(HongbaoDto hongbaoDto) {
+        long hongbaoId = idGenerator.nextId();
+        Hongbao hongbao = new Hongbao(hongbaoId, hongbaoDto);
+        hongbaoMapper.save(hongbao);
+        return Result.success();
+    }
+
+    public Result getHongbao(long hongbaoId) {
+        Hongbao hongbao = hongbaoMapper.findHongbaoById(hongbaoId);
+        if (hongbao == null) {
+            return Result.fail("not exist");
+        }
+
+        double total = hongbaoReceiverMapper.findByHongbaoId(hongbaoId).stream()
+                .map(HongbaoReceiver::getAmount)
+                .mapToDouble(amount -> amount).sum();
+        double remainAmount = hongbao.getAmount() - total;
+        double currentAmount = getAmount(remainAmount);
+        HongbaoReceiver hongbaoReceiver = new HongbaoReceiver(hongbaoId, currentAmount);
+        saveHongbao(hongbaoReceiver, hongbaoId);
+        return Result.success();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveHongbao(HongbaoReceiver hongbaoReceiver, long hongbaoId) {
+        hongbaoReceiverMapper.save(hongbaoReceiver);
+        hongbaoMapper.updateHongbaoRemainDecr(hongbaoId);
+    }
+
+    private double getAmount(double total) {
+        return total;
+    }
+}

+ 23 - 0
content/content-service/src/main/resources/mapper/hb/HongbaoMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.tnb.content.app.hb.db.mapper.HongbaoMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into hongbao
+        (`hongbao_id`,`receiver_type`,`receiver_id`,`amount`,`num`,`remain`,`remark`,`create_by`,`create_at`)
+        values
+        (#{hongbaoId},#{receiverType},#{receiverId},#{amount},#{num},#{remain},#{remark},#{createBy},#{createAt})
+    </insert>
+
+    <update id="updateHongbaoRemainDecr">
+        update hongbao
+        set remain=if(remain &lt; 1, 0, remain-1)
+        where hongbao_id=#{hongbaoId}
+    </update>
+    
+    <select id="findHongbaoById" resultType="cn.reghao.tnb.content.app.hb.model.po.Hongbao">
+        select *
+        from hongbao
+        where hongbao_id=#{hongbaoId}
+    </select>
+</mapper>

+ 22 - 0
content/content-service/src/main/resources/mapper/hb/HongbaoReceiverMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.reghao.tnb.content.app.hb.db.mapper.HongbaoReceiverMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into hongbao_receiver
+        (`hongbao_id`,`receiver_id`,`amount`,`remark`,`create_at`)
+        values
+        (#{hongbaoId},#{receiverId},#{amount},#{remark},#{createAt})
+    </insert>
+
+    <select id="findById" resultType="cn.reghao.tnb.content.app.hb.model.po.HongbaoReceiver">
+        select *
+        from hongbao_receiver
+        where hongbao_id=#{hongbaoId} and reciever_id=#{receiverId}
+    </select>
+    <select id="findByHongbaoId" resultType="cn.reghao.tnb.content.app.hb.model.po.HongbaoReceiver">
+        select *
+        from hongbao_receiver
+        where hongbao_id=#{hongbaoId}
+    </select>
+</mapper>