package com.hw.mes.service.impl;

import java.math.BigDecimal;
import java.util.List;

import com.hw.common.core.constant.MesConstants;
import com.hw.common.core.exception.ServiceException;
import com.hw.common.core.utils.DateUtils;
import com.hw.common.core.utils.StringUtils;
import com.hw.common.core.utils.uuid.Seq;
import com.hw.mes.domain.MesMaterialBom;
import com.hw.mes.service.IMesMaterialBomService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hw.mes.mapper.MesProductOrderMapper;
import com.hw.mes.domain.MesProductOrder;
import com.hw.mes.service.IMesProductOrderService;

/**
 * 生产工单Service业务层处理
 *
 * @author Yinq
 * @date 2024-02-20
 */
@Service
public class MesProductOrderServiceImpl implements IMesProductOrderService {
    @Autowired
    private MesProductOrderMapper mesProductOrderMapper;

    @Autowired
    private IMesMaterialBomService mesMaterialBomService;

    /**
     * 查询生产工单
     *
     * @param productOrderId 生产工单主键
     * @return 生产工单
     */
    @Override
    public MesProductOrder selectMesProductOrderByProductOrderId(Long productOrderId) {
        return mesProductOrderMapper.selectMesProductOrderByProductOrderId(productOrderId);
    }

    /**
     * 查询生产工单列表
     *
     * @param mesProductOrder 生产工单
     * @return 生产工单
     */
    @Override
    public List<MesProductOrder> selectMesProductOrderList(MesProductOrder mesProductOrder) {
        return mesProductOrderMapper.selectMesProductOrderList(mesProductOrder);
    }

    /**
     * 新增生产工单
     *
     * @param mesProductOrder 生产工单
     * @return 结果
     */
    @Override
    public int insertMesProductOrder(MesProductOrder mesProductOrder) {
        mesProductOrder.setCreateTime(DateUtils.getNowDate());
        //销售订单添加工单：校验是否超出销售数量
        if (mesProductOrder.getSaleOrderFlag().equals("1") && StringUtils.isNotNull(mesProductOrder.getSaleOrderId())) {
            checkSalesQuantity(mesProductOrder);
        }
        return mesProductOrderMapper.insertMesProductOrder(mesProductOrder);
    }

    /**
     * 修改生产工单
     *
     * @param mesProductOrder 生产工单
     * @return 结果
     */
    @Override
    public int updateMesProductOrder(MesProductOrder mesProductOrder) {
        //销售订单修改工单：校验是否超出销售数量
        if (StringUtils.isNotEmpty(mesProductOrder.getSaleOrderFlag())
                && mesProductOrder.getSaleOrderFlag().equals("1")
                && StringUtils.isNotNull(mesProductOrder.getSaleOrderId())) {
            checkSalesQuantity(mesProductOrder);
        }
        mesProductOrder.setUpdateTime(DateUtils.getNowDate());
        return mesProductOrderMapper.updateMesProductOrder(mesProductOrder);
    }

    /**
     * 批量删除生产工单
     *
     * @param productOrderIds 需要删除的生产工单主键
     * @return 结果
     */
    @Override
    public int deleteMesProductOrderByProductOrderIds(Long[] productOrderIds) {
        for (Long productOrderId : productOrderIds) {
            MesProductOrder mesProductOrder = new MesProductOrder();
            mesProductOrder.setProductOrderId(productOrderId);
            mesProductOrder.setOrderStatus(MesConstants.DELETE);
            mesProductOrderMapper.updateMesProductOrder(mesProductOrder);
        }
        return 1;
    }

    /**
     * 删除生产工单信息
     *
     * @param productOrderId 生产工单主键
     * @return 结果
     */
    @Override
    public int deleteMesProductOrderByProductOrderId(Long productOrderId) {
        MesProductOrder mesProductOrder = new MesProductOrder();
        mesProductOrder.setProductOrderId(productOrderId);
        mesProductOrder.setOrderStatus(MesConstants.DELETE);
        return mesProductOrderMapper.updateMesProductOrder(mesProductOrder);
    }

