diff --git a/db/800pjcloudx_hardware.sql b/db/800pjcloudx_hardware.sql index 1e8d18f73..c279747f7 100644 --- a/db/800pjcloudx_hardware.sql +++ b/db/800pjcloudx_hardware.sql @@ -124,6 +124,7 @@ CREATE TABLE hard_door_flow # sku识别 sku_submit_dto varchar(512) DEFAULT NULL COMMENT 'sku识别提交参数', sku_submit_vo varchar(512) DEFAULT NULL COMMENT 'sku识别提交结果', + sku_submit_recog_id varchar(32) DEFAULT NULL COMMENT 'sku识别提交id(用于查询)', sku_submit_time datetime DEFAULT NULL COMMENT 'sku识别提交时间', # sku识别回调 sku_callback_vo varchar(512) DEFAULT NULL COMMENT 'sku识别回调结果', @@ -470,7 +471,6 @@ CREATE TABLE hard_spu_repertory ( id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', user_id bigint NOT NULL COMMENT '用户id', - hard_id bigint NOT NULL COMMENT '设备id', spu_id bigint NOT NULL COMMENT '商品id', before_count int NOT NULL COMMENT '更新前的库存数量', count int DEFAULT 0 COMMENT '更新库存数量', diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardDoorOpenTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardDoorOpenTypeEnum.java index eca1fc93f..cba8a33d4 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardDoorOpenTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardDoorOpenTypeEnum.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import java.util.Arrays; +import java.util.List; /** * 开门类型 @@ -19,6 +20,10 @@ public enum HardDoorOpenTypeEnum { private final String type; private final String description; + public static List getMaintenanceListCodes() { + return List.of(MAINTENANCE_UNLOCK.getType(), MAINTENANCE_LOCK.getType()); + } + public static HardDoorOpenTypeEnum 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-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java index f5c2c6ea8..f5f1117ff 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java @@ -121,6 +121,7 @@ public class HardDoorFlowEntity extends Model { @Schema(description = "视频回调时间") private LocalDateTime videoCallbackTime; + /** * sku识别提交参数 */ @@ -133,6 +134,12 @@ public class HardDoorFlowEntity extends Model { @Schema(description = "sku识别提交结果") private String skuSubmitVo; + /** + * sku识别提交id(用于查询) + */ + @Schema(description = "sku识别提交id(用于查询)") + private String skuSubmitRecogId; + /** * sku识别提交时间 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java index 96512745f..10921b853 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java @@ -36,12 +36,6 @@ public class HardSpuRepertoryEntity extends Model { @Schema(description = "用户id") private Long userId; - /** - * 设备id - */ - @Schema(description = "设备id") - private Long hardId; - /** * 商品id */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java index 77b6be85c..15826858f 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java @@ -2,12 +2,11 @@ package com.bsd.pjcloud.hard.api.vo.spu; import com.bsd.pjcloud.admin.api.vo.base.BaseUserInterface; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuRepertoryEntity; -import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface; import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface; import lombok.Data; @Data -public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMchInterface, BaseHardInterface, BaseUserInterface { +public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMchInterface, BaseUserInterface { /** * 商品相关 @@ -34,13 +33,6 @@ public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMc private String logoPic; - /** - * 设备相关 - */ - private String hardName; - - private String hardType; - /** * 用户相关 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java index d183aa688..7ed95232c 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java @@ -31,27 +31,17 @@ public interface HardCarService extends IService { /** * 新增或者更新购物车 - * - * @param dto */ void saveOrUpload(HardCarSaveOrUpdateDto dto); /** - * @param userId 用户id - * @param merchantId 商户id - * @param sysType 硬件设备类型 - * @param list g购物车类表 - * @return 父购物车id + * 创建购物车 */ Long createCard(Long userId, Long merchantId, HardTypeEnum sysType, HardOrderTypeEnum orderTYpe, List list); /** * 生成购买商品的描述 - * - * @param sysType 订单类型 - * @param list 购物车列表 - * @return */ String computerCarSubject(HardTypeEnum sysType, HardOrderTypeEnum orderType, List list); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java index c0a5691da..656a9d776 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java @@ -38,15 +38,16 @@ public interface HardDoorFlowService extends IService { */ void disposeLocakCallback(DoorOpenCallbackDto dto); + /** + * 处理柜子状态回调 + */ + void disposeStatusCallback(DoorStatusCallbackDto dto); + /** * 处理视频回调 */ void disposeVideoCallback(DoorVideoCallbackDto dto); - /** - * 处理柜子状态回调 - */ - void disposeStatusCallback(DoorStatusCallbackDto dto); /** * 处理旷世识别回调 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 9a15f336d..05ac020cd 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 @@ -7,10 +7,12 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; +import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; import jakarta.validation.Valid; import java.util.List; @@ -47,6 +49,11 @@ public interface HardOrderService extends IService { */ Long createHardDoorOrder(Long userId, Long hardId); + /** + * 结算智能柜订单 + */ + Long payHardDoorOrder(HardOrderEntity dto, List ksSpuList); + /** * 快速扣款,离线订单使用 */ 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 0ba1b4aea..4fee0e018 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 @@ -20,6 +20,10 @@ public interface HardSpuService extends IService { */ Page scopPageJoin(Page page, HardSpuDto dto, DataScope dataScope); + List get(List ksSpuIds); + + List getByIds(List spuIds); + /** * 新增 */ @@ -54,4 +58,9 @@ public interface HardSpuService extends IService { * 拉取旷世商品 */ void asyncAll(); + + /** + * 拉取旷世商品 + */ + HardSpuEntity validateSpu(Long hardSpuId); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java index 31d1fe47b..dbd15b7a1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java @@ -5,15 +5,18 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; -import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.constant.HardDoorFlowEnum; +import com.bsd.pjcloud.hard.api.constant.HardDoorOpenTypeEnum; import com.bsd.pjcloud.hard.api.dto.HardDoorFlowOpenDto; -import com.bsd.pjcloud.hard.api.entity.HardAuthEntity; +import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; -import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; import com.bsd.pjcloud.hard.mapper.HardAuthMapper; import com.bsd.pjcloud.hard.mapper.HardDoorFlowMapper; @@ -23,10 +26,8 @@ import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdKsService; import com.bsd.pjcloud.thirdparty.dto.door.*; import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionDto; -import com.bsd.pjcloud.thirdparty.dto.ks.KsSkuSubmitDto; import com.bsd.pjcloud.thirdparty.vo.door.DoorOpenVo; import com.bsd.pjcloud.thirdparty.vo.ks.KsRecognitionVo; -import com.bsd.pjcloud.thirdparty.vo.ks.KsSkuSubmitVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -54,6 +55,7 @@ public class HardDoorFlowServiceImpl extends ServiceImpl() + .eq(HardDoorFlowEntity::getSkuSubmitRecogId, ksRecogId) + ); + } + /** * 开门 */ @@ -79,7 +90,14 @@ public class HardDoorFlowServiceImpl extends ServiceImpl spuList = hardSpuJoinService.getSpuList(hardDoorDetail.getId(), dto.getCabinetNo()); if (ObjectUtil.isEmpty(spuList) || spuList.isEmpty()) throw new RuntimeException("货柜商品信息为空,请上架"); - DoorOpenDto openDto = new DoorOpenDto(); - openDto.setDeviceCode(hardDoorDetail.getDeviceCode()); - openDto.setCabinetNo(dto.getCabinetNo()); - openDto.setOutOpenNo(String.valueOf(dto.getHardDoorFlowId())); - DoorOpenVo openVo = thirdDoorApiService.open(openDto).getData(); - if (ObjectUtil.isEmpty(openVo) || !openVo.isSuccess()) { - throw new RuntimeException("开门失败"); - } - HardDoorFlowEntity updateObj = HardDoorFlowEntity.builder() - .id(dto.getHardDoorFlowId()) - .hardId(hardDoorDetail.getHardId()) - .hardDoorId(dto.getHardDoorId()) - .cabinetNo(dto.getCabinetNo()) - .requestOpenDto(JSONUtil.toJsonStr(dto)) - .requestOpenVo(JSONUtil.toJsonStr(openVo)) - .build(); - baseMapper.updateById(updateObj); + getSelf().openDoor(dto, hardDoorDetail); } /** @@ -160,46 +162,84 @@ public class HardDoorFlowServiceImpl extends ServiceImpl maintenanceList = HardDoorOpenTypeEnum.getMaintenanceListCodes(); + if (maintenanceList.contains(String.valueOf(dto.getEventType()))) { + hardDoorManagerService.refresh(dto.getDeviceCode()); return; } - // 创建订单 - Long orderId = hardOrderService.createHardDoorOrder(flowDetail.getUserId(), flowDetail.getHardId()); - // 更新流程 boolean isOpenDoor = ObjectUtil.equals(dto.getType(), "OPEN"); HardDoorFlowEntity updateObj = HardDoorFlowEntity.builder() .id(flowDetail.getId()) - .orderId(orderId) .isOpen(isOpenDoor ? YesNoEnum.YES.getCode() : YesNoEnum.NO.getCode()) .openCallbackTime(LocalDateTime.now()) .openCallbackVo(JSONUtil.toJsonStr(dto)) .build(); + // 如果是购买的话 + if (ObjectUtil.equals(flowDetail.getBizType(), HardDoorFlowEnum.PAY_OPEN.getType())) { + // 创建订单 + Long orderId = hardOrderService.createHardDoorOrder(flowDetail.getUserId(), flowDetail.getHardId()); + updateObj.setOrderId(orderId); + } baseMapper.updateById(updateObj); } + /** + * 处理柜子状态回调 + */ + @Override + public void disposeStatusCallback(DoorStatusCallbackDto dto) { + if (ObjectUtil.isEmpty(dto)) { + log.error("|{}|disposeStatusCallback 意外的错误,参数错误dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + HardDoorManagerVo hardDoorDetail = hardDoorManagerService.getByDeviceCode(dto.getDeviceCode()); + if (ObjectUtil.isEmpty(hardDoorDetail)) { + log.error("|{}|disposeStatusCallback 意外的错误,设备不存在dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + try { + hardDoorCabinetService.saveOrUpdate(hardDoorDetail.getId(), dto.getCabinetList()); + } catch (Exception e) { + log.error("|{}|disposeStatusCallback 更新柜子状态失败dto|{}|", TAG, JSONUtil.toJsonStr(dto), e); + } + } + /** * 处理视频回调 */ @Override public void disposeVideoCallback(DoorVideoCallbackDto dto) { if (ObjectUtil.isEmpty(dto) || ObjectUtil.isEmpty(dto.getVideoList())) { - log.info("|{}|disposeVideoCallback 参数错误dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + log.info("|{}|disposeVideoCallback 意外的错误,参数错误dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + if (ObjectUtil.equals(dto.getResultCode(), "FAIL")) { + log.info("|{}|disposeVideoCallback 意外的错误,关门回调直接返回dto|{}|", TAG, JSONUtil.toJsonStr(dto)); return; } // 查询流程 HardDoorFlowEntity flowDetail = baseMapper.selectById(dto.getOutOpenNo()); if (ObjectUtil.isEmpty(flowDetail)) { - log.info("|{}|disposeVideoCallback 流程不存在dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + log.info("|{}|disposeVideoCallback 意外的错误,流程不存在dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + // 判断是否已提交 + if (ObjectUtil.isNotEmpty(flowDetail.getSkuSubmitTime())) { + log.info("|{}|disposeVideoCallback 该流程已经提交识别|{}|", TAG, JSONUtil.toJsonStr(dto)); return; } // 提交视频 @@ -223,9 +263,10 @@ public class HardDoorFlowServiceImpl extends ServiceImpl resultSkuList = result.getResult(); + if (ObjectUtil.isNotEmpty(resultSkuList)) { + Long orderId = hardOrderService.payHardDoorOrder(orderDetail, resultSkuList); + if (ObjectUtil.isNotEmpty(orderId)) { + + } + } } private HardDoorFlowServiceImpl getSelf() { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java index d47bec2d5..646cc5511 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java @@ -20,11 +20,13 @@ import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.mapper.order.HardCarMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.mapper.order.HardParentCarMapper; import com.bsd.pjcloud.hard.service.HardCarService; +import com.bsd.pjcloud.hard.service.HardSpuService; import com.bsd.pjcloud.supermarket.api.feign.RemoteSupermarketUnitSkuService; import com.bsd.pjcloud.supermarket.vo.erp.SmErpUnitWithSpuVo; import lombok.RequiredArgsConstructor; @@ -53,6 +55,7 @@ public class HardCarServiceImpl extends ServiceImpl { + AtomicInteger doorTotalPrice = new AtomicInteger(); + // 查询智能柜 + List supList = hardSpuService.getByIds(productIds); + for (HardCreateCarDto v : list) { + supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + Integer price = spu.getPrice(); + if (ObjectUtil.isNotEmpty(v.getProductCount()) && !ObjectUtil.equals(v.getProductCount(), 0)) { + // 按数量 + int itemTotalPrice = v.getProductCount() * price; + doorTotalPrice.addAndGet(itemTotalPrice); + } else if (ObjectUtil.isNotEmpty(v.getProductWeight()) && v.getProductWeight().compareTo(BigDecimal.valueOf(0)) != 0) { + // 按重量 + // 向上取整 + int itemTotalPrice = v.getProductWeight().multiply(BigDecimal.valueOf(price)).setScale(0, RoundingMode.CEILING).intValue(); + doorTotalPrice.addAndGet(itemTotalPrice); + } + }); + } + yield doorTotalPrice.get(); + } default -> null; }; } @@ -272,6 +296,37 @@ public class HardCarServiceImpl extends ServiceImpl carObjectList = new ArrayList<>(); + List supList = hardSpuService.getByIds(productIds); + for (HardCreateCarDto v : productList) { + HardCarEntity item = HardCarEntity.builder().parentCarId(parentCarId).build(); + supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + Integer price = spu.getPrice(); + int totalPrice = 0; + // 按重量 + if (ObjectUtil.isNotEmpty(v.getProductCount()) && !ObjectUtil.equals(v.getProductCount(), 0)) { + // 按数量 + totalPrice = v.getProductCount() * price; + } else if (ObjectUtil.isNotEmpty(v.getProductWeight()) && v.getProductWeight().compareTo(BigDecimal.valueOf(0)) != 0) { + // 按重量 + totalPrice = v.getProductWeight().multiply(BigDecimal.valueOf(price)).setScale(0, RoundingMode.CEILING).intValue(); + } + item.setProductId(spu.getId()); + item.setProductName(spu.getName()); + item.setProductPrice(price); + item.setProductPic(spu.getCover()); + item.setTotalPrice((long) totalPrice); + // item.setProductNature(v.getProductNature().getType()); + item.setProductCount(v.getProductCount()); + item.setProductWeight(v.getProductWeight()); + carObjectList.add(item); + }); + } + baseMapper.insert(carObjectList); + return; + } } @Override @@ -308,6 +363,15 @@ public class HardCarServiceImpl extends ServiceImpl supList = hardSpuService.getByIds(productIds); + for (HardCreateCarDto v : list) { + supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + str.append(spu.getName()).append("x").append(v.getProductCount()).append(";"); + }); + } + } return str.toString(); } 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 a0902b457..4dac506d4 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 @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service.impl.order; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,6 +20,7 @@ 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.security.service.PjcloudUser; +import com.bsd.pjcloud.hard.api.constant.HardProductNatureEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; @@ -33,6 +35,7 @@ import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.utils.HardUtil; import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; @@ -42,6 +45,7 @@ import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.*; import com.bsd.pjcloud.supermarket.api.feign.RemoteSupermarketSpuService; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; @@ -89,6 +93,7 @@ public class HardOrderServiceImpl extends ServiceImpl ksSpuList) { + if (ObjectUtil.isEmpty(dto) || ObjectUtil.isEmpty(ksSpuList)) return null; + // 创建购物车 + List ksSpuIds = ksSpuList.stream().map(KsRecognitionCallbackDto.ResultSku::getKs_sku_id).toList(); + List hardSpuList = hardSpuService.get(ksSpuIds); + if (ObjectUtil.isEmpty(hardSpuList)) { + log.error("|{}|智能柜订单结算,商品不存在dto|{}|ksSpuList|{}|", TAG, JSONUtil.toJsonStr(dto), JSONUtil.toJsonStr(ksSpuList)); + return null; + } + List carListDto = new ArrayList<>(); + for (KsRecognitionCallbackDto.ResultSku v : ksSpuList) { + hardSpuList.stream().filter(i -> ObjectUtil.equals(i.getKsSkuId(), v.getKs_sku_id())).findFirst().ifPresent(hardSpu -> { + HardCreateCarDto entity = new HardCreateCarDto(); + entity.setProductId(hardSpu.getId()); + entity.setProductNature(HardProductNatureEnum.DEFAULT); + entity.setProductCount(Integer.parseInt(v.getSku_num())); + carListDto.add(entity); + }); + } + HardTypeEnum hardType = HardTypeEnum.valueOfByType(dto.getSysType()); + HardOrderTypeEnum orderType = HardOrderTypeEnum.valueOfByType(dto.getOrderType()); + // 获取商品价格 + Integer totalPrice = hardCarService.computerCarTotalPrice(hardType, orderType, carListDto); + // 添加购物车 + Long parentCarId = hardCarService.createCard(dto.getUserId(), dto.getMerchantId(), hardType, orderType, carListDto); + // 获取商品描述 + String subject = hardCarService.computerCarSubject(hardType, orderType, carListDto); + // 更新订单信息 + HardOrderEntity updateObj = HardOrderEntity.builder() + .id(dto.getId()) + .parentCarId(parentCarId) + .totalPrice(totalPrice) + .payPrice(totalPrice) + .extraPrice(0) + .productDesc(subject) + .build(); + baseMapper.updateById(updateObj); + HardOrderEntity orderObj = baseMapper.selectById(updateObj.getId()); + // 扣减库存 + getSelf().fastenerInventory(orderObj, YesNoEnum.YES); + // 钱包扣款 + getSelf().fastReduceBalance(orderObj); + return orderObj.getId(); + } + @Override @Transactional(rollbackFor = Exception.class) public void fastReduceBalance(HardOrderEntity order) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java index f2ae9ebf9..ca367b026 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java @@ -59,6 +59,7 @@ public class HardSpuJoinServiceImpl extends ServiceImpl hardIds = list.stream().map(HardSpuRepertoryVo::getHardId).filter(ObjectUtil::isNotEmpty).distinct().toList(); - if (ObjectUtil.isNotEmpty(hardIds)) { - HardManagerDto hardManagerDto = new HardManagerDto(); - hardManagerDto.setIds(hardIds); - List hardList = hardManagerMapper.list(hardManagerDto); - if (ObjectUtil.isNotEmpty(hardList)) { - HardUtil.convertHardList(list, CollectionUtils.convertMap(hardList, HardManagerEntity::getId)); - } - } // 用户 List userIds = list.stream().map(HardSpuRepertoryVo::getUserId).distinct().toList(); R> userList = remoteUserService.getUserById(new ArrayList<>(userIds)); 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 23234d1dc..feef32957 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 @@ -66,14 +66,24 @@ public class HardSpuServiceImpl extends ServiceImpl get(List ksSpuIds) { + return baseMapper.selectList(new LambdaQueryWrapper().in(HardSpuEntity::getKsSkuId, ksSpuIds)); + } + + @Override + public List getByIds(List spuIds) { + return baseMapper.selectList(new LambdaQueryWrapper().in(HardSpuEntity::getId, spuIds)); + } + /** * 新增 */ @Override public Long create(HardSpuEntity entity) { - if (existName(entity)) { - throw new RuntimeException("商品名不能重复"); - } + // if (existName(entity)) { + // throw new RuntimeException("商品名不能重复"); + // } entity.setSkuType(HardKsSkuTypeEnum.SELF.getType()); baseMapper.insert(entity); // 发起审核 @@ -86,9 +96,9 @@ public class HardSpuServiceImpl extends ServiceImpl - @@ -21,7 +20,6 @@ select a.id, a.user_id, - a.hard_id, a.spu_id, a.before_count, a.count, @@ -36,9 +34,6 @@ a.del_flag = '0' - - and a.hard_id = #{dto.hardId} - and a.spu_id = #{dto.spuId} @@ -60,8 +55,6 @@ s.name as spuName, s.spu_category_id, - s.hard_door_number, - s.mch_id as spuMchId, c.name as spuCategoryName from hard_spu_repertory a left join hard_spu s on s.id = a.spu_id diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/door/DoorVideoCallbackDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/door/DoorVideoCallbackDto.java index fda2bb328..ea5a416b0 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/door/DoorVideoCallbackDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/door/DoorVideoCallbackDto.java @@ -43,7 +43,7 @@ public class DoorVideoCallbackDto { private List videoList; @Data - public class Video { + public static class Video { /** * 摄像头号:1:主摄;2:辅摄 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionCallbackDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionCallbackDto.java index 45b5de373..29e59424c 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionCallbackDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionCallbackDto.java @@ -31,7 +31,7 @@ public class KsRecognitionCallbackDto { } @Data - private static class Result { + public static class Result { private ResultStatus status; /** @@ -46,7 +46,7 @@ public class KsRecognitionCallbackDto { } @Data - private static class ResultStatus { + public static class ResultStatus { /*** * 1:识别中 * 2:成功 @@ -64,7 +64,7 @@ public class KsRecognitionCallbackDto { } @Data - private static class ResultSku { + public static class ResultSku { /** * 识别到的sku_id(超级收银员平台的sku_id) diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionDto.java index cc573d5fa..a63e50e80 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsRecognitionDto.java @@ -2,6 +2,8 @@ package com.bsd.pjcloud.thirdparty.dto.ks; import lombok.Data; +import java.util.List; +import java.util.Map; import java.util.StringTokenizer; @Data @@ -24,7 +26,7 @@ public class KsRecognitionDto { * floor_num(非必选): * SKU所在的货架层数 */ - private String extra_params; + private Map extra_params; /** * 货柜ID @@ -42,7 +44,7 @@ public class KsRecognitionDto { *

