//package com.cf.imes.module.executor.service.customplatenorule;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.ObjectUtil;
//import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO;
//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleDTO;
//import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqProcessGroupVO;
//import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqRoomVO;
//import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO;
//import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqRespDTO;
//import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum;
//import com.cf.imes.module.system.enums.customplateno.ResetModeEnum;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Optional;
//import java.util.concurrent.atomic.AtomicReference;
//import java.util.stream.Collectors;
//
//import static com.cf.imes.module.executor.enums.ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_PROCESSGROUP_RULE_NOT_SUPPORT_RESETMODE;
//
///**
// * 加工组序号生成规则服务实现类
// *
// * @author Gqr
// * @since 2024/11/20 13:42
// */
//@Service("processGroupNoGenerateRuleService")
//public class ProcessGroupNoGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService {
//    @Override
//    public boolean match(String ruleCode) {
//        return false;
//    }
//
//    @Override
//    public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleDTO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List<PlateDO> plateDOList) {
//        // 初始化配置
//        initConfig(generateConfig);
//        // 按复位模式走不同的生成方式
//        ResetModeEnum resetModeEnum = ResetModeEnum.getByMode(plateNoRule.getResetMode());
//        if (ObjectUtil.equal(ResetModeEnum.ORDER, resetModeEnum)) {
//            generateConfig = generateNoByOrderResetMode(orderId, plateNoRule, generateConfig, plateDOList);
//        } else if (ObjectUtil.equal(ResetModeEnum.ROOM, resetModeEnum)) {
//            generateConfig = generateNoByRoomResetMode(plateNoRule, generateConfig, plateDOList);
//        } else {
//            throw new ServiceException(CUSTOM_PLATENO_GENERATE_PROCESSGROUP_RULE_NOT_SUPPORT_RESETMODE, plateNoRule.getResetMode());
//        }
//        return generateConfig;
//    }
//
//    /**
//     * 初始化生成所需配置
//     *
//     * @param generateConfigVO
//     */
//    private static void initConfig(CustomPlateNoGenerateConfigVO generateConfigVO) {
//        OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfigVO.getOrderCustomPlateNoSeqVO();
//        if (ObjectUtil.isNull(orderCustomPlateNoSeqVO)) {
//            orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO();
//            generateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO);
//        }
//        List<OrderCustomPlateNoSeqRoomVO> rooms = orderCustomPlateNoSeqVO.getRooms();
//        if (CollUtil.isEmpty(rooms)) {
//            rooms = new ArrayList<>();
//            orderCustomPlateNoSeqVO.setRooms(rooms);
//        }
//        List<OrderCustomPlateNoSeqProcessGroupVO> processGroups = orderCustomPlateNoSeqVO.getProcessGroups();
//        if (CollUtil.isEmpty(processGroups)) {
//            processGroups = new ArrayList<>();
//            orderCustomPlateNoSeqVO.setProcessGroups(processGroups);
//        }
//    }
//
//
//    /**
//     * 按订单复位模式下的板编号生成
//     *
//     * @param orderId        订单号
//     * @param plateNoRule    当前规则配置
//     * @param generateConfig 生成规则配置
//     * @param plateDOList    板件列表
//     * @return
//     */
//    private CustomPlateNoGenerateConfigVO generateNoByOrderResetMode(Long orderId, CustomPlateNoRuleDTO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List<PlateDO> plateDOList) {
//        Integer initValue = plateNoRule.getInitValue() - plateNoRule.getIncrementStep();
//        // 订单下的序号
//        OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO();
//        // 机构下的自定义板编号序号
//        CustomPlateNoSeqRespDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO();
//        // 订单下加工组序号
//        Integer orderProcessGroupNoSeq = null;
//        List<OrderCustomPlateNoSeqProcessGroupVO> processGroups = orderCustomPlateNoSeqVO.getProcessGroups();
//        if (ObjectUtil.equal(orderId, orgCustomPlateNoSeqRespDTO.getLastOrderNo())) {
//            // 当次导入和上次导入是同一个订单
//            // 取之前的订单下加工组序号，没有就用初始值
//            orderProcessGroupNoSeq = Optional.ofNullable(orderCustomPlateNoSeqVO.getProcessGroupNoSeq()).orElse(initValue);
//        }
//        // 基于加工组名分组
//        Map<String, List<PlateDO>> processGroupMap = plateDOList.stream().collect(Collectors.groupingBy(PlateDO::getProcessGroupName, Collectors.toList()));
//        for (Map.Entry<String, List<PlateDO>> processGroupEntry : processGroupMap.entrySet()) {
//            // 如果是新的加工组vo，要把累加的值记录到订单
//            boolean needRecordToOrder = false;
//            String processGroupName = processGroupEntry.getKey();
//            // 根据加工组名获取订单下序号json中第一层加工组列表的加工组序号
//            OrderCustomPlateNoSeqProcessGroupVO processSeqVO = getProcessGroupSeqVOByProcessGroupName(processGroupName, processGroups);
//            // 获取当前加工组序号值
//            Integer processGroupNoSeq = Optional.ofNullable(processSeqVO).map(OrderCustomPlateNoSeqProcessGroupVO::getProcessGroupNoSeq).orElse(initValue);
//            if (processSeqVO == null) {
//                // 房间为空，新建对象，设置初始值
//                processSeqVO = OrderCustomPlateNoSeqProcessGroupVO.builder()
//                        .processGroupName(processGroupName)
//                        .build();
//                processGroups.add(processSeqVO);
//                needRecordToOrder = true;
//            }
//
//            List<PlateDO> processGroupPlateList = processGroupEntry.getValue();
//            processGroupNoSeq += plateNoRule.getIncrementStep();
//            // 跨柜体累加步长，补零
//            String noPartAfterFillZero = fillZero(processGroupNoSeq, plateNoRule);
//            processGroupPlateList.forEach(processGroupPlate -> processGroupPlate.getCustomPlateNo().append(noPartAfterFillZero));
//            // 累加后同步到json：加工组下累加到多少了
//            processSeqVO.setProcessGroupNoSeq(processGroupNoSeq);
//            if (needRecordToOrder) {
//                // 新的房间下加工组vo，累加值同步到房间中
//                orderProcessGroupNoSeq = processGroupNoSeq;
//            }
//        }
//        // 累加后的值同步到当前订单序号中，订单下加工组序号累加到多少了
//        orderCustomPlateNoSeqVO.setProcessGroupNoSeq(orderProcessGroupNoSeq);
//        return generateConfig;
//    }
//
//    /**
//     * 按房间号复位模式下的板编号生成
//     *
//     * @param plateNoRule
//     * @param generateConfig
//     * @param plateDOList
//     * @return
//     */
//    private CustomPlateNoGenerateConfigVO generateNoByRoomResetMode(CustomPlateNoRuleDTO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List<PlateDO> plateDOList) {
//        Integer initValue = plateNoRule.getInitValue() - plateNoRule.getIncrementStep();
//        // 订单下的序号
//        OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO();
//        List<OrderCustomPlateNoSeqRoomVO> rooms = orderCustomPlateNoSeqVO.getRooms();
//        // 基于房间名分组
//        Map<String, List<PlateDO>> roomGroupMap = plateDOList.stream().collect(Collectors.groupingBy(PlateDO::getRoomName, Collectors.toList()));
//
//        for (Map.Entry<String, List<PlateDO>> roomEntry : roomGroupMap.entrySet()) {
//            List<PlateDO> roomPlateList = roomEntry.getValue();
//            String roomName = roomEntry.getKey();
//            // 根据房间名获取订单下序号json中的房间下的柜体序号
//            OrderCustomPlateNoSeqRoomVO roomSeqVo = getRoomSeqVOByRoomName(roomName, rooms);
//            Integer roomProcessGroupNoRoomSeq = Optional.ofNullable(roomSeqVo)
//                    .map(OrderCustomPlateNoSeqRoomVO::getProcessGroupNoSeq)
//                    .orElse(initValue);
//
//            if (roomSeqVo == null) {
//                // 房间为空，新建对象，设置初始值
//                roomSeqVo = OrderCustomPlateNoSeqRoomVO.builder()
//                        .roomName(roomName)
//                        .processGroupNoSeq(roomProcessGroupNoRoomSeq)
//                        .processGroups(new ArrayList<>())
//                        .build();
//                rooms.add(roomSeqVo);
//            }
//
//            // 基于加工组分组
//            Map<String, List<PlateDO>> roomProcessGroupMap = roomPlateList.stream()
//                    .collect(Collectors.groupingBy(PlateDO::getProcessGroupName, Collectors.toList()));
//            for (Map.Entry<String, List<PlateDO>> roomPrcesssGroupEntry : roomProcessGroupMap.entrySet()) {
//                // 如果是新的柜体vo，要把累加的值记录到订单rooms下的柜体
//                boolean needRecordToOrder = false;
//                String processGroupName = roomPrcesssGroupEntry.getKey();
//                // 根据加工组名获取订单下序号中rooms下加工组列表的加工组序号
//                List<OrderCustomPlateNoSeqProcessGroupVO> roomProcessGroups = roomSeqVo.getProcessGroups();
//                OrderCustomPlateNoSeqProcessGroupVO roomProcessGroupSeqVo = getProcessGroupSeqVOByProcessGroupName(processGroupName, roomProcessGroups);
//                // 获取当前房间下加工组的序号值
//                Integer roomProcessGroupNoSeq = Optional.ofNullable(roomProcessGroupSeqVo).map(OrderCustomPlateNoSeqProcessGroupVO::getProcessGroupNoSeq).orElse(null);
//                if (roomProcessGroupSeqVo == null) {
//                    // 房间下柜体为空，新建对象，设置初始值
//                    roomProcessGroupSeqVo = OrderCustomPlateNoSeqProcessGroupVO.builder()
//                            .processGroupName(processGroupName)
//                            .build();
//                    roomProcessGroups.add(roomProcessGroupSeqVo);
//                    roomProcessGroupNoSeq= roomProcessGroupNoRoomSeq;
//                    needRecordToOrder = true;
//                } else if(roomProcessGroupNoSeq == null){
//                    roomProcessGroupNoSeq= roomProcessGroupNoRoomSeq;
//                    needRecordToOrder = true;
//                }
//
//                // 跨加工组累加步长
//                roomProcessGroupNoSeq += plateNoRule.getIncrementStep();
//                // 补零
//                String noPartAfterFillZero = fillZero(roomProcessGroupNoSeq, plateNoRule);
//                roomPrcesssGroupEntry.getValue().forEach(roomPrcesssGroupPlate -> roomPrcesssGroupPlate.getCustomPlateNo().append(noPartAfterFillZero));
//                // 累加后同步到json中，room下柜体累加到多少了
//                roomProcessGroupSeqVo.setProcessGroupNoSeq(roomProcessGroupNoSeq);
//                if (needRecordToOrder) {
//                    // 新的房间下柜体vo，累加值同步到房间中
//                    roomProcessGroupNoRoomSeq = roomProcessGroupNoSeq;
//                }
//            }
//            // 累加后的值同步到当前订单序号中，订单下房间中加工组累加到多少了
//            roomSeqVo.setProcessGroupNoSeq(roomProcessGroupNoRoomSeq);
//        }
//        return generateConfig;
//    }
//
//    /**
//     * 根据房间名从订单序号json中获取房间序号列表
//     *
//     * @param roomName
//     * @param roomVOList
//     * @return
//     */
//    private OrderCustomPlateNoSeqRoomVO getRoomSeqVOByRoomName(String roomName, List<OrderCustomPlateNoSeqRoomVO> roomVOList) {
//        return roomVOList.stream().filter(roomVO -> ObjectUtil.equal(roomName, roomVO.getRoomName())).findAny().orElse(null);
//    }
//
//    /**
//     * 根据柜体名从订单序号json中获取柜体序号列表
//     *
//     * @param processGroupName
//     * @param processGroupVOList
//     * @return
//     */
//    private OrderCustomPlateNoSeqProcessGroupVO getProcessGroupSeqVOByProcessGroupName(String processGroupName, List<OrderCustomPlateNoSeqProcessGroupVO> processGroupVOList) {
//        if (CollUtil.isEmpty(processGroupVOList)) {
//            return null;
//        }
//        return processGroupVOList.stream().filter(processGroupVO -> ObjectUtil.equal(processGroupName, processGroupVO.getProcessGroupName())).findAny().orElse(null);
//    }
//}
