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 index 8491fa8..35bdf6a 100644 --- 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 @@ -2,9 +2,16 @@ 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.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanDto; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanQuery; +import org.nl.common.domain.query.PageQuery; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; /** * @Description TODO @@ -16,4 +23,35 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/bstIvtBoxStockUpPlan") public class BstIvtBoxStockUpPlanController { + @Autowired + private IBstIvtBoxStockUpPlanService boxStockUpPlanService; + + @GetMapping + public ResponseEntity query(BstIvtBoxStockUpPlanQuery whereJson, PageQuery page) { + return new ResponseEntity<>(boxStockUpPlanService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + public ResponseEntity create(@Validated @RequestBody BstIvtBoxStockUpPlanDto entity) { + boxStockUpPlanService.create(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/finish") + public ResponseEntity finish(@Validated @RequestBody BstIvtBoxStockUpPlanDto entity) { + boxStockUpPlanService.finish(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping + public ResponseEntity update(@Validated @RequestBody BstIvtBoxStockUpPlanDto entity) { + boxStockUpPlanService.update(entity); + return new ResponseEntity<>(HttpStatus.OK); + } + + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + boxStockUpPlanService.deleteAll(ids); + return new ResponseEntity<>(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 2ed5c33..1845e28 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 @@ -21,6 +21,8 @@ public enum BoxStackEnum { TASK_TYPE(MapOf.of("木箱入库", "010702", "木箱出库", "010704", "木箱移库", "010705","木箱缓存区到对接位", "010706","木箱行架", "010706","木箱对接位到缓存区", "010707")), // 木箱出入库任务二次分配类型 AGV_ACTION_TYPE(MapOf.of("普通任务", "1", "取货二次分配", "2", "放货二次分配", "3", "取放货二次分配", "4")), + //AGV取放货完成 + TASK_ACTION_TYPE(MapOf.of("请求取货", "1", "取货完成", "2", "请求放货", "3", "放货完成", "4")), //木箱库二次分配等待点 AGV_WAIT_POINT(MapOf.of("木箱等待点1", "MX_WAIT_1", "木箱等待点2", "MX_WAIT_2")), //木箱库ACS任务类型 @@ -34,7 +36,8 @@ public enum BoxStackEnum { //备货计划状态 STOCK_UP_STATUS(MapOf.of("未开始", "1", "执行中", "2", "完成", "3")), //木箱库区域 - POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3", "对接区", "4", "等待区", "5")); + + POINT_STATUS(MapOf.of("密集区", "1", "零散区", "2", "缓存区", "3", "等待区", "4")); 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 index 8887c8a..ee24eb0 100644 --- 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 @@ -2,6 +2,11 @@ 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; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanDto; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Set; /** * @Description TODO @@ -10,6 +15,40 @@ import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; */ public interface IBstIvtBoxStockUpPlanService extends IService { + /** + * 查询 + * + * @param whereJson + * @param page + * @return + */ + Object queryAll(BstIvtBoxStockUpPlanQuery whereJson, PageQuery page); -// List getByStackId(String stackId); + /** + * 创建 + * + * @param entity + */ + void create(BstIvtBoxStockUpPlanDto entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(BstIvtBoxStockUpPlanDto entity); + + /** + * 删除 + * + * @param ids + */ + void deleteAll(Set ids); + + + /** + * 完成 + * @param entity + */ + void finish(BstIvtBoxStockUpPlanDto entity); } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java index 209c216..3d64364 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/BstIvtBoxStockUpPlan.java @@ -41,11 +41,6 @@ public class BstIvtBoxStockUpPlan implements Serializable { */ private Integer stock_up_num; - /** - * 备货日期 yyyy-MM-dd - */ - private String stock_plan_time; - /** * 是否已经进行备货 1、未开始 2、执行中 3、完成 */ 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 index 5e4f50a..7929d2d 100644 --- 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 @@ -1,9 +1,16 @@ package org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.List; +import java.util.Map; public interface BstIvtBoxStockUpPlanMapper extends BaseMapper { + List pageQuery(@Param("query") BstIvtBoxStockUpPlanQuery whereJson, @Param("pageQuery") PageQuery pageQuery); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml index dbe59be..c17b50d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxStockUpPlanMapper.xml @@ -2,4 +2,19 @@ + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml index df95d4e..6f1f3bb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dao/mapper/BstIvtBoxstackMapper.xml @@ -10,6 +10,7 @@ bs.max_layer_count, bs.point_status, bs.box_spec, + bs.box_no, bs.x, bs.y, bs.is_used, @@ -37,6 +38,16 @@ AND bs.is_used = #{query.is_used} + + + + AND (bs.box_spec IS NOT NULL AND bs.box_spec != '') + + + AND (bs.box_spec IS NULL OR bs.box_spec = '') + + + ORDER BY bs.stack_code ASC diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java index 9c4ccfe..c9e1943 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanDto.java @@ -30,12 +30,7 @@ public class BstIvtBoxStockUpPlanDto implements Serializable { private Integer stock_up_num; /** - * 备货日期 yyyy-MM-dd - */ - private String stock_plan_time; - - /** - * 是否已经进行备货 0否 1是 + * */ private String stock_plan_status; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java index 95ed800..5cde2c8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/boxstack/service/dto/BstIvtBoxStockUpPlanQuery.java @@ -9,4 +9,6 @@ import lombok.Data; */ @Data public class BstIvtBoxStockUpPlanQuery { + private String box_info; + private String stock_plan_status; } \ No newline at end of file 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 a926908..5676631 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 @@ -30,4 +30,9 @@ public class BstIvtBoxstackQuery { * 是否弃用 */ private Boolean is_used; + + /** + * 是否有货 + */ + private Boolean isHasGoods; } \ No newline at end of file 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 index d6d8f6c..180119d 100644 --- 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 @@ -1,11 +1,29 @@ package org.nl.b_lms.bst.ivt.boxstack.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import lombok.extern.slf4j.Slf4j; +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.dao.BstIvtBoxStockUpPlan; import org.nl.b_lms.bst.ivt.boxstack.service.dao.mapper.BstIvtBoxStockUpPlanMapper; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanDto; +import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxStockUpPlanQuery; +import org.nl.common.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.IdUtil; +import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * @Description TODO @@ -16,9 +34,80 @@ import org.springframework.stereotype.Service; @Service public class BstIvtBoxStockUpPlanServiceImpl extends ServiceImpl implements IBstIvtBoxStockUpPlanService { -// @Override -// public List getByStackId(String stackId) { -// return this.list(new LambdaQueryWrapper().eq(BstIvtBoxStockUpPlan::getStack_id, stackId)); -// } + @Resource + private BstIvtBoxStockUpPlanMapper boxStockUpPlanMapper; + @Override + public Object queryAll(BstIvtBoxStockUpPlanQuery whereJson, PageQuery pageQuery) { + Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + List list = boxStockUpPlanMapper.pageQuery(whereJson, pageQuery); + TableDataInfo build = TableDataInfo.build(list); + build.setTotalElements(page.getTotal()); + return build; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(BstIvtBoxStockUpPlanDto entity) { + BstIvtBoxStockUpPlan boxStockUpPlan = new BstIvtBoxStockUpPlan(); + boxStockUpPlan.setStockup_plan_id(IdUtil.getStringId()); + boxStockUpPlan.setBox_spec(entity.getBox_spec()); + boxStockUpPlan.setBox_spec_name(entity.getBox_spec_name()); + boxStockUpPlan.setStock_up_num(entity.getStock_up_num()); + boxStockUpPlan.setStock_plan_status(BoxStackEnum.STOCK_UP_STATUS.code("未开始")); + boxStockUpPlan.setCreated_id(SecurityUtils.getCurrentUserId()); + boxStockUpPlan.setCreated_name(SecurityUtils.getCurrentUsername()); + boxStockUpPlan.setCreated_time(DateUtil.now()); + boxStockUpPlanMapper.insert(boxStockUpPlan); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(BstIvtBoxStockUpPlanDto entity) { + BstIvtBoxStockUpPlan stockUpPlan = this.getById(entity.getStockup_plan_id()); + if (ObjectUtil.isNull(stockUpPlan)) { + throw new BadRequestException("备货计划不存在."); + } + if (!BoxStackEnum.STOCK_UP_STATUS.code("未开始").equals(stockUpPlan.getStock_plan_status())) { + throw new BadRequestException("备货计划已开始,不允许修改."); + } + stockUpPlan.setBox_spec(entity.getBox_spec()); + stockUpPlan.setBox_spec_name(entity.getBox_spec_name()); + stockUpPlan.setStock_up_num(entity.getStock_up_num()); + stockUpPlan.setUpdate_id(SecurityUtils.getCurrentUserId()); + stockUpPlan.setUpdate_name(SecurityUtils.getCurrentUsername()); + stockUpPlan.setUpdate_time(DateUtil.now()); + boxStockUpPlanMapper.updateById(stockUpPlan); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Set ids) { + ids.forEach(id -> { + BstIvtBoxStockUpPlan stockUpPlan = this.getById(id); + if (ObjectUtil.isNull(stockUpPlan)) { + throw new BadRequestException("备货计划不存在."); + } + if (!BoxStackEnum.STOCK_UP_STATUS.code("未开始").equals(stockUpPlan.getStock_plan_status())) { + throw new BadRequestException("备货计划已开始,不允许删除."); + } + boxStockUpPlanMapper.deleteById(id); + }); + } + + @Override + public void finish(BstIvtBoxStockUpPlanDto entity) { + BstIvtBoxStockUpPlan stockUpPlan = this.getById(entity.getStockup_plan_id()); + if (ObjectUtil.isNull(stockUpPlan)) { + throw new BadRequestException("备货计划不存在."); + } + if (BoxStackEnum.STOCK_UP_STATUS.code("完成").equals(stockUpPlan.getStock_plan_status())) { + return; + } + stockUpPlan.setStock_plan_status(BoxStackEnum.STOCK_UP_STATUS.code("完成")); + stockUpPlan.setUpdate_id(SecurityUtils.getCurrentUserId()); + stockUpPlan.setUpdate_name(SecurityUtils.getCurrentUsername()); + stockUpPlan.setUpdate_time(DateUtil.now()); + boxStockUpPlanMapper.updateById(stockUpPlan); + } } \ 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 19e5d3b..c062613 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 @@ -2,7 +2,6 @@ package org.nl.b_lms.bst.ivt.boxstack.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,8 +10,6 @@ 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.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.mapper.BstIvtBoxstackMapper; import org.nl.b_lms.bst.ivt.boxstack.service.dto.BstIvtBoxstackDto; diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java index dba16ba..0bdee54 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/BoxStackInOutController.java @@ -1,16 +1,13 @@ package org.nl.b_lms.pda.controller; +import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.pda.service.BoxStackInOutService; -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.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @Description TODO @@ -26,9 +23,26 @@ public class BoxStackInOutController { private BoxStackInOutService boxStackInOutService; @PostMapping("/boxIn") - @Log("木箱入库") - public ResponseEntity confirmPass(@RequestBody JSONObject reqParam) { - boxStackInOutService.boxIn(reqParam); - return new ResponseEntity<>( HttpStatus.OK); + @SaIgnore + public ResponseEntity boxIn(@RequestBody JSONObject reqParam) { + return new ResponseEntity<>(boxStackInOutService.boxIn(reqParam), HttpStatus.OK); + } + + @PostMapping("/updateWeight") + @SaIgnore + public ResponseEntity updateWeight(@RequestBody JSONObject reqParam) { + return new ResponseEntity<>(boxStackInOutService.updateWeight(reqParam),HttpStatus.OK); + } + + @PostMapping("/updatePoint") + @SaIgnore + public ResponseEntity updatePoint(@RequestBody JSONObject reqParam) { + return new ResponseEntity<>(boxStackInOutService.updatePoint(reqParam), HttpStatus.OK); + } + + @PostMapping("/getBoxSpecInfo") + @SaIgnore + public ResponseEntity getBoxSpecInfo() { + return new ResponseEntity<>(boxStackInOutService.getBoxSpecInfo(), HttpStatus.OK); } } \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java index 90efe3f..3e5961f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/service/BoxStackInOutService.java @@ -2,6 +2,8 @@ package org.nl.b_lms.pda.service; import com.alibaba.fastjson.JSONObject; +import java.util.Map; + /** * @Description TODO * @Author Gengby @@ -10,9 +12,32 @@ import com.alibaba.fastjson.JSONObject; public interface BoxStackInOutService { /** - * 入库 + * 空木箱入库 * * @param reqParam */ - void boxIn(JSONObject reqParam); + JSONObject boxIn(JSONObject reqParam); + + /** + * 维护空木箱重量 + * + * @param reqParam + * @return + */ + JSONObject updateWeight(JSONObject reqParam); + + /** + * 维护空木箱库存 + * + * @param reqParam + * @return + */ + JSONObject updatePoint(JSONObject reqParam); + + /** + * 获取木箱规格信息 + * + * @return + */ + Map getBoxSpecInfo(); } \ 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 a8a1a29..9ff2f6e 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,5 +1,6 @@ package org.nl.b_lms.pda.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; @@ -11,19 +12,25 @@ 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.b_lms.storage_manage.md.dao.MdMeMaterialBase; +import org.nl.b_lms.storage_manage.md.service.MaterialbaseService; +import org.nl.common.utils.SecurityUtils; 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.redisson.api.RLock; import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -50,10 +57,12 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { private IBstIvtBoxstackService boxstackService; @Resource private ISysParamService paramService; + @Autowired + private MaterialbaseService materialbaseService; @SneakyThrows @Override - public void boxIn(JSONObject reqParam) { + public JSONObject boxIn(JSONObject reqParam) { String pointCode = reqParam.getString("point_code"); if (StringUtils.isBlank(pointCode)) { throw new BadRequestException("请输入入库点位"); @@ -61,10 +70,14 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { Optional.ofNullable(pointService.findByCode(pointCode)) .orElseThrow(() -> new BadRequestException("入库点位不存在")); - String vehicleCodeStr = reqParam.getString("vehicle_code"); + String vehicleCodeStr = reqParam.getString("vehicle_code").replaceAll("\\s+", ""); if (StringUtils.isBlank(vehicleCodeStr)) { throw new BadRequestException("请输入木箱号"); } + List tasksByVehicleCode = taskService.findTasksByVehicleCode(vehicleCodeStr); + if (CollectionUtils.isNotEmpty(tasksByVehicleCode)) { + throw new BadRequestException("该木箱号已经存在任务"); + } String[] vehicleCodes = vehicleCodeStr.split(","); List boxSpecs = new ArrayList<>(); @@ -75,6 +88,9 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { if (ObjectUtil.isEmpty(boxinfo)) { throw new BadRequestException("木箱号: " + boxNo + " 不存在"); } + if (ObjectUtil.isEmpty(boxinfo.getBox_weight())) { + throw new BadRequestException("木箱号: " + boxNo + "重量信息未维护"); + } boxSpecs.add(boxinfo.getMaterial_code()); } } @@ -118,12 +134,104 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { lock.unlock(); } } + JSONObject resp = new JSONObject(); + resp.put("status", "200"); + resp.put("message", "操作成功"); + return resp; + } + + @Override + public JSONObject updateWeight(JSONObject reqParam) { + String vehicle_code = reqParam.getString("vehicle_code"); + if (StringUtils.isBlank(vehicle_code)) { + throw new BadRequestException("请输入木箱号"); + } + BigDecimal weight = reqParam.getBigDecimal("weight"); + if (weight == null || weight.compareTo(BigDecimal.ZERO) <= 0) { + throw new BadRequestException("木箱重量不能为空并且大于0"); + } + BstIvtBoxinfo boxinfo = boxinfoService.getOne( + new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, vehicle_code)); + if (ObjectUtil.isEmpty(boxinfo)) { + throw new BadRequestException("木箱信息不存在"); + } + boxinfo.setBox_weight(String.valueOf(weight)); + boxinfoService.updateById(boxinfo); + JSONObject resp = new JSONObject(); + resp.put("status", "200"); + resp.put("message", "操作成功"); + return resp; + } + + @Override + public JSONObject updatePoint(JSONObject reqParam) { + String pointCode = reqParam.getString("point_code"); + if (StringUtils.isBlank(pointCode)) { + throw new BadRequestException("请输入入库点位"); + } + String vehicleCodeStr = reqParam.getString("vehicle_code"); + if (StringUtils.isBlank(vehicleCodeStr)) { + throw new BadRequestException("请输入木箱号"); + } + String material_code = reqParam.getString("material_code"); + if (StringUtils.isBlank(material_code)) { + throw new BadRequestException("请输入木箱规格"); + } + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, pointCode)); + if (ObjectUtil.isEmpty(boxstack)) { + throw new BadRequestException("堆叠点位信息不存在"); + } + for (String vehicle_code : vehicleCodeStr.split(",")) { + BstIvtBoxinfo ivtBoxinfo = boxinfoService.getOne(new LambdaQueryWrapper().eq(BstIvtBoxinfo::getBox_no, vehicle_code)); + if (ObjectUtil.isEmpty(ivtBoxinfo)) { + throw new BadRequestException(vehicle_code + "木箱信息不存在"); + } + if (!StrUtil.equals(ivtBoxinfo.getMaterial_code(), material_code)) { + throw new BadRequestException(vehicle_code + "木箱规格不一致"); + } + if (ObjectUtil.isEmpty(ivtBoxinfo.getBox_weight())) { + throw new BadRequestException(vehicle_code + "请维护木箱重量"); + } + } + boxstack.setBox_spec(material_code); + boxstack.setBox_no(vehicleCodeStr); + boxstack.setCurrent_layer_count(vehicleCodeStr.split(",").length); + boxstack.setUpdate_id(SecurityUtils.getCurrentUserId()); + boxstack.setUpdate_name(SecurityUtils.getCurrentNickName()); + boxstack.setUpdate_time(DateUtil.now()); + boxstackService.updateById(boxstack); + JSONObject resp = new JSONObject(); + resp.put("status", "200"); + resp.put("message", "操作成功"); + return resp; + } + + @Override + public Map getBoxSpecInfo() { + List list = materialbaseService.list(new LambdaQueryWrapper().like(MdMeMaterialBase::getMaterial_name, "木箱")); + List> data = list.stream() + .map(item -> { + Map map = new HashMap<>(); + map.put("value", item.getMaterial_code()); + map.put("text", item.getMaterial_name()); + return map; + }).collect(Collectors.toList()); + Map resp = new HashMap<>(); + resp.put("status", "200"); + resp.put("message", "查询成功"); + resp.put("data", data); + return resp; } private void handleLooseAreaIn(String pointCode, String firstMaterial, String vehicleCodeStr) { List emptyLoosePoints = boxstackService.list( new LambdaQueryWrapper() - .isNull(BstIvtBoxstack::getBox_spec) + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(BstIvtBoxstack::getBox_spec, "") + ) .eq(BstIvtBoxstack::getCurrent_layer_count, 0) .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("零散区")) .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) @@ -146,6 +254,7 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { } private void handleDenseAreaIn(String pointCode, String firstMaterial, String vehicleCodeStr) { + //获取已经密集区有该规格的列的库位 List firstRowWithMaterial = boxstackService.list( new LambdaQueryWrapper() .eq(BstIvtBoxstack::getBox_spec, firstMaterial) @@ -153,79 +262,103 @@ public class BoxStackInOutServiceImpl implements BoxStackInOutService { .eq(BstIvtBoxstack::getX, 1) .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("启用")) - ); - - 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; - } - } - } - + //获取密集区每一列都是空位的点位 List firstRowEmpty = boxstackService.list( new LambdaQueryWrapper() - .isNull(BstIvtBoxstack::getBox_spec) + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(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("无可用货位,请稍后入库"); + if (!CollectionUtils.isEmpty(firstRowWithMaterial)) { + handleTask(firstRowWithMaterial, pointCode, firstMaterial, vehicleCodeStr, true); + } else if (!CollectionUtils.isEmpty(firstRowEmpty)) { + handleTask(firstRowEmpty, pointCode, firstMaterial, vehicleCodeStr, false); } + } - 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("未找到对应等待区位置,请检查配置"); + private void handleTask(List boxstackList, String pointCode, String firstMaterial, String vehicleCodeStr, Boolean isFirst) { + Boolean flag = false; + Map> boxStackGroupedByY = boxstackList.stream() + .collect(Collectors.groupingBy(BstIvtBoxstack::getY)); + for (Integer y : boxStackGroupedByY.keySet()) { + List emptyPointsInColumn = boxstackService.list( + new LambdaQueryWrapper() + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(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; + 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("启用")) + ); + if (waitPoint == null) continue; + List emptyStackCodes = emptyPointsInColumn.stream() + .map(BstIvtBoxstack::getStack_code) + .collect(Collectors.toList()); + List schBaseTasks = taskService.checkHaveTaskByNext(Arrays.asList(waitPoint.getStack_code())); + if (!CollectionUtils.isEmpty(schBaseTasks)) { + SchBaseTask schBaseTask = schBaseTasks.get(0); + String boxNoStr = schBaseTask.getVehicle_code(); + if (boxNoStr != null) { + String boxNo = boxNoStr.split(",")[0]; + BstIvtBoxinfo boxinfo = boxinfoService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxinfo::getBox_no, boxNo)); + if (ObjectUtil.isNotNull(boxinfo)) { + if (!StrUtil.equals(boxinfo.getMaterial_code(), firstMaterial)) { + continue; + } + } + } + } + int waitingTasks = schBaseTasks.size(); + int assignTasks = taskService.checkHaveTaskByNext(emptyStackCodes).size(); + int hasGoodsSize = boxstackService.list( + new LambdaQueryWrapper() + .gt(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("启用")) + ).size(); + if (emptyPointsInColumn.size() >= waitingTasks + assignTasks + hasGoodsSize) { + JSONObject taskParam = buildTaskParam(firstMaterial, vehicleCodeStr, + BoxStackEnum.AGV_ACTION_TYPE.code("放货二次分配"), + BoxStackEnum.TASK_TYPE.code("木箱入库"), + pointCode, waitPoint.getStack_code()); + mxInTask.createTask(taskParam); + flag = true; + return; + } + } + if (!flag && isFirst) { + List firstRowEmpty = boxstackService.list( + new LambdaQueryWrapper() + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(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("启用")) + ); + handleTask(firstRowEmpty, pointCode, firstMaterial, vehicleCodeStr, true); } - - 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, 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 f2c72d9..19178d5 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 @@ -161,6 +161,29 @@ public interface IschBaseTaskService extends IService { * @return */ List checkHaveTaskByNext(List noHasGoodsPointCodeList); + + + /** + * + * @param point_code1 + * @return + */ + List checkHaveTaskByStart(String point_code1); + + + /** + * + * @param point_code1List + * @return + */ + List checkHaveTaskByStart(List point_code1List); + + /** + * 根据载具号获取任务 + * @param vehicleCodeStr + * @return + */ + List findTasksByVehicleCode(String vehicleCodeStr); } 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 ccc8fc2..cbb0ce9 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 @@ -253,6 +253,30 @@ public class SchBaseTaskServiceImpl extends ServiceImpl checkHaveTaskByStart(List point1List) { + LambdaQueryWrapper lqw = new QueryWrapper().lambda(); + lqw.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .and(la -> la.in(SchBaseTask::getPoint_code1, point1List)); + return list(lqw); + } + + @Override + public List checkHaveTaskByStart(String point_code1) { + LambdaQueryWrapper lqw = new QueryWrapper().lambda(); + lqw.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .and(la -> la.eq(SchBaseTask::getPoint_code1, point_code1)); + return list(lqw); + } + + @Override + public List findTasksByVehicleCode(String vehicleCodeStr) { + LambdaQueryWrapper lqw = new QueryWrapper().lambda(); + lqw.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .and(la -> la.eq(SchBaseTask::getVehicle_code, vehicleCodeStr)); + 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 009ed2a..175f967 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 @@ -35,6 +35,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** @@ -157,6 +158,7 @@ public class MxInTask extends AbstractAcsTask { .vehicle_code(vehicleCode) //二次分配要用的类型 .vehicle_code2(form.getString("vehicle_code2")) + .material_code(form.getString("material_code")) .point_code1(pointCode1) .point_code2(pointCode2) .task_group_id(form.getString("task_group_id")) @@ -175,7 +177,7 @@ public class MxInTask extends AbstractAcsTask { taskService.save(task); //如果目标点位没有空位先创建不下发 if (isSend) { - this.immediateNotifyAcs(null); +// this.immediateNotifyAcs(null); } return task.getTask_id(); } @@ -226,22 +228,54 @@ public class MxInTask extends AbstractAcsTask { if (boxstack == null) { throw new BadRequestException("等待点不存在!"); } + if (!StrUtil.equals(boxstack.getPoint_status(), BoxStackEnum.POINT_STATUS.code("等待区"))) { + return point_code2; + } 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) + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(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(); + List stackCodeList = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区")) + .eq(BstIvtBoxstack::getBox_spec, baseTask.getMaterial_code()) + .gt(BstIvtBoxstack::getCurrent_layer_count, 0) + .lt(BstIvtBoxstack::getX, bstIvtBoxstack.getX())); + List havePoint1Tasks = new ArrayList<>(); + if (!CollectionUtils.isEmpty(stackCodeList)) { + havePoint1Tasks = taskService.checkHaveTaskByStart(stackCodeList.stream().map(BstIvtBoxstack::getStack_code).collect(Collectors.toList())); + } + if (CollectionUtils.isEmpty(havePoint1Tasks)) { + baseTask.setPoint_code2(bstIvtBoxstack.getStack_code()); + baseTask.setRemark("二次分配成功"); + baseTask.setUpdate_time(DateUtil.now()); + taskService.updateById(baseTask); + return bstIvtBoxstack.getStack_code(); + } else { + List boxstackList = boxstackService.list(new LambdaQueryWrapper() + .in(BstIvtBoxstack::getStack_code, stackCodeList) + .lt(BstIvtBoxstack::getCurrent_layer_count, 0)); + if (CollectionUtils.isEmpty(boxstackList)) { + baseTask.setPoint_code2(bstIvtBoxstack.getStack_code()); + baseTask.setRemark("二次分配成功"); + baseTask.setUpdate_time(DateUtil.now()); + taskService.updateById(baseTask); + return bstIvtBoxstack.getStack_code(); + } + throw new BadRequestException("该列暂时存在木箱移库任务,等移库任务完成再分配"); + } } } 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 3a74053..d996c57 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 @@ -11,6 +11,8 @@ 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.IBstIvtBoxStockUpPlanService; import org.nl.b_lms.bst.ivt.boxstack.service.dao.BstIvtBoxStockUpPlan; @@ -33,7 +35,9 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** @@ -53,7 +57,7 @@ public class MxMoveTask extends AbstractAcsTask { @Resource private IBstIvtBoxstackService boxstackService; @Resource - private IBstIvtBoxStockUpPlanService boxstacklayerService; + private IBstIvtBoxStockUpPlanService boxStockUpPlanService; @Override @@ -111,21 +115,8 @@ public class MxMoveTask 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]; -// 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_no(vehicle_code); boxstack.setBox_spec(box_spec); boxstack.setUpdate_time(now); boxstack.setUpdate_id(currentUserId); @@ -134,6 +125,26 @@ public class MxMoveTask extends AbstractAcsTask { } //3.更改任务状态为完成 updateWrapper.set(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + //4.判断该备货计划的任务是否都完成了 如果是的话则修改该备货计划任务状态为完成 + String task_group_id = schBaseTask.getTask_group_id(); + if (!ObjectUtil.isEmpty(task_group_id)) { + List taskList = taskService.list(new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_group_id, task_group_id) + .eq(SchBaseTask::getIs_delete, 0) + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode())); + if (taskList.size() <= 1) { + BstIvtBoxStockUpPlan stockUpPlan = boxStockUpPlanService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxStockUpPlan::getStockup_plan_id, schBaseTask.getTask_group_id())); + if (!ObjectUtil.isEmpty(stockUpPlan)) { + stockUpPlan.setStock_plan_status(BoxStackEnum.STOCK_UP_STATUS.code("完成")); + stockUpPlan.setUpdate_id(currentUserId); + stockUpPlan.setUpdate_name(currentNickName); + stockUpPlan.setUpdate_time(now); + boxStockUpPlanService.updateById(stockUpPlan); + } + } + } + } // 取消 if (status.equals(IOSEnum.IS_NOTANDYES.code("否"))) { @@ -190,7 +201,7 @@ public class MxMoveTask extends AbstractAcsTask { taskService.save(task); //如果目标点位没有空位先创建不下发 if (isSend) { - this.immediateNotifyAcs(null); + //this.immediateNotifyAcs(null); } return task.getTask_id(); } @@ -226,15 +237,87 @@ public class MxMoveTask extends AbstractAcsTask { } public String againGetPoint(String taskCode) { - return null; + 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_code1 = baseTask.getPoint_code1(); + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, point_code1) + .eq(BstIvtBoxstack::getIs_used, IOSEnum.IS_NOTANDYES.code("是"))); + if (boxstack == null) { + throw new BadRequestException("等待点不存在!"); + } + if (!StrUtil.equals(boxstack.getPoint_status(), BoxStackEnum.POINT_STATUS.code("等待区"))) { + return point_code1; + } + 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("密集区")) + .eq(BstIvtBoxstack::getBox_spec, baseTask.getMaterial_code()) + .gt(BstIvtBoxstack::getCurrent_layer_count, 0) + .orderByDesc(BstIvtBoxstack::getX)); + for (BstIvtBoxstack bstIvtBoxstack : list) { + //先判断该点位是否存在起点任务 + List havePoint1Tasks = taskService.checkHaveTaskByStart(bstIvtBoxstack.getStack_code()); + if (CollectionUtils.isEmpty(havePoint1Tasks)) { + //如果不存在,判断该点位及外层点位的任务 + List stackCodeList = boxstackService.list(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("密集区")) + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(BstIvtBoxstack::getBox_spec, "") + ) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0) + .gt(BstIvtBoxstack::getX, bstIvtBoxstack.getX())) + .stream() + .map(BstIvtBoxstack::getStack_code) + .collect(Collectors.toList()); + List havePoint2Tasks = new ArrayList<>(); + if (!CollectionUtils.isEmpty(stackCodeList)) { + havePoint2Tasks = taskService.checkHaveTaskByNext(stackCodeList); + } + if (CollectionUtils.isEmpty(havePoint2Tasks)) { + baseTask.setPoint_code1(bstIvtBoxstack.getStack_code()); + baseTask.setVehicle_code(bstIvtBoxstack.getBox_no()); + baseTask.setRemark("二次分配成功"); + baseTask.setUpdate_time(DateUtil.now()); + taskService.updateById(baseTask); + return bstIvtBoxstack.getStack_code(); + } else { + throw new BadRequestException("暂时存在入库任务,等入库任务完成再分配"); + } + } + } + throw new BadRequestException("等待点所在列暂时无空位!"); } - public String againPutPoint(String taskCode) { - return null; - } - - public void getFinish() { + @Transactional(rollbackFor = Exception.class) + public void getFinish(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("该任务未执行或不存在!"); + } + BstIvtBoxstack boxstack = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getStack_code, baseTask.getPoint_code1())); + + boxstack.setCurrent_layer_count(0); + boxstack.setBox_no(""); + boxstack.setBox_spec(""); + boxstack.setUpdate_time(DateUtil.now()); + boxstackService.updateById(boxstack); } } 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 8a83f37..b93d8e9 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,12 +1,12 @@ 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.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.IBstIvtBoxStockUpPlanService; @@ -16,11 +16,10 @@ 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; 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 org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; @@ -46,7 +45,7 @@ public class AutoMxMoveTask { @Resource private IBstIvtBoxStockUpPlanService stockUpPlanService; - //木箱备货密集区->缓存区的自动搬运任务 + //木箱备货密集区、零散区->缓存区的自动搬运任务 public void run() { try { this.sendMxMove(); @@ -57,6 +56,7 @@ public class AutoMxMoveTask { @SneakyThrows + @Transactional(rollbackFor = Exception.class) public void sendMxMove() { log.info(THIS_CLASS + "-根据装箱计划木箱库移库定时任务开始执行扫描。"); RLock lock = redissonClient.getLock("boxMove"); @@ -65,8 +65,7 @@ public class AutoMxMoveTask { 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())); + .eq(BstIvtBoxStockUpPlan::getStock_plan_status, BoxStackEnum.STOCK_UP_STATUS.code("未开始"))); for (BstIvtBoxStockUpPlan stockUpPlan : stockUpPlans) { //备货木箱 String box_spec = stockUpPlan.getBox_spec(); @@ -76,7 +75,7 @@ public class AutoMxMoveTask { .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())) { + if (StringUtils.isBlank(stockUpPlan.getRemark())) { stockUpPlan.setRemark("有同规格的木箱移库备货计划正在执行"); stockUpPlanService.updateById(stockUpPlan); } @@ -88,118 +87,158 @@ public class AutoMxMoveTask { .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) { + if (StringUtils.isBlank(stockUpPlan.getRemark())) { + stockUpPlan.setRemark("木箱备货数量大于库存数量,暂时不生成"); + stockUpPlanService.updateById(stockUpPlan); + } continue; } - //判断木箱库中 - } - //获取装箱计划 - List zxjhs = new ArrayList<>(); - for (String box_spec : zxjhs) { - //判断木箱库是否存在该木箱规格的木箱 - List hasGoodsPoint = boxstackService.list(new LambdaQueryWrapper() - .eq(BstIvtBoxstack::getBox_spec, box_spec) - .notIn(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) - .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); - if (!CollectionUtil.isEmpty(hasGoodsPoint)) { - //查询缓存区可用库位的数量 - List hcqNoHasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() - .isNull(BstIvtBoxstack::getBox_spec) - .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) - .eq(BstIvtBoxstack::getX, 1) - .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用"))); - if (hcqNoHasGoodsPointList.size() <= 3) { - //获取缓存区相同木箱规格的的第一排的库位 - List hcqHasGoodsPointList = boxstackService.list(new LambdaQueryWrapper() - .eq(BstIvtBoxstack::getBox_spec, box_spec) - .eq(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 : hcqHasGoodsPointList) { - Integer x = bstIvtBoxstack.getX(); - Integer y = bstIvtBoxstack.getY(); - List list = boxstackService.list(new LambdaQueryWrapper() - .isNull(BstIvtBoxstack::getBox_spec) - .eq(BstIvtBoxstack::getY, y) - .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) - .notIn(BstIvtBoxstack::getX, x) - .eq(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) { - break; - } - } - } - //如果存在则根据装箱计划获取需要移库的木箱规格的数量 - int needBoxNum = 10; - int hasBoxNum = hasGoodsPoint.stream() - .map(BstIvtBoxstack::getCurrent_layer_count) - .filter(Objects::nonNull) - .mapToInt(Integer::intValue) - .sum(); - //如果需要的木箱数量小于木箱库内的该木箱规格的数量 - if (needBoxNum <= hasBoxNum) { - List sortedList = hasGoodsPoint.stream() - .sorted(Comparator - .comparing(BstIvtBoxstack::getY) - .thenComparing(Comparator.comparingInt(BstIvtBoxstack::getX).reversed())) - .collect(Collectors.toList()); - List selected = new ArrayList<>(); - int total = 0; - for (BstIvtBoxstack boxstack : sortedList) { - if (total >= needBoxNum) break; - Integer layerCount = boxstack.getCurrent_layer_count(); - selected.add(boxstack); - total += layerCount; - } - String task_group_id = IdUtil.getStringId(); - for (int i = 0; i < selected.size(); i++) { - JSONObject requestParam = new JSONObject(); - requestParam.put("needQty", needBoxNum); - JSONObject taskParam = new JSONObject(); - taskParam.put("task_group_id", task_group_id); - taskParam.put("material_code", box_spec); - taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("取放货二次分配")); - taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱移库")); - taskParam.put("vehicle_code", null); - taskParam.put("point_code1", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点1")); - taskParam.put("point_code2", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点2")); - taskParam.put("requestParam", requestParam); - mxMoveTask.createTask(taskParam); - } - } else { - String task_group_id = IdUtil.getStringId(); - //如果需要的该木箱规格的数量大于木箱库内的数量 - for (int i = 0; i < hasGoodsPoint.size(); i++) { - JSONObject requestParam = new JSONObject(); - requestParam.put("needQty", hasBoxNum); - JSONObject taskParam = new JSONObject(); - taskParam.put("task_group_id", task_group_id); - taskParam.put("material_code", box_spec); - taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("取放货二次分配")); - taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱移库")); - taskParam.put("vehicle_code", null); - taskParam.put("point_code1", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点1")); - taskParam.put("point_code2", BoxStackEnum.AGV_WAIT_POINT.code("木箱等待点2")); - taskParam.put("requestParam", requestParam); - mxMoveTask.createTask(taskParam); - } -// for (BstIvtBoxstack bstIvtBoxstack : hasGoodsPoint) { -// List boxstacklayerList = boxstacklayerService.list(new LambdaQueryWrapper() -// .eq(BstIvtBoxStockUpPlan::getStack_id, bstIvtBoxstack.getStack_id())); -// String vehicle_code = boxstacklayerList.stream() -// .map(BstIvtBoxStockUpPlan::getBox_code) -// .filter(Objects::nonNull) -// .filter(boxNo -> !boxNo.isEmpty()) -// .collect(Collectors.joining(",")); + //根据区域分组 + Map> groupedByPointStatus = boxstacks.stream() + .collect(Collectors.groupingBy(BstIvtBoxstack::getPoint_status)); + List miJiQuList = groupedByPointStatus.getOrDefault(BoxStackEnum.POINT_STATUS.code("密集区"), Collections.emptyList()); + List lingSanQuList = groupedByPointStatus.getOrDefault(BoxStackEnum.POINT_STATUS.code("零散区"), Collections.emptyList()); + if (miJiQuList.size() >= stock_up_num) { + Map> listMapByY = miJiQuList.stream() + .collect(Collectors.groupingBy(BstIvtBoxstack::getY)); + List sortedYs = new ArrayList<>(listMapByY.keySet()); + Collections.sort(sortedYs); + String task_group_id = stockUpPlan.getStockup_plan_id(); + // 已生成任务数 + int createdTaskCount = 0; + List taskList = new ArrayList<>(); + for (Integer y : sortedYs) { + List columns = listMapByY.get(y); + // 获取该列的等待点 + BstIvtBoxstack waitPoint = boxstackService.getOne(new LambdaQueryWrapper() + .eq(BstIvtBoxstack::getY, y) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("等待区"))); -// } - //TODO 是否修改装箱计划中剩余需要移库木箱的数量 + if (waitPoint == null) { + log.warn("列 {} 没有找到等待区库位", y); + continue; + } + + for (int i = 0; i < columns.size(); i++) { + if (createdTaskCount >= stock_up_num) break; + + List nextList = boxstackService.list(new LambdaQueryWrapper() + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(BstIvtBoxstack::getBox_spec, "") + ) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0)); + String point_code2 = null; + List point_code2List = taskList.stream().map(task -> task.getString("point_code2")).collect(Collectors.toList()); + for (int j = 0; j < nextList.size(); j++) { + BstIvtBoxstack bstIvtBoxstack = nextList.get(j); + List baseTasks = taskService.checkHaveTaskByNext(Arrays.asList(bstIvtBoxstack.getStack_code())); + if (CollectionUtils.isEmpty(baseTasks) && !point_code2List.contains(bstIvtBoxstack.getStack_code())) { + point_code2 = bstIvtBoxstack.getStack_code(); + break; + } + } + if (point_code2 == null) { + log.warn("缓存区没有空位"); + continue; + } + // 构建任务参数 + JSONObject requestParam = new JSONObject(); + JSONObject taskParam = new JSONObject(); + taskParam.put("task_group_id", task_group_id); + taskParam.put("material_code", box_spec); + taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("取货二次分配")); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱移库")); + taskParam.put("vehicle_code", null); + taskParam.put("point_code1", waitPoint.getStack_code()); + taskParam.put("point_code2", point_code2); + taskParam.put("requestParam", requestParam); + // 创建任务 + taskList.add(taskParam); + createdTaskCount++; + } + if (createdTaskCount >= stock_up_num) break; + } + + if (taskList.size() == stock_up_num) { + for (JSONObject taskParam : taskList) { + mxMoveTask.createTask(taskParam); + } + stockUpPlan.setStock_plan_status(BoxStackEnum.STOCK_UP_STATUS.code("执行中")); + stockUpPlan.setRemark(""); + stockUpPlan.setUpdate_time(DateUtil.now()); + stockUpPlanService.updateById(stockUpPlan); + break; + } + if (StringUtils.isBlank(stockUpPlan.getRemark())) { + stockUpPlan.setRemark("木箱缓存区空位不足,暂时不生成任务"); + stockUpPlan.setUpdate_time(DateUtil.now()); + stockUpPlanService.updateById(stockUpPlan); + } + } else if (lingSanQuList.size() >= stock_up_num) { + //查询零散区该规格数量 + String task_group_id = stockUpPlan.getStockup_plan_id(); + // 已生成任务数 + int createdTaskCount = 0; + List taskList = new ArrayList<>(); + for (int i = 0; i < lingSanQuList.size(); i++) { + if (createdTaskCount >= stock_up_num) { + break; + } + BstIvtBoxstack bstIvtBoxstack = lingSanQuList.get(i); + List emptyPointList = boxstackService.list(new LambdaQueryWrapper() + .and(wrapper -> wrapper + .isNull(BstIvtBoxstack::getBox_spec) + .or() + .eq(BstIvtBoxstack::getBox_spec, "") + ) + .eq(BstIvtBoxstack::getPoint_status, BoxStackEnum.POINT_STATUS.code("缓存区")) + .eq(BstIvtBoxstack::getIs_used, BoxStackEnum.IS_USED.code("启用")) + .eq(BstIvtBoxstack::getCurrent_layer_count, 0)); + List point_code2List = taskList.stream().map(task -> task.getString("point_code2")).collect(Collectors.toList()); + for (BstIvtBoxstack ivtBoxstack : emptyPointList) { + List schBaseTasks = taskService.checkHaveTaskByNext(Arrays.asList(ivtBoxstack.getStack_code())); + if (!CollectionUtils.isEmpty(schBaseTasks) || point_code2List.contains(ivtBoxstack.getStack_code())) { + continue; + } + JSONObject taskParam = new JSONObject(); + JSONObject requestParam = new JSONObject(); + taskParam.put("task_group_id", task_group_id); + taskParam.put("material_code", box_spec); + taskParam.put("vehicle_code2", BoxStackEnum.AGV_ACTION_TYPE.code("普通任务")); + taskParam.put("task_type", BoxStackEnum.TASK_TYPE.code("木箱移库")); + taskParam.put("vehicle_code", bstIvtBoxstack.getBox_no()); + taskParam.put("point_code1", bstIvtBoxstack.getStack_code()); + taskParam.put("point_code2", ivtBoxstack.getStack_code()); + taskParam.put("requestParam", requestParam); + taskList.add(taskParam); + break; + } + createdTaskCount++; + } + if (taskList.size() == stock_up_num) { + for (JSONObject taskParam : taskList) { + mxMoveTask.createTask(taskParam); + } + stockUpPlan.setRemark(""); + stockUpPlan.setStock_plan_status(BoxStackEnum.STOCK_UP_STATUS.code("执行中")); + stockUpPlanService.updateById(stockUpPlan); + break; + } + if (StringUtils.isBlank(stockUpPlan.getRemark())) { + stockUpPlan.setRemark("木箱缓存区空位不足,暂时不生成任务"); + stockUpPlan.setUpdate_time(DateUtil.now()); + stockUpPlanService.updateById(stockUpPlan); + } + } else { + if (StringUtils.isBlank(stockUpPlan.getRemark())) { + stockUpPlan.setRemark("密集区或零散区该规格数量小于备货数量,暂时不生成任务"); + stockUpPlan.setUpdate_time(DateUtil.now()); + stockUpPlanService.updateById(stockUpPlan); } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java index 0c91a1a..49d48c3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/controller/BstIvtBoxinfoController.java @@ -4,6 +4,7 @@ package org.nl.b_lms.storage_manage.database.controller; import com.alibaba.fastjson.JSONObject; import org.nl.b_lms.pdm.subpackagerelation.service.IpdmBiSubpackagerelationService; 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.logging.annotation.Log; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; @@ -37,7 +38,7 @@ public class BstIvtBoxinfoController { @GetMapping("/boxivtquery") @Log("查询木箱库存信息") - public ResponseEntity boxIvtQuery(@RequestParam Map whereJson, Pageable page) { + public ResponseEntity boxIvtQuery(@RequestParam Map whereJson, Pageable page) { return new ResponseEntity<>(iBstIvtBoxinfoService.boxIvtQuery(whereJson, page), HttpStatus.OK); } @@ -47,6 +48,13 @@ public class BstIvtBoxinfoController { return new ResponseEntity<>(iBstIvtBoxinfoService.saveBoxInfo(jsonObject), HttpStatus.OK); } + @PutMapping + @Log("修改木箱信息") + public ResponseEntity updateBoxInfo(@RequestBody JSONObject jsonObject) { + iBstIvtBoxinfoService.updateBoxInfo(jsonObject); + return new ResponseEntity<>( HttpStatus.OK); + } + @PostMapping("/getBoxInfo") @Log("查询木箱信息") public ResponseEntity query(@RequestBody JSONObject jsonObject) { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java index c43ddf9..82a962c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/database/service/IBstIvtBoxinfoService.java @@ -54,4 +54,6 @@ public interface IBstIvtBoxinfoService extends IService { * @return 木箱信息 */ Object boxIvtQuery(Map whereJson, Pageable page); + + void updateBoxInfo(JSONObject jsonObject); } 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 ab0523d..d1fbf5f 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,14 +3,13 @@