ReceivingService.java 7.09 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.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.service.ReceiptPreferenceService;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
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.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 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 (StringUtils.isNotEmpty(receiptContainerHeader.getToLocation())){return true;}
        String locatingRule = receiptContainerHeader.getLocatingRule(); //定位规则
        if (StringUtils.isNotEmpty(locatingRule)){
            //入库组盘头表中定位规则不为空时执行
        } else if ((locatingRule = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId()).getLocatingRule()) != null ){
            //入库单明细定位规则不为空时执行
        } else {
            //入库单明细为空时,查询物料表中是否含有定位规则
            LambdaQueryWrapper<Material> materialLambda = Wrappers.lambdaQuery();
            materialLambda.eq(Material::getCode, receiptContainerDetail.getMaterialCode());
            Material material = materialService.getOne(materialLambda);
            locatingRule = material.getLocatingRule();
            if (locatingRule == null){
                //物料表中定位规则为空时,查询物料类别
                LambdaQueryWrapper<MaterialType> materialTypeLambda = Wrappers.lambdaQuery();
                materialTypeLambda.eq(MaterialType::getCode, material.getType());
                MaterialType materialType = materialTypeService.getOne(materialTypeLambda);
                locatingRule = materialType.getLocatingRule();
                if (locatingRule == null){
                    //物料类别中定位规则为空时,查询入库首选项
                    LambdaQueryWrapper<ConfigValue> configValueLambda = Wrappers.lambdaQuery();
                    configValueLambda.eq(ConfigValue::getWarehouseCode, ShiroUtils.getWarehouseCode())
                            .eq(ConfigValue::getModuleType, "入库")
                            .eq(ConfigValue::getRecordType, "入库首选项");
                    ConfigValue configValue = configValueService.getOne(configValueLambda);
                    locatingRule = preferenceService.getById(configValue.getId()).getLocationRule();
                }
            }
        }
        //通过定位规则查找自定义sql
        if (StringUtils.isEmpty(locatingRule)){
            throw new ServiceException("未绑定定位规则");
        }
        LambdaQueryWrapper<FilterConfigDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(FilterConfigDetail::getCode, locatingRule);
        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);

        if (!receiptContainerHeaderService.updateById(receiptContainerHeader)){
            throw new ServiceException("更新库位失败");
        }

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

        return true;
    }
}