| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.baomidou.mybatisplus.mapper.Wrapper; |
| | |
| | | import com.zy.asrs.entity.result.StockVo; |
| | | import com.zy.asrs.entity.result.ZphjcdgzVo; |
| | | import com.zy.asrs.entity.result.ZphjcdwcVo; |
| | | import com.zy.asrs.mapper.LocDetlMapper; |
| | | import com.zy.asrs.mapper.MatMapper; |
| | | import com.zy.asrs.mapper.TagMapper; |
| | | import com.zy.asrs.mapper.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.MatUtils; |
| | | import com.zy.common.constant.MesConstant; |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | |
| | | @Resource |
| | | private ConfigMapper configMapper; |
| | | |
| | | @Resource |
| | | private OrderMapper orderMapper; |
| | | |
| | | @Resource |
| | | private BasCrnpMapper basCrnpMapper; |
| | | |
| | | @Override |
| | | @Transactional |
| | |
| | | |
| | | @Override |
| | | @Transactional |
| | | public void prodCheck(List<ProdCheckParam> param) { |
| | | public R prodCheck(List<ProdCheckParam> param) { |
| | | if (param.isEmpty()) { |
| | | throw new CoolException("请求参数不能为空"); |
| | | return R.parse("请求参数不能为空"); |
| | | } |
| | | for (ProdCheckParam checkParam : param) { |
| | | // 更新库存明细是否合格 |
| | | LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("brand", checkParam.getPackageGroupNo()) |
| | | .eq("unit", checkParam.getBoxNo()).eq("model", checkParam.getRollNo())); |
| | | LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("model", checkParam.getRollNo())); |
| | | // 更新商品表是否合格 |
| | | Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("brand", checkParam.getPackageGroupNo()) |
| | | .eq("unit", checkParam.getBoxNo()).eq("model", checkParam.getRollNo())); |
| | | if (locDetl == null || mat == null) { |
| | | // Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("model", checkParam.getRollNo())); |
| | | if (locDetl == null) { // || mat == null |
| | | throw new CoolException("更新是否合格物料不存在:" + checkParam); |
| | | } |
| | | |
| | | locDetl.setThreeCode(checkParam.getQualified()); |
| | | mat.setThreeCode(checkParam.getQualified()); |
| | | // mat.setThreeCode(checkParam.getQualified()); |
| | | |
| | | locDetlService.update(locDetl,new EntityWrapper<LocDetl>().eq("brand", checkParam.getPackageGroupNo()) |
| | | .eq("unit", checkParam.getBoxNo()).eq("model", checkParam.getRollNo())); |
| | | matService.update(mat,(new EntityWrapper<Mat>().eq("brand", checkParam.getPackageGroupNo()) |
| | | .eq("unit", checkParam.getBoxNo()).eq("model", checkParam.getRollNo()))); |
| | | locDetlService.update(locDetl, new EntityWrapper<LocDetl>().eq("model", checkParam.getRollNo())); |
| | | // matService.update(mat, (new EntityWrapper<Mat>().eq("model", checkParam.getRollNo()))); |
| | | } |
| | | |
| | | return R.ok("更新成功"); |
| | | } |
| | | |
| | | @Override |
| | |
| | | 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"); // 满板:Y |
| | | 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("保存工作档失败"); |
| | | } |
| | | // 返回GWCS目标信息 |
| | | pushStaNoToGwcs(param.getPalletizingNo(),wrkMast.getSourceStaNo(),workNo,param.getBarcode(),"二楼空托回流推送gwcs"); |
| | | 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("保存工作档失败"); |
| | | } |
| | | |
| | | // 推送站点到GWCS |
| | | pushStaNoToGwcs(param.getPalletizingNo(), wrkMast.getSourceStaNo(), workNo, barcode, "二楼空托回流推送gwcs"); |
| | | |
| | | return R.ok("空托回流请求成功"); |
| | | |
| | | } finally { |
| | | // 解锁,确保只释放自己加的锁 |
| | | String val = redisTemplate.opsForValue().get(lockKey); |
| | | if (lockVal.equals(val)) { |
| | | redisTemplate.delete(lockKey); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public R tb(TbParam param) { |
| | |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | | wrkMast.setWhsType(iotype == 1 && param.getPalletizingNo() == 2051 ? 1 : 0); // 返修入库标记 |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMast.setWrkSts(1L); // 工作状态:设备上走 |
| | | wrkMast.setIoType(iotype); // 入出库状态:1.入库 |
| | |
| | | } |
| | | |
| | | DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.FALSE); |
| | | if (docType == null) { |
| | | return R.parse("单据类型不存在,请检查:" + param.getOrderType()); |
| | | } |
| | | Date now = new Date(); |
| | | |
| | | // 单据主档 |
| | |
| | | null, // 初始票据号 |
| | | null, // 票据号 |
| | | null, // 客户编号 |
| | | null, // 客户 |
| | | param.getCustomerName(), // 客户 |
| | | null, // 联系方式 |
| | | null, // 操作人员 |
| | | null, // 合计金额 |
| | |
| | | now, // 添加时间 |
| | | 9527L, // 修改人员 |
| | | now, // 修改时间 |
| | | null // 备注 |
| | | param.getMemo() // 备注 |
| | | ); |
| | | |
| | | if (!orderService.insert(order)) { |
| | |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | |
| | | if(!wrkDetls.get(0).getMatnr().equals("空箱")){ |
| | | // 出库上报推送mes记录 |
| | | ckjgsbPushMes(wrkMast,wrkDetls); |
| | | }else{ |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | |
| | | |
| | | return "出库结果上报成功"; |
| | | } |
| | | |
| | | private void ckjgsbPushMes(WrkMast wrkMast, List<WrkDetl> wrkDetls) { |
| | | GwmsGenerateInventoryDto gwmsGenerateInventoryDto = new GwmsGenerateInventoryDto(); |
| | | gwmsGenerateInventoryDto.setBarcode(wrkMast.getBarcode()); |
| | | gwmsGenerateInventoryDto.setPalletizingNo(wrkMast.getStaNo()); |
| | | List<GwmsGenerateInventoryDto.MatList> matLists = new ArrayList<>(); |
| | | for (WrkDetl wrkDetl:wrkDetls) { |
| | | boolean flag = true; |
| | | for (GwmsGenerateInventoryDto.MatList matList : matLists) { |
| | | if (matList.getPackageGroupNo().equals(wrkDetl.getBrand())) { |
| | | matList.getRolls().add(new GwmsGenerateInventoryDto.Rolls(wrkDetl.getModel(), |
| | | wrkDetl.getUnit(),wrkDetl.getMaktx(),wrkDetl.getLength(), |
| | | Integer.parseInt(wrkDetl.getSpecs()),wrkDetl.getWeight(),wrkDetl.getVolume(), |
| | | wrkDetl.getManuDate())); |
| | | flag = false; |
| | | break; |
| | | } |
| | | } |
| | | if (flag) { |
| | | GwmsGenerateInventoryDto.MatList matList = new GwmsGenerateInventoryDto.MatList(); |
| | | matList.setBoxPos(wrkDetl.getOrigin()); |
| | | matList.setPackageGroupNo(wrkDetl.getBrand()); |
| | | matList.setOutOrIn("out"); |
| | | matList.setStockType(wrkMast.getStaNo() == 2041 ? "返修出库" : "成品出库"); |
| | | matList.setBoxType(wrkDetl.getColor()); |
| | | matList.setRollType(wrkDetl.getManu()); |
| | | matList.setWideInWidth(wrkDetl.getSku()); |
| | | matList.setThickness(wrkDetl.getItemNum()); |
| | | List<GwmsGenerateInventoryDto.Rolls> rollsList = new ArrayList<>(); |
| | | GwmsGenerateInventoryDto.Rolls roll = new GwmsGenerateInventoryDto.Rolls(wrkDetl.getModel(), |
| | | wrkDetl.getUnit(),wrkDetl.getMaktx(),wrkDetl.getLength(), |
| | | Integer.parseInt(wrkDetl.getSpecs()),wrkDetl.getWeight(),wrkDetl.getVolume(), |
| | | wrkDetl.getManuDate()); |
| | | rollsList.add(roll); |
| | | matList.setRolls(rollsList); |
| | | matLists.add(matList); |
| | | } |
| | | } |
| | | gwmsGenerateInventoryDto.setMatList(matLists); |
| | | |
| | | |
| | | |
| | | boolean success = false; |
| | | // 获取请求头 |
| | | Map<String,Object> headers = new HashMap<>(); |
| | | headers.put("Content-Type","application/json;charset=UTF-8"); |
| | | |
| | | // 构造请求体 |
| | | String body = JSON.toJSONString(gwmsGenerateInventoryDto); |
| | | String response = ""; |
| | | try { |
| | | response = new HttpHandler.Builder() |
| | | .setUri(MesConstant.MES_CC_IP_PORT) |
| | | .setPath(MesConstant.MES_CC_FXRK_URL) |
| | | .setHeaders(headers) |
| | | .setJson(body) |
| | | .build() |
| | | .doPost(); |
| | | if (!Cools.isEmpty(response)) { |
| | | JSONObject jsonObject1 = JSONObject.parseObject(response); |
| | | int code = (int) jsonObject1.get("code"); |
| | | boolean state = jsonObject1.getBoolean("state"); |
| | | if (code == 200 && state) { |
| | | success = true; |
| | | } |
| | | } else { |
| | | log.error("出库上报推送mes记录失败!!!url:{};request:{};response:{}", MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_FXRK_URL, body, response); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("出库上报推送mes记录异常:{}", e.getMessage()); |
| | | } finally { |
| | | try { |
| | | // 保存接口日志 |
| | | apiLogService.save( |
| | | "出库上报推送mes记录", |
| | | MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_FXRK_URL, |
| | | null, |
| | | "127.0.0.1", |
| | | body, |
| | | response, |
| | | success |
| | | ); |
| | | } catch (Exception e) { |
| | | log.error("", e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Autowired |
| | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public R getUnfulfilledOrders() { |
| | | // 获取未完成订单统计信息 |
| | | List<OrderStatisticsDto> unfulfilledOrders = orderMapper.getUnfulfilledOrders(""); |
| | | return R.ok(unfulfilledOrders); |
| | | } |
| | | |
| | | @Override |
| | | public R getCrnLaneWayInfo() { |
| | | List<CrnLaneWayInfoDto> crnLaneWayInfo = basCrnpMapper.getCrnLaneWayInfo(); |
| | | return R.ok(crnLaneWayInfo); |
| | | } |
| | | |
| | | @Override |
| | | public R getOutLocInfoByBarcode(String barcode) { |
| | | |
| | | // 根据托盘码获取任务主档 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", barcode)); |
| | | if (wrkMast == null) { |
| | | return R.parse("该条码无正在执行任务:" + barcode); |
| | | } |
| | | // 根据任务主档获取工作档明细 |
| | | List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); |
| | | // 提取包装组号 |
| | | List<String> brandList = wrkDetls.stream().map(WrkDetl::getBrand).distinct().collect(Collectors.toList()); |
| | | OutLocInfoDto outLocInfoDto = new OutLocInfoDto(); |
| | | outLocInfoDto.setWrkNo(wrkMast.getWrkNo()); |
| | | List<OutLocInfoDto.Material> materialList = new ArrayList<>(); |
| | | for (String brand : brandList) { |
| | | // 一个木箱 |
| | | OutLocInfoDto.Material material = new OutLocInfoDto.Material(); |
| | | material.setPackageGroupNo(brand); // 包装组号 |
| | | // 按包装组号过滤 |
| | | List<WrkDetl> wrkDetls1 = wrkDetls.stream().filter(wrkDetl -> Objects.equals(wrkDetl.getBrand(), brand)).collect(Collectors.toList()); |
| | | // 卷信息 |
| | | List<OutLocInfoDto.Material.MaterialDetail> materialDetailList = new ArrayList<>(); |
| | | for (WrkDetl wrkDetl : wrkDetls1) { |
| | | OutLocInfoDto.Material.MaterialDetail materialDetail = new OutLocInfoDto.Material.MaterialDetail(); |
| | | 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); |
| | | } |
| | | // 订单信息 |
| | | WrkDetl wrkDetl = wrkDetls1.get(0); |
| | | if (wrkDetl != null && wrkDetl.getOrderNo() != null) { |
| | | 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()); |
| | | 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()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | material.setMaterialDetailList(materialDetailList); |
| | | materialList.add(material); |
| | | } |
| | | outLocInfoDto.setMaterialList(materialList); |
| | | |
| | | return R.ok(outLocInfoDto); |
| | | } |
| | | |
| | | /** |
| | | * 创建桁架理货出库的工作档 |
| | | */ |
| | |
| | | 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 + "失败!!!url:{};request:{};response:{}", 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"); // 视具体接口而定 |
| | | if (code == 200) { |
| | | success = true; |
| | | finalSuccess = true; |
| | | log.info("{} 成功,响应:{}", attemptMsg, response); |
| | | } else { |
| | | log.warn("{} 响应失败,返回code={},完整响应:{}", attemptMsg, code, response); |
| | | } |
| | | } catch (Exception parseEx) { |
| | | log.warn("{} 响应解析失败,内容:{}", 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", |
| | |
| | | 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 "); |