ReceiptDetailServiceImpl.java 10.2 KB
package com.huaheng.pc.receipt.receiptDetail.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.materialType.domain.MaterialType;
import com.huaheng.pc.config.materialType.service.MaterialTypeService;
import com.huaheng.pc.config.receiptPreference.domain.ReceiptPreference;
import com.huaheng.pc.config.receiptPreference.service.ReceiptPreferenceService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.statusFlow.domain.StatusFlowDetail;
import com.huaheng.pc.config.statusFlow.service.StatusFlowDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.mapper.ReceiptDetailMapper;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, ReceiptDetail> implements ReceiptDetailService{

    @Resource
    private MaterialService materialService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptTypeService receiptTypeService;
    @Resource
    private StatusFlowDetailService statusFlowDetailService;
    @Resource
    private MaterialTypeService materialTypeService;
    @Resource
    private ReceiptPreferenceService receiptPreferenceService;

    /**
     * 新增入库明细
     * @param receiptDetail
     * @return
     */
    @Transactional
    public AjaxResult saveReceiptDetaial(ReceiptDetail receiptDetail){
        /* 判断入库头表状态*/
        LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
        lambdaReceiptHeader.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);

        //判断入库头表状态
        if (receiptHeader == null ){
            throw new ServiceException("找不到主单据");
        } else if (receiptHeader.getFirstStatus() > 100){
            throw new ServiceException("单据进入订单池后,不允许新增明细");
        } else if (receiptHeader.getFirstStatus() == 20) {
            throw new ServiceException("单据已作废");
        }
        receiptDetail.setReceiptCode(receiptHeader.getCode());

        /* 判断物料编码*/
        LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(Material::getCode, receiptDetail.getMaterialCode());
        Material material = materialService.getOne(lambdaQueryWrapper);
        if (material == null) {
            throw new ServiceException("物料不存在");
        }
        receiptDetail.setCompanyCode(material.getCompanyCode());
        receiptDetail.setMaterialName(material.getName());
        receiptDetail.setMaterialSpec(material.getSpec());
        receiptDetail.setMaterialUnit(material.getUnit());

        receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());

        //根据流程配置更新入库明细下一流程
        ReceiptDetail receiptDetail1 = queryflow(receiptDetail);

        if (this.save(receiptDetail1)) {
            receiptHeader.setTotalQty(receiptHeader.getTotalQty()+receiptDetail1.getTotalQty());
            receiptHeader.setTotalLines(receiptHeader.getTotalLines()+1);
            receiptHeaderService.updateById(receiptHeader);
            return AjaxResult.success("新增单据明细成功");
        } else {
            return AjaxResult.error("新增单据明细失败!");
        }

    }

    /**
     * 修改入库明细
     * @param receiptDetail
     * @return
     */
    @Override
    @Transactional
    public AjaxResult updateReceiptDetaial(ReceiptDetail receiptDetail) {
        /* 先修改入库头表中的总数量和总行数,再更新记录,完成后更新入库头表中总数量和总行数*/

        //查询原记录
        ReceiptDetail originalReceiptDetail= this.getById(receiptDetail.getId());
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
        //判断物料编码是否被修改
        if (!originalReceiptDetail.getMaterialCode().equals(receiptDetail.getMaterialCode())){
            LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
            lambdaMaterial.eq(Material::getCode,receiptDetail.getMaterialCode());
            Material material = materialService.getOne(lambdaMaterial);
            if (material == null) {
                throw new ServiceException("该物料编码不存在");

            }else {
                receiptDetail.setMaterialName(material.getName());
                receiptDetail.setMaterialSpec(material.getSpec());
                receiptDetail.setMaterialUnit(material.getUnit());

                receiptHeader.setTotalQty(receiptHeader.getTotalQty()-originalReceiptDetail.getTotalQty());
                receiptHeader.setTotalLines(receiptHeader.getTotalLines()-1);
                if ( !receiptHeaderService.updateById(receiptHeader)){
                    return AjaxResult.error("入库头表更新失败");
                }
            }
        }

        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        if ( !this.updateById(receiptDetail) ){
            return AjaxResult.error("入库明细更新失败");
        } else {
            receiptHeader.setTotalQty(receiptHeader.getTotalQty()+receiptDetail.getTotalQty());
            receiptHeader.setTotalLines(receiptHeader.getTotalLines()+1);
            receiptHeaderService.updateById(receiptHeader);
            return AjaxResult.success("修改单据明细成功");
        }
    }

    /**
     * 根据流程配置更新入库明细下一流程
     * @param receiptDetail
     * @return
     */
    public ReceiptDetail queryflow(ReceiptDetail receiptDetail){

        //查询头表信息
        LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
        lambdaReceiptHeader.eq(ReceiptHeader::getCode, receiptDetail.getReceiptCode());
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);

        //查询明细表中入库物料信息
        LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
        lambdaMaterial.eq(Material::getCode, receiptDetail.getMaterialCode());
        Material material = materialService.getOne(lambdaMaterial);

        //查询头表中绑定的入库类型中的入库流程
        LambdaQueryWrapper<ReceiptType> lambdaReceiptType = Wrappers.lambdaQuery();
        lambdaReceiptType.eq(ReceiptType::getCode,  receiptHeader.getReceiptType());
        ReceiptType receiptType = receiptTypeService.getOne(lambdaReceiptType);
        if (receiptType.getReceiptFlow() != null){
            //物料是否有入库流程
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptType.getReceiptFlow());
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
            receiptDetail.setProcessStamp(status);
            return receiptDetail;
        } else if (material.getReceivingFlow() != null){
            //物料是否有入库流程
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(material.getReceivingFlow());
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
            receiptDetail.setProcessStamp(status);
            return receiptDetail;
        } else {
            //该物料类别是否有入库流程
            LambdaQueryWrapper<MaterialType> lambdaMaterialType = Wrappers.lambdaQuery();
            lambdaMaterialType.eq(MaterialType::getCode, material.getType());
            MaterialType materialType = materialTypeService.getOne(lambdaMaterialType);
            if (materialType.getReceivingFlow() != null) {
                List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(materialType.getReceivingFlow());
                String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
                receiptDetail.setProcessStamp(status);
                return receiptDetail;
            } else {
                //以上都没有的情况下查询入库首选项中的入库流程
                LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
                lambda.last("Limit 1");
                ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
                List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
                String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
                receiptDetail.setProcessStamp(status);
                return receiptDetail;
            }
        }
    }

    public String nextStatusFlow(List<StatusFlowDetail> statusFlowDetails, String status){
        if (status.equals(statusFlowDetails.get(statusFlowDetails.size()-1).getFlowCode())){
            return status;
        } else {
            for (int i = 0; i < statusFlowDetails.size(); i++){
                if (Integer.parseInt(statusFlowDetails.get(i).getFlowCode()) > Integer.parseInt(status)){
                    return statusFlowDetails.get(i).getFlowCode();
                }
            }
            return status;
        }
    }
}