ReceivingService.java 11.1 KB
package com.huaheng.pc.receipt.receiving.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail;
import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService;
import com.huaheng.pc.config.FilterConfigHeader.domain.FilterConfigHeader;
import com.huaheng.pc.config.configValue.domain.ConfigValue;
import com.huaheng.pc.config.configValue.service.ConfigValueService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
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.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author mahua
 * @ClassName ReceivingService
 * @projectName huaheng
 * @description: TODO
 * @date 2019/8/3123:09
 */
@Service
public class ReceivingService {

    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private LocationService locationService;
    @Resource
    private MaterialService materialService;
    @Resource
    private MaterialTypeService materialTypeService;
    @Resource
    private ConfigValueService configValueService;
    @Resource
    private ReceiptPreferenceService preferenceService;
    @Resource
    private FilterConfigDetailService filterConfigDetailService;

    /**
     * 获取当前单号详情
     * @param receiptCode 入库单号
     * @return 入库单详情
     */
    @Transactional
    public AjaxResult<List<ReceiptDetail>> scanReceiptCode(String receiptCode)  {
        //根据仓库编码和入库单号查询入库单详情
        LambdaQueryWrapper<ReceiptDetail> lambda = new LambdaQueryWrapper<>();
        lambda.eq(ReceiptDetail::getReceiptCode, receiptCode)
                .eq(ReceiptDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());

        List<ReceiptDetail> detail = receiptDetailService.list(lambda);
        return AjaxResult.success(detail);
    }

    /**
     * 定位
     * @return
     */
    @Transactional
    public Boolean position(ReceiptContainerDetail receiptContainerDetail){
        ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getById(receiptContainerDetail.getReceiptContainerId());
        if (!(0 ==receiptContainerHeader.getStatus())){
            throw new ServiceException("该入库组盘已生成任务不能重新定位");
        }
        //如果入库组盘表中有目标库位说明已经指定
        if (StringUtils.isNotEmpty(receiptContainerHeader.getToLocation())){return true;}
        String locatingRule = receiptContainerHeader.getLocatingRule(); //定位规则
        if (StringUtils.isEmpty(locatingRule)){
            locatingRule = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId()).getLocatingRule();
            //入库单明细定位规则不为空时执行
            if (StringUtils.isEmpty(locatingRule)){
                //入库单明细为空时,查询物料表中是否含有定位规则
                LambdaQueryWrapper<Material> materialLambda = Wrappers.lambdaQuery();
                materialLambda.eq(Material::getCode, receiptContainerDetail.getMaterialCode())
                    .eq(Material::getWarehouseCode,ShiroUtils.getWarehouseCode());
                Material material = materialService.getOne(materialLambda);
                locatingRule = material.getLocatingRule();

                if (StringUtils.isEmpty(locatingRule)){
                    //物料表中定位规则为空时,查询物料类别
                    LambdaQueryWrapper<MaterialType> materialTypeLambda = Wrappers.lambdaQuery();
                    materialTypeLambda.eq(MaterialType::getCode, material.getType())
                    .eq(MaterialType::getWarehouseCode,ShiroUtils.getWarehouseCode());
                    MaterialType materialType = materialTypeService.getOne(materialTypeLambda);
                    locatingRule = materialType.getLocatingRule();
                    if (StringUtils.isEmpty(locatingRule)){
                        //物料类别中定位规则为空时,查询入库首选项
                        LambdaQueryWrapper<ConfigValue> configValueLambda = Wrappers.lambdaQuery();
                        configValueLambda.eq(ConfigValue::getWarehouseCode, ShiroUtils.getWarehouseCode())
                                .eq(ConfigValue::getModuleType, "receipt")
                                .eq(ConfigValue::getRecordType, "入库首选项");
                        ConfigValue configValue = configValueService.getOne(configValueLambda);
                        LambdaQueryWrapper<ReceiptPreference> lambdaQueryWrapper = Wrappers.lambdaQuery();
                        lambdaQueryWrapper.eq(ReceiptPreference::getCode, configValue.getValue())
                        .eq(ReceiptPreference::getWarehouseCode,ShiroUtils.getWarehouseCode());
                        ReceiptPreference receiptPreference = preferenceService.getOne(lambdaQueryWrapper);
                        locatingRule = preferenceService.getOne(lambdaQueryWrapper).getLocationRule();
                    }
                }
            }
        }
        //通过定位规则查找自定义sql
        if (StringUtils.isEmpty(locatingRule)){
            throw new ServiceException("未绑定定位规则");
        }
        LambdaQueryWrapper<FilterConfigDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(FilterConfigDetail::getCode, locatingRule)
        .eq(FilterConfigDetail::getWarehouseCode,ShiroUtils.getWarehouseCode());
        FilterConfigDetail filterConfigDetail = filterConfigDetailService.getOne(lambdaQueryWrapper);

