package com.aps.job.service.impl; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson2.JSON; import com.aps.common.core.constant.SecurityConstants; import com.aps.common.core.utils.DateUtils; import com.aps.common.core.utils.StringUtils; import com.aps.common.core.utils.uuid.IdUtils; import com.aps.job.domain.ApsBomHeaderJob; import com.aps.job.domain.ApsBomLineJob; import com.aps.job.domain.ApsWorkOrderJobLog; import com.aps.job.mapper.ApsBomHeaderJobMapper; import com.aps.job.mapper.ApsBomLineJobMapper; import com.aps.job.mapper.ApsWorkOrderJobLogMapper; import com.aps.job.service.IApsBomHeaderJobService; import com.aps.system.api.RemoteCoreService; 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 org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.List; /** * BOM Header 数据管理Service业务层处理 * * @author hjy * @date 2025-05-08 */ @Service @Slf4j public class ApsBomHeaderJobServiceImpl implements IApsBomHeaderJobService { @Autowired private ApsBomHeaderJobMapper apsBomHeaderJobMapper; @Autowired private ApsBomLineJobMapper apsBomLineJobMapper; @Value("${u9.bomJobUrl}") private String getBomUrl; @Autowired private ApsWorkOrderJobLogMapper jobLogMapper; @Autowired private RestTemplate restTemplate; @Autowired private RemoteCoreService remoteCoreService; /** * 查询BOM Header 数据管理 * * @param id BOM Header 数据管理主键 * @return BOM Header 数据管理 */ @Override public ApsBomHeaderJob selectApsBomHeaderJobById(Long id) { return apsBomHeaderJobMapper.selectApsBomHeaderJobById(id); } /** * 查询BOM Header 数据管理列表 * * @param apsBomHeaderJob BOM Header 数据管理 * @return BOM Header 数据管理 */ @Override public List selectApsBomHeaderJobList(ApsBomHeaderJob apsBomHeaderJob) { return apsBomHeaderJobMapper.selectApsBomHeaderJobList(apsBomHeaderJob); } /** * 新增BOM Header 数据管理 * * @param apsBomHeaderJob BOM Header 数据管理 * @return 结果 */ @Override public int insertApsBomHeaderJob(ApsBomHeaderJob apsBomHeaderJob) { apsBomHeaderJob.setCreateTime(DateUtils.getNowDate()); return apsBomHeaderJobMapper.insertApsBomHeaderJob(apsBomHeaderJob); } /** * 修改BOM Header 数据管理 * * @param apsBomHeaderJob BOM Header 数据管理 * @return 结果 */ @Override public int updateApsBomHeaderJob(ApsBomHeaderJob apsBomHeaderJob) { apsBomHeaderJob.setUpdateTime(DateUtils.getNowDate()); return apsBomHeaderJobMapper.updateApsBomHeaderJob(apsBomHeaderJob); } /** * 批量删除BOM Header 数据管理 * * @param ids 需要删除的BOM Header 数据管理主键 * @return 结果 */ @Override public int deleteApsBomHeaderJobByIds(Long[] ids) { return apsBomHeaderJobMapper.deleteApsBomHeaderJobByIds(ids); } /** * 删除BOM Header 数据管理信息 * * @param id BOM Header 数据管理主键 * @return 结果 */ @Override public int deleteApsBomHeaderJobById(Long id) { return apsBomHeaderJobMapper.deleteApsBomHeaderJobById(id); } @Override public boolean syncBomData(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList) { JSONObject requestBody = new JSONObject(); ResponseEntity response = null; ApsWorkOrderJobLog jobLog = new ApsWorkOrderJobLog(); String batchNum = ""; try { // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 设置请求体 while (true) { batchNum = IdUtils.fastSimpleUUID(); jobLog = new ApsWorkOrderJobLog(); requestBody = new JSONObject(); requestBody.put("PageIndex", pageIndex); requestBody.put("PageSize", pageSize); if(!StringUtils.isEmpty(orgCode)){ requestBody.put("OrgCode", orgCode); } // 创建HttpEntity对象 HttpEntity request = new HttpEntity<>(requestBody.toJSONString(), headers); // 发送POST请求 response = restTemplate.postForEntity(getBomUrl, request, String.class); JSONObject responseBodyJson = JSONObject.parseObject(response.getBody()); if (response.getStatusCode().is2xxSuccessful() && "200".equals(responseBodyJson.getString("status"))) { JSONArray jsonArray = responseBodyJson.getJSONArray("data"); if (!jsonArray.isEmpty()) { List headerList = new ArrayList<>(); List lineList = new ArrayList<>(); for (Object o : jsonArray) { //o对象中的属性赋值给ApsBomHeaderJob对象 JSONObject bomHeader = (JSONObject) o; JSONArray bomLines = bomHeader.getJSONArray("BOMLines"); ApsBomHeaderJob insertBomHeader = new ApsBomHeaderJob(); insertBomHeader.setId(IdUtil.getSnowflakeNextId()); insertBomHeader.setBomHeaderId(bomHeader.getString("HID")); insertBomHeader.setItemCode(bomHeader.getString("HItemCode")); insertBomHeader.setItemName(bomHeader.getString("HItemName")); insertBomHeader.setStartDate(DateUtils.parseDate(bomHeader.getString("HEffectiveDate"))); insertBomHeader.setEndDate(DateUtils.parseDate(bomHeader.getString("HDisableDate"))); insertBomHeader.setOrgCode(bomHeader.getString("HOrgName").contains("沈阳")?"FORTUNE":bomHeader.getString("HOrgName").contains("南通")?"FORTUNA":bomHeader.getString("HOrgName").contains("北京")?"FORTUBE":bomHeader.getString("HOrgName")); insertBomHeader.setCreateBy(batchNum); headerList.add(insertBomHeader); for(Object line : bomLines){ JSONObject lineJson = (JSONObject) line; ApsBomLineJob bomLine = new ApsBomLineJob(); bomLine.setId(IdUtil.getSnowflakeNextId()); bomLine.setBomHeaderId(lineJson.getString("HID")); bomLine.setBomLineId(lineJson.getString("LID")); bomLine.setItemCode(lineJson.getString("LItemCode")); bomLine.setItemName(lineJson.getString("LItemName")); bomLine.setNum(lineJson.getBigDecimal("UsageQty")); bomLine.setStartDate(DateUtils.parseDate(lineJson.getString("LEffectiveDate"))); bomLine.setEndDate(DateUtils.parseDate(lineJson.getString("LDisableDate"))); bomLine.setOrgCode(lineJson.getString("LOrgName").contains("沈阳")?"FORTUNE":lineJson.getString("LOrgName").contains("南通")?"FORTUNA":lineJson.getString("LOrgName").contains("北京")?"FORTUBE":lineJson.getString("LOrgName")); bomLine.setCreateBy(batchNum); lineList.add(bomLine); } } List temp1 = new ArrayList<>(); for(int i=0;i=20){ apsBomHeaderJobMapper.insertApsBomHeaderJobBatch(temp1); temp1 = new ArrayList<>(); } } List temp2 = new ArrayList<>(); for(int j=0;j=20){ apsBomLineJobMapper.insertApsBomLineJobBatch(temp2); temp2 = new ArrayList<>(); } } jobLog.setRequestData(requestBody.toJSONString()); jobLog.setPageNum(Long.valueOf(pageIndex)); jobLog.setPageCount(Long.valueOf(pageSize)); jobLog.setCreateTime(DateUtils.getNowDate()); jobLog.setBizType("bom"); jobLog.setResult("header:"+headerList.size() + " line:"+lineList.size()); jobLog.setCreateBy(batchNum); jobLogMapper.insertApsWorkOrderJobLog(jobLog); log.info("BOM同步:"+ JSON.toJSONString(jobLog)); pageIndex++; }else{ break; } }else{ jobLog.setRequestData(requestBody.toJSONString()); jobLog.setResponseData(response.getBody()); jobLog.setPageNum(Long.valueOf(pageIndex)); jobLog.setPageCount(Long.valueOf(pageSize)); jobLog.setCreateTime(DateUtils.getNowDate()); jobLog.setBizType("bom"); jobLog.setResult("error"); jobLog.setCreateBy(batchNum); jobLogMapper.insertApsWorkOrderJobLog(jobLog); log.info("BOM同步:"+ JSON.toJSONString(jobLog)); break; } } }catch (Exception e){ e.printStackTrace(); jobLog.setRequestData(requestBody.toJSONString()); jobLog.setResponseData(response.getBody()); jobLog.setPageNum(Long.valueOf(pageIndex)); jobLog.setPageCount(Long.valueOf(pageSize)); jobLog.setCreateTime(DateUtils.getNowDate()); jobLog.setBizType("bom"); jobLog.setResult("error"); jobLog.setCreateBy(batchNum); jobLogMapper.insertApsWorkOrderJobLog(jobLog); log.info("BOM同步异常信息:"+ JSON.toJSONString(jobLog)); return false; } return true; } /** * 全量同步BOM数据定时任务 * @param pageIndex * @param pageSize * @param orgCode * @param itemCodeList * @return */ @Transactional(rollbackFor = Exception.class) @Override public boolean syncBomDataJob(Integer pageIndex, Integer pageSize, String orgCode, String itemCodeList){ try { log.info("全量同步BOM数据定时任务开始"); log.info(" DELETE FROM aps_bom_header_job"); apsBomHeaderJobMapper.deleteApsBomHeaderJob(); log.info(" DELETE FROM aps_bom_line_job"); apsBomLineJobMapper.deleteApsBomLineJob(); boolean res = syncBomData(pageIndex, pageSize, orgCode, itemCodeList); if(!res){ return false; } log.info("将BOM同步到Redis"); remoteCoreService.setBomDataToRedis(SecurityConstants.INNER); log.info("deleteApsBomHeader"); apsBomHeaderJobMapper.deleteApsBomHeader(); log.info("deleteApsBomLine"); apsBomLineJobMapper.deleteApsBomLine(); log.info("insertIntoApsBomHeader"); apsBomHeaderJobMapper.insertIntoApsBomHeader(); log.info("insertIntoApsBomLine"); apsBomLineJobMapper.insertIntoApsBomLine(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } return true; } }