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