#
vincentlu
9 天以前 09ca73620da2b11310df08cb7a500493ea4782da
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/HkOrderStateClosureService.java
@@ -3,9 +3,12 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.common.hk.state.HkState;
import com.zy.acs.common.hk.state.HkStateActionState;
import com.zy.acs.common.hk.state.HkStateBatteryState;
import com.zy.acs.common.hk.action.type.HkActionType;
import com.zy.acs.common.hk.state.type.HkActionStatusType;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.Action;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.enums.ActionStsType;
@@ -49,11 +52,15 @@
        syncFinishedActions(state);
        if (!isOrderCompleted(state)) {
        List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
                .eq(Segment::getGroupId, state.getOrderId())
                .orderByAsc(Segment::getSerial));
        if (!isOrderCompleted(state, segmentList)) {
            return;
        }
        settleCompletedOrder(state);
        settleCompletedOrder(state, segmentList);
    }
    private void syncFinishedActions(HkState state) {
@@ -94,7 +101,11 @@
        }
    }
    private boolean isOrderCompleted(HkState state) {
    private boolean isOrderCompleted(HkState state, List<Segment> segmentList) {
        if (isChargeOrder(segmentList) && isChargeTaskCompleted(state)) {
            return true;
        }
        if (!Cools.isEmpty(state.getNodeStates()) || !Cools.isEmpty(state.getEdgeStates())) {
            return false;
        }
@@ -121,16 +132,13 @@
        return true;
    }
    private void settleCompletedOrder(HkState state) {
    private void settleCompletedOrder(HkState state, List<Segment> segmentList) {
        String orderId = state.getOrderId();
        String completeKey = buildCompleteKey(state);
        if (redis.getObject(HK_ORDER_COMPLETE_FLAG, completeKey) != null) {
            return;
        }
        List<Segment> segmentList = segmentService.list(new LambdaQueryWrapper<Segment>()
                .eq(Segment::getGroupId, orderId)
                .orderByAsc(Segment::getSerial));
        if (Cools.isEmpty(segmentList)) {
            log.warn("hk state order completed but no segment found, agvNo={}, orderId={}, orderUpdateId={}",
                    state.getSerialNumber(), orderId, state.getOrderUpdateId());
@@ -172,6 +180,40 @@
        return lastNodeSequenceId >= expectedLastNodeSequenceId;
    }
    private boolean isChargeOrder(List<Segment> segmentList) {
        if (Cools.isEmpty(segmentList)) {
            return false;
        }
        return segmentList.stream()
                .map(Segment::getPosType)
                .map(TaskPosDto::queryPosType)
                .anyMatch(TaskPosDto.PosType.TO_CHARGE::equals);
    }
    private boolean isChargeTaskCompleted(HkState state) {
        HkStateBatteryState batteryState = state.getBatteryState();
        if (batteryState != null && Boolean.TRUE.equals(batteryState.getCharging())) {
            return true;
        }
        if (Cools.isEmpty(state.getActionStates())) {
            return false;
        }
        for (HkStateActionState actionState : state.getActionStates()) {
            if (actionState == null || Cools.isEmpty(actionState.getActionType())) {
                continue;
            }
            if (!HkActionType.START_CHARGING.getCode().equalsIgnoreCase(actionState.getActionType())) {
                continue;
            }
            if (actionState.getActionStatus() == HkActionStatusType.FINISHED) {
                return true;
            }
        }
        return false;
    }
    private Long parseActionId(String hkActionId) {
        if (Cools.isEmpty(hkActionId) || hkActionId.length() < 2) {
            return null;