package com.aps.job.service.impl; 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; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aps.common.core.utils.DateUtils; import com.aps.job.domain.ApsWorkOrderJobLog; import com.aps.job.mapper.ApsWorkOrderJobLogMapper; import com.aps.job.param.ApsWorkOrderJobParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Autowired; 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; /** * 工单同步Service业务层处理 * * @author zhl * @date 2025-04-17 */ @Slf4j @Service public class ApsWorkOrderJobServiceImpl implements IApsWorkOrderJobService { @Autowired private ApsWorkOrderJobMapper apsWorkOrderJobMapper; /** * 获取订单接口 * */ @Value("${u9.workOrderJobUrl}") private String getWorkOrderUrl; @Autowired private RestTemplate restTemplate; @Autowired private ApsWorkOrderJobLogMapper jobLogMapper; /** * 查询工单同步 * * @param id 工单同步主键 * @return 工单同步 */ @Override public ApsWorkOrderJob selectApsWorkOrderJobById(Long id) { return apsWorkOrderJobMapper.selectApsWorkOrderJobById(id); } /** * 查询工单同步列表 * * @param apsWorkOrderJob 工单同步 * @return 工单同步 */ @Override public List selectApsWorkOrderJobList(ApsWorkOrderJob apsWorkOrderJob) { return apsWorkOrderJobMapper.selectApsWorkOrderJobList(apsWorkOrderJob); } /** * 新增工单同步 * * @param apsWorkOrderJob 工单同步 * @return 结果 */ @Override public int insertApsWorkOrderJob(ApsWorkOrderJob apsWorkOrderJob) { apsWorkOrderJob.setCreateTime(DateUtils.getNowDate()); return apsWorkOrderJobMapper.insertApsWorkOrderJob(apsWorkOrderJob); } /** * 修改工单同步 * * @param apsWorkOrderJob 工单同步 * @return 结果 */ @Override public int updateApsWorkOrderJob(ApsWorkOrderJob apsWorkOrderJob) { apsWorkOrderJob.setUpdateTime(DateUtils.getNowDate()); return apsWorkOrderJobMapper.updateApsWorkOrderJob(apsWorkOrderJob); } /** * 批量删除工单同步 * * @param ids 需要删除的工单同步主键 * @return 结果 */ @Override public int deleteApsWorkOrderJobByIds(Long[] ids) { return apsWorkOrderJobMapper.deleteApsWorkOrderJobByIds(ids); } /** * 删除工单同步信息 * * @param id 工单同步主键 * @return 结果 */ @Override public int deleteApsWorkOrderJobById(Long id) { return apsWorkOrderJobMapper.deleteApsWorkOrderJobById(id); } /** * 根据页码全量同步数据 * */ @Override public void batchInsertApsWorkOrderJob(ApsWorkOrderJobParam param) { /*根据参数中当前页面 和 要目标页面 进行循环*/ for (int idx=param.getPageIndex(); idx<=param.getToPageIndex(); idx++){ param.setPageIndex(idx); if (!batchSaveByPager(param)) { return; } } } /** * 根据时间段每日更新,页面自动递增循环同步数据 * */ @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(1000); while (continueFlag){ param.setPageIndex(currentPage); continueFlag= batchSaveByPager(param); currentPage++; } } @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 request = new HttpEntity<>(requestString, headers); ResponseEntity response = restTemplate.postForEntity(getWorkOrderUrl, request, String.class); 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()); jobLog.setResult("fail"); jobLogMapper.updateApsWorkOrderJobLog(jobLog); return false; } } else { jobLog.setResponseData(response.getBody()); jobLog.setResult("fail"); jobLogMapper.updateApsWorkOrderJobLog(jobLog); log.info(JSONObject.toJSONString(jobLog)); return false; } } @Transactional public int batchInsertApsWorkOrderJob(ApsWorkOrderJobParam param, JSONArray result) { List jobs = new ArrayList<>(); List 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()); } apsWorkOrderJobMapper.deleteWorkOrderJobByOrderIds(orderIds); return apsWorkOrderJobMapper.batchInsertApsWorkOrderJob(jobs); } /** * 同步零件工单信息 * */ @Transactional @Override public void syncPartOrderData() { apsWorkOrderJobMapper.deleteAllPartPlan(); apsWorkOrderJobMapper.batchInsertPartPlan(); } }