diff --git a/db/810pjcloudx_wallet_act.sql b/db/810pjcloudx_wallet_act.sql index fd86effd1..aa4b3912f 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' ); @@ -47,6 +47,7 @@ DROP TABLE IF EXISTS act_coupon; CREATE TABLE act_coupon ( id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '优惠券ID', + parent_act_id BIGINT(20) DEFAULT NULL COMMENT '父活动id', name VARCHAR(128) NOT NULL COMMENT '优惠券名称', type VARCHAR(64) NOT NULL COMMENT '优惠券类型 (1:满减券 2:折扣券 3:立减券 4:兑换券)', face_value INT DEFAULT 0 COMMENT '面额/折扣 (满减/立减单位:分, 折扣单位:百分比)', @@ -71,8 +72,8 @@ CREATE TABLE act_coupon del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', tenant_id bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (id), - KEY idx_status (status), - KEY idx_valid_end_time (valid_end_time) + KEY idx_status (status), + KEY idx_valid_end_time (valid_end_time) ) ENGINE = InnoDB COMMENT ='优惠券活动'; DROP TABLE IF EXISTS act_coupon_record; @@ -109,8 +110,8 @@ CREATE TABLE act_coupon_record PRIMARY KEY (id), UNIQUE KEY uk_coupon_code (coupon_code), - KEY idx_user_id (user_id), - KEY idx_coupon_id (coupon_id), - KEY idx_end_time (end_time), - KEY idx_status (status) + KEY idx_user_id (user_id), + KEY idx_coupon_id (coupon_id), + KEY idx_end_time (end_time), + KEY idx_status (status) ) ENGINE = InnoDB COMMENT ='优惠券领取记录表'; \ No newline at end of file diff --git a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java index f0a99a884..4d7e4826d 100644 --- a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java +++ b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java @@ -110,6 +110,12 @@ public class AppUser extends Model { @Schema(description = "第三方登录扩展字段") private String loginExtJson; + /** + * openId + */ + @Schema(description = "openId") + private String openid; + /** * 创建人 */ @@ -164,10 +170,4 @@ public class AppUser extends Model { @Schema(description = "锁定标记") private String lockFlag; - /** - * openId - */ - @Schema(description = "openId") - private String openid; - } diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSpuEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSpuEntity.java index 51ef5acc0..61309568f 100644 --- a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSpuEntity.java +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSpuEntity.java @@ -10,6 +10,7 @@ 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; /** @@ -26,182 +27,188 @@ import java.time.LocalDateTime; public class CanteenSpuEntity extends Model { - /** - * 商品 SPU 编号,自增 - */ + /** + * 商品 SPU 编号,自增 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="商品 SPU 编号,自增") + @Schema(description = "商品 SPU 编号,自增") private Long id; - /** - * 商品名称 - */ - @Schema(description="商品名称") + /** + * 商品名称 + */ + @Schema(description = "商品名称") private String name; - /** - * 商品简介 - */ - @Schema(description="商品简介") + /** + * 商品简介 + */ + @Schema(description = "商品简介") private String introduction; - /** - * 商品详情 - */ - @Schema(description="商品详情") + /** + * 商品详情 + */ + @Schema(description = "商品详情") private String description; - /** - * 商品分类编号 - */ - @Schema(description="商品分类编号") + /** + * 商品分类编号 + */ + @Schema(description = "商品分类编号") private Long categoryId; - /** - * 商品封面图 - */ - @Schema(description="商品封面图") + /** + * 商品封面图 + */ + @Schema(description = "商品封面图") private String picUrl; - /** - * 商品轮播图地址 - 数组,以逗号分隔 - 最多上传15张 - */ - @Schema(description="商品轮播图") + /** + * 商品轮播图地址 + * 数组,以逗号分隔 + * 最多上传15张 + */ + @Schema(description = "商品轮播图") private String sliderPicUrls; - /** - * 排序字段 - */ - @Schema(description="排序字段") + /** + * 排序字段 + */ + @Schema(description = "排序字段") private Integer sort; - /** - * 商品状态: 1 上架(开启) 0 下架(禁用) -1 回收 - */ - @Schema(description="商品状态: 1 上架(开启) 0 下架(禁用) -1 回收") + /** + * 商品状态: 1 上架(开启) 0 下架(禁用) -1 回收 + */ + @Schema(description = "商品状态: 1 上架(开启) 0 下架(禁用) -1 回收") private Integer status; - /** - * 规格类型:0 单规格 1 多规格 - */ - @Schema(description="规格类型:0 单规格 1 多规格") + /** + * 规格类型:0 单规格 1 多规格 + */ + @Schema(description = "规格类型:0 单规格 1 多规格") private Boolean specType; - /** - * 商品价格,单位使用:分 - */ - @Schema(description="商品价格,单位使用:分") + /** + * 商品价格,单位使用:分 + */ + @Schema(description = "商品价格,单位使用:分") // @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 // @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer price; - /** - * 市场价,单位使用:分 - */ - @Schema(description="市场价,单位使用:分") + /** + * 市场价,单位使用:分 + */ + @Schema(description = "市场价,单位使用:分") // @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 // @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer marketPrice; - /** - * 成本价,单位: 分 - */ - @Schema(description="成本价,单位: 分") + /** + * 成本价,单位: 分 + */ + @Schema(description = "成本价,单位: 分") // @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 // @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer costPrice; - /** - * 库存 - */ - @Schema(description="库存") + /** + * 库存 + */ + @Schema(description = "库存") private Integer stock; - /** - * 赠送积分 - */ - @Schema(description="赠送积分") + /** + * 赠送积分 + */ + @Schema(description = "赠送积分") private Integer giveIntegral; - /** - * 商品销量 - */ - @Schema(description="商品销量") + /** + * 商品销量 + */ + @Schema(description = "商品销量") private Integer salesCount; - /** - * 虚拟销量 - */ - @Schema(description="虚拟销量") + /** + * 虚拟销量 + */ + @Schema(description = "虚拟销量") private Integer virtualSalesCount; - /** - * 商品点击量 - */ - @Schema(description="商品点击量") + /** + * 商品点击量 + */ + @Schema(description = "商品点击量") private Integer browseCount; + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "是否删除 -1:已删除 0:正常") + private String delFlag; - @TableLogic - @TableField(fill = FieldFill.INSERT) - @Schema(description = "是否删除 -1:已删除 0:正常") - private String delFlag; - - /** - * 系统类型 2每日 3在线订餐 - */ - @Schema(description="系统类型 2每日 3在线订餐") + /** + * 系统类型 2每日 3在线订餐 + */ + @Schema(description = "系统类型 2每日 3在线订餐") private Long systemType; - /** - * 商户编号 - */ - @Schema(description="商户编号") + /** + * 商户编号 + */ + @Schema(description = "商户编号") private Long merchantId; - /** - * 部门id - */ - @Schema(description="部门id") + /** + * 部门id + */ + @Schema(description = "部门id") private Long deptId; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") private String createBy; - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建时间") + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") private LocalDateTime createTime; - /** - * 更新人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="更新人") + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") private String updateBy; - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="更新时间") + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") private LocalDateTime updateTime; - /** - * 租户编号 - */ - @Schema(description="租户编号") + /** + * 租户编号 + */ + @Schema(description = "租户编号") private Long tenantId; - @Schema(description="是否显示") - private String isShow; + @Schema(description = "是否显示") + private String isShow; + + @Schema(description = "是否涨价") + private String isPriceIncreased; + + @Schema(description = "大于等于的价格") + @TableField(exist = false) + private Long gePrice; } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java index 3f522b01e..ecb1f1636 100644 --- a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.canteen.vo; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data @@ -44,4 +45,9 @@ public class ADCanteenDailyMenuListVO { * 排序 */ private Integer sort; + + /** + * 是否涨价 + */ + private String isPriceIncreased; } diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenSpuListVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenSpuListVO.java index d7460b143..168a37e0e 100644 --- a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenSpuListVO.java +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenSpuListVO.java @@ -15,71 +15,72 @@ public class ADCanteenSpuListVO { /** * 商品 SPU 编号,自增 */ - @Schema(description="商品 SPU 编号,自增") + @Schema(description = "商品 SPU 编号,自增") private Long id; /** * 商品名称 */ - @Schema(description="商品名称") + @Schema(description = "商品名称") private String name; /** * 商品分类编号 */ - @Schema(description="商品分类编号") + @Schema(description = "商品分类编号") private Long categoryId; /** * 商品封面图 */ - @Schema(description="商品封面图") + @Schema(description = "商品封面图") private String picUrl; /** * 商品价格,单位使用:分 */ - @Schema(description="商品价格,单位使用:分") + @Schema(description = "商品价格,单位使用:分") private Integer price; /** * 市场价,单位使用:分 */ - @Schema(description="市场价,单位使用:分") + @Schema(description = "市场价,单位使用:分") private Integer marketPrice; /** * 库存 */ - @Schema(description="库存") + @Schema(description = "库存") private Integer stock; /** * 商品销量 */ - @Schema(description="商品销量") + @Schema(description = "商品销量") private Integer salesCount; /** * 商户编号 */ - @Schema(description="商户编号") + @Schema(description = "商户编号") private Long merchantId; /** * 部门id */ - @Schema(description="部门id") + @Schema(description = "部门id") private Long deptId; + @Schema(description = "是否涨价") + private String isPriceIncreased; - - @Schema(description="餐段类型") + @Schema(description = "餐段类型") private String categoryType; } diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java index 7f0b1de3a..59bdccbfe 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.canteen.service.impl; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -46,6 +47,7 @@ public class CanteenSpuServiceImpl extends ServiceImpl wrapper) { return baseMapper.selectListByScope(wrapper, DataScope.of()); @@ -59,11 +61,11 @@ public class CanteenSpuServiceImpl extends ServiceImpl spu.getStock()) { - R.failed(spu.getName()+"库存不足,无法完成操作"); + R.failed(spu.getName() + "库存不足,无法完成操作"); } int i = baseMapper.updateStock(item.getId(), item.getIncrCount()); // if (item.getIncrCount() <= 0) { @@ -89,7 +91,7 @@ public class CanteenSpuServiceImpl extends ServiceImpl> listMap = canteenCategoryEntities.stream().collect(Collectors.groupingBy(CanteenCategoryEntity::getId)); bean.forEach(item -> { - if (null!=listMap.get(item.getCategoryId()).get(0).getCategoryType()){ + if (null != listMap.get(item.getCategoryId()).get(0).getCategoryType()) { item.setCategoryType(listMap.get(item.getCategoryId()).get(0).getCategoryType()); } }); @@ -127,7 +129,7 @@ public class CanteenSpuServiceImpl extends ServiceImpl canteenCategoryEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); canteenCategoryEntityLambdaQueryWrapper.like(CanteenCategoryEntity::getCategoryType, canteenDailySpuDTO.getHourType()); List canteenCategoryEntities = canteenCategoryMapper.selectList(canteenCategoryEntityLambdaQueryWrapper); - List caIds = canteenCategoryEntities.stream().map(CanteenCategoryEntity::getId).collect(Collectors.toList()); + List caIds = canteenCategoryEntities.stream().map(CanteenCategoryEntity::getId).collect(Collectors.toList()); wrapper.in(!CollectionUtils.isEmpty(caIds), CanteenSpuEntity::getCategoryId, caIds); // wrapper.orderByAsc(CanteenSpuEntity::getSort); @@ -164,32 +166,32 @@ public class CanteenSpuServiceImpl extends ServiceImpl pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of()); List records = pageData.getRecords(); - + // 构建返回的VO列表 List resultList = new ArrayList<>(); - + if (!CollectionUtils.isEmpty(records)) { // 获取所有SPU ID List spuIds = records.stream() .map(CanteenSpuEntity::getId) .collect(Collectors.toList()); - + // 查询对应的库存信息 LambdaQueryWrapper stockWrapper = Wrappers.lambdaQuery(); stockWrapper.in(CanteenStockEntity::getItemId, spuIds); stockWrapper.eq(CanteenStockEntity::getItemType, "2"); // 假设"成品"表示菜品的类型 List stockList = canteenStockMapper.selectList(stockWrapper); - + // 将库存信息映射到SPU ID Map stockMap = stockList.stream() .collect(Collectors.toMap(CanteenStockEntity::getItemId, stock -> stock, (v1, v2) -> v1)); - + // 构建返回结果 for (CanteenSpuEntity spu : records) { CanteenSpuStockVO vo = new CanteenSpuStockVO(); vo.setName(spu.getName()); vo.setPicUrl(spu.getPicUrl()); - + // 设置库存信息 CanteenStockEntity stock = stockMap.get(spu.getId()); if (stock != null) { @@ -205,11 +207,11 @@ public class CanteenSpuServiceImpl extends ServiceImpl resultPage = new Page<>(); resultPage.setRecords(resultList); @@ -217,7 +219,7 @@ public class CanteenSpuServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.like(StrUtil.isNotBlank(canteenSpu.getName()), CanteenSpuEntity::getName, canteenSpu.getName()); wrapper.eq(Objects.nonNull(canteenSpu.getCategoryId()), CanteenSpuEntity::getCategoryId, canteenSpu.getCategoryId()); + wrapper.eq(Objects.nonNull(canteenSpu.getIsPriceIncreased()), CanteenSpuEntity::getIsPriceIncreased, canteenSpu.getIsPriceIncreased()); + if (ObjectUtil.isNotEmpty(canteenSpu.getGePrice()) && canteenSpu.getGePrice() > 0) { + wrapper.ge(CanteenSpuEntity::getPrice, canteenSpu.getGePrice() * 100); + } wrapper.orderByAsc(CanteenSpuEntity::getSort).orderByDesc(CanteenSpuEntity::getId); LambdaQueryWrapper canteenOnlineSpuEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml index f47debe6c..97c691e96 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml @@ -28,6 +28,7 @@ + - \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java index c917b5344..7c0eb61b0 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTrustedDeviceService.java @@ -48,8 +48,8 @@ public interface RemoteUserTrustedDeviceService { @NoToken - @GetMapping("/userTrustedDevice/getUserTrustedDeviceByIdAndMD5" ) - R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone")String mobilePhone,@RequestParam("md5") String md5); + @GetMapping("/userTrustedDevice/getUserTrustedDeviceByIdAndMD5") + R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone") String mobilePhone, @RequestParam("md5") String md5, @RequestParam("deviceName") String deviceName); @PostMapping("/userTrustedDevice/save") diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java index 0bad98b75..1ec032d71 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java @@ -104,14 +104,23 @@ public class SysUserFaceController { /* ************************************* start android start ************************************* */ @Operation(summary = "android查询人脸数据库", description = "android查询人脸数据库") @GetMapping("/ad/find-face") - public R adFinFace(@ParameterObject Page page, @RequestParam(required = false) Long userId, - @RequestParam(required = false) Long merchantDeptId) { + public R adFinFace(@ParameterObject Page page, @RequestParam(required = false) Long userId, @RequestParam(required = false) Long merchantDeptId) { SysUserFaceDto dto = new SysUserFaceDto(); dto.setUserId(userId); dto.setMerchantDeptIdOrGlobal(merchantDeptId); dto.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); return R.ok(sysUserFaceService.pageJoin(page, dto).getRecords()); } + + @Operation(summary = "android查询人脸数据库", description = "android查询人脸数据库") + @GetMapping("/ad/v2/find-face") + public R adV2FinFace(@ParameterObject Page page, @RequestParam(required = false) Long userId, @RequestParam(required = false) Long merchantDeptId) { + SysUserFaceDto dto = new SysUserFaceDto(); + dto.setUserId(userId); + dto.setMerchantDeptIdOrGlobal(merchantDeptId); + dto.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + return R.ok(sysUserFaceService.allPageJoin(page, dto).getRecords()); + } /* ************************************* start android start ************************************* */ @Operation(summary = "设置为全局人脸", description = "设置为全局人脸") diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java index e80365561..0a674d082 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/UserTrustedDeviceController.java @@ -30,22 +30,23 @@ import java.util.List; */ @RestController @RequiredArgsConstructor -@RequestMapping("/userTrustedDevice" ) -@Tag(description = "userTrustedDevice" , name = "设备指纹管理" ) +@RequestMapping("/userTrustedDevice") +@Tag(description = "userTrustedDevice", name = "设备指纹管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class UserTrustedDeviceController { - private final UserTrustedDeviceService userTrustedDeviceService; + private final UserTrustedDeviceService userTrustedDeviceService; /** * 分页查询 - * @param page 分页对象 + * + * @param page 分页对象 * @param userTrustedDevice 设备指纹 * @return */ - @Operation(summary = "分页查询" , description = "分页查询" ) - @GetMapping("/page" ) - @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')" ) + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')") public R getUserTrustedDevicePage(@ParameterObject Page page, @ParameterObject UserTrustedDeviceEntity userTrustedDevice) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); return R.ok(userTrustedDeviceService.page(page, wrapper)); @@ -54,22 +55,24 @@ public class UserTrustedDeviceController { /** * 通过id查询设备指纹 + * * @param id id * @return R */ - @Operation(summary = "通过id查询" , description = "通过id查询" ) - @GetMapping("/{id}" ) - @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')" ) - public R getById(@PathVariable("id" ) Long id) { + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_view')") + public R getById(@PathVariable("id") Long id) { return R.ok(userTrustedDeviceService.getById(id)); } /** * 新增设备指纹 + * * @param userTrustedDevice 设备指纹 * @return R */ - @Operation(summary = "新增设备指纹" , description = "新增设备指纹" ) + @Operation(summary = "新增设备指纹", description = "新增设备指纹") @PostMapping("/save") @Inner public R save(@RequestBody UserTrustedDeviceEntity userTrustedDevice) { @@ -78,11 +81,12 @@ public class UserTrustedDeviceController { /** * 修改设备指纹 + * * @param userTrustedDevice 设备指纹 * @return R */ - @Operation(summary = "修改设备指纹" , description = "修改设备指纹" ) - @SysLog("修改设备指纹" ) + @Operation(summary = "修改设备指纹", description = "修改设备指纹") + @SysLog("修改设备指纹") @PutMapping("/update") @Inner public R updateById(@RequestBody UserTrustedDeviceEntity userTrustedDevice) { @@ -91,23 +95,23 @@ public class UserTrustedDeviceController { /** * 通过id删除设备指纹 + * * @param ids id列表 * @return R */ - @Operation(summary = "通过id删除设备指纹" , description = "通过id删除设备指纹" ) - @SysLog("通过id删除设备指纹" ) + @Operation(summary = "通过id删除设备指纹", description = "通过id删除设备指纹") + @SysLog("通过id删除设备指纹") @DeleteMapping - @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_del')" ) + @PreAuthorize("@pms.hasPermission('admin_userTrustedDevice_del')") public R removeById(@RequestBody Long[] ids) { return R.ok(userTrustedDeviceService.removeBatchByIds(CollUtil.toList(ids))); } - - @Operation(summary = "通过md5和用户查询设备" , description = "通过md5和用户查询设备" ) - @GetMapping("/getUserTrustedDeviceByIdAndMD5" ) + @Operation(summary = "通过md5和用户查询设备", description = "通过md5和用户查询设备") + @GetMapping("/getUserTrustedDeviceByIdAndMD5") @Inner - public R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone")String mobilePhone,@RequestParam("md5") String md5) { - return R.ok(userTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(mobilePhone,md5)); + public R getUserTrustedDeviceByIdAndMD5(@RequestParam("mobilePhone") String mobilePhone, @RequestParam("md5") String md5, @RequestParam("deviceName") String deviceName) { + return R.ok(userTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(mobilePhone, md5, deviceName)); } } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java index a5a996461..586092a7f 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserFaceMapper.java @@ -69,4 +69,7 @@ public interface SysUserFaceMapper extends PjcloudBaseMapper } return selectJoinPage(page, SysUserFaceVo.class, wrapper); } + + Page allPageJoin(Page page, @Param("pa") SysUserFaceDto pa); + } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java index 1ef233b84..2f23be4c7 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserFaceService.java @@ -23,6 +23,8 @@ public interface SysUserFaceService extends IService { Page scopePageList(Page page, SysUserFaceDto dto, DataScope dataScope); + Page allPageJoin(Page page, SysUserFaceDto dto); + Page pageJoin(Page page, SysUserFaceDto dto); SysUserFaceVo join(Long id); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java index 14bc5a1e0..d2e468d95 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/UserTrustedDeviceService.java @@ -8,12 +8,12 @@ public interface UserTrustedDeviceService extends IService allPageJoin(Page page, SysUserFaceDto dto) { + if (ObjectUtil.isNotEmpty(dto.getMerchantDeptIdOrGlobal())) { + List deptList = sysDeptService.listDescendant(dto.getMerchantDeptIdOrGlobal()); + if (ObjectUtil.isNotEmpty(deptList)) { + List deptIds = deptList.stream().map(SysDept::getDeptId).toList(); + dto.setDeptIds(deptIds); + } + } + return baseMapper.allPageJoin(page, dto); + } + @Override public Page pageJoin(Page page, SysUserFaceDto dto) { if (ObjectUtil.isNotEmpty(dto.getMerchantDeptIdOrGlobal())) { diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/UserTrustedDeviceServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/UserTrustedDeviceServiceImpl.java index 03ed989d0..abbf0eb63 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/UserTrustedDeviceServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/UserTrustedDeviceServiceImpl.java @@ -8,6 +8,7 @@ import com.bsd.pjcloud.admin.service.UserTrustedDeviceService; import com.bsd.pjcloud.common.core.util.DeviceFingerprintUtil; import com.bsd.pjcloud.common.core.util.WebUtils; import org.springframework.stereotype.Service; + /** * 设备指纹 * @@ -22,10 +23,11 @@ public class UserTrustedDeviceServiceImpl extends ServiceImpl userTrustedDeviceEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getMobilePhone, mobilePhone); userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getDeviceFingerprint, md5); + userTrustedDeviceEntityLambdaQueryWrapper.eq(UserTrustedDeviceEntity::getDeviceName, deviceName); return baseMapper.selectOne(userTrustedDeviceEntityLambdaQueryWrapper); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml index 7057675ed..6f13c9201 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml @@ -2,17 +2,6 @@ - - - - - - - - - - - select a.id, @@ -35,9 +24,18 @@ and a.user_id = #{pa.userId} + + and a.user_id in + + #{v} + + and a.process_status = #{pa.processStatus} + + and a.process_id is not null + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/pom.xml b/pjcloud-wallet/pjcloud-wallet-api/pom.xml index 574f71758..a561ee3b1 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/pom.xml +++ b/pjcloud-wallet/pjcloud-wallet-api/pom.xml @@ -12,7 +12,11 @@ pjcloud-wallet-api - + + 2.2.20 + + + com.github.yulichang @@ -52,5 +56,81 @@ com.bsd pjcloud-upms-api + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + src/main/java + target/generated-sources/annotations + + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + none + + + default-testCompile + none + + + compile + compile + + compile + + + + testCompile + test-compile + + testCompile + + + + + + + + diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java index 7215ee316..60aae9e7e 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java @@ -19,6 +19,11 @@ public enum WalletBizRechargeEnum { private final String desc; + public static List reductionList = List.of( + REDUCTION, + RETURN_CANTEEN + ); + public static List reductionCodes() { return Arrays.asList(REDUCTION.getCode(), RETURN_CANTEEN.getCode()); } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java index c2611195f..182230123 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletManageDto.java @@ -4,7 +4,6 @@ import com.bsd.pjcloud.admin.api.vo.base.BaseIsIncludeTreeInterface; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import lombok.Data; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -27,4 +26,9 @@ public class WalletManageDto extends WalletManageEntity implements BaseIsInclude */ private Boolean isInclude; + /** + * 钱包余额大于等于 + */ + private Integer leBalance; + } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargePaySuccess.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargePaySuccess.java new file mode 100644 index 000000000..25518965b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargePaySuccess.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.wallet.api.dto.recharge; + +import lombok.Data; + +@Data +public class WalletRechargePaySuccess { + + /** + * 订单号 + */ + private String payNo; + + /** + * 用户id + */ + private Long userId; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 业务id + */ + private String bizId; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeRefundSuccess.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeRefundSuccess.java new file mode 100644 index 000000000..a89f6330e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeRefundSuccess.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.wallet.api.dto.recharge; + +import lombok.Data; + +@Data +public class WalletRechargeRefundSuccess { + + /** + * 订单号 + */ + private String refundNo; + + /** + * 用户id + */ + private Long userId; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 业务id + */ + private String bizId; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java index a05fe259d..1250b2550 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java @@ -95,11 +95,19 @@ public class WalletManageEntity extends Model { /** * 饭卡绑定状态 + * * @see WalleCardStatusEnum */ @Schema(description = "饭卡绑定状态") private String status; + /** + * 版本号 + */ + @Version + @Schema(description = "版本号") + private Integer version = 0; + /** * 创建人 */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java index 55d771e39..a18bcfc38 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java @@ -78,6 +78,13 @@ public class WalletTransactionEntity extends Model { @Schema(description = "余额, 单位分") private Integer balance; + /** + * 乐观锁 + */ + @Version + @Schema(description = "乐观锁") + private Integer version = 0; + /** * 创建人 */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java index 1a6ca9eaf..7507bcd5e 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java @@ -2,10 +2,15 @@ package com.bsd.pjcloud.wallet.api.feign; import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePaySuccess; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundSuccess; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; @FeignClient(contextId = "remoteWalletRechargePackageService", value = ServiceNameConstants.WALLET_SERVICE) public interface RemoteWalletRechargePackageService { @@ -13,4 +18,11 @@ public interface RemoteWalletRechargePackageService { @GetMapping("/wallet-recharge-package/remote/{id}") R remoteGetById(@PathVariable("id") Long id); + @NoToken + @PostMapping("/wallet-recharge-package/remote/pay-success") + R remotePaySuccess(@RequestBody WalletRechargePaySuccess dto); + + @NoToken + @PostMapping("/wallet-recharge-package/remote/refund-success") + R remoteRefundSuccess(@RequestBody WalletRechargeRefundSuccess dto); } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java index 6cb983fe9..36cc04fc3 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java @@ -43,6 +43,11 @@ public class WalletXfjDiscounts { */ private Double extraPer; + /** + * 特色菜是否额外收费 + */ + private String specialDishEnable; + public int computedDiscountsExtraPrice(int totalPrice) { if (totalPrice <= basePrice) return 0; double rate = ObjectUtil.isEmpty(extraPer) ? 1.0 : extraPer; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeValidateErrorVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeValidateErrorVo.java new file mode 100644 index 000000000..145e6275a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeValidateErrorVo.java @@ -0,0 +1,52 @@ +package com.bsd.pjcloud.wallet.api.vo.recharge; + +import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class WalletRechargeValidateErrorVo implements BaseUserInterface { + + /** + * 用户相关 + */ + private Long userId; + + private String username; + + private String userMobile; + + private String userAvatar; + + /** + * 饭卡类型id + */ + private Long walletTypeId; + + /** + * 钱包余额 + */ + private Integer walletBlance; + + /** + * 操作类型 + */ + private String bizType; + + /** + * 操作金额 + */ + private Integer price; + + /** + * 操作后的金额 + */ + private Integer afterPrice; + + /** + * 错误信息 + */ + private List errorList; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/pom.xml b/pjcloud-wallet/pjcloud-wallet-biz/pom.xml index 7458306d7..c173c8348 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/pom.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/pom.xml @@ -13,6 +13,12 @@ pjcloud-wallet-biz + + + com.baomidou + lock4j-redis-template-spring-boot-starter + 2.2.7 + com.bsd diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java index eae9312ca..51effbb2f 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java @@ -36,9 +36,6 @@ import java.util.List; /** * 钱包管理 - * - * @author dzc - * @date 2024-12-30 09:06:35 */ @RestController @RequiredArgsConstructor @@ -207,6 +204,14 @@ public class WalletManageController { PjcloudUser user = SecurityUtils.getUser(); return R.ok(walletManageService.isUseDoor(user.getId())); } + + @GetMapping("/app/topup-wallet") + @Operation(summary = "创建充值钱包") + public R createTopupWallet() { + PjcloudUser user = SecurityUtils.getUser(); + walletManageService.createWallet(user.getId()); + return R.ok(); + } /* ************************************* end app end ************************************* */ @Operation(summary = "分页查询", description = "分页查询") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index f9e362697..a59c229ae 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -37,9 +37,6 @@ import java.util.concurrent.TimeUnit; /** * 会员钱包流水表 - * - * @author pjcloud - * @date 2024-12-30 09:17:49 */ @RestController @RequiredArgsConstructor diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java index 3cb568db6..1372be199 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java @@ -20,6 +20,7 @@ import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyCompareAceVo; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeValidateErrorVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; import com.bsd.pjcloud.wallet.service.WalletRechargeApplyService; import com.bsd.pjcloud.wallet.service.WalletRechargeApplyComposeService; @@ -55,6 +56,12 @@ public class WalletRechargeApplyController { } /* ************************************* start callback start ************************************* */ + @GetMapping("/validate-error") + @Operation(summary = "校验申请的充值/扣款数据当前是否合法") + public R> validateError(@RequestParam Long applyId) { + return R.ok(walletRechargeApplyService.validateError(applyId)); + } + @PostMapping("/save-topup") @Operation(summary = "新增充值") @Idempotent(expireTime = 3, key = "'/wallet-recharge-apply/save-topup' + #dto.getInvoiceId()", info = "正在充值中,请勿重复操作") @@ -79,7 +86,7 @@ public class WalletRechargeApplyController { @SysLog("提交申请") @GetMapping("/apply") @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_apply')") - @Idempotent(expireTime = 5, info = "正在申请中,请勿重复操作") + @Idempotent(expireTime = 5, key = "'/wallet-recharge-apply/apply/' + #id", info = "正在申请中,请勿重复操作") public R apply(@RequestParam Long id) { walletRechargeApplyService.apply(id); return R.ok(true); @@ -166,13 +173,13 @@ public class WalletRechargeApplyController { } @PostMapping("/read-excel") - @Idempotent(expireTime = 3, info = "正在上传中,请勿重复操作") + @Idempotent(expireTime = 3, key = "'/wallet-recharge-apply/read-excel'", info = "正在上传中,请勿重复操作") public R readExcel(@RequestExcel List excelVOList, BindingResult bindingResult, @RequestParam(required = false) String bizType) { return walletRechargeApplyService.readExcel(excelVOList, bindingResult, bizType); } @PostMapping("/read-topup-excel") - @Idempotent(expireTime = 3, info = "正在上传中,请勿重复操作") + @Idempotent(expireTime = 3, key = "'/wallet-recharge-apply/read-topup-excel'", info = "正在上传中,请勿重复操作") public R readTopupExcel(@RequestExcel List excelVOList, BindingResult bindingResult) { return walletRechargeApplyService.readTopupExcel(excelVOList, bindingResult); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java index b06501219..b890d4f29 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java @@ -1,21 +1,14 @@ package com.bsd.pjcloud.wallet.controller.recharge; -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.admin.api.entity.SysUser; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; -import com.bsd.pjcloud.common.security.service.PjcloudUser; -import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; -import com.bsd.pjcloud.wallet.api.constant.WalletInvoiceStatusCheckEnum; -import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeBindInvoiceDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeInvoiceApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeInvoiceRefreshDto; @@ -34,8 +27,6 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import java.util.List; - /** * 充值/扣款申请发票记录 */ @@ -59,7 +50,7 @@ public class WalletRechargeInvoiceController { @Operation(summary = "重新生成发票", description = "重新生成发票") @SysLog("重新生成发票") @PostMapping("/refreshInvoice") - @Idempotent(expireTime = 10, info = "正在重新生成发票中,请勿重复操作") + @Idempotent(expireTime = 3, key = "'/walletRechargeInvoice/refreshInvoice/' + #dto.getId()", info = "正在重新生成发票中,请勿重复操作") public R refreshInvoice(@Valid @RequestBody WalletRechargeInvoiceRefreshDto dto) { walletRechargeInvoiceService.refreshInvoice(dto); return R.ok(true); @@ -68,7 +59,7 @@ public class WalletRechargeInvoiceController { @Operation(summary = "提交申请", description = "提交申请") @SysLog("提交申请") @PostMapping("/apply") - @Idempotent(expireTime = 3, info = "正在申请中,请勿重复操作") + @Idempotent(expireTime = 3, key = "'/walletRechargeInvoice/apply/' + #body.getId()", info = "正在申请中,请勿重复操作") public R apply(@Valid @RequestBody WalletRechargeInvoiceApplyDto body) { walletRechargeInvoiceService.apply(body); return R.ok(true); @@ -83,6 +74,7 @@ public class WalletRechargeInvoiceController { @GetMapping("/back") @Operation(summary = "退回作废发票") + @Idempotent(expireTime = 3, key = "'/walletRechargeInvoice/back/' + #id", info = "正在退回中,请勿重复操作") public R backInvoice(@RequestParam("id") Long id) { walletRechargeInvoiceService.backInvoice(id); return R.ok(); @@ -90,6 +82,7 @@ public class WalletRechargeInvoiceController { @PostMapping("/bind-invoice") @Operation(summary = "绑定发票") + @Idempotent(expireTime = 3, key = "'/walletRechargeInvoice/bind-invoice/' + #dto.getApplyId()", info = "正在申请中,请勿重复操作") public R bindInvoice(@Valid @RequestBody WalletRechargeBindInvoiceDto dto) { walletRechargeInvoiceService.bindInvoice(dto); return R.ok(); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java index 94dfe8a03..e86265ce8 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java @@ -7,7 +7,10 @@ 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.common.security.annotation.Inner; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePackageDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePaySuccess; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundSuccess; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; import com.bsd.pjcloud.wallet.service.WalletRechargePackageService; import org.springframework.security.access.prepost.PreAuthorize; @@ -24,9 +27,6 @@ import java.util.List; /** * 充值套餐表 - * - * @author dzc - * @date 2025-01-03 18:33:55 */ @RestController @RequiredArgsConstructor @@ -43,13 +43,30 @@ public class WalletRechargePackageController { public R remoteGetById(@PathVariable("id") Long id) { return R.ok(walletRechargePackageService.getById(id)); } + + @Inner + @Operation(summary = "支付成功", description = "支付成功") + @PostMapping("/remote/pay-success") + public R remotePaySuccess(@RequestBody WalletRechargePaySuccess dto) { + return R.ok(walletRechargePackageService.remotePaySuccess(dto)); + } + + @Inner + @Operation(summary = "退款成功", description = "退款成功") + @PostMapping("/remote/refund-success") + public R remoteRefundSuccess(@RequestBody WalletRechargeRefundSuccess dto) { + return R.ok(walletRechargePackageService.remoteRefundSuccess(dto)); + } /* ************************************* end remote end ************************************* */ /* ************************************* start app start ************************************* */ @Operation(summary = "查询全部", description = "查询全部") @GetMapping("/app/list") public R appList() { - return R.ok(walletRechargePackageService.list(new LambdaQueryWrapper<>())); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.orderByAsc(WalletRechargePackageEntity::getPayPrice); + wrapper.orderByDesc(WalletRechargePackageEntity::getCreateTime); + return R.ok(walletRechargePackageService.list(wrapper)); } /* ************************************* end app end ************************************* */ @@ -58,6 +75,7 @@ public class WalletRechargePackageController { @PreAuthorize("@pms.hasPermission('wallet_walletRechargePackage_view')") public R getWalletRechargePackagePage(@ParameterObject Page page, @ParameterObject WalletRechargePackageEntity walletRechargePackage) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.orderByAsc(WalletRechargePackageEntity::getPayPrice); wrapper.orderByDesc(WalletRechargePackageEntity::getCreateTime); return R.ok(walletRechargePackageService.page(page, wrapper)); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java index 84ddbdf51..29964905c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java @@ -40,9 +40,10 @@ public interface WalletManageMapper extends PjcloudBaseMapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" balance = balance - " + price + ", total_expense = total_expense + " + price) + .setSql(" balance = balance - " + price + ", total_expense = total_expense + " + price + ", version = version + 1") .eq(WalletManageEntity::getId, id); if (ObjectUtil.isEmpty(force) || !force) { lambdaUpdateWrapper.ge(WalletManageEntity::getBalance, price); @@ -80,7 +81,7 @@ public interface WalletManageMapper extends PjcloudBaseMapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" balance = balance + " + price + ", total_expense = total_expense - " + price) + .setSql(" balance = balance + " + price + ", total_expense = total_expense - " + price + ", version = version + 1") .eq(WalletManageEntity::getId, id); return update(null, lambdaUpdateWrapper); } @@ -91,10 +92,11 @@ public interface WalletManageMapper extends PjcloudBaseMapper lambdaUpdateWrapper = new LambdaUpdateWrapper() - .setSql(" balance = balance + " + price + ", total_recharge = total_recharge + " + price) - .eq(WalletManageEntity::getId, id); + .setSql(" balance = balance + " + price + ", total_recharge = total_recharge + " + price + ", version = version + 1") + .eq(WalletManageEntity::getId, id) + .eq(WalletManageEntity::getVersion, version); return update(null, lambdaUpdateWrapper); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java index 69076ad4c..01bd96812 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java @@ -4,21 +4,16 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionSumAndCountDto; -import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; -import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.vo.WalletExportCzTotalPerson; import com.bsd.pjcloud.wallet.api.vo.WalletTransactionSumAndCountVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeCountVo; -import com.bsd.pjcloud.wallet.api.vo.WalletTypeTotalVo; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplySelectCompareVo; import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo; -import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -65,25 +60,16 @@ public interface WalletTransactionMapper extends PjcloudBaseMapper scopePageList(Page page, WalletTransactionDto dto, DataScope dataScope) { - Page list = selectPageByScope(page, commonWrapperQuery(dto), dataScope); - list.setRecords(BeanUtils.toBean(list.getRecords(), WalletTransactionVo.class)); - return list; - } + Page scopePageList(Page page, @Param("dto") WalletTransactionDto dto, DataScope dataScope); + + List scopeList(@Param("dto") WalletTransactionDto dto, DataScope dataScope); + + Long count(@Param("dto") WalletTransactionDto dto, DataScope dataScope); WalletTypeCountVo walletTypetotal(@Param("dto") WalletTransactionDto dto, @Param("dataScope") DataScope dataScope); List walletTypetotalByDept(@Param("dto") WalletTransactionDto dto, @Param("dataScope") DataScope dataScope); - default List scopeList(WalletTransactionDto dto, DataScope dataScope) { - List list = selectListByScope(commonWrapperQuery(dto), dataScope); - return BeanUtils.toBean(list, WalletTransactionVo.class); - } - - default Long count(WalletTransactionDto dto, DataScope dataScope) { - return selectCountByScope(commonWrapperQuery(dto), dataScope); - } - Page scopeJzPageList(Page page, @Param("dto") WalletTransactionDto dto, DataScope dataScope); Integer getTransactionPriceCount(@Param("month") String importTimeStr, @Param("walletId") Long walletId, diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java index 8b641c875..0473ef48c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java @@ -12,6 +12,7 @@ import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeValidateErrorVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; import jakarta.servlet.http.HttpServletResponse; import org.springframework.validation.BindingResult; @@ -72,4 +73,9 @@ public interface WalletRechargeApplyService extends IService validateError(Long applyId); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargePackageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargePackageService.java index 533f005c4..4df1e28ee 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargePackageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargePackageService.java @@ -3,15 +3,28 @@ 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.recharge.WalletRechargePackageDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePaySuccess; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundSuccess; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargePackageVo; public interface WalletRechargePackageService extends IService { + /** + * 支付成功 + */ + Boolean remotePaySuccess(WalletRechargePaySuccess dto); + + /** + * 退款成功 + */ + Boolean remoteRefundSuccess(WalletRechargeRefundSuccess dto); + Page pageJoin(Page page, WalletRechargePackageDto dto); /** * 校验是否有效 + * * @param packageId * @return */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java index 5913a3a91..ff599ce08 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeService.java @@ -17,25 +17,16 @@ public interface WalletRechargeService extends IService { /** * app充值 - * - * @param dto - * @return */ WalletRechargeEntity createWalletRecharge(WalletAppRechargeDto dto); /** * 远程调用-退款 - * - * @param dto - * @return */ WalletRechargeVo refund(WalletRechargeRefundDto dto); - /** * 根据退款id查询 - * - * @return */ WalletRechargeEntity getByRefundId(Long refundId); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java index 05a25fa45..66f7f9174 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java @@ -38,32 +38,16 @@ public interface WalletTransactionService extends IService validateError(Long applyId) { + + List resultList = new ArrayList<>(); + + WalletRechargeApplyEntity detail = baseMapper.selectById(applyId); + if (ObjectUtil.isEmpty(detail)) return null; + // 校验判断回不回出现扣减之后为负数的情况 + List reductionList = WalletBizRechargeEnum.reductionList.stream().map(WalletBizRechargeEnum::getCode).toList(); + if (reductionList.contains(detail.getBizType())) { + List importList = rechargeImportService.list(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getApplyId, applyId)); + if (ObjectUtil.isEmpty(importList)) { + return null; + } + List userIds = importList.stream().map(WalletRechargeImportEntity::getUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + // 查询现在这些用户的钱包余额 + WalletManageDto walletQueryDto = new WalletManageDto(); + walletQueryDto.setWalletTypeId(detail.getWalletTypeId()); + walletQueryDto.setUserIds(userIds); + List walletList = walletManageMapper.list(walletQueryDto); + // 判断每一个人的每一个钱包余额是否满足扣减 + for (WalletManageEntity wallet : walletList) { + List list = importList.stream().filter(v -> ObjectUtil.equals(v.getUserId(), wallet.getUserId())).toList(); + if (ObjectUtil.isEmpty(list)) continue; + Integer reductionPrice = list.stream().map(WalletRechargeImportEntity::getPrice).reduce(Integer::sum).orElse(0); + + int price = wallet.getBalance() - reductionPrice; + + if (price < 0) { + WalletRechargeValidateErrorVo item = new WalletRechargeValidateErrorVo(); + item.setUserId(wallet.getUserId()); + item.setBizType(detail.getBizType()); + item.setWalletTypeId(detail.getWalletTypeId()); + item.setWalletBlance(wallet.getBalance()); + item.setPrice(reductionPrice); + item.setAfterPrice(price); + item.setErrorList(new ArrayList() {{ + add("钱包余额不足以扣款,请尽快联系该用户"); + }}); + resultList.add(item); + } + + } + } + + // 处理`resultList`结果 + if (ObjectUtil.isNotEmpty(resultList)) { + List userIds = resultList.stream().map(WalletRechargeValidateErrorVo::getUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + List userList = userService.getInnerUserById(userIds).getData(); + if (ObjectUtil.isNotEmpty(userList)) { + DataUtil.convertUserList(resultList, CollectionUtils.convertMap(userList, SysUser::getUserId)); + } + } + + return resultList; + } + /** * 导出充值/扣款申请 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargePackageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargePackageServiceImpl.java index 90ba0ef42..b8be632e4 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargePackageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargePackageServiceImpl.java @@ -1,25 +1,113 @@ package com.bsd.pjcloud.wallet.service.impl.recharge; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderBizTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePackageDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePaySuccess; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundSuccess; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargePackageVo; import com.bsd.pjcloud.wallet.mapper.recharge.WalletRechargePackageMapper; +import com.bsd.pjcloud.wallet.service.WalletManageService; import com.bsd.pjcloud.wallet.service.WalletRechargePackageService; +import com.bsd.pjcloud.wallet.service.WalletTransactionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** - * 充值套餐表 - * - * @author dzc - * @date 2025-01-03 18:33:55 + * 充值套餐 */ +@Slf4j @Service +@AllArgsConstructor public class WalletRechargePackageServiceImpl extends ServiceImpl implements WalletRechargePackageService { + static private final String TAG = "充值套餐"; + + private final WalletManageService walletManageService; + private final WalletTransactionService walletTransactionService; + + /** + * 支付成功的回调 + */ + @Override + public Boolean remotePaySuccess(WalletRechargePaySuccess dto) { + // 小程序用户钱包充值 + if (ObjectUtil.equals(dto.getBizType(), ThirdPayOrderBizTypeEnum.MINI_APP_WALLET_RECHARGE.getType())) { + // 查询充值套餐 + WalletRechargePackageEntity rechargePackage = baseMapper.selectById(dto.getBizId()); + if (ObjectUtil.isEmpty(rechargePackage)) { + log.error("{}支付成功的回调,充值套餐不存在,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + // 需要充值的金额 + Integer totalPrice = rechargePackage.getPayPrice() + rechargePackage.getBonusPrice(); + if (totalPrice <= 0) { + log.error("{}支付成功的回调,充值套餐金额<=0,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + // 查询这个用户的充值钱包 + WalletManageEntity topupWallet = walletManageService.getWallet(dto.getUserId(), WalletTypeEnum.TOPUP); + if (ObjectUtil.isEmpty(topupWallet)) { + log.error("{}支付成功的回调,查询这个用户的充值钱包,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + // 进行充值 + WalletTransactionEntity walletTransaction = walletTransactionService.addWalletBalance(topupWallet.getId(), totalPrice, dto.getPayNo(), WalletBizEnum.RECHARGE); + return ObjectUtil.isNotEmpty(walletTransaction); + } + // 不支持的类型 + else { + log.error("{}支付成功的回调,不支持的类型,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + } + + /** + * 退款成功的回调 + */ + @Override + public Boolean remoteRefundSuccess(WalletRechargeRefundSuccess dto) { + // 小程序用户钱包充值 + if (ObjectUtil.equals(dto.getBizType(), ThirdPayOrderBizTypeEnum.MINI_APP_WALLET_RECHARGE.getType())) { + // 查询充值套餐 + WalletRechargePackageEntity rechargePackage = baseMapper.selectById(dto.getBizId()); + if (ObjectUtil.isEmpty(rechargePackage)) { + log.error("{}退款成功的回调,充值套餐不存在,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + // 需要退款的金额 + Integer totalPrice = rechargePackage.getPayPrice() + rechargePackage.getBonusPrice(); + if (totalPrice <= 0) { + log.error("{}退款成功的回调,充值套餐金额<=0,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + // 查询这个用户的充值钱包 + WalletManageEntity topupWallet = walletManageService.getWallet(dto.getUserId(), WalletTypeEnum.TOPUP); + if (ObjectUtil.isEmpty(topupWallet)) { + log.error("{}退款成功的回调,查询这个用户的充值钱包,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + // 进行扣款预约扣款为负数 + WalletTransactionEntity walletTransaction = walletTransactionService.reduceWalletBalance(topupWallet.getId(), totalPrice, dto.getRefundNo(), WalletBizEnum.REFUND, true); + return ObjectUtil.isNotEmpty(walletTransaction); + } + // 不支持的类型 + else { + log.error("{}退款成功的回调,不支持的类型,dto:{}", TAG, JSONUtil.toJsonStr(dto)); + return false; + } + } + @Override public Page pageJoin(Page page, WalletRechargePackageDto dto) { return baseMapper.pageJoin(page, dto); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml index 83c892c8a..86811bc37 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml @@ -2,25 +2,6 @@ - - - - - - - - - - - - - - - - - - - select a.id, @@ -35,6 +16,7 @@ a.is_freeze, a.active_bind_time, a.status, + a.version, a.create_by, a.create_time, a.update_by, diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml index 1778351a6..340200903 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml @@ -22,12 +22,13 @@ a.title, a.price, a.balance, + a.version, a.create_by, a.create_time, a.update_by, a.update_time, a.del_flag, - a.tenant_id, + a.tenant_id @@ -102,7 +103,7 @@ + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/WalletTransactionTest.java b/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/WalletTransactionTest.java new file mode 100644 index 000000000..42e70bf80 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/WalletTransactionTest.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud; + +import com.bsd.pjcloud.wallet.WalletApp; +import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; +import com.bsd.pjcloud.wallet.service.WalletTransactionService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest(classes = WalletApp.class) +public class WalletTransactionTest { + + @Resource + private WalletTransactionService walletTransactionService; + + @Test + public void eruptAdd() { + // 4.24 + Long walletId = 1877309001545244673L; + int price = 1; + String bizId = "-1"; + + for (int i = 0; i < 5; i++) { + walletTransactionService.addWalletBalance(walletId, price, bizId, WalletBizEnum.RECHARGE); + } + } + +}