src/main/java/com/zy/api/controller/KopenApiController.java
@@ -1,11 +1,12 @@ package com.zy.api.controller; import com.alibaba.fastjson.JSON; import com.core.common.R; import com.zy.api.entity.OrderParams; import com.zy.api.entity.PubOrderParams; import com.zy.api.entity.ReportOrderParam; import com.zy.api.entity.SyncMatParmas; import com.zy.api.service.KopenApiService; import com.zy.asrs.entity.Mat; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -13,8 +14,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; import java.util.Objects; @RestController @@ -33,8 +32,8 @@ * @return com.core.common.R */ @ApiOperation("上架派工单") @PostMapping("/order/add") public R receiveOrders(@RequestBody OrderParams params) { @PostMapping("/sendInDispatch") public R receiveOrders(@RequestBody PubOrderParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } @@ -53,7 +52,7 @@ * @return com.core.common.R */ @ApiOperation("零件信息数据更新") @PostMapping("/sync/mat") @PostMapping("/sendPartsMaster") public R basMatUpdate(@RequestBody SyncMatParmas params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); @@ -66,5 +65,42 @@ } /** * 上架派工单反馈 * @author Ryan * @date 2025/11/24 15:20 * @param params * @return com.core.common.R */ @ApiOperation("上架派工单反馈") @PostMapping("/getInDispatchResult") public R getInDispatchResult(@RequestBody ReportOrderParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } if (Objects.isNull(params.getKopen_id()) && Objects.isNull(params.getInv_no()) && Objects.isNull(params.getDispatch_no())) { return R.error("取消条件不能为空!!"); } return kopenApiService.getInDispatchResult(params); } /** * 备货指示派工单下发 * @author Ryan * @date 2025/11/24 15:21 * @param params * @return com.core.common.R */ @ApiOperation("备货指示派工单下发") @PostMapping("/sendOutDispatch") public R sendStockPrepareDispatch(@RequestBody PubOrderParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } if (Objects.isNull(params.getDetails()) || params.getDetails().isEmpty()) { return R.error("上报订单列表不能为空!!"); } return kopenApiService.sendOutDispatch(params); } } src/main/java/com/zy/api/entity/OrderItemsParam.java
@@ -30,5 +30,13 @@ @ApiModelProperty("入库通知数量") private Double inv_qty; @ApiModelProperty("指示拣货订单数量") private Integer order_qty; @ApiModelProperty("原上架派工数量") private Integer old_qty; @ApiModelProperty("变更数量") private Integer new_qty; } src/main/java/com/zy/api/entity/OrderParams.java
@@ -26,7 +26,7 @@ @ApiModelProperty("公司ID") private String company_id; @ApiModelProperty("入库类型 1: 采购入库,2: 调拨入库,3: 销售退货入库,4: 套包入库") @ApiModelProperty("入库类型 1: 采购入库,2: 调拨入库,3: 销售退货入库,4: 套包入库, 5:SO, 6:EO") private String type; @ApiModelProperty("箱号") @@ -35,8 +35,12 @@ @ApiModelProperty("入库通知单号") private String inv_no; @ApiModelProperty("入库物料列表") List<OrderItemsParam> details; @ApiModelProperty("目标库区") private String target_location; @ApiModelProperty("源库区") private String source_location; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") src/main/java/com/zy/api/entity/PubOrderParams.java
New file @@ -0,0 +1,17 @@ package com.zy.api.entity; import java.util.List; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) @ApiModel(value = "PubOrderParams", description = "发布订单信息") public class PubOrderParams extends OrderParams{ @ApiModelProperty("入库物料列表") List<OrderItemsParam> details; } src/main/java/com/zy/api/entity/ReportOrderParam.java
New file @@ -0,0 +1,18 @@ package com.zy.api.entity; import java.util.List; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) @ApiModel(value = "ReportOrderParam", description = "上报订单信息") public class ReportOrderParam extends OrderParams{ @ApiModelProperty("上报订单列表") List<ReportOrderParams> details; } src/main/java/com/zy/api/entity/ReportOrderParams.java
New file @@ -0,0 +1,48 @@ package com.zy.api.entity; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) @ApiModel("上报订单参数") public class ReportOrderParams implements Serializable { @ApiModelProperty("BS Code") private String total_serial; @ApiModelProperty("产品类型") private String pro_type; @ApiModelProperty("零件代码") private String pro_komcode; @ApiModelProperty("供应商ID") private String pro_id; @ApiModelProperty("容器编码") private String location_no; @ApiModelProperty("货位类型") private String location_type; @ApiModelProperty("上架日期") private String sj_date; @ApiModelProperty("上架人") private String sj_emp; @ApiModelProperty("上架数量") private Integer pick_qty; @ApiModelProperty("破损数量") private Integer damage_qty; @ApiModelProperty("差异数量") private Integer diff_qty; } src/main/java/com/zy/api/enums/OrderWkType.java
@@ -7,6 +7,8 @@ ORDER_WK_TRANSFER_IN("2", "调拔入库"), ORDER_WK_SALE_IN("3", "销售退货入库"), ORDER_WK_BAG_IN("4", "套包入库"), ORDER_WK_ORDER_OUT_EO("EO", "备货指示派工单(EO)"), ORDER_WK_ORDER_OUT_SO("SO", "备货指示派工单(SO)"), ORDER_WK_ORDER_OUT("29", "备货单"); OrderWkType(String val, String desc) { @@ -26,7 +28,7 @@ return OrderType.ORDER_IN.type; } else if (val.equals(OrderWkType.ORDER_WK_BAG_IN.val)) { return OrderType.ORDER_IN.type; } else if (val.equals(OrderWkType.ORDER_WK_ORDER_OUT.val)) { } else if (val.equals(OrderWkType.ORDER_WK_ORDER_OUT.val) || val.equals(OrderWkType.ORDER_WK_ORDER_OUT.val) || val.equals(OrderWkType.ORDER_WK_ORDER_OUT.val)) { return OrderType.ORDER_OUT.type; } else { return OrderType.ORDER_OUT.type; src/main/java/com/zy/api/service/KopenApiService.java
@@ -1,7 +1,8 @@ package com.zy.api.service; import com.core.common.R; import com.zy.api.entity.OrderParams; import com.zy.api.entity.PubOrderParams; import com.zy.api.entity.ReportOrderParam; import com.zy.api.entity.SyncMatParmas; public interface KopenApiService { @@ -14,7 +15,7 @@ * @param params * @return com.core.common.R */ R receiveOrders(OrderParams params); R receiveOrders(PubOrderParams params); /** * 基础零件变更 @@ -31,5 +32,19 @@ * @author Ryan * @date 2025/11/24 15:33 */ void addOrUpdateOrders(OrderParams params, String type) ; void addOrUpdateOrders(PubOrderParams params, String type) ; /** * 上架派工单反馈 * @param params * @return */ R getInDispatchResult(ReportOrderParam params); /** * 备货指示派工单下发 * @param params * @return */ R sendOutDispatch(PubOrderParams params); } src/main/java/com/zy/api/service/impl/KopenApiServiceImpl.java
@@ -2,13 +2,13 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.DateUtils; import com.core.common.R; import com.core.exception.CoolException; import com.zy.api.entity.OrderParams; import com.zy.api.entity.PubOrderParams; import com.zy.api.entity.ReportOrderParam; import com.zy.api.entity.SyncMatParmas; import com.zy.api.enums.MatLocType; import com.zy.api.enums.MatType; import com.zy.api.enums.OrderType; import com.zy.api.enums.OrderWkType; import com.zy.api.service.KopenApiService; @@ -17,19 +17,18 @@ import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.enums.CommonEnum; import com.zy.asrs.enums.OrderSettle; import com.zy.asrs.enums.OrderTypeEnum; import com.zy.asrs.service.MatService; import com.zy.asrs.service.OrderDetlService; import com.zy.asrs.service.OrderService; import com.zy.asrs.utils.Utils; import com.zy.common.utils.HttpHandler; 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.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Objects; @@ -52,12 +51,118 @@ * @return com.core.common.R */ @Override public R receiveOrders(OrderParams params) { public R receiveOrders(PubOrderParams params) { if (params.getType().equals(OrderWkType.getTypeVal(params.getType()))) { return R.error("当前类型不是上架派工单!!"); } addOrUpdateOrders(params, "add"); return R.ok("单据下发成功!!"); } /** * 上架派工单反馈 * * @author Ryan * @date 2025/11/24 15:33 */ @Override @Transactional(rollbackFor = Exception.class) public R getInDispatchResult(ReportOrderParam params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } String response = null; try { response = new HttpHandler.Builder() .setUri("127.0.0.1:8081") .setPath("/wms/order/getInDispatchResult") .setJson(JSONObject.toJSONString(params)) .build() .doPost(); if (Objects.isNull(response) || response.trim().isEmpty()) { return R.error("外网接口无响应!!"); } JSONObject jsonObject = JSONObject.parseObject(response); Integer code = jsonObject.getInteger("code"); if (!Objects.isNull(code) && code.equals(1)) { return R.ok("入库单上报完成!!"); } else { String msg = jsonObject.getString("message"); return R.error(Objects.isNull(msg) ? "上报失败!!" : msg); } } catch (Exception e) { return R.error(e.getMessage()); } } /* */ /** * 备货指示派工单下发 * * @author Ryan * @date 2025/11/24 15:21 * @param params * @return com.core.common.R */ @Override @Transactional(rollbackFor = Exception.class) public R sendOutDispatch(PubOrderParams params) { if (Objects.isNull(params)) { return R.error("参数不能为空!!"); } // 校验参数 if (Objects.isNull(params.getDispatch_no())) { return R.error("派工单编号不能为空!!"); } if (Objects.isNull(params.getKopen_id())) { return R.error("流水号不能为空!!"); } if (Objects.isNull(params.getCompany_id())) { return R.error("公司ID不能为空!!"); } addOrUpdateOrders(params, "add"); return R.ok("备货指示派工单下发成功!!"); } /** * 备货指示派工单 * * @author Ryan * @date 2025/12/16 9:15 * @param params */ private void outOrderAddAndUpdate(PubOrderParams params, String type) { if (Objects.isNull(params)) { throw new CoolException("参数不能为空!!"); } if (Objects.isNull(params.getType())) { throw new CoolException("订单类型不能为空!!"); } OrderParams orderParams = JSONObject.parseObject(JSONObject.toJSONString(params), OrderParams.class); Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", orderParams.getInv_no())); if (type.equals("add") && !Objects.isNull(order)) { throw new CoolException("单据已存在, 不可重复添加!!"); } // 判断订单是否存在 if (Objects.isNull(order)) { /** 不存在,新增订单 */ generateOrders(params); } else { /** 存在,删除老订单,更新插入新订单 */ // 删除旧订单明细 if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) { throw new CoolException("订单明细删除失败!!"); } ; if (!orderService.deleteById(order.getId())) { throw new CoolException("原单据删除失败!!"); } generateOrders(params); } } /** @@ -121,16 +226,22 @@ */ @Override @Transactional(rollbackFor = Exception.class) public void addOrUpdateOrders(OrderParams params, String type) { public void addOrUpdateOrders(PubOrderParams params, String type) { if (Objects.isNull(params)) { throw new CoolException("参数不能为空!!"); } if (Objects.isNull(params.getType())) { throw new CoolException("订单类型不能为空!!"); } OrderParams orderParams = JSONObject.parseObject(JSONObject.toJSONString(params), OrderParams.class); Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", orderParams.getInv_no())); Order order = new Order(); if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) { // 入库 order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", orderParams.getInv_no())); } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) { // 出库 order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", orderParams.getDispatch_no())); } if (type.equals("add") && !Objects.isNull(order)) { throw new CoolException("单据已存在, 不可重复添加!!"); } @@ -143,7 +254,8 @@ // 删除旧订单明细 if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) { throw new CoolException("订单明细删除失败!!"); }; } if (!orderService.deleteById(order.getId())) { throw new CoolException("原单据删除失败!!"); } @@ -154,25 +266,27 @@ public static String generateUUID(OrderParams params) { return java.util.UUID.randomUUID().toString(); } /** * 生成订单信息 * * @param params */ @Transactional(rollbackFor = Exception.class) public void generateOrders(OrderParams params) { public void generateOrders(PubOrderParams params) { // 将数据当新订单插入 Order newOrder = new Order(); if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) { // 入库 newOrder.setPakinPakoutStatus(1); newOrder.setDocType(Long.parseLong(params.getType())); newOrder.setOrderNo(params.getInv_no()); } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) { // 出库 newOrder.setPakinPakoutStatus(2); newOrder.setDocType(Long.parseLong(OrderTypeEnum.TRANSFER.type + "")); newOrder.setOrderNo(params.getDispatch_no()); } newOrder.setDocType(Long.parseLong(params.getType())); newOrder.setOrderNo(params.getInv_no()); newOrder.setUuid(generateUUID(params)); // 流水号(唯一) newOrder.setDefNumber(params.getKopen_id()); @@ -203,13 +317,21 @@ BeanUtils.copyProperties(matnr, orderItem); orderItem.setOrderId(newOrder.getId()); orderItem.setOrderNo(newOrder.getOrderNo()); orderItem.setAnfme(Math.round(item.getInv_qty() * 10000) / 10000.0); if (OrderType.ORDER_IN.type.equals(OrderWkType.getTypeVal(params.getType()))) { // 入库 orderItem.setAnfme(Math.round(item.getInv_qty() * 10000) / 10000.0); } else if (OrderType.ORDER_OUT.type.equals(OrderWkType.getTypeVal(params.getType()))) { // 出库 newOrder.setPakinPakoutStatus(2); orderItem.setAnfme(Math.round(item.getOrder_qty() * 10000) / 10000.0); } orderItem.setMatnr(matnr.getMatnr()); orderItem.setMaktx(matnr.getMaktx()); orderItem.setBrand(matnr.getBrand()); orderItem.setBatch(1 + ""); orderItem.setStandby1(item.getPro_id()); //关联上加派工单号+零件代码+供应商代码 // 关联上加派工单号+零件代码+供应商代码 orderItem.setThreeCode(item.getTotal_serial()); // 供应商代码 orderItem.setSuppCode(item.getPro_id()); src/main/java/com/zy/asrs/controller/OutController.java
@@ -85,8 +85,6 @@ Set<String> exist = new HashSet<>(); // 获取订单主表 OrderPakout orderPakOut = orderPakOutService.selectByNo(orderDetlPakouts.get(0).getOrderNo()); // 备货单 src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -256,6 +256,12 @@ LocMast locMast = service.selectById(this.locNo); if (!Cools.isEmpty(locMast)){ return String.valueOf(locMast.getLocNo()); }else { LocCacheService service2 = SpringUtils.getBean(LocCacheService.class); LocCache locCache = service2.selectOne(new EntityWrapper<LocCache>().eq("loc_no", this.locNo)); if (!Cools.isEmpty(locCache)){ return String.valueOf(locCache.getLocNo()); } } return null; } src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -251,6 +251,11 @@ @TableField("pause_mk") private String pauseMk; @ApiModelProperty("并板出库(缓存区AGV站点)") @TableField(exist = false) private String avgSta; @ApiModelProperty(value= "") @TableField("error_time") private Date errorTime; src/main/java/com/zy/asrs/entity/result/CrnTaskDetlDTO.java
New file @@ -0,0 +1,18 @@ package com.zy.asrs.entity.result; import com.zy.asrs.entity.LocDetl; import lombok.Data; import lombok.experimental.Accessors; import java.util.List; @Data @Accessors(chain = true) public class CrnTaskDetlDTO { private String locNo; private List<LocDetl> locDetlList; } src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -8,10 +8,7 @@ import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.*; import com.zy.asrs.entity.result.FindLocNoAttributeVo; import com.zy.asrs.entity.result.ForwardAGVTaskDTO; import com.zy.asrs.entity.result.HIKApiDTO; import com.zy.asrs.entity.result.HIKResultDTO; import com.zy.asrs.entity.result.*; import com.zy.asrs.enums.*; import com.zy.asrs.enums.LocAreaType; import com.zy.asrs.enums.LocStsType; @@ -601,6 +598,12 @@ if (Objects.isNull(param.getBarcode())) { throw new CoolException("托盘码不能为空!!"); } BasContainer container = basContainerService .selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode())); if (Objects.isNull(container)) { throw new CoolException("数据错误:容器码不存在!!"); } // if (param.getBarcode().length() != 8) { // throw new CoolException("条码长度不是8位===>>" + param.getBarcode()); @@ -1607,6 +1610,7 @@ if (Objects.isNull(param.getBarcode())) { throw new CoolException("托盘码不能为空!!"); } if (Objects.isNull(param.getCombMats()) || param.getCombMats().isEmpty()) { throw new CoolException("组托明细不能为空!!"); } @@ -2118,7 +2122,7 @@ } Collections.shuffle(devps); BasDevp basDevp = devps.stream().findFirst().get(); List<LocMast> locMasts = new ArrayList<>(); List<CrnTaskDetlDTO> locMasts = new ArrayList<>(); Map<String, List<LocDetl>> listMap = locDetls.stream().collect(Collectors.groupingBy(LocDetl::getMatnr)); //获取查库存总数量 AtomicReference<Double> totalOut = new AtomicReference<>(0.0); @@ -2162,7 +2166,8 @@ if (sum.compareTo(v) <= 0 && sum.compareTo(itemed.get()) > 0) { itemed.set(Math.round((itemed.get() + v) * 10000) / 10000.0); // 可放下 locMasts.add(locMast); CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(adetls); locMasts.add(crnTaskDetlDTO); totalOut.set(Math.round((totalOut.get() + itemed.get()) * 10000) / 10000.0); } } @@ -2173,17 +2178,18 @@ // 判断根据分拣出库后,还需要出多少托盘或料箱;如果余料大于0, 出新托盘或料箱 if (totalOut.get().compareTo(0.0) > 0) { generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId); //TODO 细化区分,当前出库托盘是滞满足拣货数量 generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station); //TODO 细化区分,当前出库托盘是满足拣货数量 } else { LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() // todo 根据物料种类,区分库区类型 .eq("loc_sts", LocStsType.LOC_STS_TYPE_D.type) .orderAsc(Arrays.asList("row1", "bay1", "lev1")) .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY")); locMasts.add(locMast); CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(locDetls); locMasts.add(crnTaskDetlDTO); // 空板出库 generateTask(locMasts, TaskIOType.EMPTY_OUT.type, basDevp, userId); generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station); } } @@ -2191,56 +2197,65 @@ * 生成堆垛机出库任务 * * @param locMasts * @param station * @author Ryan * @date 2025/12/6 14:44 */ @Transactional(rollbackFor = Exception.class) public void generateTask(List<LocMast> locMasts, Integer ioType, BasDevp devp, Long userId) { public void generateTask(List<CrnTaskDetlDTO> locMasts, Integer ioType, BasDevp devp, Long userId, BasStation station) { Date now = new Date(); for (LocMast locMast : locMasts) { for (CrnTaskDetlDTO crnTaskDetlDTO : locMasts) { LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", crnTaskDetlDTO.getLocNo())); if (Objects.isNull(ioType)) { continue; } Integer outSta = devp.getDevNo(); // 获取路径 StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", locMast.getLocNo())); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库类型 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setAppeUser(userId); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:" + locMast.getLocNo()); if (Cools.isEmpty(wrkMast1)){ Integer outSta = devp.getDevNo(); // 获取路径 StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库类型 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 //小松项目,缓存出库AGV站点,用于清空缓存区库存 wrkMast.setAvgSta(station.getDevNo()); wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setAppeUser(userId); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:" + locMast.getLocNo()); } }else { workNo = wrkMast1.getWrkNo(); } List<LocDetl> locDetls = locDetlService .selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo())); // 生成工作档明细 for (LocDetl detlDto : locDetls) { for (LocDetl detlDto : crnTaskDetlDTO.getLocDetlList()) { WrkDetl wrkDetl = new WrkDetl(); BeanUtils.copyProperties(detlDto, wrkDetl); wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号 wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); wrkDetl.setZpallet(null); wrkDetl.setBarcode(null); wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); wrkDetl.setModiTime(now); src/main/java/com/zy/asrs/service/impl/TaskServiceImpl.java
@@ -245,6 +245,9 @@ if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103) { List<TaskDetl> wrkDetls = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", wrkMast.getWrkNo())); for (TaskDetl wrkDetl : wrkDetls) { if (Cools.isEmpty(wrkDetl.getOrderNo())){ continue; } if (!Cools.isEmpty(wrkDetl.getOrderNo())) { OrderInAndOutUtil.decrease(Boolean.FALSE, wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), @@ -254,7 +257,7 @@ boolean flag = true; OrderPakin order = orderService.selectByNo(wrkDetl.getOrderNo()); //OrderInAndOutUtil.selectByNo(Boolean.FALSE, wrkDetl.getOrderNo()); if (Objects.isNull(order)) { throw new CoolException("单据信息不存在!!"); continue; } List<OrderDetlPakin> orderDetls = orderDetlService.selectByOrderId(order.getId()); //OrderInAndOutUtil.selectByOrderId(Boolean.FALSE, order.getId()); for (OrderDetlPakin orderDetl : orderDetls) { src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -12,6 +12,9 @@ import com.zy.asrs.entity.param.FullStoreParam; import com.zy.asrs.entity.param.LocDetlAdjustParam; import com.zy.asrs.entity.param.StockOutParam; import com.zy.asrs.enums.LocAreaType; import com.zy.asrs.enums.LocStsType; import com.zy.asrs.enums.TaskIOType; import com.zy.asrs.mapper.LocMastMapper; import com.zy.asrs.entity.result.FindLocNoAttributeVo; import com.zy.asrs.service.*; @@ -99,6 +102,12 @@ private TaskService taskService; @Autowired private TaskDetlService taskDetlService; @Autowired private BasStationService basStationService; @Autowired private BasStationDetlService basStationDetlService; @Autowired private BasAreasService basAreasService; @Override @Transactional @@ -1457,6 +1466,10 @@ if (Cools.isEmpty(wrkMast)) { throw new CoolException(workNo + "工作档不存在"); } BasAreas basAreas = basAreasService.selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_CRN.type)); if (Objects.isNull(basAreas)) { throw new CoolException("数据错误,库区不存在!!"); } // 入出库类型判断 if (wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) { throw new CoolException("当前入出库类型无法进行操作"); @@ -1465,6 +1478,11 @@ if (wrkMast.getWrkSts() < 11 || wrkMast.getWrkSts() == 15) { throw new CoolException("当前工作状态无法进行操作"); } String agvSta = null; if (wrkMast.getIoType() == TaskIOType.MERGE_OUT.type) { agvSta = wrkMast.getAvgSta(); } // 保存工作明细档历史档 // if (!wrkDetlLogService.save(wrkMast.getWrkNo())) { // throw new CoolException("保存工作明细档历史档失败"); @@ -1500,11 +1518,58 @@ // 修改库位状态 Q.拣料/盘点/并板再入库 LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); locMast.setLocSts("Q"); locMast.setAreaId(basAreas.getId()); locMast.setAreaName(basAreas.getName()); locMast.setBarcode(locMast.getBarcode()); locMast.setModiTime(now); locMast.setModiUser(userId); if (!locMastService.updateById(locMast)) { throw new CoolException("修改库位状态失败"); } // . 删除缓存站点明细 if (!Objects.isNull(agvSta)) { // 修改目标站点信息 BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", agvSta)); if (Objects.isNull(station)) { throw new CoolException("站点不存在!!"); } basStationDetlService.delete(new EntityWrapper<BasStationDetl>().eq("dev_no", station.getDevNo())); station.setLocSts(LocStsType.LOC_STS_TYPE_O.type); if (!basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } } // .修改并托入库明细托码 List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>() .eq("area_id", locMast.getAreaId()) .eq("loc_no", locMast.getLocNo())); if (!Objects.isNull(locDetls) && !locDetls.isEmpty()) { locDetls.forEach(locDetl -> { locDetl.setZpallet(locMast.getBarcode()); locDetl.setBarcode(locMast.getBarcode()); if (!locDetlService.updateById(locDetl)) { throw new CoolException("库存明细修改失败!!"); } }); } // .修改任务档明细托盘码 List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); if (!Objects.isNull(wrkDetls) && !wrkDetls.isEmpty()) { wrkDetls.forEach(wrkDetl -> { wrkDetl.setZpallet(wrkMast.getBarcode()); wrkDetl.setBarcode(wrkMast.getBarcode()); if (!wrkDetlService.updateById(wrkDetl)) { throw new CoolException("任务档明细修改失败!!"); } }); } } @Override src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -5,6 +5,8 @@ import com.core.common.Cools; import com.core.common.DateUtils; import com.core.exception.CoolException; import com.zy.api.entity.ReportOrderParam; import com.zy.api.service.KopenApiService; import com.zy.asrs.entity.*; import com.zy.asrs.enums.OrderTypeEnum; import com.zy.asrs.service.*; @@ -47,6 +49,8 @@ private OrderPakinService orderPakinService; @Autowired private OrderDetlPakinService orderDetlPakinService; @Autowired private KopenApiService kopenApiService; @Transactional public ReturnT<String> startOrderIssuedOnceMore(Order order) { @@ -208,6 +212,16 @@ OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(),6L,null); return SUCCESS; } /** * 单据上报 * @author Ryan * @date 2025/12/15 16:14 * @param order * @return com.zy.asrs.task.core.ReturnT<java.lang.String> */ @Transactional public ReturnT<String> startOrderReport(Order order) { DocType docType = docTypeService.selectById(order.getDocType()); @@ -233,6 +247,9 @@ String response = ""; boolean success = false; try { ReportOrderParam orderParam = new ReportOrderParam(); kopenApiService.getInDispatchResult(orderParam); // response = new HttpHandler.Builder() // .setUri(MesConstant.URL) // .setPath(MesConstant.PAKIN_URL) src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -4,6 +4,7 @@ import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.enums.LocAreaType; import com.zy.asrs.enums.LocStsType; import com.zy.asrs.service.*; import com.zy.asrs.service.impl.*; @@ -60,6 +61,8 @@ private WaitPakinLogService waitPakinLogService; @Autowired private BasStationDetlService basStationDetlService; @Autowired private BasAreasService basAreasService; public ReturnT<String> start(WrkMast wrkMast) { // 4.入库完成 @@ -75,6 +78,12 @@ public ReturnT<String> doIn(WrkMast wrkMast) { Date now = new Date(); LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); BasAreas basAreas = basAreasService.selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_CRN.type)); if (Objects.isNull(basAreas)) { throw new CoolException("数据错误:库区不存在!!"); } locMast.setAreaId(basAreas.getId()); locMast.setAreaName(basAreas.getName()); try { if (null == locMast) { // exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(), @@ -122,7 +131,6 @@ } // 遍历工作明细,更新库存明细和入库通知档 for (WrkDetl wrkDetl : wrkDetls) { LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), @@ -233,6 +241,8 @@ locDetl.sync(wrkDetl); locDetl.setLocNo(wrkMast.getLocNo()); // 库位号 locDetl.setAnfme(wrkDetl.getAnfme()); // 数量 locDetl.setAreaId(locMast.getAreaId()); locMast.setAreaName(locMast.getAreaName()); locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码 locDetl.setModiTime(now); locDetl.setAppeTime(now); @@ -345,7 +355,6 @@ } // 修改库存明细数量,如无库存,曾新增 for (WrkDetl wrkDetl : wrkDetls54) { LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), @@ -366,6 +375,8 @@ locDetl.sync(wrkDetl); locDetl.setLocNo(wrkMast.getLocNo()); // 库位号 locDetl.setAnfme(wrkDetl.getAnfme()); // 数量 locDetl.setAreaId(locMast.getAreaId()); locMast.setAreaName(locMast.getAreaName()); locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码 locDetl.setModiTime(now); locDetl.setAppeTime(now); src/main/resources/mapper/LocDetlMapper.xml
@@ -120,22 +120,22 @@ </choose> </sql> <sql id="batchSeqA"> <choose> <when test="batch != null and batch != ''"> and a.batch = #{batch} </when> <otherwise> and (a.batch IS NULL OR a.batch = '') </otherwise> </choose> <choose> <when test="brand != null and brand != ''"> and a.brand = #{brand} </when> <otherwise> and (a.brand IS NULL OR a.brand = '') </otherwise> </choose> <!-- <choose>--> <!-- <when test="batch != null and batch != ''">--> <!-- and a.batch = #{batch}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.batch IS NULL OR a.batch = '')--> <!-- </otherwise>--> <!-- </choose>--> <!-- <choose>--> <!-- <when test="brand != null and brand != ''">--> <!-- and a.brand = #{brand}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.brand IS NULL OR a.brand = '')--> <!-- </otherwise>--> <!-- </choose>--> <choose> <when test="standby1 != null and standby1 != ''"> and a.standby1 = #{standby1} @@ -144,46 +144,46 @@ and (a.standby1 IS NULL OR a.standby1 = '') </otherwise> </choose> <choose> <when test="standby2 != null and standby2 != ''"> and a.standby2 = #{standby2} </when> <otherwise> and (a.standby2 IS NULL OR a.standby2 = '') </otherwise> </choose> <choose> <when test="standby3 != null and standby3 != ''"> and a.standby3 = #{standby3} </when> <otherwise> and (a.standby3 IS NULL OR a.standby3 = '') </otherwise> </choose> <choose> <when test="boxType1 != null and boxType1 != ''"> and a.box_type1 = #{boxType1} </when> <otherwise> and (a.box_type1 IS NULL OR a.box_type1 = '') </otherwise> </choose> <choose> <when test="boxType2 != null and boxType2 != ''"> and a.box_type2 = #{boxType2} </when> <otherwise> and (a.box_type2 IS NULL OR a.box_type2 = '') </otherwise> </choose> <choose> <when test="boxType3 != null and boxType3 != ''"> and a.box_type3 = #{boxType3} </when> <otherwise> and (a.box_type3 IS NULL OR a.box_type3 = '') </otherwise> </choose> <!-- <choose>--> <!-- <when test="standby2 != null and standby2 != ''">--> <!-- and a.standby2 = #{standby2}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.standby2 IS NULL OR a.standby2 = '')--> <!-- </otherwise>--> <!-- </choose>--> <!-- <choose>--> <!-- <when test="standby3 != null and standby3 != ''">--> <!-- and a.standby3 = #{standby3}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.standby3 IS NULL OR a.standby3 = '')--> <!-- </otherwise>--> <!-- </choose>--> <!-- <choose>--> <!-- <when test="boxType1 != null and boxType1 != ''">--> <!-- and a.box_type1 = #{boxType1}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.box_type1 IS NULL OR a.box_type1 = '')--> <!-- </otherwise>--> <!-- </choose>--> <!-- <choose>--> <!-- <when test="boxType2 != null and boxType2 != ''">--> <!-- and a.box_type2 = #{boxType2}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.box_type2 IS NULL OR a.box_type2 = '')--> <!-- </otherwise>--> <!-- </choose>--> <!-- <choose>--> <!-- <when test="boxType3 != null and boxType3 != ''">--> <!-- and a.box_type3 = #{boxType3}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.box_type3 IS NULL OR a.box_type3 = '')--> <!-- </otherwise>--> <!-- </choose>--> </sql> <sql id="batchSeqNew"> <choose> @@ -531,14 +531,6 @@ where 1=1 and b.loc_sts = 'F' and a.matnr = #{matnr} <!-- <choose>--> <!-- <when test="batch != null and batch != ''">--> <!-- and a.batch = #{batch}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.batch IS NULL OR a.batch = '')--> <!-- </otherwise>--> <!-- </choose>--> <if test="orderNo != null and orderNo != ''"> and a.order_no = #{orderNo} </if> @@ -625,14 +617,6 @@ where 1=1 and b.loc_sts = 'F' and a.matnr = #{matnr} <!-- <choose>--> <!-- <when test="batch != null and batch != ''">--> <!-- and a.batch = #{batch}--> <!-- </when>--> <!-- <otherwise>--> <!-- and (a.batch IS NULL OR a.batch = '')--> <!-- </otherwise>--> <!-- </choose>--> <if test="orderNo != null and orderNo != ''"> and a.order_no = #{orderNo} </if> src/main/webapp/static/js/locDetl/locDetl.js
@@ -7,7 +7,8 @@ ,{field: 'matnr', align: 'center',title: '商品编号', sort:true} ,{field: 'maktx', align: 'center',title: '商品名称', sort:true} ,{field: 'orderNo', align: 'center',title: '单据编号', hide: true} ,{field: 'batch', align: 'center',title: '批号', width: 300, sort:true} ,{field: 'threeCode', align: 'center',title: 'BS Code', sort:true} ,{field: 'standby1', align: 'center',title: '供应商代码', sort:true} ,{field: 'anfme', align: 'center',title: '可用数量'} ,{field: 'diffQty', align: 'center',title: '差异数量', templet: function(d) { src/main/webapp/views/wrkMast/wrkMast.html
@@ -129,6 +129,9 @@ {{#if (d.ioType === 107) { }} <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="pick">盘</a> {{# } }} {{#if (d.ioType === 104) { }} <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="pick">并</a> {{# } }} </script> <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>