package com.vincent.rsf.server.manager.schedules; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.api.config.RemotesInfoProperties; import com.vincent.rsf.server.api.entity.CommonResponse; import com.vincent.rsf.server.api.entity.constant.RcsConstant; import com.vincent.rsf.server.manager.entity.BasStation; import com.vincent.rsf.server.manager.service.impl.BasStationServiceImpl; import com.vincent.rsf.server.system.constant.GlobalConfigCode; import com.vincent.rsf.server.system.entity.Config; import com.vincent.rsf.server.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; /** * @author Munch D. Luffy * @date 2026/03/23 * 自动同步至MES */ @Slf4j @Component public class SynchronizationToMESSchedules { @Autowired private ConfigService configService; @Autowired private BasStationServiceImpl basStationService; @Autowired private RestTemplate restTemplate; @Autowired private RemotesInfoProperties.WmsOpenApi wmsOpenApi; /** * @author Munch D. Luffy * @date 2026/01/15 * @description: 缓存区域自动生成移库任务 * @version 1.0 */ @Scheduled(cron = "0 0/01 * * * ? ") @Transactional(rollbackFor = Exception.class) public void siteSynchronizationToMES() throws Exception { Config config = configService.getOne(new LambdaQueryWrapper().eq(Config::getFlag, GlobalConfigCode.AUTO_SITE_SYNCHRONIZATION_TO_MES)); if (Cools.isEmpty(config) || !Boolean.parseBoolean(config.getVal())) { return; } String autoSiteSynchronizationToMesValue = configService.getVal(GlobalConfigCode.AUTO_SITE_SYNCHRONIZATION_TO_MES_VALUE, String.class); if (Cools.isEmpty(autoSiteSynchronizationToMesValue)) { return; } Integer autoValue = Integer.parseInt(autoSiteSynchronizationToMesValue); if (autoValue < 0) { List basStationList = basStationService.list(); syncStationsToMes(basStationList); } else if (autoValue > 0) { List basStationList = basStationService.list(); syncStationsToMes(basStationList); autoValue = autoValue - 1; configService.setVal(GlobalConfigCode.AUTO_SITE_SYNCHRONIZATION_TO_MES_VALUE, String.valueOf(autoValue)); } else { configService.setVal(GlobalConfigCode.AUTO_SITE_SYNCHRONIZATION_TO_MES, false); } } private void syncStationsToMes(List basStationList) { if (Cools.isEmpty(basStationList)) { log.info("站点同步至MES跳过:站点列表为空"); return; } if (Cools.isEmpty(wmsOpenApi) || Cools.isEmpty(wmsOpenApi.getHost()) || Cools.isEmpty(wmsOpenApi.getPort())) { throw new CoolException("open-api配置缺失,无法同步站点信息到MES"); } List> params = new ArrayList<>(); for (BasStation basStation : basStationList) { if (Cools.isEmpty(basStation) || Cools.isEmpty(basStation.getStationName())) { continue; } Map item = new HashMap<>(); item.put("ConnPortCode", basStation.getStationName()); item.put("ConnPortName", Cools.isEmpty(basStation.getStationId()) ? basStation.getStationName() : basStation.getStationId()); item.put("WorkshopCode", "YZ"); item.put("WorkshopName", "银座车间"); item.put("ProductionLineCode", "YZ"); item.put("ProductionLineName", "银座仓库"); item.put("CreatedBy", "WMSSystem"); item.put("IsValid", Objects.equals(basStation.getStatus(), 1)); params.add(item); } if (params.isEmpty()) { log.info("站点同步至MES跳过:无可同步站点数据"); return; } String url = wmsOpenApi.getHost() + ":" + wmsOpenApi.getPort() + RcsConstant.SITE_SYNCHRONIZATION_TO_MES; HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity>> httpEntity = new HttpEntity<>(params, headers); log.info("站点同步至MES开始,请求地址:{},请求参数条数:{}", url, params.size()); ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, CommonResponse.class); CommonResponse body = response.getBody(); log.info("站点同步至MES返回结果:{}", JSONObject.toJSONString(body)); if (Cools.isEmpty(body)) { throw new CoolException("站点同步至MES失败:返回结果为空"); } if (!Objects.equals(body.getCode(), 200)) { throw new CoolException("站点同步至MES失败:" + body.getMsg()); } } }