diff --git a/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java b/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java index 7fd0f38d..73debd58 100644 --- a/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java +++ b/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java @@ -12,9 +12,9 @@ public interface LauncherConstant { /** * nacos 命名空间 */ - String NACOS_NAMESPACE = "feaf627f-a847-463b-8b73-24a0538f526e"; +// String NACOS_NAMESPACE = "feaf627f-a847-463b-8b73-24a0538f526e"; // 生产环境 -// String NACOS_NAMESPACE = "db3f4da1-ae19-4104-8c17-6d9b8f069401"; + String NACOS_NAMESPACE = "db3f4da1-ae19-4104-8c17-6d9b8f069401"; // 测试环境 // String NACOS_NAMESPACE = "6cdd0310-0d61-4f54-891a-7fb06224d9b8"; @@ -32,6 +32,7 @@ public interface LauncherConstant { * nacos dev 地址 */ String NACOS_DEV_ADDR = "127.0.0.1:8848"; +// String NACOS_DEV_ADDR = "192.168.0.3:8848"; /** * nacos prod 地址 diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/BoxBinding.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/BoxBinding.java new file mode 100644 index 00000000..c82c5ed5 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/logistics/pojo/entity/BoxBinding.java @@ -0,0 +1,15 @@ +package org.springblade.desk.logistics.pojo.entity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; + +@Data +@Schema(description = "箱绑定接收表") +public class BoxBinding { + private String boxBarcode; + private ArrayList orderIdList; + private Long wcId; +} diff --git a/blade-service/blade-desk/pom.xml b/blade-service/blade-desk/pom.xml index f46d21ce..89f917c6 100644 --- a/blade-service/blade-desk/pom.xml +++ b/blade-service/blade-desk/pom.xml @@ -135,6 +135,12 @@ 4.6.0.RELEASE compile + + org.codehaus.jackson + jackson-mapper-asl + 1.9.13 + compile + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBoxController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBoxController.java index 4e2b546c..8958cea1 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBoxController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/controller/OrderBoxController.java @@ -1,4 +1,5 @@ package org.springblade.desk.logistics.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -6,10 +7,15 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.tool.api.R; +import org.springblade.desk.dashboard.pojo.entity.BsWorkCenterEntity; +import org.springblade.desk.dashboard.service.IBsWorkCenterService; +import org.springblade.desk.dashboard.wrapper.BsWorkCenterWrapper; +import org.springblade.desk.logistics.pojo.entity.BoxBinding; import org.springblade.desk.logistics.service.OrderBoxService; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; +import java.util.List; /** * 订单箱子 控制器 @@ -23,6 +29,7 @@ import java.math.BigDecimal; @Tag(name = "订单箱子", description = "订单箱子称重接口") public class OrderBoxController extends BladeController { private final OrderBoxService orderBoxService; + private final IBsWorkCenterService bsWorkCenterService; @PostMapping("/getWeighing") @@ -47,5 +54,32 @@ public class OrderBoxController extends BladeController { return orderBoxService.upholdOrderPartWeight(cardNo,new BigDecimal(actualWeight)); } + @GetMapping("/bs-list") + @ApiOperationSupport(order = 2) + @Operation( + summary = "获取作业中心", + description = "获取当前作业中心名称" + ) + public R getBSWORKCENTER(){ + return R.data(bsWorkCenterService.list(new LambdaQueryWrapper().eq(BsWorkCenterEntity::getIsDeleted, 0))); + } + @GetMapping("/box-binding") + @ApiOperationSupport(order = 3) + @Operation( + summary = "获取作业中心", + description = "获取当前作业中心名称" + ) + public R boxBinding(@RequestBody BoxBinding boxBinding){ + // 1.参数合法性校验 + if (boxBinding == null || boxBinding.getBoxBarcode().trim().isEmpty()) { + return R.fail("箱条码不能为空"); + } + if (boxBinding == null || boxBinding.getWcId()==null||boxBinding.getWcId()==0) { + return R.fail("箱条码不能为空"); + } + + return orderBoxService.boxBinding(boxBinding); + } + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/OrderBoxService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/OrderBoxService.java index 9937257f..f5ade60f 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/OrderBoxService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/OrderBoxService.java @@ -1,9 +1,13 @@ package org.springblade.desk.logistics.service; import org.springblade.core.tool.api.R; +import org.springblade.desk.logistics.pojo.entity.BoxBinding; import java.math.BigDecimal; public interface OrderBoxService { R upholdOrderPartWeight(String cardNo, BigDecimal actualWeight); + + R boxBinding(BoxBinding boxBinding); + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/OrderBoxServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/OrderBoxServiceImpl.java index 31268578..8b3da4a5 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/OrderBoxServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/OrderBoxServiceImpl.java @@ -1,17 +1,28 @@ package org.springblade.desk.logistics.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.api.R; import org.springblade.desk.jobtransfer.service.ICertificateMaintenanceService; +import org.springblade.desk.logistics.pojo.entity.BoxBinding; +import org.springblade.desk.logistics.pojo.entity.OrderBind; +import org.springblade.desk.logistics.pojo.entity.Task; +import org.springblade.desk.logistics.service.OrderBindService; import org.springblade.desk.logistics.service.OrderBoxService; +import org.springblade.desk.logistics.service.TaskService; import org.springblade.desk.order.pojo.entity.YieldOrder; import org.springblade.desk.order.service.IYieldOrderService; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 订单箱子 控制器 @@ -23,9 +34,25 @@ import java.util.List; @Slf4j public class OrderBoxServiceImpl implements OrderBoxService { private final IYieldOrderService yieldOrderService; + private final TaskService taskService; + private final OrderBindService orderBindService; + private final OrderBindService orderBindService; - public OrderBoxServiceImpl(IYieldOrderService yieldOrderService) { + public OrderBoxServiceImpl(IYieldOrderService yieldOrderService, TaskService taskService, OrderBindService orderBindService) { this.yieldOrderService = yieldOrderService; + this.taskService = taskService; + this.orderBindService = orderBindService; + } + private static final Set RUNNING_STATUSES = new HashSet<>(); + static { + RUNNING_STATUSES.add(Task.STATUS_STATION); + RUNNING_STATUSES.add(Task.STATUS_LOCATION); + RUNNING_STATUSES.add(Task.STATUS_WAITING); + RUNNING_STATUSES.add(Task.STATUS_BACK_TO_STORAGE); + } + private static final Set ORDER_STATUSES = new HashSet<>(); + static { + ORDER_STATUSES.add(OrderBind.STATUS_BOUND); } @Override @@ -39,4 +66,108 @@ public class OrderBoxServiceImpl implements OrderBoxService { return yieldOrderService.updateById(list.get(0))? R.success():R.fail("实际称重维护:卡号维护失败"); } + + @Override + public R boxBinding(BoxBinding boxBinding) { + log.info("接收到箱绑定实际参数:{}", boxBinding); + + // 1. 入参非空校验(基础防护) + if (boxBinding == null || boxBinding.getBoxBarcode() == null) { + log.warn("箱绑定参数为空或箱条码缺失"); + return R.fail("箱条码不能为空"); + } + String boxBarcode = boxBinding.getBoxBarcode(); + + // 2. 校验箱条码是否存在运行中的任务(封装为独立方法,提升可读性) + R taskCheckResult = checkBoxBarcodeRunningTask(boxBarcode); + if (!taskCheckResult.isSuccess()) { + return taskCheckResult; + } + + // 3. 校验订单是否已绑定(封装为独立方法) + R orderCheckResult = checkOrderIdBoundStatus(boxBinding.getOrderIdList()); + if (!orderCheckResult.isSuccess()) { + return orderCheckResult; + } + //TODO:判断班次与库位记得写 + + //5.保存记录到数据库中 + Task task = new Task(); + task.setBoxBarcode(boxBinding.getBoxBarcode()); + task.setTaskStatus(1); + + task.set + return null; + } + /** + * 校验箱条码是否存在运行中的任务 + */ + private R checkBoxBarcodeRunningTask(String boxBarcode) { + // 查询箱条码对应的任务(MyBatis-Plus的list方法返回空列表,非null,无需判null) + List taskList = taskService.list( + new LambdaQueryWrapper().eq(Task::getBoxBarcode, boxBarcode) + ); + + // 无任务数据,直接通过校验 + if (CollectionUtils.isEmpty(taskList)) { + return R.success(); + } + + // 判断是否有运行中的任务(流式操作简化,无冗余map) + boolean hasRunningTask = taskList.stream() + .map(Task::getTaskStatus) + .filter(status -> status != null) // 过滤null状态,避免NPE + .anyMatch(RUNNING_STATUSES::contains); + + if (hasRunningTask) { + log.warn("箱条码{}存在运行中的任务,绑定异常", boxBarcode); + return R.fail("该箱条码在运行中,箱条码异常"); + } + return R.success(); + } + + + /** + * 校验订单号是否已绑定(核心优化:减少遍历次数,流式收集数据) + */ + private R checkOrderIdBoundStatus(List orderIdList) { + // 无订单号,直接通过校验 + if (CollectionUtils.isEmpty(orderIdList)) { + return R.success(); + } + + // 查询订单绑定记录 + List orderBindList = orderBindService.list( + new LambdaQueryWrapper().in(OrderBind::getOrderId, orderIdList) + ); + if (CollectionUtils.isEmpty(orderBindList)) { + return R.success(); + } + + // 步骤1:过滤出已绑定的订单ID(流式收集,替代循环) + List boundOrderIds = orderBindList.stream() + .filter(orderBind -> OrderBind.STATUS_BOUND.equals(orderBind.getBindingStatus())) + .map(OrderBind::getOrderId) + .filter(orderId -> orderId != null) // 过滤null订单ID + .distinct() // 去重,避免重复查询 + .collect(Collectors.toList()); + + // 无已绑定订单,直接通过 + if (CollectionUtils.isEmpty(boundOrderIds)) { + return R.success(); + } + + // 步骤2:查询已绑定订单对应的流程卡号(流式收集,替代循环) + List boundCardNos = yieldOrderService.list( + new LambdaQueryWrapper().in(YieldOrder::getId, boundOrderIds) + ).stream() + .map(YieldOrder::getCardNo) + .filter(cardNo -> cardNo != null) // 过滤null卡号 + .collect(Collectors.toList()); + + // 构造异常信息并返回 + String errorMsg = String.format("以下流程卡号处于绑定状态,绑定异常:{%s}", String.join(",", boundCardNos)); + log.warn(errorMsg); + return R.fail(errorMsg); + } }