MaterialServiceImpl.java 13.6 KB
package com.huaheng.pc.config.material.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.common.exception.BusinessException;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.mobile.shipment.Materialforecast;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.mapper.MaterialMapper;
import com.huaheng.pc.config.materialType.domain.MaterialType;
import com.huaheng.pc.config.materialType.service.MaterialTypeService;
import com.huaheng.pc.config.materialUnit.domain.MaterialUnit;
import com.huaheng.pc.config.materialUnit.service.MaterialUnitService;
import com.huaheng.pc.config.station.domain.Station;
import com.huaheng.pc.config.station.service.StationService;
import com.huaheng.pc.config.zone.domain.Zone;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Service("Material")
public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {

    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private MaterialUnitService materialUnitService;
    @Resource
    private StationService stationService;
    @Resource
    private MaterialTypeService materialTypeService;
    @Resource
    private MaterialMapper materialMapper;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private CompanyService companyService;


    @Override
    public AjaxResult removeByIds(String ids) {
        int count = 0;
        for (Integer id : Convert.toIntArray(ids)) {
            Material material = this.getById(id);
            LambdaQueryWrapper<ReceiptDetail> lambda = Wrappers.lambdaQuery();
            lambda.eq(ReceiptDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
                    .eq(ReceiptDetail::getMaterialCode, material.getCode())
                    .eq(ReceiptDetail::getDeleted, false)
                    .last("LIMIT 1");
            Map<String, Object> map = receiptDetailService.getMap(lambda);
            if (map != null) {
                return AjaxResult.error("物料编码(" + material.getCode() + ")存在入库单,不能删除!");
            }

            if (this.removeById(material)) {
                count++;
            }
            LambdaQueryWrapper<MaterialUnit> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(MaterialUnit::getMaterialCode, material.getCode());
            //如果不存在该物料的单位是新建物料单位
            materialUnitService.remove(lambdaQueryWrapper);

        }
        return AjaxResult.success("成功删除" + count + "条记录");
    }

    /**
     * 导入物料数据
     *
     * @param materialList 用户数据列表
     * @param operName     操作用户
     * @return 结果
     */
    @Override
    public String importMaterial(List<Material> materialList, Boolean isUpdateSupport, String operName) {
        if (StringUtils.isNull(materialList) || materialList.size() == 0) {
            throw new BusinessException("导入数据不能为空!");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (Material material : materialList) {
            try {
                LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
                lambdaQueryWrapper.eq(Material::getCode, material.getCode());
                // 验证是否存在这个用户
                Material m = this.getOne(lambdaQueryWrapper);
                if (m != null) {
                    materialMapper.delete(lambdaQueryWrapper);
                    m = null;
                }

                if (StringUtils.isNull(m)) {
                    System.out.println(ShiroUtils.getLoginName());
                    material.setCreatedBy(ShiroUtils.getUser().getLoginName());
                    material.setLastUpdatedBy(ShiroUtils.getLoginName());
                    material.setCompanyCode("SANY");
                    material.setWarehouseCode("CS0001");
                    material.setType("raw");

                    if (material.getSpec().equals("变速箱")) {
                        material.setMaterialAreaCode("A");
                    }
                    if (material.getSpec().equals("发动机")) {
                        material.setMaterialAreaCode("B");
                    }
                    if (material.getSpec().contains("车架长")) {
                        material.setMaterialAreaCode("A");
                    }
                    if (material.getSpec().contains("车架短")) {
                        material.setMaterialAreaCode("B");
                    }
                    if (material.getSpec().equals("前桥")) {
                        material.setMaterialAreaCode("Q");
                    }
                    if (material.getSpec().equals("平衡悬架")) {
                        material.setMaterialAreaCode("W");
                    }
                    if (material.getSpec().equals("中桥")) {
                        material.setMaterialAreaCode("E");
                    }
                    if (material.getSpec().equals("后桥")) {
                        material.setMaterialAreaCode("R");
                    }
                    if (material.getSpec().equals("前桥板簧")) {
                        material.setMaterialAreaCode("T");
                    }
                    if (material.getSpec().equals("平衡悬架板簧")) {
                        material.setMaterialAreaCode("Y");
                    }
                    this.save(material);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、编码 " + material.getCode() + " 导入成功");
                }
            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "、编码" + material.getCode() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
                log.error(msg, e);
            }
        }
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new BusinessException(failureMsg.toString());
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
    }


    //查询类型
    @Override
    public List<Station> getSpec() {
        LambdaQueryWrapper<Station> lambda = Wrappers.lambdaQuery();
        lambda.select(Station::getCode, Station::getDestination);
        List<Station> list = stationService.list(lambda);
        list=list.stream().filter(s -> StringUtils.isNotEmpty(s.getDestination())).collect(Collectors.toList());
        return list;
    }

    @Override
    public List<Station> getSpec2() {
        LambdaQueryWrapper<Station> lambda = Wrappers.lambdaQuery();
        lambda.select(Station::getCode, Station::getDestination);
        List<Station> list = stationService.list(lambda);
        return list;
    }


    /**
     * 添加物料
     *
     * @param material
     * @return
     */
    @Override
    public AjaxResult addSave(Material material) {
        LambdaQueryWrapper<Material> lambda = Wrappers.lambdaQuery();
        //如果物料编码为空则生成物料编码
        if (material.getCode() == null) {
            material.setCode(createCode(material.getType()));
        }
        lambda.eq(Material::getCode, material.getCode())
                .eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(Material::getDeleted, false);
        Map<String, Object> map = this.getMap(lambda);
        if (map != null) {
            return AjaxResult.error("物料已经存在");
        }

        LambdaQueryWrapper<MaterialUnit> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(MaterialUnit::getMaterialCode, material.getCode())
                .eq(MaterialUnit::getUnit, material.getUnit());
        //如果不存在该物料的单位是新建物料单位
        if (materialUnitService.getOne(lambdaQueryWrapper) == null) {
            MaterialUnit materialUnit = new MaterialUnit();
            materialUnit.setMaterialCode(material.getCode());
            materialUnit.setMaterialName(material.getName());
            materialUnit.setMaterialSpec(material.getSpec());
            materialUnit.setCompanyCode(material.getCompanyCode());
            materialUnit.setWarehouseCode(ShiroUtils.getWarehouseCode());
            materialUnit.setUnit(material.getUnit());
            materialUnit.setCreatedBy(ShiroUtils.getLoginName());
            materialUnit.setLastUpdatedBy(ShiroUtils.getLoginName());

            try {
                materialUnitService.save(materialUnit);
            } catch (Exception e) {
                materialUnitService.updateById(materialUnit);
            }
        }
        material.setWarehouseCode(ShiroUtils.getWarehouseCode());
        material.setCreatedBy(ShiroUtils.getLoginName());
        material.setLastUpdatedBy(ShiroUtils.getLoginName());
        material.setLocatingRule(null);
        material.setAllocationRule(null);
        material.setReplenishmentRule(null);
        material.setEmptyLocRule(null);
        material.setReceivingFlow(null);
        material.setShippingFlow(null);
        Boolean flag = this.save(material);
        if (flag == false) {
            return AjaxResult.error("新增物料失败,存入数据库时报错");
        }
        return AjaxResult.success("新增物料成功");
    }

    @Override
    public Material findAllByCode(String code) {
        String warehouseCode = ShiroUtils.getWarehouseCode();
        LambdaQueryWrapper<Material> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Material::getCode, code);
        queryWrapper.eq(Material::getWarehouseCode, warehouseCode);
        Material material = getOne(queryWrapper);
        return material;
    }

    @Override
    public Material findAllByCode(String code, String warehouseCode) {
        LambdaQueryWrapper<Material> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Material::getCode, code);
        queryWrapper.eq(Material::getWarehouseCode, warehouseCode);
        Material material = getOne(queryWrapper);
        return material;
    }


    @Override
    public List<Material> findLatest() {
        return materialMapper.findLatest();
    }

    /**
     * 获得物料联想词
     *
     * @param code
     * @return
     */
    @Override
    public List<Materialforecast> getMaterialForecast(String code) {
        List<Materialforecast> forecast = new ArrayList<>();
        LambdaQueryWrapper<InventoryDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery();
        detailLambdaQueryWrapper.eq(InventoryDetail::getMaterialCode, code)
                .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .in(InventoryDetail::getCompanyCode, ShiroUtils.getCompanyCodeList());
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(detailLambdaQueryWrapper);
        if (!inventoryDetailList.isEmpty()) {
            for (InventoryDetail inventoryDetail : inventoryDetailList) {
                Materialforecast materialforecast = new Materialforecast();
                materialforecast.setMaterialCode(inventoryDetail.getMaterialCode());
                materialforecast.setType(0);
                forecast.add(materialforecast);
            }
        } else {
            detailLambdaQueryWrapper = Wrappers.lambdaQuery();
            detailLambdaQueryWrapper.like(InventoryDetail::getMaterialName, code)
                    .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
                    .in(InventoryDetail::getCompanyCode, ShiroUtils.getCompanyCodeList());
            List<InventoryDetail> inventoryDetailList1 = inventoryDetailService.list(detailLambdaQueryWrapper);
            if (!inventoryDetailList1.isEmpty()) {
                for (InventoryDetail inventoryDetail : inventoryDetailList) {
                    Materialforecast materialforecast = new Materialforecast();
                    materialforecast.setMaterialCode(inventoryDetail.getMaterialCode());
                    materialforecast.setType(0);
                    forecast.add(materialforecast);
                }
            }
        }
        return null;
    }

    /**
     * 生成物料编码
     *
     * @param code
     * @return
     */
    private String createCode(String code) {
        LambdaQueryWrapper<MaterialType> lambda = Wrappers.lambdaQuery();
        lambda.eq(MaterialType::getCode, code);
        MaterialType materialType = materialTypeService.getOne(lambda);

        return String.format(materialType.getAutoGenSerialNumFormat(), materialType.getTrackSerialNum());
    }
}