| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.rmi.CORBA.Util; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | private WorkService workService; |
| | | @Autowired |
| | | private BasCrnpService basCrnpService; |
| | | @Autowired |
| | | private ApiLogService apiLogService; |
| | | |
| | | @Override |
| | | @Transactional |
| | |
| | | @Transactional |
| | | public R pakoutOrderPause(OpenOrderPakoutPauseParam param) { |
| | | if (param == null || Cools.isEmpty(param.getOrderId())) { |
| | | throw new CoolException("orderNo is empty"); |
| | | throw new CoolException("orderNo不能为空"); |
| | | } |
| | | if (param.getExecute() == null) { |
| | | throw new CoolException("execute不能为空"); |
| | | } |
| | | |
| | | List<WrkMast> activeTasks = findActiveOutboundTasks(param.getOrderId()); |
| | | Map<String, Object> result = new HashMap<>(); |
| | | result.put("orderNo", param.getOrderId()); |
| | | result.put("taskCount", activeTasks.size()); |
| | | if (activeTasks.isEmpty()) { |
| | | result.put("confirmedCount", 0); |
| | | return R.ok("no active out tasks").add(result); |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | int confirmedCount = 0; |
| | | for (WrkMast wrkMast : activeTasks) { |
| | | if (wrkMast == null || "Y".equalsIgnoreCase(wrkMast.getPdcType())) { |
| | | continue; |
| | | if (Objects.equals(param.getExecute(), 1)) { |
| | | // ERP确认立即执行,仅处理待下发的出库任务。 |
| | | List<WrkMast> pendingTasks = activeTasks.stream() |
| | | .filter(wrkMast -> wrkMast != null && Objects.equals(wrkMast.getWrkSts(), 11L)) |
| | | .collect(Collectors.toList()); |
| | | Map<String, Object> result = new HashMap<>(); |
| | | result.put("orderNo", param.getOrderId()); |
| | | result.put("taskCount", pendingTasks.size()); |
| | | if (pendingTasks.isEmpty()) { |
| | | result.put("confirmedCount", 0); |
| | | return R.ok("无有效出库任务").add(result); |
| | | } |
| | | wrkMast.setPdcType("Y"); |
| | | |
| | | Date now = new Date(); |
| | | int confirmedCount = 0; |
| | | for (WrkMast wrkMast : pendingTasks) { |
| | | if (wrkMast == null || "Y".equalsIgnoreCase(wrkMast.getPdcType())) { |
| | | continue; |
| | | } |
| | | wrkMast.setPdcType("Y"); |
| | | // wrkMast.setUpdMk("ERP_CONFIRMED"); |
| | | // wrkMast.setManuType("ERP_CONFIRM_OUT"); |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setModiUser(9527L); |
| | | if (!wrkMastService.updateById(wrkMast)) { |
| | | throw new CoolException("confirm out task failed: " + wrkMast.getWrkNo()); |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setModiUser(9527L); |
| | | if (!wrkMastService.updateById(wrkMast)) { |
| | | throw new CoolException("确认执行出库任务失败: " + wrkMast.getWrkNo()); |
| | | } |
| | | confirmedCount++; |
| | | } |
| | | confirmedCount++; |
| | | } |
| | | |
| | | result.put("confirmedCount", confirmedCount); |
| | | return R.ok(confirmedCount == 0 ? "tasks already confirmed" : "erp confirm out success").add(result); |
| | | result.put("confirmedCount", confirmedCount); |
| | | return R.ok(confirmedCount == 0 ? "任务已确认执行" : "ERP确认执行出库成功").add(result); |
| | | } |
| | | if (Objects.equals(param.getExecute(), 2)) { |
| | | // ERP请求取消任务:直接收集任务号,按 taskList 格式发送给 WCS。 |
| | | Map<String, Object> result = new HashMap<>(); |
| | | result.put("orderNo", param.getOrderId()); |
| | | result.put("execute", param.getExecute()); |
| | | result.put("taskCount", activeTasks.size()); |
| | | if (activeTasks.isEmpty()) { |
| | | return R.ok("无有效出库任务").add(result); |
| | | } |
| | | List<HashMap<String,Object>> taskList = new ArrayList<>(); |
| | | for (WrkMast wrkMast : activeTasks) { |
| | | HashMap<String,Object> hashMap = new HashMap<>(); |
| | | hashMap.put("taskNo", wrkMast.getWrkNo()); |
| | | if (!Cools.isEmpty(wrkMast) && wrkMast.getWrkSts() ==11L) { |
| | | workService.cancelWrkMast(wrkMast.getWrkNo()+"", 9955L); |
| | | continue; |
| | | } |
| | | taskList.add(hashMap); |
| | | } |
| | | wcsApiService.pauseOutTasks(taskList); |
| | | return R.ok("取消任务已发送至WCS").add(result); |
| | | } |
| | | throw new CoolException("reason仅支持1或2"); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | | public R pakoutOrderExecute(OpenOrderPakoutExecuteParam param) { |
| | | if (param == null || Cools.isEmpty(param.getOrderId())) { |
| | | throw new CoolException("orderId is empty"); |
| | | } |
| | | if (param.getExecute() == null) { |
| | | throw new CoolException("execute is empty"); |
| | | } |
| | | if (Objects.equals(param.getExecute(), 1)) { |
| | | return createPakoutTasks(param.getOrderId()); |
| | | } |
| | | if (Objects.equals(param.getExecute(), 2)) { |
| | | OpenOrderPakoutPauseParam pauseParam = new OpenOrderPakoutPauseParam(); |
| | | pauseParam.setOrderId(param.getOrderId()); |
| | | // pauseParam.setReason("OPEN_API_CONFIRM_OUT"); |
| | | return pakoutOrderPause(pauseParam); |
| | | } |
| | | throw new CoolException("execute only supports 1 or 2"); |
| | | return null; |
| | | } |
| | | |
| | | private List<WrkMast> findActiveOutboundTasks(String orderNo) { |
| | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .in("wrk_no", wrkNos) |
| | | .in("io_type", Arrays.asList(101, 103, 104, 107, 108, 110)) |
| | | .eq("wrk_sts", 11L)); |
| | | .in("wrk_sts", Arrays.asList(11L, 12L, 13L))); |
| | | if (wrkMasts == null || wrkMasts.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | |
| | | return orderDetl.getMatnr() + "|batch=" + (orderDetl.getBatch() == null ? "" : orderDetl.getBatch()) + "|lack=" + lackQty; |
| | | } |
| | | |
| | | private boolean needNotifyWcsStop(WrkMast wrkMast) { |
| | | return wrkMast != null |
| | | && wrkMast.getWrkSts() != null |
| | | && wrkMast.getWrkSts() >= 12L |
| | | && wrkMast.getWrkSts() < 14L; |
| | | } |
| | | |
| | | private StopOutTaskParams buildStopOutTaskParams(OpenOrderPakoutPauseParam param, List<WrkMast> wrkMasts) { |
| | | private StopOutTaskParams buildStopOutTaskParams(List<WrkMast> wrkMasts) { |
| | | StopOutTaskParams stopParams = new StopOutTaskParams(); |
| | | stopParams.setOrderNo(param.getOrderId()); |
| | | stopParams.setReason(param.getReason()); |
| | | // WCS取消接口仅接收 taskList.taskNo。 |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | StopOutTaskParams.TaskItem item = new StopOutTaskParams.TaskItem(); |
| | | item.setTaskNo(String.valueOf(wrkMast.getWrkNo())); |
| | | if (wrkMast.getStaNo() != null) { |
| | | item.setStaNo(String.valueOf(wrkMast.getStaNo())); |
| | | } |
| | | item.setLocNo(wrkMast.getSourceLocNo()); |
| | | stopParams.getTasks().add(item); |
| | | } |
| | | return stopParams; |
| | |
| | | stationParams.add(stationParam); |
| | | } |
| | | } |
| | | String requestJson = JSON.toJSONString(stationParams); |
| | | String response = ""; |
| | | boolean pushOk = false; |
| | | String pushUrl = buildMesStationRequestUrl(); |
| | | try { |
| | | //获取Cookie值 |
| | | HashMap<String, Object> headers = new HashMap<>(); |
| | |
| | | .setHeaders(headers) |
| | | .setUri(mesUrl) |
| | | .setPath(stationAddress) |
| | | .setJson(JSON.toJSONString(stationParams)) |
| | | .setJson(requestJson) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonResponse = JSON.parseObject(response); |
| | | if (jsonResponse.getInteger("code") == 200) { |
| | | |
| | | if (jsonResponse != null && Integer.valueOf(200).equals(jsonResponse.getInteger("code"))) { |
| | | pushOk = true; |
| | | } else { |
| | | return R.error(); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | try { |
| | | apiLogService.save( |
| | | "推ERP-站点同步", |
| | | pushUrl, |
| | | null, |
| | | "127.0.0.1", |
| | | requestJson, |
| | | response, |
| | | pushOk, |
| | | "站点同步推对方" |
| | | ); |
| | | } catch (Exception logEx) { |
| | | log.error("save station sync api log failed", logEx); |
| | | } |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | | private String buildMesStationRequestUrl() { |
| | | if (Cools.isEmpty(mesUrl)) { |
| | | return stationAddress; |
| | | } |
| | | if (stationAddress == null) { |
| | | return mesUrl; |
| | | } |
| | | if (mesUrl.endsWith("/") && stationAddress.startsWith("/")) { |
| | | return mesUrl + stationAddress.substring(1); |
| | | } |
| | | if (!mesUrl.endsWith("/") && !stationAddress.startsWith("/")) { |
| | | return mesUrl + "/" + stationAddress; |
| | | } |
| | | return mesUrl + stationAddress; |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | if (param.getFull() == 1) { |
| | | //满托盘 |
| | | mat = matService.selectByMatnr("emptyPallet"); |
| | | if(param.getBoxType1().equals("aws")){ |
| | | mat = matService.selectByMatnr("amazon"); |
| | | }else { |
| | | mat = matService.selectByMatnr("cloudWarehouse"); |
| | | } |
| | | |
| | | } else if (param.getFull() == 0) { |
| | | //空托盘 |
| | | mat = matService.selectByMatnr("emptyPallet"); |
| | |
| | | waitPakin.setManu(String.valueOf(param.getLocId()));//mes具体库位编号 |
| | | waitPakin.setThreeCode(param.getBizNo()); |
| | | waitPakin.setBeBatch(param.getPackage1());//是否散货,0 非散货;1 散货;为了管控出货速率,散货可以出慢点。 |
| | | // ERP 入口默认打 erp,MQTT 组托会在参数里显式传 aws。 |
| | | waitPakin.setBoxType1(Cools.isEmpty(param.getBoxType1()) ? "erp" : param.getBoxType1()); |
| | | if (!waitPakinService.insert(waitPakin)) { |
| | | throw new CoolException("保存入库通知档失败"); |
| | | } |
| | | return null; |
| | | return R.ok().add(Cools.add("palletId", param.getPalletId()).add("orderId", param.getOrderId())); |
| | | } |
| | | |
| | | @Override |
| | | public R outOrder(OutTaskParam param) { |
| | | public R outOrder(OutTaskParam param,int count) { |
| | | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "F").eq("barcode", param.getPalletId())); |
| | | if (locMast == null) { |
| | | return R.error("没有找到托盘码=" + param.getPalletId() + "对应的库位"); |
| | | throw new CoolException("没有找到托盘码=" + param.getPalletId() + "对应的库位"); |
| | | } |
| | | Integer ioType = 101; |
| | | // 获取路径 |
| | |
| | | wrkDetl.setAppeUser(9995L); |
| | | wrkDetl.setModiTime(now); |
| | | wrkDetl.setModiUser(9995L); |
| | | wrkDetl.setSupp(param.getSeq()+"/"+count); |
| | | |
| | | if (!wrkDetlService.insert(wrkDetl)) { |
| | | throw new CoolException("保存工作档明细失败"); |
| | |
| | | log.error(locMast.getLocNo() + "库位不是在库状态"); |
| | | throw new CoolException(locMast.getLocNo() + "库位不是在库状态"); |
| | | } |
| | | return R.ok().add(Cools.add("wrkNo", workNo).add("orderId", param.getOrderId())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R outOrderBatch(List<OutTaskParam> params) { |
| | | int n = params.size(); |
| | | for (OutTaskParam outTaskParam : params) { |
| | | R r = outOrder(outTaskParam, n); |
| | | if (!Objects.equals(r.get("code"), 200)) { |
| | | throw new CoolException("出库建单失败"); |
| | | } |
| | | } |
| | | return R.ok(); |
| | | } |
| | | } |
| | | |
| | | |