From f910377a07c3ab8e428f094b4bb4d2b03ea1d1a8 Mon Sep 17 00:00:00 2001 From: Administrator <335182714> Date: 星期五, 27 六月 2025 09:52:56 +0800 Subject: [PATCH] #接口防抖 --- src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java | 231 +++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 158 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java index 29658dd..699c9e5 100644 --- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java @@ -30,11 +30,13 @@ import com.zy.system.mapper.ConfigMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -1135,57 +1137,88 @@ return "鍏ュ簱鎴愬姛"; } + @Autowired + private StringRedisTemplate redisTemplate; + @Override @Transactional public R kthl(KthlParam param) { + String barcode = param.getBarcode(); + String lockKey = "kthl:lock:" + barcode; + String lockVal = UUID.randomUUID().toString(); // 闃叉璇垹浠栦汉閿� - // 鑾峰彇妯″紡涓虹數鑴戞ā寮忥紝鏃犱换鍔$殑鍫嗗灈鏈哄垪琛�:闃叉鍒嗛厤鍒板爢鍨涙満涓嶅彲鐢� - List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3) - .eq("wrk_no",0).eq("in_enable","Y").eq("out_enable","Y")); - if (basCrnps.isEmpty()) { - // 閮芥湁浠诲姟鍒欒幏鍙栫數鑴戞ā寮忕殑鍫嗗灈鏈哄垪琛� - basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3).eq("in_enable","Y") - .eq("out_enable","Y")); + // 鍒嗗竷寮忛攣锛�5绉掕繃鏈� + Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 5, TimeUnit.SECONDS); + if (locked == null || !locked) { + return R.error("閲嶅鎻愪氦锛氳鎵樼洏宸插湪澶勭悊锛岃鍕块噸澶嶆搷浣�"); } - if (basCrnps.isEmpty()) { - throw new CoolException("娌℃湁鍙敤鍫嗗灈鏈�,鍫嗗灈鏈哄仠姝㈡垨寮傚父鎴栫鐢�"); - } - // 鍙敤鍫嗗灈鏈哄垪琛� - List<Integer> crnNoList = basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()); - Integer crnNo = crnNoList.get(0); - int workNo = commonService.getWorkNo(5); - Date now = new Date(); - // 鐢熸垚宸ヤ綔妗� - WrkMast wrkMast = new WrkMast(); - wrkMast.setWrkNo(workNo); - wrkMast.setIoTime(new Date()); - wrkMast.setWrkSts(1L); // - wrkMast.setIoType(3); // 绔欏埌绔� - wrkMast.setIoPri(14D); // 浼樺厛绾� - wrkMast.setCrnNo(crnNo); - wrkMast.setSourceStaNo(secondFloorIn[crnNo]); - wrkMast.setStaNo(secondFloorOut[crnNo]); - wrkMast.setLocNo(""); - wrkMast.setBarcode(param.getBarcode()); // 鎵樼洏鐮� - wrkMast.setFullPlt("N"); // 婊℃澘锛歒 - wrkMast.setPicking("N"); // 鎷f枡 - wrkMast.setExitMk("N"); // 閫�鍑� - wrkMast.setEmptyMk("Y"); // 绌烘澘 - wrkMast.setLinkMis("Y"); - wrkMast.setCtnType(1); // 瀹瑰櫒绫诲瀷 - // 鎿嶄綔浜哄憳鏁版嵁 - wrkMast.setAppeTime(now); - wrkMast.setModiTime(now); - boolean res = wrkMastService.insert(wrkMast); - if (!res) { - throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�"); - } - // 杩斿洖GWCS鐩爣淇℃伅 - pushStaNoToGwcs(param.getPalletizingNo(),wrkMast.getSourceStaNo(),workNo,param.getBarcode(),"浜屾ゼ绌烘墭鍥炴祦鎺ㄩ�乬wcs"); + try { + // 鑾峰彇绌洪棽鍫嗗灈鏈猴紙鐢佃剳妯″紡銆佹棤浠诲姟锛� + List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>() + .eq("crn_sts", 3).eq("wrk_no", 0) + .eq("in_enable", "Y").eq("out_enable", "Y")); - return R.ok("绌烘墭鍥炴祦璇锋眰鎴愬姛"); + // 濡傛灉娌℃湁绌洪棽鍫嗗灈鏈猴紝灏濊瘯鎵�鏈夊彲鐢ㄥ爢鍨涙満 + if (basCrnps.isEmpty()) { + basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>() + .eq("crn_sts", 3) + .eq("in_enable", "Y").eq("out_enable", "Y")); + } + + if (basCrnps.isEmpty()) { + throw new CoolException("娌℃湁鍙敤鍫嗗灈鏈�,鍫嗗灈鏈哄仠姝㈡垨寮傚父鎴栫鐢�"); + } + + // 鑾峰彇绗竴涓彲鐢ㄥ爢鍨涙満 + List<Integer> crnNoList = basCrnps.stream() + .map(BasCrnp::getCrnNo) + .collect(Collectors.toList()); + Integer crnNo = crnNoList.get(0); + + int workNo = commonService.getWorkNo(5); + Date now = new Date(); + + // 鐢熸垚宸ヤ綔妗� + WrkMast wrkMast = new WrkMast(); + wrkMast.setWrkNo(workNo); + wrkMast.setIoTime(now); + wrkMast.setWrkSts(1L); + wrkMast.setIoType(3); // 绔欏埌绔� + wrkMast.setIoPri(14D); + wrkMast.setCrnNo(crnNo); + wrkMast.setSourceStaNo(secondFloorIn[crnNo]); + wrkMast.setStaNo(secondFloorOut[crnNo]); + wrkMast.setLocNo(""); + wrkMast.setBarcode(barcode); + wrkMast.setFullPlt("N"); + wrkMast.setPicking("N"); + wrkMast.setExitMk("N"); + wrkMast.setEmptyMk("Y"); + wrkMast.setLinkMis("Y"); + wrkMast.setCtnType(1); + wrkMast.setAppeTime(now); + wrkMast.setModiTime(now); + + boolean res = wrkMastService.insert(wrkMast); + if (!res) { + throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�"); + } + + // 鎺ㄩ�佺珯鐐瑰埌GWCS + pushStaNoToGwcs(param.getPalletizingNo(), wrkMast.getSourceStaNo(), workNo, barcode, "浜屾ゼ绌烘墭鍥炴祦鎺ㄩ�乬wcs"); + + return R.ok("绌烘墭鍥炴祦璇锋眰鎴愬姛"); + + } finally { + // 瑙i攣锛岀‘淇濆彧閲婃斁鑷繁鍔犵殑閿� + String val = redisTemplate.opsForValue().get(lockKey); + if (lockVal.equals(val)) { + redisTemplate.delete(lockKey); + } + } } + @Override public R tb(TbParam param) { @@ -1490,8 +1523,14 @@ wrkMastService.updateById(wrkMast); } - // 鍑哄簱涓婃姤鎺ㄩ�乵es璁板綍 - ckjgsbPushMes(wrkMast,wrkDetls); + if(!wrkDetls.get(0).getMatnr().equals("绌虹")){ + // 鍑哄簱涓婃姤鎺ㄩ�乵es璁板綍 + ckjgsbPushMes(wrkMast,wrkDetls); + }else{ + wrkMast.setWrkSts(14L); + wrkMastService.updateById(wrkMast); + } + return "鍑哄簱缁撴灉涓婃姤鎴愬姛"; } @@ -2005,6 +2044,15 @@ materialDetail.setRollNo(wrkDetl.getModel()); materialDetail.setBoxNo(wrkDetl.getUnit()); materialDetail.setSpecs(wrkDetl.getMatnr()); + materialDetail.setBoxType(wrkDetl.getColor()); + materialDetail.setCoreType(wrkDetl.getManu()); + materialDetail.setWidth(wrkDetl.getSku()); + materialDetail.setThickness(wrkDetl.getItemNum()); + materialDetail.setWeight(wrkDetl.getWeight()); + materialDetail.setLength(wrkDetl.getLength()); + materialDetail.setVolume(wrkDetl.getVolume()); + materialDetail.setCustomerName(wrkDetl.getSupp()); + materialDetail.setMemo(wrkDetl.getMemo()); material.setBoxPos(wrkDetl.getOrigin()); // 鎵樼洏涓婃湪绠变綅缃� materialDetailList.add(materialDetail); } @@ -2014,14 +2062,15 @@ Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", wrkDetl.getOrderNo())); if (order != null) { material.setOrderNo(order.getOrderNo()); - material.setMemo(order.getMemo()); - material.setCustomerName(order.getCstmrName()); +// material.setMemo(order.getMemo()); +// material.setCustomerName(order.getCstmrName()); List<OrderStatisticsDto> unfulfilledOrders = orderMapper.getUnfulfilledOrders(order.getOrderNo()); if (unfulfilledOrders.size() == 1) { OrderStatisticsDto orderStatisticsDto = unfulfilledOrders.get(0); material.setSum(orderStatisticsDto.getSum()); material.setToShipQuantity(orderStatisticsDto.getToShipQuantity()); material.setWorkQuantity(orderStatisticsDto.getWorkQuantity()); + material.setCompleteQuantity(orderStatisticsDto.getCompletedQuantity()); } } } @@ -2085,39 +2134,60 @@ return wrkDetls.size() > 1 ? 1 : 4; // 涓�鏉¤褰曞氨鏄竴鍗� } - public boolean pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo,String barcode,String message) { - boolean success = false; - // 鑾峰彇璇锋眰澶� - Map<String, Object> headers = getHeaders(); + public boolean pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo, String barcode, String message) { + int maxRetry = 3; // 鏈�澶氶噸璇� 3 娆� + long retryDelay = 10000; // 閲嶈瘯闂撮殧 10 绉� + boolean finalSuccess = false; - // 鏋勯�犺姹備綋 + Map<String, Object> headers = getHeaders(); JSONObject jsonObject = new JSONObject(); jsonObject.put("workNo", workNo); jsonObject.put("staNo", staNo); jsonObject.put("sourceStaNo", palletizingNo); jsonObject.put("barcode", barcode); String body = jsonObject.toJSONString(); - String response = ""; - try { - response = new HttpHandler.Builder() - .setUri(MesConstant.GWCS_IP_PORT) - .setPath(MesConstant.GWCS_FPKW_URL) - .setHeaders(headers) - .setJson(body) - .build() - .doPost(); - if (!Cools.isEmpty(response)) { - success = true; - } else { - log.error(message + "澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", MesConstant.GWCS_IP_PORT + MesConstant.GWCS_FPKW_URL, body, response); - } - } catch (Exception e) { - log.error(message + "寮傚父锛歿}", e); - } finally { + + for (int attempt = 1; attempt <= maxRetry; attempt++) { + String response = ""; + boolean success = false; + String attemptMsg = message + "锛堢 " + attempt + " 娆″皾璇曪級"; + try { - // 淇濆瓨鎺ュ彛鏃ュ織 + response = new HttpHandler.Builder() + .setUri(MesConstant.GWCS_IP_PORT) + .setPath(MesConstant.GWCS_FPKW_URL) + .setHeaders(headers) + .setJson(body) + .setTimeout(30, TimeUnit.SECONDS) // 璁剧疆杩炴帴 + 璇诲彇瓒呮椂涓�30绉� + .build() + .doPost(); + + + if (!Cools.isEmpty(response)) { + try { + JSONObject resJson = JSON.parseObject(response); + int code = resJson.getIntValue("code"); // 瑙嗗叿浣撴帴鍙h�屽畾 + if (code == 200) { + success = true; + finalSuccess = true; + log.info("{} 鎴愬姛锛屽搷搴旓細{}", attemptMsg, response); + } else { + log.warn("{} 鍝嶅簲澶辫触锛岃繑鍥瀋ode={}锛屽畬鏁村搷搴旓細{}", attemptMsg, code, response); + } + } catch (Exception parseEx) { + log.warn("{} 鍝嶅簲瑙f瀽澶辫触锛屽唴瀹癸細{}", attemptMsg, response); + } + } else { + log.warn("{} 澶辫触锛屽搷搴斾负绌�", attemptMsg); + } + } catch (Exception e) { + log.error("{} 寮傚父锛歿}", attemptMsg, e.getMessage(), e); + } + + // 姣忔閮借褰曟棩蹇楋紝涓嶈鎴愬姛鎴栧け璐� + try { apiLogService.save( - message, + attemptMsg, MesConstant.GWCS_IP_PORT + MesConstant.GWCS_FPKW_URL, null, "127.0.0.1", @@ -2126,12 +2196,27 @@ success ); } catch (Exception e) { - log.error("", e); + log.error("淇濆瓨鎺ュ彛鏃ュ織寮傚父锛歿}", e.getMessage(), e); + } + + if (success) break; // 鎴愬姛灏变笉鍐嶉噸璇� + + // 濡傛灉杩樻湁涓嬩竴娆¢噸璇曪紝鍒欑瓑寰� + if (attempt < maxRetry) { + try { + Thread.sleep(retryDelay); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } } } - return success; + + return finalSuccess; } + + Map<String, Object> getHeaders(){ Map<String,Object> headers = new HashMap<>(); headers.put("digi-type","sync "); -- Gitblit v1.9.1