package com.hw.qms.service.impl;

import java.util.Date;
import java.util.List;

import com.hw.common.core.constant.QmsConstants;
import com.hw.common.core.exception.ServiceException;
import com.hw.common.core.utils.DateUtils;
import com.hw.common.security.utils.SecurityUtils;
import com.hw.qms.domain.*;
import com.hw.qms.domain.vo.QmsMaterialCheckVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;

import com.hw.common.core.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.hw.qms.mapper.QmsCheckResultMapper;
import com.hw.qms.service.IQmsCheckResultService;

/**
 * 质检结果Service业务层处理
 *
 * @author xins
 * @date 2024-01-23
 */
@Service
public class QmsCheckResultServiceImpl implements IQmsCheckResultService {
    @Autowired
    private QmsCheckResultMapper qmsCheckResultMapper;

    /**
     * 查询质检结果
     *
     * @param checkResultId 质检结果主键
     * @return 质检结果
     */
    @Override
    public QmsCheckResult selectQmsCheckResultByCheckResultId(Long checkResultId) {
        return qmsCheckResultMapper.selectQmsCheckResultByCheckResultId(checkResultId);
    }

    /**
     * 查询质检结果列表
     *
     * @param qmsCheckResult 质检结果
     * @return 质检结果
     */
    @Override
    public List<QmsCheckResult> selectQmsCheckResultList(QmsCheckResult qmsCheckResult) {
        return qmsCheckResultMapper.selectQmsCheckResultList(qmsCheckResult);
    }

    /**
     * 新增质检结果
     *
     * @param qmsCheckResult 质检结果
     * @return 结果
     */
    @Transactional
    @Override
    public int insertQmsCheckResult(QmsCheckResult qmsCheckResult) {
        qmsCheckResult.setCreateTime(DateUtils.getNowDate());
        int rows = qmsCheckResultMapper.insertQmsCheckResult(qmsCheckResult);
        insertQmsCheckResultDetail(qmsCheckResult);
        return rows;
    }

    /**
     * 修改质检结果
     *
     * @param qmsCheckResult 质检结果
     * @return 结果
     */
    @Transactional
    @Override
    public int updateQmsCheckResult(QmsCheckResult qmsCheckResult) {
        qmsCheckResult.setUpdateTime(DateUtils.getNowDate());
        qmsCheckResultMapper.deleteQmsCheckResultDetailByCheckResultId(qmsCheckResult.getCheckResultId());
        insertQmsCheckResultDetail(qmsCheckResult);
        return qmsCheckResultMapper.updateQmsCheckResult(qmsCheckResult);
    }

    /**
     * 批量删除质检结果
     *
     * @param checkResultIds 需要删除的质检结果主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteQmsCheckResultByCheckResultIds(Long[] checkResultIds) {
        qmsCheckResultMapper.deleteQmsCheckResultDetailByCheckResultIds(checkResultIds);
        return qmsCheckResultMapper.deleteQmsCheckResultByCheckResultIds(checkResultIds);
    }

    /**
     * 删除质检结果信息
     *
     * @param checkResultId 质检结果主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteQmsCheckResultByCheckResultId(Long checkResultId) {
        qmsCheckResultMapper.deleteQmsCheckResultDetailByCheckResultId(checkResultId);
        return qmsCheckResultMapper.deleteQmsCheckResultByCheckResultId(checkResultId);
    }

    /**
     * 新增质检结果详情信息
     *
     * @param qmsCheckResult 质检结果对象
     */
    public void insertQmsCheckResultDetail(QmsCheckResult qmsCheckResult) {
        List<QmsCheckResultDetail> qmsCheckResultDetailList = qmsCheckResult.getQmsCheckResultDetailList();
        Long checkResultId = qmsCheckResult.getCheckResultId();
        if (StringUtils.isNotNull(qmsCheckResultDetailList)) {
            List<QmsCheckResultDetail> list = new ArrayList<QmsCheckResultDetail>();
            for (QmsCheckResultDetail qmsCheckResultDetail : qmsCheckResultDetailList) {
                qmsCheckResultDetail.setCheckResultId(checkResultId);
                list.add(qmsCheckResultDetail);
            }
            if (list.size() > 0) {
                qmsCheckResultMapper.batchQmsCheckResultDetail(list);
            }
        }
    }


