| | |
| | | package com.zy.asrs.task.handler; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.DateUtils; |
| | | import com.core.common.SnowflakeIdWorker; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.LocDetl; |
| | | import com.zy.asrs.entity.LocMast; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.entity.OrderDetl; |
| | | import com.zy.asrs.service.LocDetlService; |
| | | import com.zy.asrs.service.LocMastService; |
| | | import com.zy.asrs.service.OrderDetlService; |
| | | import com.zy.asrs.service.WorkService; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.model.enums.WorkNoType; |
| | | import com.zy.common.service.CommonService; |
| | | 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.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | | public class AutoReplenishmentHandler extends AbstractHandler<String> { |
| | |
| | | @Autowired |
| | | private LocMastService locMastService; |
| | | @Autowired |
| | | private WorkService workService; |
| | | private CommonService commonService; |
| | | @Autowired |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private WrkDetlService wrkDetlService; |
| | | @Autowired |
| | | private OrderService orderService; |
| | | @Autowired |
| | | private SnowflakeIdWorker snowflakeIdWorker; |
| | | |
| | | |
| | | @Transactional |
| | | public ReturnT<String> create(Mat mat, double anfme) { |
| | | //创建一个新的自动补货单据 |
| | | Order order = createOrder(); |
| | | orderService.insert(order); |
| | | OrderDetl orderDetl = createOrderDetl(order); |
| | | orderDetl.setMatnr(mat.getMatnr()); |
| | | orderDetl.setMaktx(mat.getMaktx()); |
| | | orderDetl.setSpecs(mat.getSpecs()); |
| | | orderDetl.setAnfme(anfme); |
| | | orderDetl.setQty(0.0); |
| | | |
| | | |
| | | orderDetlService.insert(orderDetl); |
| | | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | @Transactional |
| | | public ReturnT<String> start(Order order) { |
| | | Date now = new Date(); |
| | | |
| | | Set<String> locNos = pakoutLoc(order); |
| | | for (String locNo : locNos){ |
| | |
| | | throw new CoolException("库位状态已变更"); |
| | | } |
| | | //生成工作档 |
| | | |
| | | WrkMast wrkMast = createWrkMast(locNo,locMast.getBarcode(),now); |
| | | //生成工作档明细 |
| | | List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); |
| | | createWrkDetl(locDetls, wrkMast,order.getOrderNo(),now); |
| | | //修改库位状态 |
| | | locMast.setLocSts("R"); |
| | | locMastService.updateByLocNo(locMast); |
| | | } |
| | | |
| | | order.setSettle(2L); |
| | | orderService.updateById(order); |
| | | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | private Order createOrder(){ |
| | | Date now = new Date(); |
| | | return new Order( |
| | | String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] |
| | | "AUTO" + snowflakeIdWorker.nextId(), // 订单编号 |
| | | DateUtils.convert(now), // 单据日期 |
| | | 21L, // 单据类型 21.自动补货单 |
| | | null, // 项目编号 |
| | | null, // |
| | | null, // 调拨项目编号 |
| | | null, // 初始票据号 |
| | | null, // 票据号 |
| | | null, // 客户编号 |
| | | null, // 客户 |
| | | null, // 联系方式 |
| | | null, // 操作人员 |
| | | null, // 合计金额 |
| | | null, // 优惠率 |
| | | null, // 优惠金额 |
| | | null, // 销售或采购费用合计 |
| | | null, // 实付金额 |
| | | null, // 付款类型 |
| | | null, // 业务员 |
| | | null, // 结算天数 |
| | | null, // 邮费支付类型 |
| | | null, // 邮费 |
| | | null, // 付款时间 |
| | | null, // 发货时间 |
| | | null, // 物流名称 |
| | | null, // 物流单号 |
| | | 1L, // 订单状态 |
| | | 1, // 状态 |
| | | 9999L, // 添加人员 |
| | | now, // 添加时间 |
| | | 9999L, // 修改人员 |
| | | now, // 修改时间 |
| | | null // 备注 |
| | | ); |
| | | |
| | | } |
| | | |
| | | private OrderDetl createOrderDetl(Order order){ |
| | | Date now = new Date(); |
| | | OrderDetl orderDetl = new OrderDetl(); |
| | | |
| | | orderDetl.setOrderId(order.getId()); |
| | | orderDetl.setOrderNo(order.getOrderNo()); |
| | | orderDetl.setCreateBy(order.getCreateBy()); |
| | | orderDetl.setCreateTime(now); |
| | | orderDetl.setUpdateBy(order.getCreateBy()); |
| | | orderDetl.setUpdateTime(now); |
| | | orderDetl.setStatus(1); |
| | | orderDetl.setQty(0.0D); |
| | | |
| | | return orderDetl; |
| | | } |
| | | |
| | | private Set<String> pakoutLoc(Order order){ |
| | |
| | | Set<String> locNos = new HashSet<>(); |
| | | //根据订单生成四项库出库工作档 |
| | | List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo())); |
| | | orderDetlList.forEach(orderDetl -> { |
| | | |
| | | for(OrderDetl orderDetl : orderDetlList){ |
| | | if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){ |
| | | continue; |
| | | } |
| | | |
| | | String matnr = orderDetl.getMatnr(); |
| | | Double orderAnfme = orderDetl.getAnfme(); |
| | | |
| | | List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>() |
| | | .eq("matnr", matnr) |
| | | .eq("loc_sts","F") |
| | | .groupBy("loc_no")); |
| | | for (LocDetl locDetl : locDetls){ |
| | | String locNo = locDetl.getLocNo(); |
| | | //订单待出数量减去库存数量 |
| | | orderAnfme -= locDetl.getAnfme(); |
| | | //添加待出库库位 |
| | | double orderAnfme = orderDetl.getAnfme(); |
| | | |
| | | //List<String> locNosSearch = locDetlService.selectLocNo(matnr); |
| | | Set<String> locNosSearch = locDetlService.selectLocNos(matnr); |
| | | |
| | | //过滤库位货物为高货物 |
| | | locNosSearch = locNosSearch.stream().filter(locNo -> { |
| | | LocMast locMast = locMastService.selectByLoc(locNo); |
| | | if(locMast.getLocType1() == 3){ |
| | | return false; |
| | | }else { |
| | | //且检测该库位是否含没有货架码的物料,如有有则不允许出库 |
| | | // LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locNo) |
| | | // .andNew().eq("supp_code", "").or().isNull("supp_code")); |
| | | |
| | | if(Cools.isEmpty(locDetlService.selectByLocWithoutContainer(locNo))){ |
| | | return true; |
| | | }else { |
| | | return false; |
| | | } |
| | | } |
| | | }).collect(Collectors.toSet()); |
| | | |
| | | //重新排序 |
| | | Set<String> resort = resort(locNosSearch); |
| | | |
| | | for(String locNo : resort){ |
| | | List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); |
| | | locNos.add(locNo); |
| | | |
| | | for (LocDetl locDetl :locDetls){ |
| | | if(matnr.equals(locDetl.getMatnr())){ |
| | | orderAnfme -= locDetl.getAnfme(); |
| | | }else { |
| | | OrderDetl odNew = createOrderDetl(order); |
| | | odNew.setMatnr(locDetl.getMatnr()); |
| | | odNew.setMaktx(locDetl.getMaktx()); |
| | | odNew.setBatch(locDetl.getBatch()); |
| | | odNew.setThreeCode(locDetl.getThreeCode()); |
| | | odNew.setDeadTime(locDetl.getDeadTime()); |
| | | odNew.setSpecs(locDetl.getSpecs()); |
| | | odNew.setAnfme(0.0); |
| | | odNew.setQty(locDetl.getAnfme()); |
| | | orderDetlService.insert(odNew); |
| | | } |
| | | } |
| | | if(orderAnfme <= 0){ |
| | | orderDetl.setQty(orderDetl.getAnfme() - orderAnfme); |
| | | orderDetlService.updateById(orderDetl); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | }); |
| | | if(orderAnfme > 0){ |
| | | orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme); |
| | | orderDetl.setQty(orderDetl.getAnfme()); |
| | | orderDetlService.updateById(orderDetl); |
| | | } |
| | | } |
| | | |
| | | return locNos; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | for (int i=0; i<10; i++){ |
| | | for (int y=0; y<10; y++){ |
| | | System.out.println(i); |
| | | System.out.println(y); |
| | | if(y == 5){ |
| | | break; |
| | | //根据深浅库位进行重新排序 |
| | | private Set<String> resort(Set<String> locNos){ |
| | | Set<String> locNosResort = new LinkedHashSet<>(); |
| | | |
| | | for(String locNoSearch : locNos){ |
| | | LocMast locMast = locMastService.selectById(locNoSearch); |
| | | if(!"F".equals(locMast.getLocSts())){ |
| | | continue; |
| | | } |
| | | |
| | | List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch); |
| | | |
| | | if(Cools.isEmpty(groupOuterLoc)){ |
| | | locNosResort.add(locNoSearch); |
| | | }else { |
| | | groupOuterLoc.add(locNoSearch); |
| | | //如果是深库位,则先找外侧的库位 |
| | | for (String locNoOut : groupOuterLoc){ |
| | | LocMast locMastOuter = locMastService.selectById(locNoOut); |
| | | //外侧如果是拣料,则内测不允许出 |
| | | if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){ |
| | | break; |
| | | } |
| | | |
| | | if(!"F".equals(locMastOuter.getLocSts())){ |
| | | continue; |
| | | } |
| | | locNosResort.add(locNoOut); |
| | | |
| | | } |
| | | } |
| | | } |
| | | return locNosResort; |
| | | } |
| | | |
| | | private WrkMast createWrkMast(String locNo,String barCode,Date now){ |
| | | int ioType = 101; |
| | | int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setWrkSts(21L); // 工作状态:21.生成出库任务 |
| | | wrkMast.setIoType(ioType); // 入出库状态 |
| | | wrkMast.setIoPri(300D); // 优先级:13 |
| | | //wrkMast.setOutMost(outMost?1:0);; |
| | | //wrkMast.setCrnNo(outMost?outCrnNo:locMast.getCrnNo()); |
| | | //wrkMast.setSourceStaNo(loc); // 源站 |
| | | wrkMast.setStaNo(300); // 目标站 |
| | | wrkMast.setSourceLocNo(locNo); // 源库位 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | | wrkMast.setExitMk("N"); // 退出 |
| | | wrkMast.setEmptyMk("N"); // 空板 |
| | | wrkMast.setLinkMis("N"); |
| | | wrkMast.setBarcode(barCode); |
| | | //wrkMast.setAppeUser(userId); // 操作人员数据 |
| | | wrkMast.setAppeTime(now); |
| | | //wrkMast.setModiUser(userId); |
| | | wrkMast.setModiTime(now); |
| | | |
| | | //补货标识 |
| | | wrkMast.setMk("Y"); |
| | | if (!wrkMastService.insert(wrkMast)) { |
| | | throw new CoolException("保存工作档失败,出库库位号:"+locNo); |
| | | } |
| | | return wrkMast; |
| | | } |
| | | |
| | | private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast,String orderNo, Date now){ |
| | | locDetls.forEach(locDetl -> { |
| | | WrkDetl wrkDetl = new WrkDetl(); |
| | | BeanUtils.copyProperties(locDetl,wrkDetl); |
| | | wrkDetl.setZpallet(wrkMast.getBarcode()); |
| | | wrkDetl.setIoTime(now); |
| | | wrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | //wrkDetl.setBatch(locDetl.getBatch()); |
| | | wrkDetl.setOrderNo(orderNo); |
| | | //wrkDetl.setAnfme(locDetl.getAnfme()); // 数量 |
| | | wrkDetl.setAppeTime(now); |
| | | //wrkDetl.setAppeUser(userId); |
| | | wrkDetl.setModiTime(now); |
| | | //wrkDetl.setSuppCode(locDetl.getSuppCode()); |
| | | //wrkDetl.setModiUser(userId); |
| | | if (!wrkDetlService.insert(wrkDetl)) { |
| | | throw new CoolException("保存工作档明细失败"); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | } |