diff --git a/db/1000pjcloudx_thirdparty.sql b/db/1000pjcloudx_thirdparty.sql index 3d7dc89d0..a22f984e7 100644 --- a/db/1000pjcloudx_thirdparty.sql +++ b/db/1000pjcloudx_thirdparty.sql @@ -27,4 +27,27 @@ CREATE TABLE `third_zy_log` ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci - ROW_FORMAT = DYNAMIC COMMENT ='正元日志表'; \ No newline at end of file + ROW_FORMAT = DYNAMIC COMMENT ='正元日志表'; + + +-- ---------------------------- +-- Table structure for third_zy_id_dict +-- ---------------------------- +DROP TABLE IF EXISTS `third_zy_id_dict`; +CREATE TABLE `third_zy_id_dict` +( + `id` bigint NOT NULL COMMENT '主键', + `self_id` varchar(64) NOT NULL COMMENT '自己这边的id映射', + `zy_id` varchar(64) NOT NULL COMMENT '正元id映射', + `biz_type` tinytext(16) NOT 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 ='正元字典id对应 id + bizType 唯一'; \ No newline at end of file diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java index 231c3263a..86e4c66bb 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java @@ -138,6 +138,8 @@ public interface CacheConstants { String THIRDPARTY_ZY_MER_TOKEN = "thirdparty:zy:mer_token"; + String THIRDPARTY_ZY_REGION_TOKEN = "thirdparty:zy:region"; + String THIRDPARTY_ZY_SELF_TOKEN = "thirdparty:zy:self_token:"; /* ************************************* end 第三方对接相关 end ************************************* */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/pom.xml b/pjcloud-hardware/pjcloud-hardware-biz/pom.xml index d4793a906..737070b51 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/pom.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/pom.xml @@ -138,6 +138,12 @@ 5.7.0 compile + + com.bsd + pjcloud-wallet-biz + 5.7.0 + compile + 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 3a722a141..a3f511ccd 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 @@ -49,15 +49,6 @@ public class HardOrderTotalController { /* ************************************* start 远程调用 start ************************************* */ - @PostMapping("/zy-card-sync") - @Operation(summary = "正元本地一卡通交易数据同步") - public R zyCardSync() { - HardOrderDto dto = new HardOrderDto(); - dto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); - dto.setOrderTypeCodes(HardOrderTypeEnum.getExternalCodes()); - return R.ok(HardOrderTotalService.totalYearMonthDay(dto)); - } - /* ************************************* end 远程调用 end ************************************* */ @PostMapping("/page-list-sb") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdZyController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdZyController.java new file mode 100644 index 000000000..652c0849b --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdZyController.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.hard.controller.third; + +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.service.HardThirdZyService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +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.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-third-zy") +@Tag(description = "hard-third-zy", name = "正元同步") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardThirdZyController { + + private final HardThirdZyService hardThirdZyService; + + @GetMapping("/sync-native-card-trade") + @Operation(summary = "交易数据同步") + public R syncNativeCardTrade() { + hardThirdZyService.syncNativeCardTradeInfo(); + return R.ok(); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdZyService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdZyService.java new file mode 100644 index 000000000..b6b7c9b36 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdZyService.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.hard.service; + +public interface HardThirdZyService { + + /** + * 交易数据同步 + */ + void syncNativeCardTradeInfo(); + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdZyServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdZyServiceImpl.java new file mode 100644 index 000000000..acdba707c --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdZyServiceImpl.java @@ -0,0 +1,69 @@ +package com.bsd.pjcloud.hard.service.impl.third; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.vo.order.HardZyCardSyncVo; +import com.bsd.pjcloud.hard.service.HardOrderTotalService; +import com.bsd.pjcloud.hard.service.HardThirdZyService; +import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdZyService; +import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto; +import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo; +import com.bsd.pjcloud.wallet.service.MchThirdZyService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardThirdZyServiceImpl implements HardThirdZyService { + + private static final String TAG = "硬件模块同步到正元信息"; + + private final RemoterThirdZyService thirdZyService; + + private final HardOrderTotalService hardOrderTotalService; + + /** + * 交易数据同步 + */ + @Override + public void syncNativeCardTradeInfo() { + // 查询统计数据 + HardOrderDto dto = new HardOrderDto(); + dto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); + dto.setOrderTypeCodes(HardOrderTypeEnum.getExternalCodes()); + HardZyCardSyncVo total = hardOrderTotalService.totalYearMonthDay(dto); + if (ObjectUtil.isEmpty(total)) { + log.info("|{}|syncNativeCardTradeInfo交易数据同步到正元全部统计信息错误total为空", TAG); + return; + } + ZyForeignSyncNativeCardTradeInfoDto sync = new ZyForeignSyncNativeCardTradeInfoDto(); + sync.setTotalMoney(parseMoney(total.getTotalMoney())); + sync.setTotalNum(total.getTotalNum()); + sync.setTotalMoneyYear(parseMoney(total.getTotalMoneyYear())); + sync.setTotalNumYear(total.getTotalNumYear()); + sync.setTotalMoneyMonth(parseMoney(total.getTotalMoneyMonth())); + sync.setTotalNumMonth(total.getTotalNumMonth()); + sync.setTotalMoneyDay(parseMoney(total.getTotalMoneyDay())); + sync.setTotalNumDay(total.getTotalNumDay()); + try { + ZyForeignSyncNativeCardTradeInfoVo res = thirdZyService.syncNativeCardTradeInfoApi(sync).getData(); + if (ObjectUtil.isEmpty(res)) return; + } catch (Exception e) { + log.error("|{}syncNativeCardTradeInfo调用第三方接口错误|", TAG); + } + } + + private BigDecimal parseMoney(Long money) { + if (ObjectUtil.isEmpty(money)) return BigDecimal.ZERO; + return BigDecimal.valueOf(money).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP); + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdZyService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdZyService.java index 0c42652be..15f2b35e3 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdZyService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdZyService.java @@ -21,6 +21,7 @@ import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideConsumptionVo; import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideCorrectVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -34,7 +35,7 @@ public interface RemoterThirdZyService { * 本地一卡通交易数据同步 */ @NoToken - @GetMapping("/third-zy-foreign/sync-native-card") + @PostMapping("/third-zy-foreign/sync-native-card") R syncNativeCardTradeInfoApi(@RequestBody ZyForeignSyncNativeCardTradeInfoDto dto); /* ************************************* end 正元本地一卡通交易数据同步 end ************************************* */ @@ -46,28 +47,28 @@ public interface RemoterThirdZyService { * 商户信息同步 */ @NoToken - @GetMapping("/third-zy-mer/sync-dealer-info") + @PostMapping("/third-zy-mer/sync-dealer-info") R syncDealerInfo(@RequestBody List dto); /** * 记账单位同步 */ @NoToken - @GetMapping("/third-zy-mer/sync-enterprise-info") + @PostMapping("/third-zy-mer/sync-enterprise-info") R syncEnterpriseInfoApi(@RequestBody List dto); /** * 账户信息同步 */ @NoToken - @GetMapping("/third-zy-mer/sync-account-info") + @PostMapping("/third-zy-mer/sync-account-info") R syncAccountInfoApi(@RequestBody List dto); /** * 身份信息同步 */ @NoToken - @GetMapping("/third-zy-mer/sync-acc-class-info") + @PostMapping("/third-zy-mer/sync-acc-class-info") R syncAccClassInfoApi(@RequestBody List dto); /* ************************************* end 数据同步 end ************************************* */ @@ -78,21 +79,21 @@ public interface RemoterThirdZyService { * 统一身份验证功能 */ @NoToken - @GetMapping("/third-zy-stride/authentication") + @PostMapping("/third-zy-stride/authentication") R authenticationApi(@RequestBody ZyStrideAuthenticationDto dto); /** * 智慧园区通刷平台提供消费接口 */ @NoToken - @GetMapping("/third-zy-stride/consumption") + @PostMapping("/third-zy-stride/consumption") R consumptionApi(@RequestBody ZyStrideConsumptionDto dto); /** * 智慧园区通刷平台提供冲正接口 */ @NoToken - @GetMapping("/third-zy-stride/correct") + @PostMapping("/third-zy-stride/correct") R correctApi(@RequestBody ZyStrideCorrectDto dto); /* ************************************* end 数据同步 end ************************************* */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignSyncNativeCardTradeInfoDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignSyncNativeCardTradeInfoDto.java index 28ffaf720..f1507aa8c 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignSyncNativeCardTradeInfoDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignSyncNativeCardTradeInfoDto.java @@ -24,17 +24,17 @@ public class ZyForeignSyncNativeCardTradeInfoDto { /** * 就餐总人数,从推广公务餐之日起,即总人数 */ - private Long totalNum; + private Long totalNum = 0L; /** - * 就餐总金额,从推广公务餐之日起,即总金额 + * 就餐总金额,从推广公务餐之日起,即总金额 */ private BigDecimal totalMoney; /** * 当年就餐总人数,从当年1月1日开始 */ - private Long totalNumYear; + private Long totalNumYear = 0L; /** * 当年就餐总金额,从当年1月1日开始 @@ -44,7 +44,7 @@ public class ZyForeignSyncNativeCardTradeInfoDto { /** * 当月就餐总人数,从当月1日开始 */ - private Long totalNumMonth; + private Long totalNumMonth = 0L; /** * 当月就餐总金额,从当月1日开始 @@ -54,7 +54,7 @@ public class ZyForeignSyncNativeCardTradeInfoDto { /** * 当日就餐总人数 */ - private Long totalNumDay; + private Long totalNumDay = 0L; /** * 当日就餐总金额 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/zy/ThirdZyIdDictEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/zy/ThirdZyIdDictEntity.java new file mode 100644 index 000000000..01b020c23 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/zy/ThirdZyIdDictEntity.java @@ -0,0 +1,92 @@ +package com.bsd.pjcloud.thirdparty.entity.zy; + +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; + +/** + * 正元字典id对应 id + bizType 唯一 + * + * @author third + * @date 2025-03-04 19:11:02 + */ +@Data +@TenantTable +@TableName("third_zy_id_dict") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "正元字典id对应 id + bizType 唯一") +public class ThirdZyIdDictEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 自己这边的id映射 + */ + @Schema(description = "自己这边的id映射") + private String selfId; + + /** + * 正元id映射 + */ + @Schema(description = "正元id映射") + private String zyId; + + /** + * 同步类型 + */ + @Schema(description = "同步类型") + private String bizType; + + /** + * 创建人 + */ + @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-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZyMerController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZyMerController.java index b6a662772..325c64582 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZyMerController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZyMerController.java @@ -18,10 +18,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -38,28 +35,28 @@ public class ThirdZyMerController { @Inner @Operation(summary = "商户信息同步") - @GetMapping("/sync-dealer-info") + @PostMapping("/sync-dealer-info") public R syncDealerInfo(@RequestBody List dto) { return R.ok(thirdZyMerService.syncDealerInfoApi(dto)); } @Inner @Operation(summary = "记账单位同步") - @GetMapping("/sync-enterprise-info") + @PostMapping("/sync-enterprise-info") public R syncEnterpriseInfoApi(@RequestBody List dto) { return R.ok(thirdZyMerService.syncEnterpriseInfoApi(dto)); } @Inner @Operation(summary = "账户信息同步") - @GetMapping("/sync-account-info") + @PostMapping("/sync-account-info") public R syncAccountInfoApi(@RequestBody List dto) { return R.ok(thirdZyMerService.syncAccountInfoApi(dto)); } @Inner @Operation(summary = "身份信息同步") - @GetMapping("/sync-acc-class-info") + @PostMapping("/sync-acc-class-info") public R syncAccClassInfoApi(@RequestBody List dto) { return R.ok(thirdZyMerService.syncAccClassInfoApi(dto)); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java new file mode 100644 index 000000000..b364e483d --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.thirdparty.mapper.zy; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType; +import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ThirdZyIdDictMapper extends PjcloudBaseMapper { + + default List getBySelfIds(ThirdZyBizEnumType type, List selfIds) { + if (ObjectUtil.isEmpty(type)) return null; + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .in(ObjectUtil.isNotEmpty(selfIds), ThirdZyIdDictEntity::getSelfId, selfIds) + .eq(ThirdZyIdDictEntity::getBizType, type.getType()); + return selectList(wrapper); + } + + default List getByZyIds(ThirdZyBizEnumType type, List zyIds) { + if (ObjectUtil.isEmpty(type)) return null; + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .in(ObjectUtil.isNotEmpty(zyIds), ThirdZyIdDictEntity::getZyId, zyIds) + .eq(ThirdZyIdDictEntity::getBizType, type.getType()); + return selectList(wrapper); + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZyIdDictService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZyIdDictService.java new file mode 100644 index 000000000..3e85ab1d7 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZyIdDictService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.thirdparty.service.impl; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; + +public interface ThirdZyIdDictService 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/zy/ThirdZyForeignServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java index ffbdcf825..6d07e29c5 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.thirdparty.config.ZyConfig; import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto; import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyLogEntity; @@ -15,12 +16,14 @@ import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignGetRegionIdByTokenVo; import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; @Service @Validated @@ -34,8 +37,11 @@ public class ThirdZyForeignServiceImpl implements ThirdZyForeignService { private final ZyApiTool zyApiTool; + private final StringRedisTemplate redisTemplate; + private final ThirdZyLogServiceImpl thirdZyLogService; + /** * 本地一卡通交易数据同步 */ @@ -45,6 +51,13 @@ public class ThirdZyForeignServiceImpl implements ThirdZyForeignService { long startTime = System.currentTimeMillis(); String url = zyConfig.getBaseUrl() + ZyApi.Foreign.SYNC_NATIVE_CARD_TRADE_INFO; try { + if (ObjectUtil.isEmpty(dto.getRegionCode())) { + ZyForeignGetRegionIdByTokenVo.VoData regionInfo = getRegionInfo(); + if (ObjectUtil.isEmpty(regionInfo)) { + throw new RuntimeException("获取区域信息错误无法进行"); + } + dto.setRegionCode(regionInfo.getRegionCode()); + } url = String.format(url, zyApiTool.getToken()); Map encryptionBody = new HashMap<>(); encryptionBody.put("regionCode", dto); @@ -52,10 +65,7 @@ public class ThirdZyForeignServiceImpl implements ThirdZyForeignService { entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); String body = zyApiTool.getEncryptionDto(encryptionBody); entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .form(body) - .execute() - .body(); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } @@ -116,4 +126,21 @@ public class ThirdZyForeignServiceImpl implements ThirdZyForeignService { } return null; } + + // 获取区域信息 + private ZyForeignGetRegionIdByTokenVo.VoData getRegionInfo() { + String redisKey = CacheConstants.THIRDPARTY_ZY_REGION_TOKEN; + String regionJson = redisTemplate.opsForValue().get(redisKey); + if (ObjectUtil.isNotEmpty(regionJson)) { + return JSONUtil.toBean(regionJson, ZyForeignGetRegionIdByTokenVo.VoData.class); + } + try { + ZyForeignGetRegionIdByTokenVo.VoData regionInfo = getRegionIdByToken(); + redisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(regionInfo)); + return regionInfo; + } catch (Exception e) { + log.error("|{}|获取区域信息错误无法进行,意外的错误error|{}|stack|{}|", TAG, e.getMessage(), e.getStackTrace()); + return null; + } + } } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyIdDictServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyIdDictServiceImpl.java new file mode 100644 index 000000000..33d8996e3 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyIdDictServiceImpl.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.thirdparty.service.impl.zy; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; +import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper; +import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyIdDictService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 正元字典id对应 id + bizType 唯一 + * + * @author third + * @date 2025-03-04 19:11:02 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdZyIdDictServiceImpl extends ServiceImpl implements ThirdZyIdDictService { + + + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java index 44d8aaf48..d3293221e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java @@ -41,14 +41,23 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { */ @Override public ZyMerSyncDealerInfoVo syncDealerInfoApi(List dto) { + ThirdZyBizEnumType bizTYpe = ThirdZyBizEnumType.SYNC_DEALER_INFO; ThirdZyLogEntity entity = new ThirdZyLogEntity(); - entity.setBizType(ThirdZyBizEnumType.SYNC_DEALER_INFO.getType()); + entity.setBizType(bizTYpe.getType()); long startTime = System.currentTimeMillis(); if (ObjectUtil.isEmpty(dto)) { return null; } + // 转换部门id + List deptList = dto.stream().map(ZyMerSyncDealerInfoDto::getEPID).distinct().toList(); + Map deptDdDict = zyApiTool.generateZyId(ThirdZyBizEnumType.SYNC_ENTERPRISE_INFO, deptList); + // 转换商户id + List mchList = dto.stream().map(ZyMerSyncDealerInfoDto::getDealerKeyObj).distinct().toList(); + Map mchIdDict = zyApiTool.generateZyId(bizTYpe, mchList); List> listMap = new ArrayList<>(); for (ZyMerSyncDealerInfoDto v : dto) { + v.setEPID(deptDdDict.get(v.getEPID())); + v.setDealerKeyObj(mchIdDict.get(v.getDealerKeyObj())); Map map = zyApiTool.removeEmptyMap(BeanUtil.beanToMap(v)); listMap.add(map); } @@ -89,23 +98,29 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { */ @Override public ZyMerSyncEnterpriseInfoVo syncEnterpriseInfoApi(List dto) { + ThirdZyBizEnumType bizType = ThirdZyBizEnumType.SYNC_ENTERPRISE_INFO; ThirdZyLogEntity entity = new ThirdZyLogEntity(); - entity.setBizType(ThirdZyBizEnumType.SYNC_ENTERPRISE_INFO.getType()); + entity.setBizType(bizType.getType()); long startTime = System.currentTimeMillis(); + List> listMap = new ArrayList<>(); + // 转换zyId + List list = dto.stream().map(ZyMerSyncEnterpriseInfoDto::getEPID).distinct().toList(); + Map idDict = zyApiTool.generateZyId(bizType, list); + for (ZyMerSyncEnterpriseInfoDto v : dto) { + v.setEPID(idDict.get(v.getEPID())); + Map map = zyApiTool.removeEmptyMap(BeanUtil.beanToMap(v)); + listMap.add(map); + } String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ENTERPRISE_INFO; try { url = String.format(url, zyApiTool.getToken()); Map encryptionBody = new HashMap<>(); - encryptionBody.put("enterprises", dto); + encryptionBody.put("enterprises", listMap); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - String body = zyApiTool.getEncryptionDto(encryptionBody); - entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .contentType("application/x-www-form-urlencoded") - .body(body) - .execute() - .body(); + Map body = zyApiTool.getEncryptionMap(encryptionBody); + entity.setEncipherReq(JSONUtil.toJsonStr(body)); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } @@ -142,12 +157,9 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { encryptionBody.put("accounts", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - String body = zyApiTool.getEncryptionDto(encryptionBody); - entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .body(body) - .execute() - .body(); + Map body = zyApiTool.getEncryptionMap(encryptionBody); + entity.setEncipherReq(JSONUtil.toJsonStr(body)); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } @@ -175,21 +187,29 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { */ @Override public ZyMerSyncAccClassInfoVo syncAccClassInfoApi(List dto) { + ThirdZyBizEnumType bizType = ThirdZyBizEnumType.SYNC_ACC_CLASS_INFO; ThirdZyLogEntity entity = new ThirdZyLogEntity(); + entity.setBizType(bizType.getType()); long startTime = System.currentTimeMillis(); String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ACC_CLASS_INFO; try { + List> listMap = new ArrayList<>(); + // 转换zyId + List roleList = dto.stream().map(ZyMerSyncAccClassInfoDto::getEPID).distinct().toList(); + Map roleIdDict = zyApiTool.generateZyId(bizType, roleList); + for (ZyMerSyncAccClassInfoDto v : dto) { + v.setEPID(roleIdDict.get(v.getEPID())); + Map map = zyApiTool.removeEmptyMap(BeanUtil.beanToMap(v)); + listMap.add(map); + } url = String.format(url, zyApiTool.getToken()); Map encryptionBody = new HashMap<>(); encryptionBody.put("accClasses", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - String body = zyApiTool.getEncryptionDto(encryptionBody); - entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .body(body) - .execute() - .body(); + Map body = zyApiTool.getEncryptionMap(encryptionBody); + entity.setEncipherReq(JSONUtil.toJsonStr(body)); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java index 6a1c87547..e6c76cde9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java @@ -51,12 +51,9 @@ public class ThirdZyStrideServiceImpl implements ThirdZyStrideService { encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - String body = zyApiTool.getEncryptionDto(encryptionBody); - entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .body(body) - .execute() - .body(); + Map body = zyApiTool.getEncryptionMap(encryptionBody); + entity.setEncipherReq(JSONUtil.toJsonStr(body)); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } @@ -93,12 +90,9 @@ public class ThirdZyStrideServiceImpl implements ThirdZyStrideService { encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - String body = zyApiTool.getEncryptionDto(encryptionBody); - entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .body(body) - .execute() - .body(); + Map body = zyApiTool.getEncryptionMap(encryptionBody); + entity.setEncipherReq(JSONUtil.toJsonStr(body)); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } @@ -135,12 +129,9 @@ public class ThirdZyStrideServiceImpl implements ThirdZyStrideService { encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - String body = zyApiTool.getEncryptionDto(encryptionBody); - entity.setEncipherReq(body); - String res = HttpRequest.post(url) - .body(body) - .execute() - .body(); + Map body = zyApiTool.getEncryptionMap(encryptionBody); + entity.setEncipherReq(JSONUtil.toJsonStr(body)); + String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { throw new RuntimeException("response is empty"); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java index 5e9b21901..a24ed6200 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java @@ -3,6 +3,7 @@ package com.bsd.pjcloud.thirdparty.utils.zy.api; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.codec.Base64; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; @@ -10,6 +11,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.thirdparty.config.ZyConfig; +import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType; +import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; +import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper; import com.bsd.pjcloud.thirdparty.vo.zy.mer.ZyMerGetTokenVo; import io.undertow.security.idm.DigestAlgorithm; import lombok.RequiredArgsConstructor; @@ -19,10 +23,10 @@ import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import org.apache.commons.codec.digest.DigestUtils; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; import java.util.concurrent.TimeUnit; @Component @@ -37,6 +41,8 @@ public class ZyApiTool { private final StringRedisTemplate redisTemplate; + private final ThirdZyIdDictMapper thirdZyIdDictMapper; + public ZyMerGetTokenVo getTokenApi() throws Exception { String url = zyConfig.getBaseUrl() + ZyApi.Mer.GET_TOKEN; url = String.format(url, zyConfig.getAppId(), zyConfig.getAppSecret()); @@ -63,24 +69,22 @@ public class ZyApiTool { try { String redisKey = CacheConstants.THIRDPARTY_ZY_MER_TOKEN; String token = redisTemplate.opsForValue().get(redisKey); - if (ObjectUtil.isEmpty(token)) { - ZyMerGetTokenVo vo = getTokenApi(); - if (ObjectUtil.isNotEmpty(vo)) { - String accessToken = vo.getAccess_token(); - String expiresIn = vo.getExpires_in(); - redisTemplate.opsForValue().set(redisKey, accessToken); - try { - long expiresInNum = Long.parseLong(expiresIn); - if (ObjectUtil.isNotEmpty(expiresInNum) && expiresInNum > 100) { - redisTemplate.expire(redisKey, expiresInNum - 100, TimeUnit.SECONDS); - } - } catch (Exception e) { - log.error("|{}|意外的错误error|{}|stack|{}|", TAG, e.getMessage(), e.getStackTrace()); + if (ObjectUtil.isNotEmpty(token)) return token; + ZyMerGetTokenVo vo = getTokenApi(); + if (ObjectUtil.isNotEmpty(vo)) { + String accessToken = vo.getAccess_token(); + String expiresIn = vo.getExpires_in(); + redisTemplate.opsForValue().set(redisKey, accessToken); + try { + long expiresInNum = Long.parseLong(expiresIn); + if (ObjectUtil.isNotEmpty(expiresInNum) && expiresInNum > 100) { + redisTemplate.expire(redisKey, expiresInNum - 100, TimeUnit.SECONDS); } - return accessToken; + } catch (Exception e) { + log.error("|{}|意外的错误error|{}|stack|{}|", TAG, e.getMessage(), e.getStackTrace()); } + return accessToken; } - return token; } catch (Exception e) { log.error("|{}|token获取错误无法进行,意外的错误error|{}|", TAG, e.getMessage()); } @@ -96,6 +100,51 @@ public class ZyApiTool { return jsonString; } + public Map generateZyId(ThirdZyBizEnumType type, List selfIds) { + if (!ObjectUtil.isAllNotEmpty(type, selfIds)) return null; + List bySelfIdList = thirdZyIdDictMapper.getBySelfIds(type, selfIds); + if (ObjectUtil.isEmpty(bySelfIdList)) bySelfIdList = new ArrayList<>(); + Map result = new HashMap<>(); + List list = new ArrayList<>(); + boolean hasDuplicate; + do { + // 标识是否有重复 + hasDuplicate = false; + list.clear(); + result.clear(); + for (String v : selfIds) { + Optional first = bySelfIdList.stream().filter(i -> ObjectUtil.equals(v, i.getSelfId()) && ObjectUtil.equals(type.getType(), i.getBizType())).findFirst(); + if (first.isPresent()) { + result.put(v, first.get().getZyId()); + continue; + } + ThirdZyIdDictEntity item = new ThirdZyIdDictEntity(); + item.setSelfId(v); + item.setBizType(type.getType()); + String randomNumber = RandomUtil.randomNumbers(3); + long epochMillis = Instant.now().toEpochMilli(); + String zyId = epochMillis + randomNumber; + item.setZyId(zyId); + list.add(item); + result.put(v, zyId); + } + List zyIds = list.stream().map(ThirdZyIdDictEntity::getZyId).toList(); + if (zyIds.isEmpty()) { + hasDuplicate = true; + break; + } + List repetitionList = thirdZyIdDictMapper.getByZyIds(type, zyIds); + if (ObjectUtil.isNotEmpty(repetitionList)) { + hasDuplicate = true; + break; + } + } while (hasDuplicate); + if (ObjectUtil.isNotEmpty(list)) { + thirdZyIdDictMapper.insert(list); + } + return result; + } + public Map getEncryptionMap(Map params) { Map body = new HashMap<>(); body.put("data", params); @@ -127,7 +176,7 @@ public class ZyApiTool { for (Map.Entry entry : params.entrySet()) { Object value = entry.getValue(); if (value instanceof String) { - entry.setValue(Base64.encode((String) value).replaceAll("\\s+", "")); + entry.setValue(Base64.encode((String) value)); } else { entry.setValue(Base64.encode(value.toString())); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdZyIdDictMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdZyIdDictMapper.xml new file mode 100644 index 000000000..8fd9ca066 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdZyIdDictMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java index ece32082a..27bd2d95a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java @@ -78,7 +78,7 @@ public class ZyTest { @Test public void merSyncEnterpriseInfo() { ZyMerSyncEnterpriseInfoDto dto = new ZyMerSyncEnterpriseInfoDto(); - dto.setEPID("1"); + dto.setEPID("0123456789012"); dto.setEPName("测试部门"); dto.setIsValid(1); dto.setFixId("20190920100101"); diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteRoleService.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteRoleService.java index d5e2f7dc0..34de9de4e 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteRoleService.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteRoleService.java @@ -22,8 +22,10 @@ package com.bsd.pjcloud.admin.api.feign; import com.bsd.pjcloud.admin.api.entity.SysRole; 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.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -46,7 +48,8 @@ public interface RemoteRoleService { /** * */ - @GetMapping("/role/by-codes") + @NoToken + @PostMapping("/role/by-codes") R> findRolesByCodes(@RequestBody List codes); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java index 4aaa9b12e..0de68261b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletActiveController.java @@ -74,7 +74,7 @@ public class WalletActiveController { @PostMapping("/app/bind-card") @SysLog("app绑定饭卡") @Operation(summary = "app绑定饭卡") - public R appBindCard(@Validated(Group.APP.class) @RequestBody WalletActiveBindCardDto dto) { + public R appBindCard(@Validated(Group.APP.class) @RequestBody WalletActiveBindCardDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); return R.ok(walletActiveService.bindCard(dto)); @@ -95,7 +95,7 @@ public class WalletActiveController { @SysLog("admin管理员绑定饭卡") @Idempotent(info = "正在处理中,请勿重复提交") @PreAuthorize("@pms.hasPermission('wallet_walletActive_bind_card')") - public R adminBindCard(@Validated(Group.ADMIN.class) @RequestBody WalletActiveBindCardDto dto) { + public R adminBindCard(@Validated(Group.ADMIN.class) @RequestBody WalletActiveBindCardDto dto) { return R.ok(walletActiveService.adminBindCard(dto)); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/MchThirdZyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/MchThirdZyController.java index 2a6b77962..3240f53cb 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/MchThirdZyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/MchThirdZyController.java @@ -1,7 +1,5 @@ package com.bsd.pjcloud.wallet.controller.third; - -import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.service.MchThirdZyService; @@ -13,13 +11,12 @@ 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.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @RequestMapping("/mch-third-zy") -@Tag(description = "wallet-active", name = "钱包开卡管理") +@Tag(description = "mch-third-zy", name = "正元同步") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) @Validated public class MchThirdZyController { @@ -28,15 +25,29 @@ public class MchThirdZyController { @GetMapping("/sync-all-mch") @Operation(summary = "同步全部商户") - public R syncAllMch(@RequestParam Long id) { - mchThirdZyService.syncAllMch(); + public R syncAllMch() { + mchThirdZyService.syncAllMch(null); return R.ok(); } @GetMapping("/sync-all-dept") @Operation(summary = "同步全部商户部门") public R syncAllDept() { - mchThirdZyService.syncAllDept(); + mchThirdZyService.syncAllDept(null); + return R.ok(); + } + + @GetMapping("/sync-all-role") + @Operation(summary = "同步全部身份") + public R syncAllRole() { + mchThirdZyService.syncAllRole(); + return R.ok(); + } + + @GetMapping("/sync-all-user") + @Operation(summary = "同步全部用户") + public R syncAllUser() { + mchThirdZyService.syncAllUser(null); return R.ok(); } 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 be4a36c55..b55959e8f 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 @@ -39,6 +39,7 @@ public interface MchManageMapper extends PjcloudBaseMapper { default List list(MchManageDto dto) { MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper() .selectAll(MchManageEntity.class) + .eq(ObjectUtil.isNotEmpty(dto.getId()), MchManageEntity::getId, dto.getId()) .likeIfExists(MchManageEntity::getName, dto.getName()) .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) .in(ObjectUtil.isNotEmpty(dto.getIds()), MchManageEntity::getId, dto.getIds()) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java index fc7d07814..a8c7c07f0 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletActiveMapper.java @@ -31,7 +31,7 @@ public interface WalletActiveMapper extends PjcloudBaseMapper { * @param dto * @return */ - Boolean bindCard(WalletActiveBindCardDto dto); + WalletActiveEntity bindCard(WalletActiveBindCardDto dto); - Boolean adminBindCard(WalletActiveBindCardDto dto); + WalletActiveEntity adminBindCard(WalletActiveBindCardDto dto); + + void createAndActiveCard(WalletManageEntity dto); /** * 取消绑定饭卡 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java index d8d698ac0..1b07cd570 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletActiveServiceImpl.java @@ -122,7 +122,7 @@ public class WalletActiveServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper() + .isNull(WalletActiveEntity::getUserId) + .isNull(WalletActiveEntity::getWalletId) + .eq(WalletActiveEntity::getMerchantId, mch.getId()) + .eq(WalletActiveEntity::getIsActiveHardware, YesNoEnum.NO.getCode()); + Long count = baseMapper.selectCount(wrapper); + if (count <= 1) { + WalletActiveDto createCardDto = new WalletActiveDto(); + createCardDto.setCount(20L); + createCardDto.setMerchantId(mch.getId()); + getSelf().fastCreateCard(createCardDto); + } + LambdaQueryWrapper selectOneWrapper = wrapper.clone().orderByAsc(WalletActiveEntity::getCardSort).last("limit 1"); + WalletActiveEntity walletActive = baseMapper.selectOne(selectOneWrapper); + if (ObjectUtil.isNotEmpty(walletActive)) { + // 绑定饭卡 + WalletActiveBindCardDto walletActiveDto = new WalletActiveBindCardDto(); + walletActiveDto.setUserId(wallet.getUserId()); + walletActiveDto.setWalletId(wallet.getId()); + walletActiveDto.setCardNumber(walletActive.getCardNumber()); + getSelf().bindCard(walletActiveDto); + } + } + @Override @Transactional(rollbackFor = Exception.class) public Boolean cancelAdminBindCard(Long activeId) { 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 1fd34f771..7b103493e 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 @@ -43,6 +43,7 @@ import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; import com.bsd.pjcloud.wallet.mapper.WalletManageMapper; import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; +import com.bsd.pjcloud.wallet.service.WalletActiveService; import com.bsd.pjcloud.wallet.service.WalletManageService; import com.bsd.pjcloud.wallet.service.WalletSettingService; import com.bsd.pjcloud.wallet.service.WalletTypeService; @@ -50,6 +51,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; 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.Transactional; @@ -80,6 +82,8 @@ public class WalletManageServiceImpl extends ServiceImpl mchList = mchManageService.list(); + public void syncAllMch(Long mchId) { + MchManageDto dto = new MchManageDto(); + dto.setId(mchId); + List mchList = mchManageService.list(dto); if (ObjectUtil.isEmpty(mchList)) { log.info("|{}|同步到正元全部商户信息错误mchList为空", TAG); return; } List syncList = new ArrayList<>(); - for (MchManageEntity v : mchList) { + for (MchManageVo v : mchList) { ZyMerSyncDealerInfoDto entity = new ZyMerSyncDealerInfoDto(); entity.setDealerKeyObj(v.getId().toString()); entity.setDealerName(v.getName()); entity.setIsValid(1); - entity.setEPID(""); + entity.setEPID(v.getDeptId().toString()); entity.setFixId(getSyncAllMchVersion()); syncList.add(entity); } - ZyMerSyncDealerInfoVo res = thirdZyService.syncDealerInfo(syncList).getData(); + try { + ZyMerSyncDealerInfoVo res = thirdZyService.syncDealerInfo(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return; + } catch (Exception e) { + log.error("|{}syncAllMch 调用第三方接口错误|", TAG); + } } + /** + * 同步全部商户部门 + */ @Override - public void syncAllDept() { - List mchList = remoteDeptService.getAllDept(null).getData(); + public void syncAllDept(Long mchId) { + // List mchList = remoteDeptService.getAllDept(null).getData(); + MchManageDto dto = new MchManageDto(); + dto.setId(mchId); + List mchList = mchManageService.list(dto); if (ObjectUtil.isEmpty(mchList)) { log.info("|{}|同步到正元全部商户部门信息错误mchList为空", TAG); return; } List syncList = new ArrayList<>(); - for (SysDept v : mchList) { + String syncAllMchVersion = getSyncAllMchVersion(); + for (MchManageVo v : mchList) { ZyMerSyncEnterpriseInfoDto entity = new ZyMerSyncEnterpriseInfoDto(); entity.setEPID(v.getDeptId().toString()); - entity.setEPName(v.getName()); + entity.setEPName(v.getDeptName()); entity.setIsValid(1); - entity.setFixId(getSyncAllMchVersion()); + entity.setFixId(syncAllMchVersion); syncList.add(entity); } - ZyMerSyncEnterpriseInfoVo res = thirdZyService.syncEnterpriseInfoApi(syncList).getData(); - } - - @Override - public void syncAllUser() { - Page page = new Page(); - page.setCurrent(1); - page.setSize(500); - boolean isResidue = true; - while (isResidue) { - isResidue = syncAllUserGroup(page); - if (!isResidue) break; + try { + ZyMerSyncEnterpriseInfoVo res = thirdZyService.syncEnterpriseInfoApi(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return; + } catch (Exception e) { + log.error("|{}syncAllDept 调用第三方接口错误|", TAG); } } @@ -105,72 +130,136 @@ public class MchThirdZyServiceImpl implements MchThirdZyService { @Override public void syncAllRole() { // 查询需要同步的身份信息 - List roleList = remoteRoleService.findRolesByCodes(List.of("GENERAL_USER")).getData(); + List roleList = remoteRoleService.findRolesByCodes(List.of(DEFAULT_USER_ROLE_CODE)).getData(); if (ObjectUtil.isEmpty(roleList)) { log.info("|{}|同步到正元全部身份信息错误roleList为空", TAG); return; } List syncList = new ArrayList<>(); + String syncAllMchVersion = getSyncAllMchVersion(); for (SysRole v : roleList) { ZyMerSyncAccClassInfoDto entity = new ZyMerSyncAccClassInfoDto(); entity.setAccClassID(v.getRoleId().toString()); entity.setAccClassName(v.getRoleName()); entity.setEPID("1"); - entity.setFixId(getSyncAllRoleVersion()); + entity.setFixId(syncAllMchVersion); syncList.add(entity); } - ZyMerSyncAccClassInfoVo res = thirdZyService.syncAccClassInfoApi(syncList).getData(); + try { + ZyMerSyncAccClassInfoVo res = thirdZyService.syncAccClassInfoApi(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return; + } catch (Exception e) { + log.error("|{}syncAllRole 调用第三方接口错误|", TAG); + } } - private boolean syncAllUserGroup(Page page) { + /** + * 同步到正元全部账户信息 + */ + @Override + public void syncAllUser(Long userId) { + Page page = new Page(); + page.setCurrent(1); + page.setSize(100); + // 查询身份信息 + List roleList = remoteRoleService.findRolesByCodes(List.of(DEFAULT_USER_ROLE_CODE)).getData(); + if (ObjectUtil.isEmpty(roleList)) { + log.error("|{}|syncAllUser 同步到正元全部身份信息错误roleList为空", TAG); + return; + } + Optional defaultUserRole = roleList.stream().filter(v -> ObjectUtil.equals(v.getRoleCode(), DEFAULT_USER_ROLE_CODE)).findFirst(); + if (defaultUserRole.isEmpty()) { + log.error("|{}|syncAllUser 同步到正元全部身份信息错误defaultUserRole为空", TAG); + return; + } + // 查询饭卡钱包信息 + WalletTypeEntity walletType = walletTypeService.getByUniqueCode(WalletTypeEnum.EAT); + if (ObjectUtil.isEmpty(walletType)) { + log.error("|{}|syncAllUser 同步到正元全部身份信息错误walletType为空", TAG); + return; + } + while (true) { + boolean isNotEmpty = syncAllUserGroup(page, userId, defaultUserRole.get().getRoleId(), walletType.getId()); + if (!isNotEmpty) break; + } + } + + + private boolean syncAllUserGroup(Page page, Long userId, Long roleId, Long walletTypeId) { WalletManageDto query = new WalletManageDto(); + query.setWalletTypeId(walletTypeId); + if (ObjectUtil.isNotEmpty(userId)) query.setUserId(userId); DataScope dataScope = DataScope.of(); dataScope.func(DataScopeFuncEnum.ALL); Page userPage = walletManageService.scopePageList(page, query, dataScope); if (ObjectUtil.isEmpty(userPage.getRecords())) return false; List syncList = new ArrayList<>(); + String syncAllMchVersion = getSyncAllMchVersion(); for (WalletManageVo v : userPage.getRecords()) { + // 查询用户 + UserInfo user = remoteUserService.getByUserId(v.getUserId()).getData(); + if (ObjectUtil.isEmpty(user)) { + log.error("|{}|syncAllUserGroup用户不存在为空WalletManageVo|{}|", TAG, JSONUtil.toJsonStr(v)); + continue; + } + MchManageVo mch = mchManageService.getFirstMchByDeptId(user.getSysUser().getDeptId()); + if (ObjectUtil.isEmpty(mch)) { + log.error("|{}|syncAllUserGroup用户部门商户id为空WalletManageVo|{}|", TAG, JSONUtil.toJsonStr(v)); + continue; + } + if (ObjectUtil.isEmpty(v.getCardNumber())) { + walletManageService.createWallet(v.getUserId()); + WalletManageEntity wallet = walletManageService.getWallet(v.getId()); + if (ObjectUtil.isNotEmpty(wallet)) { + v.setCardNumber(wallet.getCardNumber()); + } + } ZyMerSyncAccountInfoDto item = new ZyMerSyncAccountInfoDto(); item.setAccName(v.getUsername()); item.setAccNum(v.getUserId().toString()); item.setCardAccNum(v.getId()); item.setCardSID(v.getCardNumber()); - item.setCardStatus(getCardStatus(v.getCardNumber())); - item.setEPID(""); - item.setAccClassID(""); + item.setCardStatus(getCardStatus(v.getUserId(), v.getCardNumber())); + item.setEPID(mch.getDeptId().toString()); + item.setAccClassID(roleId.toString()); item.setPhoneNo(v.getUserMobile()); - item.setFixId(getSyncAllUserVersion()); + item.setFixId(syncAllMchVersion); syncList.add(item); } - ZyMerSyncAccountInfoVo res = thirdZyService.syncAccountInfoApi(syncList).getData(); - +// try { +// ZyMerSyncAccountInfoVo res = thirdZyService.syncAccountInfoApi(syncList).getData(); +// if (ObjectUtil.isEmpty(res)) return false; +// } catch (Exception e) { +// log.error("|{}syncAllUserGroup 调用第三方接口错误|", TAG); +// return false; +// } return userPage.getTotal() > 0; } - /* ************************************* start 版本号 start ************************************* */ + /* ************************************* start 工具类 start ************************************* */ private String getSyncAllMchVersion() { - return String.format("%014d", 2); + return LocalDateTimeUtil.format(LocalDateTimeUtil.now(), DatePattern.PURE_DATETIME_PATTERN); } - private String getSyncAllDeptVersion() { - return String.format("%014d", 2); - } - - private String getSyncAllUserVersion() { - return String.format("%014d", 1); - } - - private String getSyncAllRoleVersion() { - return String.format("%014d", 1); - } - - /* ************************************* end 版本号 end ************************************* */ // 卡片状态,0销卡;1有效;2挂失;3冻结;4预销卡;5锁卡,默认1 - private Integer getCardStatus(String cardNumber) { - return 0; + private Integer getCardStatus(Long userId, String cardNumber) { + if (!ObjectUtil.isAllNotEmpty(userId, cardNumber)) { + throw new RuntimeException(); + } + try { + // 创建并绑定钱包 + walletManageService.createWallet(userId); + return 1; + } catch (Exception e) { + String msg = String.format("|{}|getCardStatus意外的错误", TAG); + log.error(msg, e); + throw new RuntimeException(msg, e); + } } + /* ************************************* end 工具类 end ************************************* */ + }