zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/LocDetlDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/OutLocDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/enums/IoWorkType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/enums/WorkNoType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/param/StockOutParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/WorkService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/WorkServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/WorkController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/LocDetlDto.java
New file @@ -0,0 +1,37 @@ package com.zy.asrs.common.domain.dto; import com.zy.asrs.common.wms.entity.LocDetl; /** * Created by vincent on 2020/6/17 */ public class LocDetlDto { private LocDetl locDetl; private Double count; public LocDetlDto() { } public LocDetlDto(LocDetl locDetl, Double count) { this.locDetl = locDetl; this.count = count; } public LocDetl getLocDetl() { return locDetl; } public void setLocDetl(LocDetl locDetl) { this.locDetl = locDetl; } public Double getCount() { return count; } public void setCount(Double count) { this.count = count; } } zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/OutLocDto.java
New file @@ -0,0 +1,68 @@ package com.zy.asrs.common.domain.dto; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.wms.entity.LocDetl; import com.zy.asrs.common.wms.service.LocDetlService; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.SpringUtils; import com.zy.asrs.framework.exception.CoolException; import lombok.Data; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created by vincent on 2020/6/17 */ @Data public class OutLocDto { private String locNo; private Long hostId; private List<LocDetlDto> locDetlDtos = new ArrayList<>(); public OutLocDto() { } public OutLocDto(String locNo, LocDetlDto locDetlDto, Long hostId) { this.locNo = locNo; this.locDetlDtos.add(locDetlDto); this.hostId = hostId; } public boolean isAll(){ List<LocDetlDto> locDetlDtosCp = new ArrayList<>(this.locDetlDtos); // 查询当前库位号所有的库存明细 LocDetlService locDetlService = SpringUtils.getBean(LocDetlService.class); List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocNo, this.locNo).eq(LocDetl::getHostId, this.hostId)); if (locDetls == null || locDetls.isEmpty()){ throw new CoolException("检索库存明细失败,库位号=" + this.locNo); } int sameNumber = 0; for (LocDetl locDetl : locDetls) { Iterator<LocDetlDto> iterator = locDetlDtosCp.iterator(); while (iterator.hasNext()) { LocDetlDto next = iterator.next(); if (!next.getLocDetl().getMatnr().equals(locDetl.getMatnr())) { continue; } if (!Cools.eq(next.getLocDetl().getBatch(), locDetl.getBatch())) { continue; } if (next.getCount() > locDetl.getAnfme()) { throw new CoolException("服务器内部错误"); } if (next.getCount().equals(locDetl.getAnfme())) { sameNumber++; iterator.remove(); break; } } } return sameNumber == locDetls.size(); } } zy-asrs-common/src/main/java/com/zy/asrs/common/domain/enums/IoWorkType.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.common.domain.enums; public enum IoWorkType { ALL_IN, PICK_IN, ALL_OUT, PICK_OUT, CHECK_OUT, ; } zy-asrs-common/src/main/java/com/zy/asrs/common/domain/enums/WorkNoType.java
New file @@ -0,0 +1,48 @@ package com.zy.asrs.common.domain.enums; import com.zy.asrs.framework.exception.CoolException; /** * 工作号排序规则 */ public enum WorkNoType { PAKIN(0), PICK(1), PAKOUT(2), OTHER(3), ; public Integer type; WorkNoType(Integer type) { this.type = type; } public static Integer getWorkNoType(Integer ioType) { switch (ioType) { case 1: return PAKIN.type; case 10: return PAKIN.type; case 11: return PICK.type; case 53: case 54: case 57: return PICK.type; case 101: return PAKOUT.type; case 103: case 104: case 107: return PICK.type; case 110: return PAKOUT.type; default: break; } throw new CoolException(ioType + "的任务类型无法生成工作号"); } } zy-asrs-common/src/main/java/com/zy/asrs/common/domain/param/StockOutParam.java
New file @@ -0,0 +1,36 @@ package com.zy.asrs.common.domain.param; import lombok.Data; import java.util.List; /** * Created by vincent on 2020/6/13 */ @Data public class StockOutParam { // 出站口 private Integer outSite; // 物料编号集合 private List<LocDetl> locDetls; @Data public static class LocDetl { // 库位号 private String locNo; // 商品编号 private String matnr; // 序列码 private String batch; // 数量 private Double count; } } zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/WorkService.java
@@ -1,6 +1,11 @@ package com.zy.asrs.common.wms.service; import com.zy.asrs.common.domain.dto.LocDetlDto; import com.zy.asrs.common.domain.enums.IoWorkType; import com.zy.asrs.common.domain.param.FullStoreParam; import com.zy.asrs.common.domain.param.StockOutParam; import java.util.List; public interface WorkService { @@ -10,6 +15,11 @@ * @return 库位号 */ String startupFullPutStore(FullStoreParam param, Long userId, Long hostId); /** * 出库作业 */ void startupFullTakeStore(StockOutParam param, Long userId, Long hostId); /** * 手动完成工作档 @@ -26,5 +36,7 @@ */ void pickWrkMast(String workNo, Long userId, Long hostId); void stockOut(Integer staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId, Long hostId); } zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/WorkServiceImpl.java
@@ -1,12 +1,14 @@ package com.zy.asrs.common.wms.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.domain.dto.DetlDto; import com.zy.asrs.common.domain.dto.LocTypeDto; import com.zy.asrs.common.domain.dto.StartupDto; import com.zy.asrs.common.domain.dto.*; import com.zy.asrs.common.domain.entity.StaDesc; import com.zy.asrs.common.domain.enums.IoWorkType; import com.zy.asrs.common.domain.enums.WorkNoType; import com.zy.asrs.common.domain.param.FullStoreParam; import com.zy.asrs.common.domain.param.StockOutParam; import com.zy.asrs.common.sys.service.StaDescService; import com.zy.asrs.common.utils.Utils; import com.zy.asrs.common.wms.entity.*; import com.zy.asrs.common.wms.service.*; import com.zy.asrs.framework.common.BaseRes; @@ -17,9 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -49,6 +49,8 @@ private WrkDetlLogService wrkDetlLogService; @Autowired private StaDescService staDescService; @Autowired private LocDetlService locDetlService; @Override @Transactional @@ -138,6 +140,120 @@ @Override @Transactional public void startupFullTakeStore(StockOutParam param, Long userId, Long hostId) { // 获取库位明细 List<LocDetlDto> locDetlDtos = new ArrayList<>(); for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) { if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) { LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(), hostId); if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount())); } } if (!locDetlDtos.isEmpty()) { // 启动出库开始 101.出库 stockOut(param.getOutSite(), locDetlDtos, null, userId, hostId); } else { throw new CoolException("库存不存在"); } } @Override public void stockOut(Integer staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId, Long hostId) { Date now = new Date(); // 合并同类项 Set<String> locNos = new HashSet<>(); List<OutLocDto> dtos = new ArrayList<>(); for (LocDetlDto locDetlDto : locDetlDtos) { String locNo = locDetlDto.getLocDetl().getLocNo(); if (locNos.contains(locNo)) { for (OutLocDto dto : dtos) { if (dto.getLocNo().equals(locNo)) { dto.getLocDetlDtos().add(locDetlDto); break; } } } else { locNos.add(locNo); dtos.add(new OutLocDto(locNo, locDetlDto, hostId)); } } Integer ioType = null; // 生成工作档 for (OutLocDto dto : dtos) { // 判断入出库类型:101.全板出库 or 103.拣料出库 if (ioWorkType == null) { ioType = dto.isAll() ? 101 : 103; } else if (ioWorkType.equals(IoWorkType.CHECK_OUT)) { ioType = 107; } assert ioType != null; // 获取库位 LocMast locMast = locMastService.getOne(new LambdaQueryWrapper<LocMast>().eq(LocMast::getLocNo, dto.getLocNo()).eq(LocMast::getHostId, hostId)); // 获取路径 StaDesc staDesc = staDescService.getOne(new LambdaQueryWrapper<StaDesc>().eq(StaDesc::getTypeNo, ioType).eq(StaDesc::getDeviceStn, staNo).eq(StaDesc::getHostId, hostId)); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(101L); // 工作状态:101.生成出库 wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setSourceStaNo(staDesc.getDeviceStn()); // 源站 wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setAppeUser(String.valueOf(userId)); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(String.valueOf(userId)); wrkMast.setModiTime(now); wrkMast.setHostId(hostId); if (!wrkMastService.save(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:" + dto.getLocNo()); } // 生成工作档明细 for (LocDetlDto detlDto : dto.getLocDetlDtos()) { if (detlDto.getCount() == null || detlDto.getCount() <= 0.0D) { continue; } WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(detlDto.getLocDetl()); wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号 wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); Double anfme = ioType == 101 ? detlDto.getLocDetl().getAnfme() : detlDto.getCount(); wrkDetl.setAnfme(anfme); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); wrkDetl.setWrkMastId(wrkMast.getId()); if (!wrkDetlService.save(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } } // 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中 locMast = locMastService.getOne(new LambdaQueryWrapper<LocMast>().eq(LocMast::getLocNo, dto.getLocNo()).eq(LocMast::getHostId, hostId)); if (locMast.getLocSts().equals("F")) { locMast.setLocSts(ioType == 101 ? "R" : "P"); locMast.setModiUser(userId); locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("预约库位状态失败,库位号:" + dto.getLocNo()); } } else { throw new CoolException(dto.getLocNo() + "库位不是在库状态"); } } } @Override @Transactional public void completeWrkMast(String workNo, Long userId, Long hostId) { WrkMast wrkMast = wrkMastService.getOne(new LambdaQueryWrapper<WrkMast>().eq(WrkMast::getWrkNo, workNo).eq(WrkMast::getHostId, hostId)); if (Cools.isEmpty(wrkMast)){ zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/WorkController.java
@@ -1,6 +1,7 @@ package com.zy.asrs.wms.controller; import com.zy.asrs.common.domain.param.FullStoreParam; import com.zy.asrs.common.domain.param.StockOutParam; import com.zy.asrs.common.web.BaseController; import com.zy.asrs.common.wms.service.BasDevpService; import com.zy.asrs.common.wms.service.WorkService; @@ -78,6 +79,13 @@ return R.ok("入库启动成功").add(workService.startupFullPutStore(fullStoreParam, getUserId(), getHostId())); } @RequestMapping("/plate/out/start") @ManagerAuth(memo = "出库作业") public R fullStoreTakeStart(@RequestBody StockOutParam param) { workService.startupFullTakeStore(param, getUserId(), getHostId()); return R.ok("出库启动成功"); } @RequestMapping("/hand/control/wrkMast") @ManagerAuth(memo = "手动处理工作档") public R handControlWrkMast(@RequestParam String workNo,