* 需将主摄像头,即设备左上角或右上角的摄像头(开门那侧的最优),的url作为第一个链接 */ - private String resource_urls; + private List resource_urls; /** * 资源信息列表,与resource_urls二选一。 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java index 485a9488c..983a155e1 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsBaseVo.java @@ -19,7 +19,7 @@ public class KsBaseVo { private String data; public boolean isSuccess() { - return ObjectUtil.equal(code, KsBaseVo.successCode) || ObjectUtil.isNotEmpty(request_id); + return ObjectUtil.isEmpty(msg); } } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java index a7bdf34dc..96456cba1 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/door/ThirdDoorApiServiceImpl.java @@ -313,7 +313,7 @@ public class ThirdDoorApiServiceImpl implements ThirdDoorApiService { return; } long startTime = System.currentTimeMillis(); - DoorApi.Api api = DoorApi.OPEN_CALLBACK.setBaseUrl(doorConfig.getBaseUrl()); + DoorApi.Api api = DoorApi.VIDEO_CALLBACK.setBaseUrl(doorConfig.getBaseUrl()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(json); try { @@ -340,7 +340,7 @@ public class ThirdDoorApiServiceImpl implements ThirdDoorApiService { return; } long startTime = System.currentTimeMillis(); - DoorApi.Api api = DoorApi.OPEN_CALLBACK.setBaseUrl(doorConfig.getBaseUrl()); + DoorApi.Api api = DoorApi.STATUS_CALLBACK.setBaseUrl(doorConfig.getBaseUrl()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(json); try { 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 6e134f074..d3e9b15a5 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 @@ -241,13 +241,30 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { */ @Override public KsRecognitionVo recognition(KsRecognitionDto dto) { + dto.setNotify_url(ksDiscernConfig.getCallbackBaseUrl() + ksDiscernConfig.getCallbackRecognitionUrl()); long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.BARCODE_SKU.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.RECOGNITION.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); + KsRecognitionVo errorVo = new KsRecognitionVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||recognition|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -314,6 +331,7 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { */ @Override public void callbackRecognition(String json, Map headers) { + String jsonStr = JSONUtil.toJsonStr(headers); KsRecognitionCallbackDto dto = JSONUtil.toBean(json, KsRecognitionCallbackDto.class); boolean isSign = apiParseSign(json, headers); if (!isSign) { 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 f12f77d67..c53b2192f 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 @@ -56,7 +56,7 @@ public class KsApi { public static final KsApi.Api BARCODE_SKU_LIKE = KsApi.Api.builder().url("/openapi/sc/v1/sku/sku_list").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpGet.METHOD_NAME).contentType("application/json").build(); // SKU提交识别 - public static final KsApi.Api RECOGNITION = KsApi.Api.builder().url("/openapi/sc/v1/recognition/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + public static final KsApi.Api RECOGNITION = KsApi.Api.builder().url("/openapi/sc/v1/recognition").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build(); // SKU识别结果回调通知 public static final KsApi.Api RECOGNITION_CALLBACK = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.RECOGNITION_CALLBACK).method(HttpPost.METHOD_NAME).contentType("application/json").build(); @@ -119,6 +119,11 @@ public class KsApi { return this; } + public KsApi.Api setBody(String body) { + this.body = body; + return this; + } + /** * 获取当前时间戳 */ @@ -169,12 +174,6 @@ public class KsApi { if (ObjectUtil.isNotEmpty(query)) { fullPatch = fullPatch + "?" + query; } - // 计算签名 - Long currentTime = getXRequestDate(); - String queryString = getQueryString(); - String auth = KsRetailSignUtils.getSignAuth(getHost(), getUrl(), contentType, getMethod(), currentTime, getAccessKey(), getSecretKey(), getBody(), queryString); - String requestId = getXRequestDate() + RandomUtil.randomString(19); - setRequestId(requestId); if (ObjectUtil.equals(method, HttpPost.METHOD_NAME)) { return HttpRequest.post(fullPatch).header(getHeader()).body(getBody()); } else if (ObjectUtil.equals(method, HttpGet.METHOD_NAME)) { 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 0c3752915..31c8fbc8a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -86,8 +86,8 @@ ks-discern: secret-key: Ex3X0kgoc94sBOtivjWm5Vz9AyZTOUpl host: retail.xlsdn.com callback-base-url: http://h1yzkslmyx.ny.takin.cc - callback-recognition-url: /third/third-door/callback/open - callback-sku-url: /third/third-door/callback/video + callback-recognition-url: /third/third-ks/callback/recognition + callback-sku-url: /third/third-ks/callback/sku diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java index ca5938efe..136750a1a 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java @@ -330,32 +330,6 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importUserIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); - // 查询用户钱包 - WalletManageDto userWalletDto = new WalletManageDto(); - userWalletDto.setUserIds(importUserIds); - List userWalletList = walletManageMapper.joinList(userWalletDto); - for (WalletRechargeImportEntity i : importList) { - // 消费钱包 - WalletManageVo payWalletVo = userWalletList.stream() - .filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId()) && ObjectUtil.equals(j.getWalletTypeUniqueCode(), WalletTypeEnum.PAY.getCode())) - .findFirst().get(); - if (ObjectUtil.isEmpty(payWalletVo)) continue; - // 饭卡钱包 - WalletManageVo cardWalletVo = userWalletList.stream() - .filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId()) && ObjectUtil.equals(j.getWalletTypeUniqueCode(), WalletTypeEnum.EAT.getCode())) - .findFirst().get(); - if (ObjectUtil.isEmpty(cardWalletVo)) continue; - // 先判断消费钱包是不是够用 - int discountPrice = payWalletVo.getBalance() - i.getPrice(); - walletTransactionService.addWalletBalance(payWalletVo.getId(), payWalletVo.getBalance() * -1, String.valueOf(i.getId()), WalletBizEnum.BATCH); - if (discountPrice < 0) { - walletTransactionService.addWalletBalance(cardWalletVo.getId(), discountPrice, String.valueOf(i.getId()), WalletBizEnum.BATCH); - } - } - } // 同步到正元钱包状态 List userIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); if (ObjectUtil.isNotEmpty(userIds)) {