From e46e620ea7afd8b18aa24dde8e3c9564355fa14f Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期日, 28 九月 2025 15:14:51 +0800
Subject: [PATCH] Merge branch 'send_coupon' into user_action

---
 framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponQuery.java                  |   36 
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java |  419 ++++++++
 framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponSingleQuery.java            |   23 
 framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponSingleVO.java                  |   55 +
 framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java                     |    3 
 framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponSingleService.java               |   67 +
 framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java      |    7 
 framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponForm.java                    |   57 +
 framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponClaimRecordMapper.java            |   34 
 framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java                           |    2 
 framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java                          |    3 
 framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponSingle.java                |   70 +
 framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreCouponClaimRecordDTO.java   |  101 +
 framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java           |   51 
 framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java                      |    2 
 framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java                      |   59 +
 manager-api/src/main/java/cn/lili/controller/lmk/StoreCouponController.java                     |   87 +
 framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java           |  378 ++++---
 framework/src/main/resources/mapper/lmk/StoreCouponClaimRecordMapper.xml                        |  170 +++
 buyer-api/src/main/java/cn/lili/controller/lmk/SupplierController.java                          |    5 
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java            |  267 +++++
 framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java                         |    6 
 framework/src/main/resources/mapper/lmk/StoreCouponSingleMapper.xml                             |   68 +
 framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountByDayAndHourVO.java             |   24 
 framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponClaimRecordVO.java             |  116 ++
 framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java                     |   86 +
 framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java               |   53 
 framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponSingleForm.java              |   58 +
 framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponSingleMapper.java                 |   39 
 framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java        |    2 
 framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponMapper.java                       |   34 
 framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java                 |    2 
 framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java              |    2 
 framework/src/main/java/cn/lili/modules/member/service/MemberService.java                       |    3 
 framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java            |  146 +-
 buyer-api/src/main/java/cn/lili/controller/lmk/MemberController.java                            |    7 
 framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java          |   73 +
 manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java                      |    5 
 framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponClaimRecordForm.java         |   54 +
 framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateCouponStausEnum.java          |   13 
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponSingleServiceImpl.java      |  131 ++
 buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java                  |   33 
 framework/src/main/java/cn/lili/modules/lmk/domain/form/MemberBindStoreForm.java                |   34 
 framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreCouponStausEnum.java             |   14 
 framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponVO.java                        |   47 
 framework/src/main/java/cn/lili/utils/CommonUtil.java                                           |   30 
 framework/src/main/resources/mapper/lmk/StoreCouponMapper.xml                                   |   47 
 framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponClaimRecordQuery.java       |   38 
 framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java              |    2 
 49 files changed, 2,827 insertions(+), 236 deletions(-)

diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/MemberController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/MemberController.java
index b94997b..ed49bfe 100644
--- a/buyer-api/src/main/java/cn/lili/controller/lmk/MemberController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/MemberController.java
@@ -2,6 +2,7 @@
 
 
 import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.MemberBindStoreForm;
 import cn.lili.modules.lmk.domain.form.MemberNickNameForm;
 import cn.lili.modules.member.service.MemberService;
 import io.swagger.annotations.Api;
@@ -30,4 +31,10 @@
     public Result updateMemberNickName(@RequestBody MemberNickNameForm form){
         return memberService.updateMemberNickName(form);
     }
+
+    @PutMapping("/bindMemberAndStore")
+    public Result bindMemberAndStore(@RequestBody MemberBindStoreForm form){
+        return memberService.bindMemberAndStore(form);
+    }
+
 }
diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java
new file mode 100644
index 0000000..dd7c8cd
--- /dev/null
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java
@@ -0,0 +1,33 @@
+package cn.lili.controller.lmk;
+
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.service.CouponVirtualService;
+import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
+import cn.lili.modules.lmk.service.StoreCouponService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Validated
+@RequiredArgsConstructor
+@Api(value = "灏忕▼搴忚喘鐗╁晢鍝侀鍙栦紭鎯犲嵎鎺ュ彛", tags = "灏忕▼搴忚喘鐗╁晢鍝侀鍙栦紭鎯犲嵎鎺ュ彛")
+@RestController
+@RequestMapping("/buyer/lmk/store/coupon")
+public class StoreCouponClaimController {
+    private final StoreCouponClaimRecordService storeCouponClaimRecordService;
+    private final StoreCouponService storeCouponService;
+
+
+    @PostMapping("/{id}")
+    @ApiOperation(value = "棰嗗彇浼樻儬鍗�", notes = "棰嗗彇浼樻儬鍗�")
+    public Result claimCoupon(@PathVariable String id){
+        return storeCouponClaimRecordService.claimCoupon(id);
+    }
+    @GetMapping("/{id}")
+    @ApiOperation(value = "鑾峰彇浼樻儬鍗蜂俊鎭�", notes = "鑾峰彇浼樻儬鍗蜂俊鎭�")
+    public Result getCoupon(@PathVariable String id){
+        return storeCouponService.getCoupon(id);
+    }
+}
diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/SupplierController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/SupplierController.java
index 637d39a..67e65e1 100644
--- a/buyer-api/src/main/java/cn/lili/controller/lmk/SupplierController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/SupplierController.java
@@ -10,6 +10,7 @@
 import cn.lili.modules.member.entity.dos.Clerk;
 import cn.lili.modules.member.service.ClerkService;
 import cn.lili.modules.member.service.StoreLogisticsService;
+import cn.lili.modules.order.order.entity.dos.Order;
 import cn.lili.modules.order.order.entity.dto.PartDeliveryParamsDTO;
 import cn.lili.modules.order.order.entity.dto.SupplierOrderSearchParams;
 import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
@@ -106,6 +107,10 @@
                 orderItem.setImage(cosUtil.getPreviewUrl(image));
             }
         });
