diff --git a/db/1000pjcloudx_thirdparty.sql b/db/1000pjcloudx_thirdparty.sql index 896b8a121..caa10d65f 100644 --- a/db/1000pjcloudx_thirdparty.sql +++ b/db/1000pjcloudx_thirdparty.sql @@ -58,6 +58,59 @@ CREATE TABLE `third_door_log` COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT ='智能柜日志'; +-- ---------------------------- +-- Table structure for third_pay_log +-- ---------------------------- +DROP TABLE IF EXISTS `third_pay_log`; +CREATE TABLE `third_pay_log` +( + `id` bigint NOT NULL COMMENT '主键', + `pay_source_type` varchar(32) NOT NULL COMMENT '支付发起方类型id', + `biz_type` varchar(32) NOT NULL COMMENT '支付类型', + `biz_id` varchar(2048) DEFAULT NULL COMMENT '支付类型id', + `api_url` text DEFAULT NULL COMMENT 'api-url', + `res` text DEFAULT NULL COMMENT 'res', + `req` text DEFAULT NULL COMMENT 'req', + `error` text DEFAULT NULL COMMENT '调用错误', + `time_consuming` char(64) DEFAULT NULL COMMENT '耗时(毫秒)', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='第三方支付日志'; + +-- ---------------------------- +-- Table structure for third_key_manage +-- ---------------------------- +DROP TABLE IF EXISTS `third_key_manage`; +CREATE TABLE `third_key_manage` +( + `id` bigint NOT NULL COMMENT '主键', + `name` varchar(32) NOT NULL COMMENT '第三方名字', + `biz_type` varchar(32) NOT NULL COMMENT '第三方类型id(常量)', + `app_key` varchar(256) DEFAULT NULL COMMENT 'appKey', + `app_secret` varchar(256) DEFAULT NULL COMMENT 'appSecret', + `field_key` varchar(256) DEFAULT NULL COMMENT '字段加密key', + `status` varchar(32) DEFAULT '1' COMMENT '状态', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='第三方密钥管理'; + -- ---------------------------- -- Table structure for third_zy_id_dict diff --git a/db/800pjcloudx_wallet.sql b/db/800pjcloudx_wallet.sql index 292582a18..6817780df 100644 --- a/db/800pjcloudx_wallet.sql +++ b/db/800pjcloudx_wallet.sql @@ -7,6 +7,7 @@ DROP TABLE IF EXISTS sys_user_transaction; CREATE TABLE `sys_user_transaction` ( id bigint NOT NULL COMMENT '编号', + apply_user_id bigint NOT NULL COMMENT '申请用户id', user_id bigint NOT NULL COMMENT '用户id', biz_id bigint DEFAULT NULL COMMENT '业务id', biz_type varchar(32) NOT NULL COMMENT '业务类型', @@ -20,6 +21,7 @@ CREATE TABLE `sys_user_transaction` process_id varchar(256) DEFAULT NULL COMMENT '流程id', process_status varchar(10) DEFAULT NULL COMMENT '审核状体', process_time datetime DEFAULT NULL COMMENT '审核时间', + remark varchar(1024) 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 '修改人', @@ -91,6 +93,29 @@ CREATE TABLE mch_manage COLLATE = utf8mb4_general_ci COMMENT ='商户管理'; CREATE INDEX idx_dept_id ON mch_manage (dept_id); + +-- ---------------------------- +-- Table structure for mch_catgory +-- ---------------------------- +DROP TABLE IF EXISTS `mch_catgory`; +CREATE TABLE mch_catgory +( + id bigint NOT NULL COMMENT '主键', + name varchar(64) NOT NULL COMMENT '分类名', + biz_type varchar(64) NOT NULL COMMENT '分类名类型', + sort int DEFAULT 0 COMMENT '排序', + remark varchar(512) DEFAULT '' 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 + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='商户分类表'; + -- ---------------------------- -- Table structure for mch_dpet_user -- ---------------------------- 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 a9f0a6d98..0f04101c9 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 @@ -14,7 +14,7 @@ import java.util.List; @Getter public enum HardOrderTypeEnum { BELOW("1", "线下购买"), - RESERVE("2", "线上订餐"), + RESERVE("2", "线上预定"), FOREIGN_TICKET("3", "外来人员"), STRIDE_DEPT("4", "跨单位"), ZY("5", "正元公务餐"), diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java index e051ec26a..eb5e16c03 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java @@ -21,7 +21,7 @@ public enum HardPayTypeEnum { FACE("4", "人脸识别支付"), STRIDE_DEPT_QR_CODE("5", "跨单位二维码支付"), FOREIGN_TICKET_QR_CODE("6", "外来人员二维码支付"), - RESERVE_QR_CODE("7", "线上订餐二维码支付"), + RESERVE_QR_CODE("7", "线上二维码支付"), CASH("8", "现金支付"), HARD_DOOR_FREE_PAY("9", "智能柜免密支付"), ; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAdBroadcastDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAdBroadcastDto.java new file mode 100644 index 000000000..db338e2b1 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAdBroadcastDto.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.hard.api.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class HardAdBroadcastDto { + + /** + * 广播id + */ + private List ids; + + /** + * 广播次数 + */ + private Integer count; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java index d5940b6d3..0e8fdfaa8 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java @@ -13,4 +13,9 @@ public class HardSpuDto extends HardSpuEntity { private LocalDateTime[] createTimeList; + /** + * 分类不能为空 + */ + private Boolean spuCategoryIdIsNotNull = false; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java index b13f3518d..a662ed16d 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java @@ -155,12 +155,20 @@ public class HardSpuEntity extends Model { /** * 旷世审核状态 + * 0:待审核 + * 1:审核中 + * 2:审核通过 + * 3:审核不通过 */ @Schema(description = "旷世审核状态") private String ksStatus; /** * 旷世审核状态标题 + * 0:待审核 + * 1:审核中 + * 2:审核通过 + * 3:审核不通过 */ @Schema(description = "旷世审核状态标题") private String ksStatusTitle; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardSpuController.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardSpuController.java new file mode 100644 index 000000000..a72e31d37 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardSpuController.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.hard.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.thirdparty.dto.ks.KsSkuSubmitCallbackDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(contextId = "remoteHardSpuController", value = ServiceNameConstants.HARDWARE_SERVICE) +public interface RemoteHardSpuController { + + @NoToken + @PostMapping("/sku-check-callback") + R skuCheckCallback(@RequestBody KsSkuSubmitCallbackDto dto); + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java index 78572391e..229679387 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java @@ -32,5 +32,16 @@ public class HardBroadcastVo extends HardBroadcastEntity implements BaseHardInte private String userDeptName; + /** + * 订单相关 + */ + private Long orderId; + + private String productDesc; + + private Integer payPrice; + + private String hourType; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index 910612a76..c5c83c74f 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,3 +1,4 @@ com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService com.bsd.pjcloud.hard.api.feign.RemoteHardOrderService -com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService \ No newline at end of file +com.bsd.pjcloud.hard.api.feign.RemoteHardSpuController +com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java index debdb64a5..788a365a2 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java @@ -5,9 +5,11 @@ 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.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.dto.HardAdBroadcastDto; import com.bsd.pjcloud.hard.api.dto.HardBroadcastDto; import com.bsd.pjcloud.hard.api.entity.HardBroadcastEntity; import com.bsd.pjcloud.hard.api.vo.HardBroadcastVo; @@ -22,6 +24,7 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; import java.util.Objects; @@ -37,6 +40,28 @@ public class HardBroadcastController { private final HardBroadcastService hardBroadcastService; + /* ************************************* start android start ************************************* */ + + @Operation(summary = "android查询今日的广播", description = "android查询今日的广播") + @GetMapping("/ad/today") + public R> androidToday(@ParameterObject Page page) { + HardBroadcastDto dto = new HardBroadcastDto(); + DataScope dataScope = null; + LocalDate today = LocalDate.now(); + dto.setIsDone(YesNoEnum.NO.getCode()); + dto.setCreateTimeList(new LocalDate[]{today, today.plusDays(1)}); + return R.ok(hardBroadcastService.scopePageJoin(page, dto, dataScope)); + } + + @Operation(summary = "android完成一轮广播", description = "android完成一轮广播") + @PostMapping("/ad/broadcast") + public R> androidDoneBroadcast(@RequestBody HardAdBroadcastDto dto) { + hardBroadcastService.androidDoneBroadcast(dto); + return R.ok(); + } + + /* ************************************* start android start ************************************* */ + @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('hard_hardBroadcast_view')") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java index 3a39303cf..8ef15f99d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java @@ -126,6 +126,8 @@ public class HardDoorFlowController { /* ************************************* end app end ************************************* */ + + @Operation(summary = "检修开门", description = "检修开门") @PostMapping("/open-access") @Idempotent(expireTime = 5, info = "正在开门中,请勿重复操作") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java index b98c69b17..b38aac8da 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java @@ -149,10 +149,10 @@ public class HardOrderTotalController { } @Operation(summary = "设备交易记录导出", description = "设备交易记录导出") - @GetMapping("/export-sb") + @PostMapping("/export-sb") @SysLog("设备交易记录导出") @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_sb')") - public void exportSb(HttpServletResponse response, HardOrderDto dto) throws IOException { + public void exportSb(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); List list = hardOrderTotalService.listSb(dto); try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/设备交易金额汇总.xlsx")).build()) { @@ -223,10 +223,10 @@ public class HardOrderTotalController { @Operation(summary = "商户交易记录导出", description = "商户交易记录导出") - @GetMapping("/export-cs") + @PostMapping("/export-cs") @SysLog("商户交易记录导出") @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_cs')") - public void exportTk(HttpServletResponse response, HardOrderDto dto) throws IOException { + public void exportTk(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); // 查询商户和下面的子商户 List mchDtoIds = new ArrayList<>(); @@ -308,10 +308,10 @@ public class HardOrderTotalController { } @Operation(summary = "支付方式交易记录", description = "支付方式交易记录") - @GetMapping("/export-payType") + @PostMapping("/export-payType") @SysLog("支付方式交易记录") @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_payType')") - public void exportPayType(HttpServletResponse response, HardOrderDto dto) throws IOException { + public void exportPayType(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { List list = hardOrderTotalService.listPayType(dto); try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/支付方式交易汇总.xlsx")).build()) { WriteSheet writeSheet = EasyExcel.writerSheet().build(); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java index 36fd5dda5..cb53ab33b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java @@ -9,11 +9,13 @@ 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.hard.api.dto.spu.HardPutawayDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuDto; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; import com.bsd.pjcloud.hard.service.HardSpuService; +import com.bsd.pjcloud.thirdparty.dto.ks.KsSkuSubmitCallbackDto; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; @@ -42,6 +44,18 @@ public class HardSpuController { private final HardSpuService hardSpuService; + /* ************************************* start callback start ************************************* */ + + @Inner + @Operation(summary = "商品审核回调", description = "商品审核回调") + @PostMapping("/sku-check-callback") + public R skuCheckCallback(@RequestBody KsSkuSubmitCallbackDto dto) { + hardSpuService.skuCheckCallback(dto); + return R.ok(); + } + + /* ************************************* end callback end ************************************* */ + /* ************************************* start APP start ************************************* */ @Operation(summary = "app上架", description = "上架") @@ -88,6 +102,13 @@ public class HardSpuController { return R.ok(); } + @Operation(summary = "更新旷世商品审核进度", description = "更新旷世商品审核进度") + @GetMapping("/progress") + public R progress(@RequestParam Long id) { + hardSpuService.progress(id); + return R.ok(); + } + @Operation(summary = "根据设备id智能柜编号查询商品", description = "根据设备id智能柜编号查询商品") @GetMapping("/get-by-cabinet-no") public R>>> getByCabinetNo(@RequestParam Long hardId, @RequestParam String cabinetNo) { @@ -108,7 +129,6 @@ public class HardSpuController { return R.ok(); } - @Operation(summary = "下拉查询", description = "下拉查询") @GetMapping("/select") public R select(@ParameterObject Page page, @ParameterObject HardSpuDto dto) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java index 240de46e7..162427d93 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.HardAdBroadcastDto; import com.bsd.pjcloud.hard.api.dto.HardBroadcastDto; import com.bsd.pjcloud.hard.api.entity.HardBroadcastEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; @@ -21,5 +22,10 @@ public interface HardBroadcastService extends IService { /** * 完成硬件广播 */ - void doneBroadcast(HardOrderEntity orderdetail); + void doneBroadcast(HardOrderEntity orderdetail, UserInfo userInfo); + + /** + * android完成一轮广播 + */ + void androidDoneBroadcast(HardAdBroadcastDto dto); } \ 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 d1ef932a7..6a4a89bb6 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 @@ -73,7 +73,7 @@ public interface HardOrderService extends IService { /** * 核销二维码 */ - void cancelCode(HardOrderEntity order); + void cancelCode(HardOrderEntity order, UserInfo userInfo); /** * 生成二维码 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java index e4d8cfc9c..9d394fc15 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuVo; +import com.bsd.pjcloud.thirdparty.dto.ks.KsSkuSubmitCallbackDto; import java.util.ArrayList; import java.util.List; @@ -36,6 +37,16 @@ public interface HardSpuService extends IService { */ Long edit(HardSpuEntity entity); + /** + * 更新旷世商品审核进度 + */ + void progress(Long id); + + /** + * 商品审核回调 + */ + void skuCheckCallback(KsSkuSubmitCallbackDto dto); + /** * 删除 */ @@ -75,4 +86,5 @@ public interface HardSpuService extends IService { * 扣减库存 */ Boolean deductionSpuStock(HardDoorFlowEntity hardDoorFlow, List list); + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java index 6c5eb19ab..c28dda934 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; @@ -15,6 +16,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.constant.HardBroadcastEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.dto.HardAdBroadcastDto; import com.bsd.pjcloud.hard.api.dto.HardBroadcastDto; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.entity.HardBroadcastEntity; @@ -133,6 +135,7 @@ public class HardBroadcastServiceImpl extends ServiceImpl() - .eq(HardBroadcastEntity::getBizId, orderdetail.getId()) - ); + HardBroadcastEntity broadcastDetail = baseMapper.selectOne(new LambdaQueryWrapper().eq(HardBroadcastEntity::getBizId, orderdetail.getId())); if (ObjectUtil.isEmpty(broadcastDetail)) { log.error("|{}|doneBroadcast发送mq消息失败,广播不存在|{}|", TAG, orderdetail.getId()); return; @@ -168,6 +169,40 @@ public class HardBroadcastServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper(); + if (ObjectUtil.equals(dto.getCount(), -1)) { + updateWrapper.setSql(" broadcast_count = 0 "); + } else { + updateWrapper.setSql(" broadcast_count = broadcast_count + " + dto.getCount()); + } + updateWrapper.in(HardBroadcastEntity::getId, dto.getIds()); + baseMapper.update(updateWrapper); } private void disposeList(List list, HardBroadcastDto dto) { 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 869c1be6f..341d98bde 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 @@ -592,12 +592,15 @@ public class HardOrderServiceImpl extends ServiceImpl 0; } @@ -605,7 +608,7 @@ public class HardOrderServiceImpl extends ServiceImpl { + // 核销二维码 R result = remoteCodeUseService.cancelCode(id); if (ObjectUtil.isEmpty(result) || result.getCode() != 0 || !result.getData()) { throw new RuntimeException("核销二维码错误"); } + // 发送mq + if (ObjectUtil.equals(orderTypeEnum, HardOrderTypeEnum.RESERVE)) { + hardBroadcastService.doneBroadcast(order, userInfo); + } break; } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java index 3ecc61e85..1621aa9e4 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java @@ -1,7 +1,10 @@ package com.bsd.pjcloud.hard.service.impl.spu; +import cn.hutool.Hutool; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -9,6 +12,7 @@ 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.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.resolver.ParamResolver; import com.bsd.pjcloud.hard.api.constant.spu.HardKsCheckStatusEnum; import com.bsd.pjcloud.hard.api.constant.spu.HardKsSkuTypeEnum; import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuStockDto; @@ -27,9 +31,8 @@ import com.bsd.pjcloud.hard.service.HardManagerService; import com.bsd.pjcloud.hard.service.HardSpuJoinService; import com.bsd.pjcloud.hard.service.HardSpuService; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdKsService; -import com.bsd.pjcloud.thirdparty.dto.ks.KsBarcodeLikeDto; -import com.bsd.pjcloud.thirdparty.vo.ks.KsBarcodeLikeVo; -import com.bsd.pjcloud.thirdparty.vo.ks.KsSpuVo; +import com.bsd.pjcloud.thirdparty.dto.ks.*; +import com.bsd.pjcloud.thirdparty.vo.ks.*; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -38,6 +41,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; +import java.util.regex.Pattern; /** * 硬件商品 @@ -82,35 +86,109 @@ public class HardSpuServiceImpl extends ServiceImpl().eq(HardSpuEntity::getKsSkuId, dto.getKs_sku_id())); + if (ObjectUtil.isEmpty(detail)) return; + KsSkuSubmitCallbackDto.Result result = dto.getResult(); + String comments = ""; + if (ObjectUtil.isEmpty(dto.getComments())) { + comments = dto.getComments(); + } + if (ObjectUtil.isNotEmpty(result)) { + HardSpuEntity update = new HardSpuEntity(); + update.setId(detail.getId()); + update.setKsStatus(result.getCode()); + update.setKsStatusTitle(result.getDesc()); + update.setKsComments(comments); + baseMapper.updateById(update); + } + } + /** * 删除 */ @Override public void delByIds(ArrayList list) { if (ObjectUtil.isEmpty(list)) return; + List spuList = baseMapper.selectList(new LambdaQueryWrapper().in(HardSpuEntity::getId, list)); + for (HardSpuEntity v : spuList) { + if (ObjectUtil.notEqual(v.getSkuType(), HardKsSkuTypeEnum.SELF.getType())) continue; + if (ObjectUtil.isNotEmpty(v.getKsSkuId())) { + KsSkuDeleteDto dto = new KsSkuDeleteDto(); + dto.setKs_sku_id(v.getKsSkuId()); + KsSkuDeleteVo data = remoterThirdKsService.skuDelete(dto).getData(); + if (ObjectUtil.isEmpty(data) || !data.isSuccess()) throw new RuntimeException(data.getMessage()); + } + } baseMapper.deleteByIds(list); } @@ -388,6 +466,76 @@ public class HardSpuServiceImpl extends ServiceImpl picList = Arrays.asList(pic.split(",")); + String imageBaseUrl = ParamResolver.getStr("IMAGE_BASE_URL"); + if (ObjectUtil.isEmpty(imageBaseUrl)) throw new RuntimeException("请配置图片基础路径"); + picList = picList.stream().map(v -> { + boolean isUrl = isValidUrl(v); + if (isUrl) return v; + return String.format("%s%s", imageBaseUrl, v); + }).toList(); + // 发起旷世审核 + KsSkuSubmitDto dto = new KsSkuSubmitDto(); + dto.setSku_id(String.valueOf(entity.getId())); + dto.setSku_name(entity.getName()); + dto.setImg_urls(picList); + Map specs = new HashMap<>(); + specs.put("taste", entity.getSpecsTaste()); + specs.put("capacity", entity.getSpecsCapacity()); + specs.put("weight", entity.getSpecsWeight()); + dto.setSpecs(specs); + KsSkuSubmitVo data = remoterThirdKsService.skuSubmit(dto).getData(); + if (ObjectUtil.isEmpty(data) || !data.isSuccess()) throw new RuntimeException(data.getMessage()); + HardSpuEntity update = new HardSpuEntity(); + update.setId(entity.getId()); + update.setKsSkuId(data.getKs_sku_id()); + update.setKsStatus("0"); + update.setKsStatusTitle("待审核"); + update.setKsComments("提交审核"); + baseMapper.updateById(update); + } + + /** + * 修改旷世sku审核 + */ + @Transactional(rollbackFor = Exception.class) + public void editKsSpu(HardSpuEntity entity) { + String pic = entity.getPic(); + pic = "https://nasa-voyager.oss-cn-beijing.aliyuncs.com/release/merchant_sku_img/watermark/202412021517-173bee3f2637499cb6b46e9b23d286c5.jpg"; + List picList = Arrays.asList(pic.split(",")); + String imageBaseUrl = ParamResolver.getStr("IMAGE_BASE_URL"); + if (ObjectUtil.isEmpty(imageBaseUrl)) throw new RuntimeException("请配置图片基础路径"); + picList = picList.stream().map(v -> { + boolean isUrl = isValidUrl(v); + if (isUrl) return v; + return String.format("%s%s", imageBaseUrl, v); + }).toList(); + // 修改旷世sku + KsSkuEditDto updateObj = new KsSkuEditDto(); + updateObj.setSku_name(entity.getName()); + updateObj.setImg_urls(picList); + Map specs = new HashMap<>(); + specs.put("taste", entity.getSpecsTaste()); + specs.put("capacity", entity.getSpecsCapacity()); + specs.put("weight", entity.getSpecsWeight()); + updateObj.setSpecs(specs); + KsSkuEditVo vo = remoterThirdKsService.skuEdit(updateObj, entity.getKsSkuId()).getData(); + if (ObjectUtil.isEmpty(vo) || !vo.isSuccess()) throw new RuntimeException(vo.getMessage()); + HardSpuEntity update = new HardSpuEntity(); + update.setId(entity.getId()); + update.setKsStatus("0"); + update.setKsStatusTitle("待审核"); + update.setKsComments("提交审核"); + baseMapper.updateById(update); + } + /** * 商品是否重复 */ @@ -402,8 +550,21 @@ public class HardSpuServiceImpl extends ServiceImpl 0; } + public boolean isValidUrl(String url) { + if (StrUtil.isBlank(url)) { + return false; + } + String URL_REGEX = "^(https?|ftp)://[\\w.-]+(?:\\/[\\w.-]*)*"; + Pattern URL_PATTERN = Pattern.compile(URL_REGEX); + return URL_PATTERN.matcher(url).matches(); + } + private void disposeList(List list, HardSpuDto dto) { if (ObjectUtil.isEmpty(list)) return; } + private HardSpuServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml index ff348dcc2..80964a436 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml @@ -49,7 +49,7 @@ a.del_flag = '0' - and a.userId = #{dto.userId} + and a.user_id = #{dto.userId} and a.hard_id = #{dto.hardId} @@ -76,10 +76,15 @@ \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/spu/HardSpuMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/spu/HardSpuMapper.xml index 71329ef84..84ba0a06d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/spu/HardSpuMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/spu/HardSpuMapper.xml @@ -80,6 +80,12 @@ and a.spu_category_id = #{dto.spuCategoryId} + + + and a.spu_category_id is not null + and a.ks_status = 5 + + and a.status = #{dto.status} diff --git a/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java b/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java index ade86a1a9..b00de7aac 100644 --- a/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java +++ b/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java @@ -61,4 +61,9 @@ public class HardTakeFoodBroadcastMsg extends MqttHardBaseMsg { */ private String hourType; + /** + * 是否完成 + */ + private String isDone; + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java index b1feb03d2..0c65679f4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java @@ -20,6 +20,13 @@ public interface RemoterThirdKsService { @PostMapping("/third-ks/sku-submit") R skuSubmit(@RequestBody KsSkuSubmitDto dto); + /** + * 常规SKU修改 + */ + @NoToken + @PostMapping("/third-ks/sku-edit") + R skuEdit(@RequestBody KsSkuEditDto dto, @RequestParam String ks_sku_id); + /** * 集合SKU提交审核(未公开) */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdKeyTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdKeyTypeEnum.java new file mode 100644 index 000000000..a58fbcbc6 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdKeyTypeEnum.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.thirdparty.constant; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayApiBizTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方key类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdKeyTypeEnum { + + LB("10", "宁波银行"), + ; + + private final String type; + private final String description; + + public static ThirdKeyTypeEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java new file mode 100644 index 000000000..d7b2aa7bf --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方统一支付api类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdPayApiBizTypeEnum { + + PAY("10", "支付"), + REFUND("20", "退款"), + ; + + private final String type; + private final String description; + + public static ThirdPayApiBizTypeEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPaySoureBizTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPaySoureBizTypeEnum.java new file mode 100644 index 000000000..e01daa92c --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPaySoureBizTypeEnum.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方统一支付来源类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdPaySoureBizTypeEnum { + + LB("10", "宁波银行"), + ; + + private final String type; + private final String description; + + public static ThirdPaySoureBizTypeEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java new file mode 100644 index 000000000..ea1440ecf --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 支付状态返回枚举 + */ +@AllArgsConstructor +@Getter +public enum ThirdPayVoStatusEnum { + + SUCCESS(200, "成功"), + SIGN_ERROR(400, "签名验证失败"), + PARAMS_ERROR(500, "参数错误"), + USER_EXIST(501, "用户不存在"), + ORDER_EXIST(502, "订单不存在"), + BALANCE_NOT_ENOUGH(505, "用户余额不足"), + ; + + private final int type; + private final String description; + + public static ThirdPayVoStatusEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java index 875007a74..fe9d20618 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java @@ -2,14 +2,12 @@ package com.bsd.pjcloud.thirdparty.dto.ks; import lombok.Data; +import java.util.List; +import java.util.Map; + @Data public class KsSkuEditDto { - /** - * 该字段为超级收银员平台的sku_id,提交SKU审核后由系统返回,作为资源ID传递,是请求地址中的一部分,不需要提交到form表单 - */ - private String ks_sku_id; - /** * 该字段为使用方系统sku_name,建议使用品牌名+商品名,如统一冰红茶 */ @@ -23,7 +21,7 @@ public class KsSkuEditDto { /** * SKU图片仅在SKU因图片原因审核不通过的情况下支持修改,一旦SKU被审核通过,SKU图片将不再允许修改,如有相关需求,请重新申请SKU */ - private String img_urls; + private List img_urls; /** * 审核结果回调地址 @@ -33,5 +31,5 @@ public class KsSkuEditDto { /** * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g */ - private String specs; + private Map specs; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java index 840194c15..600c2f8cc 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java @@ -32,7 +32,7 @@ public class KsSkuSubmitCallbackDto { * 2:审核通过 * 3:审核不通过 */ - private Integer code; + private String code; private String desc; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java index 84ff297fa..4d7f630b9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java @@ -2,6 +2,9 @@ package com.bsd.pjcloud.thirdparty.dto.ks; import lombok.Data; +import java.util.List; +import java.util.Map; + @Data public class KsSkuSubmitDto { /** @@ -22,7 +25,7 @@ public class KsSkuSubmitDto { /** * 该字段为SKU不同方位视图,所需拍摄的图片数量及角度请参考商品建模文档,参数具体值为图片资源地址,如资源为使用方所属,请确保外部可以访问,请注意图片尺寸及质量,综合质量不佳可能会导致审核不通过。图片尺寸不小于1920*1080,压缩质量不低于70%,长宽比介于16:9同1:1之间。 */ - private String img_urls; + private List img_urls; /** * 审核结果回调地址 @@ -32,6 +35,6 @@ public class KsSkuSubmitDto { /** * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g */ - private String specs; + private Map specs; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java new file mode 100644 index 000000000..0aeb82cb9 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.thirdparty.dto.lb; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Data +public class LbH5LoginDto { + + /** + * 用户手机号 + */ + @NotEmpty(message = "手机号不能为空") + private String phone; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java new file mode 100644 index 000000000..ce233bd56 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; +import lombok.Data; + +@Data +public class PayDto { + + /** + * 用户id + */ + private Long userId; + + /** + * 第三方唯一id + */ + private String thirdOrderId; + + /** + * 第三方统一支付类型 + */ + private ThirdPaySoureBizTypeEnum bizType; + + /** + * 扣款金额(分) + */ + private Integer money; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java new file mode 100644 index 000000000..477a35e24 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import lombok.Data; + +@Data +public class PayGetWalletInfoDto { + + /** + * sm4加密后的手机号 + */ + private String signPhone; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java new file mode 100644 index 000000000..f0e03b7d7 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import lombok.Data; + +@Data +public class RefundDto { + + /** + * 用户id + */ + private Long userId; + + /** + * 平台唯一订单号 + */ + private String platformOrderId; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayLogDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayLogDto.java new file mode 100644 index 000000000..ea1982343 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayLogDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import lombok.Data; + +import java.time.LocalDate; + +@Data +public class ThirdPayLogDto extends ThirdPayLogEntity { + + private LocalDate[] createTimeList; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdKeyManageEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdKeyManageEntity.java new file mode 100644 index 000000000..8f4c87890 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdKeyManageEntity.java @@ -0,0 +1,115 @@ +package com.bsd.pjcloud.thirdparty.entity; + +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; + +/** + * 第三方密钥管理 + * + * @author dzc + * @date 2025-04-30 15:18:13 + */ +@Data +@TenantTable +@TableName("third_key_manage") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "第三方密钥管理") +public class ThirdKeyManageEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 第三方名字 + */ + @Schema(description="第三方名字") + private String name; + + /** + * 第三方类型id(常量) + */ + @Schema(description="第三方类型id(常量)") + private String bizType; + + /** + * appKey + */ + @Schema(description="appKey") + private String appKey; + + /** + * appSecret + */ + @Schema(description="appSecret") + private String appSecret; + + /** + * 字段加密key + */ + @Schema(description="字段加密key") + private String fieldKey; + + /** + * 状态 + */ + @Schema(description="状态") + private String status; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 创建人 + */ + @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; + + /** + * tenantId + */ + @Schema(description="tenantId") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/api/ThirdPayLogEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/api/ThirdPayLogEntity.java new file mode 100644 index 000000000..b9f0635d5 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/api/ThirdPayLogEntity.java @@ -0,0 +1,120 @@ +package com.bsd.pjcloud.thirdparty.entity.api; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import com.bsd.pjcloud.common.core.util.TenantTable; +import java.time.LocalDateTime; + +/** + * 第三方支付日志 + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +@TenantTable +@TableName("third_pay_log") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "第三方支付日志") +public class ThirdPayLogEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 支付发起方类型id + */ + @Schema(description="支付发起方类型id") + private String paySourceType; + + /** + * 支付类型 + */ + @Schema(description="支付类型") + private String bizType; + + /** + * 支付类型id + */ + @Schema(description="支付类型id") + private String bizId; + + /** + * api-url + */ + @Schema(description="api-url") + private String apiUrl; + + /** + * res + */ + @Schema(description="res") + private String res; + + /** + * req + */ + @Schema(description="req") + private String req; + + /** + * 调用错误 + */ + @Schema(description="调用错误") + private String error; + + /** + * 耗时(毫秒) + */ + @Schema(description="耗时(毫秒)") + private String timeConsuming; + + /** + * 创建人 + */ + @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; + + /** + * tenantId + */ + @Schema(description="tenantId") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java index 9547e56f9..d49569d9e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java @@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.vo.ks; import lombok.Data; @Data -public class KsSkuDeleteVo { +public class KsSkuDeleteVo extends KsBaseInnerVo { /** * 该sku_id为使用方sku_id diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java index 131ea763f..54c2263bc 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java @@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.vo.ks; import lombok.Data; @Data -public class KsSkuEditVo { +public class KsSkuEditVo extends KsBaseInnerVo { /** * 该sku_id为使用方sku_id diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java index 6f417657f..1ae1db3cb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java @@ -3,24 +3,27 @@ package com.bsd.pjcloud.thirdparty.vo.ks; import lombok.Data; @Data -public class KsSkuResultVo { +public class KsSkuResultVo extends KsBaseInnerVo { /** * 该字段返回结果为字典值,不同code代表不同结果 - *

* 0:待审核 - *

* 1:审核中 - *

* 2:审核通过 - *

* 3:审核不通过 */ - private String result; + private Result result; /** * 审核不通过时该字段才有值 */ private String comments; + @Data + public static class Result { + private String code; + private String desc; + } + + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java new file mode 100644 index 000000000..6beb1955a --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.thirdparty.vo.lb; + +import lombok.Data; + +@Data +public class LbH5LoginVo { + + private Integer code; + + private String msg; + + private String h5Url; + + public boolean isSuccess() { + return code == 200; + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayBaseVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayBaseVo.java new file mode 100644 index 000000000..22ba74d29 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayBaseVo.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; +import lombok.Data; + +@Data +public class PayBaseVo { + + private Integer code; + + private String message; + + private T data; + + public void set(ThirdPayVoStatusEnum type) { + code = type.getType(); + message = type.getDescription(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java new file mode 100644 index 000000000..07e8d1bd6 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +@Data +public class PayGetWalletInfoVo { + + /** + * sm4加密后的手机号 + */ + private String signPhone; + + /** + * 用户真实姓名 + */ + private String name; + + /** + * 用户余额(分) + */ + private int balance; + + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java new file mode 100644 index 000000000..285bd327d --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java @@ -0,0 +1,25 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class PayVo { + + /** + * 平台唯一订单号 + */ + private String platformOrderId; + + /** + * 第三方唯一订单号 + */ + private String thirdOrderId; + + /** + * 平台支付时间 + */ + private LocalDateTime payTime; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java new file mode 100644 index 000000000..6cad81f66 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +@Data +public class PayWalletInfoVo { + + /** + * sm4加密后的手机号 + */ + private String signPhone; + + /** + * 用户真实姓名 + */ + private String name; + + /** + * 用户余额(分) + */ + private Integer balance; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java new file mode 100644 index 000000000..df4074534 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class RefundVo { + + /** + * 平台唯一订单号 + */ + private String platformOrderId; + + /** + * 平台唯一退款单号 + */ + private String platformRefundId; + + /** + * 第三方唯一订单号 + */ + private String thirdOrderId; + + /** + * 退款时间 + */ + private LocalDateTime refundTime; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml index 34dfa75ed..bfa98f443 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml @@ -115,6 +115,12 @@ jjwt 0.9.1 + + + org.bouncycastle + bcprov-jdk15to18 + 1.66 + javax.xml.bind jaxb-api diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java new file mode 100644 index 000000000..7e445b4fc --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.thirdparty.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "lb") +@Data +public class LbConfig { + + /** + * 请求基础路径 + */ + private String baseUrl; + + private String appId; + + private String appSecret; + + /** + * 企业编号 + */ + private String companyNumber; + + /** + * 国密sm4密钥 + */ + private String sm4Key; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdKeyManageController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdKeyManageController.java new file mode 100644 index 000000000..c12a39071 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdKeyManageController.java @@ -0,0 +1,80 @@ +package com.bsd.pjcloud.thirdparty.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +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.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +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("/third-key-manage") +@Tag(description = "third-key-manage", name = "第三方密钥管理管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdKeyManageController { + + private final ThirdKeyManageService thirdKeyManageService; + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_view')") + public R getThirdKeyManagePage(@ParameterObject Page page, @ParameterObject ThirdKeyManageEntity dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(ObjectUtil.isNotEmpty(dto.getName()), ThirdKeyManageEntity::getName, dto.getName()) + .orderByDesc(ThirdKeyManageEntity::getCreateTime) + .orderByDesc(ThirdKeyManageEntity::getId); + return R.ok(thirdKeyManageService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(thirdKeyManageService.getById(id)); + } + + @Operation(summary = "新增第三方密钥管理", description = "新增第三方密钥管理") + @SysLog("新增第三方密钥管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_add')") + public R save(@RequestBody ThirdKeyManageEntity dto) { + return R.ok(thirdKeyManageService.create(dto)); + } + + @Operation(summary = "修改第三方密钥管理", description = "修改第三方密钥管理") + @SysLog("修改第三方密钥管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_edit')") + public R updateById(@RequestBody ThirdKeyManageEntity dto) { + return R.ok(thirdKeyManageService.edit(dto)); + } + + @Operation(summary = "通过id删除第三方密钥管理", description = "通过id删除第三方密钥管理") + @SysLog("通过id删除第三方密钥管理") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(thirdKeyManageService.removeBatchByIds(CollUtil.toList(ids))); + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java index 031156c6f..c34239c37 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java @@ -49,10 +49,10 @@ public class ThirdKsApiController { } @Inner - @Operation(summary = "SKU审核结果主动获取") + @Operation(summary = "常规SKU修改") @PostMapping("/sku-edit") - public R skuEdit(@RequestBody KsSkuEditDto dto) { - return R.ok(thirdKsApiService.skuEdit(dto)); + public R skuEdit(@RequestBody KsSkuEditDto dto, @RequestParam String ks_sku_id) { + return R.ok(thirdKsApiService.skuEdit(dto, ks_sku_id)); } @Inner diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java new file mode 100644 index 000000000..5ce18cd33 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.thirdparty.controller.lb; + +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.service.ThirdLbApiService; +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.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/third-lb") +@Tag(description = "third-lb", name = "宁波银行对接") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdLbApiController { + + private final ThirdLbApiService thirdLbApiService; + + @Inner(value = false) + @Operation(summary = "美好生活登录", description = "美好生活登录") + @PostMapping("/h5-login") + public R H5Login(@Valid @RequestBody LbH5LoginDto dto) { + return R.ok(thirdLbApiService.h5Login(dto)); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java new file mode 100644 index 000000000..70d4a1902 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java @@ -0,0 +1,46 @@ +package com.bsd.pjcloud.thirdparty.controller.pay; + + +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; +import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayWalletInfoVo; +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.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * 第三方支付日志 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/third-pay-api") +@Tag(description = "third-pay-api", name = "地上方支付") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdPayApiController { + + private final ThirdPayApiService thirdPayApiService; + + @Inner(value = false) + @Operation(summary = "通过手机号查询用户钱包信息", description = "通过手机号查询用户钱包信息") + @PostMapping("/user-wallet") + public PayBaseVo getWalletInfo(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.getWalletInfo(body, headers); + } + + + + + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayLogController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayLogController.java new file mode 100644 index 000000000..74c38aa30 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayLogController.java @@ -0,0 +1,95 @@ +package com.bsd.pjcloud.thirdparty.controller.pay; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +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.thirdparty.dto.pay.ThirdPayLogDto; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; +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("/third-pay-log") +@Tag(description = "third-pay-log", name = "第三方支付日志管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdPayLogController { + + private final ThirdPayLogService thirdPayLogService; + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_view')") + public R getThirdPayLogPage(@ParameterObject Page page, @ParameterObject ThirdPayLogDto dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getPaySourceType()), ThirdPayLogEntity::getPaySourceType, dto.getPaySourceType()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdPayLogEntity::getBizType, dto.getBizType()) + .between( + ObjectUtil.isNotEmpty(dto.getCreateTimeList()), + ThirdPayLogEntity::getCreateTime, + ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[0] : null, + ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[1] : null + ) + .orderByDesc(ThirdPayLogEntity::getCreateTime) + .orderByDesc(ThirdPayLogEntity::getId); + return R.ok(thirdPayLogService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(thirdPayLogService.getById(id)); + } + + @Operation(summary = "新增第三方支付日志", description = "新增第三方支付日志") + @SysLog("新增第三方支付日志") + @PostMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_add')") + public R save(@RequestBody ThirdPayLogEntity thirdPayLog) { + return R.ok(thirdPayLogService.save(thirdPayLog)); + } + + @Operation(summary = "修改第三方支付日志", description = "修改第三方支付日志") + @SysLog("修改第三方支付日志") + @PutMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_edit')") + public R updateById(@RequestBody ThirdPayLogEntity thirdPayLog) { + return R.ok(thirdPayLogService.updateById(thirdPayLog)); + } + + @Operation(summary = "通过id删除第三方支付日志", description = "通过id删除第三方支付日志") + @SysLog("通过id删除第三方支付日志") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(thirdPayLogService.removeBatchByIds(CollUtil.toList(ids))); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_export')") + public List export(ThirdPayLogEntity thirdPayLog, Long[] ids) { + return thirdPayLogService.list(Wrappers.lambdaQuery(thirdPayLog).in(ArrayUtil.isNotEmpty(ids), ThirdPayLogEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdKeyManageMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdKeyManageMapper.java new file mode 100644 index 000000000..7727499e3 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdKeyManageMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.thirdparty.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ThirdKeyManageMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayLogMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayLogMapper.java new file mode 100644 index 000000000..24e85e41d --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayLogMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.thirdparty.mapper.pay; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ThirdPayLogMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java new file mode 100644 index 000000000..25b9ea4df --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; + +import java.util.Map; + +public interface ThirdKeyManageService extends IService { + + /** + * 新增 + */ + Long create(ThirdKeyManageEntity dto); + + /** + * 修改 + */ + Long edit(ThirdKeyManageEntity dto); + + /** + * 获取第三方key配置 + */ + ThirdKeyManageEntity get(ThirdKeyTypeEnum type); + + /** + * 验签并且返回配置 + */ + ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map headers); + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java index f118b2f62..28bd065f4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java @@ -26,9 +26,9 @@ public interface ThirdKsApiService { KsSkuResultVo skuResult(KsSkuResultDto dto); /** - * SKU审核结果主动获取 + * 常规SKU修改 */ - KsSkuEditVo skuEdit(KsSkuEditDto dto); + KsSkuEditVo skuEdit(KsSkuEditDto dto, String ks_sku_id); /** * SKU删除 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java new file mode 100644 index 000000000..0543042bb --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; + +/** + * @author liusiyang_dxm + * @since 2025/4/29 + */ +public interface ThirdLbApiService { + + /** + * 美好生活登录 + */ + LbH5LoginVo h5Login(LbH5LoginDto dto); +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java new file mode 100644 index 000000000..66e027031 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.thirdparty.service; + + +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.vo.pay.*; + +import java.util.Map; + +public interface ThirdPayApiService { + + /** + * 扣款 + */ + PayVo pay(PayDto dto); + + /** + * 退款 + */ + RefundVo refund(RefundDto dto); + + /** + * 根据加密的手机号查询用户钱包信息 + */ + PayBaseVo getWalletInfo(String json, Map headers); +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayLogService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayLogService.java new file mode 100644 index 000000000..80ea9286e --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayLogService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; + +public interface ThirdPayLogService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java new file mode 100644 index 000000000..a018dd209 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java @@ -0,0 +1,127 @@ +package com.bsd.pjcloud.thirdparty.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.mapper.ThirdKeyManageMapper; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 第三方密钥管理 + */ + +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdKeyManageServiceImpl extends ServiceImpl implements ThirdKeyManageService { + + /** + * 新增 + */ + @Override + public Long create(ThirdKeyManageEntity dto) { + if (existBizType(dto)) throw new RuntimeException("第三方key类型不能重复"); + if (existName(dto)) throw new RuntimeException("第三方key名称不能重复"); + baseMapper.insert(dto); + return dto.getId(); + } + + /** + * 修改 + */ + @Override + public Long edit(ThirdKeyManageEntity dto) { + if (existBizType(dto)) throw new RuntimeException("第三方key类型不能重复"); + if (existName(dto)) throw new RuntimeException("第三方key名称不能重复"); + baseMapper.updateById(dto); + return dto.getId(); + } + + /** + * 获取第三方key配置 + */ + @Override + public ThirdKeyManageEntity get(ThirdKeyTypeEnum type) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(ThirdKeyManageEntity::getBizType, type.getType())); + } + + /** + * 验签并且返回配置 + */ + @Override + public ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map headers) { + Map transitionHeader = new LinkedHashMap<>(); + for (Map.Entry entry : headers.entrySet()) { + transitionHeader.put(entry.getKey().toUpperCase(), entry.getValue()); + } + // 验签 + String appKey = transitionHeader.get("APP-KEY"); + String bizType = transitionHeader.get("BIZ-TYPE"); + String timestamp = transitionHeader.get("TIMESTAMP"); + String sign = transitionHeader.get("SIGN"); + if (!ObjectUtil.isAllNotEmpty(appKey, bizType, timestamp, sign)) { + return null; + } + // 判断bizType + ThirdKeyTypeEnum keyType = ThirdKeyTypeEnum.valueOfByType(bizType); + if (ObjectUtil.isEmpty(keyType)) { + return null; + } + // 查询配置 + ThirdKeyManageEntity keyManage = get(keyType); + if (ObjectUtil.isEmpty(keyManage)) { + return null; + } + if (ObjectUtil.notEqual(appKey, keyManage.getAppKey())) { + return null; + } + // 计算签名 + String signStr = String.format("%s%s%s%s%s", keyManage.getAppKey(), keyManage.getAppSecret(), keyManage.getBizType(), timestamp, json); + String successSignMd5 = DigestUtils.md5Hex(signStr); + if (ObjectUtil.notEqual(successSignMd5.toLowerCase(), sign.toLowerCase())) { + return null; + } + return keyManage; + } + + /** + * 第三方类型不能重复 + */ + private boolean existBizType(ThirdKeyManageEntity dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdKeyManageEntity::getBizType, dto.getBizType()) + .ne(ObjectUtil.isNotEmpty(dto.getId()), ThirdKeyManageEntity::getId, dto.getId()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count >= 1; + } + return count > 0; + } + + /** + * 名字不能重复 + */ + private boolean existName(ThirdKeyManageEntity dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getName()), ThirdKeyManageEntity::getName, dto.getName()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdKeyManageEntity::getBizType, dto.getBizType()) + .ne(ObjectUtil.isNotEmpty(dto.getId()), ThirdKeyManageEntity::getId, dto.getId()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count >= 1; + } + return count > 0; + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java index 4490dde4f..0f62732fb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService; +import com.bsd.pjcloud.hard.api.feign.RemoteHardSpuController; import com.bsd.pjcloud.thirdparty.config.KsDiscernConfig; import com.bsd.pjcloud.thirdparty.dto.ks.*; import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity; @@ -14,7 +15,6 @@ import com.bsd.pjcloud.thirdparty.utils.ks.tool.KsRetailSignUtils; import com.bsd.pjcloud.thirdparty.vo.ks.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpPost; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -35,19 +35,37 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { private final ThirdDoorLogService doorLogService; private final RemoteHardDoorService remoteHardDoorService; + private final RemoteHardSpuController remoteHardSpuController; /** * 常规SKU提交审核 */ @Override public KsSkuSubmitVo skuSubmit(KsSkuSubmitDto dto) { + dto.setNotify_url(ksDiscernConfig.getCallbackBaseUrl() + ksDiscernConfig.getCallbackSkuUrl()); long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_SUBMIT.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_SUBMIT.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setParams(BeanUtil.beanToMap(dto)) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + String body = JSONUtil.toJsonStr(dto); + api.setBody(body); + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|body|%s|", res, api, body); + log.error(errorLog); + KsSkuSubmitVo errorVo = new KsSkuSubmitVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuSubmit|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -89,11 +107,25 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { public KsSkuResultVo skuResult(KsSkuResultDto dto) { long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_RESULT.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_RESULT.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setpath(dto.getKs_sku_id()) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|", res, api); + log.error(errorLog); + KsSkuResultVo errorVo = new KsSkuResultVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuResult|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -106,17 +138,35 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { } /** - * SKU审核结果主动获取 + * 常规SKU修改 */ @Override - public KsSkuEditVo skuEdit(KsSkuEditDto dto) { + public KsSkuEditVo skuEdit(KsSkuEditDto dto, String ks_sku_id) { + dto.setNotify_url(ksDiscernConfig.getCallbackBaseUrl() + ksDiscernConfig.getCallbackSkuUrl()); + String body = JSONUtil.toJsonStr(dto); long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_EDIT.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_EDIT.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setpath(ks_sku_id) + .setBody(body) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + api.setBody(body); + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|", res, api); + log.error(errorLog); + KsSkuEditVo errorVo = new KsSkuEditVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuEdit|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -135,11 +185,25 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { public KsSkuDeleteVo skuDelete(KsSkuDeleteDto dto) { long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_DELETE.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_DELETE.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setpath(dto.getKs_sku_id()) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|", res, api); + log.error(errorLog); + KsSkuDeleteVo errorVo = new KsSkuDeleteVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuDelete|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -318,7 +382,7 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(json); try { - + remoteHardSpuController.skuCheckCallback(dto); } catch (Exception e) { String error = String.format("|%s||callbackSKu|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java new file mode 100644 index 000000000..a1342ee4b --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java @@ -0,0 +1,71 @@ +package com.bsd.pjcloud.thirdparty.service.impl.lb; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.thirdparty.config.LbConfig; +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.service.ThirdLbApiService; +import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi; +import com.bsd.pjcloud.thirdparty.utils.lb.api.LbApi; +import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdLbApiServiceImpl implements ThirdLbApiService { + + private static final String TAG = "宁波银行api"; + + private final LbConfig lbConfig; + + @Override + public LbH5LoginVo h5Login(LbH5LoginDto dto) { + LbH5LoginVo ksBaseVo = new LbH5LoginVo(); + String phone = dto.getPhone(); + String signPhone = LbRetailSignUtils.sm4Encrypt(phone, lbConfig.getSm4Key()); + long timeMillis = System.currentTimeMillis() / 1000; + String signature = apiCountersign(dto.getPhone(), timeMillis); + Map queryMap = new HashMap<>(); + // queryMap.put("companyNumber", lbConfig.getCompanyNumber()); + queryMap.put("appId", lbConfig.getAppId()); + queryMap.put("phone", signPhone); + queryMap.put("timestamp", String.valueOf(timeMillis)); + queryMap.put("signature", signature); + // 发送请求 + DoorApi.Api h5Login = LbApi.H5_LOGIN; + try { + String res = HttpRequest.post(lbConfig.getBaseUrl() + h5Login.getUrl()).contentType(h5Login.getContentType()).body(JSONUtil.toJsonStr(queryMap)).execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + ksBaseVo = JSONUtil.toBean(res, LbH5LoginVo.class); + } catch (Exception e) { + String error = String.format("|%s||h5Login|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); + log.error(error); + } + return ksBaseVo; + } + + + // 加签 + public String apiCountersign(String phone, Long timestamp) { + // String str = "companyNumber=%s&appId=%s&phone=%s×tamp=%s&secret=%s"; + // str = String.format(str, lbConfig.getCompanyNumber(), lbConfig.getAppId(), phone, timestamp, lbConfig.getAppSecret()); + String str = "phone=%s&appKey=%s×tamp=%s&secret=%s"; + str = String.format(str, phone, lbConfig.getAppId(), timestamp, lbConfig.getAppSecret()); + // 使用 SHA-256 进行哈希计算,并返回十六进制字符串。 + String sha256 = DigestUtils.sha256Hex(str); + return sha256; + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java new file mode 100644 index 000000000..9839c3d6f --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java @@ -0,0 +1,125 @@ +package com.bsd.pjcloud.thirdparty.service.impl.pay; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayApiBizTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; +import com.bsd.pjcloud.thirdparty.vo.pay.*; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Arrays; +import java.util.Map; + +/** + * 第三方支付 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdPayApiServiceImpl implements ThirdPayApiService { + + private final String TAG = "第三方支付"; + + private final ThirdKeyManageService keyManageService; + private final ThirdPayLogService payLogService; + + private final RemoteWalletService remoteWalletService; + + /** + * 扣款 + */ + @Override + public PayVo pay(PayDto dto) { + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/pay").bizType(ThirdPayApiBizTypeEnum.PAY.getType()).req(JSONUtil.toJsonStr(dto)).build(); + PayVo vo = new PayVo(); + try { + + } catch (Exception e) { + String error = String.format("|%s||pay|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); + log.error(error); + logObj.setError(error); + } finally { + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + } + return vo; + } + + /** + * 退款 + */ + @Override + public RefundVo refund(RefundDto dto) { + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/refund").bizType(ThirdPayApiBizTypeEnum.REFUND.getType()).req(JSONUtil.toJsonStr(dto)).build(); + RefundVo vo = new RefundVo(); + try { + + } catch (Exception e) { + String error = String.format("|%s||refund|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); + log.error(error); + logObj.setError(error); + } finally { + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + } + return vo; + } + + /** + * 根据加密的手机号查询用户钱包信息 + */ + @Override + public PayBaseVo getWalletInfo(String json, Map headers) { + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + return baseVo; + } + PayGetWalletInfoDto dto = JSONUtil.toBean(json, PayGetWalletInfoDto.class); + if (ObjectUtil.isEmpty(dto)) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + return baseVo; + } + // 手机号解密 + String phone = LbRetailSignUtils.sm4Decrypt(dto.getSignPhone(), keySetting.getFieldKey()); + if (ObjectUtil.isEmpty(phone)) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + baseVo.setMessage("手机号解迷失败"); + return baseVo; + } + WalletManageVo userWallet = remoteWalletService.getWalletByUserPhone(phone, WalletTypeEnum.EAT).getData(); + if (ObjectUtil.isEmpty(userWallet)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + return baseVo; + } + PayGetWalletInfoVo result = new PayGetWalletInfoVo(); + result.setSignPhone(dto.getSignPhone()); + result.setBalance(userWallet.getBalance()); + result.setName(userWallet.getUsername()); + // 返回成功的参数 + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + baseVo.setData(result); + return baseVo; + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayLogServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayLogServiceImpl.java new file mode 100644 index 000000000..30ad6a876 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayLogServiceImpl.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.thirdparty.service.impl.pay; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.mapper.pay.ThirdPayLogMapper; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 第三方支付日志 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdPayLogServiceImpl extends ServiceImpl implements ThirdPayLogService { + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java index c53b2192f..73febe7b9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.thirdparty.utils.ks.api; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.http.HttpRequest; @@ -35,13 +36,13 @@ public class KsApi { public static final KsApi.Api SKU_SUBMIT_COLLECTION = KsApi.Api.builder().url("/openapi/sc/v1/sku/collection").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build(); // SKU审核结果主动获取 - public static final KsApi.Api SKU_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + public static final KsApi.Api SKU_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpGet.METHOD_NAME).contentType("application/json").build(); - // SKU识别结果回调通知 - public static final KsApi.Api SKU_EDIT = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); + // 常规SKU修改 + public static final KsApi.Api SKU_EDIT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); // SKU审核结果回调通知 - public static final KsApi.Api SKU_SUBMIT_CALLBACK = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT_CALLBACK).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); + public static final KsApi.Api SKU_SUBMIT_CALLBACK = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT_CALLBACK).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); // SKU删除 public static final KsApi.Api SKU_DELETE = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpDelete.METHOD_NAME).contentType("application/json").build(); @@ -75,6 +76,8 @@ public class KsApi { private Map params = new TreeMap<>(); + private List path; + private String body; private String method; @@ -91,7 +94,6 @@ public class KsApi { private String host = ""; - private String requestId; public KsApi.Api setBaseUrl(String baseUrl) { @@ -119,14 +121,17 @@ public class KsApi { return this; } + public Api setpath(Object... path) { + this.url = String.format(this.url, path); + this.path = ListUtil.of(path); + return this; + } + public KsApi.Api setBody(String body) { this.body = body; return this; } - /** - * 获取当前时间戳 - */ public Long getXRequestDate() { return System.currentTimeMillis(); } @@ -153,6 +158,7 @@ public class KsApi { // 计算签名 Long currentTime = getXRequestDate(); String queryString = getQueryString(); + if (ObjectUtil.isEmpty(queryString)) queryString = ""; String auth = KsRetailSignUtils.getSignAuth(getHost(), getUrl(), contentType, getMethod(), currentTime, getAccessKey(), getSecretKey(), getBody(), queryString); String requestId = getXRequestDate() + RandomUtil.randomString(19); setRequestId(requestId); @@ -181,7 +187,7 @@ public class KsApi { } else if (ObjectUtil.equals(method, HttpPatch.METHOD_NAME)) { return HttpRequest.patch(fullPatch).header(getHeader()).body(getBody()); } else if (ObjectUtil.equals(method, HttpDelete.METHOD_NAME)) { - return HttpRequest.delete(fullPatch).header(getHeader()).body(getBody()); + return HttpRequest.delete(fullPatch).header(getHeader()); } else { return null; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java new file mode 100644 index 000000000..6f006dd08 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.thirdparty.utils.lb.api; + +import com.bsd.pjcloud.thirdparty.constant.door.ThirdDoorApiTypeEnum; +import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.UtilityClass; +import org.apache.http.client.methods.HttpPost; + + +@UtilityClass +public class LbApi { + + // 美好生活登录(直连模式) + public static final DoorApi.Api H5_LOGIN = DoorApi.Api.builder().url("/mall/xhr/authLogin/thirdApp").bizType(ThirdDoorApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + + // 美好生活登录(分行中转模式) + public static final DoorApi.Api H5_LOGIN_OPEN = DoorApi.Api.builder().url("/mall/xhr/authLogin/thirdAppOpen").bizType(ThirdDoorApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class Api { + private String url; + + private String method; + + private String contentType; + + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/tool/LbRetailSignUtils.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/tool/LbRetailSignUtils.java new file mode 100644 index 000000000..2a3b65e13 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/tool/LbRetailSignUtils.java @@ -0,0 +1,56 @@ +package com.bsd.pjcloud.thirdparty.utils.lb.tool; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.util.Base64; + +@Slf4j +@UtilityClass +public class LbRetailSignUtils { + + static { + // 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java标准库中,由BouncyCastleProvider实现) + Security.addProvider(new BouncyCastleProvider()); + } + + public static String sm4Encrypt(String plainString, String key) { + String cipherString = null; + try { + String algorithm = "SM4"; + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm); + Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); + byte[] cipherBytes = cipher.doFinal(plainString.getBytes(StandardCharsets.UTF_8)); + cipherString = Base64.getEncoder().encodeToString(cipherBytes); + } catch (Exception e) { + e.printStackTrace(); + } + return cipherString; + } + + + /** + * SM4,商业密码(Shang Mi4)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布,相关标准为“GM/T 0002-2012《SM4分组密码算法》”。 + */ + public static String sm4Decrypt(String cipherString, String key) { + String plainString = null; + try { + String algorithm = "SM4"; + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm); + Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + byte[] cipherBytes = cipher.doFinal(Base64.getDecoder().decode(cipherString)); + plainString = new String(cipherBytes); + } catch (Exception e) { + e.printStackTrace(); + } + return plainString; + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index 5d9cd0739..28a2f1346 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -44,31 +44,31 @@ oauth2: # 正元智慧 # https://gwyc.zj.gov.cn/API/%E7%9C%81%E5%B9%B3%E5%8F%B0API%E5%AF%B9%E6%8E%A5%E6%8E%A5%E5%8F%A3.html zy: - # 测试1 - # base-url: http://60.191.37.212:18079 - # app-id: 689C8D6F5059A6F85B8BE45A49001ACB - # app-secret: BD21DA0DEB8F0FC43246B0BD2FCAE6FF +# 测试1 +# base-url: http://60.191.37.212:18079 +# app-id: 689C8D6F5059A6F85B8BE45A49001ACB +# app-secret: BD21DA0DEB8F0FC43246B0BD2FCAE6FF - # 测试2 - # base-url: http://60.191.37.212:18079 - # app-id: FC455B0A788E334AC08FB3E1D8385C75 - # app-secret: E9131D0BCC9054808675DA1E2E199023 +# 测试2 +# base-url: http://60.191.37.212:18079 +# app-id: FC455B0A788E334AC08FB3E1D8385C75 +# app-secret: E9131D0BCC9054808675DA1E2E199023 - # 正式 - # base-url: https://gwycport.zj.gov.cn - # app-id: 0BBF0D9A7F1B4BD5280E59197E259AC6 - # app-secret: 434752786ACBB37214F6617CC37AD0E9 +# 正式 +# base-url: https://gwycport.zj.gov.cn +# app-id: 0BBF0D9A7F1B4BD5280E59197E259AC6 +# app-secret: 434752786ACBB37214F6617CC37AD0E9 - # self-base-url: http://60.191.37.212:18079 - # self-app-id: xA5jF2vX4zO5mQ8tR9yE7rC7iI0fK0kI - # self-app-secret: kE3hH5gF7zN0nH1yI5yX3vP0oP1hU0jE - # 失效时间单位秒 - # self-expires-in: 7200 - # token key - # self_token_key: zy_token - # token - # self_token_secret: eV3dT0oD7iX8rK4eC3jS6fU8cU5cS6mJ +# self-base-url: http://60.191.37.212:18079 +# self-app-id: xA5jF2vX4zO5mQ8tR9yE7rC7iI0fK0kI +# self-app-secret: kE3hH5gF7zN0nH1yI5yX3vP0oP1hU0jE +# 失效时间单位秒 +# self-expires-in: 7200 +# token key +# self_token_key: zy_token +# token +# self_token_secret: eV3dT0oD7iX8rK4eC3jS6fU8cU5cS6mJ # 智能柜 # door: @@ -88,7 +88,13 @@ zy: # callback-base-url: http://h1yzkslmyx.ny.takin.cc # callback-recognition-url: /third/third-ks/callback/recognition # callback-sku-url: /third/third-ks/callback/sku - +lb: + # base-url: https://elss-sit.nbcb.com.cn + base-url: https://elss-sit.nbcb.com.cn/h5/thirdApp + app-id: 7da62b1a9ade473c917f573c5748081e + app-secret: 8ffl6b+OKTmdVAt9Qo+2F/HQQMdt/d8GFia0zUOt9l= + company-number: 202504673472 + sm4-key: 567157e8aQs2tF5X sms: @@ -103,10 +109,10 @@ sms: templates: 20657: # 验证码模板 content: "您好,您的验证码是{code},有效时间{date}分钟,请勿转发!" - params: ["code", "date"] + params: [ "code", "date" ] 20658: content: "您的访客预约申请已通过,请通过地址{url}查看详情!" - params: ["url"] + params: [ "url" ] settings: default-ext-code: "123" timeout-seconds: 300 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps new file mode 100644 index 000000000..07d533bc1 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdKeyManageMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdKeyManageMapper.xml new file mode 100644 index 000000000..2b4769a5c --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdKeyManageMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayLogMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayLogMapper.xml new file mode 100644 index 000000000..f9c546a03 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayLogMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserTransactionEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserTransactionEnum.java new file mode 100644 index 000000000..bb8e31c4a --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserTransactionEnum.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.admin.api.constant; + + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户调岗类型 + */ +@AllArgsConstructor +@Getter +public enum UserTransactionEnum { + + LEAVE("10", "离职"), + RETIRE("20", "退休"), + INNER_TRANSFER("30", "调岗(内部)"), + ; + private final String type; + private final String description; + + public static UserTransactionEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java index c4d9eddc9..96b976f53 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java @@ -29,4 +29,11 @@ public class SysUserFaceDto extends SysUserFaceEntity implements BaseIsIncludeTr private Boolean isInclude; private Boolean isFindCheckUser = false; + + /** + * 用户相关 + */ + private String username; + + private String phone; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java index 79cc2908b..62b9a6c99 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java @@ -3,14 +3,17 @@ package com.bsd.pjcloud.admin.api.entity; 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 lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; + import java.time.LocalDateTime; /** * 人员调动表 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("sys_user_transaction") @@ -19,112 +22,124 @@ import java.time.LocalDateTime; public class SysUserTransactionEntity extends Model { - /** - * 编号 - */ + /** + * 编号 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="编号") + @Schema(description = "编号") private Long id; - /** - * 用户id - */ - @Schema(description="用户id") + /** + * 申请部门用户id + */ + @Schema(description = "申请部门用户id") + private Long applyUserId; + + /** + * 用户id + */ + @Schema(description = "用户id") private Long userId; - /** - * 业务id - */ - @Schema(description="业务id") + /** + * 业务id + */ + @Schema(description = "业务id") private Long bizId; - /** - * 业务类型 - */ - @Schema(description="业务类型") + /** + * 业务类型 + */ + @Schema(description = "业务类型") private String bizType; - /** - * 源部门id - */ - @Schema(description="源部门id") + /** + * 源部门id + */ + @Schema(description = "源部门id") private Long sourceDeptId; - /** - * 目标部门id - */ - @Schema(description="目标部门id") + /** + * 目标部门id + */ + @Schema(description = "目标部门id") private Long targetDeptId; - /** - * 是否离职自动转账 - */ - @Schema(description="是否离职自动转账") + /** + * 是否离职自动转账 + */ + @Schema(description = "是否离职自动转账") private String isWalletTransaction; - /** - * 离职自动转账时间 - */ - @Schema(description="离职自动转账时间") + /** + * 离职自动转账时间 + */ + @Schema(description = "离职自动转账时间") private LocalDateTime walletTransactionTime; - /** - * 流程id - */ - @Schema(description="流程id") + /** + * 流程id + */ + @Schema(description = "流程id") private String processId; - /** - * 审核状体 - */ - @Schema(description="审核状体") + /** + * 审核状体 + */ + @Schema(description = "审核状体") private String processStatus; - /** - * 审核时间 - */ - @Schema(description="审核时间") + /** + * 审核时间 + */ + @Schema(description = "审核时间") private LocalDateTime processTime; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * 备注 + */ + @Schema(description = "备注") + private String remark; + + /** + * 创建人 + */ + @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; - /** - * 删除标记 - */ + /** + * 删除标记 + */ @TableLogic - @TableField(fill = FieldFill.INSERT) - @Schema(description="删除标记") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") private String delFlag; - /** - * 租户ID - */ - @Schema(description="租户ID") + /** + * 租户ID + */ + @Schema(description = "租户ID") private Long tenantId; } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java index 083605aa2..1c3e0ba04 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java @@ -54,6 +54,13 @@ public interface RemoteUserService { @GetMapping("/user/info/{username}") R info(@PathVariable("username") String username); + /** + * 根据手机号查询用户 + */ + @NoToken + @GetMapping("/user/inner/phone") + R getInnerByPhone(@RequestParam String phone); + /** * 通过用户id查询用户、角色信息 */ diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java index ae8c9385e..1cc8c7d0d 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java @@ -26,4 +26,6 @@ public class SysUserTransactionVo extends SysUserTransactionEntity implements Ba private String userAvatar; + private String applyUsername; + } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java index 188b16c79..852f2a37d 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java @@ -121,6 +121,16 @@ public class SysUserController { return R.ok(userService.findUserInfo(user)); } + /** + * 根据手机号查询用户 + */ + @GetMapping("/user/inner/phone") + R getInnerByPhone(@RequestParam String phone) { + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, phone)); + if (user == null) return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, phone)); + return R.ok(userService.findUserInfo(user)); + } + @GetMapping("/get-by-user-id") public R getByUserId(@RequestParam Long userId) { SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUserId, userId)); @@ -361,14 +371,15 @@ public class SysUserController { /** * 根据部门id查询用户列表 + * * @param deptId * @return */ // @Inner @GetMapping("/getUserIdListByDeptId") - public R> getUserIdListByDeptId(@RequestParam("deptId")Long deptId, - @RequestParam(value = "name",required = false) String name) { - return R.ok(userService.listUserIdByDeptId(deptId,name)); + public R> getUserIdListByDeptId(@RequestParam("deptId") Long deptId, + @RequestParam(value = "name", required = false) String name) { + return R.ok(userService.listUserIdByDeptId(deptId, name)); } /** 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 bf00424f4..0bad98b75 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 @@ -11,6 +11,7 @@ import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo; import com.bsd.pjcloud.admin.service.SysUserFaceService; 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; @@ -140,7 +141,9 @@ public class SysUserFaceController { @PostMapping("/page-check-join") public R> appPageCheckJoin(@ParameterObject Page page, @RequestBody SysUserFaceDto dto) { dto.setIsFindCheckUser(true); - return R.ok(sysUserFaceService.pageJoin(page, dto)); + DataScope dataScope = new DataScope(); + dataScope.setScopeDeptName("userDeptId"); + return R.ok(sysUserFaceService.scopePageList(page, dto, dataScope)); } @Operation(summary = "通过id查询", description = "通过id查询") diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java index 1a8a9b1a2..01c2f5085 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java @@ -11,6 +11,10 @@ import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.admin.service.SysUserTransactionService; +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.dto.ProcessNodeRecordAssignUserParamDto; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -36,6 +40,17 @@ public class SysUserTransactionController { private final SysUserTransactionService sysUserTransactionService; + /* ************************************* start callback start ************************************* */ + + @Inner(value = false) + @Operation(summary = "申请调岗审批回调", description = "申请调岗审批回调") + @PostMapping("/apply-callback") + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto, @RequestParam(required = false) Long tenantId) { + sysUserTransactionService.applyCallback(dto, tenantId); + } + + /* ************************************* end callback end ************************************* */ + @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_view')") @@ -49,6 +64,7 @@ public class SysUserTransactionController { @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_view')") public R pageJoin(@ParameterObject Page page, @ParameterObject SysUserTransactionDto dto) { DataScope dataScope = new DataScope(); + dataScope.setScopeDeptName("applyUserDeptId"); return R.ok(sysUserTransactionService.scopePageJoin(page, dto, dataScope)); } @@ -63,16 +79,18 @@ public class SysUserTransactionController { @SysLog("新增人员调动表") @PostMapping @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_add')") - public R save(@RequestBody SysUserTransactionEntity sysUserTransaction) { - return R.ok(sysUserTransactionService.save(sysUserTransaction)); + public R save(@RequestBody SysUserTransactionDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(sysUserTransactionService.create(dto, user)); } @Operation(summary = "修改人员调动表", description = "修改人员调动表") @SysLog("修改人员调动表") @PutMapping @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_edit')") - public R updateById(@RequestBody SysUserTransactionEntity sysUserTransaction) { - return R.ok(sysUserTransactionService.updateById(sysUserTransaction)); + public R updateById(@RequestBody SysUserTransactionDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(sysUserTransactionService.edit(dto, user)); } @Operation(summary = "通过id删除人员调动表", description = "通过id删除人员调动表") @@ -80,7 +98,8 @@ public class SysUserTransactionController { @DeleteMapping @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_del')") public R removeById(@RequestBody Long[] ids) { - return R.ok(sysUserTransactionService.removeBatchByIds(CollUtil.toList(ids))); + sysUserTransactionService.delByIds(CollUtil.toList(ids)); + return R.ok(); } @ResponseExcel diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java index f2b291c52..7bd00e337 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java @@ -14,4 +14,5 @@ public interface SysUserTransactionMapper extends PjcloudBaseMapper scopePageJoin(Page page, @Param("dto") SysUserTransactionDto dto, DataScope dataScope); + SysUserTransactionVo join(@Param("id") Long userTransactionId); } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java index 7d04cd4f4..28988cb2d 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java @@ -3,11 +3,39 @@ package com.bsd.pjcloud.admin.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.SysUserTransactionDto; +import com.bsd.pjcloud.admin.api.dto.UserDTO; +import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.entity.SysUserTransactionEntity; import com.bsd.pjcloud.admin.api.vo.SysUserTransactionVo; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; + +import java.util.ArrayList; public interface SysUserTransactionService extends IService { Page scopePageJoin(Page page, SysUserTransactionDto dto, DataScope dataScope); + + SysUserTransactionVo join(Long userTransactionId); + + /** + * 新增人员调动 + */ + Long create(SysUserTransactionDto dto, PjcloudUser applyUser); + + /** + * 新增人员调动 + */ + Long edit(SysUserTransactionDto dto, PjcloudUser applyUser); + + /** + * 删除人员调动 + */ + void delByIds(ArrayList list); + + /** + * 回调 + */ + void applyCallback(ProcessNodeRecordAssignUserParamDto dto, Long tenantId); } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java index fb504e454..80b0a5fd3 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java @@ -191,6 +191,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl if (ObjectUtil.isEmpty(userRoles)) { return false; } + // 如果是管理员,直接返回false + boolean isAdmin = userRoles.stream().anyMatch(v -> ObjectUtil.equals(v.getRoleCode(), CommonRoleConstant.ROLE_ADMIN)); + if (isAdmin) return false; return userRoles.stream().anyMatch(v -> ObjectUtil.equals(v.getRoleCode(), CommonRoleConstant.DEPT_ADMIN)); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java index c5d9cb264..871d79ade 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java @@ -147,7 +147,32 @@ public class SysUserFaceServiceImpl extends ServiceImpl scopePageList(Page page, SysUserFaceDto dto, DataScope dataScope) { - return baseMapper.scopePageList(page, dto, DataScope.of()); + 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); + } + } + Page list = baseMapper.scopePageList(page, dto, dataScope); + // 审批流程 + if (dto.getIsFindCheckUser()) { + List processInstanceIds = list.getRecords().stream().map(SysUserFaceVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(processInstanceIds)) { + List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); + if (ObjectUtil.isNotEmpty(taskList)) { + Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); + CollectionUtils.convertList(list.getRecords(), v -> { + TaskDto task = taskMap.get(v.getProcessId()); + if (ObjectUtil.isNotEmpty(task)) { + v.setIsCheckUser(true); + } + return v; + }); + } + } + } + return list; } @Override diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index fe8e18795..f16b5250d 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -59,6 +59,7 @@ import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -86,6 +87,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; @@ -198,9 +201,13 @@ public class SysUserServiceImpl extends ServiceImpl impl if (isDeptAdmin) { getSelf().applyFlow(sysUser); } else { - // 创建用户默认钱包 - remoteWalletService.createWallet(sysUser.getUserId()); - remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + // 创建用户默认钱包、保证线程header + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + remoteWalletService.createWallet(sysUser.getUserId()); + remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + }); } return sysUser.getUserId(); @@ -405,8 +412,12 @@ public class SysUserServiceImpl extends ServiceImpl impl } // 创建用户默认钱包 - remoteWalletService.createWallet(userDto.getUserId()); - remoteWalletService.userChange(userDto.getUserId(), Boolean.FALSE); + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + remoteWalletService.createWallet(userDto.getUserId()); + remoteWalletService.userChange(userDto.getUserId(), Boolean.FALSE); + }); return Boolean.TRUE; } @@ -915,11 +926,10 @@ public class SysUserServiceImpl extends ServiceImpl impl } - public List listUserIdByDeptId(Long deptId, String name) { List sysUsers = baseMapper.selectList(Wrappers.lambdaQuery() .eq(SysUser::getDeptId, deptId) - .like(StrUtil.isNotBlank(name),SysUser::getName, name)); + .like(StrUtil.isNotBlank(name), SysUser::getName, name)); return com.bsd.pjcloud.common.core.util.BeanUtils.toBean(sysUsers, SimpleUserListVO.class); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java index d396d1af8..6e35d0b11 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java @@ -1,16 +1,45 @@ package com.bsd.pjcloud.admin.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +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.constant.UserTransactionEnum; import com.bsd.pjcloud.admin.api.dto.SysUserTransactionDto; +import com.bsd.pjcloud.admin.api.dto.UserDTO; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.entity.SysUserTransactionEntity; import com.bsd.pjcloud.admin.api.vo.SysUserTransactionVo; import com.bsd.pjcloud.admin.mapper.SysUserTransactionMapper; +import com.bsd.pjcloud.admin.service.SysDeptService; +import com.bsd.pjcloud.admin.service.SysUserService; import com.bsd.pjcloud.admin.service.SysUserTransactionService; +import com.bsd.pjcloud.admin.utils.flow.FlowUtil; +import com.bsd.pjcloud.admin.utils.flow.dto.UserTransactionFlowDto; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskParamDto; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletThirdZyService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; /** * 人员调动表 @@ -20,8 +49,169 @@ import org.springframework.stereotype.Service; @AllArgsConstructor public class SysUserTransactionServiceImpl extends ServiceImpl implements SysUserTransactionService { + private static final String TAG = "员工申请调岗"; + + private final SysUserService sysUserService; + private final SysDeptService sysDeptService; + + private final RemoteFlowEngineService remoteFlowEngineService; + private final RemoteWalletThirdZyService remoteWalletThirdZyService; + + private final FlowUtil flowUtil; + @Override public Page scopePageJoin(Page page, SysUserTransactionDto dto, DataScope dataScope) { return baseMapper.scopePageJoin(page, dto, dataScope); } + + @Override + public SysUserTransactionVo join(Long userTransactionId) { + return baseMapper.join(userTransactionId); + } + + /** + * 新增人员调动 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long create(SysUserTransactionDto dto, PjcloudUser applyUser) { + dto.setApplyUserId(applyUser.getId()); + if (ObjectUtil.notEqual(dto.getBizType(), UserTransactionEnum.INNER_TRANSFER.getType())) { + dto.setIsWalletTransaction(YesNoEnum.YES.getCode()); + } else { + dto.setIsWalletTransaction(YesNoEnum.NO.getCode()); + } + // 查询调动用户 + SysUser userDetail = sysUserService.getById(dto.getUserId()); + // 如果是离职或者调岗(外地)自动移动到指定部门 + if (ObjectUtil.equals(dto.getBizType(), UserTransactionEnum.LEAVE.getType())) { + Long deptId = null; + try { + String deptIdStr = ParamResolver.getStr("USER_TRANSACTION_LEAVE"); + deptId = Long.valueOf(deptIdStr); + } catch (Exception e) { + throw new RuntimeException("请配置离职部门参数"); + } + if (ObjectUtil.equals(userDetail.getDeptId(), deptId)) { + throw new RuntimeException("用户已在离职人员部门"); + } + dto.setTargetDeptId(deptId); + } + if (ObjectUtil.equals(dto.getBizType(), UserTransactionEnum.RETIRE.getType())) { + Long deptId = null; + try { + String deptIdStr = ParamResolver.getStr("USER_TRANSACTION_TRANSFER"); + deptId = Long.valueOf(deptIdStr); + } catch (Exception e) { + throw new RuntimeException("请配置调岗(外地)部门参数"); + } + if (ObjectUtil.equals(userDetail.getDeptId(), deptId)) { + throw new RuntimeException("用户已在退休人员部门"); + } + dto.setTargetDeptId(deptId); + } + if (ObjectUtil.equals(dto.getBizType(), UserTransactionEnum.INNER_TRANSFER.getType())) { + if (ObjectUtil.isEmpty(ObjectUtil.isEmpty(dto.getTargetDeptId()))) { + throw new RuntimeException("请选择目标部门"); + } + if (ObjectUtil.equals(userDetail.getDeptId(), dto.getTargetDeptId())) { + throw new RuntimeException("调动用户源部门和目标部门不能一致"); + } + } + // 查询发起用户 + SysUser applySysUser = sysUserService.getById(applyUser.getId()); + SysDept applySysDept = sysDeptService.getById(applyUser.getDeptId()); + baseMapper.insert(dto); + // 发起审批 + UserTransactionFlowDto flowDto = new UserTransactionFlowDto(); + flowDto.setApplyDeptName(applySysDept.getName()); + String processId = flowUtil.startFlow("USER_TRANSATION_APPLY", applySysUser, dto.getId(), flowDto); + // 更新审批信息 + SysUserTransactionEntity updateObj = new SysUserTransactionEntity(); + updateObj.setId(dto.getId()); + updateObj.setProcessId(processId); + updateObj.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + baseMapper.updateById(updateObj); + return dto.getId(); + } + + /** + * 新增人员调动 + */ + @Override + public Long edit(SysUserTransactionDto dto, PjcloudUser applyUser) { + SysUserTransactionEntity updateObj = BeanUtil.toBean(dto, SysUserTransactionEntity.class); + if (ObjectUtil.notEqual(TaskCheckStatusEnum.PADDING.getCode(), dto.getProcessStatus())) { + throw new RuntimeException("审批中状态才可以修改"); + } + baseMapper.updateById(updateObj); + return dto.getId(); + } + + /** + * 删除人员调动 + */ + @Override + public void delByIds(ArrayList list) { + if (ObjectUtil.isEmpty(list)) return; + List userList = baseMapper.selectList(new LambdaQueryWrapper() + .in(SysUserTransactionEntity::getId, list) + ); + for (SysUserTransactionEntity v : userList) { + if (ObjectUtil.notEqual(TaskCheckStatusEnum.PADDING.getCode(), v.getProcessStatus())) { + SysUserTransactionVo detail = join(v.getId()); + throw new RuntimeException("调动人<" + detail.getUsername() + ">手机号<" + detail.getUserMobile() + ">,审批中状态才可以修改"); + } + } + // 取消审批 + TaskParamDto dto = new TaskParamDto(); + dto.setProcessInstanceIdList(userList.stream().map(SysUserTransactionEntity::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList()); + remoteFlowEngineService.stopProcessInstance(dto).getData(); + baseMapper.deleteBatchIds(list); + } + + + /** + * 回调 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void applyCallback(ProcessNodeRecordAssignUserParamDto dto, Long tenantId) { + if (!flowUtil.checkCallback(dto)) { + return; + } + if (ObjectUtil.isNotEmpty(tenantId) && ObjectUtil.notEqual(tenantId, 1L)) { + TenantContextHolder.setTenantId(tenantId); + } + String processId = dto.getProcessInstanceId(); + SysUserTransactionEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUserTransactionEntity::getProcessId, processId)); + if (ObjectUtil.isEmpty(detail)) { + return; + } + if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto)); + return; + } + try { + Boolean isConsent = flowUtil.isConsent(dto); + String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + baseMapper.updateById(SysUserTransactionEntity.builder().id(detail.getId()).processTime(LocalDateTime.now()).processStatus(processStatus).build()); + if (isConsent) { + // 修改部门 + SysUser userUpdateObj = new SysUser(); + userUpdateObj.setUserId(detail.getUserId()); + userUpdateObj.setDeptId(detail.getTargetDeptId()); + sysUserService.updateById(userUpdateObj); + // 通知正元 + if (ObjectUtil.equals(detail.getBizType(), UserTransactionEnum.INNER_TRANSFER.getType())) { + // 通知正元 + remoteWalletThirdZyService.syncUserById(detail.getUserId()); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + throw new RuntimeException(e); + } + } } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java index e3c042dc5..020823c89 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java @@ -58,12 +58,12 @@ public class FlowUtil { log.error("|{}|请配置跨单位审批流程ID;userId:|{}|businessId:|{}|", TAG, user.getUserId(), businessId); throw new RuntimeException("请配置跨单位审批流程ID"); } - R detail = flowApiFlowService.getDetail(defaultRole); + R detail = flowApiFlowService.getProcessByBusinessKey(defaultRole); if (Optional.of(detail.getData()).map(Process::getId).isEmpty()) { log.error("|{}|未查询到该审批流程;userId:|{}|businessId:|{}|", TAG, user.getUserId(), businessId); throw new RuntimeException("未查询到该审批流程"); } - ProcessVO processVo = detail.getData(); + Process processVo = detail.getData(); ProcessInstanceParamDto processDto = new ProcessInstanceParamDto(); if (ObjectUtil.isNotEmpty(dto)) { if (ObjectUtil.isNotEmpty(user.getUserId())) { diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserTransactionFlowDto.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserTransactionFlowDto.java new file mode 100644 index 000000000..57da10eab --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserTransactionFlowDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.admin.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + +@Data +public class UserTransactionFlowDto extends FlowBaseDto { +} 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 d9372a10b..455ede800 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 @@ -15,13 +15,19 @@ - select a.user_id, + select a.id, + a.auto_code, + a.user_id, + a.process_id, + a.process_status, a.face_img, a.create_by, a.create_time, + a.update_by, a.update_time, a.del_flag, a.tenant_id, + a.process_time, @@ -29,7 +35,8 @@ and a.user_id = #{pa.userId} - + + and a.process_status = #{pa.processStatus} @@ -37,12 +44,20 @@ u.name as username, u.avatar as userAvatar, - u.phone as userMobile + u.phone as userMobile, + u.dept_id as userDeptId from sys_user_face a - left join sys_user u on u.user_id = a.user_id + left join sys_user u on u.user_id = a.user_id and u.del_flag = '0' + + and u.name LIKE CONCAT('%', #{pa.username}, '%') + + + and u.phone LIKE CONCAT('%', #{pa.phone}, '%') + + order by a.create_time desc , a.id desc + soureD.name as sourceDeptName, targetD.name as targetDeptName, - u.username as username, + u.name as username, u.phone as userMobile, - u.avatar as userAvatar + u.avatar as userAvatar, + applyU.name as applyUsername, + applyU.dept_id as applyUserDeptId from sys_user_transaction a left join sys_dept soureD on soureD.dept_id = a.source_dept_id left join sys_dept targetD on targetD.dept_id = a.target_dept_id left join sys_user u on u.user_id = a.user_id + left join sys_user applyU on applyU.user_id = a.apply_user_id + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java index 4a3570483..d8158c2e2 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java @@ -23,4 +23,9 @@ public class MchManageDto extends MchManageEntity { private String type; private Boolean parentIsNull = true; + + /** + * 分类名 + */ + private String catgoryName; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTopupActionDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTopupActionDto.java new file mode 100644 index 000000000..b63a56124 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTopupActionDto.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.wallet.api.dto; + +import com.bsd.pjcloud.admin.api.vo.base.BaseIsIncludeTreeInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class WalletTopupActionDto implements BaseIsIncludeTreeInterface { + + /** + * 用户id + */ + private Long userId; + + /** + * 不活跃天数 + */ + private Long unactiveMonthsNumber; + + /** + * 部门ids + */ + private List deptIds; + + /** + * 是否包含部门ids + */ + private Boolean isInclude; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCatgoryEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCatgoryEntity.java new file mode 100644 index 000000000..f4017ad56 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCatgoryEntity.java @@ -0,0 +1,94 @@ +package com.bsd.pjcloud.wallet.api.entity.mch; + +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("mch_catgory") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "商户分类") +public class MchCatgoryEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 分类名 + */ + @Schema(description="分类名") + private String name; + + /** + * 分类名类型 + */ + @Schema(description="分类名类型") + private String bizType; + + /** + * 排序 + */ + @Schema(description="排序") + private Integer sort; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 创建人 + */ + @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/mch/MchManageEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java index d522105d8..c9d0b2510 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java @@ -60,6 +60,12 @@ public class MchManageEntity extends Model { @Schema(description = "店铺类型,逗号分隔") private String types; + /** + * 分类id + */ + @Schema(description = "分类id") + private Long catgoryId; + /** * 商户logo图片 */ @@ -118,7 +124,7 @@ public class MchManageEntity extends Model { private Long sort; /** - * 创建人 + * 超市类型 */ @Schema(description = "超市类型") private String supType; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java index 759d5730a..e99f9c11e 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java @@ -32,10 +32,15 @@ public interface RemoteWalletService { @GetMapping("/wallet-manage/get-wallet-by-id") R getWalletById(@RequestParam Long walletId); + @NoToken + @GetMapping("/wallet-manage/get-wallet-by-phone") + R getWalletByUserPhone(@RequestParam String phone, @RequestParam WalletTypeEnum walletTypeCode); + @NoToken @GetMapping("/wallet-manage/get-wallet-by-card-number") R getWalletByCardNumber(@RequestParam String cardNumber); + @NoToken @GetMapping("/wallet-manage/create-wallet") R createWallet(@RequestParam Long userId); diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletThirdZyService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletThirdZyService.java new file mode 100644 index 000000000..e4a5c484b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletThirdZyService.java @@ -0,0 +1,17 @@ +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 org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(contextId = "remoteWalletThirdZyService", value = ServiceNameConstants.WALLET_SERVICE) +public interface RemoteWalletThirdZyService { + + @NoToken + @PostMapping("/mch-third-zy/sync-user") + R syncUserById(@RequestParam Long userId); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java index 1cd54e0c5..96f1e0fd1 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java @@ -27,4 +27,9 @@ public class MchManageVo extends MchManageEntity implements BaseDeptInterface, B private List children; + /** + * 分类名 + */ + private String catgoryName; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index a79583531..b23364a6d 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -3,4 +3,5 @@ com.bsd.pjcloud.wallet.api.feign.RemoteCodeUseService com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargeService com.bsd.pjcloud.wallet.api.feign.RemoteMchService com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService +com.bsd.pjcloud.wallet.api.feign.RemoteWalletThirdZyService com.bsd.pjcloud.wallet.api.feign.RemoteWalletTransactionService \ No newline at end of file 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 0ec0aea09..551e5035f 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 @@ -15,6 +15,7 @@ import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.mapper.WalletManageMapper; @@ -71,6 +72,7 @@ public class WalletManageController { return R.ok(wallet); } + @Inner @GetMapping("/create-wallet") public R getWallet(@RequestParam Long userId) { walletManageService.createWallet(userId); @@ -87,12 +89,18 @@ public class WalletManageController { @Inner @GetMapping("/get-wallet-by-id") - public R getWalletById(@RequestParam Long walletId) { + public R getWalletById(@RequestParam Long walletId) { WalletManageVo wallet = walletManageMapper.join(walletId); if (ObjectUtil.isEmpty(wallet)) return R.failed("用户钱包不存在"); return R.ok(wallet); } + @Inner + @GetMapping("/get-wallet-by-phone") + public R getWalletByUserPhone(@RequestParam String phone, @RequestParam WalletTypeEnum walletTypeCode) { + return R.ok(walletManageService.getWalletByPhone(phone, walletTypeCode)); + } + @Inner @GetMapping("/get-wallet-by-card-number") public R getWalletByCardNumber(@RequestParam String cardNumber) { @@ -195,11 +203,25 @@ public class WalletManageController { @Operation(summary = "钱包记录分页", description = "钱包记录分页") @PostMapping("/page-join-qb") - public R pageJoinQb(@ParameterObject Page page, @RequestBody WalletManageBalanceDto dto) { + public R> pageJoinQb(@ParameterObject Page page, @RequestBody WalletManageBalanceDto dto) { DataScope dataScope = new DataScope(); return R.ok(walletManageService.scopeQbPage(page, dto, dataScope)); } + @Operation(summary = "不活跃用户统计", description = "不活跃用户统计") + @PostMapping("/page-join-active") + public R> pageJoinActive(@ParameterObject Page page, @RequestBody WalletTopupActionDto dto) { + DataScope dataScope = new DataScope(); + return R.ok(walletManageService.pageJoinActive(page, dto, dataScope)); + } + + @Operation(summary = "不活跃用户统计list", description = "不活跃用户统计list") + @PostMapping("/list-list-active") + public R> listActive(@RequestBody WalletTopupActionDto dto) { + DataScope dataScope = new DataScope(); + return R.ok(walletManageService.pageListActive(dto, dataScope)); + } + @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") @PreAuthorize("@pms.hasPermission('wallet_walletManage_view')") 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 df3b21e73..c3bed9151 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 @@ -96,6 +96,7 @@ public class WalletTransactionController { @PostMapping("/page-cz") public R pageCz(@ParameterObject Page page, @RequestBody WalletTransactionDto dto) { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); DataScope dataScope = new DataScope(); return R.ok(walletTransactionService.scopePageList(page, dto, dataScope)); } @@ -172,6 +173,7 @@ public class WalletTransactionController { @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_export')") public void exportCz(HttpServletResponse response, @RequestBody WalletTransactionDto dto) { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); List list = walletTransactionService.scopeList(dto, DataScope.of()); walletTransactionService.exportByTemplate(response, dto, "file/个人充值明细.xlsx", list); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java new file mode 100644 index 000000000..6f00156cb --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java @@ -0,0 +1,116 @@ +package com.bsd.pjcloud.wallet.controller.mch; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +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.wallet.api.entity.mch.MchCatgoryEntity; +import com.bsd.pjcloud.wallet.service.MchCatgoryService; +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("/mch-catgory") +@Tag(description = "mch-catgory", name = "商户分类管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class MchCatgoryController { + + private final MchCatgoryService mchCatgoryService; + + /* ************************************* start 移动端 start ************************************* */ + + @Operation(summary = "app下拉查询", description = "app下拉查询") + @GetMapping("/app/select") + public R appSelect(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType()) + .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName()) + .orderByDesc(MchCatgoryEntity::getSort) + .orderByDesc(MchCatgoryEntity::getCreateTime) + .orderByDesc(MchCatgoryEntity::getId); + return R.ok(mchCatgoryService.list(page, wrapper)); + } + + /* ************************************* end 移动端 end ************************************* */ + + @Operation(summary = "下拉查询(没有权限)", description = "下拉查询(没有权限)") + @GetMapping("/select") + public R select(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType()) + .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName()) + .orderByDesc(MchCatgoryEntity::getSort) + .orderByDesc(MchCatgoryEntity::getCreateTime) + .orderByDesc(MchCatgoryEntity::getId); + return R.ok(mchCatgoryService.page(page, wrapper)); + } + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_view')") + public R getMchCatgoryPage(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType()) + .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName()) + .orderByDesc(MchCatgoryEntity::getSort) + .orderByDesc(MchCatgoryEntity::getCreateTime) + .orderByDesc(MchCatgoryEntity::getId); + return R.ok(mchCatgoryService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(mchCatgoryService.getById(id)); + } + + @Operation(summary = "新增商户分类", description = "新增商户分类") + @SysLog("新增商户分类") + @PostMapping + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_add')") + public R save(@RequestBody MchCatgoryEntity dto) { + return R.ok(mchCatgoryService.create(dto)); + } + + @Operation(summary = "修改商户分类", description = "修改商户分类") + @SysLog("修改商户分类") + @PutMapping + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_edit')") + public R updateById(@RequestBody MchCatgoryEntity dto) { + return R.ok(mchCatgoryService.edit(dto)); + } + + @Operation(summary = "通过id删除商户分类", description = "通过id删除商户分类") + @SysLog("通过id删除商户分类") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(mchCatgoryService.removeBatchByIds(CollUtil.toList(ids))); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_export')") + public List export(MchCatgoryEntity mchCatgory, Long[] ids) { + return mchCatgoryService.list(Wrappers.lambdaQuery(mchCatgory).in(ArrayUtil.isNotEmpty(ids), MchCatgoryEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java index e831541a6..7f7253a22 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; @@ -148,20 +149,23 @@ public class MchManageController { @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('wallet_mchManage_view')") public R> getMchManagePageJoin(@ParameterObject Page page, @ParameterObject MchManageDto dto) { - return R.ok(mchManageService.scopePageList(page, dto)); + DataScope dataScope = null; + return R.ok(mchManageService.scopePageList(page, dto, dataScope)); } @Operation(summary = "分页级联", description = "分页级联") @GetMapping("/cascade-join") @PreAuthorize("@pms.hasPermission('wallet_mchManage_view')") public R> cascadeJoin(@ParameterObject Page page, @ParameterObject MchManageDto dto) { - return R.ok(mchManageService.cascadeJoin(page, dto)); + DataScope dataScope = null; + return R.ok(mchManageService.cascadeJoin(page, dto, dataScope)); } @Operation(summary = "分页不要权限下拉", description = "分页不要权限下拉") @GetMapping("/select") public R getSelect(@ParameterObject Page page, @ParameterObject MchManageDto dto) { - return R.ok(mchManageService.scopePageList(page, dto)); + DataScope dataScope = null; + return R.ok(mchManageService.scopePageList(page, dto, dataScope)); } @Operation(summary = "通过id查询", description = "通过id查询") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java index 60d452b56..5d8260727 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.wallet.controller.third; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.service.WalletThirdZyService; import io.swagger.v3.oas.annotations.Operation; @@ -9,9 +10,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -25,6 +24,18 @@ public class WalletThirdZyController { private final WalletThirdZyService walletThirdZyService; + /* ************************************* start 远程调用 start ************************************* */ + + @Inner + @PostMapping("/sync-user") + @Operation(summary = "同步全部用户") + public R syncUserById(@RequestParam Long userId) { + walletThirdZyService.syncAllUser(userId); + return R.ok(); + } + + /* ************************************* end 远程调用 end ************************************* */ + @GetMapping("/sync-all-mch") @Operation(summary = "同步全部商户") public R syncAllMch() { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java index b8546cfed..a4afa46e0 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java @@ -14,6 +14,7 @@ import com.github.yulichang.query.MPJLambdaQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -25,6 +26,7 @@ public interface MchManageMapper extends PjcloudBaseMapper { .selectAll(MchManageEntity.class) .eqIfExists(MchManageEntity::getVisibleMobile, dto.getVisibleMobile()) .eqIfExists(MchManageEntity::getParentId, dto.getParentId()) + .eqIfExists(MchManageEntity::getCatgoryId, dto.getCatgoryId()) .eq(dto.getParentIsNull(), MchManageEntity::getParentId, -1L) .likeIfExists(MchManageEntity::getName, dto.getName()) .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) @@ -42,43 +44,9 @@ public interface MchManageMapper extends PjcloudBaseMapper { return selectJoinOne(MchManageVo.class, wrapper); } - default List list(MchManageDto dto) { - MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper() - .selectAll(MchManageEntity.class) - .eq(ObjectUtil.isNotEmpty(dto.getIsSyncZy()), MchManageEntity::getIsSyncZy, dto.getIsSyncZy()) - .eq(ObjectUtil.isNotEmpty(dto.getVisibleMobile()), MchManageEntity::getVisibleMobile, dto.getVisibleMobile()) - .eq(ObjectUtil.isNotEmpty(dto.getId()), MchManageEntity::getId, dto.getId()) - .eq(ObjectUtil.isNotEmpty(dto.getParentId()), MchManageEntity::getParentId, dto.getParentId()) - .eq(ObjectUtil.isNotEmpty(dto.getDeptId()), MchManageEntity::getDeptId, dto.getDeptId()) - .likeIfExists(MchManageEntity::getName, dto.getName()) - .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) - .in(ObjectUtil.isNotEmpty(dto.getIds()), MchManageEntity::getId, dto.getIds()) - .orderByDesc(MchManageEntity::getSort) - .orderByDesc(MchManageEntity::getCreateTime) - .orderByDesc(MchManageEntity::getId); - return selectJoinList(MchManageVo.class, wrapper); - } + List scopeList(@Param("dto") MchManageDto dto, DataScope dataScope); - default Page scopePageList(Page page, MchManageDto dto) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .eq(ObjectUtil.isNotEmpty(dto.getTypes()), MchManageEntity::getTypes, dto.getTypes()) - .eq(ObjectUtil.isNotEmpty(dto.getVisibleMobile()), MchManageEntity::getVisibleMobile, dto.getVisibleMobile()) - .eq(ObjectUtil.isNotEmpty(dto.getIsSyncZy()), MchManageEntity::getIsSyncZy, dto.getIsSyncZy()) - .eq(ObjectUtil.isNotEmpty(dto.getDeptId()), MchManageEntity::getDeptId, dto.getDeptId()) - .eq(ObjectUtil.isNotEmpty(dto.getSupType()), MchManageEntity::getSupType, dto.getSupType()) - .eq(ObjectUtil.isNotEmpty(dto.getParentId()), MchManageEntity::getParentId, dto.getParentId()) - .eq(dto.getParentIsNull(), MchManageEntity::getParentId, -1L) - .like(ObjectUtil.isNotEmpty(dto.getName()), MchManageEntity::getName, dto.getName()) - .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) - .in(ObjectUtil.isNotEmpty(dto.getIds()), MchManageEntity::getId, dto.getIds()) - .in(ObjectUtil.isNotEmpty(dto.getNotIds()), MchManageEntity::getId, dto.getNotIds()) - .orderByDesc(MchManageEntity::getSort) - .orderByDesc(MchManageEntity::getDeptId) - .orderByDesc(MchManageEntity::getCreateTime); - Page list = selectPageByScope(page, wrapper, DataScope.of()); - list.setRecords(BeanUtils.toBean(list.getRecords(), MchManageVo.class)); - return list; - } + Page scopePageList(Page page, @Param("dto") MchManageDto dto, DataScope dataScope); default List scopeList(MchManageDto dto) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() 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 d3944ba12..7675c5c2d 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 @@ -10,6 +10,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageBalanceVo; @@ -159,4 +160,8 @@ public interface WalletManageMapper extends PjcloudBaseMapper scopeUserList(@Param("dto") WalletManageDto dto, @Param("dataScope") DataScope dataScope); List selectBalance(@Param("dto") WalletManageBalanceDto walletDto); + + Page activeBalancePage(Page page, @Param("dto") WalletTopupActionDto dto, @Param("unactiveDayNumberStr") String unactiveDayNumberStr); + + List activeBalanceList(@Param("dto") WalletTopupActionDto dto, @Param("unactiveDayNumberStr") String unactiveDayNumberStr); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCatgoryMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCatgoryMapper.java new file mode 100644 index 000000000..724ce58dd --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCatgoryMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.wallet.mapper.mch; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MchCatgoryMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCatgoryService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCatgoryService.java new file mode 100644 index 000000000..c25357784 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCatgoryService.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; + +public interface MchCatgoryService extends IService { + + /** + * 新增 + */ + Long create(MchCatgoryEntity dto); + + /** + * 编辑 + */ + Long edit(MchCatgoryEntity dto); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java index 0717bb805..f4e83aae6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java @@ -3,6 +3,7 @@ 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.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -25,9 +26,9 @@ public interface MchManageService extends IService { /** * 分页级联 */ - Page cascadeJoin(Page page, MchManageDto dto); + Page cascadeJoin(Page page, MchManageDto dto, DataScope dataScope); - Page scopePageList(Page page, MchManageDto dto); + Page scopePageList(Page page, MchManageDto dto, DataScope dataScope); MchManageVo join(Long id); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java index 7d5524869..11a6bbfec 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java @@ -6,6 +6,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import jakarta.servlet.http.HttpServletResponse; @@ -51,6 +52,11 @@ public interface WalletManageService extends IService { */ WalletManageEntity getWallet(@NotNull Long walletId); + /** + * 根据手机号获取钱包 + */ + WalletManageVo getWalletByPhone(String phone, WalletTypeEnum walletTypeCode); + /** * 根据用户id删除用户钱包 */ @@ -62,6 +68,16 @@ public interface WalletManageService extends IService { Page scopeQbPage(Page page, WalletManageBalanceDto dto, DataScope dataScope); + /** + * 不活跃用户钱包 + */ + Page pageJoinActive(Page page, WalletTopupActionDto dto, DataScope dataScope); + + /** + * 不活跃用户钱包 + */ + List pageListActive(WalletTopupActionDto dto, DataScope dataScope); + List scopeQbList(WalletManageBalanceDto dto, DataScope dataScope); WalletManageVo join(Long walletId); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java index 358d20d18..4bcced634 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java @@ -78,12 +78,24 @@ public class WalletCodeUseServiceImpl extends ServiceImpl code = HardUtil.generate(dto); - byte[] bytes = QRCodeImageGenerator.generateQrCodeImage(code.getRight(), 1024); + // 生成短码 + String shortCode = generateShortCode(code.getRight()); + byte[] bytes = QRCodeImageGenerator.generateQrCodeImage(shortCode, 1024); MultipartFile multipartFile = new MockMultipartFile("file", code.getLeft() + ".png", "image/png", new ByteArrayInputStream(bytes)); R upload = remoteFileService.innerUpload(multipartFile, null, null, null); Map data = (Map) upload.getData(); String url = (String) data.get("url"); - // 生成短码 - String shortCode = generateShortCode(code.getRight()); // 更新 WalletCodeUseEntity updateObj = WalletCodeUseEntity.builder().id(item.getId()).code(url).codeContent(code.getRight()).shortCode(shortCode).build(); baseMapper.updateById(updateObj); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java index e3b91f3e1..f34ff94f0 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.wallet.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.resource.ResourceUtil; @@ -27,9 +28,11 @@ import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; import com.bsd.pjcloud.wallet.api.entity.*; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; @@ -47,6 +50,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -177,6 +181,25 @@ public class WalletManageServiceImpl extends ServiceImpl userIds) { if (ObjectUtil.isEmpty(userIds)) return false; @@ -201,14 +224,14 @@ public class WalletManageServiceImpl extends ServiceImpl scopeList(WalletManageDto dto, DataScope dataScope) { List list = baseMapper.scopeList(dto, dataScope); - disposeList(list, dto); + disposeList(list); return list; } @Override public Page scopePageList(Page page, WalletManageDto dto, DataScope dataScope) { Page list = baseMapper.scopePage(page, dto, dataScope); - disposeList(list.getRecords(), dto); + disposeList(list.getRecords()); return list; } @@ -278,10 +301,38 @@ public class WalletManageServiceImpl extends ServiceImpl pageJoinActive(Page page, WalletTopupActionDto dto, DataScope dataScope) { + if (ObjectUtil.isEmpty(dto.getUnactiveMonthsNumber())) { + dto.setUnactiveMonthsNumber(3L); + } + String unactiveDayNumberStr = LocalDateTimeUtil.format(LocalDateTimeUtil.now().minusMonths(dto.getUnactiveMonthsNumber()), DatePattern.NORM_DATE_PATTERN); + Page pageList = baseMapper.activeBalancePage(page, dto, unactiveDayNumberStr); + disposeList(pageList.getRecords()); + return pageList; + } + + /** + * 不活跃用户钱包 + */ + @Override + public List pageListActive(WalletTopupActionDto dto, DataScope dataScope) { + if (ObjectUtil.isEmpty(dto.getUnactiveMonthsNumber())) { + dto.setUnactiveMonthsNumber(3L); + } + String unactiveDayNumberStr = LocalDateTimeUtil.format(LocalDateTimeUtil.now().minusMonths(dto.getUnactiveMonthsNumber()), DatePattern.NORM_DATE_PATTERN); + List list = baseMapper.activeBalanceList(dto, unactiveDayNumberStr); + disposeList(list); + return list; + } + @Override public List scopeQbList(WalletManageBalanceDto dto, DataScope dataScope) { WalletManageDto walletDto = BeanUtils.toBean(dto, WalletManageDto.class); @@ -314,7 +365,7 @@ public class WalletManageServiceImpl extends ServiceImpl list, WalletManageDto dto) { + private void disposeList(List list) { if (ObjectUtil.isNotEmpty(list)) { // 用户 List userIds = list.stream().map(WalletManageVo::getUserId).distinct().toList(); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCatgoryServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCatgoryServiceImpl.java new file mode 100644 index 000000000..c210f287c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCatgoryServiceImpl.java @@ -0,0 +1,61 @@ +package com.bsd.pjcloud.wallet.service.impl.mch; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; +import com.bsd.pjcloud.wallet.mapper.mch.MchCatgoryMapper; +import com.bsd.pjcloud.wallet.service.MchCatgoryService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 商户分类 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class MchCatgoryServiceImpl extends ServiceImpl implements MchCatgoryService { + + /** + * 新增 + */ + @Override + public Long create(MchCatgoryEntity dto) { + if (existName(dto)) throw new RuntimeException("分类名不能重复"); + if (ObjectUtil.isEmpty(dto.getBizType())) { + dto.setBizType(MerchantTypeEnum.SUPERMARKET.getType()); + } + baseMapper.insert(dto); + return dto.getId(); + } + + /** + * 编辑 + */ + @Override + public Long edit(MchCatgoryEntity dto) { + if (existName(dto)) throw new RuntimeException("分类名不能重复"); + baseMapper.updateById(dto); + return dto.getId(); + } + + /** + * 判断分类名是否重复 + */ + private boolean existName(MchCatgoryEntity dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getName()), MchCatgoryEntity::getName, dto.getName()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), MchCatgoryEntity::getBizType, dto.getBizType()) + .ne(ObjectUtil.isNotEmpty(dto.getId()), MchCatgoryEntity::getId, dto.getId()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count >= 1; + } + return count > 0; + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java index 2faf3d468..1cc3c7148 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java @@ -155,7 +155,7 @@ public class MchManageServiceImpl extends ServiceImpl list) { if (ObjectUtil.isEmpty(list)) return; // 判断下面是否有订单 - List mchList = baseMapper.list(MchManageDto.builder().ids(list).build()); + List mchList = baseMapper.scopeList(MchManageDto.builder().ids(list).build(), null); for (MchManageVo v : mchList) { Long count = remoteHardOrderService.getMchCountById(v.getId()).getData(); if (ObjectUtil.isNotEmpty(count) && count > 0) { @@ -190,12 +190,13 @@ public class MchManageServiceImpl extends ServiceImpl cascadeJoin(Page page, MchManageDto dto) { - Page pageList = scopePageList(page, dto); + public Page cascadeJoin(Page page, MchManageDto dto, DataScope dataScope) { + Page pageList = scopePageList(page, dto, dataScope); if (ObjectUtil.isEmpty(pageList.getRecords())) return pageList; for (MchManageVo v : pageList.getRecords()) { MchManageDto childrenDto = new MchManageDto(); childrenDto.setParentId(v.getId()); + childrenDto.setParentIsNull(false); List list = list(childrenDto); if (ObjectUtil.isEmpty(list)) continue; v.setChildren(list); @@ -204,8 +205,8 @@ public class MchManageServiceImpl extends ServiceImpl scopePageList(Page page, MchManageDto dto) { - Page list = baseMapper.scopePageList(page, dto); + public Page scopePageList(Page page, MchManageDto dto, DataScope dataScope) { + Page list = baseMapper.scopePageList(page, dto, dataScope); if (ObjectUtil.isNotEmpty(list.getRecords())) { // 部门 List deptIds = list.getRecords().stream().map(MchManageVo::getDeptId).distinct().toList(); @@ -245,7 +246,7 @@ public class MchManageServiceImpl extends ServiceImpl list(MchManageDto dto) { - List list = baseMapper.list(dto); + List list = baseMapper.scopeList(dto, null); if (ObjectUtil.isEmpty(list)) return null; // 部门 List deptIds = list.stream().map(MchManageVo::getDeptId).distinct().toList(); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java index 1a0a2d639..e5d4823dc 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java @@ -73,8 +73,8 @@ public class WalletRuleTransactionServiceImpl extends ServiceImpl - - + - + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchCatgoryMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchCatgoryMapper.xml new file mode 100644 index 000000000..bdc938faa --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchCatgoryMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml index 400887fe2..62469d3be 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml @@ -25,4 +25,104 @@ + + + select a.id, + a.parent_id, + a.dept_id, + a.default_wallet_type_id, + a.name, + a.types, + a.catgory_id, + a.logo_pic, + a.collection_code, + a.swiper_pic, + a.phone, + a.address_des, + a.job_time, + a.is_sync_zy, + a.visible_mobile, + a.sort, + a.sup_type, + a.discounts_price, + a.cooperation_status, + a.mch_count, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id, + + + + a.del_flag = 0 + + and a.types = #{dto.types} + + + and a.catgory_id = #{dto.catgoryId} + + + and a.visible_mobile = #{dto.visibleMobile} + + + and a.is_sync_zy = #{dto.isSyncZy} + + + and a.dept_id = #{dto.deptId} + + + and a.sup_type = #{dto.supType} + + + and a.parent_id = #{dto.parentId} + + + and a.parent_id = -1 + + + and a.name like concat('%', #{dto.name}, '%') + + + and a.dept_id in + + #{v} + + + + and a.id in + + #{v} + + + + and a.id in + + #{v} + + + + + + + \ No newline at end of file