package com.xisc.pm.app.service.strategy.pdevent;

import com.xisc.pm.api.dto.PmPdEventResDTO;
import com.xisc.pm.app.service.strategy.PdEventStrategyFactory;
import com.xisc.pm.domain.entity.PmContMscTech;
import com.xisc.pm.domain.entity.PmPdRec;
import com.xisc.pm.domain.entity.PmProCont;
import com.xisc.pm.domain.entity.PmProContProdTtr;
import com.xisc.pm.infra.enums.PdEventType;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;

/**
 * 余材板坯组板删除事件，策略处理类
 * 
 * @author jun.zeng
 *
 */
@Component
public class PdEventStrategyHp11 implements PdEventStrategy {

    @Override
    public void afterPropertiesSet() throws Exception {
        PdEventStrategyFactory.register(PdEventType.HP11, this);
    }

    /**
     * (5) 若event_code = HP11,
     * 对应余材板坯组板删除事件，根据合同号修改生产合同主表组板工序超投件数PM_OVER_DEVO_QTY、组板工序超投量PM_OVER_DEVO_WT、
     * 组板欠件PD_LACK_QTY、组板总件数PD_TOT_QTY，根据合同号、产线号修改合同产线工艺参数表余材板坯组板合同小板数SLAB_PD_QTY：
     * 
     * a) 优先扣减组板工序超投件数、组板工序超投量， 即组板工序超投件数 = 组板工序超投件数 – 件数， 组板工序超投量 = 组板工序超投件数 *
     * 目标单重，若组板工序超投件数小于0，则置超投件数、超投量均为0，件数超出部分在组板欠件中更新；
     * 
     *  b) 组板欠件 = 组板欠件 + 件数超出部分，
     * 组板总件数 = 组板总件数 - 件数超出部分， 余材板坯组板合同小板数 = 余材板坯组板合同小板数 - 件数超出部分，修改who字段；
     * 
     * 
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public PmPdEventResDTO handleEvent(PmPdRec pmPdRec, PmContMscTech pmContMscTech, PmProCont pmProCont, PmProContProdTtr pmProContProdTtr) {
        
//        // 组板工序超投件数
//        BigDecimal pdOverDevoQty = pmProCont.getPdOverDevoQty() == null ? BigDecimal.ZERO : pmProCont.getPdOverDevoQty();
//        pdOverDevoQty = pdOverDevoQty.subtract(pmPdRec.getQty());
//
//        PmProCont updatePmProCont = new PmProCont();
//        updatePmProCont.setObjectVersionNumber(pmProCont.getObjectVersionNumber());
//        updatePmProCont.setProContId(pmProCont.getProContId());
//        if(pdOverDevoQty.compareTo(BigDecimal.ZERO) >= 0) {
//            BigDecimal ordderUnitAimWt = BigDecimal.ZERO;
//            if(pmProContProdTtr != null && pmProContProdTtr.getOrderUnitAimWt() != null) {
//                ordderUnitAimWt = pmProContProdTtr.getOrderUnitAimWt();
//            }
//            updatePmProCont.setPdOverDevoQty(pdOverDevoQty);
//            updatePmProCont.setPdOverDevoWt(pdOverDevoQty.multiply(ordderUnitAimWt));
//            defaultHandle(pmPdRec, pmContMscTech, pmProCont, updatePmProCont, pmProContProdTtr);
//            return new PmPdEventResDTO(null, updatePmProCont, null);
//        } else {
//            updatePmProCont.setPdOverDevoQty(BigDecimal.ZERO);
//            updatePmProCont.setPdOverDevoWt(BigDecimal.ZERO);
//
//            BigDecimal pdTotQty = pmProCont.getPdTotQty() == null ? BigDecimal.ZERO : pmProCont.getPdTotQty();
//
//            // 组板欠件 = 组板欠件 + 件数超出部分
//            BigDecimal pdLackQty = pmProCont.getPdLackQty() == null ? BigDecimal.ZERO : pmProCont.getPdLackQty();
//            // 减负数，表示加
//            pdLackQty = pdLackQty.subtract(pdOverDevoQty);
//
//            updatePmProCont.setPdLackQty(pdLackQty);
//            // 组板总件数 = 组板总件数 - 件数超出部分
//            // 加负数，表示减
//            updatePmProCont.setPdTotQty(pdTotQty.subtract(pmPdRec.getQty()));
//
//            // 余材板坯组板合同小板数 = 余材板坯组板合同小板数 - 件数超出部分
//            BigDecimal slabPdQty = pmContMscTech.getSlabPdQty() == null ? BigDecimal.ZERO : pmContMscTech.getSlabPdQty();
//            // 加负数，表示减
//            slabPdQty = slabPdQty.subtract(pmPdRec.getQty());
//
//            PmContMscTech updatePmContMscTech = new PmContMscTech();
//            updatePmContMscTech.setObjectVersionNumber(pmContMscTech.getObjectVersionNumber());
//            updatePmContMscTech.setContMscId(pmContMscTech.getContMscId());
//            updatePmContMscTech.setSlabPdQty(slabPdQty);
//            defaultHandle(pmPdRec, pmContMscTech, pmProCont, updatePmProCont, pmProContProdTtr);
//            return new PmPdEventResDTO(updatePmContMscTech, updatePmProCont, null);

        PmProCont updatePmProCont = new PmProCont();
        updatePmProCont.setObjectVersionNumber(pmProCont.getObjectVersionNumber());
        updatePmProCont.setProContId(pmProCont.getProContId());

        BigDecimal pdTotQty = pmProCont.getPdTotQty() == null ? BigDecimal.ZERO : pmProCont.getPdTotQty();

        // 组板欠件 = 组板欠件 + 件数
        BigDecimal pdLackQty = pmProCont.getPdLackQty() == null ? BigDecimal.ZERO : pmProCont.getPdLackQty();
        pdLackQty = pdLackQty.add(pmPdRec.getQty());
        updatePmProCont.setPdLackQty(pdLackQty);

        // 组板总件数 = 组板总件数 - 件数
        updatePmProCont.setPdTotQty(pdTotQty.subtract(pmPdRec.getQty()));

        // 余材板坯组板合同小板数 = 余材板坯组板合同小板数 - 件数
        BigDecimal slabPdQty = pmContMscTech.getSlabPdQty() == null ? BigDecimal.ZERO
                : pmContMscTech.getSlabPdQty();
        slabPdQty = slabPdQty.subtract(pmPdRec.getQty());

        PmContMscTech updatePmContMscTech = new PmContMscTech();
        updatePmContMscTech.setObjectVersionNumber(pmContMscTech.getObjectVersionNumber());
        updatePmContMscTech.setContMscId(pmContMscTech.getContMscId());
        updatePmContMscTech.setSlabPdQty(slabPdQty);
        defaultHandle(pmPdRec, pmContMscTech, pmProCont, updatePmProCont, pmProContProdTtr);
        return new PmPdEventResDTO(updatePmContMscTech, updatePmProCont, null);
        
    }

}
