zhanghl
2025-04-21 41dc7239db3cd2021db7d44f9872df9573d2f255
工单同步功能:增加根据日志重试接口,日志查看接口
已修改6个文件
已添加1个文件
280 ■■■■ 文件已修改
aps-modules/aps-job/src/main/java/com/aps/job/controller/ApsWorkOrderJobController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/java/com/aps/job/controller/ApsWorkOrderJobLogController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/java/com/aps/job/service/IApsWorkOrderJobLogService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/java/com/aps/job/service/IApsWorkOrderJobService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobLogServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java 172 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobLogMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
aps-modules/aps-job/src/main/java/com/aps/job/controller/ApsWorkOrderJobController.java
@@ -39,7 +39,7 @@
    /**
     * æŸ¥è¯¢å·¥å•同步列表
     */
    @RequiresPermissions("ApsWorkOrderJob:ApsWorkOrderJob:list")
    @RequiresPermissions("apsWorkOrderJob:list")
    @GetMapping("/list")
    public TableDataInfo list(ApsWorkOrderJob apsWorkOrderJob)
    {
@@ -51,7 +51,7 @@
    /**
     * å¯¼å‡ºå·¥å•同步列表
     */
    @RequiresPermissions("ApsWorkOrderJob:ApsWorkOrderJob:export")
    @RequiresPermissions("apsWorkOrderJob:export")
    @Log(title = "工单同步", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ApsWorkOrderJob apsWorkOrderJob)
@@ -64,7 +64,7 @@
    /**
     * èŽ·å–å·¥å•åŒæ­¥è¯¦ç»†ä¿¡æ¯
     */
    @RequiresPermissions("ApsWorkOrderJob:ApsWorkOrderJob:query")
    @RequiresPermissions("apsWorkOrderJob:query")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
aps-modules/aps-job/src/main/java/com/aps/job/controller/ApsWorkOrderJobLogController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.aps.job.controller;
import com.aps.common.core.utils.poi.ExcelUtil;
import com.aps.common.core.web.controller.BaseController;
import com.aps.common.core.web.domain.AjaxResult;
import com.aps.common.core.web.page.TableDataInfo;
import com.aps.common.log.annotation.Log;
import com.aps.common.log.enums.BusinessType;
import com.aps.common.security.annotation.RequiresPermissions;
import com.aps.job.domain.ApsWorkOrderJobLog;
import com.aps.job.service.IApsWorkOrderJobLogService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * å·¥å•同步日志Controller
 *
 * @author zhl
 * @date 2025-04-17
 */
@RestController
@RequestMapping("/apsWorkOrderJobLog")
public class ApsWorkOrderJobLogController extends BaseController {
    @Autowired
    private IApsWorkOrderJobLogService apsWorkOrderJobLogService;
    /**
     * æŸ¥è¯¢å·¥å•同步日志列表
     */
//    @RequiresPermissions("apsWorkOrderJobLog:list")
    @GetMapping("/list")
    public TableDataInfo list(ApsWorkOrderJobLog apsWorkOrderJobLog) {
//          startPage();
        List<ApsWorkOrderJobLog> list = apsWorkOrderJobLogService.selectApsWorkOrderJobLogList(apsWorkOrderJobLog);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºå·¥å•同步日志列表
     */
    @RequiresPermissions("apsWorkOrderJobLog:export")
    @Log(title = "工单同步日志", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ApsWorkOrderJobLog apsWorkOrderJobLog) {
        List<ApsWorkOrderJobLog> list = apsWorkOrderJobLogService.selectApsWorkOrderJobLogList(apsWorkOrderJobLog);
        ExcelUtil<ApsWorkOrderJobLog> util = new ExcelUtil<ApsWorkOrderJobLog>(ApsWorkOrderJobLog.class);
        util.exportExcel(response, list, "工单同步日志数据");
    }
    /**
     * èŽ·å–å·¥å•åŒæ­¥æ—¥å¿—è¯¦ç»†ä¿¡æ¯
     */
    @RequiresPermissions("apsWorkOrderJobLog:query")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        return success(apsWorkOrderJobLogService.selectApsWorkOrderJobLogById(id));
    }
    /**
     * ä¿®æ”¹å·¥å•同步日志
     */
    @RequiresPermissions("apsWorkOrderJobLog:edit")
    @Log(title = "工单同步日志", businessType = BusinessType.UPDATE)
    @PostMapping("/sync")
    public AjaxResult edit(@RequestBody ApsWorkOrderJobLog apsWorkOrderJobLog) {
        apsWorkOrderJobLogService.retryRequestWorkOrderByLogId(apsWorkOrderJobLog.getId());
        return toAjax(true);
    }
}
aps-modules/aps-job/src/main/java/com/aps/job/service/IApsWorkOrderJobLogService.java
@@ -58,4 +58,6 @@
     * @return ç»“æžœ
     */
    public int deleteApsWorkOrderJobLogById(Long id);
    boolean retryRequestWorkOrderByLogId(Long id);
}
aps-modules/aps-job/src/main/java/com/aps/job/service/IApsWorkOrderJobService.java
@@ -2,6 +2,7 @@
import java.util.List;
import com.aps.job.domain.ApsWorkOrderJob;
import com.aps.job.domain.ApsWorkOrderJobLog;
import com.aps.job.param.ApsWorkOrderJobParam;
import org.springframework.transaction.annotation.Transactional;
@@ -70,5 +71,8 @@
    boolean batchSaveByPager(ApsWorkOrderJobParam param);
    @Transactional
    boolean requestOnePage( ApsWorkOrderJobLog jobLog);
    @Transactional
    void syncPartOrderData();
}
aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobLogServiceImpl.java
@@ -1,6 +1,8 @@
package com.aps.job.service.impl;
import java.util.List;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.aps.job.mapper.ApsWorkOrderJobLogMapper;
@@ -18,6 +20,9 @@
{
    @Autowired
    private ApsWorkOrderJobLogMapper apsWorkOrderJobLogMapper;
    @Resource
    private ApsWorkOrderJobServiceImpl apsWorkOrderJobService;
    /**
     * æŸ¥è¯¢å·¥å•同步日志
@@ -90,4 +95,9 @@
    {
        return apsWorkOrderJobLogMapper.deleteApsWorkOrderJobLogById(id);
    }
    @Override
    public boolean retryRequestWorkOrderByLogId(Long id){
        return apsWorkOrderJobService.requestOnePage(apsWorkOrderJobLogMapper.selectApsWorkOrderJobLogById(id));
    }
}
aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java
@@ -169,68 +169,159 @@
    @Transactional
    @Override
    public boolean batchSaveByPager(ApsWorkOrderJobParam param) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        /*设置当前页面*/
        ApsWorkOrderJobLog jobLog = new ApsWorkOrderJobLog();
        String requestString = JSONObject.toJSONString(param);
        HttpEntity<String> request = new HttpEntity<>(requestString, headers);
        ResponseEntity<String> response = restTemplate.postForEntity(getWorkOrderUrl, request, String.class);
        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);
        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);
                    jobLog.setResult("ok save "+ct);
                    jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                    return true;
                }else {
                    jobLog.setResult("ok receive 0");
                    jobLogMapper.updateApsWorkOrderJobLog(jobLog);
                    return false;
                }
            } else {
                jobLog.setResponseData(response.getBody());
        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;
            }
        } else {
            jobLog.setResponseData(response.getBody());
            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);
            log.info(JSONObject.toJSONString(jobLog));
            return false;
        }
    }
    @Transactional
    public int batchInsertApsWorkOrderJob(ApsWorkOrderJobParam param, JSONArray result) {
    @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 = new ApsWorkOrderJob();
                order.setOrderId(jsonObject.getString("ID"));
                order.setCreateTime(DateUtils.getNowDate());
                order.setPageIndex(i);
                order.setPageNum(pageNum);
                order.setDelFlag("0");
                order.setProcessStatus("0");
                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;
    }
    /**
     * åŒæ­¥é›¶ä»¶å·¥å•信息
@@ -241,4 +332,5 @@
        apsWorkOrderJobMapper.deleteAllPartPlan();
        apsWorkOrderJobMapper.batchInsertPartPlan();
    }
}
aps-modules/aps-job/src/main/resources/mapper/job/ApsWorkOrderJobLogMapper.xml
@@ -14,6 +14,7 @@
        <result property="requestData"    column="request_data"    />
        <result property="createTime"    column="create_time"    />
        <result property="updateTime"    column="update_time"    />
        <result property="bizType"    column="biz_type"    />
    </resultMap>
    <sql id="selectApsWorkOrderJobLogVo">
@@ -24,15 +25,17 @@
    <select id="selectApsWorkOrderJobLogList" parameterType="ApsWorkOrderJobLog" resultMap="ApsWorkOrderJobLogResult">
        <include refid="selectApsWorkOrderJobLogVo"/>
        <where>
        <where>
            <if test="pageNum != null "> and page_num = #{pageNum}</if>
            <if test="pageCount != null "> and page_count = #{pageCount}</if>
            <if test="responseData != null  and responseData != ''"> and response_data = #{responseData}</if>
            <if test="result != null  and result != ''"> and result = #{result}</if>
            <if test="orderId != null  and orderId != ''"> and order_id = #{orderId}</if>
            <if test="requestData != null  and requestData != ''"> and request_data = #{requestData}</if>
            <if test="responseData != null  and responseData != ''"> and response_data like '%' || #{responseData}|| '%'</if>
            <if test="result != null  and result != ''"> and result  like '%' || #{result} ||'%' </if>
            <if test="requestData != null  and requestData != ''"> and request_data like '%' || #{requestData} || '%'</if>
            <if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''"> and create_time between #{params.beginCreateTime} and #{params.endCreateTime}</if>
            <if test="bizType != null  and bizType != ''"> and biz_type = #{bizType}</if>
             and  (  biz_type is not null and biz_type !='' )
        </where>
        order by id desc
    </select>
    
    <select id="selectApsWorkOrderJobLogById" parameterType="Long" resultMap="ApsWorkOrderJobLogResult">