    /**
     * 在扫描物料条码时，如果是第一次对此批次质检，需要插入质检结果记录
     *
     * @param mesBaseBarcodeInfo
     * @param qmsCheckRule
     * @return checkResultId
     */
    @Override
    public Long insertCheckResult(MesBaseBarcodeInfo mesBaseBarcodeInfo, QmsCheckRule qmsCheckRule) {
        if (qmsCheckRule == null) {
            throw new ServiceException("没有此物料检验规则");
        }
        String batchCode = mesBaseBarcodeInfo.getBatchCode();
        QmsCheckResult qmsCheckResult = qmsCheckResultMapper.selectQmsCheckResultByMaterialBatch(batchCode);
        if (qmsCheckResult == null) {
            qmsCheckResult = new QmsCheckResult();
            String barcodeType = mesBaseBarcodeInfo.getBarcodeType();//条码类型（1原材料,2半成品,3成品,4背板）
            qmsCheckResult.setCheckRuleId(qmsCheckRule.getCheckRuleId());
            qmsCheckResult.setCheckRuleName(qmsCheckRule.getCheckRuleName());
            qmsCheckResult.setCheckRuleType(qmsCheckRule.getCheckRuleType());
            qmsCheckResult.setMaterialType(barcodeType);
            qmsCheckResult.setMaterialId(mesBaseBarcodeInfo.getMaterialId());
            qmsCheckResult.setMaterialBatch(mesBaseBarcodeInfo.getBatchCode());
            qmsCheckResult.setCheckMode(qmsCheckResult.getCheckMode());
            qmsCheckResult.setCheckSample(qmsCheckRule.getCheckSample());
            qmsCheckResult.setPlanCode(mesBaseBarcodeInfo.getPlanCode());
            qmsCheckResult.setPlanDetailCode(mesBaseBarcodeInfo.getPlanDetailCode());
            qmsCheckResult.setSaleOrderId(mesBaseBarcodeInfo.getSaleOrderId());
            qmsCheckResult.setSaleorderCode(mesBaseBarcodeInfo.getSaleorderCode());
            qmsCheckResult.setPoNo(mesBaseBarcodeInfo.getPoNo());
            qmsCheckResult.setCheckStatus(QmsConstants.QMS_CHECK_RESULT_CHECK_STATUS_CHECKED);
            qmsCheckResult.setCreateBy(SecurityUtils.getUsername());
            qmsCheckResult.setCreateTime(new Date());

            qmsCheckResultMapper.insertQmsCheckResult(qmsCheckResult);
        }

        return qmsCheckResult.getCheckResultId();

    }


    /**
     * 查询质检结果列表,Join material
     *
     * @param qmsCheckResult 质检结果
     * @return 质检结果
     */
    @Override
    public List<QmsCheckResult> selectQmsCheckResultJoinList(QmsCheckResult qmsCheckResult) {
        return qmsCheckResultMapper.selectQmsCheckResultJoinList(qmsCheckResult);
    }


    /**
     * 更新质检结果状态
     *
     * @param qmsCheckResult 质检结果
     * @return 结果
     */
    @Override
    public int auditQmsCheckResult(QmsCheckResult qmsCheckResult) {
        qmsCheckResult.setUpdateTime(DateUtils.getNowDate());
        qmsCheckResult.setUpdateBy(SecurityUtils.getUsername());
        return qmsCheckResultMapper.updateQmsCheckResult(qmsCheckResult);
    }

}
