From f52355f9be7f130b6f4655c05418d5dc3cbe4d2f Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 13 五月 2026 14:35:32 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java              |   18 ++++++
 server/services/src/main/java/com/doumee/core/constants/Constants.java                |    6 ++
 server/services/db/db_change.sql                                                      |   23 +++++++
 server/services/src/main/java/com/doumee/service/business/MemberService.java          |    4 +
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java |  100 +++++++++++++++++++++++++++++++++
 server/services/src/main/java/com/doumee/dao/business/model/Member.java               |   14 ++--
 server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java  |   12 ++++
 7 files changed, 168 insertions(+), 9 deletions(-)

diff --git a/server/services/db/db_change.sql b/server/services/db/db_change.sql
index 17ff86d..28fc57e 100644
--- a/server/services/db/db_change.sql
+++ b/server/services/db/db_change.sql
@@ -5,6 +5,29 @@
 
 
 -- ============================================================
+-- 2026/05/13 娉ㄥ唽婊″勾璧犻�佷紭鎯犲埜瀹氭椂浠诲姟
+-- ============================================================
+INSERT INTO `system_job` (`JOB_NAME`, `HANDLER`, `CRON`, `WITH_LOG`, `WITH_ASYNC`, `STATUS`, `REMARK`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`)
+VALUES ('娉ㄥ唽婊″勾璧犻�佷紭鎯犲埜', 'registerCouponGiftJob', '0 0 3 * * ?', 1, 0, 1, '鏍规嵁杩愯惀閰嶇疆锛屾煡璇㈡敞鍐屾弧X骞寸殑浼氬憳璧犻�佷紭鎯犲埜', 1, NOW(), 1, NOW(), 0);
+
+-- ============================================================
+-- 2026/05/13 杩愯惀閰嶇疆澧炲姞浼樻儬鍒歌禒閫佽鍒�
+-- ============================================================
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'ORDER_COUPON_ORDER_COUNT', '涓嬪崟璧犻��-璁㈠崟娆℃暟', 0, 0, 1, NOW(), 0);
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'ORDER_COUPON_GIFT_COUNT', '涓嬪崟璧犻��-鑷冲璧犻�佹鏁�', 1, 0, 1, NOW(), 0);
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'ORDER_COUPON_ID', '涓嬪崟璧犻��-浼樻儬鍒窱D', 2, 0, 1, NOW(), 0);
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'REGISTER_COUPON_YEARS', '娉ㄥ唽璧犻��-娉ㄥ唽骞存暟', 3, 0, 1, NOW(), 0);
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'REGISTER_COUPON_GIFT_COUNT', '娉ㄥ唽璧犻��-鑷冲璧犻�佹鏁�', 4, 0, 1, NOW(), 0);
+INSERT INTO `SYSTEM_DICT_DATA` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (105, '', 'REGISTER_COUPON_ID', '娉ㄥ唽璧犻��-浼樻儬鍒窱D', 5, 0, 1, NOW(), 0);
+
+
+-- ============================================================
+-- 2026/05/13 浼氬憳澧炲姞浼樻儬鍒歌禒閫佹鏁板瓧娈�
+-- ============================================================
+ALTER TABLE `member` ADD COLUMN `ORDER_COUPON_GIFT_COUNT` INT DEFAULT 0 COMMENT '涓嬪崟璧犻�佷紭鎯犲埜宸茶禒閫佹鏁�' AFTER `TYPE`;
+ALTER TABLE `member` ADD COLUMN `REGISTER_COUPON_GIFT_COUNT` INT DEFAULT 0 COMMENT '娉ㄥ唽婊″勾璧犻�佷紭鎯犲埜宸茶禒閫佹鏁�' AFTER `ORDER_COUPON_GIFT_COUNT`;
+
+-- ============================================================
 -- 2026/05/13 浼樻儬鍒镐俊鎭〃
 -- ============================================================
 CREATE TABLE `coupon` (
diff --git a/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
index c9a2cdd..e3ac65e 100644
--- a/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
@@ -39,6 +39,12 @@
         dto.setDefaultDeliveryRange(getValue(Constants.OP_DEFAULT_DELIVERY_RANGE));
         dto.setArrivalPickUpTime(getValue(Constants.OP_ARRIVAL_PICK_UP_TIME));
         dto.setOperationRadius(getValue(Constants.OP_OPERATION_RADIUS));
+        dto.setOrderCouponOrderCount(getValue(Constants.OP_ORDER_COUPON_ORDER_COUNT));
+        dto.setOrderCouponGiftCount(getValue(Constants.OP_ORDER_COUPON_GIFT_COUNT));
+        dto.setOrderCouponId(getValue(Constants.OP_ORDER_COUPON_ID));
+        dto.setRegisterCouponYears(getValue(Constants.OP_REGISTER_COUPON_YEARS));
+        dto.setRegisterCouponGiftCount(getValue(Constants.OP_REGISTER_COUPON_GIFT_COUNT));
+        dto.setRegisterCouponId(getValue(Constants.OP_REGISTER_COUPON_ID));
         return dto;
     }
 
@@ -59,6 +65,12 @@
         saveOrUpdate(Constants.OP_DEFAULT_DELIVERY_RANGE, "榛樿閰嶉�佽寖鍥�", dto.getDefaultDeliveryRange());
         saveOrUpdate(Constants.OP_ARRIVAL_PICK_UP_TIME, "鍗冲皢鍒拌揪鍙栦欢鏃堕棿閫氱煡", dto.getArrivalPickUpTime());
 //        saveOrUpdate(Constants.OP_OPERATION_RADIUS, "鍏佽鎿嶄綔鍗婂緞", dto.getOperationRadius());
+        saveOrUpdate(Constants.OP_ORDER_COUPON_ORDER_COUNT, "涓嬪崟璧犻��-璁㈠崟娆℃暟", dto.getOrderCouponOrderCount());
+        saveOrUpdate(Constants.OP_ORDER_COUPON_GIFT_COUNT, "涓嬪崟璧犻��-鑷冲璧犻�佹鏁�", dto.getOrderCouponGiftCount());
+        saveOrUpdate(Constants.OP_ORDER_COUPON_ID, "涓嬪崟璧犻��-浼樻儬鍒窱D", dto.getOrderCouponId());
+        saveOrUpdate(Constants.OP_REGISTER_COUPON_YEARS, "娉ㄥ唽璧犻��-娉ㄥ唽骞存暟", dto.getRegisterCouponYears());
+        saveOrUpdate(Constants.OP_REGISTER_COUPON_GIFT_COUNT, "娉ㄥ唽璧犻��-鑷冲璧犻�佹鏁�", dto.getRegisterCouponGiftCount());
+        saveOrUpdate(Constants.OP_REGISTER_COUPON_ID, "娉ㄥ唽璧犻��-浼樻儬鍒窱D", dto.getRegisterCouponId());
     }
 
     private String getValue(String label) {
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index e14d0a0..de11904 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -108,6 +108,12 @@
     public static final String OP_DEFAULT_DELIVERY_RANGE = "DEFAULT_DELIVERY_RANGE";
     public static final String OP_ARRIVAL_PICK_UP_TIME = "ARRIVAL_PICK_UP_TIME";
     public static final String OP_OPERATION_RADIUS = "OPERATION_RADIUS";
+    public static final String OP_ORDER_COUPON_ORDER_COUNT = "ORDER_COUPON_ORDER_COUNT";
+    public static final String OP_ORDER_COUPON_GIFT_COUNT = "ORDER_COUPON_GIFT_COUNT";
+    public static final String OP_ORDER_COUPON_ID = "ORDER_COUPON_ID";
+    public static final String OP_REGISTER_COUPON_YEARS = "REGISTER_COUPON_YEARS";
+    public static final String OP_REGISTER_COUPON_GIFT_COUNT = "REGISTER_COUPON_GIFT_COUNT";
+    public static final String OP_REGISTER_COUPON_ID = "REGISTER_COUPON_ID";
 
     // 鑺儴浜戞墦鍗版満閰嶇疆
     public static final String XPYUN_CONFIG = "XPYUN_CONFIG";
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Member.java b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
index 296eac4..8774c47 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -154,17 +154,15 @@
     @TableField(exist = false)
     private Integer type;
 
+    @ApiModelProperty(value = "涓嬪崟璧犻�佷紭鎯犲埜宸茶禒閫佹鏁�", example = "0")
+    private Integer orderCouponGiftCount;
+
+    @ApiModelProperty(value = "娉ㄥ唽婊″勾璧犻�佷紭鎯犲埜宸茶禒閫佹鏁�", example = "0")
+    private Integer registerCouponGiftCount;
+
     @ApiModelProperty(value = "澶村儚鍏ㄨ矾寰�")
     @TableField(exist = false)
     private String fullCoverImage;
-
-    @ApiModelProperty(value = "鎺ュ崟鏉冮噸", example = "1")
-    @TableField(exist = false)
-    private Integer level;
-
-    @ApiModelProperty(value = "璺濈", example = "1")
-    @TableField(exist = false)
-    private BigDecimal distance;
 
     @ApiModelProperty(value = "韬唤淇℃伅", example = "1")
     @TableField(exist = false)
diff --git a/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java b/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
index a61acef..dd75bbc 100644
--- a/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/dto/OperationConfigDTO.java
@@ -52,4 +52,22 @@
     @ApiModelProperty(value = "鍏佽鎿嶄綔鍗婂緞(m)", required = true)
     private String operationRadius;
 
+    @ApiModelProperty(value = "涓嬪崟婊娆¤禒閫佷紭鎯犲埜-璁㈠崟娆℃暟")
+    private String orderCouponOrderCount;
+
+    @ApiModelProperty(value = "涓嬪崟婊娆¤禒閫佷紭鎯犲埜-鑷冲璧犻�佹鏁�")
+    private String orderCouponGiftCount;
+
+    @ApiModelProperty(value = "涓嬪崟婊娆¤禒閫佷紭鎯犲埜-璧犻�佷紭鎯犲埜ID")
+    private String orderCouponId;
+
+    @ApiModelProperty(value = "娉ㄥ唽婊骞磋禒閫佷紭鎯犲埜-娉ㄥ唽骞存暟")
+    private String registerCouponYears;
+
+    @ApiModelProperty(value = "娉ㄥ唽婊骞磋禒閫佷紭鎯犲埜-鑷冲璧犻�佹鏁�")
+    private String registerCouponGiftCount;
+
+    @ApiModelProperty(value = "娉ㄥ唽婊骞磋禒閫佷紭鎯犲埜-璧犻�佷紭鎯犲埜ID")
+    private String registerCouponId;
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/MemberService.java b/server/services/src/main/java/com/doumee/service/business/MemberService.java
index 9d57477..fce8f96 100644
--- a/server/services/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/services/src/main/java/com/doumee/service/business/MemberService.java
@@ -187,4 +187,6 @@
      * @return MemberDetailVO
      */
     MemberDetailVO findMemberDetail(Integer id);
-}
+
+    void giftRegisterCoupon();
+}
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index d7fe3f3..e0efcdd 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -3,6 +3,7 @@
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.OperationConfigBiz;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.config.jwt.JwtTokenUtil;
 import com.doumee.config.wx.WxMiniConfig;
@@ -13,15 +14,20 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.CouponMapper;
+import com.doumee.dao.business.MemberCouponMapper;
 import com.doumee.dao.business.OrdersMapper;
 import com.doumee.dao.business.ShopInfoMapper;
 import com.doumee.dao.business.SmsrecordMapper;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Coupon;
+import com.doumee.dao.business.model.MemberCoupon;
 import com.doumee.dao.business.model.Orders;
 import com.doumee.dao.business.model.ShopInfo;
 import com.doumee.dao.business.model.MemberRevenue;
 import com.doumee.dao.business.model.Smsrecord;
 import com.doumee.dao.dto.MemberListQueryDTO;
+import com.doumee.dao.dto.OperationConfigDTO;
 import com.doumee.dao.dto.UpdMobileRequest;
 import com.doumee.dao.dto.WxPhoneRequest;
 import com.doumee.dao.vo.AccountResponse;
@@ -40,6 +46,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import me.chanjar.weixin.common.error.WxErrorException;
 import nonapi.io.github.classgraph.json.Id;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -49,6 +56,7 @@
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -63,6 +71,7 @@
  * @author 姹熻箘韫�
  * @date 2025/07/09 12:00
  */
+@Slf4j
 @Service
 public class MemberServiceImpl implements MemberService {
 
@@ -86,6 +95,15 @@
 
     @Autowired
     private OrdersMapper ordersMapper;
+
+    @Autowired
+    private OperationConfigBiz operationConfigBiz;
+
+    @Autowired
+    private CouponMapper couponMapper;
+
+    @Autowired
+    private MemberCouponMapper memberCouponMapper;
 
 
     @Override
@@ -702,4 +720,86 @@
         );
     }
 
+    @Override
+    public void giftRegisterCoupon() {
+        // 1. 璇诲彇閰嶇疆
+        OperationConfigDTO config = operationConfigBiz.getConfig();
+        String yearsStr = config.getRegisterCouponYears();
+        String maxGiftStr = config.getRegisterCouponGiftCount();
+        String couponIdStr = config.getRegisterCouponId();
+        if (StringUtils.isBlank(yearsStr) || StringUtils.isBlank(maxGiftStr) || StringUtils.isBlank(couponIdStr)) {
+            return;
+        }
+        int configYears = Integer.parseInt(yearsStr);
+        int maxGiftCount = Integer.parseInt(maxGiftStr);
+        int couponId = Integer.parseInt(couponIdStr);
+        if (configYears <= 0 || maxGiftCount <= 0) {
+            return;
+        }
+
+        // 2. 鏍¢獙浼樻儬鍒稿瓨鍦ㄤ笖鍚敤
+        Coupon coupon = couponMapper.selectById(couponId);
+        if (coupon == null || !Constants.equalsInteger(coupon.getIsdeleted(), Constants.ZERO)
+                || !Constants.equalsInteger(coupon.getStatus(), Constants.ZERO)) {
+            return;
+        }
+
+        // 3. 鏌ヨ鎵�鏈夋櫘閫氫細鍛�
+        List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                .eq(Member::getDeleted, Constants.ZERO)
+                .eq(Member::getStatus, Constants.ZERO)
+                .eq(Member::getUserType, Constants.ZERO)
+                .isNotNull(Member::getCreateTime));
+
+        Date now = new Date();
+        long msPerYear = 365L * 24 * 60 * 60 * 1000;
+        int giftedMemberCount = 0;
+
+        for (Member member : members) {
+            int alreadyGifted = member.getRegisterCouponGiftCount() != null ? member.getRegisterCouponGiftCount() : 0;
+            // 宸叉敞鍐屽勾鏁帮紙鍙栨暣锛�
+            int registeredYears = (int) ((now.getTime() - member.getCreateTime().getTime()) / msPerYear);
+            // 搴旇禒閫佹�绘鏁�
+            int shouldGiftTotal = registeredYears / configYears;
+            // 瀹為檯杩橀渶璧犻�佹鏁�
+            int remainGift = Math.min(shouldGiftTotal, maxGiftCount) - alreadyGifted;
+            if (remainGift <= 0) {
+                continue;
+            }
+
+            // 4. 璧犻�佷紭鎯犲埜
+            for (int i = 0; i < remainGift; i++) {
+                MemberCoupon mc = new MemberCoupon();
+                mc.setCouponId(couponId);
+                mc.setMemberId(member.getId());
+                mc.setStatus(Constants.CouponStatus.waitClaim.getKey());
+                // 鎺ㄩ�佸悗棰嗗彇鏈夋晥鏈�
+                Calendar validCal = Calendar.getInstance();
+                validCal.add(Calendar.DAY_OF_MONTH, coupon.getPushDays() != null ? coupon.getPushDays() : 7);
+                mc.setValidDate(validCal.getTime());
+                // 鎷疯礉浼樻儬鍒镐俊鎭�
+                mc.setName(coupon.getName());
+                mc.setInfo(coupon.getInfo());
+                mc.setType(coupon.getType());
+                mc.setLimitPrice(coupon.getLimitPrice());
+                mc.setPrice(coupon.getPrice());
+                mc.setGetMethod(coupon.getGetMethod());
+                mc.setCouponType(coupon.getCouponType());
+                mc.setPushDays(coupon.getPushDays());
+                mc.setValidDays(coupon.getValidDays());
+                mc.setIsdeleted(Constants.ZERO);
+                mc.setCreateDate(now);
+                mc.setEditDate(now);
+                memberCouponMapper.insert(mc);
+            }
+
+            // 5. 鏇存柊浼氬憳宸茶禒閫佹鏁�
+            memberMapper.update(new UpdateWrapper<Member>().lambda()
+                    .set(Member::getRegisterCouponGiftCount, alreadyGifted + remainGift)
+                    .eq(Member::getId, member.getId()));
+            giftedMemberCount++;
+        }
+        log.info("娉ㄥ唽婊″勾璧犻�佷紭鎯犲埜瀹屾垚锛屽叡澶勭悊{}鍚嶄細鍛�", giftedMemberCount);
+    }
+
 }

--
Gitblit v1.9.3