        //根据定位规则查询库位编码
        LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery();
        locationLambda.last(filterConfigDetail.getStatement());
        String locationCode = locationService.getOne(locationLambda).getCode();
        if (locationCode == null){
            throw new ServiceException("没有库位可分配");
        }

        if (StringUtils.isNotEmpty(locationCode)){
            locationService.updateStatus(locationCode, "lock");
        } else {
            throw new ServiceException("定位失败,请检查定位规则是否正确");
        }

        //更新库位编码到组盘头表
        receiptContainerHeader.setToLocation(locationCode);
        receiptContainerHeader.setRecvDock("0");
        if (!receiptContainerHeaderService.updateById(receiptContainerHeader)){
            throw new ServiceException("更新库位失败");
        }

        //把库位编码赋到该入库组盘头表下的所有明细
        LambdaQueryWrapper<ReceiptContainerDetail> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeader.getId());
        List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(lambda);
        for (ReceiptContainerDetail receiptContainerDetail2: receiptContainerDetails) {
            receiptContainerDetail2.setLocationCode(locationCode);
            if (!receiptContainerDetailService.updateById(receiptContainerDetail2)){throw new ServiceException("更新库位编码到入库组盘明细");}
        }

        ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId()));
        //更新入库单详情状态
        if (!receiptDetailService.updateById(receiptDetail)){ throw new ServiceException("更新入库单详情失败");}
        //更新入库单头尾状态
        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());

        return true;
    }

    /**
     * 取消定位
     * @param receiptContainerDetail 入库组盘明细
     * @return
     */
    @Transactional
    public AjaxResult cancelPosition(ReceiptContainerDetail receiptContainerDetail){
        //查询入库组盘头
        ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getById(receiptContainerDetail.getReceiptContainerId());
        if (!(receiptContainerHeader.getStatus().shortValue() == QuantityConstant.RECEIPT_CONTAINER_BUILD)){
            throw new ServiceException("组盘已生成任务不能取消定位");
        }
        //将入库组盘头表中的而库位编码赋值null
        receiptContainerHeader.setToLocation("");
        if (!receiptContainerHeaderService.updateById(receiptContainerHeader)){
            throw new ServiceException("回滚入库组盘头失败");
        }

        //将入库组盘明细的库位修改为空
        LambdaQueryWrapper<ReceiptContainerDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerDetail.getReceiptContainerId());
        List<ReceiptContainerDetail> receiptContainerDetailList = receiptContainerDetailService.list(lambdaQueryWrapper);
        for (ReceiptContainerDetail receiptContainerDetail2 : receiptContainerDetailList) {
            receiptContainerDetail2.setLocationCode("");
            if (!receiptContainerDetailService.updateById(receiptContainerDetail2)){
                 throw new ServiceException("回滚入库组盘明细失败");
            }
        }

        //回滚入库明细状态
        ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId());
        receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POSITION.toString());
        if ( !receiptDetailService.updateById(receiptDetail)){
            throw new ServiceException("回滚入库明细状态失败");
        }

        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());

        return AjaxResult.success("取消定位成功");
    }
}