+        Order order = orderDetailVO.getOrder();
+        if (StringUtils.isNotBlank(order.getConsigneeDetail())){
+            order.setConsigneeAddressPath(order.getConsigneeAddressPath() + "," + order.getConsigneeDetail());
+        }
         return ResultUtil.data(orderDetailVO);
     }
 
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java
new file mode 100644
index 0000000..03b8b0d
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java
@@ -0,0 +1,59 @@
+package cn.lili.modules.lmk.domain.entity;
+
+import cn.lili.modules.lmk.enums.general.GenerateCouponStausEnum;
+import cn.lili.modules.lmk.enums.general.StoreCouponStausEnum;
+import cn.lili.mybatis.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@TableName("lmk_store_coupon")
+public class StoreCoupon extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField("store_id")
+    /** 搴楅摵id */
+    private Long storeId;
+
+    @TableField("store_name")
+    /** 搴楅摵鍚嶇О */
+    private String storeName;
+
+    @TableField("coupon_id")
+    /** 浼樻儬鍗穒d */
+    private String couponId;
+
+    @TableField("coupon_name")
+    /** 浼樻儬鍗峰悕绉� */
+    private String couponName;
+
+    @TableField("coupon_claim_num")
+    /** 浼樻儬鍗烽鍙栨暟閲� */
+    private Integer couponClaimNum;
+
+    @TableField("coupon_num")
+    /** 浼樻儬鍗风敓鎴愭暟閲� */
+    private Integer couponNum;
+
+    @TableField("status")
+    /** 搴楅摵浼樻儬鍗风姸鎬�
+     * @see StoreCouponStausEnum
+     * */
+    private String status;
+
+    @TableField("generate_status")
+    /** 鐢熸垚浼樻儬鍗风姸鎬�
+     * @see GenerateCouponStausEnum
+     * */
+    private String generateStatus;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java
new file mode 100644
index 0000000..1742de2
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java
@@ -0,0 +1,51 @@
+package cn.lili.modules.lmk.domain.entity;
+
+import cn.lili.mybatis.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@TableName("lmk_store_coupon_claim_record")
+public class StoreCouponClaimRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField("store_name")
+    /** 搴楅摵鍚嶇О */
+    private String storeName;
+
+    @TableField("coupon_id")
+    /** 浼樻儬鍗穒d */
+    private String couponId;
+
+    @TableField("store_coupon_id")
+    /** 搴楅摵浼樻儬鍗峰叧鑱攊d */
+    private String storeCouponId;
+
+    @TableField("coupon_name")
+    /** 浼樻儬鍗峰悕绉� */
+    private String couponName;
+
+    @TableField("store_id")
+    /** 搴楅摵id */
+    private Long storeId;
+
+    @TableField("user_id")
+    /** 鐢ㄦ埛id */
+    private String userId;
+
+
+    @TableField("member_coupon_id")
+    /** 鐢ㄦ埛棰嗗彇浼樻儬鍗穒d
+     * */
+    private String memberCouponId;
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponSingle.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponSingle.java
new file mode 100644
index 0000000..dfefe80
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponSingle.java
@@ -0,0 +1,70 @@
+package cn.lili.modules.lmk.domain.entity;
+
+import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
+import cn.lili.mybatis.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝�
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+@Data
+@TableName("lmk_store_coupon_single")
+public class StoreCouponSingle extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField("store_coup_ref")
+    /** 搴楅摵浼樻儬鍗峰叧鑱攊d */
+    private String storeCoupRef;
+
+    @TableField("store_id")
+    /** 鍟嗗id */
+    private Long storeId;
+
+
+    @TableField("store_name")
+    /** 鍟嗗id */
+    private String storeName;
+
+    @TableField("coupon_id")
+    /** 浼樻儬鍗穒d */
+    private String couponId;
+
+    @TableField("coupon_name")
+    /** 浼樻儬鍗峰悕绉� */
+    private String couponName;
+
+    @TableField("coupon_no")
+    /** 缂栧彿 */
+    private String couponNo;
+
+    @TableField("claim_status")
+    /** 鏄惁棰嗗彇
+     * @see ClaimStatusEnum
+     * */
+    private String claimStatus;
+
+    @TableField("claim_user_id")
+    /** 棰嗗彇鐢ㄦ埛id
+     * */
+    private String claimUserId;
+
+    @TableField("claim_user_name")
+    /** 棰嗗彇鐢ㄦ埛鍚嶇О
+     * */
+    private String claimUserName;
+
+
+    @TableField("member_coupon_id")
+    /** 鐢ㄦ埛棰嗗彇浼樻儬鍗穒d
+     * */
+    private String memberCouponId;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/MemberBindStoreForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/MemberBindStoreForm.java
new file mode 100644
index 0000000..4249cfb
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/MemberBindStoreForm.java
@@ -0,0 +1,34 @@
+package cn.lili.modules.lmk.domain.form;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * lmk-shop-java
+ *
+ * @author : zxl
+ * @date : 2025-09-26 15:05
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberBindStoreForm {
+
+    /**
+     * 缁戝畾鍒嗕韩搴楅摵id
+     */
+    private String shareStoreId;
+
+    /**
+     * 鍒嗕韩鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date shareTime;
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponClaimRecordForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponClaimRecordForm.java
new file mode 100644
index 0000000..f38dc61
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponClaimRecordForm.java
@@ -0,0 +1,54 @@
+package cn.lili.modules.lmk.domain.form;
+
+import cn.lili.group.Update;
+import cn.lili.group.Add;
+import cn.lili.base.AbsForm;
+import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
+import org.springframework.beans.BeanUtils;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import org.springframework.lang.NonNull;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰曡〃鍗�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@ApiModel(value = "StoreCouponClaimRecord琛ㄥ崟", description = "搴楅摵浼樻儬鍗烽鍙栬褰曡〃鍗�")
+public class StoreCouponClaimRecordForm extends AbsForm {
+
+    @NotBlank(message = "搴楅摵鍚嶇О涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵鍚嶇О")
+    private String storeName;
+
+    @NotNull(message = "浼樻儬鍗穒d涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private Long couponId;
+
+    @NotBlank(message = "浼樻儬鍗峰悕绉颁笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    @NotNull(message = "搴楅摵id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    @NotNull(message = "鐢ㄦ埛id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鐢ㄦ埛id")
+    private Long userId;
+
+    public static StoreCouponClaimRecord getEntityByForm(@NonNull StoreCouponClaimRecordForm form, StoreCouponClaimRecord entity) {
+        if(entity == null) {
+          entity = new StoreCouponClaimRecord();
+        }
+        BeanUtils.copyProperties(form, entity);
+        return entity;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponForm.java
new file mode 100644
index 0000000..84ed379
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponForm.java
@@ -0,0 +1,57 @@
+package cn.lili.modules.lmk.domain.form;
+
+import cn.lili.group.Update;
+import cn.lili.group.Add;
+import cn.lili.base.AbsForm;
+import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import com.baomidou.mybatisplus.annotation.TableField;
+import org.springframework.beans.BeanUtils;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import org.springframework.lang.NonNull;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯昏〃鍗�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@ApiModel(value = "StoreCoupon琛ㄥ崟", description = "搴楅摵浼樻儬鍗峰搴斿叧绯昏〃鍗�")
+public class StoreCouponForm extends AbsForm {
+
+    @NotNull(message = "搴楅摵id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    @NotNull(message = "搴楅摵鍚嶇О涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵鍚嶇О")
+    private String storeName;
+
+    @NotNull(message = "浼樻儬鍗穒d涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private String couponId;
+
+    @NotBlank(message = "浼樻儬鍗峰悕绉颁笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    @NotBlank(message = "鐢熸垚浼樻儬鍗锋暟閲忎笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("鐢熸垚浼樻儬鍗锋暟閲�")
+    private Integer couponNum;
+
+
+
+    public static StoreCoupon getEntityByForm(@NonNull StoreCouponForm form, StoreCoupon entity) {
+        if(entity == null) {
+          entity = new StoreCoupon();
+        }
+        BeanUtils.copyProperties(form, entity);
+        return entity;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponSingleForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponSingleForm.java
new file mode 100644
index 0000000..6ae580f
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/StoreCouponSingleForm.java
@@ -0,0 +1,58 @@
+package cn.lili.modules.lmk.domain.form;
+
+import cn.lili.group.Update;
+import cn.lili.group.Add;
+import cn.lili.base.AbsForm;
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import org.springframework.beans.BeanUtils;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import org.springframework.lang.NonNull;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝佽〃鍗�
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+@Data
+@ApiModel(value = "StoreCouponSingle琛ㄥ崟", description = "搴楅摵浼樻儬鍗峰崟鍝佽〃鍗�")
+public class StoreCouponSingleForm extends AbsForm {
+
+    @NotNull(message = "搴楅摵浼樻儬鍗峰叧鑱攊d涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵浼樻儬鍗峰叧鑱攊d")
+    private Long storeCoupRef;
+
+    @NotNull(message = "鍟嗗id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗id")
+    private Long storeId;
+
+    @NotNull(message = "浼樻儬鍗穒d涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private Long couponId;
+
+    @NotBlank(message = "浼樻儬鍗峰悕绉颁笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    @NotBlank(message = "缂栧彿涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("缂栧彿")
+    private String couponNo;
+
+    @NotBlank(message = "鏄惁棰嗗彇涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鏄惁棰嗗彇")
+    private String claimStatus;
+
+    public static StoreCouponSingle getEntityByForm(@NonNull StoreCouponSingleForm form, StoreCouponSingle entity) {
+        if(entity == null) {
+          entity = new StoreCouponSingle();
+        }
+        BeanUtils.copyProperties(form, entity);
+        return entity;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponClaimRecordQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponClaimRecordQuery.java
new file mode 100644
index 0000000..271ee7f
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponClaimRecordQuery.java
@@ -0,0 +1,38 @@
+package cn.lili.modules.lmk.domain.query;
+
+import cn.lili.base.AbsQuery;
+import java.util.List;
+import org.springframework.lang.NonNull;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰曟煡璇�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@ApiModel(value = "StoreCouponClaimRecord鏌ヨ鍙傛暟", description = "搴楅摵浼樻儬鍗烽鍙栬褰曟煡璇㈠弬鏁�")
+public class StoreCouponClaimRecordQuery extends AbsQuery {
+
+    private String sort;
+
+    private String order;
+
+    private String getType;
+
+    private Long startTime;
+
+    private Long endTime;
+
+    private String memberCouponStatus;
+
+    private String memberName;
+
+    private String couponName;
+}
+
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponQuery.java
new file mode 100644
index 0000000..01adc5d
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponQuery.java
@@ -0,0 +1,36 @@
+package cn.lili.modules.lmk.domain.query;
+
+import cn.lili.base.AbsQuery;
+import java.util.List;
+
+import cn.lili.modules.lmk.enums.general.GenerateCouponStausEnum;
+import cn.lili.modules.lmk.enums.general.StoreCouponStausEnum;
+import org.springframework.lang.NonNull;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯绘煡璇�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@ApiModel(value = "StoreCoupon鏌ヨ鍙傛暟", description = "搴楅摵浼樻儬鍗峰搴斿叧绯绘煡璇㈠弬鏁�")
+public class StoreCouponQuery extends AbsQuery {
+    /** 搴楅摵id */
+    private Long storeId;
+    /** 搴楅摵浼樻儬鍗风姸鎬�
+     * @see StoreCouponStausEnum
+     * */
+    private String status;
+    /** 鐢熸垚浼樻儬鍗风姸鎬�
+     * @see GenerateCouponStausEnum
+     * */
+    private String generateStatus;
+
+}
+
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponSingleQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponSingleQuery.java
new file mode 100644
index 0000000..47a4d9f
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/StoreCouponSingleQuery.java
@@ -0,0 +1,23 @@
+package cn.lili.modules.lmk.domain.query;
+
+import cn.lili.base.AbsQuery;
+import java.util.List;
+import org.springframework.lang.NonNull;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝佹煡璇�
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+@Data
+@ApiModel(value = "StoreCouponSingle鏌ヨ鍙傛暟", description = "搴楅摵浼樻儬鍗峰崟鍝佹煡璇㈠弬鏁�")
+public class StoreCouponSingleQuery extends AbsQuery {
+    private String refId;
+}
+
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountByDayAndHourVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountByDayAndHourVO.java
new file mode 100644
index 0000000..31fe655
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountByDayAndHourVO.java
@@ -0,0 +1,24 @@
+package cn.lili.modules.lmk.domain.vo;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * lmk-shop-java
+ * 涓嬭鍗曟椂闂存缁熻瀵硅薄
+ * @author : zxl
+ * @date : 2025-09-26 09:21
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderCountByDayAndHourVO {
+
+    private Long orderCount;
+
+    private String day;
+
+    private String hour;
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponClaimRecordVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponClaimRecordVO.java
new file mode 100644
index 0000000..c50d499
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponClaimRecordVO.java
@@ -0,0 +1,116 @@
+package cn.lili.modules.lmk.domain.vo;
+
+import cn.lili.base.AbsVo;
+import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.lang.NonNull;
+import org.springframework.beans.BeanUtils;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰曞睍绀�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@ApiModel(value = "搴楅摵浼樻儬鍗烽鍙栬褰曞搷搴旀暟鎹�", description = "搴楅摵浼樻儬鍗烽鍙栬褰曞搷搴旀暟鎹�")
+public class StoreCouponClaimRecordVO extends AbsVo {
+
+    /** 搴楅摵鍚嶇О */
+    @ApiModelProperty("搴楅摵鍚嶇О")
+    private String storeName;
+
+    /** 浼樻儬鍗穒d */
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private Long couponId;
+
+    /** 浼樻儬鍗峰悕绉� */
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    /** 搴楅摵id */
+    @ApiModelProperty("搴楅摵id")
+    private String storeId;
+
+    /** 鐢ㄦ埛id */
+    @ApiModelProperty("鐢ㄦ埛id")
+    private String userId;
+
+
+    @ApiModelProperty("搴楅摵浼樻儬鍒稿叧鑱擨D")
+    private String storeCouponId;
+
+    @ApiModelProperty("鍒涘缓鑰�")
+    private String createBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @ApiModelProperty("淇敼鑰�")
+    private String updateBy;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    @ApiModelProperty("鍒犻櫎鏍囧織")
+    private Boolean deleteFlag;
+
+    // 琛ュ厖浼氬憳浼樻儬鍒歌〃鍏宠仈瀛楁
+    @ApiModelProperty("浼氬憳ID")
+    private String memberId;
+
+    @ApiModelProperty("浼氬憳鍚嶇О")
+    private String memberName;
+
+    @ApiModelProperty("浼樻儬鍒搁潰棰�")
+    private BigDecimal price;
+
+    @ApiModelProperty("浣跨敤璧峰鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    @ApiModelProperty("浣跨敤鎴鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    @ApiModelProperty("浼氬憳浼樻儬鍒哥姸鎬�")
+    private String memberCouponStatus;
+
+    @ApiModelProperty("鍟嗗搧浣跨敤闄愬埗娆℃暟")
+    private Integer goodsUseLimitNum;
+
+    @ApiModelProperty("鏄惁鏄钩鍙颁紭鎯犲埜")
+    private Boolean platformFlag;
+
+    @ApiModelProperty("浼樻儬鍒哥被鍨�")
+    private String getType;
+
+    @ApiModelProperty("鎶樻墸")
+    private BigDecimal discount;
+
+    @ApiModelProperty("娲诲姩绫诲瀷")
+    private String couponType;
+
+    @ApiModelProperty("棰嗗彇鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date claimTime;
+
+    public static StoreCouponClaimRecordVO getVoByEntity(@NonNull StoreCouponClaimRecord entity, StoreCouponClaimRecordVO vo) {
+        if(vo == null) {
+            vo = new StoreCouponClaimRecordVO();
+        }
+        BeanUtils.copyProperties(entity, vo);
+        return vo;
+    }
+
+}
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponSingleVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponSingleVO.java
new file mode 100644
index 0000000..1275bc1
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponSingleVO.java
@@ -0,0 +1,55 @@
+package cn.lili.modules.lmk.domain.vo;
+
+import cn.lili.base.AbsVo;
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import java.util.List;
+import org.springframework.lang.NonNull;
+import org.springframework.beans.BeanUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝佸睍绀�
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+@Data
+@ApiModel(value = "搴楅摵浼樻儬鍗峰崟鍝佸搷搴旀暟鎹�", description = "搴楅摵浼樻儬鍗峰崟鍝佸搷搴旀暟鎹�")
+public class StoreCouponSingleVO extends AbsVo {
+
+    /** 搴楅摵浼樻儬鍗峰叧鑱攊d */
+    @ApiModelProperty("搴楅摵浼樻儬鍗峰叧鑱攊d")
+    private Long storeCoupRef;
+
+    /** 鍟嗗id */
+    @ApiModelProperty("鍟嗗id")
+    private Long storeId;
+
+    /** 浼樻儬鍗穒d */
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private Long couponId;
+
+    /** 浼樻儬鍗峰悕绉� */
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    /** 缂栧彿 */
+    @ApiModelProperty("缂栧彿")
+    private String couponNo;
+
+    /** 鏄惁棰嗗彇 */
+    @ApiModelProperty("鏄惁棰嗗彇")
+    private String claimStatus;
+
+    public static StoreCouponSingleVO getVoByEntity(@NonNull StoreCouponSingle entity, StoreCouponSingleVO vo) {
+        if(vo == null) {
+            vo = new StoreCouponSingleVO();
+        }
+        BeanUtils.copyProperties(entity, vo);
+        return vo;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponVO.java
new file mode 100644
index 0000000..0f47018
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/StoreCouponVO.java
@@ -0,0 +1,47 @@
+package cn.lili.modules.lmk.domain.vo;
+
+import cn.lili.base.AbsVo;
+import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import java.util.List;
+import org.springframework.lang.NonNull;
+import org.springframework.beans.BeanUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯诲睍绀�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Data
+@ApiModel(value = "搴楅摵浼樻儬鍗峰搴斿叧绯诲搷搴旀暟鎹�", description = "搴楅摵浼樻儬鍗峰搴斿叧绯诲搷搴旀暟鎹�")
+public class StoreCouponVO extends AbsVo {
+
+    /** 搴楅摵id */
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    /** 搴楅摵鍚嶇О */
+    @ApiModelProperty("搴楅摵鍚嶇О")
+    private Long storeName;
+
+    /** 浼樻儬鍗穒d */
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private Long couponId;
+
+    /** 浼樻儬鍗峰悕绉� */
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    public static StoreCouponVO getVoByEntity(@NonNull StoreCoupon entity, StoreCouponVO vo) {
+        if(vo == null) {
+            vo = new StoreCouponVO();
+        }
+        BeanUtils.copyProperties(entity, vo);
+        return vo;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateCouponStausEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateCouponStausEnum.java
new file mode 100644
index 0000000..5eda2b4
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/GenerateCouponStausEnum.java
@@ -0,0 +1,13 @@
+package cn.lili.modules.lmk.enums.general;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public enum GenerateCouponStausEnum {
+    NOT_GENERATE("娌℃湁鐢熸垚"),
+    GENERATE("鐢熸垚");
+
+    private String des;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreCouponStausEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreCouponStausEnum.java
new file mode 100644
index 0000000..287ed75
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/StoreCouponStausEnum.java
@@ -0,0 +1,14 @@
+package cn.lili.modules.lmk.enums.general;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+public enum StoreCouponStausEnum {
+    ENABLE("鍚敤"),
+    DISABLE("绂佺敤");
+
+    private String des;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponClaimRecordMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponClaimRecordMapper.java
new file mode 100644
index 0000000..0dfb311
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponClaimRecordMapper.java
@@ -0,0 +1,34 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO;
+import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰� Mapper 鎺ュ彛
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Mapper
+public interface StoreCouponClaimRecordMapper extends BaseMapper<StoreCouponClaimRecord> {
+
+    /**
+     * id鏌ユ壘搴楅摵浼樻儬鍗烽鍙栬褰�
+     * @param id
+     * @return
+     */
+    StoreCouponClaimRecordVO getById(String id);
+
+    /**
+    *  鍒嗛〉
+    */
+    IPage getPage(IPage page, @Param("query") StoreCouponClaimRecordQuery query);
+    List<StoreCouponClaimRecordVO> getExportData(@Param("query") StoreCouponClaimRecordQuery query);
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponMapper.java
new file mode 100644
index 0000000..2d07568
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponMapper.java
@@ -0,0 +1,34 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.lili.modules.lmk.domain.vo.StoreCouponVO;
+import cn.lili.modules.lmk.domain.form.StoreCouponForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯� Mapper 鎺ュ彛
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Mapper
+public interface StoreCouponMapper extends BaseMapper<StoreCoupon> {
+
+    /**
+     * id鏌ユ壘搴楅摵浼樻儬鍗峰搴斿叧绯�
+     * @param id
+     * @return
+     */
+    StoreCouponVO getById(String id);
+
+    /**
+    *  鍒嗛〉
+    */
+    IPage getPage(IPage page, @Param("query") StoreCouponQuery query);
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponSingleMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponSingleMapper.java
new file mode 100644
index 0000000..24b1ac4
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/StoreCouponSingleMapper.java
@@ -0,0 +1,39 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import cn.lili.modules.lmk.domain.vo.StoreCouponSingleVO;
+import cn.lili.modules.lmk.domain.form.StoreCouponSingleForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝� Mapper 鎺ュ彛
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+@Mapper
+public interface StoreCouponSingleMapper extends BaseMapper<StoreCouponSingle> {
+
+    /**
+     * id鏌ユ壘搴楅摵浼樻儬鍗峰崟鍝�
+     * @param id
+     * @return
+     */
+    StoreCouponSingleVO getById(String id);
+
+    /**
+    *  鍒嗛〉
+    */
+    IPage getPage(IPage page, @Param("query") StoreCouponSingleQuery query);
+
+    /**
+     *  鍒嗛〉
+     */
+    IPage getPageByRefId(IPage page, @Param("query") StoreCouponSingleQuery query);
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
new file mode 100644
index 0000000..f2450c6
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
@@ -0,0 +1,73 @@
+package cn.lili.modules.lmk.service;
+
+import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
+import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰� 鏈嶅姟绫�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+public interface StoreCouponClaimRecordService extends IService<StoreCouponClaimRecord> {
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    Result add(StoreCouponClaimRecordForm form);
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    Result update(StoreCouponClaimRecordForm form);
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    Result remove(List<String> ids);
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    Result removeById(String id);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    Result page(StoreCouponClaimRecordQuery query);
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    Result detail(String id);
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    Result all();
+
+    Result claimCoupon(String id);
+
+    void queryExportCoupon(HttpServletResponse response, StoreCouponClaimRecordQuery query);
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java
new file mode 100644
index 0000000..5fb8232
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java
@@ -0,0 +1,86 @@
+package cn.lili.modules.lmk.service;
+
+import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.StoreCouponForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯� 鏈嶅姟绫�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+public interface StoreCouponService extends IService<StoreCoupon> {
+
+    /**
+     * 娣诲姞
+     *
+     * @param form
+     * @return
+     */
+    Result add(StoreCouponForm form);
+
+    /**
+     * 淇敼
+     *
+     * @param form
+     * @return
+     */
+    Result update(StoreCouponForm form);
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param ids
+     * @return
+     */
+    Result remove(List<String> ids);
+
+    /**
+     * id鍒犻櫎
+     *
+     * @param id
+     * @return
+     */
+    Result removeById(String id);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param query
+     * @return
+     */
+    Result page(StoreCouponQuery query);
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     *
+     * @param id
+     * @return
+     */
+    Result detail(String id);
+
+    /**
+     * 鍒楄〃
+     *
+     * @return
+     */
+    Result all();
+
+    Result getCoupon(String id);
+
+    Result addStoreCoupon(StoreCouponForm storeCoupon);
+
+    Result changeStatus(String id);
+
+    Result generateStoreCoupon(String id);
+
+    Result getPageByStoreCoupon(StoreCouponSingleQuery query);
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponSingleService.java b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponSingleService.java
new file mode 100644
index 0000000..3aad1dd
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponSingleService.java
@@ -0,0 +1,67 @@
+package cn.lili.modules.lmk.service;
+
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.StoreCouponSingleForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
+import java.util.List;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝� 鏈嶅姟绫�
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+public interface StoreCouponSingleService extends IService<StoreCouponSingle> {
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    Result add(StoreCouponSingleForm form);
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    Result update(StoreCouponSingleForm form);
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    Result remove(List<String> ids);
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    Result removeById(String id);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    Result page(StoreCouponSingleQuery query);
+
+    Result pageByRefId(StoreCouponSingleQuery query);
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    Result detail(String id);
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    Result all();
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
new file mode 100644
index 0000000..f759752
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
@@ -0,0 +1,419 @@
+package cn.lili.modules.lmk.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.lili.common.exception.ServiceException;
+import cn.lili.common.security.AuthUser;
+import cn.lili.common.security.context.UserContext;
+import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import cn.lili.modules.lmk.enums.general.PrizeStatusEnum;
+import cn.lili.modules.lmk.enums.general.StoreCouponStausEnum;
+import cn.lili.modules.lmk.service.StoreCouponService;
+import cn.lili.modules.lmk.service.StoreCouponSingleService;
+import cn.lili.modules.order.order.entity.dto.CouponExportDetailDTO;
+import cn.lili.modules.order.order.entity.dto.StoreCouponClaimRecordDTO;
+import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
+import cn.lili.modules.promotion.entity.dos.MemberCoupon;
+import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
+import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
+import cn.lili.modules.promotion.service.MemberCouponService;
+import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
+import cn.lili.modules.lmk.mapper.StoreCouponClaimRecordMapper;
+import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
+import cn.lili.base.Result;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
+import cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO;
+import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import cn.lili.utils.PageUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.springframework.util.Assert;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 搴楅摵浼樻儬鍗烽鍙栬褰� 鏈嶅姟瀹炵幇绫�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Service
+@RequiredArgsConstructor
+public class StoreCouponClaimRecordServiceImpl extends ServiceImpl<StoreCouponClaimRecordMapper, StoreCouponClaimRecord> implements StoreCouponClaimRecordService {
+
+    private final StoreCouponClaimRecordMapper storeCouponClaimRecordMapper;
+    private final RedissonClient redissonClient;
+    private static final String STORE_COUPON_CLAIM = "store_coupon_claim:";
+    private final MemberCouponService memberCouponService;
+    private final StoreCouponService storeCouponService;
+    private final StoreCouponSingleService storeCouponSingleService;
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    @Override
+    public Result add(StoreCouponClaimRecordForm form) {
+        StoreCouponClaimRecord entity = StoreCouponClaimRecordForm.getEntityByForm(form, null);
+        baseMapper.insert(entity);
+        return Result.ok("娣诲姞鎴愬姛");
+    }
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    @Override
+    public Result update(StoreCouponClaimRecordForm form) {
+        StoreCouponClaimRecord entity = baseMapper.selectById(form.getId());
+
+        // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
+        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+        BeanUtils.copyProperties(form, entity);
+        baseMapper.updateById(entity);
+        return Result.ok("淇敼鎴愬姛");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @Override
+    public Result remove(List<String> ids) {
+        baseMapper.deleteBatchIds(ids);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @Override
+    public Result removeById(String id) {
+        baseMapper.deleteById(id);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    @Override
+    public Result page(StoreCouponClaimRecordQuery query) {
+        IPage<StoreCouponClaimRecordVO> page = PageUtil.getPage(query, StoreCouponClaimRecordVO.class);
+        baseMapper.getPage(page, query);
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    @Override
+    public Result detail(String id) {
+        StoreCouponClaimRecordVO vo = baseMapper.getById(id);
+        Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
+        return Result.ok().data(vo);
+    }
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    @Override
+    public Result all() {
+        List<StoreCouponClaimRecord> entities = baseMapper.selectList(null);
+        List<StoreCouponClaimRecordVO> vos = entities.stream()
+                .map(entity -> StoreCouponClaimRecordVO.getVoByEntity(entity, null))
+                .collect(Collectors.toList());
+        return Result.ok().data(vos);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result claimCoupon(String id) {
+        AuthUser currentUser = UserContext.getCurrentUser();
+        if (currentUser == null) {
+            throw new ServiceException("褰撳墠鐢ㄦ埛娌℃湁鐧诲綍鏃犳硶棰嗗彇");
+        }
+        String userId = currentUser.getId();
+        String nickName = currentUser.getNickName();
+
+        //閿佷綇绀煎搧鐮乮d
+        RLock redissonLock = redissonClient.getLock(STORE_COUPON_CLAIM + id);
+        try {
+            redissonLock.lock();
+            LambdaQueryWrapper<StoreCouponSingle> forUpdate = Wrappers.<StoreCouponSingle>lambdaQuery()
+                    .eq(StoreCouponSingle::getId, id).last("FOR UPDATE");
+            StoreCouponSingle storeCouponSingle = storeCouponSingleService.getOne(forUpdate);
+            if (storeCouponSingle == null) {
+                throw new ServiceException("褰撳墠绀煎搧鐮佷笉瀛樺湪");
+            }
+            if (!ClaimStatusEnum.NOT_CLAIM.name().equals(storeCouponSingle.getClaimStatus())) {
+                throw new ServiceException("褰撳墠绀煎搧鐮佺姸鎬佸紓甯�");
+            }
+            LambdaQueryWrapper<StoreCouponSingle> claimListQuery = Wrappers.<StoreCouponSingle>lambdaQuery()
+                    .eq(StoreCouponSingle::getClaimUserId, userId)
+                    .eq(StoreCouponSingle::getStoreCoupRef, storeCouponSingle.getStoreCoupRef())
+                    .eq(StoreCouponSingle::getClaimStatus, ClaimStatusEnum.CLAIM.name());
+            List<StoreCouponSingle> claimList = storeCouponSingleService.list(claimListQuery);
+            if (!claimList.isEmpty()) {
+                throw new ServiceException("宸茬粡棰嗗彇杩囪绫诲瀷鐨勭ぜ鍝佺爜鏃犳硶棰嗗彇");
+            }
+            //澶勭悊骞傜瓑闂闄愬埗涓�涓敤鎴峰彧鑳借搴楅摵棰嗗彇涓�绉嶄紭鎯犲嵎
+            LambdaQueryWrapper<StoreCouponClaimRecord> memCoupon = Wrappers.<StoreCouponClaimRecord>lambdaQuery()
+                    .eq(StoreCouponClaimRecord::getUserId, userId)
+                    .eq(StoreCouponClaimRecord::getCouponId, storeCouponSingle.getCouponId());
+            List<StoreCouponClaimRecord> list = this.list(memCoupon);
+            if (!list.isEmpty()){
+                throw new ServiceException("褰撳墠鐢ㄦ埛宸茬粡棰嗗彇杩囦簡鏃犳硶鍐嶆棰嗗彇");
+            }
+            //鏇存柊鍗曞搧琚鍙栫殑璁板綍
+            storeCouponSingle.setClaimStatus(ClaimStatusEnum.CLAIM.name());
+            storeCouponSingle.setClaimUserId(userId);
+            storeCouponSingle.setClaimUserName(nickName);
+            //鏍¢獙鏄惁鍦ㄥ崟鍝佸嵎绫婚鍙栬繃
+            LambdaQueryWrapper<StoreCoupon> storeCoupQuery = Wrappers.<StoreCoupon>lambdaQuery()
+                    .eq(StoreCoupon::getId, storeCouponSingle.getStoreCoupRef()).last("FOR UPDATE");
+            StoreCoupon storeCoupon = storeCouponService.getOne(storeCoupQuery);
+            if (storeCoupon == null) {
+                throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗蜂笉瀛樺湪");
+            }
+            if (!StoreCouponStausEnum.ENABLE.name().equals(storeCoupon.getStatus())) {
+                throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗风姸鎬佸紓甯�");
+            }
+            //棰嗗彇瀵瑰簲鐨勪紭鎯犲嵎鍐欏叆璁板綍
+            MemberCoupon memberCoupon = memberCouponService.receiveCoupon(storeCouponSingle.getCouponId(), userId, nickName);
+            String memberCouponId = memberCoupon.getId();
+            storeCouponSingle.setMemberCouponId(memberCouponId);
+            storeCouponSingleService.updateById(storeCouponSingle);
+            StoreCouponClaimRecord storeCouponClaimRecord = getStoreCouponClaimRecord(storeCouponSingle, userId);
+            storeCouponClaimRecord.setMemberCouponId(memberCouponId);
+            this.save(storeCouponClaimRecord);
+            LambdaUpdateWrapper<StoreCoupon> updateStoreCoupon = Wrappers.<StoreCoupon>lambdaUpdate().eq(StoreCoupon::getId, storeCoupon.getId())
+                    .set(StoreCoupon::getCouponClaimNum, storeCoupon.getCouponClaimNum() + 1)
+                    .ge(StoreCoupon::getCouponNum, storeCoupon.getCouponClaimNum() + 1);
+            boolean update = storeCouponService.update(updateStoreCoupon);
+            if (!update) {
+                throw new ServiceException("鏇存柊澶辫触");
+            }
+            //棰嗗彇鎴愬姛杩斿洖浼樻儬鍗穒d鐢ㄤ簬璺宠浆璐墿浣跨敤
+            return Result.ok().data(storeCouponSingle.getCouponId());
+
+        } finally {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    if (redissonLock.isHeldByCurrentThread()) {
+                        redissonLock.unlock();
+                    }
+                }
+                
+                @Override
+                public void afterCompletion(int status) {
+                    // 纭繚鍗充娇鍦ㄤ簨鍔″洖婊氱殑鎯呭喌涓嬩篃鑳介噴鏀鹃攣
+                    if (redissonLock.isHeldByCurrentThread()) {
+                        redissonLock.unlock();
+                    }
+                }
+
+            });
+
+        }
+    }
+    private XSSFWorkbook initCouponExportData(List<StoreCouponClaimRecordVO> list) {
+        // 杞崲VO涓篋TO锛堝鏋淒TO涓嶸O瀛楁涓�鑷达紝鍙洿鎺ヤ娇鐢╒O绠�鍖栦唬鐮侊級
+        List<StoreCouponClaimRecordDTO> dtos = new ArrayList<>();
+        for (StoreCouponClaimRecordVO vo : list) {
+            StoreCouponClaimRecordDTO dto = new StoreCouponClaimRecordDTO();
+            BeanUtil.copyProperties(vo, dto);
+            dtos.add(dto);
+        }
+        System.out.println("-----------------------");
+        System.out.println(dtos);
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        Sheet sheet = workbook.createSheet("浼樻儬鍒搁鍙栬褰�");
+        // 鍒涘缓琛ㄥご
+        Row header = sheet.createRow(0);
+        String[] headers = {
+                "浼氬憳鍚嶇О", "浼樻儬鍒稿悕绉�", "鍙戝竷搴楅摵", "闈㈤/鎶樻墸",
+                 "鑾峰彇鏂瑰紡", "浼氬憳浼樻儬鍒哥姸鎬�", "浼樻儬鍒哥被鍨�",
+                 "浣跨敤璧峰鏃堕棿", "鎴鏃堕棿","棰嗗彇鏃堕棿"
+        };
+        for (int i = 0; i < headers.length; i++) {
+            Cell cell = header.createCell(i);
+            cell.setCellValue(headers[i]);
+        }
+
+        // 濉厖鏁版嵁锛堝鍔犵┖鍊煎鐞嗭紝閬垮厤NPE锛�
+        for (int i = 0; i < dtos.size(); i++) {
+            StoreCouponClaimRecordDTO dto = dtos.get(i);
+            Row row = sheet.createRow(i + 1);
+
+            // 1. 浼氬憳鍚嶇О锛堝彲鑳戒负null锛�
+            row.createCell(0).setCellValue(Objects.nonNull(dto.getMemberName()) ? dto.getMemberName() : "");
+
+            // 2. 浼樻儬鍒稿悕绉帮紙鍙兘涓簄ull锛�
+            row.createCell(1).setCellValue(Objects.nonNull(dto.getCouponName()) ? dto.getCouponName() : "");
+
+            // 3. 鍙戝竷搴楅摵锛堝鐞唒latform鐗规畩鍊硷紝榛樿绌哄瓧绗︿覆锛�
+            String storeName = dto.getStoreName();
+            if ("platform".equals(storeName)) {
+                row.createCell(2).setCellValue("骞冲彴");
+            } else {
+                row.createCell(2).setCellValue(Objects.nonNull(storeName) ? storeName : "");
+            }
+
+            // 4. 闈㈤/鎶樻墸锛堜紭鍏堟樉绀烘姌鎵o紝鍏舵鏄剧ず闈㈤锛岄伩鍏嶈鐩栵級
+            Cell amountCell = row.createCell(3);
+            if (Objects.nonNull(dto.getDiscount())) {
+                amountCell.setCellValue(dto.getDiscount() + "鎶�");
+            } else if (Objects.nonNull(dto.getPrice())) {
+                amountCell.setCellValue(dto.getPrice() + "鍏�"); // 缁熶竴鐢�"鍏�"鏇磋鑼�
+            } else {
+                amountCell.setCellValue(""); // 鍧囦负绌烘椂鏄剧ず绌�
+            }
+
+
+            // 4. 鑾峰彇鏂瑰紡锛堣ˉ鍏呴粯璁ゆ湭鐭ョ姸鎬侊紝瑕嗙洊鎵�鏈夋灇涓惧�硷級
+            String getType = dto.getGetType();
+            String getTypeDesc;
+            switch (getType) {
+                case "FREE":
+                    getTypeDesc = "鍏嶈垂鑾峰彇";
+                    break;
+                case "ACTIVITY":
+                    getTypeDesc = "娲诲姩鑾峰彇";
+                    break;
+                case "INSIDE": // 娉ㄦ剰锛氬師浠g爜lime鏄鑹诧紝瀹為檯鏋氫妇搴斾负INSIDE
+                    getTypeDesc = "鍐呰喘";
+                    break;
+                default:
+                    getTypeDesc = "鏈煡";
+            }
+            row.createCell(4).setCellValue(getTypeDesc);
+
+            // 5. 浼氬憳浼樻儬鍒哥姸鎬侊紙瑕嗙洊鎵�鏈夊彲鑳界姸鎬侊級
+            String status = dto.getMemberCouponStatus();
+            String statusDesc;
+            switch (status) {
+                case "NEW":
+                    statusDesc = "宸查鍙�";
+                    break;
+                case "USED":
+                    statusDesc = "宸蹭娇鐢�";
+                    break;
+                case "EXPIRE":
+                    statusDesc = "宸茶繃鏈�";
+                    break;
+                case "CLOSED":
+                    statusDesc = "宸蹭綔搴�";
+                    break;
+                default:
+                    statusDesc = "鏈煡鐘舵��";
+            }
+            row.createCell(5).setCellValue(statusDesc);
+
+            // 6. 浼樻儬鍒哥被鍨嬶紙琛ュ厖榛樿澶勭悊锛�
+            String couponType = dto.getCouponType();
+            String couponTypeDesc;
+            if ("DISCOUNT".equals(couponType)) {
+                couponTypeDesc = "鎵撴姌";
+            } else if ("PRICE".equals(couponType)) {
+                couponTypeDesc = "鍑忓厤鐜伴噾";
+            } else {
+                couponTypeDesc = "鏈煡绫诲瀷";
+            }
+            row.createCell(6).setCellValue(couponTypeDesc);
+
+
+            // 10. 浣跨敤璧峰鏃堕棿锛堝鐞唍ull锛屾牸寮忓寲鏃堕棿锛�
+            Cell startTimeCell = row.createCell(7);
+            if (Objects.nonNull(dto.getStartTime())) {
+                startTimeCell.setCellValue(DateUtil.formatDateTime(dto.getStartTime()));
+            } else {
+                startTimeCell.setCellValue("");
+            }
+
+            // 11. 鎴鏃堕棿锛堝悓涓婏級
+            Cell endTimeCell = row.createCell(8);
+            if (Objects.nonNull(dto.getEndTime())) {
+                endTimeCell.setCellValue(DateUtil.formatDateTime(dto.getEndTime()));
+            } else {
+                endTimeCell.setCellValue("");
+            }
+            Cell claimTimeCell = row.createCell(9);
+            if (Objects.nonNull(dto.getClaimTime())) {
+                endTimeCell.setCellValue(DateUtil.formatDateTime(dto.getClaimTime()));
+            } else {
+                claimTimeCell.setCellValue("");
+            }
+        }
+
+        return workbook;
+    }
+
+    @Override
+    public void queryExportCoupon(HttpServletResponse response, StoreCouponClaimRecordQuery query) {
+        List<StoreCouponClaimRecordVO> exportData = baseMapper.getExportData(query);
+        XSSFWorkbook workbook = initCouponExportData(exportData);
+
+        try {
+            // 璁剧疆鍝嶅簲澶�
+            String fileName = URLEncoder.encode("浼樻儬鍒搁鍙栬褰�", "UTF-8");
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
+
+            ServletOutputStream out = response.getOutputStream();
+            workbook.write(out);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                workbook.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private static StoreCouponClaimRecord getStoreCouponClaimRecord(StoreCouponSingle storeCouponSingle, String userId) {
+        StoreCouponClaimRecord storeCouponClaimRecord = new StoreCouponClaimRecord();
+        storeCouponClaimRecord.setCouponId(storeCouponSingle.getCouponId());
+        storeCouponClaimRecord.setCouponName(storeCouponSingle.getCouponName());
+        storeCouponClaimRecord.setStoreId(storeCouponSingle.getStoreId());
+        storeCouponClaimRecord.setStoreName(storeCouponSingle.getStoreName());
+        storeCouponClaimRecord.setUserId(userId);
+        storeCouponClaimRecord.setStoreCouponId(storeCouponSingle.getStoreCoupRef());
+        return storeCouponClaimRecord;
+    }
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java
new file mode 100644
index 0000000..0b325d6
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java
@@ -0,0 +1,267 @@
+package cn.lili.modules.lmk.service.impl;
+
+import cn.lili.common.exception.ServiceException;
+import cn.lili.modules.lmk.domain.entity.CouponVirtual;
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
+import cn.lili.modules.lmk.enums.general.GenerateCouponStausEnum;
+import cn.lili.modules.lmk.enums.general.StoreCouponStausEnum;
+import cn.lili.modules.lmk.service.StoreCouponSingleService;
+import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
+import cn.lili.modules.promotion.entity.dos.Coupon;
+import cn.lili.modules.promotion.service.CouponService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import cn.lili.modules.lmk.mapper.StoreCouponMapper;
+import cn.lili.modules.lmk.service.StoreCouponService;
+import cn.lili.base.Result;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.lili.modules.lmk.domain.form.StoreCouponForm;
+import cn.lili.modules.lmk.domain.vo.StoreCouponVO;
+import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import cn.lili.utils.PageUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.springframework.util.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 搴楅摵浼樻儬鍗峰搴斿叧绯� 鏈嶅姟瀹炵幇绫�
+ *
+ * @author peng
+ * @since 2025-09-25
+ */
+@Service
+@RequiredArgsConstructor
+public class StoreCouponServiceImpl extends ServiceImpl<StoreCouponMapper, StoreCoupon> implements StoreCouponService {
+
+    private final StoreCouponMapper storeCouponMapper;
+    private final RedissonClient redissonClient;
+    private static final String STORE_COUPON_GENERATE = "store_coupon_generate:";
+    private final CouponService couponService;
+    private final StoreCouponSingleService storeCouponSingleService;
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    @Override
+    public Result add(StoreCouponForm form) {
+        StoreCoupon entity = StoreCouponForm.getEntityByForm(form, null);
+        baseMapper.insert(entity);
+        return Result.ok("娣诲姞鎴愬姛");
+    }
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    @Override
+    public Result update(StoreCouponForm form) {
+        StoreCoupon entity = baseMapper.selectById(form.getId());
+
+        // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
+        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+        BeanUtils.copyProperties(form, entity);
+        baseMapper.updateById(entity);
+        return Result.ok("淇敼鎴愬姛");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @Override
+    public Result remove(List<String> ids) {
+        baseMapper.deleteBatchIds(ids);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @Override
+    public Result removeById(String id) {
+        baseMapper.deleteById(id);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    @Override
+    public Result page(StoreCouponQuery query) {
+        IPage<StoreCoupon> page = PageUtil.getPage(query, StoreCoupon.class);
+        LambdaQueryWrapper<StoreCoupon> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(Objects.nonNull(query.getStoreId()), StoreCoupon::getStoreId, query.getStoreId());
+        wrapper.eq(StringUtils.isNotBlank(query.getStatus()), StoreCoupon::getStatus, query.getStatus());
+        wrapper.eq(StringUtils.isNotBlank(query.getGenerateStatus()), StoreCoupon::getGenerateStatus, query.getGenerateStatus());
+        this.page(page, wrapper);
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    @Override
+    public Result detail(String id) {
+        StoreCouponVO vo = baseMapper.getById(id);
+        Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
+        return Result.ok().data(vo);
+    }
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    @Override
+    public Result all() {
+        List<StoreCoupon> entities = baseMapper.selectList(null);
+        List<StoreCouponVO> vos = entities.stream()
+                .map(entity -> StoreCouponVO.getVoByEntity(entity, null))
+                .collect(Collectors.toList());
+        return Result.ok().data(vos);
+    }
+
+    @Override
+    public Result getCoupon(String id) {
+        StoreCouponSingle storeCouponSingle = storeCouponSingleService.getById(id);
+        StoreCoupon storeCoupon = this.getById(storeCouponSingle.getStoreCoupRef());
+        if (storeCoupon == null) {
+            throw new ServiceException("搴楅摵绀煎搧鍗″寘涓嶅瓨鍦�");
+        }
+        if (!StoreCouponStausEnum.ENABLE.name().equals(storeCoupon.getStatus())) {
+            throw new ServiceException("搴楅摵绀煎搧鍗″寘娌℃湁鍚敤鏃犳硶棰嗗彇");
+        }
+        if (ClaimStatusEnum.CLAIM.name().equals(storeCouponSingle.getClaimStatus())) {
+            throw new ServiceException("褰撳墠绀煎搧鍗″寘宸茶棰嗗彇");
+        }
+        return Result.ok().data(storeCouponSingle);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result addStoreCoupon(StoreCouponForm storeCoupon) {
+        StoreCoupon entity = StoreCouponForm.getEntityByForm(storeCoupon, null);
+        entity.setStatus(StoreCouponStausEnum.ENABLE.name());
+        entity.setCouponClaimNum(0);
+        entity.setGenerateStatus(GenerateCouponStausEnum.NOT_GENERATE.name());
+        Coupon coupon = couponService.getById(entity.getCouponId());
+        Integer publishNum = coupon.getPublishNum();
+        //琛ㄧず涓嶉檺鍒堕鍙栨暟閲�
+        if (!Integer.valueOf(0).equals(publishNum)) {
+            if (publishNum < storeCoupon.getCouponNum()) {
+                throw new ServiceException("浼樻儬鍗峰彂琛屾暟閲忓皬浜庣敓鎴愪簩缁寸爜鏁伴噺");
+            }
+        }
+        this.save(entity);
+        return Result.ok();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result generateStoreCoupon(String id) {
+        RLock redissonLock = redissonClient.getLock(STORE_COUPON_GENERATE + id);
+        try {
+            redissonLock.lock();
+            LambdaQueryWrapper<StoreCoupon> forUpdate = Wrappers.<StoreCoupon>lambdaQuery().eq(StoreCoupon::getId, id).last("FOR UPDATE");
+            StoreCoupon storeCoupon = this.getOne(forUpdate);
+            if (storeCoupon == null) {
+                throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗蜂笉瀛樺湪鏃犳硶鐢熸垚");
+            }
+            if (!GenerateCouponStausEnum.NOT_GENERATE.name().equals(  storeCoupon.getGenerateStatus())) {
+                throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗风姸鎬佸紓甯告棤娉曠敓鎴�");
+            }
+            //鐢熸垚浼樻儬鍗�
+            Integer couponNum = storeCoupon.getCouponNum();
+            if (couponNum == null) {
+                throw new ServiceException("鍙戣鏁伴噺涓虹┖涓嶈兘鐢熸垚");
+            }
+            List<StoreCouponSingle> storeCouponSingles = new ArrayList<>();
+            for (int i = 1; i <= couponNum; i++) {
+                StoreCouponSingle storeCouponSingle = getStoreCouponSingle(storeCoupon, i);
+                storeCouponSingles.add(storeCouponSingle);
+            }
+            if (!storeCouponSingles.isEmpty()) {
+                storeCouponSingleService.saveBatch(storeCouponSingles);
+            }
+            //鏇存柊鐘舵�佺敓鎴愮姸鎬�
+            storeCoupon.setGenerateStatus(GenerateCouponStausEnum.GENERATE.name());
+            this.updateById(storeCoupon);
+            return Result.ok();
+        }finally {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    if (redissonLock.isHeldByCurrentThread()) {
+                        redissonLock.unlock();
+                    }
+                }
+                @Override
+                public void afterCompletion(int status) {
+                    // 纭繚鍗充娇鍦ㄤ簨鍔″洖婊氱殑鎯呭喌涓嬩篃鑳介噴鏀鹃攣
+                    if (redissonLock.isHeldByCurrentThread()) {
+                        redissonLock.unlock();
+                    }
+                }
+            });
+        }
+    }
+
+    @Override
+    public Result getPageByStoreCoupon(StoreCouponSingleQuery query){
+        return storeCouponSingleService.pageByRefId(query);
+    }
+
+    private static StoreCouponSingle getStoreCouponSingle(StoreCoupon storeCoupon, int i) {
+        StoreCouponSingle storeCouponSingle = new StoreCouponSingle();
+        storeCouponSingle.setStoreCoupRef(storeCoupon.getId());
+        storeCouponSingle.setStoreId(storeCoupon.getStoreId());
+        storeCouponSingle.setStoreName(storeCoupon.getStoreName());
+        storeCouponSingle.setCouponName(storeCoupon.getCouponName());
+        storeCouponSingle.setCouponId(storeCoupon.getCouponId());
+        storeCouponSingle.setClaimStatus(ClaimStatusEnum.NOT_CLAIM.name());
+        storeCouponSingle.setCouponNo(String.format("%08d", i));
+        return storeCouponSingle;
+    }
+
+    @Override
+    public Result changeStatus(String id) {
+        StoreCoupon storeCoupon = this.getById(id);
+        if (storeCoupon == null) {
+            throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗蜂笉瀛樺湪");
+        }
+        String status = storeCoupon.getStatus();
+        if (StoreCouponStausEnum.ENABLE.name().equals(status)) {
+            storeCoupon.setStatus(StoreCouponStausEnum.DISABLE.name());
+        }else if (StoreCouponStausEnum.DISABLE.name().equals(status)) {
+            storeCoupon.setStatus(StoreCouponStausEnum.ENABLE.name());
+        }else {
+            throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗风姸鎬佸紓甯告棤娉曚慨鏀�");
+        }
+        this.updateById(storeCoupon);
+        return Result.ok();
+    }
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponSingleServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponSingleServiceImpl.java
new file mode 100644
index 0000000..385baaf
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponSingleServiceImpl.java
@@ -0,0 +1,131 @@
+package cn.lili.modules.lmk.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
+import cn.lili.modules.lmk.mapper.StoreCouponSingleMapper;
+import cn.lili.modules.lmk.service.StoreCouponSingleService;
+import cn.lili.base.Result;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.lili.modules.lmk.domain.form.StoreCouponSingleForm;
+import cn.lili.modules.lmk.domain.vo.StoreCouponSingleVO;
+import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import cn.lili.utils.PageUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.Assert;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 搴楅摵浼樻儬鍗峰崟鍝� 鏈嶅姟瀹炵幇绫�
+ *
+ * @author peng
+ * @since 2025-09-26
+ */
+@Service
+@RequiredArgsConstructor
+public class StoreCouponSingleServiceImpl extends ServiceImpl<StoreCouponSingleMapper, StoreCouponSingle> implements StoreCouponSingleService {
+
+    private final StoreCouponSingleMapper storeCouponSingleMapper;
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    @Override
+    public Result add(StoreCouponSingleForm form) {
+        StoreCouponSingle entity = StoreCouponSingleForm.getEntityByForm(form, null);
+        baseMapper.insert(entity);
+        return Result.ok("娣诲姞鎴愬姛");
+    }
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    @Override
+    public Result update(StoreCouponSingleForm form) {
+        StoreCouponSingle entity = baseMapper.selectById(form.getId());
+
+        // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
+        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+        BeanUtils.copyProperties(form, entity);
+        baseMapper.updateById(entity);
+        return Result.ok("淇敼鎴愬姛");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @Override
+    public Result remove(List<String> ids) {
+        baseMapper.deleteBatchIds(ids);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @Override
+    public Result removeById(String id) {
+        baseMapper.deleteById(id);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    @Override
+    public Result page(StoreCouponSingleQuery query) {
+        IPage<StoreCouponSingleVO> page = PageUtil.getPage(query, StoreCouponSingleVO.class);
+        baseMapper.getPage(page, query);
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    @Override
+    public Result pageByRefId(StoreCouponSingleQuery query) {
+        IPage<StoreCouponSingleVO> page = PageUtil.getPage(query, StoreCouponSingleVO.class);
+        baseMapper.getPageByRefId(page, query);
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    @Override
+    public Result detail(String id) {
+        StoreCouponSingleVO vo = baseMapper.getById(id);
+        Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
+        return Result.ok().data(vo);
+    }
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    @Override
+    public Result all() {
+        List<StoreCouponSingle> entities = baseMapper.selectList(null);
+        List<StoreCouponSingleVO> vos = entities.stream()
+                .map(entity -> StoreCouponSingleVO.getVoByEntity(entity, null))
+                .collect(Collectors.toList());
+        return Result.ok().data(vos);
+    }
+}
diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java
index c66c3e2..c46713d 100644
--- a/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java
+++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Member.java
@@ -102,6 +102,8 @@
     @ApiModelProperty(value = "缁忛獙鍊兼暟閲�")
     private Long experience;
 
+    @TableField("share_store_id")
+    private String shareStoreId;
 
     public Member(String username, String password, String mobile) {
         this.username = username;
diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java
index 6b8207b..0961aa1 100644
--- a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java
+++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java
@@ -30,7 +30,7 @@
 
     @ApiModelProperty(value = "浼氬憳鐢ㄦ埛鍚�")
     @NotEmpty(message = "浼氬憳鐢ㄦ埛鍚嶄笉鑳戒负绌�")
-    @Length(max = 30, message = "浼氬憳鐢ㄦ埛鍚嶄笉鑳借秴杩�20涓瓧绗�")
+    @Length(max = 200, message = "浼氬憳鐢ㄦ埛鍚嶄笉鑳借秴杩�200涓瓧绗�")
     private String username;
 
     @ApiModelProperty(value = "浼氬憳瀵嗙爜")
diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java
index 6fa585e..ced2121 100644
--- a/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java
+++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/MemberVO.java
@@ -106,6 +106,9 @@
     @ApiModelProperty(value = "榛戝悕鍗昳d")
     private String blackId;
 
+    @ApiModelProperty(value = "缁戝畾鍟嗗簵鍚�")
+    private String bindStoreName;
+
     public MemberVO(Member member) {
         BeanUtil.copyProperties(member, this);
     }
diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
index ed82d84..ac31cfe 100644
--- a/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
+++ b/framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
@@ -30,6 +30,12 @@
     @Select("select * from li_member ${ew.customSqlSegment}")
     IPage<MemberVO> pageByMemberVO(IPage<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
 
+    @Select("select m.*,s.store_name as bindStoreName " +
+            "from li_member m " +
+            "LEFT JOIN li_store s on m.share_store_id = s.id " +
+            " ${ew.customSqlSegment}")
+    IPage<MemberVO> pageByMemberVOAndBindStore(IPage<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
+
     @Select("select * from li_member ${ew.customSqlSegment}")
     List<MemberVO> exportMember(@Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
 
diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java
index 4539594..34e1bf0 100644
--- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java
+++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java
@@ -6,6 +6,7 @@
 import cn.lili.common.security.token.Token;
 import cn.lili.common.vo.PageVO;
 import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
+import cn.lili.modules.lmk.domain.form.MemberBindStoreForm;
 import cn.lili.modules.lmk.domain.form.MemberNickNameForm;
 import cn.lili.modules.member.entity.dos.Member;
 import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO;
@@ -347,4 +348,6 @@
     Member findByUUID(String uuid);
 
     void registerHandler(Member user);
+
+    Result bindMemberAndStore(MemberBindStoreForm form);
 }
diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
index 384a3ce..fabe22c 100644
--- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
@@ -16,6 +16,7 @@
 import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
 import cn.lili.mybatis.util.PageUtil;
 import cn.lili.utils.COSUtil;
+import cn.lili.utils.CommonUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -177,83 +178,90 @@
         Calendar calendar = Calendar.getInstance(); // 鐢ㄤ簬鏃ユ湡璁$畻鐨勬棩鍘嗗疄渚�
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         int days = 0;
-        switch (queryParam.getSearchType()) {
-            case "TODAY":
-                // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
-                calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
-                calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
-                calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
-                calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
-                calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
-                startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
-                dateList.add(sdf.format(startTime));
-                break;
-            case "YESTERDAY":
-                // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
+        if (queryParam.getYear() != null && queryParam.getMonth() != null) {
+            Date[] dates = CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth());
+            startTime = dates[0];
+            endTime = dates[1];
+        }else {
+            switch (queryParam.getSearchType()) {
+                case "TODAY":
+                    // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
+                    calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
+                    calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
+                    calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
+                    calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
+                    startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
+                    dateList.add(sdf.format(startTime));
+                    break;
+                case "YESTERDAY":
+                    // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
 
-                // 璁剧疆鏄ㄥぉ0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆鏄ㄥぉ0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                // 璁剧疆鏄ㄥぉ23:59:59.999
-                calendar.set(Calendar.HOUR_OF_DAY, 23);
-                calendar.set(Calendar.MINUTE, 59);
-                calendar.set(Calendar.SECOND, 59);
-                calendar.set(Calendar.MILLISECOND, 999);
-                endTime = calendar.getTime();
+                    // 璁剧疆鏄ㄥぉ23:59:59.999
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
 
-                dateList.add(sdf.format(startTime));
-                break;
-            case "LAST_SEVEN":
-                // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
+                    dateList.add(sdf.format(startTime));
+                    break;
+                case "LAST_SEVEN":
+                    // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
 
-                // 璁剧疆7澶╁墠0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆7澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                days = 7;
-                // 寰幆鐢熸垚7澶╃殑鏃ユ湡瀛楃涓�
-                Calendar tempCalendar = Calendar.getInstance();
-                tempCalendar.setTime(startTime);
-                for (int i = 0; i < days; i++) {
-                    dateList.add(sdf.format(tempCalendar.getTime()));
-                    tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
-                }
-                break;
-            case "LAST_THIRTY":
-                // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
+                    days = 7;
+                    // 寰幆鐢熸垚7澶╃殑鏃ユ湡瀛楃涓�
+                    Calendar tempCalendar = Calendar.getInstance();
+                    tempCalendar.setTime(startTime);
+                    for (int i = 0; i < days; i++) {
+                        dateList.add(sdf.format(tempCalendar.getTime()));
+                        tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+                    }
+                    break;
+                case "LAST_THIRTY":
+                    // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
 
-                // 璁剧疆30澶╁墠0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆30澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                days = 30;
-                // 寰幆鐢熸垚30澶╃殑鏃ユ湡瀛楃涓�
-                Calendar tempCalendar30 = Calendar.getInstance();
-                tempCalendar30.setTime(startTime);
-                for (int i = 0; i < days; i++) {
-                    dateList.add(sdf.format(tempCalendar30.getTime()));
-                    tempCalendar30.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
-                }
-                break;
-            default:
-                return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+                    days = 30;
+                    // 寰幆鐢熸垚30澶╃殑鏃ユ湡瀛楃涓�
+                    Calendar tempCalendar30 = Calendar.getInstance();
+                    tempCalendar30.setTime(startTime);
+                    for (int i = 0; i < days; i++) {
+                        dateList.add(sdf.format(tempCalendar30.getTime()));
+                        tempCalendar30.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+                    }
+                    break;
+                default:
+                    return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+            }
         }
+
         if ("goods".equals(queryParam.getCurrentType())){
             List<Map<String, Object>> maps = baseMapper.selectViewAndCompletionRateCountByDay(startTime, endTime,queryParam.getCurrentLimit());
             Map<String,Long> viewPrintMap = maps.stream()
diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
index 455df7b..9531b2b 100644
--- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
@@ -25,6 +25,7 @@
 import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
 import cn.lili.modules.connect.service.ConnectService;
 import cn.lili.modules.lmk.domain.entity.VideoAccount;
+import cn.lili.modules.lmk.domain.form.MemberBindStoreForm;
 import cn.lili.modules.lmk.domain.form.MemberNickNameForm;
 import cn.lili.modules.lmk.domain.form.MemberTagForm;
 import cn.lili.modules.lmk.domain.vo.PrizeRecordVO;
@@ -74,6 +75,9 @@
 import javax.servlet.http.HttpServletResponse;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -356,6 +360,49 @@
     }
 
     @Override
+    public Result bindMemberAndStore(MemberBindStoreForm form) {
+        String memberId = UserContext.getCurrentUserId();
+        if(StringUtils.isNotBlank(memberId)){
+            Member member = baseMapper.selectById(memberId);
+
+            if (member != null){
+                //鍒ゆ柇鐢ㄦ埛鐨勫垱寤烘椂闂存槸鍚﹀拰 鍒嗕韩shareTime鍦�24灏忔椂鍐�
+                LocalDateTime memberCreateTime = member.getCreateTime().toInstant()
+                        .atZone(ZoneId.systemDefault())
+                        .toLocalDateTime();
+
+                LocalDateTime shareTime = form.getShareTime().toInstant()
+                        .atZone(ZoneId.systemDefault())
+                        .toLocalDateTime();
+
+                // 璁$畻鏃堕棿宸� 绗竴涓弬鏁� 杈冩棭鐨勬椂闂� 鍚庝竴涓緝鏅氱殑鏃堕棿
+                Duration duration = Duration.between(
+                        memberCreateTime.isBefore(shareTime) ? memberCreateTime : shareTime,
+                        memberCreateTime.isBefore(shareTime) ? shareTime : memberCreateTime
+                );
+
+                long hoursDifference = duration.toHours();
+
+                if (hoursDifference <= 24) {
+                    // 鍦�24灏忔椂鍐� 涓庡簵閾鸿繘琛岀粦瀹�
+                    if(StringUtils.isNotBlank(member.getShareStoreId())){
+                        return Result.ok("宸茬粦瀹氬簵閾�");
+                    }
+                    member.setShareStoreId(form.getShareStoreId());
+                    baseMapper.updateById(member);
+                } else {
+                    return Result.ok("鍒嗕韩宸茶繃鏈燂紝鏈夋晥鏈熶负24灏忔椂");
+                }
+            }
+
+
+        }else{
+            throw new RuntimeException("UserContext.getCurrentUserId()锛氱敤鎴穒d鑾峰彇寮傚父");
+        }
+        return Result.ok("缁戝畾鎴愬姛");
+    }
+
+    @Override
     public Member editOwn(MemberEditDTO memberEditDTO) {
         //鏌ヨ浼氬憳淇℃伅
         Member member = this.findByUsername(Objects.requireNonNull(UserContext.getCurrentUser()).getUsername());
@@ -606,13 +653,11 @@
             String tagIdsStr = memberSearchVO.getTagIds().stream()
                     .map(String::valueOf)
                     .collect(Collectors.joining(","));
-            queryWrapper.inSql("id",
+            queryWrapper.inSql("m.id",
                     "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" +
                             tagIdsStr + ")");
-
-            return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper);
         }
-        return this.baseMapper.pageByMemberVO(PageUtil.initPage(page),queryWrapper);
+        return this.baseMapper.pageByMemberVOAndBindStore(PageUtil.initPage(page),queryWrapper);
     }
 
     @Override
diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java
index f41cdd1..68dc1b0 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java
@@ -89,4 +89,6 @@
     private String storeName;
 
     private String nickName;
+
+    private String memberId;
 }
diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java
index cdb61a1..945501f 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java
@@ -92,4 +92,6 @@
     private String storeName;
 
     private String nickName;
+
+    private String memberId;
 }
diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreCouponClaimRecordDTO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreCouponClaimRecordDTO.java
new file mode 100644
index 0000000..b1f9b75
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dto/StoreCouponClaimRecordDTO.java
@@ -0,0 +1,101 @@
+package cn.lili.modules.order.order.entity.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * lmk-shop-java
+ *
+ * @author : zxl
+ * @date : 2025-09-27 21:40
+ **/
+@Data
+public class StoreCouponClaimRecordDTO {
+    /** 搴楅摵鍚嶇О */
+    @ApiModelProperty("搴楅摵鍚嶇О")
+    private String storeName;
+
+    /** 浼樻儬鍗穒d */
+    @ApiModelProperty("浼樻儬鍗穒d")
+    private Long couponId;
+
+    /** 浼樻儬鍗峰悕绉� */
+    @ApiModelProperty("浼樻儬鍗峰悕绉�")
+    private String couponName;
+
+    /** 搴楅摵id */
+    @ApiModelProperty("搴楅摵id")
+    private String storeId;
+
+    /** 鐢ㄦ埛id */
+    @ApiModelProperty("鐢ㄦ埛id")
+    private String userId;
+
+
+    @ApiModelProperty("搴楅摵浼樻儬鍒稿叧鑱擨D")
+    private String storeCouponId;
+
+    @ApiModelProperty("鍒涘缓鑰�")
+    private String createBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @ApiModelProperty("淇敼鑰�")
+    private String updateBy;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    private Date updateTime;
+
+    @ApiModelProperty("鍒犻櫎鏍囧織")
+    private Boolean deleteFlag;
+
+    // 琛ュ厖浼氬憳浼樻儬鍒歌〃鍏宠仈瀛楁
+    @ApiModelProperty("浼氬憳ID")
+    private String memberId;
+
+    @ApiModelProperty("浼氬憳鍚嶇О")
+    private String memberName;
+
+    @ApiModelProperty("浼樻儬鍒搁潰棰�")
+    private BigDecimal price;
+
+    @ApiModelProperty("浣跨敤璧峰鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    @ApiModelProperty("浣跨敤鎴鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    @ApiModelProperty("浼氬憳浼樻儬鍒哥姸鎬�")
+    private String memberCouponStatus;
+
+    @ApiModelProperty("鍟嗗搧浣跨敤闄愬埗娆℃暟")
+    private Integer goodsUseLimitNum;
+
+    @ApiModelProperty("鏄惁鏄钩鍙颁紭鎯犲埜")
+    private Boolean platformFlag;
+
+    @ApiModelProperty("浼樻儬鍒哥被鍨�")
+    private String getType;
+
+    @ApiModelProperty("鎶樻墸")
+    private BigDecimal discount;
+
+    @ApiModelProperty("娲诲姩绫诲瀷")
+    private String couponType;
+
+    @ApiModelProperty("棰嗗彇鏃堕棿")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date claimTime;
+}
diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
index 185947a..238bbc7 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
@@ -63,7 +63,8 @@
             "o.logistics_time AS logistics_time," +
             "o.complete_time AS complete_time," +
             "o.store_name AS store_name, " +
-            "m.nick_name AS nickName" +
+            "m.nick_name AS nickName," +
+            "o.member_id AS memberId" +
             " FROM li_order o LEFT JOIN li_order_item oi ON oi.order_sn = o.sn " +
             "LEFT JOIN li_member m on m.id = o.member_id " +
             "${ew.customSqlSegment}")
diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
index 62358bd..c3003e8 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -31,6 +31,7 @@
 import cn.lili.modules.goods.service.GoodsService;
 import cn.lili.modules.goods.service.GoodsSkuService;
 import cn.lili.modules.lmk.domain.entity.CouponVirtual;
+import cn.lili.modules.lmk.domain.vo.OrderCountByDayAndHourVO;
 import cn.lili.modules.lmk.domain.vo.OrderCountVO;
 import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
 import cn.lili.modules.lmk.enums.general.VirtualGoodsTypeEnum;
@@ -1254,12 +1255,31 @@
         orderLogService.saveBatch(orderLogList);
         //鍒ゆ柇璁㈠崟璐х墿鏄惁鍏ㄩ儴鍙戣揣瀹屾瘯
         Boolean delivery = true;
+        log.info("鎵撳嵃璁㈠崟璐х墿:{}",orderItemList);
+
+        //闇�瑕佸啀姝ゅ鍒ゆ柇璁㈠崟鏄惁鏈夌敵璇峰敭鍚庣姸鎬�
         for (OrderItem orderItem : orderItemList) {
-            if (orderItem.getDeliverNumber() < orderItem.getNum()) {
-                delivery = false;
-                break;
+            // 鍏堝垽鏂槸鍚︽槸鏈敵璇峰敭鍚庣殑璁㈠崟
+            if (OrderItemAfterSaleStatusEnum.NOT_APPLIED.name().equals(orderItem.getAfterSaleStatus())){
+                // 鍙戣揣鏁伴噺灏忎簬璁㈠崟鏁伴噺鍒欏叏鍙�
+                log.info("鎵撳嵃鍙戣揣鏁伴噺锛歿},璇ュ晢鍝佽鍗曟暟閲忚揣鐗╁搴旂殑:{}",orderItem.getDeliverNumber(),orderItem.getNum());
+                if (orderItem.getDeliverNumber() < orderItem.getNum()) {
+                    delivery = false;
+                    break;
+                }
+            }else{
+                //鍏ㄩ儴閫�鍥炴儏鍐�
+                if(Objects.equals(orderItem.getReturnGoodsNumber(), orderItem.getNum())){
+                    break;
+                }
+                //瀛樺湪鎯呭喌 閫�鍥炴暟閲忎笉鏄叏閮ㄩ��鍥炶�屾槸閮ㄥ垎閫�鍥�
+                if (orderItem.getReturnGoodsNumber() + orderItem.getDeliverNumber() < orderItem.getNum()) {
+                    delivery = false;
+                    break;
+                }
             }
         }
+        log.info("delivery鐘舵��:{}",delivery);
         //鏄惁鍏ㄩ儴鍙戣揣
         if (delivery) {
             return delivery(orderSn, invoiceNumber, logisticsId);
@@ -1284,83 +1304,101 @@
         Calendar calendar = Calendar.getInstance(); // 鐢ㄤ簬鏃ユ湡璁$畻鐨勬棩鍘嗗疄渚�
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         int days = 0;
-        switch (queryParam.getSearchType()) {
-            case "TODAY":
-                // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
-                calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
-                calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
-                calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
-                calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
-                calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
-                startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
-                dateList.add(sdf.format(startTime));
-                break;
-            case "YESTERDAY":
-                // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
+        //鍒ゆ柇鏄惁鏄寜骞存湀鏌ヨ
+        if (queryParam.getYear() != null && queryParam.getMonth() != null) {
+            Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth());
+            startTime = dates[0];
+            endTime = dates[1];
+            System.out.println("寮�濮嬫墦鍗�");
+            System.out.println(startTime);
+            System.out.println(endTime);
+            Calendar tempCalendar = Calendar.getInstance();
+            tempCalendar.setTime(startTime);
+            days = tempCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+            for (int i = 0; i < days; i++) {
+                dateList.add(sdf.format(tempCalendar.getTime()));
+                tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+            }
+        }else{
+            switch (queryParam.getSearchType()) {
+                case "TODAY":
+                    // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
+                    calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
+                    calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
+                    calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
+                    calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
+                    startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
+                    dateList.add(sdf.format(startTime));
+                    break;
+                case "YESTERDAY":
+                    // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
 
-                // 璁剧疆鏄ㄥぉ0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆鏄ㄥぉ0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                // 璁剧疆鏄ㄥぉ23:59:59.999
-                calendar.set(Calendar.HOUR_OF_DAY, 23);
-                calendar.set(Calendar.MINUTE, 59);
-                calendar.set(Calendar.SECOND, 59);
-                calendar.set(Calendar.MILLISECOND, 999);
-                endTime = calendar.getTime();
+                    // 璁剧疆鏄ㄥぉ23:59:59.999
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
 
-                dateList.add(sdf.format(startTime));
-                break;
-            case "LAST_SEVEN":
-                // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
+                    dateList.add(sdf.format(startTime));
+                    break;
+                case "LAST_SEVEN":
+                    // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
 
-                // 璁剧疆7澶╁墠0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆7澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                days = 7;
-                // 寰幆鐢熸垚7澶╃殑鏃ユ湡瀛楃涓�
-                Calendar tempCalendar = Calendar.getInstance();
-                tempCalendar.setTime(startTime);
-                for (int i = 0; i < days; i++) {
-                    dateList.add(sdf.format(tempCalendar.getTime()));
-                    tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
-                }
-                break;
-            case "LAST_THIRTY":
-                // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
+                    days = 7;
+                    // 寰幆鐢熸垚7澶╃殑鏃ユ湡瀛楃涓�
+                    Calendar tempCalendar = Calendar.getInstance();
+                    tempCalendar.setTime(startTime);
+                    for (int i = 0; i < days; i++) {
+                        dateList.add(sdf.format(tempCalendar.getTime()));
+                        tempCalendar.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+                    }
+                    break;
+                case "LAST_THIRTY":
+                    // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
 
-                // 璁剧疆30澶╁墠0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆30澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                days = 30;
-                // 寰幆鐢熸垚30澶╃殑鏃ユ湡瀛楃涓�
-                Calendar tempCalendar30 = Calendar.getInstance();
-                tempCalendar30.setTime(startTime);
-                for (int i = 0; i < days; i++) {
-                    dateList.add(sdf.format(tempCalendar30.getTime()));
-                    tempCalendar30.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
-                }
-                break;
-            default:
-                return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+                    days = 30;
+                    // 寰幆鐢熸垚30澶╃殑鏃ユ湡瀛楃涓�
+                    Calendar tempCalendar30 = Calendar.getInstance();
+                    tempCalendar30.setTime(startTime);
+                    for (int i = 0; i < days; i++) {
+                        dateList.add(sdf.format(tempCalendar30.getTime()));
+                        tempCalendar30.add(Calendar.DATE, 1); // 姣忓ぉ绱姞1澶�
+                    }
+                    break;
+                default:
+                    return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+            }
         }
+
         List<Map<String, Object>> maps = baseMapper.selectOrderCountByDay(startTime,endTime);
 
         Map<String, Long> dayCountMap = maps.stream()
@@ -1386,84 +1424,100 @@
         List<String> dateList = new ArrayList<>();
 
         Calendar calendar = Calendar.getInstance(); // 鐢ㄤ簬鏃ユ湡璁$畻鐨勬棩鍘嗗疄渚�
-        for (int i =0;i<=24;i++){
+        for (int i =0;i<24;i++){
             dateList.add(i + "鐐�");
         }
-        switch (queryParam.getSearchType()) {
-            case "TODAY":
-                // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
-                calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
-                calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
-                calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
-                calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
-                calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
-                startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
-                break;
-            case "YESTERDAY":
-                // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
+        if (queryParam.getYear() != null && queryParam.getMonth() != null) {
+            Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth());
+            startTime = dates[0];
+            endTime = dates[1];
+        }else{
+            switch (queryParam.getSearchType()) {
+                case "TODAY":
+                    // 浠婂ぉ锛氫粠浠婂ぉ0鐐瑰埌鐜板湪
+                    calendar.setTime(new Date()); // 閲嶇疆涓哄綋鍓嶆椂闂�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0); // 灏忔椂璁句负0锛�24灏忔椂鍒讹級
+                    calendar.set(Calendar.MINUTE, 0);      // 鍒嗛挓璁句负0
+                    calendar.set(Calendar.SECOND, 0);      // 绉掕涓�0
+                    calendar.set(Calendar.MILLISECOND, 0); // 姣璁句负0
+                    startTime = calendar.getTime();        // 寰楀埌浠婂ぉ0鐐圭殑Date瀵硅薄
+                    break;
+                case "YESTERDAY":
+                    // 鏄ㄥぉ锛氫粠鏄ㄥぉ0鐐瑰埌鏄ㄥぉ23:59:59.999
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -1); // 鏃ユ湡鍑�1澶╋紙鍙樹负鏄ㄥぉ锛�
 
-                // 璁剧疆鏄ㄥぉ0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    // 璁剧疆鏄ㄥぉ0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                // 璁剧疆鏄ㄥぉ23:59:59.999
-                calendar.set(Calendar.HOUR_OF_DAY, 23);
-                calendar.set(Calendar.MINUTE, 59);
-                calendar.set(Calendar.SECOND, 59);
-                calendar.set(Calendar.MILLISECOND, 999);
-                endTime = calendar.getTime();
+                    // 璁剧疆鏄ㄥぉ23:59:59.999
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 59);
+                    calendar.set(Calendar.SECOND, 59);
+                    calendar.set(Calendar.MILLISECOND, 999);
+                    endTime = calendar.getTime();
+                    break;
+                case "LAST_SEVEN":
+                    // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
 
-                break;
-            case "LAST_SEVEN":
-                // 杩囧幓涓冨ぉ锛氫粠7澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�7澶╋級
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -6); // 鏃ユ湡鍑�6澶╋紙7澶╁墠鐨勪粖澶╋級
+                    // 璁剧疆7澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                // 璁剧疆7澶╁墠0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
+                    break;
+                case "LAST_THIRTY":
+                    // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
+                    calendar.setTime(new Date());
+                    calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
 
-                break;
-            case "LAST_THIRTY":
-                // 杩囧幓30澶╋細浠�30澶╁墠0鐐瑰埌鐜板湪锛堝惈浠婂ぉ鍏�30澶╋級
-                calendar.setTime(new Date());
-                calendar.add(Calendar.DATE, -29); // 鏃ユ湡鍑�29澶╋紙30澶╁墠鐨勪粖澶╋級
+                    // 璁剧疆30澶╁墠0鐐�
+                    calendar.set(Calendar.HOUR_OF_DAY, 0);
+                    calendar.set(Calendar.MINUTE, 0);
+                    calendar.set(Calendar.SECOND, 0);
+                    calendar.set(Calendar.MILLISECOND, 0);
+                    startTime = calendar.getTime();
 
-                // 璁剧疆30澶╁墠0鐐�
-                calendar.set(Calendar.HOUR_OF_DAY, 0);
-                calendar.set(Calendar.MINUTE, 0);
-                calendar.set(Calendar.SECOND, 0);
-                calendar.set(Calendar.MILLISECOND, 0);
-                startTime = calendar.getTime();
-
-                break;
-            default:
-                return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+                    break;
+                default:
+                    return Result.error("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+            }
         }
+
+
+
         List<Map<String, Object>> maps = baseMapper.selectOrderTimePeriod(startTime,endTime);
 
-        Map<String, Long> dayCountMap = maps.stream()
+        Map<String, Long> countByDayHour = maps.stream()
                 .collect(Collectors.toMap(
-                        map -> map.get("day").toString(),  // 鏃ユ湡瀛楃涓诧紙濡�2023-09-19锛�
-                        map -> Long.valueOf(map.get("count").toString())  // 璁㈠崟鏁伴噺
+                        map -> map.get("hour").toString(),
+                        map -> Long.valueOf(map.get("count").toString()),
+                        Long::sum  // 濡傛灉鏈夐噸澶嶏紝绱姞count
                 ));
 
-        List<Long> orderCounts = new ArrayList<>();
-        for (String date : dateList) {
-            // 鏍稿績锛氬瓨鍦ㄥ垯鍙栨煡璇㈢粨鏋滐紝涓嶅瓨鍦ㄥ垯琛�0
-            orderCounts.add(dayCountMap.getOrDefault(date, 0L));
+        // 閬嶅巻鏌ョ湅缁撴灉
+        List<Long> countList = new ArrayList<>();
+        for (int i = 0; i < 24; i++) {
+            String hourKey = String.valueOf(i);
+            Long count = countByDayHour.getOrDefault(hourKey, 0L);
+            countList.add(count);
         }
 
+        Map<String,Object> map = new HashMap<>();
+        map.put("dateData",dateList);
+        map.put("countData",countList);
+        //TODO 娴忚鏁版嵁鏈姞鍏�
+//        map.put();
 
-        return Result.ok().data(orderCounts);
+        return Result.ok().data(map);
     }
 
     /**
@@ -1482,6 +1536,7 @@
             for (Order unpaidOrder : unpaidOrders) {
                 this.systemCancel(unpaidOrder.getSn(), "鎷煎洟娲诲姩缁撴潫璁㈠崟鏈粯娆撅紝绯荤粺鑷姩鍙栨秷璁㈠崟", false);
             }
+
         }
         List<Order> paidOrders = listMap.get(PayStatusEnum.PAID.name());
         //濡傚緟鍙傚洟浜烘暟澶т簬0锛屽苟宸插紑鍚櫄鎷熸垚鍥�
@@ -1799,8 +1854,19 @@
             orderExportDetailDTO.setPaymentMethod(CharSequenceUtil.isNotBlank(orderExportDTO.getPaymentMethod()) ? PaymentMethodEnum.valueOf(orderExportDTO.getPaymentMethod()).paymentName() : "");
             orderExportDetailDTO.setClientType(ClientTypeEnum.valueOf(orderExportDTO.getClientType()).value());
             orderExportDetailDTO.setOrderType(orderExportDTO.getOrderType().equals(OrderTypeEnum.NORMAL.name()) ? "鏅�氳鍗�" : "铏氭嫙璁㈠崟");
-            orderExportDetailDTO.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.valueOf(orderExportDTO.getAfterSaleStatus()).description());
 
+            String afterSaleStatus = orderExportDTO.getAfterSaleStatus();
+            if (StringUtils.isNotBlank(afterSaleStatus)) {
+                try {
+                    orderExportDetailDTO.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.valueOf(afterSaleStatus).description());
+                } catch (IllegalArgumentException e) {
+                    // 澶勭悊鏋氫妇鍊间笉瀛樺湪鐨勬儏鍐�
+                    orderExportDetailDTO.setAfterSaleStatus("鏈煡鐘舵��");
+                }
+            } else {
+                // 璁剧疆榛樿鍊兼垨绌哄瓧绗︿覆
+                orderExportDetailDTO.setAfterSaleStatus("鏃犲敭鍚庣姸鎬�");
+            }
             //鏃堕棿
             orderExportDetailDTO.setCreateTime(DateUtil.formatDateTime(orderExportDTO.getCreateTime()));
             orderExportDetailDTO.setPaymentTime(DateUtil.formatDateTime(orderExportDTO.getPaymentTime()));
@@ -1815,7 +1881,7 @@
         // 鍒涘缓琛ㄥご
         Row header = sheet.createRow(0);
         String[] headers = {"涓昏鍗曠紪鍙�", "瀛愯鍗曠紪鍙�", "閫夎喘鍟嗗搧", "鍟嗗搧鏁伴噺", "鍟嗗搧ID", "鍟嗗搧鍗曚环", "璁㈠崟搴斾粯閲戦",
-                "杩愯垂", "浼樻儬鎬婚噾棰�", "骞冲彴浼樻儬", "鍟嗗浼樻儬", "鍟嗗鏀逛环", "鏀粯鏂瑰紡","涔板鍚嶇О", "鏀朵欢浜�", "鏀朵欢浜烘墜鏈哄彿",
+                "杩愯垂", "浼樻儬鎬婚噾棰�", "骞冲彴浼樻儬", "鍟嗗浼樻儬", "鍟嗗鏀逛环", "鏀粯鏂瑰紡","浼氬憳ID","涔板鍚嶇О", "鏀朵欢浜�", "鏀朵欢浜烘墜鏈哄彿",
                 "鐪�", "甯�", "鍖�", "琛楅亾", "璇︾粏鍦板潃", "涔板鐣欒█", "璁㈠崟鎻愪氦鏃堕棿", "鏀粯瀹屾垚鏃堕棿", "鏉ユ簮",
                 "璁㈠崟鐘舵��", "璁㈠崟绫诲瀷", "鍞悗鐘舵��", "鍙栨秷鍘熷洜", "鍙戣揣鏃堕棿", "瀹屾垚鏃堕棿", "搴楅摵"};
 
@@ -1830,7 +1896,7 @@
             row.createCell(0).setCellValue(dto.getOrderSn());
             row.createCell(1).setCellValue(dto.getOrderItemSn());
             row.createCell(2).setCellValue(dto.getGoodsName());
-            row.createCell(3).setCellValue(dto.getNum());
+            row.createCell(3).setCellValue(dto.getNum()!=null?dto.getNum():0);
             row.createCell(4).setCellValue(dto.getGoodsId());
             row.createCell(5).setCellValue(dto.getUnitPrice()!=null?dto.getUnitPrice():0);
             row.createCell(6).setCellValue(dto.getFlowPrice()!=null?dto.getFlowPrice():0);
@@ -1840,27 +1906,27 @@
             row.createCell(10).setCellValue(dto.getStoreMarketingCost()!=null?dto.getStoreMarketingCost():0);
             row.createCell(11).setCellValue(dto.getUpdatePrice()!=null?dto.getUpdatePrice():0);
             row.createCell(12).setCellValue(dto.getPaymentMethod());
+            row.createCell(13).setCellValue(dto.getMemberId());
+            row.createCell(14).setCellValue(dto.getNickName());
 
-            row.createCell(13).setCellValue(dto.getNickName());
-
-            row.createCell(14).setCellValue(dto.getConsigneeName());
-            row.createCell(15).setCellValue(dto.getConsigneeMobile());
-            row.createCell(16).setCellValue(dto.getProvince());
-            row.createCell(17).setCellValue(dto.getCity());
-            row.createCell(18).setCellValue(dto.getDistrict());
-            row.createCell(19).setCellValue(dto.getStreet());
-            row.createCell(20).setCellValue(dto.getConsigneeDetail());
-            row.createCell(21).setCellValue(dto.getRemark());
-            row.createCell(22).setCellValue(dto.getCreateTime());
-            row.createCell(23).setCellValue(dto.getPaymentTime());
-            row.createCell(24).setCellValue(dto.getClientType());
-            row.createCell(25).setCellValue(dto.getOrderStatus());
-            row.createCell(26).setCellValue(dto.getOrderType());
-            row.createCell(27).setCellValue(dto.getAfterSaleStatus());
-            row.createCell(28).setCellValue(dto.getCancelReason());
-            row.createCell(29).setCellValue(dto.getLogisticsTime());
-            row.createCell(30).setCellValue(dto.getCompleteTime());
-            row.createCell(31).setCellValue(dto.getStoreName());
+            row.createCell(15).setCellValue(dto.getConsigneeName());
+            row.createCell(16).setCellValue(dto.getConsigneeMobile());
+            row.createCell(17).setCellValue(dto.getProvince());
+            row.createCell(18).setCellValue(dto.getCity());
+            row.createCell(19).setCellValue(dto.getDistrict());
+            row.createCell(20).setCellValue(dto.getStreet());
+            row.createCell(21).setCellValue(dto.getConsigneeDetail());
+            row.createCell(22).setCellValue(dto.getRemark());
+            row.createCell(23).setCellValue(dto.getCreateTime());
+            row.createCell(24).setCellValue(dto.getPaymentTime());
+            row.createCell(25).setCellValue(dto.getClientType());
+            row.createCell(26).setCellValue(dto.getOrderStatus());
+            row.createCell(27).setCellValue(dto.getOrderType());
+            row.createCell(28).setCellValue(dto.getAfterSaleStatus());
+            row.createCell(29).setCellValue(dto.getCancelReason());
+            row.createCell(30).setCellValue(dto.getLogisticsTime());
+            row.createCell(31).setCellValue(dto.getCompleteTime());
+            row.createCell(32).setCellValue(dto.getStoreName());
         }
 
         //淇敼鍒楀
diff --git a/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java b/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java
index bc1f681..53d7725 100644
--- a/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java
+++ b/framework/src/main/java/cn/lili/modules/permission/entity/dto/AdminUserDTO.java
@@ -22,7 +22,7 @@
 
 
     @ApiModelProperty(value = "鐢ㄦ埛鍚�")
-    @Length(max = 20,message = "鐢ㄦ埛鍚嶉暱搴︿笉鑳借秴杩�20涓瓧绗�")
+    @Length(max = 200,message = "鐢ㄦ埛鍚嶉暱搴︿笉鑳借秴杩�200涓瓧绗�")
     private String username;
 
     @ApiModelProperty(value = "瀵嗙爜")
diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java b/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java
index 055e323..4a603c0 100644
--- a/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java
+++ b/framework/src/main/java/cn/lili/modules/promotion/service/MemberCouponService.java
@@ -43,7 +43,7 @@
      * @param memberId   浼氬憳
      * @param memberName 浼氬憳鍚嶇О
      */
-    void receiveCoupon(String couponId, String memberId, String memberName);
+    MemberCoupon receiveCoupon(String couponId, String memberId, String memberName);
 
     /**
      * 鑾峰彇浼氬憳浼樻儬鍒稿垪琛�
diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java
index 73325fb..74dfde6 100644
--- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/MemberCouponServiceImpl.java
@@ -116,10 +116,10 @@
     @Override
     @CacheEvict(key = "#memberId")
     @Transactional(rollbackFor = Exception.class)
-    public void receiveCoupon(String couponId, String memberId, String memberName) {
+    public MemberCoupon receiveCoupon(String couponId, String memberId, String memberName) {
         Coupon coupon = couponService.getById(couponId);
         if (coupon != null) {
-            this.receiverCoupon(couponId, memberId, memberName, coupon);
+           return  this.receiverCoupon(couponId, memberId, memberName, coupon);
         } else {
             throw new ServiceException(ResultCode.COUPON_NOT_EXIST);
         }
@@ -491,7 +491,7 @@
         return this.update(updateWrapper);
     }
 
-    private void receiverCoupon(String couponId, String memberId, String memberName, Coupon coupon) {
+    private MemberCoupon receiverCoupon(String couponId, String memberId, String memberName, Coupon coupon) {
         this.checkCouponLimit(couponId, memberId);
         MemberCoupon memberCoupon = new MemberCoupon(coupon);
         memberCoupon.setMemberId(memberId);
@@ -500,5 +500,6 @@
         memberCoupon.setPlatformFlag((PromotionTools.PLATFORM_ID).equals(coupon.getStoreId()));
         this.save(memberCoupon);
         couponService.receiveCoupon(couponId, 1);
+        return memberCoupon;
     }
 }
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/utils/CommonUtil.java b/framework/src/main/java/cn/lili/utils/CommonUtil.java
index 2750ae2..985cb1d 100644
--- a/framework/src/main/java/cn/lili/utils/CommonUtil.java
+++ b/framework/src/main/java/cn/lili/utils/CommonUtil.java
@@ -3,6 +3,9 @@
 
 import cn.lili.common.utils.StringUtils;
 
+import java.util.Calendar;
+import java.util.Date;
+
 /**
  * lmk-shop-java
  * 宸ュ叿
@@ -10,7 +13,34 @@
  * @author : zxl
  * @date : 2025-08-07 14:40
  **/
+
+
 public class CommonUtil {
+
+    public static Date[] getMonthStartAndEnd(int year, int month) {
+        Calendar calendar = Calendar.getInstance();
+        Date[] result = new Date[2];
+
+        // 璁剧疆鏈堜唤璧峰鏃堕棿锛堝綋鏈堢殑绗竴澶� 00:00:00锛�
+        calendar.set(Calendar.YEAR, year);
+        calendar.set(Calendar.MONTH, month - 1); // Calendar鏈堜唤浠�0寮�濮嬶紝0=1鏈�
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        result[0] = calendar.getTime(); // 鏈堜唤璧峰鏃堕棿
+
+        // 璁剧疆鏈堜唤缁撴潫鏃堕棿锛堜笅涓湀鐨勭涓�澶� 00:00:00锛岀劧鍚庡噺1姣锛�
+        calendar.add(Calendar.MONTH, 1);
+        calendar.add(Calendar.MILLISECOND, -1);
+
+        result[1] = calendar.getTime(); // 鏈堜唤缁撴潫鏃堕棿
+
+        return result;
+    }
+
     public static String maskName(String name) {
         if (StringUtils.isBlank(name)) {
             return "";
diff --git a/framework/src/main/resources/mapper/lmk/StoreCouponClaimRecordMapper.xml b/framework/src/main/resources/mapper/lmk/StoreCouponClaimRecordMapper.xml
new file mode 100644
index 0000000..d5d9b94
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/StoreCouponClaimRecordMapper.xml
@@ -0,0 +1,170 @@
+<?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.lili.modules.lmk.mapper.StoreCouponClaimRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO">
+        <id column="id" property="id"/>
+        <result column="store_name" property="storeName" />
+        <result column="coupon_id" property="couponId" />
+        <result column="coupon_name" property="couponName" />
+        <result column="store_id" property="storeId" />
+        <result column="user_id" property="userId" />
+    </resultMap>
+
+
+
+
+
+
+
+    <select id="getById" resultMap="BaseResultMap">
+        SELECT
+            LSCCR.store_name,
+            LSCCR.coupon_id,
+            LSCCR.coupon_name,
+            LSCCR.store_id,
+            LSCCR.user_id,
+            LSCCR.id
+        FROM
+            lmk_store_coupon_claim_record LSCCR
+        WHERE
+            LSCCR.id = #{id} AND LSCCR.delete_flag = 0
+    </select>
+    <resultMap id="BaseResultMapByManager" type="cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO">
+        <!-- 浼氬憳浼樻儬鍒歌〃(li_member_coupon)瀛楁鏄犲皠 -->
+        <result column="member_id" property="memberId"/>
+        <result column="member_name" property="memberName"/>
+        <result column="price" property="price"/>
+        <result column="start_time" property="startTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="member_coupon_status" property="memberCouponStatus"/>
+        <result column="goods_use_limit_num" property="goodsUseLimitNum"/>
+        <result column="platform_flag" property="platformFlag"/>
+        <result column="get_type" property="getType"/>
+        <result column="discount" property="discount"/>
+        <result column="coupon_type" property="couponType"/>
+        <result column="coupon_id" property="couponId" />
+        <!-- 搴楅摵浼樻儬鍒搁鍙栬褰曡〃(lmk_store_coupon_claim_record)瀛楁鏄犲皠 -->
+        <result column="id" property="id"/>
+        <result column="store_name" property="storeName"/>
+        <result column="store_coupon_id" property="storeCouponId"/>
+        <result column="store_id" property="storeId"/>
+        <result column="user_id" property="userId"/>
+        <result column="coupon_name" property="couponName"/>
+        <result column="claimTime" property="claimTime"/>
+    </resultMap>
+
+    <select id="getPage" resultMap="BaseResultMapByManager">
+        SELECT
+        lmc.member_id,
+        lmc.member_name,
+        lmc.price,
+        lmc.start_time,
+        lmc.end_time,
+        lmc.member_coupon_status,
+        lmc.goods_use_limit_num,
+        lmc.platform_flag,
+        lmc.get_type,
+        lmc.discount,
+        lmc.coupon_type,
+        lsccr.id,
+        lsccr.store_name,
+        lsccr.store_coupon_id,
+        lsccr.store_id,
+        lsccr.user_id,
+        lsccr.coupon_name,
+        lsccr.create_time AS claimTime,
+        lsccr.coupon_id
+        FROM
+        lmk_store_coupon_claim_record lsccr
+        INNER JOIN
+        li_member_coupon lmc ON lmc.id = lsccr.member_coupon_id
+        WHERE
+        lmc.delete_flag = 0
+        AND lsccr.delete_flag = 0
+        <!-- 1. 浼氬憳鍚嶇О妯$硦鏌ヨ锛堝叧鑱攍i_member_coupon琛級 -->
+        <if test="query.memberName != null and query.memberName != ''">
+            AND lmc.member_name LIKE CONCAT('%', #{query.memberName}, '%')
+        </if>
+        <!-- 2. 浼樻儬鍒稿悕绉版ā绯婃煡璇紙鍏宠仈lmk_store_coupon_claim_record琛級 -->
+        <if test="query.couponName != null and query.couponName != ''">
+            AND lsccr.coupon_name LIKE CONCAT('%', #{query.couponName}, '%')
+        </if>
+        <!-- 3. 浼樻儬鍒歌幏鍙栨柟寮忥紙绮剧‘鍖归厤锛屽叧鑱攍i_member_coupon琛級 -->
+        <if test="query.getType != null and query.getType != ''">
+            AND lmc.get_type = #{query.getType}
+        </if>
+        <!-- 4. 浼氬憳浼樻儬鍒哥姸鎬侊紙绮剧‘鍖归厤锛屽叧鑱攍i_member_coupon琛級 -->
+        <if test="query.memberCouponStatus != null and query.memberCouponStatus != ''">
+            AND lmc.member_coupon_status = #{query.memberCouponStatus}
+        </if>
+        <!-- 5. 鏃堕棿鑼冨洿绛涢�夛細鐢˙ETWEEN鍖归厤start_time鍜宔nd_time锛堥渶鍚屾椂浼犲叆寮�濮嬪拰缁撴潫鏃堕棿锛� -->
+        <if test="query.startTime != null and query.endTime != null">
+            AND lsccr.create_time BETWEEN FROM_UNIXTIME(#{query.startTime}/1000)
+            AND FROM_UNIXTIME(#{query.endTime}/1000)
+        </if>
+        <!-- 6. 鎺掑簭閫昏緫锛堟牴鎹墠绔紶鍏ョ殑sort瀛楁鍜宱rder鎺掑簭鏂瑰悜锛� -->
+        <if test="query.sort != null and query.sort != '' and query.order != null and query.order != ''">
+            ORDER BY lsccr.create_time DESC
+        </if>
+
+    </select>
+
+    <select id="getExportData" resultMap="BaseResultMapByManager">
+        SELECT
+        lmc.member_id,
+        lmc.member_name,
+        lmc.price,
+        lmc.start_time,
+        lmc.end_time,
+        lmc.member_coupon_status,
+        lmc.goods_use_limit_num,
+        lmc.platform_flag,
+        lmc.get_type,
+        lmc.discount,
+        lmc.coupon_type,
+        lsccr.id,
+        lsccr.store_name,
+        lsccr.store_coupon_id,
+        lsccr.store_id,
+        lsccr.user_id,
+        lsccr.coupon_name,
+        lsccr.create_time AS claimTime,
+        lsccr.coupon_id
+        FROM
+        lmk_store_coupon_claim_record lsccr
+        INNER JOIN
+        li_member_coupon lmc ON lmc.id = lsccr.member_coupon_id
+        WHERE
+        lmc.delete_flag = 0
+        AND lsccr.delete_flag = 0
+        AND lmc.member_id = lsccr.user_id
+        <!-- 1. 浼氬憳鍚嶇О妯$硦鏌ヨ锛堝叧鑱攍i_member_coupon琛級 -->
+        <if test="query.memberName != null and query.memberName != ''">
+            AND lmc.member_name LIKE CONCAT('%', #{query.memberName}, '%')
+        </if>
+        <!-- 2. 浼樻儬鍒稿悕绉版ā绯婃煡璇紙鍏宠仈lmk_store_coupon_claim_record琛級 -->
+        <if test="query.couponName != null and query.couponName != ''">
+            AND lsccr.coupon_name LIKE CONCAT('%', #{query.couponName}, '%')
+        </if>
+        <!-- 3. 浼樻儬鍒歌幏鍙栨柟寮忥紙绮剧‘鍖归厤锛屽叧鑱攍i_member_coupon琛級 -->
+        <if test="query.getType != null and query.getType != ''">
+            AND lmc.get_type = #{query.getType}
+        </if>
+        <!-- 4. 浼氬憳浼樻儬鍒哥姸鎬侊紙绮剧‘鍖归厤锛屽叧鑱攍i_member_coupon琛級 -->
+        <if test="query.memberCouponStatus != null and query.memberCouponStatus != ''">
+            AND lmc.member_coupon_status = #{query.memberCouponStatus}
+        </if>
+        <!-- 5. 鏃堕棿鑼冨洿绛涢�夛細鐢˙ETWEEN鍖归厤start_time鍜宔nd_time锛堥渶鍚屾椂浼犲叆寮�濮嬪拰缁撴潫鏃堕棿锛� -->
+        <if test="query.startTime != null and query.endTime != null">
+            AND lsccr.create_time BETWEEN FROM_UNIXTIME(#{query.startTime}/1000)
+            AND FROM_UNIXTIME(#{query.endTime}/1000)
+        </if>
+        <!-- 6. 鎺掑簭閫昏緫锛堟牴鎹墠绔紶鍏ョ殑sort瀛楁鍜宱rder鎺掑簭鏂瑰悜锛� -->
+        <if test="query.sort != null and query.sort != '' and query.order != null and query.order != ''">
+            ORDER BY lsccr.create_time DESC
+        </if>
+    </select>
+
+</mapper>
diff --git a/framework/src/main/resources/mapper/lmk/StoreCouponMapper.xml b/framework/src/main/resources/mapper/lmk/StoreCouponMapper.xml
new file mode 100644
index 0000000..0ca1240
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/StoreCouponMapper.xml
@@ -0,0 +1,47 @@
+<?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.lili.modules.lmk.mapper.StoreCouponMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.StoreCouponVO">
+        <id column="id" property="id"/>
+        <result column="store_id" property="storeId" />
+        <result column="store_name" property="storeName" />
+        <result column="coupon_id" property="couponId" />
+        <result column="coupon_name" property="couponName" />
+    </resultMap>
+
+
+
+
+
+
+
+    <select id="getById" resultMap="BaseResultMap">
+        SELECT
+            LSC.store_id,
+            LSC.store_name,
+            LSC.coupon_id,
+            LSC.coupon_name,
+            LSC.id
+        FROM
+            lmk_store_coupon LSC
+        WHERE
+            LSC.id = #{id} AND LSC.delete_flag = 0
+    </select>
+
+
+    <select id="getPage" resultMap="BaseResultMap">
+        SELECT
+            LSC.store_id,
+            LSC.store_name,
+            LSC.coupon_id,
+            LSC.coupon_name,
+            LSC.id
+        FROM
+            lmk_store_coupon LSC
+        WHERE
+            LSC.delete_flag = 0
+    </select>
+
+</mapper>
diff --git a/framework/src/main/resources/mapper/lmk/StoreCouponSingleMapper.xml b/framework/src/main/resources/mapper/lmk/StoreCouponSingleMapper.xml
new file mode 100644
index 0000000..ae24455
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/StoreCouponSingleMapper.xml
@@ -0,0 +1,68 @@
+<?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.lili.modules.lmk.mapper.StoreCouponSingleMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.StoreCouponSingleVO">
+        <id column="id" property="id"/>
+        <result column="store_coup_ref" property="storeCoupRef" />
+        <result column="store_id" property="storeId" />
+        <result column="coupon_id" property="couponId" />
+        <result column="coupon_name" property="couponName" />
+        <result column="coupon_no" property="couponNo" />
+        <result column="claim_status" property="claimStatus" />
+    </resultMap>
+
+
+
+
+
+
+
+    <select id="getById" resultMap="BaseResultMap">
+        SELECT
+            LSCS.store_coup_ref,
+            LSCS.store_id,
+            LSCS.coupon_id,
+            LSCS.coupon_name,
+            LSCS.coupon_no,
+            LSCS.claim_status,
+            LSCS.id
+        FROM
+            lmk_store_coupon_single LSCS
+        WHERE
+            LSCS.id = #{id} AND LSCS.delete_flag = 0
+    </select>
+
+
+    <select id="getPage" resultMap="BaseResultMap">
+        SELECT
+            LSCS.store_coup_ref,
+            LSCS.store_id,
+            LSCS.coupon_id,
+            LSCS.coupon_name,
+            LSCS.coupon_no,
+            LSCS.claim_status,
+            LSCS.id
+        FROM
+            lmk_store_coupon_single LSCS
+        WHERE
+            LSCS.delete_flag = 0
+    </select>
+
+    <select id="getPageByRefId" resultMap="BaseResultMap">
+        SELECT
+            LSCS.store_coup_ref,
+            LSCS.store_id,
+            LSCS.coupon_id,
+            LSCS.coupon_name,
+            LSCS.coupon_no,
+            LSCS.claim_status,
+            LSCS.id
+        FROM
+            lmk_store_coupon_single LSCS
+        WHERE
+            LSCS.delete_flag = 0
+        AND LSCS.store_coup_ref = #{query.refId}
+    </select>
+</mapper>
diff --git a/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java b/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
index e2984b3..8edffe8 100644
--- a/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
+++ b/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
@@ -95,6 +95,11 @@
     }
 
 
+    /**
+     * 娴忚鏁版嵁鍜屼笅璁㈠崟鏃堕棿娈靛垎鏋�
+     * @param queryParam
+     * @return
+     */
     @GetMapping("/orderTimePeriod")
     public Result getOrderTimePeriod(StatisticsQueryParam queryParam) {
         return orderService.getOrderTimePeriod(queryParam);
diff --git a/manager-api/src/main/java/cn/lili/controller/lmk/StoreCouponController.java b/manager-api/src/main/java/cn/lili/controller/lmk/StoreCouponController.java
new file mode 100644
index 0000000..5d5b6c2
--- /dev/null
+++ b/manager-api/src/main/java/cn/lili/controller/lmk/StoreCouponController.java
@@ -0,0 +1,87 @@
+package cn.lili.controller.lmk;
+
+import cn.lili.base.Result;
+import cn.lili.common.context.ThreadContextHolder;
+import cn.lili.modules.lmk.domain.form.StoreCouponForm;
+import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
+import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
+import cn.lili.modules.lmk.domain.query.StoreCouponSingleQuery;
+import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
+import cn.lili.modules.lmk.service.StoreCouponService;
+import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 鍟嗗绔敓鎴愬簵閾轰紭鎯犲嵎淇℃伅
+ *
+ * @author : peng
+ * @date : 2025-09-16 16:36
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/manager/lmk/storeCoupon")
+public class StoreCouponController {
+
+    private final StoreCouponService storeCouponService;
+
+    private final StoreCouponClaimRecordService storeCouponClaimRecordService;
+    /**
+     * 鍒涘缓搴楅摵涓庝紭鎯犲嵎鍏宠仈鍏崇郴
+     * @param storeCoupon
+     * @return
+     */
+    @PostMapping
+    public Result addStoreCoupon(@RequestBody StoreCouponForm storeCoupon){
+      return  storeCouponService.addStoreCoupon(storeCoupon);
+    }
+    /**
+     * 淇敼璁㈠崟搴楅摵浼樻儬鍗风姸鎬�
+     * @param id
+     * @return
+     */
+    @PostMapping("/changeStatus/{id}")
+    public Result changeStatus(@PathVariable String id){
+      return  storeCouponService.changeStatus(id);
+    }
+
+    /**
+     * 鏍规嵁搴楅摵鍏宠仈鍏崇郴鐢熸垚鍗曞搧
+     * @param id
+     * @return
+     */
+    @PostMapping("/generateStoreCoupon/{id}")
+    public Result generateStoreCoupon(@PathVariable String id){
+      return  storeCouponService.generateStoreCoupon(id);
+    }
+
+    /**
+     * 鑾峰彇搴楅摵鍒楄〃
+     * @param query
+     * @return
+     */
+    @GetMapping
+    public Result getPage(StoreCouponQuery query){
+        return  storeCouponService.page(query);
+    }
+
+    @GetMapping("/getPageByStoreCoupon")
+    public Result getPageByStoreCoupon(StoreCouponSingleQuery query){
+        return storeCouponService.getPageByStoreCoupon(query);
+    }
+
+    @GetMapping("/getPageByStoreCouponClaimRecord")
+    public Result getPageByStoreCouponClaimRecord(StoreCouponClaimRecordQuery query){
+        return storeCouponClaimRecordService.page(query);
+    }
+
+    @ApiOperation(value = "鏌ヨ浼樻儬鍗峰鍑哄垪琛�")
+    @GetMapping("/queryExportCoupon")
+    public void queryExportCoupon(StoreCouponClaimRecordQuery query) {
+        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
+        storeCouponClaimRecordService.queryExportCoupon(response,query);}
+}

--
Gitblit v1.8.0