diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java index c9f0a05cb..7a4405cc5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/controller/BstIvtStockingivtController.java @@ -67,5 +67,12 @@ public class BstIvtStockingivtController { return new ResponseEntity<>(bstIvtStockingivtService.operateIvt(param), HttpStatus.OK); } + @Log("管芯托盘库存") + //@SaCheckPermission("@el.check('bstIvtStockingivt:del')") + @PostMapping("/showDetail") + public ResponseEntity showDetail(@RequestBody JSONObject param) { + return new ResponseEntity<>(bstIvtStockingivtService.showDetail(param), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java index d87e371b8..572634226 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java @@ -2,6 +2,9 @@ package org.nl.b_lms.bst.ivt.stockingivt.service; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.b_lms.bst.ivt.stockingivt.service.dto.ShowStockVo; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.common.domain.query.PageQuery; import com.baomidou.mybatisplus.extension.service.IService; import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt; @@ -78,4 +81,23 @@ public interface IBstIvtStockingivtService extends IService { BstIvtStockingivt getCanMovePointOne(String location, String pointType); JSONObject operateIvt(JSONObject jsonObject) ; + + /** + * 分组聚合获取需要管芯的托盘位置 + * @param pointType + * @param tube + * @param location + * @return + */ + List getNeedPaperTubePoint(String pointType, String tube, String location); + + /** + * 获取3个托盘的数据 + * @param location + * @param pointType + * @return + */ + List getCanMovePointList(String location, String pointType); + + List> showDetail(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java index 49eaa768d..42edf4d39 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java @@ -2,6 +2,8 @@ package org.nl.b_lms.bst.ivt.stockingivt.service.dao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.nl.b_lms.bst.ivt.stockingivt.service.dao.BstIvtStockingivt; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import java.util.List; @@ -29,4 +31,15 @@ public interface BstIvtStockingivtMapper extends BaseMapper { List getEmptyPointNotTask(String location, String pointType); BstIvtStockingivt getCanMovePointOne(String location, String pointType); + + /** + * 分组聚合获取备货区中数量够用的的货位 + * @param pointType 类型:0暂存位置,1靠近分切机 + * @param tube 纸管号 两个都是一样的,因此拿一个就行 + * @param location 位置:0上区域,1下区域 + * @return / + */ + List getNeedPaperTubePoint(String pointType, String tube, String location); + + List getCanMovePointList(String location, String pointType); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml index 41faca610..d534d57fb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml @@ -12,7 +12,7 @@ AND bs.ivt_status = '1' AND bs.is_used = '1' AND mp.material_code = #{tube} - AND mp.qty = ]]> #{qty} + AND mp.qty ]]> #{qty} AND 0 = (SELECT COUNT(*) FROM sch_base_task t WHERE (t.point_code1 = bs.point_code OR t.point_code2 = bs.point_code OR @@ -48,4 +48,46 @@ AND t.task_status '07') ORDER BY bs.ivt_status, mp.qty LIMIT 1 + + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java new file mode 100644 index 000000000..2a53896fe --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dto/ShowStockVo.java @@ -0,0 +1,20 @@ +package org.nl.b_lms.bst.ivt.stockingivt.service.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/3/20 + */ +@Data +public class ShowStockVo { + /** + * 0: 空, 1:空位,2:管芯 + */ + private String have_qzz; + + /** + * 管芯信息 + */ + private String tube; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java index feff28d31..ef6268a91 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java @@ -2,19 +2,19 @@ package org.nl.b_lms.bst.ivt.stockingivt.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.bst.ivt.papervehicle.service.IMdPbPapervehicleService; import org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle; +import org.nl.b_lms.bst.ivt.stockingivt.service.dto.ShowStockVo; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; -import org.nl.b_lms.sch.tasks.slitter.service.SlitterService; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.modules.common.exception.BadRequestException; import org.nl.common.domain.query.PageQuery; @@ -46,7 +46,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle papervehicle = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, row_num)); if (ObjectUtil.isNotEmpty(papervehicle) && !papervehicle.getMaterial_code().equals(material_code)) { throw new BadRequestException("当前排物料为【" + papervehicle.getMaterial_code() + "】,与绑定的物料不同,如需要请先清除库存,再进行绑定!"); @@ -180,7 +180,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle nextPaper = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, nextNum)); if (ObjectUtil.isNotEmpty(nextPaper)) { //获取第二排的纸管高度和纸管类型 @@ -194,7 +194,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle nextPaper = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, nextNum)); if (ObjectUtil.isNotEmpty(nextPaper)) { //获取后一排的纸管高度和纸管类型 @@ -208,7 +208,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + MdPbPapervehicle prePaper = papervehicleService.getOne(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, preNum)); if (ObjectUtil.isNotEmpty(prePaper)) { //获取后一排的纸管高度和纸管类型 @@ -227,7 +227,7 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) + papervehicleService.remove(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code) .eq(MdPbPapervehicle::getRow_num, row_num)); } //判断绑定的纸管是否在机械手范围内,如果存在的话把最新库存推送给电气 BstIvtStockingivt bstIvtStockingivt = bstIvtStockingivtMapper.selectOne(new LambdaQueryWrapper().eq(BstIvtStockingivt::getVehicle_code, vehicle_code)); if (bstIvtStockingivt != null && bstIvtStockingivt.getPoint_type().equals("1")) { - List list = PapervehicleService.list(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code)); + List list = papervehicleService.list(new LambdaQueryWrapper().eq(MdPbPapervehicle::getVehicle_code, vehicle_code)); JSONObject jo = new JSONObject(); SlitterTaskUtil.doSavePaperInfos(list, jo); jo.put("product_area", bstIvtStockingivt.getProduct_area()); @@ -265,4 +265,60 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl getNeedPaperTubePoint(String pointType, String tube, String location) { + return bstIvtStockingivtMapper.getNeedPaperTubePoint(pointType, tube, location); + } + + @Override + public List getCanMovePointList(String location, String pointType) { + return bstIvtStockingivtMapper.getCanMovePointList(location, pointType); + } + + @Override + public List> showDetail(JSONObject param) { + List> res = new ArrayList<>(); + // vehicle_code + String vehicleCode = param.getString("vehicle_code"); + if (ObjectUtil.isEmpty(vehicleCode)) { + // 5*5的0 + for (int i = 0; i < 5; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < 5; j++) { + ShowStockVo one = new ShowStockVo(); + one.setHave_qzz("0"); + one.setTube("-"); + list.add(one); + } + res.add(list); + } + } else { + // 获取数据 + List papers = papervehicleService.list(new LambdaQueryWrapper() + .eq(MdPbPapervehicle::getVehicle_code, vehicleCode) + .orderByAsc(MdPbPapervehicle::getRow_num)); + // 初始化 5*5的1 + for (int i = 0; i < 5; i++) { + // 获取对应排的数据 + int index = i; + MdPbPapervehicle mdPbPapervehicle = papers.stream().filter(p -> p.getRow_num().equals(index + 1)).findFirst().orElse(null); + int indexJ = mdPbPapervehicle == null ? 0 : mdPbPapervehicle.getQty().intValue(); + List list = new ArrayList<>(); + for (int j = 0; j < 5; j++) { + ShowStockVo one = new ShowStockVo(); + one.setHave_qzz("1"); + one.setTube("-"); + if (j < indexJ && indexJ != 0) { + one.setHave_qzz("2"); + one.setTube(mdPbPapervehicle.getMaterial_name()); + } + list.add(one); + } + res.add(list); + } + + } + return res; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java index 2a6971855..ae0abe769 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pda/controller/SlitterPdaController.java @@ -46,6 +46,12 @@ public class SlitterPdaController { public ResponseEntity downRolls2(@RequestBody JSONObject param) { return new ResponseEntity<>(slitterDevices.downRolls2(param), HttpStatus.OK); } + @PostMapping("/downRollsCheck") + @Log("下卷2提示确认") + @SaIgnore + public ResponseEntity downRollsCheck(@RequestBody JSONObject param) { + return new ResponseEntity<>(slitterDevices.downRollsCheck(param), HttpStatus.OK); + } @PostMapping("/moveVehicle") @Log("搬运废箔斗") diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java index 32af82318..284c52eda 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/IPdmBiSlittingproductionplanService.java @@ -138,4 +138,18 @@ public interface IPdmBiSlittingproductionplanService extends IService getAllHalfPlanRestruct(List qzzs); + + /** + * 获取能够套轴的分切计划,虚拟卷,固定是常规卷 + * @param day 天数 + * @return + */ + List getAllCutPlan2(Integer day); + + /** + * 根据设备获取计划 + * @param deviceCode + * @return + */ + List getXnPlanByDevice(String deviceCode); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java index b02a0d5b4..ccc2f8507 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.java @@ -19,4 +19,6 @@ public interface PdmBiSlittingproductionplanMapper extends BaseMapper getCurrentPlanInfos(SlitterPlanDistinctDto dto); List getAllHalfPlanRestruct(List qzzs); + + List getAllCutPlan2(Integer day); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml index cedb0d284..0013b4ac9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/dao/mapper/PdmBiSlittingproductionplanMapper.xml @@ -197,4 +197,31 @@ WHERE rn = 1; + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java index 518f58080..5ef1b8c3b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/bi/slittingproductionplan/service/impl/PdmBiSlittingproductionplanServiceImpl.java @@ -196,4 +196,18 @@ public class PdmBiSlittingproductionplanServiceImpl extends ServiceImpl getAllHalfPlanRestruct(List qzzs) { return pdmBiSlittingproductionplanMapper.getAllHalfPlanRestruct(qzzs); } + + @Override + public List getAllCutPlan2(Integer day) { + return pdmBiSlittingproductionplanMapper.getAllCutPlan2(day); + } + + @Override + public List getXnPlanByDevice(String deviceCode) { + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(PdmBiSlittingproductionplan::getResource_name, deviceCode) + .like(PdmBiSlittingproductionplan::getContainer_name, "虚拟") + .eq(PdmBiSlittingproductionplan::getIs_delete, "0"); + return this.list(lam); + } } 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 13b3e98b1..3848d8d63 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 @@ -94,6 +94,8 @@ public interface IschBaseTaskService extends IService { * @return */ List checkHaveStartTask(String pointCode); + + List checkHaveTrussTask(List codes); } 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 e7c0c6ce1..70a27265f 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 @@ -166,6 +166,21 @@ public class SchBaseTaskServiceImpl extends ServiceImpl checkHaveTrussTask(List codes) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.lt(SchBaseTask::getTask_status, "07") + .eq(SchBaseTask::getIs_delete, "0") + .and(la2 -> la2.in(SchBaseTask::getPoint_code1, codes) + .or() + .in(SchBaseTask::getPoint_code2, codes) + .or() + .in(SchBaseTask::getPoint_code3, codes) + .or() + .in(SchBaseTask::getPoint_code4, codes)); + return this.list(lam); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java index 0f6ad51e8..f40a7b044 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java @@ -24,6 +24,8 @@ import org.nl.b_lms.sch.tasks.slitter.TrussCallAirShaftTask; import org.nl.b_lms.sch.tasks.slitter.TrussCallShaftCacheTask; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterEnum; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; +import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.b_lms.sch.tasks.slitter.mapper.dto.SlitterPlanDistinctDto; import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.common.enums.NoticeTypeEnum; @@ -37,8 +39,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.Comparator; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -86,6 +93,9 @@ public class AutoCallAirShaftTask { public final static String IS_ONLY_PULLING = "IS_ONLY_PULLING"; public final static String TZ_DAY = "TZ_DAY"; + private static final DateTimeFormatter TIME_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + /** * hint: 目前只是考虑了上区域 * 执行套轴和拔轴任务的逻辑处理。 @@ -119,7 +129,15 @@ public class AutoCallAirShaftTask { } Integer integer = Integer.valueOf(ObjectUtil.isEmpty(tzDay.getValue()) ? "0" : tzDay.getValue()); // 2、获取分切计划数据 校验代数 todo: 顺序可能需要考虑 - List planAll = slittingproductionplanService.getAllCutPlan(integer); +// List planAll = slittingproductionplanService.getAllCutPlan(integer); + List planAllNoSort = slittingproductionplanService.getAllCutPlan2(integer); + // 排序 + List planAll = planAllNoSort.stream() + .sorted(Comparator.comparing( + dto -> LocalDateTime.parse(dto.getStart_time(), TIME_FORMATTER) + )) + .collect(Collectors.toList()); + // 过滤 String value = paramObj.getValue(); List prefixList = Arrays.asList(value.split("[,,]")); List plans = planAll.stream() @@ -313,28 +331,60 @@ public class AutoCallAirShaftTask { return plan.getFRP_material(); } }).collect(Collectors.toList()); + // 判断另一台穿拔轴机的管芯 + BstIvtShafttubeivt one = bstIvtShafttubeivtService.getOne(new LambdaQueryWrapper() + .ne(BstIvtShafttubeivt::getPoint_code, empty.getPoint_code()) + .eq(BstIvtShafttubeivt::getPoint_location, empty.getPoint_location()) + .eq(BstIvtShafttubeivt::getPoint_type, empty.getPoint_type()) + .eq(BstIvtShafttubeivt::getIs_used, "1")); + log.info("同位置的另一台穿拔轴机构:{}", one); + // 另一台所需要的数量 + int otherDeviceTubeSize = 0; + // 缺省的数量 + int needQuantity = 0; // 判断当前区域location对应的备货区是否含有相同的纸管 校验了不在搬运中 - // type=1, 关联对象material_code=纸管, qty > 0 - List useList = stockingivtService.getPaperTubePoint("1", tubes.get(0), location, tubes.size()); + // type=1(桁架底下的托盘), 关联对象material_code=纸管, qty > 0 + List useList = stockingivtService.getPaperTubePoint("1", tubes.get(0), location, 0); if (useList.size() > 0) { + // 求和,三个托盘中需要的管芯的数量。 + int sum = useList.stream().mapToInt(BstIvtStockingivt::getQty).sum(); + if (ObjectUtil.isNotEmpty(one)) { + if (one.getTube_code1().equals(tubes.get(0))) { + otherDeviceTubeSize = (int) Stream.of(one.getTube_code1(), one.getTube_code2()).filter(ObjectUtil::isNotEmpty).count(); + } + } // 说明三个位置中有包含此纸管的数据。 - return; + if (sum >= tubes.size() + otherDeviceTubeSize) { + return; + } + // 如果不够,就计算还缺多少个 + int needTemp = tubes.size() + otherDeviceTubeSize - sum; + // 兜底 + needQuantity = needTemp > 0 ? needTemp : 1; } - // 查找type=0的位置中是否存在 校验了不在搬运中 - List stockingivtList = stockingivtService.getPaperTubePoint("0", tubes.get(0), location, tubes.size()); - if (stockingivtList.size() == 0) { + // 查找type=0的位置(待命的托盘)中是否存在(需要判断的是单独一个托盘) 校验了不在搬运中 + List stockingivtList = stockingivtService.getNeedPaperTubePoint("0", tubes.get(0), location); + // 找一个点位: 目的需要的点位 + // 筛选单独托盘有超过所需数 + BhTubePointDto needPoint = null; + for (BhTubePointDto bhTubePointDto : stockingivtList) { + if (bhTubePointDto.getQty() >= needQuantity) { + needPoint = bhTubePointDto; + break; + } + } + if (needPoint == null) { // 不存在则站内通知 noticeService.createNotice("备货区找不到[" + tubes.get(0) + "]的纸管信息", "点位[" + empty.getPoint_name() + "]无法从备货区找到纸管信息", NoticeTypeEnum.EXCEPTION.getCode()); return; } - // 找一个点位: 目的需要的点位 - BstIvtStockingivt needPoint = stockingivtList.get(0); // 找到就创建AGV搬运任务 - // 筛选3个位置中数量最少的搬走 - BstIvtStockingivt needMovePoint = stockingivtService.getCanMovePointOne(location, "1"); + // 筛选3个位置中数量最少的搬走, 如果是空位,直接搬运过来 + List needMovePointList = stockingivtService.getCanMovePointList(location, "1"); // 空位就直接创建搬过来的任务 + BhTubeMovePointDto needMovePoint = needMovePointList.size() > 0 ? needMovePointList.get(0) : null; if (ObjectUtil.isEmpty(needMovePoint) || "0".equals(needMovePoint.getIvt_status())) { // 直接搬过来即可 JSONObject param = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java new file mode 100644 index 000000000..00aea2cd7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubeMovePointDto.java @@ -0,0 +1,24 @@ +package org.nl.b_lms.sch.tasks.slitter.mapper.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/3/19 + */ +@Data +public class BhTubeMovePointDto { + /** + * 点位 + */ + private String point_code; + /** + * 托盘号 + */ + private String vehicle_code; + private String ivt_status; + /** + * 数量 + */ + private Integer qty; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java new file mode 100644 index 000000000..6c63ba254 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/BhTubePointDto.java @@ -0,0 +1,24 @@ +package org.nl.b_lms.sch.tasks.slitter.mapper.dto; + +import lombok.Data; + +/** + * @Author: lyd + * @Date: 2025/3/18 + */ +@Data +public class BhTubePointDto { + + /** + * 点位 + */ + private String point_code; + /** + * 托盘号 + */ + private String vehicle_code; + /** + * 数量 + */ + private Integer qty; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java index 4d112329c..9629ebd41 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/mapper/dto/SlitterPlanDistinctDto.java @@ -37,4 +37,9 @@ public class SlitterPlanDistinctDto { * 气胀轴代数 */ private String qzz_generation; + + /** + * 开始时间 + */ + private String start_time; } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java index 52abf16c0..10ea40978 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/SlitterService.java @@ -334,4 +334,11 @@ public interface SlitterService { * @return */ JSONObject rollCacheManageTip(JSONObject param); + + /** + * 下卷确认 + * @param param + * @return + */ + JSONObject downRollsCheck(JSONObject param); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java index 3597eef2f..dacb2418a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java @@ -57,11 +57,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -810,7 +808,7 @@ public class SlitterServiceImpl implements SlitterService { if (list.size() == 0) { throw new BadRequestException("分切机" + device_code + " 的分切计划 " + qzzNo + " 不存在"); } - List tasks = taskService.checkHaveTask(device_code); + List tasks = taskService.checkHaveTrussTask(Arrays.asList(deviceCode.getUp_point_code(), deviceCode.getDown_point_code())); if (tasks.size() > 0) { throw new BadRequestException("分切机" + device_code + " 已经有存在的任务"); } @@ -1948,6 +1946,11 @@ public class SlitterServiceImpl implements SlitterService { String downRightSizeK = param.getString("down_right_size_k"); String downLeftSizeV = param.getString("down_left_size_v"); String downRightSizeV = param.getString("down_right_size_v"); + // 获取设备的 + List checkPlans = slittingproductionplanService.getXnPlanByDevice(deviceCode); + if (!doCheckCanCallAgain(checkPlans)) { + throw new BadRequestException("气胀轴正在准备或配送中、未使用,不允许二次呼叫套轴!"); + } List plans = new ArrayList<>(); // 虚拟计划 for (int i = 0; i < 4; i++) { @@ -2116,6 +2119,16 @@ public class SlitterServiceImpl implements SlitterService { return res; } + private boolean doCheckCanCallAgain(List checkPlans) { + // 如果is_paper_ok = 2那就不允许 + for (PdmBiSlittingproductionplan checkPlan : checkPlans) { + if ("2".equals(checkPlan.getIs_paper_ok())) { + return false; + } + } + return true; + } + @Override public List showManualView(JSONObject param) { return slitterMapper.showManualView(); @@ -2124,13 +2137,30 @@ public class SlitterServiceImpl implements SlitterService { @Override public JSONObject downRolls2(JSONObject param) { log.info("下卷2的输入参数为:{}", param); - // param: device_code, container + // param: device_code, container: [{"container_name":"子卷号", "site":"上下轴(1/2)"}] String device_code = param.getString("device_code"); - List tasks = taskService.checkHaveTask(device_code); + StIvtCutpointivt deviceCode = cutpointivtService.getPintByExtCode(device_code, false); + List tasks = taskService.checkHaveTrussTask(Arrays.asList(deviceCode.getUp_point_code(), deviceCode.getDown_point_code())); if (tasks.size() > 0) { throw new BadRequestException("分切机" + device_code + " 已经有存在的任务"); } - return mesSlittingMachineSendMaterial(param); + JSONArray conArray = param.getJSONArray("container"); + List containerNames = new ArrayList<>(); + for (int i = 0; i < conArray.size(); i++) { + JSONObject container = conArray.getJSONObject(i); + containerNames.add(container.getString("container_name")); + } + List plans = slittingproductionplanService.getByContainerNames(containerNames); + // 兜底校验:判断与实际是否一致 + SlitterTaskUtil.validateConsistency(conArray, plans); + JSONObject reqParam = new JSONObject(); + reqParam.put("device_code", device_code); + reqParam.put("container", containerNames); + mesSlittingMachineSendMaterial(reqParam); + JSONObject res = new JSONObject(); + res.put("status", HttpStatus.HTTP_OK); + res.put("message", "子卷出站任务生成成功!"); + return res; } @Override @@ -2174,4 +2204,31 @@ public class SlitterServiceImpl implements SlitterService { res.put("data", data); return res; } + + @Override + public JSONObject downRollsCheck(JSONObject param) { + // param: device_code, container: [{"container_name":"子卷号", "site":"上下轴(1/2)"}] + JSONObject res = new JSONObject(); + String device_code = param.getString("device_code"); + List tasks = taskService.checkHaveTask(device_code); + if (tasks.size() > 0) { + throw new BadRequestException("分切机" + device_code + " 已经有存在的任务"); + } + JSONArray conArray = param.getJSONArray("container"); + List containerNames = new ArrayList<>(); + for (int i = 0; i < conArray.size(); i++) { + JSONObject container = conArray.getJSONObject(i); + containerNames.add(container.getString("container_name")); + } + List plans = slittingproductionplanService.getByContainerNames(containerNames); + + try { + SlitterTaskUtil.validateConsistency(conArray, plans); + } catch (Exception e) { + res.put("flag", "2"); + res.put("message", e.getMessage()); + } + res.put("flag", "1"); + return res; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java index 5c04ea3d6..76327a847 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/util/SlitterTaskUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.nl.b_lms.bst.ivt.papervehicle.service.dao.MdPbPapervehicle; import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; import org.nl.b_lms.sch.tasks.slitter.constant.SlitterConstant; @@ -14,12 +15,15 @@ import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @Author: lyd * @Description: 分切部分的任务工具类 * @Date: 2024/4/12 */ +@Slf4j public class SlitterTaskUtil { /** B1区域 */ @@ -452,4 +456,44 @@ public class SlitterTaskUtil { default: throw new BadRequestException("站点输入错误: " + input); } } + + /** + * 下卷前置校验,判断卷的上下轴属性与实际是否一致 - 校验子卷属性 + * @param jsonArray 子卷数组 + * @param plans 计划 + */ + public static void validateConsistency(JSONArray jsonArray, List plans) { + if (plans.size() == 0) { + throw new BadRequestException("计划未找到,请确保MES已推送。"); + } + // 1. 将 List 转为 Map + Map planMap = plans.stream() + .collect(Collectors.toMap( + p -> p.getContainer_name(), + p -> p.getUp_or_down(), + // 如果有重复 key,保留第一个(按需调整) + (existing, replacement) -> existing + )); + + // 2. 遍历 JSONArray + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject item = jsonArray.getJSONObject(i); + String containerName = item.getString("container_name"); + String site = item.getString("site"); + + // 3. 检查 Plan 中是否存在对应的 container_name + if (!planMap.containsKey(containerName)) { + throw new BadRequestException("校验失败: container_name " + containerName + " 在计划列表中不存在"); + } + + // 4. 比较 site 和 up_or_down 是否一致 + String expectedUpDown = planMap.get(containerName); + if (!expectedUpDown.equals(site)) { + throw new BadRequestException("校验失败: 子卷号 " + containerName + + " 的上下轴位置值 '" + site + + "' 与计划中的上下轴位置值 '" + expectedUpDown + "' 不一致"); + } + } + log.info("分切下卷计划位置校验通过!"); + } } diff --git a/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java b/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java index e7c879339..8fbb5fc47 100644 --- a/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java +++ b/lms/nladmin-system/src/test/java/org/nl/init/EventTest.java @@ -1,5 +1,6 @@ package org.nl.init; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -11,11 +12,16 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.BstIvtShafttubeivt; import org.nl.b_lms.bst.ivt.shafttubeivt.service.dao.mapper.BstIvtShafttubeivtMapper; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.IPdmBiSlittingproductionplanService; +import org.nl.b_lms.pdm.bi.slittingproductionplan.service.dao.PdmBiSlittingproductionplan; import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation; import org.nl.b_lms.pdm.subpackagerelation.dao.mapper.PdmBiSubpackagerelationMapper; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; +import org.nl.b_lms.sch.point.dao.mapper.SchBasePointMapper; import org.nl.b_lms.sch.point.service.IbstIvtPackageinfoivtService; import org.nl.b_lms.sch.tasks.first_floor_area.*; +import org.nl.b_lms.sch.tasks.slitter.service.impl.SlitterServiceImpl; +import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBoxManageService; import org.nl.common.enums.ContainerLevelEnum; import org.nl.common.enums.PackageInfoIvtEnum; @@ -26,6 +32,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -62,6 +69,43 @@ public class EventTest { private PdmBiSubpackagerelationMapper pdmBiSubpackagerelationMapper; @Autowired private BstIvtShafttubeivtMapper bstIvtShafttubeivtMapper; + @Autowired + private SchBasePointMapper schBasePointMapper; + @Autowired + private IPdmBiSlittingproductionplanService slittingproductionplanService; + @Test + public void sss() { + System.out.println(schBasePointMapper.queryKZPoint()); + } + + @Test + public void getWeight() { + List plans = slittingproductionplanService.getByQzzNos(Arrays.asList("B203-4")); + String weights = ""; + SlitterTaskUtil.setPaperWeightStr(weights, plans); + slittingproductionplanService.updateBatchById(plans); + System.out.println(weights); + } + + @Test + public void testValidate() { + // 示例数据 + JSONArray jsonArray = JSONArray.parseArray( + "[{\"container_name\":\"A\", \"site\":\"1\"},{\"container_name\":\"B\", \"site\":\"2\"}]" + ); + + PdmBiSlittingproductionplan p1 = new PdmBiSlittingproductionplan(); + PdmBiSlittingproductionplan p2 = new PdmBiSlittingproductionplan(); + p1.setContainer_name("A"); + p1.setUp_or_down("1"); + p2.setContainer_name("B"); + p2.setUp_or_down("2"); + List plans = Arrays.asList(p1, p2); + + // 执行校验 + SlitterTaskUtil.validateConsistency(jsonArray, plans); + } + @Test public void sl() { diff --git a/lms/nladmin-ui/src/assets/images/empty.png b/lms/nladmin-ui/src/assets/images/empty.png new file mode 100644 index 000000000..ee838b670 Binary files /dev/null and b/lms/nladmin-ui/src/assets/images/empty.png differ diff --git a/lms/nladmin-ui/src/assets/images/empty2.png b/lms/nladmin-ui/src/assets/images/empty2.png new file mode 100644 index 000000000..fb9656491 Binary files /dev/null and b/lms/nladmin-ui/src/assets/images/empty2.png differ diff --git a/lms/nladmin-ui/src/assets/images/showTube.png b/lms/nladmin-ui/src/assets/images/showTube.png new file mode 100644 index 000000000..8120004c7 Binary files /dev/null and b/lms/nladmin-ui/src/assets/images/showTube.png differ diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js index bb77adce0..cab0e3453 100644 --- a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/bstIvtStockingivt.js @@ -24,4 +24,12 @@ export function edit(data) { }) } -export default { add, edit, del } +export function showDetail(data) { + return request({ + url: 'api/bstIvtStockingivt/showDetail', + method: 'post', + data + }) +} + +export default { add, edit, del, showDetail } diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue index daaa66ac9..2c61428ee 100644 --- a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/index.vue @@ -83,12 +83,24 @@ - + - + + + - + - + + + - - @@ -125,6 +139,7 @@ + @@ -135,6 +150,7 @@ import rrOperation from '@crud/RR.operation' import crudOperation from '@crud/CRUD.operation' import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' +import TubeDialog from '@/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue' const defaultForm = { ivt_id: null, @@ -159,7 +175,7 @@ const defaultForm = { export default { name: 'BstIvtStockingivt', dicts: ['STOCK_POINT_STATUS', 'STOCK_POINT_TYPE', 'point_location'], - components: { pagination, crudOperation, rrOperation, udOperation }, + components: { TubeDialog, pagination, crudOperation, rrOperation, udOperation }, mixins: [presenter(), header(), form(defaultForm), crud()], cruds() { return CRUD({ @@ -203,12 +219,28 @@ export default { create_time: [ { required: true, message: '创建时间不能为空', trigger: 'blur' } ] - }} + }, + showView: false, + vehicle_code: '', + rows: {} + } }, methods: { // 钩子:在获取表格数据之前执行,false 则代表不获取数据 [CRUD.HOOK.beforeRefresh]() { return true + }, + toView(index, row) { + // vehicle_code, point_code + console.log(row) + const param = { + vehicle_code: this.vehicle_code + } + crudBstIvtStockingivt.showDetail(param).then(res => { + this.vehicle_code = row.vehicle_code + this.showView = true + this.rows = res + }) } } } diff --git a/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue new file mode 100644 index 000000000..0798b8676 --- /dev/null +++ b/lms/nladmin-ui/src/views/b_lms/bst/ivt/stockingivt/tubeDialog.vue @@ -0,0 +1,125 @@ + + + + +