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