فهرست منبع

Merge remote-tracking branch 'origin/master'

Zimo 4 هفته پیش
والد
کامیت
90ff0ee86a

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/config/PmsDataPermissionConfiguration.java

@@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyRep
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotryimprovedailyreport.IotRyImproveDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotsapstock.IotSapStockDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotwebtopoproject.IotWebtopoProjectDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.qhse.accident.IotAccidentReportDO;
@@ -85,6 +86,7 @@ public class PmsDataPermissionConfiguration {
             rule.addDeptColumn(QhseDeviceCertDO.class, "dept_id");
             rule.addDeptColumn(QhseFileTreeDO.class, "dept_id");
             rule.addDeptColumn(QhseInfoDO.class, "dept_id");
+            rule.addDeptColumn(IotWebtopoProjectDO.class, "dept_id");
             // user
 //            rule.addUserColumn(SupplierDO.class);
             rule.addUserColumn(AdminUserDO.class, "id");

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java

@@ -935,6 +935,9 @@ public class IotOpeationFillController {
         IotOpeationFillDO fillDO = new IotOpeationFillDO();
         fillDO.setId(id);
         IotOpeationFillDO iotOpeationFill = iotOpeationFillService.getFillById(fillDO);
+        if (ObjUtil.isEmpty(iotOpeationFill)) {
+            return success(BeanUtils.toBean(fillDO, IotOpeationFillDO.class));
+        }
         Map<Long, String> wellNamePair = new HashMap<>();
         iotOpeationFill.setWellNamePair(wellNamePair);
         TenantUtils.executeIgnore(() -> {

+ 7 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java

@@ -166,12 +166,16 @@ public class IotRhDailyReportController {
         Long taskId = result.getTaskId();
         if (ObjUtil.isNotEmpty(projectId)) {
             IotProjectInfoDO project = iotProjectInfoService.getIotProjectInfo(projectId);
-            result.setContractName(project.getContractName());
+            if (ObjUtil.isNotEmpty(project)) {
+                result.setContractName(project.getContractName());
+            }
         }
         if (ObjUtil.isNotEmpty(taskId)) {
             IotProjectTaskDO task = iotProjectTaskService.getIotProjectTask(taskId);
-            result.setTaskName(task.getWellName());
-            result.setLocation(task.getLocation());
+            if (ObjUtil.isNotEmpty(task)) {
+                result.setTaskName(task.getWellName());
+                result.setLocation(task.getLocation());
+            }
         }
 
         // 查询日报关联油耗记录

+ 7 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotwebtopoproject/vo/IotWebtopoProjectPageReqVO.java

@@ -8,6 +8,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
+import java.util.Collection;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -45,4 +46,10 @@ public class IotWebtopoProjectPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "部门id", example = "15434")
+    private Collection<Long> deptIds;
+
 }

+ 9 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotStaticController.java

@@ -1656,7 +1656,7 @@ public class IotStaticController {
         }
 
         // key日期2026-06-08   value日期对应的日报数量
-        Map<String, Set<Long>> dateReportDeviceIdPair = new HashMap<>();
+        Map<String, List<Long>> dateReportDeviceIdPair = new HashMap<>();
         reports.forEach(report -> {
             // 按照日期维度统计各 工作量数据 累计用电量 累计油耗 累计注气量 累计注水量
             LocalDateTime reportLocalDate = report.getCreateTime();
@@ -1666,11 +1666,13 @@ public class IotStaticController {
             Set<Long> reportDeviceIds = report.getDeviceIds();
             if (CollUtil.isNotEmpty(reportDeviceIds)) {
                 if (dateReportDeviceIdPair.containsKey(reportDateStr)) {
-                    Set<Long> tempDeviceIds = dateReportDeviceIdPair.get(reportDateStr);
+                    List<Long> tempDeviceIds = dateReportDeviceIdPair.get(reportDateStr);
                     tempDeviceIds.addAll(reportDeviceIds);
                     dateReportDeviceIdPair.put(reportDateStr, tempDeviceIds);
                 } else {
-                    dateReportDeviceIdPair.put(reportDateStr, reportDeviceIds);
+                    List<Long> tempDeviceIds = new ArrayList<>();
+                    tempDeviceIds.addAll(reportDeviceIds);
+                    dateReportDeviceIdPair.put(reportDateStr, tempDeviceIds);
                 }
             }
         });
@@ -1680,14 +1682,16 @@ public class IotStaticController {
             dateReportDeviceIdPair.forEach((reportDateStr, deviceIds) -> {
                 // 计算每天的所有日报涉及到的压裂连油主设备
                 // 1. 求交集:实际使用的A B类设备
-                Set<Long> utilizedDeviceIds = deviceIds.stream()
+                List<Long> utilizedDeviceIds = deviceIds.stream()
                         .filter(abDeviceIds::contains)
-                        .collect(Collectors.toSet());
+                        .collect(Collectors.toList());
                 if (CollUtil.isNotEmpty(abDeviceIds)) {
                     BigDecimal deviceUtilization = new BigDecimal((double) utilizedDeviceIds.size() / abDeviceIds.size())
                             .setScale(4, RoundingMode.HALF_UP);
                     dateReportUtilizationPair.put(reportDateStr, deviceUtilization);
                 }
+                System.out.println(reportDateStr + "瑞都设备利用率-分子:" + utilizedDeviceIds.size());
+                System.out.println(reportDateStr + "瑞都设备利用率-分母:" + abDeviceIds.size());
             });
         }
         // 5. 按日期升序补全最近7天,缺失填0

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotwebtopoproject/IotWebtopoProjectMapper.java

@@ -17,7 +17,8 @@ public interface IotWebtopoProjectMapper extends BaseMapperX<IotWebtopoProjectDO
 
     default PageResult<IotWebtopoProjectDO> selectPage(IotWebtopoProjectPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotWebtopoProjectDO>()
-                .eqIfPresent(IotWebtopoProjectDO::getDeptId, reqVO.getDeptId())
+                // .eqIfPresent(IotWebtopoProjectDO::getDeptId, reqVO.getDeptId())
+                .inIfPresent(IotWebtopoProjectDO::getDeptId, reqVO.getDeptIds())
                 .eqIfPresent(IotWebtopoProjectDO::getProjectId, reqVO.getProjectId())
                 .likeIfPresent(IotWebtopoProjectDO::getProjectName, reqVO.getProjectName())
                 .eqIfPresent(IotWebtopoProjectDO::getThumbnail, reqVO.getThumbnail())

+ 9 - 17
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pms.service.iotrddailyreport;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -761,7 +762,10 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                     taskStatusPair.put(task.getId(), task.getStatus());
                     taskCreateTimePair.put(task.getId(), task.getCreateTime());
                     // 获取所有任务的工作量数据
-                    taskWorkloadPair.put(task.getId(), new BigDecimal(task.getWorkloadDesign()));
+                    String workloadDesign = task.getWorkloadDesign();
+                    if (NumberUtil.isNumber(workloadDesign)) {
+                        taskWorkloadPair.put(task.getId(), new BigDecimal(task.getWorkloadDesign()));
+                    }
                     if (techniqueDictPair.containsKey(task.getTechnique())) {
                         String techniqueName = techniqueDictPair.get(task.getTechnique());
                         taskTechniquePair.put(task.getId(), techniqueName);
@@ -1273,7 +1277,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         // 20260604 修改设备利用率统计逻辑 统计 压裂 连油 主设备 rq_iot_device_associate
         // 队伍日报中关联的主设备数量 /(队伍下所有主设备数量-封存设备数量)
         Set<Long> mainDeviceIds = new HashSet<>();
-        Set<Long> fcMainDeviceIds = new HashSet<>();
+        Set<Long> usedMainDeviceIds = new HashSet<>();
         // key设备id   value设备所属部门id
         Map<Long, Long> mainDeviceIdPair = new HashMap<>();
         IotDeviceAssociatePageReqVO deviceAssocReqVO = new IotDeviceAssociatePageReqVO();
@@ -1296,11 +1300,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         // 过滤掉 封存 的 压裂 连油 主设备
         if (CollUtil.isNotEmpty(mainDevices)) {
             mainDevices.forEach(device -> {
-                /* if ("fc".equals(device.getDeviceStatus())) {
-                    fcMainDeviceIds.add(device.getId());
-                } else { */
-                    abDeviceIds.add(device.getId());
-                // }
+                abDeviceIds.add(device.getId());
             });
         }
 
@@ -1454,16 +1454,6 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                                 cumulativeWaterVolumePair.put("cumulativeWaterVolume", tempTotalWaterVolume);
                             }
                         }
-                        // 井数 日报关联任务 完工 井数 +1
-                        /* if ("井数".equals(unit)) {
-                            tempTotalCumulativeWorkingWell = tempTotalCumulativeWorkingWell.add(actualValue);
-                            if (cumulativeWorkingWellPair.containsKey("cumulativeWorkingWell")) {
-                                BigDecimal tempWorkingWell = cumulativeWorkingWellPair.get("cumulativeWorkingWell");
-                                cumulativeWorkingWellPair.put("cumulativeWorkingWell", tempTotalCumulativeWorkingWell.add(tempWorkingWell));
-                            } else {
-                                cumulativeWorkingWellPair.put("cumulativeWorkingWell", tempTotalCumulativeWorkingWell);
-                            }
-                        } */
                         if ("段数".equals(unit)) {
                             // 累计施工层
                             tempTotalCumulativeWorkingLayers = tempTotalCumulativeWorkingLayers.add(actualValue);
@@ -2044,6 +2034,8 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                         rate = 0;
                     }
                     utilizationRatePair.put(projectDeptId, BigDecimal.valueOf(rate));
+                    System.out.println(projectDeptId + "瑞都设备利用率-分子:" + reportDeviceCount);
+                    System.out.println(projectDeptId + "瑞都设备利用率-分母:" + projectDeviceCount);
                 });
             }
         }

