package com.aps.job.service.impl; 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.common.core.utils.StringUtils; import com.aps.job.domain.ApsWorkOrderJob; import com.aps.job.domain.ApsWorkOrderJobLog; import com.aps.job.domain.ApsWorkOrderProcess; import com.aps.job.mapper.ApsWorkOrderJobLogMapper; import com.aps.job.mapper.ApsWorkOrderJobMapper; import com.aps.job.mapper.ApsWorkOrderProcessMapper; import com.aps.job.service.IApsWorkOrderJobLogService; import com.aps.job.service.IApsWorkOrderProcessService; import com.github.pagehelper.PageHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 工单工序Service业务层处理 * * @author hjy * @date 2025-04-17 */ @Service public class ApsWorkOrderProcessServiceImpl implements IApsWorkOrderProcessService { @Value("${u9.workOrderProcessUrl}") private String u9WorkOrderProcessUrl; private final Logger logger = LoggerFactory.getLogger(ApsWorkOrderProcessServiceImpl.class); @Autowired private RestTemplate restTemplate; @Autowired private ApsWorkOrderProcessMapper apsWorkOrderProcessMapper; @Autowired private ApsWorkOrderJobMapper apsWorkOrderJobMapper; @Autowired private IApsWorkOrderJobLogService apsWorkOrderJobLogService; @Autowired private ApsWorkOrderJobLogMapper apsWorkOrderJobLogMapper; /** * 查询工单工序 * * @param id 工单工序主键 * @return 工单工序 */ @Override public ApsWorkOrderProcess selectApsWorkOrderProcessById(Long id) { return apsWorkOrderProcessMapper.selectApsWorkOrderProcessById(id); } /** * 查询工单工序列表 * * @param apsWorkOrderProcess 工单工序 * @return 工单工序 */ @Override public List selectApsWorkOrderProcessList(ApsWorkOrderProcess apsWorkOrderProcess) { return apsWorkOrderProcessMapper.selectApsWorkOrderProcessList(apsWorkOrderProcess); } /** * 新增工单工序 * * @param apsWorkOrderProcess 工单工序 * @return 结果 */ @Override public int insertApsWorkOrderProcess(ApsWorkOrderProcess apsWorkOrderProcess) { return apsWorkOrderProcessMapper.insertApsWorkOrderProcess(apsWorkOrderProcess); } /** * 修改工单工序 * * @param apsWorkOrderProcess 工单工序 * @return 结果 */ @Override public int updateApsWorkOrderProcess(ApsWorkOrderProcess apsWorkOrderProcess) { return apsWorkOrderProcessMapper.updateApsWorkOrderProcess(apsWorkOrderProcess); } /** * 批量删除工单工序 * * @param ids 需要删除的工单工序主键 * @return 结果 */ @Override public int deleteApsWorkOrderProcessByIds(Long[] ids) { return apsWorkOrderProcessMapper.deleteApsWorkOrderProcessByIds(ids); } /** * 删除工单工序信息 * * @param id 工单工序主键 * @return 结果 */ @Override public int deleteApsWorkOrderProcessById(Long id) { return apsWorkOrderProcessMapper.deleteApsWorkOrderProcessById(id); } @Override public void getWorkOrderProcessFromU9(List docNos) throws Exception { List noProcessDocNos = new ArrayList<>(docNos); List haveProcessDocNos = new ArrayList<>(); ApsWorkOrderJobLog apsWorkOrderJobLog = new ApsWorkOrderJobLog(); // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 设置请求体 int pageSize = 1000; int pageIndex = 1; while (true){ JSONObject requestBody = new JSONObject(); requestBody.put("DocList", docNos); requestBody.put("PageIndex", pageIndex); requestBody.put("PageSize", pageSize); // 创建HttpEntity对象 HttpEntity request = new HttpEntity<>(requestBody.toJSONString(), headers); // 发送POST请求 ResponseEntity response = restTemplate.postForEntity(u9WorkOrderProcessUrl, request, String.class); String responseBody = response.getBody(); JSONObject responseBodyJson = JSONObject.parseObject(responseBody); apsWorkOrderJobLog.setRequestData(requestBody.toJSONString()); apsWorkOrderJobLog.setCreateTime(DateUtils.getNowDate()); apsWorkOrderJobLog.setBizType("work_order_process"); apsWorkOrderJobLog.setResult("SUCCESS"); apsWorkOrderJobLogService.insertApsWorkOrderJobLog(apsWorkOrderJobLog); if (response.getStatusCode().is2xxSuccessful()) { if(!StringUtils.isEmpty(responseBody)){ if("200".equals(responseBodyJson.getString("status"))){ JSONArray jsonArray = responseBodyJson.getJSONArray("data"); if (!jsonArray.isEmpty()) { List addList = new ArrayList<>(); List updateList = new ArrayList<>(); String nowDocNo = null; for (int i = 0,size=jsonArray.size();i params = new HashMap<>(); // params.put("docNo", process.getString("DocNo")); // params.put("opNum", process.getString("OpNum")); // params.put("opId", process.getString("OpID")); // Long existsId = apsWorkOrderProcessMapper.existsByDocNoOpNumOpId(params); ApsWorkOrderProcess apsWorkOrderProcess = new ApsWorkOrderProcess(); apsWorkOrderProcess.setItemCode(process.getString("ItemCode")); apsWorkOrderProcess.setDocNo(process.getString("DocNo")); apsWorkOrderProcess.setOpNum(process.getString("OpNum")); apsWorkOrderProcess.setOpId(process.getString("OpID")); apsWorkOrderProcess.setProcessName(process.getString("StdOp")); apsWorkOrderProcess.setStandardTime(process.getBigDecimal("StandardTime")); apsWorkOrderProcess.setPalnStartDate(process.getDate("PlanStartDate")); apsWorkOrderProcess.setPlanCompleteDate(process.getDate("PlanCompleteDate")); apsWorkOrderProcess.setProcessQty(process.getBigDecimal("ProcessQty")); apsWorkOrderProcess.setScrapQty(process.getBigDecimal("ScrapQty")); apsWorkOrderProcess.setOpStatus(process.getString("OpStatus")); apsWorkOrderProcess.setOrg(process.getString("Org")); apsWorkOrderProcess.setOrgCode(process.getString("OrgCode")); apsWorkOrderProcess.setWorkCenter(process.getString("WorkCenter")); // if (existsId != null) { // apsWorkOrderProcess.setId(existsId); // apsWorkOrderProcess.setUpdateBy("task"); // apsWorkOrderProcess.setUpdateTime(DateUtils.getNowDate()); // updateList.add(apsWorkOrderProcess); // } else { apsWorkOrderProcess.setId(IdUtil.getSnowflakeNextId()); apsWorkOrderProcess.setCreateBy("task"); apsWorkOrderProcess.setCreateTime(DateUtils.getNowDate()); addList.add(apsWorkOrderProcess); // } if(!nowDocNo.equals(process.getString("DocNo")) || i==size-1){ //更新工单同步工序状态 noProcessDocNos.remove(nowDocNo); haveProcessDocNos.add(nowDocNo); nowDocNo = process.getString("DocNo"); } } if(!updateList.isEmpty()){ apsWorkOrderProcessMapper.updateApsWorkOrderProcessBatch(updateList); apsWorkOrderJobLog.setResult("ok update "+updateList.size()); apsWorkOrderJobLog.setUpdateTime(DateUtils.getNowDate()); apsWorkOrderJobLogService.updateApsWorkOrderJobLog(apsWorkOrderJobLog); logger.info("【UPDATE】获取并更新U9工序成功!【工单号:{}】", docNos); } if(!addList.isEmpty()){ apsWorkOrderProcessMapper.insertApsWorkOrderProcessBatch(addList); apsWorkOrderJobLog.setResult("ok insert "+updateList.size()); apsWorkOrderJobLog.setUpdateTime(DateUtils.getNowDate()); apsWorkOrderJobLogService.updateApsWorkOrderJobLog(apsWorkOrderJobLog); logger.info("【INSERT】获取并插入U9工序成功!【工单号:{}】", docNos); } } if(jsonArray.size()<1000){ break; } pageIndex++; }else{ apsWorkOrderJobLog.setResponseData(response.getBody()); apsWorkOrderJobLog.setResult("fail"); apsWorkOrderJobLog.setUpdateTime(DateUtils.getNowDate()); apsWorkOrderJobLogService.updateApsWorkOrderJobLog(apsWorkOrderJobLog); logger.error("【ERROR】查询U9工序失败!【工单号:{}, 错误码:{},错误信息:{}】", docNos, responseBodyJson.getString("status"), responseBodyJson.getString("message")); } }else{ logger.warn("【WARNING】未查询到U9工序!【工单号:{}】", docNos); } } else { apsWorkOrderJobLog.setResponseData(response.getBody()); apsWorkOrderJobLog.setResult("fail"); apsWorkOrderJobLog.setUpdateTime(DateUtils.getNowDate()); apsWorkOrderJobLogService.updateApsWorkOrderJobLog(apsWorkOrderJobLog); throw new Exception("【ERROR】查询U9工序失败!【工单号:{"+ docNos +"}, 错误码:{"+ responseBodyJson.getString("status") +"},错误信息:{"+ responseBodyJson.getString("message") +"}】"); } } if(!haveProcessDocNos.isEmpty()){ Map param = new HashMap<>(); param.put("status", "1"); param.put("docNos", haveProcessDocNos); apsWorkOrderJobMapper.updateApsWorkOrderJobPrccessStatus(param); } if(!noProcessDocNos.isEmpty()){ Map param = new HashMap<>(); param.put("status", "2"); param.put("docNos", noProcessDocNos); apsWorkOrderJobMapper.updateApsWorkOrderJobPrccessStatus(param); apsWorkOrderJobLog.setRequestData(noProcessDocNos.toString()); apsWorkOrderJobLog.setResponseData(""); apsWorkOrderJobLog.setResult("empty"); apsWorkOrderJobLog.setUpdateTime(DateUtils.getNowDate()); apsWorkOrderJobLogService.updateApsWorkOrderJobLog(apsWorkOrderJobLog); } } @Override public void syncWorkOrderProcessData(String status, Integer pageSize) { try{ Integer pageNum = 1; //分页查询工单 ApsWorkOrderJob apsWorkOrderJob = new ApsWorkOrderJob(); if("".equals(status)){ status = "0"; } apsWorkOrderJob.setProcessStatus(status); // 补查之前没有查到工序的工单 if("2".equals(status)){ String lastDocNos = ""; while (true){ PageHelper.startPage(1, pageSize); List pageList = apsWorkOrderJobMapper.selectApsWorkOrderJobList(apsWorkOrderJob); PageHelper.clearPage(); if(!pageList.isEmpty()){ long startTime = System.currentTimeMillis(); List docNos = new ArrayList<>(); for (ApsWorkOrderJob apsWorkOrderJob1 : pageList){ docNos.add(apsWorkOrderJob1.getDocNo()); } getWorkOrderProcessFromU9(docNos); if(String.join(",", docNos).equals(lastDocNos)){ break; } lastDocNos = String.join(",", docNos); } pageNum++; } }else{ while (true){ PageHelper.startPage(1, pageSize); List pageList = apsWorkOrderJobMapper.selectApsWorkOrderJobList(apsWorkOrderJob); PageHelper.clearPage(); if(!pageList.isEmpty()){ long startTime = System.currentTimeMillis(); List docNos = new ArrayList<>(); for (ApsWorkOrderJob apsWorkOrderJob1 : pageList){ if(apsWorkOrderJob1.getDocNo()!=null){ docNos.add(apsWorkOrderJob1.getDocNo()); } } if(!docNos.isEmpty()){ getWorkOrderProcessFromU9(docNos); }else{ break; } }else{ break; } pageNum++; } } }catch (Exception e){ e.printStackTrace(); logger.error(e.getMessage()); } } @Override public void insertIntoApsProcessRoute() { apsWorkOrderProcessMapper.insertIntoApsProcessRoute(); } @Override public void deleteApsProcessRoute() { apsWorkOrderProcessMapper.deleteApsProcessRoute(); } @Override public boolean retryRequestWorkOrderProcessByLogId(Long id) { try { ApsWorkOrderJobLog apsWorkOrderJobLog = apsWorkOrderJobLogMapper.selectApsWorkOrderJobLogById(id); JSONObject requestBodyJson = JSONObject.parseObject(apsWorkOrderJobLog.getRequestData()); JSONArray docListArray = requestBodyJson.getJSONArray("DocList"); List docNos = new ArrayList<>(); for (int i = 0; i < docListArray.size(); i++) { if(docListArray.getString(i)!=null){ docNos.add(docListArray.getString(i)); } } if(!docNos.isEmpty()){ getWorkOrderProcessFromU9(docNos); } }catch (Exception e){ e.printStackTrace(); return false; } return true; } @Override public void syncProcessRouteData() { apsWorkOrderProcessMapper.deleteApsProcessRoute(); apsWorkOrderProcessMapper.insertIntoApsProcessRoute(); } @Override public void deleteApsWorkOrderProcess() { apsWorkOrderProcessMapper.deleteApsWorkOrderProcess(); } }