CycleCountServiceImpl.java 8.95 KB
package com.huaheng.api.general.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.CycCountDomain;
import com.huaheng.api.general.service.impl.CycleCountService;
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.configValue.domain.ConfigValue;
import com.huaheng.pc.config.configValue.service.ConfigValueService;
import com.huaheng.pc.config.cycleCountPreference.service.CycleCountPreferenceService;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailService;
import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
import com.huaheng.pc.inventory.cycleCountHeader.service.CycleCountHeaderService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.apache.http.annotation.Obsolete;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * Created by Enzo Cotter on 2019/11/4.
 *
 * @author mahuandong
 */
@Component
@Transactional(rollbackFor = Exception.class)
public class CycleCountServiceImpl implements CycleCountService {

    @Resource
    private CycleCountHeaderService cycleCountHeaderService;
    @Resource
    private CycleCountDetailService cycleCountDetailService;
    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private ConfigValueService configValueService;
    @Resource
    private CycleCountService cycleCountService;

    /**
     * 盘点单下发
     *
     * @param cycCountDomain 盘点单
     * @return 是否下发成功
     */
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult insertCycleCount(CycCountDomain cycCountDomain) {
        CycleCountHeader cycleCountHeader = cycCountDomain.getCycleCountHeader();
        if (cycleCountHeader == null || cycCountDomain.getInventoryId() == null) {
            return AjaxResult.error("主单据或库存id不能为空");
        }
        if (StringUtils.isEmpty(cycCountDomain.getCycleCountHeader().getCountType())) {
            return AjaxResult.error("盘点类型不能为空");
        }
        if (StringUtils.isEmpty(cycleCountHeader.getWarehouseCode())) {
            return AjaxResult.error("仓库编码不能为空");
        }
        if (StringUtils.isEmpty(cycleCountHeader.getCompanyCode())) {
            return AjaxResult.error("货主编码不能为空");
        }

        cycleCountHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
        cycleCountHeader.setCompanyCode(cycleCountHeader.getCompanyCode());
        cycleCountHeader.setCreated(new Date());
        cycleCountHeader.setCreatedBy(ShiroUtils.getLoginName());
        cycleCountHeader.setCode(cycleCountHeaderService.createCode());
        if (!cycleCountHeaderService.save(cycleCountHeader)) {
            return AjaxResult.error("新增盘点单失败");
        }
        AjaxResult ajaxResult = cycleCountService.addDetails(cycleCountHeader.getCode(), cycCountDomain.getInventoryId());
        if (Boolean.TRUE.equals(ajaxResult.hasErr())) {
            throw new ServiceException("新增盘点单明细失败");
        }
        return AjaxResult.success("新增成功");
    }

    /**
     * 新增盘点明细
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult addDetails(String cycleCountHeadCode, Integer[] inventoryHeaderIds) {

        if (cycleCountHeadCode == null) {
            throw new ServiceException("盘点主单编码不能为空");
        }

        LambdaQueryWrapper<CycleCountHeader> cycleCountHeaderQueryWrapper = Wrappers.lambdaQuery();
        cycleCountHeaderQueryWrapper.eq(CycleCountHeader::getCode, cycleCountHeadCode);
        CycleCountHeader cyclecountHeader = cycleCountHeaderService.getOne(cycleCountHeaderQueryWrapper);
        if (cyclecountHeader == null) {
            return AjaxResult.error("盘点主单据不存在");
        }
        cyclecountHeader.setCode(cycleCountHeadCode);
        if (cyclecountHeader.getStatusCyc().equals(QuantityConstant.CYCLECOUNT_STATUS_BUILD)) {
            return AjaxResult.error("盘点单非新建状态,无法再添加明细");
        }
        //默认盘点配置,首选项
        ConfigValue configValue = new ConfigValue();
        configValue.setModuleType("cyclecount");
        configValue.setWarehouseCode(ShiroUtils.getWarehouseCode());
        LambdaQueryWrapper<ConfigValue> configValueLambdaQueryWrapper = Wrappers.lambdaQuery(configValue);
        configValue = configValueService.getOne(configValueLambdaQueryWrapper);
        if (configValue == null) {
            throw new SecurityException("请先在配置中添加盘点配置");
        }
        String preferenceCode = configValue.getIdentifier();
        //获取已经存在的明细
        LambdaQueryWrapper<CycleCountDetail> cycleCountDetailQueryWrapper = Wrappers.lambdaQuery();
        cycleCountDetailQueryWrapper.eq(CycleCountDetail::getCycleCountHeadCode, cyclecountHeader.getCode());
        List<CycleCountDetail> cycleCountDetailList = cycleCountDetailService.list(cycleCountDetailQueryWrapper);
        if (cycleCountDetailList == null) {
            cycleCountDetailList = new ArrayList<>();
        }
        for (int inventoryHeaderId : inventoryHeaderIds) {
            //当前有盘点明细时验证是否已经生成盘点细单,生成则跳出该条循环
            boolean success = cycleCountDetailList.stream()
                    .anyMatch(t -> t.getInventoryHeaderId() != null && t.getInventoryHeaderId() == inventoryHeaderId);
            if (success) {
                continue;
            }
            //查询该条库存明细
            InventoryHeader inventoryHeader = inventoryHeaderService.getById(inventoryHeaderId);
            //写入盘点明细
            CycleCountDetail cycleCountDetail = new CycleCountDetail();
            cycleCountDetail.setPreferenceCode(preferenceCode);
            cycleCountDetail.setCycleCountHeadCode(cyclecountHeader.getCode());
            cycleCountDetail.setInventoryHeaderId(inventoryHeaderId);
            cycleCountDetail.setWarehouseCode(inventoryHeader.getWarehouseCode());
            /*cycleCountDetail.setCompanyCode(inventoryDetail.getCompanyCode());
            cycleCountDetail.setInventorySts(inventoryDetail.getInventorySts());*/
            //cycleCountDetail.setCountId(inventoryDetail.getId());
            cycleCountDetail.setLocationCode(inventoryHeader.getLocationCode());
            cycleCountDetail.setContainerCode(inventoryHeader.getContainerCode());
            /*cycleCountDetail.setMaterialCode(inventoryDetail.getMaterialCode());
            cycleCountDetail.setMaterialName(inventoryDetail.getMaterialName());
            cycleCountDetail.setMaterialSpec(inventoryDetail.getMaterialSpec());
            cycleCountDetail.setMaterialUnit(inventoryDetail.getMaterialUnit());*/
            cycleCountDetail.setSystemQty(inventoryHeader.getTotalQty());
            /*cycleCountDetail.setBatch(inventoryDetail.getBatch());
            cycleCountDetail.setLot(inventoryDetail.getLot());
            cycleCountDetail.setProjectNo(inventoryDetail.getProjectNo());*/
            cycleCountDetail.setCountedBy(cyclecountHeader.getCreatedBy());
            cycleCountDetail.setCountedAt(cyclecountHeader.getCreated());
            cycleCountDetail.setCreated(new Date());
            cycleCountDetail.setCreatedBy(ShiroUtils.getLoginName());
            cycleCountDetail.setLastUpdated(new Date());
            cycleCountDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            success = cycleCountDetailService.save(cycleCountDetail);
            if (!success) {
                throw new ServiceException("新增盘点单明细失败");
            }
            //更新库存盘点锁
            inventoryHeader.setLocking(1);
            success = inventoryHeaderService.updateById(inventoryHeader);
            if (!success) {
                throw new ServiceException("新增盘点单明细失败,更新库存锁失败");
            }
        }
        return AjaxResult.success("生成盘点明细成功");
    }
}