huangjiayang
2025-05-09 86637e6a48cc4511e34fe426d5a617e3ee018dfa
aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java
@@ -1,26 +1,32 @@
package com.aps.job.service.impl;
import java.util.ArrayList;
import java.util.List;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aps.common.core.utils.DateUtils;
import com.aps.job.domain.ApsWorkOrderJob;
import com.aps.job.domain.ApsWorkOrderJobLog;
import com.aps.job.mapper.ApsWorkOrderJobLogMapper;
import com.aps.job.mapper.ApsWorkOrderJobMapper;
import com.aps.job.param.ApsWorkOrderJobParam;
import org.springframework.beans.factory.annotation.Value;
import com.aps.job.service.IApsWorkOrderJobService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import com.aps.job.mapper.ApsWorkOrderJobMapper;
import com.aps.job.domain.ApsWorkOrderJob;
import com.aps.job.service.IApsWorkOrderJobService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * 工单同步Service业务层处理
@@ -28,6 +34,7 @@
 * @author zhl
 * @date 2025-04-17
 */
@Slf4j
@Service
public class ApsWorkOrderJobServiceImpl implements IApsWorkOrderJobService 
{
@@ -121,7 +128,9 @@
    }
    /**
     * 根据页码全量同步数据
     * */
    @Override
    public void batchInsertApsWorkOrderJob(ApsWorkOrderJobParam param) {
@@ -134,73 +143,189 @@
        }
    }
    @Transactional
    public boolean batchSaveByPager(ApsWorkOrderJobParam param) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        /*设置当前页面*/
        ApsWorkOrderJobLog log = new ApsWorkOrderJobLog();
        String requestString = JSONObject.toJSONString(param);
        HttpEntity<String> request = new HttpEntity<>(requestString, headers);
        ResponseEntity<String> response = restTemplate.postForEntity(getWorkOrderUrl, request, String.class);
        log.setRequestData(requestString);
        log.setPageNum(Long.valueOf(param.getPageIndex()));
        log.setPageCount(Long.valueOf(param.getPageSize()));
        log.setCreateTime(DateUtils.getNowDate());
        log.setBizType("work_order");
        jobLogMapper.insertApsWorkOrderJobLog(log);
        if (response.getStatusCode().is2xxSuccessful()) {
            JSONObject responseBodyJson = JSONObject.parseObject(response.getBody());
            if ("200".equals(responseBodyJson.getString("status"))) {
                JSONArray result = responseBodyJson.getJSONArray("data");
                if (result != null&& !result.isEmpty()) {
                   int ct= batchInsertApsWorkOrderJob(param, result);
                   if(ct>0){
                       log.setResult("ok save "+ct);
                       jobLogMapper.updateApsWorkOrderJobLog(log);
                   }else{
                       log.setResult("ok save 0");
                       jobLogMapper.updateApsWorkOrderJobLog(log);
                       return true;
                   }
                }else {
                    log.setResult("ok receive 0");
                    jobLogMapper.updateApsWorkOrderJobLog(log);
                    return true;
                }
            } else {
                log.setResponseData(response.getBody());
                log.setResult("fail");
                jobLogMapper.updateApsWorkOrderJobLog(log);
                return true;
            }
            return true;
        } else {
            log.setResponseData(response.getBody());
            log.setResult("fail");
            jobLogMapper.updateApsWorkOrderJobLog(log);
            return true;
    /**
     * 根据时间段每日更新,页面自动递增循环同步数据
     * */
    @Override
    public void SyncWorkOrderByTime(){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime today = LocalDateTime.now();
        LocalDate yesterday = LocalDate.now().minusDays(1);
        LocalDateTime yesterdayMidnight = yesterday.atStartOfDay();
        boolean continueFlag = true;
        Integer currentPage = 1;
        ApsWorkOrderJobParam param=new ApsWorkOrderJobParam();
        param.setPageIndex(currentPage);
        param.setDocState(Arrays.asList(0,1,2,4));
        param.setBeginDate(yesterdayMidnight.format(formatter));
        param.setEndDate(today.format(formatter));
        param.setPageSize(100);
        while (continueFlag){
            param.setPageIndex(currentPage);
            continueFlag= batchSaveByPager(param);
            currentPage++;
        }
    }
    @Transactional
    public int batchInsertApsWorkOrderJob(ApsWorkOrderJobParam param, JSONArray result) {
    @Override
    public boolean batchSaveByPager(ApsWorkOrderJobParam param) {
        String requestString = JSONObject.toJSONString(param);
        ApsWorkOrderJobLog jobLog = new ApsWorkOrderJobLog();
        jobLog.setRequestData(requestString);
        jobLog.setPageNum(Long.valueOf(param.getPageIndex()));
        jobLog.setPageCount(Long.valueOf(param.getPageSize()));
        jobLog.setCreateTime(DateUtils.getNowDate());
        jobLog.setBizType("work_order");
        jobLogMapper.insertApsWorkOrderJobLog(jobLog);
        log.info("work_order_request:{}", JSONObject.toJSONString(jobLog));
        return requestOnePage(jobLog);
    }
    /**
     * 请求一页数据进行保存
     * */
    @Transactional
    @Override
    public boolean requestOnePage(ApsWorkOrderJobLog jobLog) {
        // 定义常量,避免硬编码
        final String STATUS_KEY = "status";
        final String DATA_KEY = "data";
        final String SUCCESS_STATUS = "200";
        /*设置日志更新时间,Retry后与创建时间不同*/
        jobLog.setUpdateTime(DateUtils.getNowDate());
        try {
            // 设置请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<String> request = new HttpEntity<>(jobLog.getRequestData(), headers);
            // 发起HTTP请求
            ResponseEntity<String> response;
            try {
                response = restTemplate.postForEntity(getWorkOrderUrl, request, String.class);
            } catch (Exception e) {
                // 捕获网络异常或其他异常
                String msg = String.format("Error occurred while making HTTP request: {}", e.getMessage());
                log.error(msg);
                jobLog.setResponseData(msg);
                jobLog.setResult("fail:"+e.getMessage());
                jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                return false;
            }
            // 解析响应体
            String responseBody = response.getBody();
            // 检查响应状态码
            if (!response.getStatusCode().is2xxSuccessful()) {
                String msg = String.format("Non-2xx response received: {}", response.getStatusCode());
                log.warn(msg);
                jobLog.setResponseData(responseBody);
                jobLog.setResult("fail");
                jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                return false;
            }
            if (responseBody == null) {
                String responseBodyIsNull = "Response body is null";
                log.warn(responseBodyIsNull);
                jobLog.setResponseData(responseBodyIsNull);
                jobLog.setResult("fail");
                jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                return false;
            }
            JSONObject responseBodyJson = JSONObject.parseObject(responseBody);
            String status = responseBodyJson.getString(STATUS_KEY);
            if (!SUCCESS_STATUS.equals(status)) {
                log.warn("Unexpected status in response: {}", status);
                jobLog.setResponseData(responseBody);
                jobLog.setResult("fail");
                jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                return false;
            }
            // 处理数据
            JSONArray result = responseBodyJson.getJSONArray(DATA_KEY);
            if (result == null || result.isEmpty()) {
                jobLog.setResult("ok receive 0");
                jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                return false;
            }
            int ct = batchInsertApsWorkOrderJob(jobLog.getPageNum().intValue(), result);
            jobLog.setResult("ok save " + ct);
            jobLogMapper.updateApsWorkOrderJobLog(jobLog);
            return true;
        } catch (Exception e) {
            // 捕获所有异常并记录日志
            log.error("An unexpected error occurred: {}", e.getMessage(), e);
            jobLog.setResponseData(null);
            jobLog.setResult("fail");
            jobLogMapper.updateApsWorkOrderJobLog(jobLog);
            return false;
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public int batchInsertApsWorkOrderJob(Integer pageNum, JSONArray result) {
        // 边界条件检查
        if (result == null || result.isEmpty()) {
            log.warn("Result is empty or null, no data to process.");
            return 0;
        }
        if (pageNum == null) {
            log.warn("PageNum is null, setting default value to 1.");
            pageNum = 1;
        }
        List<ApsWorkOrderJob> jobs = new ArrayList<>();
        List<String> orderIds = new ArrayList<>();
        for (int i = 0; i < result.size(); i++) {
            ApsWorkOrderJob order = result.getObject(i, ApsWorkOrderJob.class);
            JSONObject jsonObject = result.getJSONObject(i);
            order.setOrderId(jsonObject.get("ID").toString());
            order.setCreateTime(DateUtils.getNowDate());
            order.setPageIndex(i);
            order.setPageNum(param.getPageIndex());
            order.setDelFlag("0");
            order.setProcessStatus("0");
            jobs.add(order);
            orderIds.add(order.getOrderId());
            try {
                JSONObject jsonObject = result.getJSONObject(i);
                // 校验必要字段是否存在
                if (!jsonObject.containsKey("ID")) {
                    log.error("Missing 'ID' field in result at index: {}", i);
                    continue; // 跳过无效数据
                }
                ApsWorkOrderJob order = result.getObject(i, ApsWorkOrderJob.class);
                order.setId(IdUtil.getSnowflakeNextId());
                order.setOrderId(jsonObject.getString("ID"));
                order.setCreateTime(DateUtils.getNowDate());
                order.setPageIndex(i);
                order.setPageNum(pageNum);
                order.setDelFlag("0");
                order.setProcessStatus("0");
                order.setOpStatus(jsonObject.getString("OpStatus"));
                order.setNextOpName(jsonObject.getString("NextOpName"));
                jobs.add(order);
                orderIds.add(order.getOrderId());
            } catch (Exception e) {
                log.error("Error processing result at index {}: {}", i, e.getMessage(), e);
                // 继续处理其他数据
            }
        }
        apsWorkOrderJobMapper.deleteWorkOrderJobByOrderIds(orderIds);
        return   apsWorkOrderJobMapper.batchInsertApsWorkOrderJob(jobs);
        if (!orderIds.isEmpty()) {
            // 删除旧数据
            apsWorkOrderJobMapper.deleteWorkOrderJobByOrderIds(orderIds);
        }
        // 批量插入新数据
        int affectedRows = apsWorkOrderJobMapper.batchInsertApsWorkOrderJob(jobs);
        if (affectedRows != jobs.size()) {
            log.warn("Not all records were inserted successfully. Expected: {}, Actual: {}", jobs.size(), affectedRows);
        }
        return affectedRows;
    }
    /**
     * 同步零件工单信息
@@ -211,4 +336,26 @@
        apsWorkOrderJobMapper.deleteAllPartPlan();
        apsWorkOrderJobMapper.batchInsertPartPlan();
    }
    /**
     * 同步钣金工单信息
     * */
    @Transactional
    @Override
    public void syncPlateOrderData() {
        apsWorkOrderJobMapper.deleteAllPlatePlan();
        apsWorkOrderJobMapper.batchInsertPlatePlan();
    }
    /**
     * 同步钣金工单信息
     * */
    @Transactional
    @Override
    public void syncGasPipingData() {
        apsWorkOrderJobMapper.deleteAllGasPiping();
        apsWorkOrderJobMapper.batchInsertGasPiping();
    }
}