From dd13549d38a6d1bbb6d300fddfc4b4e7067fae9a Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Tue, 22 Jul 2025 18:04:31 +0800 Subject: [PATCH] =?UTF-8?q?add:=E6=9C=A8=E7=AE=B1=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lms/nladmin-system/.gitignore | 13 + .../BstIvtBoxStockUpPlanController.java | 19 ++ .../BstIvtBoxstacklayerController.java | 34 --- .../bst/ivt/boxstack/enums/BoxStackEnum.java | 6 +- .../service/IBstIvtBoxStockUpPlanService.java | 15 ++ .../service/IBstIvtBoxstacklayerService.java | 17 -- ...cklayer.java => BstIvtBoxStockUpPlan.java} | 35 ++- .../boxstack/service/dao/BstIvtBoxstack.java | 5 + .../mapper/BstIvtBoxStockUpPlanMapper.java | 9 + ...per.xml => BstIvtBoxStockUpPlanMapper.xml} | 2 +- .../dao/mapper/BstIvtBoxstacklayerMapper.java | 10 - ...rDto.java => BstIvtBoxStockUpPlanDto.java} | 28 ++- ...ry.java => BstIvtBoxStockUpPlanQuery.java} | 2 +- ...yerVo.java => BstIvtBoxStockUpPlanVo.java} | 2 +- .../service/dto/BstIvtBoxstackDto.java | 5 + .../service/dto/BstIvtBoxstackQuery.java | 4 + .../impl/BstIvtBoxStockUpPlanServiceImpl.java | 24 ++ .../impl/BstIvtBoxstackServiceImpl.java | 188 ++++++++------ .../impl/BstIvtBoxstacklayerServiceImpl.java | 27 -- .../impl/BoxStackInOutServiceImpl.java | 236 +++++++++++++----- .../sch/task/service/IschBaseTaskService.java | 28 ++- .../service/impl/SchBaseTaskServiceImpl.java | 8 + .../nl/b_lms/sch/tasks/boxstack/MxInTask.java | 59 +++-- .../b_lms/sch/tasks/boxstack/MxMoveTask.java | 42 ++-- .../tasks/boxstack/auto/AutoMxMoveTask.java | 48 +++- .../dao/mapper/BstIvtBoxinfoMapper.xml | 105 ++++---- .../wms/ext/acs/rest/AcsToWmsController.java | 15 ++ .../wms/ext/acs/service/AcsToWmsService.java | 56 +++-- .../acs/service/impl/AcsToWmsServiceImpl.java | 72 +++++- .../resources/config/application-localDev.yml | 235 +++++++++++++++++ .../src/main/resources/config/application.yml | 2 +- .../src/main/resources/logback-spring.xml | 32 +++ .../src/views/wms/pdm/ivt/boxstack/index.vue | 130 ++++++---- 33 files changed, 1098 insertions(+), 415 deletions(-) create mode 100644 lms/nladmin-system/.gitignore create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxStockUpPlanController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxStockUpPlanService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java rename lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/{BstIvtBoxstacklayer.java => BstIvtBoxStockUpPlan.java} (61%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.java rename lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/{BstIvtBoxstacklayerMapper.xml => BstIvtBoxStockUpPlanMapper.xml} (87%) delete mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java rename lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/{BstIvtBoxstacklayerDto.java => BstIvtBoxStockUpPlanDto.java} (60%) rename lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/{BstIvtBoxstacklayerQuery.java => BstIvtBoxStockUpPlanQuery.java} (77%) rename lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/{BstIvtBoxstacklayerVo.java => BstIvtBoxStockUpPlanVo.java} (78%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxStockUpPlanServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java create mode 100644 lms/nladmin-system/src/main/resources/config/application-localDev.yml diff --git a/lms/nladmin-system/.gitignore b/lms/nladmin-system/.gitignore new file mode 100644 index 0000000..396a121 --- /dev/null +++ b/lms/nladmin-system/.gitignore @@ -0,0 +1,13 @@ +### IDEA ### +*/*.log +.idea/* +*.iml +*/target/* +*/*.iml +/.gradle/ +/target/* +*/application-dev.yml +nlsso-server/src/main/java/org/nl/common/constant/ +nlsso-server/src/main/java/org/nl/common/core/ +/C:* +/D:* \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxStockUpPlanController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxStockUpPlanController.java new file mode 100644 index 0000000..8491fa8 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxStockUpPlanController.java @@ -0,0 +1,19 @@ +package org.nl.b_lms.bst.ivt.boxstack.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxStockUpPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Slf4j +@RestController +@RequestMapping("/api/bstIvtBoxStockUpPlan") +public class BstIvtBoxStockUpPlanController { + +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java deleted file mode 100644 index fc7b5f2..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/controller/BstIvtBoxstacklayerController.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.nl.b_lms.bst.ivt.boxstack.controller; - -import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; -import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; -import org.nl.common.domain.query.PageQuery; -import org.nl.modules.logging.annotation.Log; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @Description TODO - * @Author Gengby - * @Date 2025/7/8 - */ -@Slf4j -@RestController -@RequestMapping("/api/bstIvtboxstacklayer") -public class BstIvtBoxstacklayerController { - - @Autowired - private IBstIvtBoxstacklayerService boxstacklayerService; - - @GetMapping("/getBoxLayer/{stackId}") - @Log("根据堆叠位ID查询堆叠位层数详情") - public ResponseEntity query(@PathVariable String stackId) { - return new ResponseEntity<>(boxstacklayerService.getByStackId(stackId), HttpStatus.OK); - } -} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java index 8d75624..c7aa989 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/enums/BoxStackEnum.java @@ -29,8 +29,12 @@ public enum BoxStackEnum { AGV_SYSTEM_TYPE(MapOf.of("1楼诺宝任务", "1", "2楼1区域AGV系统", "2", "1楼叉车任务", "3")), //木箱库位启用状态 IS_USED(MapOf.of("启用", "1", "未启用", "0")), + //是否 + IS_OK(MapOf.of("是", "1", "否", "0")), + //备货计划状态 + STOCK_UP_STATUS(MapOf.of("未开始", "1", "执行中", "2", "完成", "3")), //木箱库区域 - POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3")); + POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3", "出库区", "4", "等待区", "5")); private Map code; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxStockUpPlanService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxStockUpPlanService.java new file mode 100644 index 0000000..8887c8a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxStockUpPlanService.java @@ -0,0 +1,15 @@ +package org.nl.b_lms.bst.ivt.boxstack.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +public interface IBstIvtBoxStockUpPlanService extends IService { + + +// List getByStackId(String stackId); +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java deleted file mode 100644 index fee2ad7..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/IBstIvtBoxstacklayerService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.nl.b_lms.bst.ivt.boxstack.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; - -import java.util.List; - -/** - * @Description TODO - * @Author Gengby - * @Date 2025/7/8 - */ -public interface IBstIvtBoxstacklayerService extends IService { - - - List getByStackId(String stackId); -} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstacklayer.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java similarity index 61% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstacklayer.java rename to lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java index afa4689..209c216 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstacklayer.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java @@ -15,31 +15,46 @@ import java.io.Serializable; */ @Data @EqualsAndHashCode(callSuper = false) -@TableName("bst_ivt_boxstacklayer") -public class BstIvtBoxstacklayer implements Serializable { +@TableName("bst_ivt_boxstockup_plan") +public class BstIvtBoxStockUpPlan implements Serializable { private static final long serialVersionUID = 1L; /** * 主键id */ - @TableId(value = "stack_layer_id", type = IdType.NONE) - private String stack_layer_id; + @TableId(value = "stockup_plan_id", type = IdType.NONE) + private String stockup_plan_id; /** - * 堆叠位id + * 木箱规格 */ - private String stack_id; + private String box_spec; /** - * 木箱编码 + * 木箱规格名称 */ - private String box_code; + private String box_spec_name; /** - * 层号 + * 备货数量 */ - private Integer layer_index; + private Integer stock_up_num; + + /** + * 备货日期 yyyy-MM-dd + */ + private String stock_plan_time; + + /** + * 是否已经进行备货 1、未开始 2、执行中 3、完成 + */ + private String stock_plan_status; + + /** + * 备注 + */ + private String remark; /** * 创建人id diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java index 42b722d..1d8d7cd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxstack.java @@ -56,6 +56,11 @@ public class BstIvtBoxstack implements Serializable { */ private String box_spec; + /** + * 木箱编码,多个以,分割 + */ + private String box_no; + /** * 排 */ diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.java new file mode 100644 index 0000000..5e4f50a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.java @@ -0,0 +1,9 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; + + +public interface BstIvtBoxStockUpPlanMapper extends BaseMapper { + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml similarity index 87% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.xml rename to lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml index b6585a1..dbe59be 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml @@ -1,5 +1,5 @@ - + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java deleted file mode 100644 index 58a3c8a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstacklayerMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; - - -public interface BstIvtBoxstacklayerMapper extends BaseMapper { - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java similarity index 60% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerDto.java rename to lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java index 34b2eb0..9c4ccfe 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java @@ -1,6 +1,5 @@ package org.nl.b_lms.bst.ivt.boxstack.service.dto; -import lombok.Builder; import lombok.Data; import java.io.Serializable; @@ -11,23 +10,34 @@ import java.io.Serializable; * @Date 2025/7/8 */ @Data -public class BstIvtBoxstacklayerDto implements Serializable { - private String stack_layer_id; +public class BstIvtBoxStockUpPlanDto implements Serializable { + + private String stockup_plan_id; + + /** + * 木箱规格 + */ + private String box_spec; + + /** + * 木箱规格名称 + */ + private String box_spec_name; /** - * 堆叠位id + * 备货数量 */ - private String stack_id; + private Integer stock_up_num; /** - * 木箱编码 + * 备货日期 yyyy-MM-dd */ - private String box_code; + private String stock_plan_time; /** - * 层号 + * 是否已经进行备货 0否 1是 */ - private Integer layer_index; + private String stock_plan_status; /** * 创建人id diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java similarity index 77% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerQuery.java rename to lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java index a50d940..95ed800 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java @@ -8,5 +8,5 @@ import lombok.Data; * @Date 2025/7/8 */ @Data -public class BstIvtBoxstacklayerQuery { +public class BstIvtBoxStockUpPlanQuery { } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerVo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanVo.java similarity index 78% rename from lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerVo.java rename to lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanVo.java index 2287b91..f0151dc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstacklayerVo.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanVo.java @@ -8,5 +8,5 @@ import lombok.Data; * @Date 2025/7/8 */ @Data -public class BstIvtBoxstacklayerVo { +public class BstIvtBoxStockUpPlanVo { } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java index 878eac3..40b1c98 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackDto.java @@ -42,6 +42,11 @@ public class BstIvtBoxstackDto implements Serializable { */ private String point_status; + /** + * 木箱编号 + */ + private String box_no; + /** * 木箱规格(物料编码) */ diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java index 60ed6d9..a926908 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxstackQuery.java @@ -18,6 +18,10 @@ public class BstIvtBoxstackQuery { * 区域 */ private String point_status; + /** + * 木箱编码 + */ + private String box_no; /** * 木箱规格 */ diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxStockUpPlanServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxStockUpPlanServiceImpl.java new file mode 100644 index 0000000..d6d8f6c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxStockUpPlanServiceImpl.java @@ -0,0 +1,24 @@ +package org.nl.b_lms.bst.ivt.boxstack.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxStockUpPlanService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxStockUpPlanMapper; +import org.springframework.stereotype.Service; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/7/8 + */ +@Slf4j +@Service +public class BstIvtBoxStockUpPlanServiceImpl extends ServiceImpl implements IBstIvtBoxStockUpPlanService { + +// @Override +// public List getByStackId(String stackId) { +// return this.list(new LambdaQueryWrapper().eq(BstIvtBoxStockUpPlan::getStack_id, stackId)); +// } + +} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java index c6c6a62..19e5d3b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstackServiceImpl.java @@ -11,9 +11,9 @@ import com.github.pagehelper.PageHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; -import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxStockUpPlanService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstackMapper; import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackDto; import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackQuery; @@ -45,8 +45,6 @@ public class BstIvtBoxstackServiceImpl extends ServiceImpl().eq(BstIvtBoxinfo::getBox_no, boxNo)); + if (ObjectUtil.isNull(boxinfo)) { + throw new BadRequestException("木箱码:" + boxNo + "在木箱信息表中不存在"); + } + } + boxstack.setCurrent_layer_count(boxNos.length); } String currentUserId = SecurityUtils.getCurrentUserId(); String currentNickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - BstIvtBoxstack boxstack = new BstIvtBoxstack(); boxstack.setStack_id(IdUtil.getStringId()); boxstack.setStack_code(entity.getStack_code()); boxstack.setStack_name(entity.getStack_name()); - boxstack.setCurrent_layer_count(entity.getCurrent_layer_count()); + boxstack.setBox_no(entity.getBox_no()); boxstack.setMax_layer_count(entity.getMax_layer_count()); boxstack.setPoint_status(entity.getPoint_status()); boxstack.setBox_spec(entity.getBox_spec()); @@ -82,16 +101,6 @@ public class BstIvtBoxstackServiceImpl extends ServiceImpl().eq(BstIvtBoxinfo::getBox_no, boxNo)); + if (ObjectUtil.isNull(boxinfo)) { + throw new BadRequestException("木箱码:" + boxNo + "在木箱信息表中不存在"); + } + } + boxstack.setCurrent_layer_count(boxNos.length); + } + boxstack.setBox_spec(entity.getBox_spec()); + boxstack.setBox_no(entity.getBox_no()); boxstack.setStack_code(entity.getStack_code()); boxstack.setStack_name(entity.getStack_name()); boxstack.setPoint_status(entity.getPoint_status()); @@ -115,71 +146,70 @@ public class BstIvtBoxstackServiceImpl extends ServiceImpl ids) { boxstackMapper.deleteBatchIds(ids); - boxstacklayerService.remove(new LambdaQueryWrapper().in(BstIvtBoxstacklayer::getStack_id, ids)); } @Override @Transactional(rollbackFor = Exception.class) public void saveBoxStack(JSONObject reqParam) { - String box_spec = reqParam.getString("box_spec"); - String stack_id = reqParam.getString("stack_id"); - JSONArray layers = reqParam.getJSONArray("tableData"); - int current_layer_count = reqParam.getIntValue("current_layer_count"); - boolean hasBoxSpec = StringUtils.isNotBlank(box_spec); - - List boxCodes = layers.stream() - .map(obj -> { - if (obj instanceof JSONObject) { - return ((JSONObject) obj).getString("box_code"); - } else if (obj instanceof Map) { - return (String) ((Map) obj).get("box_code"); - } - return null; - }) - .collect(Collectors.toList()); - boolean allBoxCodesEmpty = boxCodes.stream() - .allMatch(code -> StringUtils.isBlank(code)); - boolean anyBoxCodeNotEmpty = boxCodes.stream() - .anyMatch(code -> StringUtils.isNotBlank(code)); - - if (!hasBoxSpec && anyBoxCodeNotEmpty) { - throw new BadRequestException("木箱规格为空,但是木箱条码不为空"); - } - if (hasBoxSpec && allBoxCodesEmpty) { - throw new BadRequestException("木箱规格不为空,但是木箱条码全部为空"); - } - String now = DateUtil.now(); - String currentNickName = SecurityUtils.getCurrentNickName(); - String currentUserId = SecurityUtils.getCurrentUserId(); - for (int i = 0; i < layers.size(); i++) { - JSONObject layer = layers.getJSONObject(i); - String stack_layer_id = layer.getString("stack_layer_id"); - String box_code = layer.getString("box_code"); - if (StringUtils.isNotBlank(box_code)) { - BstIvtBoxinfo boxinfo = boxinfoService.getOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, box_code)); - if (ObjectUtil.isEmpty(boxinfo)) { - throw new BadRequestException("请核对木箱号, 木箱号:" + box_code + "在木箱信息表中不存在"); - } - } - BstIvtBoxstacklayer boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() - .eq(BstIvtBoxstacklayer::getStack_layer_id, stack_layer_id)); - if (!ObjectUtil.isEmpty(boxstacklayer)) { - boxstacklayer.setBox_code(box_code); - boxstacklayer.setUpdate_time(now); - boxstacklayer.setUpdate_id(currentUserId); - boxstacklayer.setUpdate_name(currentNickName); - boxstacklayerService.updateById(boxstacklayer); - } - } - BstIvtBoxstack boxstack = this.getOne(new LambdaQueryWrapper() - .eq(BstIvtBoxstack::getStack_id, stack_id)); - if (!ObjectUtil.isEmpty(boxstack)) { - boxstack.setBox_spec(box_spec); - boxstack.setCurrent_layer_count(current_layer_count); - boxstack.setUpdate_time(now); - boxstack.setUpdate_id(currentUserId); - boxstack.setUpdate_name(currentNickName); - this.updateById(boxstack); - } +// String box_spec = reqParam.getString("box_spec"); +// String stack_id = reqParam.getString("stack_id"); +// JSONArray layers = reqParam.getJSONArray("tableData"); +// int current_layer_count = reqParam.getIntValue("current_layer_count"); +// boolean hasBoxSpec = StringUtils.isNotBlank(box_spec); +// +// List boxCodes = layers.stream() +// .map(obj -> { +// if (obj instanceof JSONObject) { +// return ((JSONObject) obj).getString("box_code"); +// } else if (obj instanceof Map) { +// return (String) ((Map) obj).get("box_code"); +// } +// return null; +// }) +// .collect(Collectors.toList()); +// boolean allBoxCodesEmpty = boxCodes.stream() +// .allMatch(code -> StringUtils.isBlank(code)); +// boolean anyBoxCodeNotEmpty = boxCodes.stream() +// .anyMatch(code -> StringUtils.isNotBlank(code)); +// +// if (!hasBoxSpec && anyBoxCodeNotEmpty) { +// throw new BadRequestException("木箱规格为空,但是木箱条码不为空"); +// } +// if (hasBoxSpec && allBoxCodesEmpty) { +// throw new BadRequestException("木箱规格不为空,但是木箱条码全部为空"); +// } +// String now = DateUtil.now(); +// String currentNickName = SecurityUtils.getCurrentNickName(); +// String currentUserId = SecurityUtils.getCurrentUserId(); +// for (int i = 0; i < layers.size(); i++) { +// JSONObject layer = layers.getJSONObject(i); +// String stack_layer_id = layer.getString("stack_layer_id"); +// String box_code = layer.getString("box_code"); +// if (StringUtils.isNotBlank(box_code)) { +// BstIvtBoxinfo boxinfo = boxinfoService.getOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, box_code)); +// if (ObjectUtil.isEmpty(boxinfo)) { +// throw new BadRequestException("请核对木箱号, 木箱号:" + box_code + "在木箱信息表中不存在"); +// } +// } +// BstIvtBoxStockUpPlan boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() +// .eq(BstIvtBoxStockUpPlan::getStack_layer_id, stack_layer_id)); +// if (!ObjectUtil.isEmpty(boxstacklayer)) { +// boxstacklayer.setBox_code(box_code); +// boxstacklayer.setUpdate_time(now); +// boxstacklayer.setUpdate_id(currentUserId); +// boxstacklayer.setUpdate_name(currentNickName); +// boxstacklayerService.updateById(boxstacklayer); +// } +// } +// BstIvtBoxstack boxstack = this.getOne(new LambdaQueryWrapper() +// .eq(BstIvtBoxstack::getStack_id, stack_id)); +// if (!ObjectUtil.isEmpty(boxstack)) { +// boxstack.setBox_spec(box_spec); +// boxstack.setCurrent_layer_count(current_layer_count); +// boxstack.setUpdate_time(now); +// boxstack.setUpdate_id(currentUserId); +// boxstack.setUpdate_name(currentNickName); +// this.updateById(boxstack); +// } } } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java deleted file mode 100644 index 6f43d03..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/impl/BstIvtBoxstacklayerServiceImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.nl.b_lms.bst.ivt.boxstack.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.extern.slf4j.Slf4j; -import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxstacklayerMapper; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * @Description TODO - * @Author Gengby - * @Date 2025/7/8 - */ -@Slf4j -@Service -public class BstIvtBoxstacklayerServiceImpl extends ServiceImpl implements IBstIvtBoxstacklayerService { - - @Override - public List getByStackId(String stackId) { - return this.list(new LambdaQueryWrapper().eq(BstIvtBoxstacklayer::getStack_id, stackId)); - } - -} \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java index 523b306..a8a1a29 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/impl/BoxStackInOutServiceImpl.java @@ -1,31 +1,32 @@ package org.nl.b_lms.pda.service.impl; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.SneakyThrows; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; import org.nl.b_lms.pda.service.BoxStackInOutService; -import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.service.IschBaseTaskService; import org.nl.b_lms.sch.tasks.boxstack.MxInTask; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo; import org.nl.modules.common.exception.BadRequestException; +import org.nl.system.service.param.ISysParamService; +import org.nl.system.service.param.dao.Param; import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.service.dto.PointDto; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * @Description TODO @@ -47,90 +48,197 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { private IschBaseTaskService taskService; @Resource private IBstIvtBoxstackService boxstackService; + @Resource + private ISysParamService paramService; @SneakyThrows @Override public void boxIn(JSONObject reqParam) { - String point_code = reqParam.getString("point_code"); - if (StringUtils.isBlank(point_code)) { + String pointCode = reqParam.getString("point_code"); + if (StringUtils.isBlank(pointCode)) { throw new BadRequestException("请输入入库点位"); } - PointDto pointDto = pointService.findByCode(point_code); - if (ObjectUtil.isEmpty(pointDto)) { - throw new BadRequestException("入库点位不存在"); - } - String vehicle_code = reqParam.getString("vehicle_code"); - if (StringUtils.isBlank(vehicle_code)) { + Optional.ofNullable(pointService.findByCode(pointCode)) + .orElseThrow(() -> new BadRequestException("入库点位不存在")); + + String vehicleCodeStr = reqParam.getString("vehicle_code"); + if (StringUtils.isBlank(vehicleCodeStr)) { throw new BadRequestException("请输入木箱号"); } - String[] vehicle_codes = vehicle_code.split(","); - List box_specs = new ArrayList<>(); - for (String vehicle_code1 : vehicle_codes) { - if (StringUtils.isBlank(vehicle_code1)) { - BstIvtBoxinfo boxinfo = boxinfoService.getOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, vehicle_code1)); + String[] vehicleCodes = vehicleCodeStr.split(","); + List boxSpecs = new ArrayList<>(); + + for (String boxNo : vehicleCodes) { + if (StringUtils.isNotBlank(boxNo)) { + BstIvtBoxinfo boxinfo = boxinfoService.getOne( + new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, boxNo)); if (ObjectUtil.isEmpty(boxinfo)) { - throw new BadRequestException("木箱号:" + vehicle_code1 + "不存在"); + throw new BadRequestException("木箱号: " + boxNo + " 不存在"); } - box_specs.add(boxinfo.getMaterial_code()); + boxSpecs.add(boxinfo.getMaterial_code()); } } - String firstMaterial = box_specs.get(0); - boolean allMatch = box_specs.stream().allMatch(code -> code.equals(firstMaterial)); + + if (boxSpecs.isEmpty()) { + throw new BadRequestException("未检测到有效木箱号"); + } + + String firstMaterial = boxSpecs.get(0); + boolean allMatch = boxSpecs.stream().allMatch(code -> code.equals(firstMaterial)); if (!allMatch) { throw new BadRequestException("木箱规格不一致"); } + + String boxAreaRelationStr = Optional.ofNullable(paramService.findByCode("box_area_relation")) + .map(Param::getValue) + .orElseThrow(() -> new BadRequestException("请配置木箱规格区域对应关系")); + + JSONObject boxAreaRelationJSON = JSONObject.parseObject(boxAreaRelationStr); + String boxArea = boxAreaRelationJSON.getString(firstMaterial); + if (StringUtils.isBlank(boxArea)) { + throw new BadRequestException("请配置木箱规格: " + firstMaterial + " 的区域"); + } + RLock lock = redissonClient.getLock("boxIn"); boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); try { - if (tryLock) { - //查询第一排非缓存区的并且无货的库位 - List noHasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() + if (!tryLock) { + throw new BadRequestException("系统繁忙,请稍后重试"); + } + + if (StrUtil.equals(boxArea, BoxStackEnum.POINT_STATUS.code("零散区"))) { + handleLooseAreaIn(pointCode, firstMaterial, vehicleCodeStr); + } else if (StrUtil.equals(boxArea, BoxStackEnum.POINT_STATUS.code("密集区"))) { + handleDenseAreaIn(pointCode, firstMaterial, vehicleCodeStr); + } else { + throw new BadRequestException("不支持的区域配置: " + boxArea); + } + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + private void handleLooseAreaIn(String pointCode, String firstMaterial, String vehicleCodeStr) { + List emptyLoosePoints = boxstackService.list( + new LambdaQueryWrapper() .isNull(BstIvtBoxstack::getBox_spec) - .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("零散区")) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + ); + if (CollectionUtils.isEmpty(emptyLoosePoints)) { + throw new BadRequestException("该木箱规格在零散区未找到可用库位"); + } + + for (BstIvtBoxstack stack : emptyLoosePoints) { + if (CollectionUtils.isEmpty(taskService.checkHaveTask(stack.getStack_code()))) { + JSONObject taskParam = buildTaskParam(firstMaterial, vehicleCodeStr, + BoxStackEnum.AGV_ACTION_TYPE.code("普通任务"), + BoxStackEnum.TASK_TYPE.code("木箱入库"), + pointCode, stack.getStack_code()); + mxInTask.createTask(taskParam); + return; + } + } + throw new BadRequestException("零散区无可用库位可执行任务,请稍后重试"); + } + + private void handleDenseAreaIn(String pointCode, String firstMaterial, String vehicleCodeStr) { + List firstRowWithMaterial = boxstackService.list( + new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getBox_spec, firstMaterial) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区")) .eq(BstIvtBoxstack::getX, 1) - .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); - //判断是否满足最大数量,如果不满足 - if (noHasGoodsPointList.size() <= 3) { - //获取相同木箱规格的的第一排的库位 - List hasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() - .eq(BstIvtBoxstack::getBox_spec, firstMaterial) - .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) - .eq(BstIvtBoxstack::getX, 1) - .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); - //遍历相同木箱规格同列不同排的库位是否大于最大数量 - int currentCanUseCount = 0; - for (BstIvtBoxstack bstIvtBoxstack : hasGoodsPointList) { - Integer x = bstIvtBoxstack.getX(); - Integer y = bstIvtBoxstack.getY(); - List list = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + ); + + if (!CollectionUtils.isEmpty(firstRowWithMaterial)) { + for (BstIvtBoxstack stack : firstRowWithMaterial) { + Integer y = stack.getY(); + + List emptyPointsInColumn = boxstackService.list( + new LambdaQueryWrapper() .isNull(BstIvtBoxstack::getBox_spec) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区")) + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + ); + + if (CollectionUtils.isEmpty(emptyPointsInColumn)) continue; + + List emptyStackCodes = emptyPointsInColumn.stream() + .map(BstIvtBoxstack::getStack_code) + .collect(Collectors.toList()); + + BstIvtBoxstack waitPoint = boxstackService.getOne( + new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("等待区")) .eq(BstIvtBoxstack::getY, y) .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) - .notIn(BstIvtBoxstack::getX, x) - .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区"))); - currentCanUseCount += list.size(); - } - if (currentCanUseCount <= 3) { - List taskTypes = new ArrayList<>(Collections.singletonList(BoxStackEnum.TASK_TYPE.code("木箱入库"))); - List existTask = taskService.getExistTasks(taskTypes); - if (existTask.size() >= 3) { - throw new BadRequestException("木箱入库任务超过最大数量"); - } - } + ); + + if (waitPoint == null) continue; + + int waitingTasks = taskService.checkHaveTaskByNext(Arrays.asList(waitPoint.getStack_code())).size(); + int assignTasks = taskService.checkHaveTaskByNext(emptyStackCodes).size(); + + if (emptyPointsInColumn.size() > waitingTasks + assignTasks) { + JSONObject taskParam = buildTaskParam(firstMaterial, vehicleCodeStr, + BoxStackEnum.AGV_ACTION_TYPE.code("放货二次分配"), + BoxStackEnum.TASK_TYPE.code("木箱入库"), + pointCode, waitPoint.getStack_code()); + mxInTask.createTask(taskParam); + return; } - JSONObject taskParam = new JSONObject(); - taskParam.put("material_code", box_specs.get(0)); - taskParam.put("vehicle_code", vehicle_code); - taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("放货二次分配")); - taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱入库")); - taskParam.put("point_code1", point_code); - taskParam.put("point_code2", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点1")); - mxInTask.createTask(reqParam); - } - } finally { - if (lock.isLocked() && lock.isHeldByCurrentThread()) { - lock.unlock(); } } + + List firstRowEmpty = boxstackService.list( + new LambdaQueryWrapper() + .isNull(BstIvtBoxstack::getBox_spec) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0) + .eq(BstIvtBoxstack::getX, 1) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区")) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + ); + + if (CollectionUtils.isEmpty(firstRowEmpty)) { + throw new BadRequestException("无可用货位,请稍后入库"); + } + + BstIvtBoxstack selectedStack = firstRowEmpty.get(0); + BstIvtBoxstack waitPoint = boxstackService.getOne( + new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("等待区")) + .eq(BstIvtBoxstack::getY, selectedStack.getY()) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + ); + + if (waitPoint == null) { + throw new BadRequestException("未找到对应等待区位置,请检查配置"); + } + + JSONObject taskParam = buildTaskParam(firstMaterial, vehicleCodeStr, + BoxStackEnum.AGV_ACTION_TYPE.code("放货二次分配"), + BoxStackEnum.TASK_TYPE.code("木箱入库"), + pointCode, waitPoint.getStack_code()); + mxInTask.createTask(taskParam); } + + private JSONObject buildTaskParam(String materialCode, String vehicleCode, + String vehicleCode2, String taskType, + String pointCode1, String pointCode2) { + JSONObject obj = new JSONObject(); + obj.put("material_code", materialCode); + obj.put("vehicle_code", vehicleCode); + obj.put("vehicle_code2", vehicleCode2); + obj.put("task_type", taskType); + obj.put("point_code1", pointCode1); + obj.put("point_code2", pointCode2); + return obj; + } + } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java index b80458b..f2c72d9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/IschBaseTaskService.java @@ -56,6 +56,7 @@ public interface IschBaseTaskService extends IService { /** * 获取下发的任务 + * * @param thisClass 类 * @return / */ @@ -63,6 +64,7 @@ public interface IschBaseTaskService extends IService { /** * 检测点位编码是否存在任务 + * * @param code 点位编码 * @return 任务 */ @@ -77,14 +79,14 @@ public interface IschBaseTaskService extends IService { List getTaskByPlanQzzNoAndDevice(String resourceName); - /** - *校验相同任务类型 + * 校验相同任务类型 */ List getExistTasks(List taskTypes); /** * 查找暂存位置是否有任务,包括桁架任务 + * * @param point / * @return / */ @@ -92,6 +94,7 @@ public interface IschBaseTaskService extends IService { /** * 判断是否有起点未完成的任务 + * * @param pointCode * @return */ @@ -101,12 +104,15 @@ public interface IschBaseTaskService extends IService { /** * 获取可以使用的任务数组 + * * @param handleClass 任务类 * @return */ List getTaskingByHandleClass(String handleClass); + /** * 获取可以使用的任务数组Object + * * @param handleClass 任务类 * @return */ @@ -114,6 +120,7 @@ public interface IschBaseTaskService extends IService { /** * 根据单据id获取执行中的任务 + * * @param iostorinvId * @return */ @@ -121,28 +128,39 @@ public interface IschBaseTaskService extends IService { /** * 根据条件获取任务数据 + * * @param taskLam 条件 - * @param flag 是否抛出异常 {@code true} 查询到多条会抛出异常,{@code false} 查询多条获取第一条 + * @param flag 是否抛出异常 {@code true} 查询到多条会抛出异常,{@code false} 查询多条获取第一条 * @return 一条数据SchBaseTask 或 {@code null} */ JSONObject getTaskObject(LambdaQueryWrapper taskLam, boolean flag); /** * 根据ids获取任务 + * * @param taskIds 标识数组 - * @param flag 是否判断没有删除的任务 + * @param flag 是否判断没有删除的任务 * @return */ List getTaskByIds(List taskIds, boolean flag); /** * 根据ids获取任务 + * * @param taskIds 标识数组 - * @param flag 是否判断没有删除的任务 + * @param flag 是否判断没有删除的任务 * @return */ List getTaskByIdsToObject(List taskIds, boolean flag); + + /** + * 查询point2的任务 + * + * @param noHasGoodsPointCodeList + * @return + */ + List checkHaveTaskByNext(List noHasGoodsPointCodeList); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java index d7a9d33..ccc8fc2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -245,6 +245,14 @@ public class SchBaseTaskServiceImpl extends ServiceImpl (JSONObject) JSON.toJSON(task)); } + @Override + public List checkHaveTaskByNext(List noHasGoodsPointCodeList) { + LambdaQueryWrapper lqw = new QueryWrapper().lambda(); + lqw.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .and(la -> la.in(SchBaseTask::getPoint_code2, noHasGoodsPointCodeList)); + return list(lqw); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java index 9956b3f..009ed2a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxInTask.java @@ -11,11 +11,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; -import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.dto.SchBaseTaskVO; import org.nl.b_lms.sch.task.service.IschBaseTaskService; @@ -34,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @@ -53,8 +53,6 @@ public class MxInTask extends AbstractAcsTask { private IschBaseTaskService taskService; @Resource private IBstIvtBoxstackService boxstackService; - @Resource - private IBstIvtBoxstacklayerService boxstacklayerService; @Override public List addTask() { @@ -111,20 +109,8 @@ public class MxInTask extends AbstractAcsTask { BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() .eq(BstIvtBoxstack::getStack_code, schBaseTask.getPoint_code2())); if (!ObjectUtil.isEmpty(boxstack)) { - for (int i = 0; i < boxNos.length; i++) { - //修改每层的木箱号信息 - String boxNo = boxNos[i]; - BstIvtBoxstacklayer boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() - .eq(BstIvtBoxstacklayer::getStack_id, boxstack.getStack_id()) - .eq(BstIvtBoxstacklayer::getLayer_index, i + 1)); - if (!ObjectUtil.isEmpty(boxstacklayer)) { - boxstacklayer.setBox_code(boxNo); - boxstacklayer.setUpdate_time(now); - boxstacklayer.setUpdate_id(currentUserId); - boxstacklayer.setUpdate_name(currentNickName); - boxstacklayerService.updateById(boxstacklayer); - } - } + boxstack.setBox_no(vehicle_code); + boxstack.setCurrent_layer_count(boxNos.length); boxstack.setBox_spec(box_spec); boxstack.setUpdate_time(now); boxstack.setUpdate_id(currentUserId); @@ -223,4 +209,41 @@ public class MxInTask extends AbstractAcsTask { updateWrapper.set(SchBaseTask::getRemark, "任务被用户:" + schBaseTask.getUpdate_optname() + "在:" + DateUtil.now() + "强制取消。"); taskService.update(null, updateWrapper); } + + public String againPutPoint(String taskCode) { + SchBaseTask baseTask = taskService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_code, taskCode) + .eq(SchBaseTask::getIs_delete, IOSEnum.IS_SEND.code("否")) + .eq(SchBaseTask::getTask_status, TaskStatusEnum.EXECUTING.getCode())); + if (baseTask == null) { + throw new BadRequestException("该任务未执行或不存在!"); + } + //获取木箱规格 + String point_code2 = baseTask.getPoint_code2(); + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, point_code2) + .eq(BstIvtBoxstack::getIs_used, IOSEnum.IS_NOTANDYES.code("是"))); + if (boxstack == null) { + throw new BadRequestException("等待点不存在!"); + } + Integer y = boxstack.getY(); + List list = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区")) + .isNull(BstIvtBoxstack::getBox_spec) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0) + .orderByAsc(BstIvtBoxstack::getX)); + for (BstIvtBoxstack bstIvtBoxstack : list) { + List schBaseTasks = taskService.checkHaveTaskByNext(Arrays.asList(bstIvtBoxstack.getStack_code())); + if (CollectionUtils.isEmpty(schBaseTasks)) { + baseTask.setPoint_code2(bstIvtBoxstack.getStack_code()); + baseTask.setRemark("二次分配成功"); + baseTask.setUpdate_time(DateUtil.now()); + taskService.updateById(baseTask); + return bstIvtBoxstack.getStack_code(); + } + } + throw new BadRequestException("等待点所在列暂时无空位!"); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java index 4086e72..3a74053 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/MxMoveTask.java @@ -12,9 +12,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; -import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxStockUpPlanService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; -import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstacklayer; import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.dto.SchBaseTaskVO; import org.nl.b_lms.sch.task.service.IschBaseTaskService; @@ -53,7 +53,7 @@ public class MxMoveTask extends AbstractAcsTask { @Resource private IBstIvtBoxstackService boxstackService; @Resource - private IBstIvtBoxstacklayerService boxstacklayerService; + private IBstIvtBoxStockUpPlanService boxstacklayerService; @Override @@ -113,18 +113,19 @@ public class MxMoveTask extends AbstractAcsTask { if (!ObjectUtil.isEmpty(boxstack)) { for (int i = 0; i < boxNos.length; i++) { //修改每层的木箱号信息 - String boxNo = boxNos[i]; - BstIvtBoxstacklayer boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() - .eq(BstIvtBoxstacklayer::getStack_id, boxstack.getStack_id()) - .eq(BstIvtBoxstacklayer::getLayer_index, i + 1)); - if (!ObjectUtil.isEmpty(boxstacklayer)) { - boxstacklayer.setBox_code(boxNo); - boxstacklayer.setUpdate_time(now); - boxstacklayer.setUpdate_id(currentUserId); - boxstacklayer.setUpdate_name(currentNickName); - boxstacklayerService.updateById(boxstacklayer); - } +// String boxNo = boxNos[i]; +// BstIvtBoxStockUpPlan boxstacklayer = boxstacklayerService.getOne(new LambdaQueryWrapper() +// .eq(BstIvtBoxStockUpPlan::getStack_id, boxstack.getStack_id()) +// .eq(BstIvtBoxStockUpPlan::getLayer_index, i + 1)); +// if (!ObjectUtil.isEmpty(boxstacklayer)) { +// boxstacklayer.setBox_code(boxNo); +// boxstacklayer.setUpdate_time(now); +// boxstacklayer.setUpdate_id(currentUserId); +// boxstacklayer.setUpdate_name(currentNickName); +// boxstacklayerService.updateById(boxstacklayer); +// } } + boxstack.setCurrent_layer_count(boxNos.length); boxstack.setBox_spec(box_spec); boxstack.setUpdate_time(now); boxstack.setUpdate_id(currentUserId); @@ -223,4 +224,17 @@ public class MxMoveTask extends AbstractAcsTask { updateWrapper.set(SchBaseTask::getRemark, "任务被用户:" + schBaseTask.getUpdate_optname() + "在:" + DateUtil.now() + "强制取消。"); taskService.update(null, updateWrapper); } + + public String againGetPoint(String taskCode) { + return null; + } + + public String againPutPoint(String taskCode) { + return null; + } + + public void getFinish() { + //更新起点库存 + //起点层数 + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java index 4c3e136..8a83f37 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/boxstack/auto/AutoMxMoveTask.java @@ -1,14 +1,17 @@ package org.nl.b_lms.sch.tasks.boxstack.auto; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.nl.b_lms.bst.ivt.boxstack.enums.BoxStackEnum; +import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxStockUpPlanService; import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstackService; -import org.nl.b_lms.bst.ivt.boxstack.service.IBstIvtBoxstacklayerService; +import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxstack; import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.b_lms.sch.task.service.IschBaseTaskService; @@ -16,6 +19,7 @@ import org.nl.b_lms.sch.tasks.boxstack.MxMoveTask; import org.nl.common.utils.IdUtil; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -29,17 +33,20 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class AutoMxMoveTask { + private final String THIS_CLASS = AutoMxMoveTask.class.getName(); + @Resource private IschBaseTaskService taskService; - private final String THIS_CLASS = AutoMxMoveTask.class.getName(); @Resource private RedissonClient redissonClient; @Resource private MxMoveTask mxMoveTask; @Resource private IBstIvtBoxstackService boxstackService; + @Resource + private IBstIvtBoxStockUpPlanService stockUpPlanService; - //满轴->待检区agv自动搬运任务 + //木箱备货密集区->缓存区的自动搬运任务 public void run() { try { this.sendMxMove(); @@ -56,6 +63,35 @@ public class AutoMxMoveTask { boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); try { if (tryLock) { + //获取木箱备货计划 + List stockUpPlans = stockUpPlanService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxStockUpPlan::getStock_plan_status, BoxStackEnum.STOCK_UP_STATUS.code("未开始")) + .eq(BstIvtBoxStockUpPlan::getStock_plan_time, DateUtil.today())); + for (BstIvtBoxStockUpPlan stockUpPlan : stockUpPlans) { + //备货木箱 + String box_spec = stockUpPlan.getBox_spec(); + //备货数量 + Integer stock_up_num = stockUpPlan.getStock_up_num(); + List executingStockUpPlans = stockUpPlanService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxStockUpPlan::getBox_spec, box_spec) + .eq(BstIvtBoxStockUpPlan::getStock_plan_status, BoxStackEnum.STOCK_UP_STATUS.code("执行中"))); + if (executingStockUpPlans.size() > 0) { + if (StringUtils.isNotBlank(stockUpPlan.getRemark())) { + stockUpPlan.setRemark("有同规格的木箱移库备货计划正在执行"); + stockUpPlanService.updateById(stockUpPlan); + } + continue; + } + //根据备货计划,从密集区或零散区查询该木箱规格的数量 + List boxstacks = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getBox_spec, box_spec) + .in(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区"), BoxStackEnum.POINT_STATUS.code("零散区")) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); + if (boxstacks.size() < stock_up_num) { + continue; + } + //判断木箱库中 + } //获取装箱计划 List zxjhs = new ArrayList<>(); for (String box_spec : zxjhs) { @@ -154,10 +190,10 @@ public class AutoMxMoveTask { mxMoveTask.createTask(taskParam); } // for (BstIvtBoxstack bstIvtBoxstack : hasGoodsPoint) { -// List boxstacklayerList = boxstacklayerService.list(new LambdaQueryWrapper() -// .eq(BstIvtBoxstacklayer::getStack_id, bstIvtBoxstack.getStack_id())); +// List boxstacklayerList = boxstacklayerService.list(new LambdaQueryWrapper() +// .eq(BstIvtBoxStockUpPlan::getStack_id, bstIvtBoxstack.getStack_id())); // String vehicle_code = boxstacklayerList.stream() -// .map(BstIvtBoxstacklayer::getBox_code) +// .map(BstIvtBoxStockUpPlan::getBox_code) // .filter(Objects::nonNull) // .filter(boxNo -> !boxNo.isEmpty()) // .collect(Collectors.joining(",")); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml index 8d86f30..ab0523d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/dao/mapper/BstIvtBoxinfoMapper.xml @@ -3,36 +3,52 @@ SELECT - box.box_no, - box.material_code, - box.material_name, - box.num, - box.box_length, - box.box_width, - box.box_high, - box.box_weight, - attr.struct_code, - ( - CASE box.vehicle_type - WHEN '1' THEN '小托盘' - WHEN '2' THEN '大托盘' - END - ) AS vehicle_type + box.box_no, + box.material_code, + box.material_name, + box.num, + box.box_length, + box.box_width, + box.box_high, + box.box_weight, + attr.struct_code, + ( + CASE box.vehicle_type + WHEN '1' THEN '小托盘' + WHEN '2' THEN '大托盘' + END + ) AS vehicle_type FROM - bst_ivt_boxinfo box - INNER JOIN st_ivt_structattr attr ON attr.storagevehicle_code = box.box_no + bst_ivt_boxinfo box + INNER JOIN st_ivt_structattr attr ON attr.storagevehicle_code = box.box_no box.is_packing = '0' AND attr.lock_type = '1' @@ -96,16 +112,13 @@