package com.zy.core.plugin.store; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.core.common.Cools; import com.zy.asrs.domain.param.CreateInTaskParam; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.WrkMastService; import com.zy.common.model.StartupDto; import com.zy.common.service.CommonService; import com.zy.common.utils.RedisUtil; import com.zy.core.News; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.RedisKeyType; import com.zy.core.enums.SlaveType; import com.zy.core.model.StationObjModel; import com.zy.core.model.protocol.StationProtocol; import com.zy.core.thread.StationThread; import com.zy.core.utils.StationOperateProcessUtils; import com.zy.core.utils.WmsOperateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class StoreInTaskGenerationService { @Autowired private BasDevpService basDevpService; @Autowired private WrkMastService wrkMastService; @Autowired private StationOperateProcessUtils stationOperateProcessUtils; @Autowired private RedisUtil redisUtil; @Autowired private WmsOperateUtils wmsOperateUtils; @Autowired private CommonService commonService; public void generate(StoreInTaskPolicy policy) { try { if (!policy.isEnabled()) { return; } Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key); if (systemConfigMapObj == null) { return; } HashMap systemConfigMap = (HashMap) systemConfigMapObj; int conveyorStationTaskLimit = 30; String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit"); if (conveyorStationTaskLimitStr != null) { conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr); } int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount(); if (currentStationTaskCount > conveyorStationTaskLimit) { News.error("输送站点任务已达到上限,上限值:{},站点任务数:{}", conveyorStationTaskLimit, currentStationTaskCount); return; } List basDevps = basDevpService.list(new QueryWrapper<>()); for (BasDevp basDevp : basDevps) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo()); if (stationThread == null) { continue; } Map stationMap = stationThread.getStatusMap(); List barcodeStations = policy.getBarcodeStations(basDevp); for (StationObjModel stationObjModel : barcodeStations) { Integer stationId = stationObjModel.getStationId(); if (!stationMap.containsKey(stationId)) { continue; } StationProtocol stationProtocol = stationMap.get(stationId); if (stationProtocol == null) { continue; } StoreInTaskContext context = new StoreInTaskContext(basDevp, stationThread, stationObjModel, stationProtocol); if (!policy.matchCandidate(context)) { continue; } if (!policy.beforeApply(context)) { continue; } List wrkMasts = wrkMastService.list(new QueryWrapper() .eq("barcode", stationProtocol.getBarcode())); if (!wrkMasts.isEmpty()) { continue; } String generateLockKey = policy.getGenerateLockKey(context); Object lock = redisUtil.get(generateLockKey); if (lock != null) { continue; } policy.onRequestPermitGranted(context); InTaskApplyRequest request = policy.buildApplyRequest(context); AsyncInTaskResult result = wmsOperateUtils.queryAsyncInTaskResponse(request); if (result != null) { handleApplyResult(policy, context, request, result); continue; } if (wmsOperateUtils.isAsyncRequestInProgress(request)) { continue; } News.info("发起异步WMS入库请求,barcode={},stationId={}", request.getBarcode(), request.getSourceStaNo()); wmsOperateUtils.applyInTaskAsync(request); redisUtil.set(generateLockKey, "lock", policy.getSubmitLockSeconds(context)); policy.onApplySubmitted(context); } } } catch (Exception e) { News.error("生成入库任务异常,policy={}", policy.getPolicyName(), e); } } private void handleApplyResult(StoreInTaskPolicy policy, StoreInTaskContext context, InTaskApplyRequest request, AsyncInTaskResult result) { if (result.isSuccess()) { handleApplySuccess(policy, context, request, result); return; } if (result.isRetryableFailure()) { News.error("WMS入库请求失败,重新发起请求,barcode={},stationId={},response={}", request.getBarcode(), request.getSourceStaNo(), policy.buildFailureMessage(result)); wmsOperateUtils.clearAsyncInTaskResponse(request); wmsOperateUtils.applyInTaskAsync(request); redisUtil.set(policy.getGenerateLockKey(context), "lock", policy.getRetryLockSeconds(context)); policy.onApplyFailed(context, result); return; } policy.onApplyFailed(context, result); } private void handleApplySuccess(StoreInTaskPolicy policy, StoreInTaskContext context, InTaskApplyRequest request, AsyncInTaskResult result) { try { JSONObject jsonObject = JSON.parseObject(result.getResponse()); if (jsonObject == null || !Integer.valueOf(200).equals(jsonObject.getInteger("code"))) { AsyncInTaskResult failResult = new AsyncInTaskResult(); failResult.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL); failResult.setResponse(result.getResponse()); failResult.setMessage("WMS返回非200"); handleApplyResult(policy, context, request, failResult); return; } StartupDto dto = jsonObject.getObject("data", StartupDto.class); if (dto == null) { AsyncInTaskResult failResult = new AsyncInTaskResult(); failResult.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL); failResult.setResponse(result.getResponse()); failResult.setMessage("WMS返回data为空"); handleApplyResult(policy, context, request, failResult); return; } CreateInTaskParam taskParam = policy.buildCreateInTaskParam(context, dto); WrkMast wrkMast = commonService.createInTask(taskParam); policy.afterTaskCreated(context, wrkMast); context.getStationProtocol().setSystemWarning(""); wmsOperateUtils.clearAsyncInTaskResponse(request); } catch (Exception e) { News.error("处理WMS入库成功响应失败,barcode={},stationId={}", request.getBarcode(), request.getSourceStaNo(), e); } } }