diff --git a/db/800pjcloudx_hardware.sql b/db/800pjcloudx_hardware.sql index 415012c9e..8c6394966 100644 --- a/db/800pjcloudx_hardware.sql +++ b/db/800pjcloudx_hardware.sql @@ -301,6 +301,37 @@ CREATE TABLE hard_order PRIMARY KEY (id) ) ENGINE = InnoDB COMMENT ='订单表'; + +-- ---------------------------- +-- Table structure for hard_order_address +-- ---------------------------- +DROP TABLE IF EXISTS `hard_order_address`; +CREATE TABLE hard_order_address +( + id bigint NOT NULL COMMENT '编号', + + user_id bigint NOT NULL COMMENT '用户id', + order_id bigint NOT NULL COMMENT '订单id', + + address_id bigint NOT NULL COMMENT '地址id', + address_name varchar(128) DEFAULT NULL COMMENT '地址名称', + + building_id bigint DEFAULT NULL COMMENT '楼栋id', + building_name varchar(128) DEFAULT NULL COMMENT '楼栋名称', + unit_id bigint DEFAULT NULL COMMENT '单元id', + unit_name varchar(128) DEFAULT NULL COMMENT '单元名', + room_id bigint DEFAULT NULL COMMENT '房间id', + room_name varchar(128) DEFAULT NULL COMMENT '房间名', + + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB COMMENT ='订单地址'; + -- ---------------------------- -- Table structure for hard_after_sale -- ---------------------------- diff --git a/db/810pjcloudx_wallet_act.sql b/db/810pjcloudx_wallet_act.sql index f5a234a9b..824905a47 100644 --- a/db/810pjcloudx_wallet_act.sql +++ b/db/810pjcloudx_wallet_act.sql @@ -6,15 +6,15 @@ create table act_cancel notice_id BIGINT(19) not null comment '公告id', active_org_price INT(10) null comment '活动原价', active_cancel_price INT(10) not null comment '活动核销价', - start_time DATETIME null comment '开始时间', - expire_time DATETIME not null comment '到期时间', - act_status CHAR(32) not null comment '活动状态(1:正常 2:关闭)', - act_title CHAR(32) not null comment '活动标题', - act_content CHAR(32) null comment '活动内容', - create_by VARCHAR(64) null comment '创建人', - create_time DATETIME null comment '创建时间', - update_by VARCHAR(64) null comment '修改人', - update_time DATETIME null comment '修改时间', + start_time DATETIME null comment '开始时间', + expire_time DATETIME not null comment '到期时间', + act_status CHAR(32) not null comment '活动状态(1:正常 2:关闭)', + act_title CHAR(32) not null comment '活动标题', + act_content CHAR(32) null comment '活动内容', + create_by VARCHAR(64) null comment '创建人', + create_time DATETIME null comment '创建时间', + update_by VARCHAR(64) null comment '修改人', + update_time DATETIME null comment '修改时间', del_flag CHAR default '0' null comment '删除标记', tenant_id BIGINT(19) null comment '租户ID' ); @@ -41,4 +41,61 @@ CREATE TABLE act_cancel_item del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', tenant_id bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (id) -) ENGINE = InnoDB COMMENT ='核销活动项'; \ No newline at end of file +) ENGINE = InnoDB COMMENT ='核销活动项'; + + +-- ---------------------------- +-- Table structure for act_ad +-- ---------------------------- +DROP TABLE IF EXISTS act_ad; +CREATE TABLE act_ad +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '广告活动id', + unique_code varchar(64) NOT NULL COMMENT '广告活动唯一code', + name varchar(64) NOT NULL COMMENT '优惠券名称', + description varchar(256) NOT NULL COMMENT '优惠券描述', + type_list varchar(128) NOT NULL COMMENT '活动类型列表', + status varchar(32) NOT NULL COMMENT '状态(0:草稿 1:进行中 2:已结束 3:已作废)', + + ad_viewing_limit int DEFAULT NULL COMMENT '广告查看限制(次/天)', + ad_viewing_limit_unit varchar(32) DEFAULT NULL COMMENT '广告查看限制单位(1:天 2:周 3:月 4:年)', + + start_time datetime NOT NULL COMMENT '活动开始时间', + end_time datetime NOT NULL COMMENT '活动到期时间', + + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB COMMENT ='商家广告活动'; + +-- ---------------------------- +-- Table structure for act_ad +-- ---------------------------- +DROP TABLE IF EXISTS act_ad_; +CREATE TABLE act_ad +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '广告活动id', + unique_code varchar(64) NOT NULL COMMENT '广告活动唯一code', + name varchar(64) NOT NULL COMMENT '优惠券名称', + description varchar(256) NOT NULL COMMENT '优惠券描述', + type_list varchar(128) NOT NULL COMMENT '活动类型列表', + status varchar(32) NOT NULL COMMENT '状态(0:草稿 1:进行中 2:已结束 3:已作废)', + + ad_viewing_limit int DEFAULT NULL COMMENT '广告查看限制(次/天)', + ad_viewing_limit_unit varchar(32) DEFAULT NULL COMMENT '广告查看限制单位(1:天 2:周 3:月 4:年)', + + start_time datetime NOT NULL COMMENT '活动开始时间', + end_time datetime NOT NULL COMMENT '活动到期时间', + + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB COMMENT ='商家广告活动'; \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java index 9aa0f36c2..3de623c28 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java @@ -15,6 +15,7 @@ import java.util.Map; @Getter public enum HardTypeEnum { + NONE("-1", "无"), SUPERMARKET("1", "超市"), CANTEEN("2", "食堂"), READ_CARD("3", "读卡器"), diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java index d35321804..d3d207e88 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java @@ -22,6 +22,7 @@ public enum HardOrderTypeEnum { FARMER("7", "共富商城(助农)"), TOC_VISITOR("8", "toc访客购买(不记名用户)"), XFJ("9", "消费机支付"), + TAKE_OUT("10", "外卖"), ; private final String type; private final String description; @@ -31,7 +32,7 @@ public enum HardOrderTypeEnum { return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); } - public static final List refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY, LB, FARMER, XFJ); + public static final List refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY, LB, FARMER, XFJ, TAKE_OUT); public static final List payList = List.of(BELOW, RESERVE); diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderAddressDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderAddressDto.java new file mode 100644 index 000000000..18d1e90b9 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderAddressDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.hard.api.dto.order; + +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class HardOrderAddressDto extends HardOrderAddressEntity { + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java index 680926051..bc7c3b51a 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java @@ -39,6 +39,9 @@ public class HardAppCreateOrderDto { // 用户自定义的价格(分)不是通过计算购物车总价得来的 private Integer customPrice; + // 配送价格(分) + private Integer deliveryPrice; + // 商户id private Long merchantId; @@ -48,4 +51,7 @@ public class HardAppCreateOrderDto { // 预约id private Long apptId; + // 地址 + private HardAppTakeOutAddress address; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateTakeOutOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateTakeOutOrderDto.java new file mode 100644 index 000000000..37e3c6fbb --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateTakeOutOrderDto.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.dto.order.app; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardAppCreateTakeOutOrderDto { + + /** + * 父购物车id + */ + @NotNull(message = "父购物车id不能为空") + private Long carParentId; + + /** + * 配送价格(分) + */ + private Integer deliveryPrice; + + /** + * 外卖地址 + */ + @NotNull(message = "外卖地址不能为空") + private HardAppTakeOutAddress address; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppTakeOutAddress.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppTakeOutAddress.java new file mode 100644 index 000000000..ef45d7d96 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppTakeOutAddress.java @@ -0,0 +1,58 @@ +package com.bsd.pjcloud.hard.api.dto.order.app; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +@Data +public class HardAppTakeOutAddress { + + /** + * 地址id + */ + private Long addressId; + + /** + * 楼栋id + */ + private Long buildingId; + + /** + * 楼栋名 + */ + private String buildingName; + + /** + * 单元id + */ + private Long unitId; + + /** + * 单元名 + */ + private String unitName; + + /** + * 房间id + */ + private Long roomId; + + /** + * 房间名 + */ + private String roomName; + + public String getAddressName() { + String addressName = ""; + if (ObjectUtil.isNotEmpty(buildingName)) { + addressName += buildingName; + } + if (ObjectUtil.isNotEmpty(unitName)) { + addressName += "-" + unitName; + } + if (ObjectUtil.isNotEmpty(roomName)) { + addressName += "-" + roomName; + } + return addressName; + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderAddressEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderAddressEntity.java new file mode 100755 index 000000000..ab0f147c3 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderAddressEntity.java @@ -0,0 +1,130 @@ +package com.bsd.pjcloud.hard.api.entity.order; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 订单地址 + */ +@Data +@TenantTable +@TableName("hard_order_address") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "订单地址") +public class HardOrderAddressEntity extends Model { + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "编号") + private Long id; + + /** + * 用户id + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 订单id + */ + @Schema(description = "订单id") + private Long orderId; + + /** + * 地址id + */ + @Schema(description = "地址id") + private Long addressId; + + /** + * 地址名称 + */ + @Schema(description = "地址名称") + private String addressName; + + /** + * 楼栋id + */ + @Schema(description = "楼栋id") + private Long buildingId; + + /** + * 楼栋名称 + */ + @Schema(description = "楼栋名称") + private String buildingName; + + /** + * 单元id + */ + @Schema(description = "单元id") + private Long unitId; + + /** + * 单元名 + */ + @Schema(description = "单元名") + private String unitName; + + /** + * 房间id + */ + @Schema(description = "房间id") + private Long roomId; + + /** + * 房间名 + */ + @Schema(description = "房间名") + private String roomName; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java index 4c9c96c93..10680da77 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java @@ -147,6 +147,12 @@ public class HardOrderEntity extends Model { @Schema(description = "额外价格(分)") private Integer extraPrice; + /** + * 配送价格(分) + */ + @Schema(description = "配送价格(分)") + private Integer deliveryPrice; + /** * 支付金额(分) */ @@ -219,6 +225,12 @@ public class HardOrderEntity extends Model { @Schema(description = "离线自动支付是否成功") private String offlinePaySuccess; + /** + * 收货地址 + */ + @Schema(description = "收货地址") + private String addressName; + /** * 创建人 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderAddressVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderAddressVo.java new file mode 100644 index 000000000..a506cbe86 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderAddressVo.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.hard.api.vo.order; + +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; +import lombok.Data; + +@Data +public class HardOrderAddressVo extends HardOrderAddressEntity { + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderAddressController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderAddressController.java new file mode 100755 index 000000000..1576f1922 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderAddressController.java @@ -0,0 +1,101 @@ +package com.bsd.pjcloud.hard.controller.order; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; +import com.bsd.pjcloud.hard.service.HardOrderAddressService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 订单地址 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hardOrderAddress") +@Tag(description = "hardOrderAddress", name = "订单地址管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardOrderAddressController { + + private final HardOrderAddressService hardOrderAddressService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('hard_hardOrderAddress_view')") + public R getHardOrderAddressPage(@ParameterObject Page page, @ParameterObject HardOrderAddressEntity hardOrderAddress) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(hardOrderAddressService.page(page, wrapper)); + } + + /** + * 通过id查询订单地址 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('hard_hardOrderAddress_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(hardOrderAddressService.getById(id)); + } + + /** + * 新增订单地址 + */ + @Operation(summary = "新增订单地址", description = "新增订单地址") + @SysLog("新增订单地址") + @PostMapping + @PreAuthorize("@pms.hasPermission('hard_hardOrderAddress_add')") + public R save(@RequestBody HardOrderAddressEntity hardOrderAddress) { + return R.ok(hardOrderAddressService.save(hardOrderAddress)); + } + + /** + * 修改订单地址 + */ + @Operation(summary = "修改订单地址", description = "修改订单地址") + @SysLog("修改订单地址") + @PutMapping + @PreAuthorize("@pms.hasPermission('hard_hardOrderAddress_edit')") + public R updateById(@RequestBody HardOrderAddressEntity hardOrderAddress) { + return R.ok(hardOrderAddressService.updateById(hardOrderAddress)); + } + + /** + * 通过id删除订单地址 + */ + @Operation(summary = "通过id删除订单地址", description = "通过id删除订单地址") + @SysLog("通过id删除订单地址") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('hard_hardOrderAddress_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(hardOrderAddressService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('hard_hardOrderAddress_export')") + public List export(HardOrderAddressEntity hardOrderAddress, Long[] ids) { + return hardOrderAddressService.list(Wrappers.lambdaQuery(hardOrderAddress).in(ArrayUtil.isNotEmpty(ids), HardOrderAddressEntity::getId, ids)); + } + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java index 73ad417a4..b2549385f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java @@ -36,6 +36,7 @@ import com.bsd.pjcloud.hard.api.dto.order.HardOrderPreferencesDto; import com.bsd.pjcloud.hard.api.dto.order.act.HardCreateActOrderDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateFarmerOrderDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; +import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateTakeOutOrderDto; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; import com.bsd.pjcloud.hard.api.vo.order.excel.HardOrderExcelVo; @@ -197,6 +198,25 @@ public class HardOrderController { return R.ok(hardwareOrderService.appCreateOrder(dto)); } + @Operation(summary = "app创建食堂外卖订单", description = "app创建食堂外卖订单") + @PostMapping("/app/create-take-out-order") + @Idempotent(expireTime = 3, key = "'/app/hard-order/app/create-take-out-order' + #dto.getCarParentId() ", info = "正在创建订单中,请勿重复操作") + public R appCreateTakeOutOrder(@Validated @RequestBody HardAppCreateTakeOutOrderDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + HardAppCreateOrderDto createOrderDto = HardAppCreateOrderDto.builder() + .carParentId(dto.getCarParentId()) + .walletType(WalletTypeEnum.EAT) + .hardType(HardTypeEnum.NONE) + .userId(user.getId()) + .orderType(HardOrderTypeEnum.TAKE_OUT) + .payType(HardPayTypeEnum.WALLET_DEFAULT) + .apptId(null) + .address(dto.getAddress()) + .deliveryPrice(dto.getDeliveryPrice()) + .build(); + return R.ok(hardwareOrderService.appCreateTakeOutOrder(createOrderDto)); + } + @Operation(summary = "app创建线上超市预定订单", description = "app创建线上超市预定订单") @GetMapping("/app/create-supermarket-order") @Idempotent(expireTime = 3, key = "'/app/hard-order/app/create-supermarket-order' + #carParentId ", info = "正在创建订单中,请勿重复操作") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderAddressMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderAddressMapper.java new file mode 100755 index 000000000..66d40f17a --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderAddressMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.hard.mapper.order; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface HardOrderAddressMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderAddressService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderAddressService.java new file mode 100755 index 000000000..74a84e3a6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderAddressService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.hard.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; + +public interface HardOrderAddressService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index 232a19694..e6e3ffe15 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java @@ -69,6 +69,11 @@ public interface HardOrderService extends IService { */ Long appCreateOrder(@Valid HardAppCreateOrderDto dto); + /** + * app创建食堂外卖订单 + */ + Long appCreateTakeOutOrder(HardAppCreateOrderDto createOrderDto); + /** * app创建线上超市预定订单 */ @@ -157,5 +162,4 @@ public interface HardOrderService extends IService { * 是否需要支付 */ boolean isPay(HardOrderTypeEnum type, HardPayTypeEnum payType); - } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderAddressServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderAddressServiceImpl.java new file mode 100755 index 000000000..7576ce7f1 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderAddressServiceImpl.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.hard.service.impl.order; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; +import com.bsd.pjcloud.hard.mapper.order.HardOrderAddressMapper; +import com.bsd.pjcloud.hard.service.HardOrderAddressService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 订单地址 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class HardOrderAddressServiceImpl extends ServiceImpl implements HardOrderAddressService { + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 031122336..8898b7529 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -56,6 +56,7 @@ import com.bsd.pjcloud.hard.api.entity.HardApptEntity; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderAddressEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; @@ -139,6 +140,7 @@ public class HardOrderServiceImpl extends ServiceImpl 3) throw new RuntimeException("您有" + reserveCount + "笔未核销的预约订单,请先核销"); + // 钱包 + WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), dto.getWalletType()).getData(); + if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); + // 查询父订单 + HardParentCarEntity parentCar = hardCarService.getParentCarById(dto.getCarParentId()); + if (ObjectUtil.isEmpty(parentCar)) throw new RuntimeException("购物车不存在"); + // 查询商户 + MchManageVo hardManager = remoteMchService.getById(parentCar.getMerchantId()).getData(); + if (ObjectUtil.isEmpty(hardManager)) throw new RuntimeException("商户不存在"); + // 查询父购物车 + List carList = hardCarService.getByParentCarId(dto.getCarParentId()); + if (ObjectUtil.isEmpty(carList)) throw new RuntimeException("购物车不存在"); + Integer balance = wallet.getBalance(); + int carPrice = (int) carList.stream().mapToLong(HardCarEntity::getTotalPrice).sum(); + int totalPrice = carPrice; + // 增加配送费 + if (ObjectUtil.isNotEmpty(dto.getDeliveryPrice())) { + totalPrice += dto.getDeliveryPrice(); + } + if (balance < totalPrice) { + throw new RuntimeException("钱包余额不足"); + } + // 是否需要支付 + boolean isPay = isPay(dto.getOrderType(), dto.getPayType()); + // 获取商品描述 + List carListDto = carList.stream().map(v -> { + HardCreateCarDto entity = new HardCreateCarDto(); + entity.setParentCarId(dto.getCarParentId()); + entity.setProductId(v.getProductId()); + entity.setProductWeight(v.getProductWeight()); + entity.setProductCount(v.getProductCount()); + return entity; + }).toList(); + HardTypeEnum hardType = ObjectUtil.equals(dto.getWalletType(), WalletTypeEnum.EAT) ? HardTypeEnum.CANTEEN : HardTypeEnum.SUPERMARKET; + String subject = hardCarService.computerCarSubject(hardType, dto.getOrderType(), carListDto); + // 添加硬件订单 + HardOrderEntity orderObj = HardOrderEntity.builder() + .userId(dto.getUserId()) + .userDeptId(userDetail.getSysUser().getDeptId()) + .parentCarId(dto.getCarParentId()) + .sysType(dto.getHardType().getType()) + .orderStatus(HardOrderStatusEnum.CREATE.getType()) + .merchantId(parentCar.getMerchantId()) + .merchantType(hardManager.getTypes()) + .merchantDeptId(hardManager.getDeptId()) + .orderType(dto.getOrderType().getType()) + .payType(dto.getPayType().getType()) + .orderSourceTypeId(dto.getOrderSourceTypeId()) + .totalPrice(carPrice) + .extraPrice(0) + .payPrice(totalPrice) + .isOfflineOrder(YesNoEnum.NO.getCode()) + .deliveryPrice(dto.getDeliveryPrice()) + .productDesc(subject) + .build(); + if (ObjectUtil.isNotEmpty(dto.getAddress())) { + orderObj.setAddressName(dto.getAddress().getAddressName()); + } + if (isPay) orderObj.setWalletId(wallet.getId()); + baseMapper.insert(orderObj); + // 钱包扣款 + if (isPay) getSelf().fastReduceBalance(orderObj); + // 是否需要创建二维码 + getSelf().generateCode(orderObj); + // 发送mq消息 + getSelf().createOrderAfterSendMqMsg(orderObj.getId(), userDetail); + // 扣减库存 + getSelf().fastenerInventory(orderObj, YesNoEnum.YES); + // 添加地址 + if (ObjectUtil.isNotEmpty(dto.getAddress())) { + HardOrderAddressEntity addressEntity = new HardOrderAddressEntity(); + addressEntity.setUserId(orderObj.getUserId()); + addressEntity.setOrderId(orderObj.getId()); + addressEntity.setAddressId(dto.getAddress().getAddressId()); + addressEntity.setAddressName(dto.getAddress().getAddressName()); + addressEntity.setBuildingId(dto.getAddress().getBuildingId()); + addressEntity.setBuildingName(dto.getAddress().getBuildingName()); + addressEntity.setUnitId(dto.getAddress().getUnitId()); + addressEntity.setUnitName(dto.getAddress().getUnitName()); + addressEntity.setRoomId(dto.getAddress().getRoomId()); + addressEntity.setRoomName(dto.getAddress().getRoomName()); + hardOrderAddressService.save(addressEntity); + } + return orderObj.getId(); + } + /** * app创建线上超市预定订单 */ @@ -1100,7 +1202,7 @@ public class HardOrderServiceImpl extends ServiceImpl + + + + + + select a.id, + a.user_id, + a.order_id, + a.address_id, + a.address_name, + a.building_id, + a.building_name, + a.unit_id, + a.unit_name, + a.room_id, + a.room_name, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.user_id = #{dto.userId} + + + and a.address_name LIKE CONCAT('%',#{dto.addressName},'%') + + + + \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index c481a446a..bf61295ff 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -61,6 +61,7 @@ a.sys_type, a.total_price, a.extra_price, + a.delivery_price, a.pay_price, a.pay_time, a.pay_refund_id, @@ -72,6 +73,7 @@ a.is_offline_order, a.product_desc, a.offline_pay_success, + a.address_name, a.create_by, a.create_time, a.update_by, diff --git a/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/ad/AdIntegralTotalVo.java b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/ad/AdIntegralTotalVo.java new file mode 100644 index 000000000..9b6e2007a --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/ad/AdIntegralTotalVo.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.integrated.vo.ad; + +import lombok.Data; + +@Data +public class AdIntegralTotalVo { + + /** + * 今日已看 + */ + private Integer todayView; + + /** + * 每天观看的上限 + */ + private Integer todayViewLimit; + +} diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/ad/AdRecordController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/ad/AdRecordController.java index 579f90c95..c633f9146 100755 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/ad/AdRecordController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/ad/AdRecordController.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; @@ -11,6 +12,7 @@ import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.integrated.dto.ad.AdRecordDto; import com.bsd.pjcloud.integrated.service.AdRecordService; +import com.bsd.pjcloud.integrated.vo.ad.AdIntegralTotalVo; import com.bsd.pjcloud.integrated.vo.ad.AdRecordVo; import com.bsd.pjcloud.integrated.entity.ad.AdRecordEntity; import com.bsd.pjcloud.thirdparty.dto.ad.UniappAdCallbackDto; @@ -49,7 +51,7 @@ public class AdRecordController { /* ************************************* start 远程调用 start ************************************* */ - /* ************************************* start 增加广告浏览记录 start ************************************* */ + /* ************************************* start app start ************************************* */ @Operation(summary = "上报广告浏览记录", description = "上报广告浏览记录") @PostMapping("/app/report-ad-view") public R reportAdView(@RequestBody AdRecordDto dto) { @@ -57,7 +59,23 @@ public class AdRecordController { dto.setUserId(user.getId()); return R.ok(adRecordService.reportAdView(dto)); } - /* ************************************* start 增加广告浏览记录 start ************************************* */ + +// @Operation(summary = "个人积分广告统计", description = "个人积分广告统计") +// @PostMapping("/app/integral-total") +// public R integralTotal() { +// PjcloudUser user = SecurityUtils.getUser(); +// return R.ok(adRecordService.integralTotal(user.getId())); +// } + + @Operation(summary = "个人积分广告分页", description = "个人积分广告分页") + @GetMapping("/app/integral-page") + public R> integralPage(@ParameterObject Page page, @ParameterObject AdRecordDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); + dto.setIntegralNumNullStatus(YesNoEnum.YES.getCode()); + return R.ok(adRecordService.pageList(page, dto)); + } + /* ************************************* start app start ************************************* */ /** * 分页查询 diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/ad/AdRecordDto.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/ad/AdRecordDto.java index 3a2990a2f..e2e5751b7 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/ad/AdRecordDto.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/ad/AdRecordDto.java @@ -8,6 +8,8 @@ import java.time.LocalDateTime; @Data public class AdRecordDto extends AdRecordEntity { + private String integralNumNullStatus; + private LocalDateTime[] createTimeList; } diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/ad/AdRecordEntity.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/ad/AdRecordEntity.java index 5618d8ed6..a4d2f4314 100755 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/ad/AdRecordEntity.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/ad/AdRecordEntity.java @@ -99,6 +99,12 @@ public class AdRecordEntity extends Model { @Schema(description = "广告预计收入") private Integer adPredictPrice; + /** + * 获取的积分 + */ + @Schema(description = "获取的积分") + private Integer integralNum; + /** * 创建人 */ diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AdRecordService.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AdRecordService.java index b5ceda5fc..ec5bbf270 100755 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AdRecordService.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AdRecordService.java @@ -3,6 +3,7 @@ package com.bsd.pjcloud.integrated.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.integrated.dto.ad.AdRecordDto; +import com.bsd.pjcloud.integrated.vo.ad.AdIntegralTotalVo; import com.bsd.pjcloud.integrated.vo.ad.AdRecordVo; import com.bsd.pjcloud.integrated.entity.ad.AdRecordEntity; import com.bsd.pjcloud.thirdparty.dto.ad.UniappAdCallbackDto; diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/ad/ThirdAdRecordMapper.xml b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/ad/ThirdAdRecordMapper.xml index 7043bf15b..20861f12d 100755 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/ad/ThirdAdRecordMapper.xml +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/ad/ThirdAdRecordMapper.xml @@ -15,6 +15,7 @@ a.visit_duration, a.status, a.extra, + a.integral_num, a.create_time, a.update_time, a.create_by, @@ -37,6 +38,14 @@ and a.ad_type = #{dto.adType} + + + and a.integral_num is null + + + and a.integral_num is not null + + and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java index 9a05b57c4..2b6e76767 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java @@ -15,6 +15,7 @@ public enum WalletCodeBizEnum { SUPERMARKET_RESERVE("4", "超市线上预订"), USER_WALLET("5", "用户钱包二维码"), FARMER_RESERVE("6", "用户钱包二维码"), + ACT("6", "活动二维码"), ; private final String code; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java new file mode 100644 index 000000000..a2762160c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券限领类型 + */ +@Getter +@AllArgsConstructor +public enum ActCouponLimitTypeEnum { + + ONCE("1", "活动期间一次"), + EVERY_DAY("2", "每天"), + EVERY_WEEK("3", "每周"), + EVERY_MONTH("4", "每月"), + EVERY_YEAR("5", "每年"), + ; + private final String code; + private final String desc; + + public static ActCouponLimitTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponLimitTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponLimitTypeEnum descOf(String description) { + return Arrays.stream(ActCouponLimitTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java new file mode 100644 index 000000000..103fbf359 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券使用状态 + */ +@Getter +@AllArgsConstructor +public enum ActCouponRecordStatusEnum { + UNUSED("1", "未使用"), + USED("2", "已使用"), + EXPIRED("3", "已过期"), + INVALID("4", "已作废"), + ; + private final String code; + private final String desc; + + public static ActCouponRecordStatusEnum valueOfByType(String code) { + return Arrays.stream(ActCouponRecordStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponRecordStatusEnum descOf(String description) { + return Arrays.stream(ActCouponRecordStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java new file mode 100644 index 000000000..94972d212 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java @@ -0,0 +1,36 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券状态 + */ +@Getter +@AllArgsConstructor +public enum ActCouponStatusEnum { + CAOGAO("1", "草稿"), + JINXINGZHONG("2", "进行中"), + YIJIESHU("3", "已结束"), + YIZUOFEI("4", "已作废"), + ; + + private final String code; + private final String desc; + + public static ActCouponStatusEnum valueOfByType(String code) { + return Arrays.stream(ActCouponStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponStatusEnum descOf(String description) { + return Arrays.stream(ActCouponStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java new file mode 100644 index 000000000..c060b1a9d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券类型 + */ +@Getter +@AllArgsConstructor +public enum ActCouponTypeEnum { + MANJIAN_QUAN("1", "满减券"), + ZHEKOU_QUAN("2", "折扣券"), + LIJIAN_QUAN("3", "立减券"), + DUIHUAN_QUAN("4", "兑换券"), + ; + private final String code; + private final String desc; + + public static ActCouponTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponTypeEnum descOf(String description) { + return Arrays.stream(ActCouponTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java new file mode 100644 index 000000000..8a4f092db --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java @@ -0,0 +1,33 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券适用范围 + */ +@Getter +@AllArgsConstructor +public enum ActCouponUseScopeTypeEnum { + ALL_USE("1", "全场通用"), + SPECIFIED_MERCHANT("2", "指定商户"), + SPECIFIED_CATEGORY("3", "指定商户分类"), + ; + private final String code; + private final String desc; + + public static ActCouponUseScopeTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponUseScopeTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponUseScopeTypeEnum descOf(String description) { + return Arrays.stream(ActCouponUseScopeTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java new file mode 100644 index 000000000..15072eb4e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java @@ -0,0 +1,33 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券有效期类型 + */ +@Getter +@AllArgsConstructor +public enum ActCouponValidTypeEnum { + FIXED_DATE("1", "固定日期"), + AFTER_RECEIVE("2", "领取后生效"), + AFTER_RECEIVE_CURRENT_MONTH("3", "领取后当月"), + ; + private final String code; + private final String desc; + + public static ActCouponValidTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponValidTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponValidTypeEnum descOf(String description) { + return Arrays.stream(ActCouponValidTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTimeLimitTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTimeLimitTypeEnum.java new file mode 100644 index 000000000..efad3c173 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTimeLimitTypeEnum.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 活动时间限制 + */ +@Getter +@AllArgsConstructor +public enum ActTimeLimitTypeEnum { + + ONCE("1", "活动期间一次"), + EVERY_DAY("2", "每天"), + EVERY_WEEK("3", "每周"), + EVERY_MONTH("4", "每月"), + EVERY_YEAR("5", "每年"), + ; + private final String code; + private final String desc; + + public static ActTimeLimitTypeEnum valueOfByType(String code) { + return Arrays.stream(ActTimeLimitTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActTimeLimitTypeEnum descOf(String description) { + return Arrays.stream(ActTimeLimitTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java new file mode 100644 index 000000000..475b5a03d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * 核销活动状体啊 + */ +@Getter +@AllArgsConstructor +public enum ActTypeEnum { + + CANCEL_ACT("1", "核销活动", 1), + COUPON_ACT("2", "优惠券活动", 2), + ; + + private final String code; + private final String desc; + private final int priority; + + public static ActTypeEnum valueOfByType(String code) { + return Arrays.stream(ActTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().get(); + } + + public static ActTypeEnum descOf(String description) { + return Arrays.stream(ActTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + + public static List sortList(){ + return Arrays.asList(ActTypeEnum.values()).stream().sorted((o1, o2) -> o2.priority - o1.priority).toList(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java new file mode 100644 index 000000000..ec115f598 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java @@ -0,0 +1,46 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户活动状态 + */ +@Getter +@AllArgsConstructor +public enum ActUserReceiveEnum { + + ACT_EXPIRED("1", "活动不在进行中"), + ACT_NOT_EXIST("2", "活动不存在"), + ACT_NOT_STARTED("3", "活动未开启"), + // 用户参加活动已达上限 + USER_LIMIT_REACHED("4", "已领取,核销码在我的礼券中"), + USER_CANNOT_PARTICIPATE("5", "用户不能参加此活动"), + OTHER_ERROR("6", "其他错误"), + USER_CAN_JOIN_ACT("99", "用户可以参加活动"), + + // 特殊 + PLEASE_RECEIVE_IN_BIRTH_MONTH("-100", "请在生日当月领取"), + PLEASE_FILL_BIRTH_DATE("-101", "请填写出生日期"), + BIRTHDAY_PERIOD_ENDED("-102", "生日已结束"), + ; + + private final String code; + private final String desc; + + public static ActUserReceiveEnum valueOfByType(String code) { + return Arrays.stream(ActUserReceiveEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActUserReceiveEnum descOf(String description) { + return Arrays.stream(ActUserReceiveEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActAdDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActAdDto.java new file mode 100644 index 000000000..b2bcb81ae --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActAdDto.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import lombok.Data; + +@Data +public class ActAdDto extends ActAdEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java new file mode 100644 index 000000000..94437c022 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import lombok.Data; + +@Data +public class ActCouponDto extends ActCouponEntity { +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java new file mode 100644 index 000000000..be0bcea7e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ActCouponReceiveDto { + + /** + * 领取优惠券的用户id + */ + private Long receiveUserId; + + /** + * 优惠券id + */ + @NotNull(message = "优惠券id不能为空") + private Long couponId; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java new file mode 100644 index 000000000..fd7266f81 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ActCouponRecordDto extends ActCouponRecordEntity { + + /** + * 是否查询未过期的核销项 + */ + private Boolean isFindNoExpire = false; + + private List statusCodeList; + + private LocalDateTime[] createTimeList; + + private Long parentActId; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCreateAdCouponDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCreateAdCouponDto.java new file mode 100644 index 000000000..c64b3d887 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCreateAdCouponDto.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ActCreateAdCouponDto { + + @NotNull(message = "广告活动id不存在") + private Long actAdId; + + @NotEmpty(message = "活动状态不能为空") + private String status; + + @NotEmpty(message = "优惠券金额不能为空") + private Integer faceValue; + + @NotEmpty(message = "需要兑换的积分") + private Integer integralNum; + + private String description; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActAdEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActAdEntity.java new file mode 100755 index 000000000..2ce3c6f83 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActAdEntity.java @@ -0,0 +1,124 @@ +package com.bsd.pjcloud.wallet.api.entity.act; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 广告活动 + */ +@Data +@TenantTable +@TableName("act_ad") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "广告活动") +public class ActAdEntity extends Model { + + /** + * 广告活动id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "广告活动id") + private Long id; + + /** + * 广告活动唯一code + */ + @Schema(description = "广告活动唯一code") + private String uniqueCode; + + /** + * 优惠券名称 + */ + @Schema(description = "优惠券名称") + private String name; + + /** + * 优惠券描述 + */ + @Schema(description = "优惠券描述") + private String description; + + /** + * 活动类型列表 + */ + @Schema(description = "活动类型列表") + private String typeList; + + /** + * 状态(0:草稿 1:进行中 2:已结束 3:已作废) + */ + @Schema(description = "状态(0:草稿 1:进行中 2:已结束 3:已作废)") + private String status; + + /** + * 广告查看限制(次/天) + */ + @Schema(description = "广告查看限制(次/天)") + private Integer adViewingLimit; + + /** + * 广告查看限制单位(1:天 2:周 3:月 4:年) + */ + @Schema(description = "广告查看限制单位(1:天 2:周 3:月 4:年)") + private String adViewingLimitUnit; + + /** + * 活动开始时间 + */ + @Schema(description = "活动开始时间") + private LocalDateTime startTime; + + /** + * 活动到期时间 + */ + @Schema(description = "活动到期时间") + private LocalDateTime endTime; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java new file mode 100755 index 000000000..3b164b9fc --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java @@ -0,0 +1,201 @@ +package com.bsd.pjcloud.wallet.api.entity.act; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.bsd.pjcloud.common.core.util.TenantTable; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 优惠券活动 + */ +@Data +@TenantTable +@TableName("act_coupon") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "优惠券活动") +public class ActCouponEntity extends Model { + + + /** + * 优惠券ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "优惠券ID") + private Long id; + + /** + * 父活动id + */ + @Schema(description = "父活动id") + private Long parentActId; + + /** + * 优惠券活动唯一code + */ + @Schema(description = "优惠券活动唯一code") + private String uniqueCode; + + /** + * 绑定的通知id + */ + @Schema(description = "绑定的通知id") + private Long bindNotifyId; + + /** + * 优惠券名称 + */ + @Schema(description = "优惠券名称") + private String name; + + /** + * 优惠券类型 (1:满减券 2:折扣券 3:立减券 4:兑换券) + */ + @Schema(description = "优惠券类型 (1:满减券 2:折扣券 3:立减券 4:兑换券)") + private String type; + + /** + * 面额/折扣 (满减/立减单位:分, 折扣单位:百分比) + */ + @Schema(description = "面额/折扣(满减/立减单位:分,折扣单位:百分比)") + private Integer faceValue; + + /** + * 使用门槛 (满多少分可用, 0表示无门槛) + */ + @Schema(description = "使用门槛(满多少分可用,null表示无门槛)") + private Integer minPoint; + + /** + * 发行总量 (-1表示不限量) + */ + @Schema(description = "发行总量(null表示不限量)") + private Integer totalCount; + + /** + * 剩余数量 + */ + @Schema(description = "剩余数量") + private Integer surplusCount; + + /** + * 每人限领数量 + */ + @Schema(description = "每人限领数量") + private Integer limitCount; + + /** + * 限领类型 (once:活动期间一次 day:每天 week:每周 month:每月 year:每年) + */ + @Schema(description = "限领类型 (once:活动期间一次 day:每天 week:每周 month:每月 year:每年)") + private String limitType; + + /** + * 有效期类型 (1:固定日期 2:领取后生效) + */ + @Schema(description = "有效期类型 (1:固定日期 2:领取后生效)") + private String validType; + + /** + * 有效期开始时间 + */ + @Schema(description = "有效期开始时间") + private LocalDateTime validStartTime; + + /** + * 有效期结束时间 + */ + @Schema(description = "有效期结束时间") + private LocalDateTime validEndTime; + + /** + * 领取后有效天数 + */ + @Schema(description = "领取后有效天数") + private Integer validDays; + + /** + * 适用范围 (1:全场通用 2:指定商户 3:指定分类 4:指定商品) + */ + @Schema(description = "适用范围 (0:全场通用 1:指定商户 2:指定分类 3:指定商品)") + private String useScopeType; + + /** + * 适用范围ID集合 (商户ID/分类ID/商品ID, 逗号分隔) + */ + @Schema(description = "适用范围ID集合 (商户ID/分类ID/商品ID, 逗号分隔)") + private String scopeId; + + /** + * 状态(1:草稿2:进行中3:已结束4:已作废) + */ + @Schema(description = "状态(1:草稿2:进行中3:已结束4:已作废)") + private String status; + + /** + * 使用说明 + */ + @Schema(description = "使用说明") + private String description; + + /** + * 额外的json + */ + @Schema(description = "额外的json") + private String extraJson; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; + + @Data + static public class ActAdExtraJson { + + /** + * 需要兑换的积分数 + */ + private Integer integralNum; + + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java new file mode 100755 index 000000000..bcc493646 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java @@ -0,0 +1,154 @@ +package com.bsd.pjcloud.wallet.api.entity.act; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.bsd.pjcloud.common.core.util.TenantTable; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 优惠券领取记录表 + */ +@Data +@TenantTable +@TableName("act_coupon_record") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "优惠券领取记录表") +public class ActCouponRecordEntity extends Model { + + /** + * 领取记录ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "领取记录ID") + private Long id; + + /** + * 优惠券ID + */ + @Schema(description = "优惠券ID") + private Long couponId; + + /** + * 用户ID + */ + @Schema(description = "用户ID") + private Long userId; + + /** + * 用户名称 + */ + @Schema(description = "用户名称") + private String userName; + + /** + * 券码(唯一标识) + */ + @Schema(description = "券码(唯一标识)") + private String couponCode; + + /** + * 使用状态(1:未使用2:已使用3:已过期4:已作废) + */ + @Schema(description = "使用状态(1:未使用2:已使用3:已过期4:已作废)") + private String status; + + /** + * 优惠券名称 + */ + @Schema(description = "优惠券名称") + private String couponName; + + /** + * 优惠券类型 + */ + @Schema(description = "优惠券类型") + private String couponType; + + /** + * 面额/折扣 + */ + @Schema(description = "面额/折扣") + private Integer faceValue; + + /** + * 使用门槛 + */ + @Schema(description = "使用门槛") + private Integer minPoint; + + /** + * 有效开始时间 + */ + @Schema(description = "有效开始时间") + private LocalDateTime startTime; + + /** + * 有效结束时间 + */ + @Schema(description = "有效结束时间") + private LocalDateTime endTime; + + /** + * 使用时间 + */ + @Schema(description = "使用时间") + private LocalDateTime useTime; + + /** + * 关联订单号 + */ + @Schema(description = "关联订单号") + private String orderId; + + /** + * 抵扣金额(分) + */ + @Schema(description = "抵扣金额(分)") + private Integer useAmount; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 领取时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "领取时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActAdVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActAdVo.java new file mode 100644 index 000000000..75d19fd16 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActAdVo.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import lombok.Data; + +@Data +public class ActAdVo extends ActAdEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java new file mode 100644 index 000000000..958d618fd --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.admin.api.vo.base.BaseUserDeptInterface; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import lombok.Data; + +@Data +public class ActCouponRecordVo extends ActCouponRecordEntity implements BaseUserDeptInterface { + + /** + * 用户相关 + */ + private Long userId; + + private String username; + + private String userMobile; + + private String userAvatar; + + private Long userDeptId; + + private String userDeptName; + + /** + * 活动相关 + */ + private String actUniquecode; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java new file mode 100644 index 000000000..91f73d6a5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import lombok.Data; + +@Data +public class ActCouponVo extends ActCouponEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActAdController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActAdController.java new file mode 100755 index 000000000..3638779d6 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActAdController.java @@ -0,0 +1,100 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.dto.act.ActAdDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActAdVo; +import com.bsd.pjcloud.wallet.service.ActAdService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 广告活动 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act-ad") +@Tag(description = "act-ad", name = "广告活动管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActAdController { + + private final ActAdService actAdService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actAd_view')") + public R> getActAdPage(@ParameterObject Page page, @ParameterObject ActAdDto dto) { + return R.ok(actAdService.scopePageList(page, dto, null)); + } + + /** + * 通过id查询广告活动 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actAd_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(actAdService.getById(id)); + } + + /** + * 新增广告活动 + */ + @Operation(summary = "新增广告活动", description = "新增广告活动") + @SysLog("新增广告活动") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_actAd_add')") + public R save(@RequestBody ActAdDto dto) { + return R.ok(actAdService.create(dto)); + } + + /** + * 修改广告活动 + */ + @Operation(summary = "修改广告活动", description = "修改广告活动") + @SysLog("修改广告活动") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_actAd_edit')") + public R updateById(@RequestBody ActAdDto dto) { + return R.ok(actAdService.edit(dto)); + } + + /** + * 通过id删除广告活动 + */ + @Operation(summary = "通过id删除广告活动", description = "通过id删除广告活动") + @SysLog("通过id删除广告活动") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actAd_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(actAdService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_actAd_export')") + public List export(ActAdEntity actAd, Long[] ids) { + return actAdService.list(Wrappers.lambdaQuery(actAd).in(ArrayUtil.isNotEmpty(ids), ActAdEntity::getId, ids)); + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java new file mode 100755 index 000000000..96b2b7654 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java @@ -0,0 +1,123 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCreateAdCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; +import com.bsd.pjcloud.wallet.service.ActCouponService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 优惠券活动 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act-coupon") +@Tag(description = "act-coupon", name = "优惠券活动管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActCouponController { + + private final ActCouponService actCouponService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_view')") + public R> getActCouponPage(@ParameterObject Page page, @ParameterObject ActCouponDto dto) { + return R.ok(actCouponService.pageJoin(page, dto)); + } + + /** + * 通过id查询优惠券活动 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(actCouponService.getById(id)); + } + + /** + * 通过父活动id查询活动 + */ + @Operation(summary = "通过父活动id查询活动", description = "通过父活动id查询活动") + @GetMapping("/by-parent-act-id/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_view')") + public R getByParentActId(@PathVariable("id") Long id) { + return R.ok(actCouponService.getOne(new LambdaQueryWrapper().eq(ActCouponEntity::getParentActId, id))); + } + + /** + * 新增优惠券活动 + */ + @Operation(summary = "新增优惠券活动", description = "新增优惠券活动") + @SysLog("新增优惠券活动") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_add')") + public R save(@RequestBody ActCouponEntity actCoupon) { + return R.ok(actCouponService.create(actCoupon)); + } + + /** + * 新增广告优惠券活动 + */ + @Operation(summary = "新增广告优惠券活动", description = "新增广告优惠券活动") + @SysLog("新增广告优惠券活动") + @PostMapping("/create-ad-coupon") + public R createAdCoupon(@RequestBody ActCreateAdCouponDto dto) { + return R.ok(actCouponService.createAdCoupon(dto)); + } + + /** + * 修改优惠券活动 + */ + @Operation(summary = "修改优惠券活动", description = "修改优惠券活动") + @SysLog("修改优惠券活动") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_edit')") + public R updateById(@RequestBody ActCouponEntity actCoupon) { + actCouponService.modify(actCoupon); + return R.ok(); + } + + /** + * 通过id删除优惠券活动 + */ + @Operation(summary = "通过id删除优惠券活动", description = "通过id删除优惠券活动") + @SysLog("通过id删除优惠券活动") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_del')") + public R removeById(@RequestBody Long[] ids) { + actCouponService.delByIds(CollUtil.toList(ids)); + return R.ok(); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_export')") + public List export(ActCouponEntity actCoupon, Long[] ids) { + return actCouponService.list(Wrappers.lambdaQuery(actCoupon).in(ArrayUtil.isNotEmpty(ids), ActCouponEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java new file mode 100755 index 000000000..e12a2b0a2 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java @@ -0,0 +1,113 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; +import com.bsd.pjcloud.wallet.service.ActCouponRecordService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 优惠券领取记录表 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act-coupon-record") +@Tag(description = "act-coupon-record", name = "优惠券领取记录表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActCouponRecordController { + + private final ActCouponRecordService actCouponRecordService; + + /* ************************************* start app start ************************************* */ + + @Operation(summary = "领取优惠券", description = "领取优惠券") + @PostMapping("/app/receive") + @Idempotent(expireTime = 2, key = "'/act/receive/app/receive/' + #dto.getReceiveUserId()", info = "正在领取中,请勿重复操作") + public R appReceive(@Valid @RequestBody ActCouponReceiveDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setReceiveUserId(user.getId()); + return R.ok(actCouponRecordService.appReceive(dto)); + } + + @Operation(summary = "用户领取核销券列表", description = "用户领取核销券列表") + @GetMapping("/app/user-list") + public R> userList(@ParameterObject Page page) { + PjcloudUser user = SecurityUtils.getUser(); + ActCouponRecordDto dto = new ActCouponRecordDto(); + dto.setUserId(user.getId()); + dto.setStatusCodeList(List.of( + ActCouponRecordStatusEnum.UNUSED.getCode(), + ActCouponRecordStatusEnum.USED.getCode(), + ActCouponRecordStatusEnum.EXPIRED.getCode() + )); + dto.setIsFindNoExpire(true); + return R.ok(actCouponRecordService.pageList(page, dto)); + } + + /* ************************************* end app end ************************************* */ + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')") + public R> getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) { + return R.ok(actCouponRecordService.pageList(page, dto)); + } + + + /** + * 通过id查询优惠券领取记录表 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(actCouponRecordService.getById(id)); + } + + + /** + * 通过id删除优惠券领取记录表 + */ + @Operation(summary = "通过id删除优惠券领取记录表", description = "通过id删除优惠券领取记录表") + @SysLog("通过id删除优惠券领取记录表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(actCouponRecordService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_export')") + public List export(ActCouponRecordEntity actCouponRecord, Long[] ids) { + return actCouponRecordService.list(Wrappers.lambdaQuery(actCouponRecord).in(ArrayUtil.isNotEmpty(ids), ActCouponRecordEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActAdMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActAdMapper.java new file mode 100755 index 000000000..83fe8697c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActAdMapper.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.wallet.mapper.act; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.act.ActAdDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActAdVo; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ActAdMapper extends PjcloudBaseMapper { + + Page scopePageList(Page page, ActAdDto dto, DataScope dataScope); + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java new file mode 100755 index 000000000..a37075e4a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.wallet.mapper.act; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface ActCouponMapper extends PjcloudBaseMapper { + + Page pageJoin(Page page, @Param("dto") ActCouponDto dto); + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java new file mode 100755 index 000000000..137c34918 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.wallet.mapper.act; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ActCouponRecordMapper extends PjcloudBaseMapper { + + Page pageList(Page page, @Param("dto") ActCouponRecordDto dto); + + Long userTotal(@Param("userId") Long userId, @Param("statusCodeList") List statusCodeList); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActAdService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActAdService.java new file mode 100755 index 000000000..48ea278a3 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActAdService.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.wallet.api.dto.act.ActAdDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActAdVo; + +public interface ActAdService extends IService { + + Page scopePageList(Page page, ActAdDto dto, DataScope dataScope); + + Long create(ActAdDto dto); + + ActAdEntity edit(ActAdDto dto); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java new file mode 100644 index 000000000..03f2e74a8 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.wallet.service; + +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; + +public interface ActCouponLifecycleService { + + /** + * 领取优惠券前的校验 + */ + ActCouponEntity preReceive(Long couponId, Long userId); + + /** + * 领取优惠券后的处理 + */ + void afterReceive(ActCouponRecordEntity record, SysUser sysUser); + + /** + * 核销前的校验 + */ + ActCouponRecordEntity preCancel(ActCouponRecordEntity record); + + /** + * 核销后的处理 + */ + void afterCancel(ActCouponRecordEntity record); +} + diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java new file mode 100755 index 000000000..5e8f605e3 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java @@ -0,0 +1,49 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; + +public interface ActCouponRecordService extends IService { + + /** + * 分页查询 + */ + Page pageList(Page page, ActCouponRecordDto dto); + + /** + * 查询详情 + */ + ActCouponRecordEntity getDetail(Long actItemId, Long userId); + + /** + * 领取优惠券 + */ + Long appReceive(ActCouponReceiveDto dto); + + /** + * 核销优惠券 + * + * @param useAmountPrice 优惠券抵消的金额 + */ + void cancel(ActCouponRecordEntity dto, Long orderId, Integer useAmountPrice); + + /** + * 活动是否能够核销 + */ + String actIsCanCancel(ActCouponRecordEntity detail); + + /** + * 判断用户是否可以参加活动 + */ + ActUserReceiveEnum isEligibleForAct(Long actId, Long userId); + + /** + * 用户参加活动的数量统计 + */ + Long userTotal(Long userId); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java new file mode 100755 index 000000000..9b1c58ec1 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java @@ -0,0 +1,49 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCreateAdCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; + +import java.util.ArrayList; +import java.util.List; + +public interface ActCouponService extends IService { + + /** + * 分页查询 + */ + Page pageJoin(Page page, ActCouponDto dto); + + /** + * 根据actIdList查询活动 + */ + List getByIdList(List actIdList); + + /** + * 新增优惠券 + */ + Long create(ActCouponEntity actCoupon); + + /** + * 新增广告优惠券活动 + */ + Long createAdCoupon(ActCreateAdCouponDto dto); + + /** + * 修改优惠券 + */ + void modify(ActCouponEntity actCoupon); + + /** + * 删除优惠券 + */ + void delByIds(ArrayList list); + + /** + * 根据公告id查询核销活动 + */ + ActCouponEntity getDetailByNoticeId(Long notifyId); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActAdServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActAdServiceImpl.java new file mode 100755 index 000000000..e1c55a68c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActAdServiceImpl.java @@ -0,0 +1,109 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.wallet.api.constant.act.*; +import com.bsd.pjcloud.wallet.api.dto.act.ActAdDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCreateAdCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActAdVo; +import com.bsd.pjcloud.wallet.mapper.act.ActAdMapper; +import com.bsd.pjcloud.wallet.service.ActAdService; +import com.bsd.pjcloud.wallet.service.ActCouponService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 广告活动 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ActAdServiceImpl extends ServiceImpl implements ActAdService { + + private final ActCouponService actCouponService; + + @Override + public Page scopePageList(Page page, ActAdDto dto, DataScope dataScope) { + return baseMapper.scopePageList(page, dto, dataScope); + } + + @Override + public Long create(ActAdDto dto) { + ActAdEntity entity = BeanUtil.toBean(dto, ActAdEntity.class); + if (ObjectUtil.isEmpty(dto.getUniqueCode())) { + entity.setUniqueCode(generateUniqueCode()); + } + baseMapper.insert(entity); + generateDefaultAct(entity); + return entity.getId(); + } + + @Override + public ActAdEntity edit(ActAdDto dto) { + // 是否存在 + ActAdEntity detail = baseMapper.selectById(dto.getId()); + if (ObjectUtil.isEmpty(detail)) { + throw new RuntimeException("不存在此"); + } + + ActAdEntity entity = BeanUtil.toBean(dto, ActAdEntity.class); + if (ObjectUtil.isEmpty(dto.getUniqueCode())) { + entity.setUniqueCode(generateUniqueCode()); + } + generateDefaultAct(detail); + baseMapper.updateById(entity); + return baseMapper.selectById(entity.getId()); + } + + private void generateDefaultAct(ActAdEntity actAd) { + if (ObjectUtil.isEmpty(actAd.getTypeList())) { + return; + } + List typeList = Arrays.asList(actAd.getTypeList().split(",")); + if (ObjectUtil.isEmpty(typeList)) { + return; + } + for (String type : typeList) { + ActTypeEnum typeEnum = ActTypeEnum.valueOfByType(type); + if (ObjectUtil.isEmpty(typeEnum)) continue; + // 核销活动 + if (ObjectUtil.equals(typeEnum, ActTypeEnum.CANCEL_ACT)) { + // 查询详情 + ActCouponEntity actCouponDetail = actCouponService.getById(actAd.getId()); + if (ObjectUtil.isNotEmpty(actCouponDetail)) continue; + + ActCreateAdCouponDto createAdCouponDto = new ActCreateAdCouponDto(); + createAdCouponDto.setActAdId(actAd.getId()); + createAdCouponDto.setStatus(ActCouponStatusEnum.CAOGAO.getCode()); + createAdCouponDto.setFaceValue(0); + createAdCouponDto.setIntegralNum(0); + actCouponService.createAdCoupon(createAdCouponDto); + } + } + } + + /** + * 生成唯一code + */ + private String generateUniqueCode() { + String string = RandomUtil.randomString(6); + while (true) { + Long isExist = baseMapper.selectCount(new LambdaQueryWrapper().eq(ActAdEntity::getUniqueCode, string)); + if (isExist == null || isExist == 0) { + return string; + } + } + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java new file mode 100755 index 000000000..c53791ed5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java @@ -0,0 +1,224 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.collection.IterUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.common.core.exception.ServiceException; +import com.bsd.pjcloud.common.core.util.CollectionUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper; +import com.bsd.pjcloud.wallet.service.*; +import com.bsd.pjcloud.wallet.utils.act.service.ActCouponComUtilService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +/** + * 优惠券领取记录表 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActCouponRecordServiceImpl extends ServiceImpl implements ActCouponRecordService { + + private static final String TAG = "优惠券活动"; + + private final ActCouponMapper actCouponMapper; + + private final ActCouponComUtilService actCouponComUtilService; + private final ActCouponService actCouponService; + private final WalletCodeUseService walletCodeUseService; + + private final RemoteUserService remoteUserService; + + /** + * 分页查询 + */ + @Override + public Page pageList(Page page, ActCouponRecordDto dto) { + Page pageList = baseMapper.pageList(page, dto); + disposePageList(pageList.getRecords()); + return pageList; + } + + /** + * 查询详情 + */ + @Override + public ActCouponRecordEntity getDetail(Long actItemId, Long userId) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ActCouponRecordEntity::getId, actItemId) + .eq(ActCouponRecordEntity::getUserId, userId) + .orderByDesc(ActCouponRecordEntity::getCreateTime) + .orderByDesc(ActCouponRecordEntity::getId) + .last("limit 1") + ); + } + + /** + * 领取优惠券 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long appReceive(ActCouponReceiveDto dto) { + // 1. 获取当前用户 + UserInfo userInfo = remoteUserService.getByUserId(dto.getReceiveUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new ServiceException("用户不存在"); + } + SysUser sysUser = userInfo.getSysUser(); + // 2. 预处理 + ActCouponEntity actCouponEntity = actCouponComUtilService.preReceive(dto.getCouponId(), dto.getReceiveUserId()); + if (ObjectUtil.isEmpty(actCouponEntity)) { + return null; + } + // 3. 特殊优惠券判断 + ActUserReceiveEnum specialCouponStatus = specialCoupon(actCouponEntity, sysUser); + if (ObjectUtil.isNotEmpty(specialCouponStatus) && ObjectUtil.notEqual(specialCouponStatus, ActUserReceiveEnum.USER_CAN_JOIN_ACT)) { + throw new ServiceException(specialCouponStatus.getDesc()); + } + // 4. 执行领取逻辑 + ActCouponRecordEntity record = actCouponComUtilService.doReceive(actCouponEntity, sysUser); + // 5. 优惠券领取成功后,执行生命周期方法 + actCouponComUtilService.afterReceive(record, sysUser); + // 6. 领取后特殊处理 + specialReceive(actCouponEntity, record, sysUser); + // 7. 生成核销二维码 + walletCodeUseService.generate(record.getId(), record.getUserId(), WalletCodeBizEnum.ACT, 1); + return record.getId(); + } + + /** + * 核销优惠券 + */ + @Override + public void cancel(ActCouponRecordEntity dto, Long orderId, Integer useAmountPrice) { + // 1. 获取当前用户 + UserInfo userInfo = remoteUserService.getInnerByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new ServiceException("用户不存在"); + } + SysUser sysUser = userInfo.getSysUser(); + ActCouponRecordEntity record = getDetail(dto.getId(), dto.getUserId()); + if (ObjectUtil.isEmpty(record)) { + throw new ServiceException("优惠券不存在"); + } + // 2. 查询活动 + ActCouponEntity actCouponEntity = actCouponService.getById(record.getCouponId()); + if (ObjectUtil.isEmpty(actCouponEntity)) { + throw new ServiceException("活动不存在"); + } + // 3. 预处理 + ActCouponRecordEntity actCouponRecordEntity = actCouponComUtilService.preCancel(record); + if (ObjectUtil.isEmpty(actCouponRecordEntity)) { + throw new ServiceException("优惠券不存在"); + } + // 4. 执行核销逻辑 + actCouponComUtilService.doCancel(actCouponRecordEntity.getId(), orderId, useAmountPrice); + // 5. 优惠券核销成功后,执行生命周期方法 + actCouponComUtilService.afterCancel(actCouponRecordEntity); + // 6. 核销短码 + walletCodeUseService.cancelCode(actCouponRecordEntity.getId()); + } + + /** + * 活动是否能够核销 + */ + @Override + public String actIsCanCancel(ActCouponRecordEntity detail) { + return actCouponComUtilService.actIsCanCancel(detail); + } + + /** + * 特殊处理领取后 + */ + public void specialReceive(ActCouponEntity act, ActCouponRecordEntity record, SysUser sysUser) { + String uniqueCode = act.getUniqueCode(); + } + + /** + * 特殊领取规则 + */ + public ActUserReceiveEnum specialCoupon(ActCouponEntity actCouponEntity, SysUser sysUser) { + String uniqueCode = actCouponEntity.getUniqueCode(); + return null; + } + + /** + * 判断用户是否可以参加活动 + */ + @Override + public ActUserReceiveEnum isEligibleForAct(Long actId, Long userId) { + ActUserReceiveEnum userReceiveEnum = actCouponComUtilService.isEligibleForAct(actId, userId); + if (ObjectUtil.equals(userReceiveEnum, ActUserReceiveEnum.USER_CAN_JOIN_ACT)) { + UserInfo userInfo = remoteUserService.getByUserId(userId).getData(); + ActCouponEntity actCouponEntity = actCouponMapper.selectById(actId); + if (ObjectUtil.isNotEmpty(userInfo) && ObjectUtil.isNotEmpty(actCouponEntity)) { + ActUserReceiveEnum specialCouponStatus = specialCoupon(actCouponEntity, userInfo.getSysUser()); + if (ObjectUtil.isNotEmpty(specialCouponStatus)) { + userReceiveEnum = specialCouponStatus; + } + } + } + return userReceiveEnum; + } + + /** + * 用户参加活动的数量统计 + */ + @Override + public Long userTotal(Long userId) { + return baseMapper.userTotal(userId, List.of( + ActCouponRecordStatusEnum.UNUSED.getCode(), + ActCouponRecordStatusEnum.USED.getCode(), + ActCouponRecordStatusEnum.EXPIRED.getCode() + )); + } + + private void disposePageList(List list) { + // 用户 + List userIds = list.stream().map(ActCouponRecordVo::getUserId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + R> userList = remoteUserService.getUserDeptByIds(new ArrayList<>(userIds)); + if (ObjectUtil.isNotEmpty(userList.getData())) { + DataUtil.convertUserDeptList(list, CollectionUtils.convertMap(userList.getData(), UserVO::getUserId)); + } + } + // 活动 + List actIdList = list.stream().map(ActCouponRecordVo::getCouponId).distinct().toList(); + if (ObjectUtil.isNotEmpty(actIdList)) { + List actList = actCouponService.getByIdList(actIdList); + if (ObjectUtil.isNotEmpty(actList)) { + Map actCouponMap = IterUtil.toMap(actList, ActCouponEntity::getId); + for (ActCouponRecordVo v : list) { + ActCouponEntity targetMap = actCouponMap.get(v.getCouponId()); + if (ObjectUtil.isEmpty(targetMap)) continue; + v.setActUniquecode(targetMap.getUniqueCode()); + } + } + } + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java new file mode 100755 index 000000000..c437fc672 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java @@ -0,0 +1,143 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.wallet.api.constant.act.*; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCreateAdCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActAdEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; +import com.bsd.pjcloud.wallet.service.ActAdService; +import com.bsd.pjcloud.wallet.service.ActCouponService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 优惠券活动 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActCouponServiceImpl extends ServiceImpl implements ActCouponService { + + @Lazy + private final ActAdService actAdService; + + @Override + public Page pageJoin(Page page, ActCouponDto dto) { + return baseMapper.pageJoin(page, dto); + } + + /** + * 根据actIdList查询活动 + */ + @Override + public List getByIdList(List actIdList) { + return baseMapper.selectList(new LambdaQueryWrapper() + .in(ActCouponEntity::getId, actIdList) + ); + } + + /** + * 新增优惠券 + */ + @Override + public Long create(ActCouponEntity actCoupon) { + actCoupon.setUniqueCode(generateUniqueCode()); + baseMapper.insert(actCoupon); + return actCoupon.getId(); + } + + /** + * 新增广告优惠券活动 + */ + @Override + public Long createAdCoupon(ActCreateAdCouponDto dto) { + // 查询活动 + ActAdEntity actAdDetail = actAdService.getById(dto.getActAdId()); + if (ObjectUtil.isEmpty(actAdDetail)) { + throw new RuntimeException("广告活动不存在"); + } + ActCouponEntity entiy = BeanUtil.toBean(dto, ActCouponEntity.class); + entiy.setParentActId(actAdDetail.getId()); + entiy.setUniqueCode(generateUniqueCode()); + entiy.setName(actAdDetail.getName() + "-优惠券活动"); + entiy.setType(ActCouponTypeEnum.DUIHUAN_QUAN.getCode()); + entiy.setMinPoint(null); + entiy.setTotalCount(-1); + entiy.setSurplusCount(-1); + entiy.setLimitCount(1); + entiy.setLimitType(ActCouponLimitTypeEnum.ONCE.getCode()); + entiy.setValidType(ActCouponValidTypeEnum.FIXED_DATE.getCode()); + entiy.setValidStartTime(actAdDetail.getStartTime()); + entiy.setValidEndTime(actAdDetail.getEndTime()); + entiy.setUseScopeType(ActCouponUseScopeTypeEnum.ALL_USE.getCode()); + baseMapper.insert(entiy); + return entiy.getId(); + } + + /** + * 修改优惠券 + */ + @Override + public void modify(ActCouponEntity actCoupon) { + // 是否存在 + ActCouponEntity exist = baseMapper.selectById(actCoupon.getId()); + if (ObjectUtil.isEmpty(exist)) { + throw new RuntimeException("优惠券不存在"); + } + if (ObjectUtil.isEmpty(exist.getUniqueCode())) { + actCoupon.setUniqueCode(generateUniqueCode()); + } + baseMapper.updateById(actCoupon); + } + + /** + * 删除优惠券 + */ + @Override + public void delByIds(ArrayList list) { + List couponList = baseMapper.selectByIds(list); + if (ObjectUtil.isEmpty(couponList)) return; + for (ActCouponEntity coupon : couponList) { + // 如果有人领取了优惠券,则不能删除 + } + baseMapper.deleteByIds(list); + } + + /** + * 根据公告id查询核销活动 + */ + @Override + public ActCouponEntity getDetailByNoticeId(Long notifyId) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ActCouponEntity::getBindNotifyId, notifyId) + ); + } + + /** + * 生成唯一code + */ + private String generateUniqueCode() { + String string = RandomUtil.randomString(6); + while (true) { + Long isExist = baseMapper.selectCount(new LambdaQueryWrapper().eq(ActCouponEntity::getUniqueCode, string)); + if (isExist == null || isExist == 0) { + return string; + } + } + } + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java new file mode 100644 index 000000000..6f35eca0e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java @@ -0,0 +1,267 @@ +package com.bsd.pjcloud.wallet.utils.act.service; + +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.wallet.api.constant.act.*; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper; +import com.bsd.pjcloud.wallet.service.ActCouponLifecycleService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.TemporalAdjusters; + +/** + * 优惠券工具类 + */ +@Service +@AllArgsConstructor +public class ActCouponComUtilService implements ActCouponLifecycleService { + + private final ActCouponMapper actCouponMapper; + private final ActCouponRecordMapper actCouponRecordMapper; + + /** + * 领取优惠券前的校验 + */ + @Override + public ActCouponEntity preReceive(Long couponId, Long userId) { + ActCouponEntity coupon = actCouponMapper.selectById(couponId); + if (ObjectUtil.isEmpty(coupon)) { + throw new RuntimeException("此优惠券活动不存在"); + } + + assertStatus(coupon); + assertReceiveWindow(coupon); + assertLimit(coupon, userId); + + return coupon; + } + + /** + * 领取优惠券 + */ + public ActCouponRecordEntity doReceive(ActCouponEntity coupon, SysUser sysUser) { + ActCouponRecordEntity record = new ActCouponRecordEntity(); + record.setCouponId(coupon.getId()); + record.setUserId(sysUser.getUserId()); + record.setUserName(sysUser.getName()); + record.setCouponCode(UUID.fastUUID().toString()); + record.setStatus(ActCouponRecordStatusEnum.UNUSED.getCode()); + // 优惠券冗余字段(不更新) + record.setCouponName(coupon.getName()); + record.setCouponType(coupon.getType()); + record.setFaceValue(coupon.getFaceValue()); + record.setMinPoint(coupon.getMinPoint()); + // 这个时间要根据`优惠券过期类型来设置` + // 1-固定日期 + if (ObjectUtil.equals(ActCouponValidTypeEnum.FIXED_DATE.getCode(), coupon.getValidType())) { + record.setStartTime(coupon.getValidStartTime()); + record.setEndTime(coupon.getValidEndTime()); + } + // 2-领取后生效 + if (ObjectUtil.equals(ActCouponValidTypeEnum.AFTER_RECEIVE.getCode(), coupon.getValidType())) { + Integer validDays = coupon.getValidDays(); + record.setStartTime(LocalDateTime.now()); + record.setEndTime(record.getStartTime().plusDays(validDays)); + } + // 3-领取的当月 + if (ObjectUtil.equals(ActCouponValidTypeEnum.AFTER_RECEIVE_CURRENT_MONTH.getCode(), coupon.getValidType())) { + record.setStartTime(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atTime(LocalTime.MIN)); + record.setEndTime(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(23, 59, 59)); + } + actCouponRecordMapper.insert(record); + return record; + } + + /** + * 领取优惠券后的处理 + */ + @Override + public void afterReceive(ActCouponRecordEntity record, SysUser sysUser) { + + } + + /** + * 核销前的校验 + */ + @Override + public ActCouponRecordEntity preCancel(ActCouponRecordEntity record) { + ActCouponRecordEntity couponRecord = actCouponRecordMapper.selectById(record.getId()); + String error = actIsCanCancel(record); + if (ObjectUtil.isNotEmpty(error)) { + throw new RuntimeException(error); + } + return couponRecord; + } + + public void doCancel(Long couponRecordId, Long orderId, int useAmountPrice) { + ActCouponRecordEntity couponRecord = actCouponRecordMapper.selectById(couponRecordId); + if (ObjectUtil.isEmpty(couponRecord)) { + throw new RuntimeException("此优惠券不存在"); + } + ActCouponRecordEntity updateObj = new ActCouponRecordEntity(); + updateObj.setId(couponRecordId); + updateObj.setStatus(ActCouponRecordStatusEnum.USED.getCode()); + updateObj.setUseTime(LocalDateTime.now()); + updateObj.setOrderId(String.valueOf(orderId)); + updateObj.setUseAmount(useAmountPrice); + actCouponRecordMapper.updateById(updateObj); + } + + /** + * 核销后的处理 + */ + @Override + public void afterCancel(ActCouponRecordEntity record) { + + } + + /** + * 活动是否能够核销 + */ + public String actIsCanCancel(ActCouponRecordEntity couponRecord) { + if (ObjectUtil.isEmpty(couponRecord)) { + return "优惠券不存在"; + } + // 基本校验:状态是否可用 + if (ObjectUtil.notEqual(ActCouponRecordStatusEnum.UNUSED.getCode(), couponRecord.getStatus())) { + ActCouponRecordStatusEnum type = ActCouponRecordStatusEnum.valueOfByType(couponRecord.getStatus()); + return "该优惠券" + type.getDesc(); + } + // 校验有效期 + LocalDateTime now = LocalDateTime.now(); + if (ObjectUtil.isNotEmpty(couponRecord.getStartTime()) && now.isBefore(couponRecord.getStartTime())) { + return "优惠券尚未生效"; + } + if (ObjectUtil.isNotEmpty(couponRecord.getEndTime()) && now.isAfter(couponRecord.getEndTime())) { + return "优惠券已过期"; + } + return null; + } + + /** + * 查询用户是否可以参加活动 + */ + public ActUserReceiveEnum isEligibleForAct(Long couponId, Long userId) { + ActCouponEntity coupon = actCouponMapper.selectById(couponId); + if (ObjectUtil.isEmpty(coupon)) { + return ActUserReceiveEnum.ACT_NOT_EXIST; + } + try { + assertStatus(coupon); + } catch (Exception e) { + return ActUserReceiveEnum.ACT_NOT_STARTED; + } + try { + assertReceiveWindow(coupon); + } catch (Exception e) { + return ActUserReceiveEnum.ACT_EXPIRED; + } + try { + assertLimit(coupon, userId); + } catch (Exception e) { + return ActUserReceiveEnum.USER_LIMIT_REACHED; + } + return ActUserReceiveEnum.USER_CAN_JOIN_ACT; + } + + + /** + * 校验优惠券活动状态为进行中 + */ + private void assertStatus(ActCouponEntity coupon) { + if (!ObjectUtil.equals(ActCouponStatusEnum.JINXINGZHONG.getCode(), coupon.getStatus())) { + throw new RuntimeException("此优惠券不在进行中"); + } + } + + /** + * 校验领取时间窗(固定日期型需在有效期内) + */ + private void assertReceiveWindow(ActCouponEntity coupon) { + if (ObjectUtil.equals(ActCouponValidTypeEnum.FIXED_DATE.getCode(), coupon.getValidType())) { + LocalDateTime now = LocalDateTime.now(); + if (ObjectUtil.isNotEmpty(coupon.getValidStartTime()) && now.isBefore(coupon.getValidStartTime())) { + throw new RuntimeException("此优惠券活动尚未开始"); + } + if (ObjectUtil.isNotEmpty(coupon.getValidEndTime()) && now.isAfter(coupon.getValidEndTime())) { + throw new RuntimeException("此优惠券活动已结束"); + } + } + } + + /** + * 校验用户在限领规则下是否超过可领取次数 + */ + private void assertLimit(ActCouponEntity coupon, Long userId) { + if (ObjectUtil.isEmpty(coupon.getLimitCount()) || coupon.getLimitCount() <= 0) { + return; + } + + LocalDateTime start = buildLimitStartTime(coupon.getLimitType()); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ActCouponRecordEntity::getCouponId, coupon.getId()).eq(ActCouponRecordEntity::getUserId, userId); + if (ObjectUtil.isNotEmpty(start)) { + wrapper.ge(ActCouponRecordEntity::getCreateTime, start); + } + Long cnt = actCouponRecordMapper.selectCount(wrapper); + if (cnt != null && cnt >= coupon.getLimitCount()) { + throw new RuntimeException(buildLimitExceededMessage(coupon.getLimitType())); + } + } + + /** + * 构造限领类型的统计起始时间(一次型不限制返回 null) + */ + private LocalDateTime buildLimitStartTime(String limitType) { + if (ObjectUtil.equals(ActCouponLimitTypeEnum.ONCE.getCode(), limitType)) { + return null; + } + LocalDate today = LocalDate.now(); + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_DAY.getCode(), limitType)) { + return LocalDateTime.of(today, LocalTime.MIN); + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_WEEK.getCode(), limitType)) { + LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + return LocalDateTime.of(monday, LocalTime.MIN); + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_MONTH.getCode(), limitType)) { + LocalDate firstDay = today.with(TemporalAdjusters.firstDayOfMonth()); + return LocalDateTime.of(firstDay, LocalTime.MIN); + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_YEAR.getCode(), limitType)) { + LocalDate firstDay = today.with(TemporalAdjusters.firstDayOfYear()); + return LocalDateTime.of(firstDay, LocalTime.MIN); + } + return null; + } + + private String buildLimitExceededMessage(String limitType) { + if (ObjectUtil.equals(ActCouponLimitTypeEnum.ONCE.getCode(), limitType)) { + return "活动期间已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_DAY.getCode(), limitType)) { + return "今日已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_WEEK.getCode(), limitType)) { + return "本周已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_MONTH.getCode(), limitType)) { + return "本月已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_YEAR.getCode(), limitType)) { + return "本年已达领取上限"; + } + return "已达到领取上限"; + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActAdMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActAdMapper.xml new file mode 100755 index 000000000..9a15f0564 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActAdMapper.xml @@ -0,0 +1,45 @@ + + + + + + select a.id, + a.unique_code, + a.name, + a.description, + a.type_list, + a.status, + a.ad_viewing_limit, + a.ad_viewing_limit_unit, + a.start_time, + a.end_time, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.unique_code = #{dto.uniqueCode} + + + and a.name LIKE concat('%',#{dto.name},'%') + + + and a.status = #{dto.status} + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml new file mode 100755 index 000000000..9237eaedd --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml @@ -0,0 +1,59 @@ + + + + + + select a.id, + a.unique_code, + a.parent_act_id, + a.bind_notify_id, + a.name, + a.type, + a.face_value, + a.min_point, + a.total_count, + a.surplus_count, + a.limit_count, + a.limit_type, + a.valid_type, + a.valid_start_time, + a.valid_end_time, + a.valid_days, + a.use_scope_type, + a.scope_id, + a.status, + a.description, + a.extra_json, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.parent_act_id = #{dto.parentActId} + + + and a.name LIKE CONCAT('%',#{dto.name},'%') + + + and a.type = #{dto.type} + + + and a.status = #{dto.status} + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml new file mode 100755 index 000000000..205625273 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml @@ -0,0 +1,80 @@ + + + + + + select a.id, + a.coupon_id, + a.user_id, + a.user_name, + a.coupon_code, + a.status, + a.coupon_name, + a.coupon_type, + a.face_value, + a.min_point, + a.start_time, + a.end_time, + a.use_time, + a.order_id, + a.use_amount, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.coupon_id = #{dto.couponId} + + + and a.user_id = #{dto.userId} + + + and a.status = #{dto.status} + + + and a.end_time >= now() + + + and a.status IN + + #{v} + + + + and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + + + + + + \ No newline at end of file