+ 12 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotwebtopoproject/IotWebtopoProjectServiceImpl.java

@@ -13,14 +13,14 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotwebtopoproject.IotWebtopoPr
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotwebtopoprojectdevice.IotWebtopoProjectDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotwebtopoproject.IotWebtopoProjectMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotwebtopoprojectdevice.IotWebtopoProjectDeviceMapper;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.google.common.collect.ImmutableMap;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_WEBTOPO_PROJECT_NOT_EXISTS;
@@ -40,6 +40,9 @@ public class IotWebtopoProjectServiceImpl implements IotWebtopoProjectService {
     @Resource
     private IotWebtopoProjectDeviceMapper iotWebtopoProjectDeviceMapper;
 
+    @Resource
+    private DeptService deptService;
+
     @Override
     public Long createIotWebtopoProject(IotWebtopoProjectSaveReqVO createReqVO) {
         // 插入
@@ -117,6 +120,13 @@ public class IotWebtopoProjectServiceImpl implements IotWebtopoProjectService {
 
     @Override
     public PageResult<IotWebtopoProjectDO> getIotWebtopoProjectPage(IotWebtopoProjectPageReqVO pageReqVO) {
+        // 查询指定部门下所有子部门的数据
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+            pageReqVO.setDeptIds(ids);
+        }
         return iotWebtopoProjectMapper.selectPage(pageReqVO);
     }
 

+ 80 - 70
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/ZHBDUtil.java

@@ -57,35 +57,38 @@ public class ZHBDUtil {
      * @return
      * @throws Exception
      */
-    public Map<Integer, IotDeviceCarFuelVO> carFuels(String carIds, String startDate, String endDate) throws Exception {
-        String zhbdtoken = redisTemplate.opsForValue().get("zhbdtoken");
-        String clientId = redisTemplate.opsForValue().get("zhdbClientId");
-        if (StrUtil.isBlank(zhbdtoken) || StrUtil.isBlank(clientId)) {
-            Map<String, String> map = new HashMap<>();
-            map.put("id", ID);
-            map.put("secret", SECRET);
-            JSONObject entries = restTemplate.postForObject(TOKEN_URL, map, JSONObject.class);
-            if (Objects.nonNull(entries)&&entries.get("code") != null&&Integer.parseInt(String.valueOf(entries.get("code")))==200) {
-                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(entries.get("data")));
-                zhbdtoken = jsonObject.get("token").toString();
-                // 缓存 client_id
-                clientId = jsonObject.get("client_id").toString();
-                redisTemplate.opsForValue().set("zhbdtoken", zhbdtoken, 80000, TimeUnit.SECONDS);
-                redisTemplate.opsForValue().set("zhdbClientId", clientId, 80000, TimeUnit.SECONDS);
-            }
-        }
-        // 构建请求JSON
-        Map<String, Object> requestMap = new HashMap<>();
-        requestMap.put("client_ids", clientId);
-        requestMap.put("vehicle_ids", carIds);
-        requestMap.put("begin_time", startDate);
-        requestMap.put("end_time", endDate);
-        requestMap.put("page_num", 1);
-        requestMap.put("page_size", 10);
+    public Map<Integer, IotDeviceCarFuelVO> carFuels(String carIds, String startDate, String endDate) {
         // key车辆carId   value油耗值
         Map<Integer, IotDeviceCarFuelVO> carOilFuelPair = new HashMap<>();
-        if (StrUtil.isNotBlank(zhbdtoken)) {
-            try {
+
+        try {
+            String zhbdtoken = redisTemplate.opsForValue().get("zhbdtoken");
+            String clientId = redisTemplate.opsForValue().get("zhdbClientId");
+            if (StrUtil.isBlank(zhbdtoken) || StrUtil.isBlank(clientId)) {
+                Map<String, String> map = new HashMap<>();
+                map.put("id", ID);
+                map.put("secret", SECRET);
+                JSONObject entries = restTemplate.postForObject(TOKEN_URL, map, JSONObject.class);
+                if (Objects.nonNull(entries)&&entries.get("code") != null&&Integer.parseInt(String.valueOf(entries.get("code")))==200) {
+                    JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(entries.get("data")));
+                    zhbdtoken = jsonObject.get("token").toString();
+                    // 缓存 client_id
+                    clientId = jsonObject.get("client_id").toString();
+                    redisTemplate.opsForValue().set("zhbdtoken", zhbdtoken, 80000, TimeUnit.SECONDS);
+                    redisTemplate.opsForValue().set("zhdbClientId", clientId, 80000, TimeUnit.SECONDS);
+                }
+            }
+
+            if (StrUtil.isNotBlank(zhbdtoken)) {
+                // 构建请求JSON
+                Map<String, Object> requestMap = new HashMap<>();
+                requestMap.put("client_ids", clientId);
+                requestMap.put("vehicle_ids", carIds);
+                requestMap.put("begin_time", startDate);
+                requestMap.put("end_time", endDate);
+                requestMap.put("page_num", 1);
+                requestMap.put("page_size", 10);
+
                 String jsonResponse = sendPostRequest(requestMap, zhbdtoken, DAILY_FUEL_STATISTICS_URL);
                 ApiOilResponse response = parseResponse(jsonResponse);
                 if (response != null && response.code == 200) {
@@ -104,10 +107,12 @@ public class ZHBDUtil {
                         carOilFuelPair.put(carId, carFuel);
                     }
                 }
-            } catch (Exception e) {
-                log.info("获取油耗数据失败!");
+
             }
+        } catch (Exception e) {
+            log.info("获取油耗数据失败!");
         }
+
         return carOilFuelPair;
     }
 
@@ -118,28 +123,28 @@ public class ZHBDUtil {
      * @throws Exception
      */
     public Map<String, Integer> carLocations(String plates) throws Exception {
-        String zhbdtoken = redisTemplate.opsForValue().get("zhbdtoken");
-        if (StrUtil.isBlank(zhbdtoken)) {
-            Map<String, String> map = new HashMap<>();
-            map.put("id", ID);
-            map.put("secret", SECRET);
-            JSONObject entries = restTemplate.postForObject(TOKEN_URL, map, JSONObject.class);
-            if (Objects.nonNull(entries)&&entries.get("code") != null&&Integer.parseInt(String.valueOf(entries.get("code")))==200) {
-                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(entries.get("data")));
-                zhbdtoken = jsonObject.get("token").toString();
-                redisTemplate.opsForValue().set("zhbdtoken", zhbdtoken, 80000, TimeUnit.SECONDS);
-            }
-        }
-        // 构建请求JSON
-        Map<String, Object> requestMap = new HashMap<>();
-        // 车牌号码 用逗号分隔,例如(示例车牌1,示例车牌2)
-        requestMap.put("plates", plates);
-        requestMap.put("time", null);
-
         // key车牌号   value车辆carId
         Map<String, Integer> plateCarIdPair = new HashMap<>();
-        if (StrUtil.isNotBlank(zhbdtoken)) {
-            try {
+        try {
+            String zhbdtoken = redisTemplate.opsForValue().get("zhbdtoken");
+            if (StrUtil.isBlank(zhbdtoken)) {
+                Map<String, String> map = new HashMap<>();
+                map.put("id", ID);
+                map.put("secret", SECRET);
+                JSONObject entries = restTemplate.postForObject(TOKEN_URL, map, JSONObject.class);
+                if (Objects.nonNull(entries)&&entries.get("code") != null&&Integer.parseInt(String.valueOf(entries.get("code")))==200) {
+                    JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(entries.get("data")));
+                    zhbdtoken = jsonObject.get("token").toString();
+                    redisTemplate.opsForValue().set("zhbdtoken", zhbdtoken, 80000, TimeUnit.SECONDS);
+                }
+            }
+            // 构建请求JSON
+            Map<String, Object> requestMap = new HashMap<>();
+            // 车牌号码 用逗号分隔,例如(示例车牌1,示例车牌2)
+            requestMap.put("plates", plates);
+            requestMap.put("time", null);
+
+            if (StrUtil.isNotBlank(zhbdtoken)) {
                 String jsonResponse = sendPostRequest(requestMap, zhbdtoken, GET_LOCATION_USE_PLATES_URL);
                 ApiOilResponse response = parseResponse(jsonResponse);
                 if (response != null && response.code == 200) {
@@ -154,36 +159,41 @@ public class ZHBDUtil {
                         }
                     }
                 }
-            } catch (Exception e) {
-                log.info("获取油耗数据失败!");
             }
+        } catch (Exception e) {
+            log.info("获取车辆位置数据失败!");
         }
         return plateCarIdPair;
     }
 
-    private String sendPostRequest(Map<String, Object> requestData, String token, String requestUrl) throws IOException {
+    private String sendPostRequest(Map<String, Object> requestData, String token, String requestUrl) {
 
         OkHttpClient client = new OkHttpClient();
         ObjectMapper objectMapper = new ObjectMapper();
-        String json = objectMapper.writeValueAsString(requestData);
-        okhttp3.RequestBody body = okhttp3.RequestBody.create(json, okhttp3.MediaType.parse("application/json"));
-
-        Request request = new Request.Builder()
-                .url(requestUrl)
-                .post(body)
-                .addHeader("Content-Type", "application/json")
-                .addHeader("Authorization", "Bearer " + token)// 关键头信息
-                .build();
-        String responseData = "";
-        try (Response response = client.newCall(request).execute()) {
-            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
-            responseData = response.body().string();
-            System.out.println(responseData);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+        try {
+            String json = objectMapper.writeValueAsString(requestData);
+            okhttp3.RequestBody body = okhttp3.RequestBody.create(json, okhttp3.MediaType.parse("application/json"));
+            Request request = new Request.Builder()
+                    .url(requestUrl)
+                    .post(body)
+                    .addHeader("Content-Type", "application/json")
+                    .addHeader("Authorization", "Bearer " + token)
+                    .build();
 
-        return responseData;
+            try (Response response = client.newCall(request).execute()) {
+                if (!response.isSuccessful()) {
+                    logger.warn("第三方接口返回非200状态码: {}", response.code());
+                    return null;
+                }
+                String responseData = response.body().string();
+                logger.debug("第三方接口返回数据: {}", responseData);
+                return responseData;
+            }
+        } catch (Exception e) {
+            // 任何网络/SSL/解析异常都被这里吞掉,返回 null
+            logger.error("调用第三方接口失败,URL: {}", requestUrl, e);
+            return null;
+        }
     }
 
     private ApiOilResponse parseResponse(String json) throws IOException {