    /**
     * 获取工单编号
     *
     * @return orderCode
     */
    @Override
    public String getOrderCode() {
        return Seq.getId(Seq.orderCodeSeqType, Seq.orderCodeCode);
    }

    /**
     * 校验是否超出销售数量
     *
     * @param mesProductOrder
     */
    private void checkSalesQuantity(MesProductOrder mesProductOrder) {
        if (StringUtils.isNull(mesProductOrder.getPlanAmount()) || StringUtils.isNull(mesProductOrder.getSaleAmount())) {
            return;
        }
        MesProductOrder productOrder = new MesProductOrder();
        productOrder.setSaleOrderId(mesProductOrder.getSaleOrderId());
        List<MesProductOrder> mesProductOrders = mesProductOrderMapper.selectMesProductOrderList(productOrder);
        BigDecimal sumDecimal = new BigDecimal(0);
        if (StringUtils.isNotNull(mesProductOrders)) {
            for (MesProductOrder order : mesProductOrders) {
                if (!order.getOrderStatus().equals(MesConstants.RECALL) && !order.getProductOrderId().equals(mesProductOrder.getProductOrderId())) {
                    sumDecimal = sumDecimal.add(order.getPlanAmount());
                }
            }
        }
        sumDecimal = sumDecimal.add(mesProductOrder.getPlanAmount());
        if (mesProductOrder.getSaleAmount().compareTo(sumDecimal) < 0) {
            throw new ServiceException("当前生产工单计划数量为：" + sumDecimal.longValue() + "，超出该销售订单销售数量！");
        }
    }

    /**
     * 锁库存
     *
     * @param mesProductOrder 生产工单
     * @return
     */
    @Override
    public int productOrderLockInventory(MesProductOrder mesProductOrder) {
        MesProductOrder productOrder = mesProductOrderMapper.selectMesProductOrderByProductOrderId(mesProductOrder.getProductOrderId());
        if (productOrder.getStockLockFlag().equals("1")) {
            throw new ServiceException("该工单库存已锁定！");
        }
        if (!mesProductOrder.getOrderStatus().equals(MesConstants.UN_PUBLISH)) {
            throw new ServiceException("该生产工单不是未发布状态！");
        }
        // 调用仓库接口锁定库存
        mesProductOrder.setUpdateTime(DateUtils.getNowDate());
        return mesProductOrderMapper.updateMesProductOrder(mesProductOrder);
    }

    /**
     * 工单发布
     *
     * @param mesProductOrder 生产工单
     * @return
     */
    @Override
    public int productOrderPublish(MesProductOrder mesProductOrder) {
        if (!mesProductOrder.getOrderStatus().equals(MesConstants.UN_PUBLISH)) {
            throw new ServiceException("该生产工单不是未发布状态！");
        }
        MesProductOrder productOrder = new MesProductOrder();
        productOrder.setProductOrderId(mesProductOrder.getProductOrderId());
        productOrder.setOrderStatus(MesConstants.PUBLISHED);
        productOrder.setReleaseTime(DateUtils.getNowDate());
        return this.updateMesProductOrder(productOrder);
    }

    /**
     * 校验BOM是否被生产工单选择
     *
     * @param materialBomId BOM主键
     * @return
     */
    @Override
    public Boolean verifyBOMIsProduction(Long materialBomId) {
        //查询顶级BOM
        MesMaterialBom mesMaterialBom = mesMaterialBomService.selectTopMaterialBomByMaterialBomId(materialBomId);
        if (StringUtils.isNull(mesMaterialBom)){
            return false;
        }
        //通过顶级BOM主键查询生产工单
        MesProductOrder mesProductOrder = new MesProductOrder();
        mesProductOrder.setMaterialBomId(mesMaterialBom.getMaterialBomId());
        List<MesProductOrder> productOrderList = mesProductOrderMapper.selectMesProductOrderList(mesProductOrder);
        if (productOrderList.size() > 0){
            return true;
        }
        return false;
    }

}
