zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OutController.java
@@ -93,12 +93,14 @@ throw new CoolException("波次不能为空"); } //获取出库订单 List<Long> orderIds = new ArrayList<>(); List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId)); for (Order order : orders) { orderIds.add(order.getId()); } //获取订单波次明细 List<MergePreviewDto> dtos = new ArrayList<>(); List<WaveDetl> waveDetls = waveDetlService.list(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, waveId)); for (WaveDetl waveDetl : waveDetls) { @@ -108,12 +110,13 @@ double anfme = waveDetl.getAnfme() - waveDetl.getWorkQty(); dto.setMatnr(waveDetl.getMatnr()); dto.setBatch(waveDetl.getBatch()); dto.setWorkQty(0.0); dto.setAnfme(anfme); dto.setOrderIds(orderIds); dto.setFieldParams(JSON.parseArray(waveDetl.getFieldParams(), FieldParam.class)); dto.setFieldParamsEncode(waveDetl.getFieldParams()); } //获取波次明细库位信息 List<MergePreviewResultDto> resultDtos = outManage.orderOutMergeLocPreview(dtos); return R.ok().add(resultDtos); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
@@ -65,6 +65,11 @@ private String matnr; /** * 已预约库存(平库中使用) */ private Double workQty; /** * 订单号 */ @ApiModelProperty(value= "订单号") zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/WaitPakin.java
@@ -4,6 +4,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import com.zy.asrs.wms.asrs.service.MatService; import com.zy.asrs.wms.asrs.service.OrderDetlService; import com.zy.asrs.wms.asrs.service.OrderService; import com.zy.asrs.wms.system.entity.Host; @@ -183,6 +184,15 @@ return null; } public Long getMatnrId$() { MatService matService = SpringUtils.getBean(MatService.class); Mat byId = matService.getById(this.matnr); if (!Cools.isEmpty(byId)) { return byId.getId(); } return null; } public OrderDetl getDetl$(){ OrderDetlService service = SpringUtils.getBean(OrderDetlService.class); OrderDetl orderDetl = service.getById(this.detlId); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/MergePreviewDto.java
@@ -17,6 +17,8 @@ private Double anfme; private Double workQty; private List<Long> orderIds; private List<FieldParam> fieldParams; zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/MergePreviewResultLocDto.java
@@ -13,4 +13,6 @@ private Double anfme; private Double workQty; } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/statistics/ViewInOut.java
@@ -5,7 +5,7 @@ import lombok.Data; @Data @TableName("view_in_out") //@TableName("view_in_out") public class ViewInOut { @ApiModelProperty("日期") zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/statistics/ViewWorkCountIn.java
@@ -5,7 +5,7 @@ import lombok.Data; @Data @TableName("view_work_count_in") //@TableName("view_work_count_in") public class ViewWorkCountIn { @ApiModelProperty("入库日期") zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -14,11 +14,13 @@ import com.zy.asrs.wms.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * 出库管理 @@ -152,7 +154,6 @@ if (orderDetlIds.isEmpty()) { throw new CoolException("订单明细不能为空"); } List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getId, orderDetlIds).orderByAsc(OrderDetl::getOrderNo, OrderDetl::getCreateTime)); if (orderDetls.isEmpty()) { throw new CoolException("订单明细不存在"); @@ -160,8 +161,39 @@ orderDetls = orderDetlService.parseDetl(orderDetls); HashMap<Long, List<LocDetl>> orderDetlLocMap = new HashMap<>(); //出库订单合计 List<OutDetlDto> detlDtos = new ArrayList<>(); //获取平仓中符合条件的所有库位 orderDetls.forEach(detl -> { double issued = Optional.of(detl.getAnfme() - detl.getQty() - detl.getWorkQty()).orElse(0.0D); if (issued <= 0.0D) { return; } List<LocDetl> locs = locDetlService.queryFlatStock(detl.getMat$().getMatnr(), detl.getBatch(), detl.getUniqueField()); //平库有当明物料优先出库 if (!locs.isEmpty()) { for (LocDetl locDetl : locs) { if (issued > 0) { OutDetlDto outDetlDto = new OutDetlDto(); outDetlDto.setDetlId(locDetl.getId()); outDetlDto.setAnfme(issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued); outDetlDto.setStock(locDetl.getAnfme()); outDetlDto.setOrderDetlId(locDetl.getId()); detlDtos.add(outDetlDto); issued = issued - outDetlDto.getAnfme(); } } //订单明细需出库数量 double workQty = Optional.of(detl.getAnfme() - detl.getQty() - detl.getWorkQty()).orElse(0.0D); //更新平库订单明细的实际可用数量 detl.setWorkQty(workQty - issued); } }); /** * 平库优先出库完成后,当订单明细workQty + qty 还不等于anfme时,查询TCU库 */ //获取TCU符合条件库位 for (OrderDetl orderDetl : orderDetls) { double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D); if (issued <= 0.0D) { continue; } @@ -270,7 +302,7 @@ return previewDtos; } @Transactional @Transactional(rollbackFor = Exception.class) public void orderOutBatch(List<OrderOutBatchPreviewDto> param) { if (param == null) { throw new CoolException("参数不能为空"); @@ -509,6 +541,46 @@ sortParams.add(sortParam); List<MergePreviewResultDto> resultDtos = new ArrayList<>(); param.forEach(pars -> { List<MergePreviewResultLocDto> locDtos = new ArrayList<>(); List<LocDetl> locs = locDetlService.queryFlatStock(pars.getMatnr(), pars.getBatch(), pars.getFieldParams()); if (!locs.isEmpty()) { double anfme = pars.getAnfme() - pars.getWorkQty(); for (LocDetl detl : locs) { Loc loc = locService.getById(detl.getLocId()); if (loc == null) { throw new CoolException("库位数据不存在"); } if (loc.getLocStsId() != LocStsType.F.val()) { continue; } MergePreviewResultLocDto locDto = new MergePreviewResultLocDto(); locDto.setLocId(detl.getLocId()); locDto.setLocNo(detl.getLocNo()); locDto.setLocDetlId(detl.getId()); locDtos.add(locDto); //库位实际可用数量 double surplusQty = detl.getAnfme() - detl.getWorkQty(); //波次数量减去库位可用数量后,盈余数量 // double workQty = anfme - surplusQty; anfme = anfme - surplusQty; if (anfme > 0) { locDto.setAnfme(detl.getAnfme()); locDto.setWorkQty(surplusQty); } else { locDto.setAnfme(anfme); locDto.setWorkQty(anfme); break; } } pars.setWorkQty(pars.getAnfme() - pars.getWorkQty() - anfme); } }); for (MergePreviewDto dto : param) { List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams); if(locDetls.isEmpty()){ @@ -525,10 +597,9 @@ MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(dto); resultDto.setLocs(locDtos); resultDto.setOrderIds(dto.getOrderIds()); Double anfme = dto.getAnfme(); resultDto.setLocs(locDtos); for (LocDetl locDetl : locDetls) { Loc loc = locService.getById(locDetl.getLocId()); if (loc == null) { @@ -581,7 +652,18 @@ return resultDtos; } @Transactional /** * 波次生成出库任务 * UTC出库任务逻辑不变,添加平库判别逻辑 * 1. 获取波次订单明细,判别是否为平库订单 * 2. 平库订单生成拣货单, UTC订单生成出库任务 * 3. 平库单据明细所占库位物料数量加锁 * 4. 生成出库单PDA端,统一出库扣减库存 * 5. 生成拣货单历史档,出库单据加入历史档,删除原单据 * 6. 删除波次列表数据 * @param dto */ @Transactional(rollbackFor = Exception.class) public void orderOutMerge(OrderOutMergeParamDto dto) { if(dto == null){ throw new CoolException("参数不能为空"); @@ -804,11 +886,6 @@ throw new CoolException("参数不能为空"); } // Long waveId = dto.getWaveId(); // String waveNo = dto.getw List<Long> filterParamsList = new ArrayList<>(); List<OrderOutMergeParam> filterParams = new ArrayList<>(); @@ -943,7 +1020,7 @@ //TODO 确认后,需将注释打开 String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField()); WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, waveId)); WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); // WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, wave.getId()), false); if (waveDetl == null) { throw new CoolException("波次数据不存在"); @@ -955,12 +1032,6 @@ } } //出库库存更新逻辑 // List<Long> orderIds = dto.getList().stream().findFirst().get().getOrderIds(); // List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getOrderId, orderIds)); // orderDetls.forEach(orderDetl -> { // orderUtils.updateWorkQty(orderDetl.getId(), orderDetl.getAnfme()); // }); //库位F => R loc.setLocStsId(LocStsType.R.val()); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java
@@ -26,4 +26,5 @@ List<Map<String,Object>> listSuitableMat( @Param("param") List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam); List<Map<String, Object>> queryFlatStock(@Param("matnr") String matnr, @Param("batch") String batch,@Param("params") List<FieldParam> params); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
@@ -29,4 +29,5 @@ void removeLocDetl(Long locId); List<LocDetl> queryFlatStock(String matnr, String batch, List<FieldParam> uniqueField); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
@@ -19,6 +19,7 @@ import com.zy.asrs.wms.asrs.service.LocService; import com.zy.asrs.wms.common.domain.BaseParam; import com.zy.asrs.wms.common.domain.PageParam; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -132,7 +133,7 @@ if (loc == null) { continue; } //当前库位状态是否在库 if(!loc.getLocStsId().equals(LocStsType.F.val())){ continue; } @@ -225,4 +226,17 @@ } } } @Override public List<LocDetl> queryFlatStock(String matnr, String batch, List<FieldParam> params) { //获取平库中符合条件的库位 List<Map<String, Object>> list = viewLocDetlMapper.queryFlatStock(matnr, batch, params); List<LocDetl> detls = new ArrayList<>(); list.forEach(action -> { LocDetl locDetl = new LocDetl(); BeanUtils.copyProperties(action, locDetl); detls.add(locDetl); }); return detls; } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
@@ -133,11 +133,11 @@ LocDetl locDetl = new LocDetl(); locDetl.setAnfme(pakin.getAnfme()); locDetl.setBatch(pakin.getBatch()); locDetl.setMatnr(pakin.getMatnr()); locDetl.setMatId(pakin.getMatnrId$());; locDetl.setCreateTime(new Date()); locDetl.setOrderNo(pakin.getOrderNo()); locDetl.setLocNo(loc.getLocNo()); locDetl.setLocId(loc.getLocStsId()); locDetl.setLocId(loc.getId()); locDetl.setMatnr(pakin.getMatnr()); locDetl.setMemo(pakin.getMemo()); locDetl.setUpdateTime(new Date()); @@ -149,7 +149,6 @@ }); //删除组拖档,加入历史组拖档 List<WaitPakinLog> waitPakinLogs = new ArrayList<>(); waitPakins.forEach(waitPakin -> { WaitPakinLog pakinLog = new WaitPakinLog(); BeanUtils.copyProperties(waitPakin, pakinLog); zy-asrs-wms/src/main/resources/application.yml
@@ -13,8 +13,8 @@ validation-timeout: 3000 connection-test-query: select 1 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/wms_dev_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true # url: jdbc:mysql://127.0.0.1:3306/wms_dev?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true # url: jdbc:mysql://127.0.0.1:3306/wms_dev_test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true url: jdbc:mysql://127.0.0.1:3306/wms_dev?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: 34821015 # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
@@ -61,7 +61,6 @@ </select> <select id="listSuitableMat" resultType="map"> select * from view_man_loc_detl ld where 1=1 @@ -76,4 +75,27 @@ </foreach> </if> </select> <select id="queryFlatStock" resultType="map"> SELECT * FROM ( SELECT id, loc_id, loc_no, mat_id, type_id, matnr, order_no, batch, anfme, host_id, memo, freeze FROM view_man_loc_detl WHERE deleted = 0 AND type_id IN ( SELECT type_id FROM man_loc_area_type WHERE parent_id = 7 OR id = 7 ) ) t WHERE 1 = 1 <if test="matnr != null and matnr != ''"> AND t.matnr #{matnr} </if> <if test="batch != null and batch != ''"> AND t.batch = #{batch} </if> <if test="params != null and params.size() > 0"> <foreach collection="params" item="item" open="order by " separator="," close=" "> ${item.name} = #{item.value} </foreach> </if> </select> </mapper>