package doumeemes.service.business.impl; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.fasterxml.jackson.databind.util.JSONPObject; 
 | 
import doumeemes.biz.system.SystemDictDataBiz; 
 | 
import doumeemes.core.constants.ResponseStatus; 
 | 
import doumeemes.core.exception.BusinessException; 
 | 
import doumeemes.core.model.ApiResponse; 
 | 
import doumeemes.core.model.LoginUserInfo; 
 | 
import doumeemes.core.model.PageData; 
 | 
import doumeemes.core.model.PageWrap; 
 | 
import doumeemes.core.utils.Constants; 
 | 
import doumeemes.core.utils.DateUtil; 
 | 
import doumeemes.core.utils.Utils; 
 | 
import doumeemes.core.utils.redis.RedisUtil; 
 | 
import doumeemes.dao.business.*; 
 | 
import doumeemes.dao.business.model.*; 
 | 
import doumeemes.dao.ext.*; 
 | 
import doumeemes.dao.ext.bean.*; 
 | 
import doumeemes.dao.ext.beanDto.*; 
 | 
import doumeemes.dao.ext.dto.QueryWorkorderUserExtDTO; 
 | 
import doumeemes.dao.ext.dto.ScanWTransferExtDTO; 
 | 
import doumeemes.dao.ext.vo.CompanyExtListVO; 
 | 
import doumeemes.dao.ext.vo.DepartmentExtListVO; 
 | 
import doumeemes.dao.ext.vo.WorkorderRecordExtListVO; 
 | 
import doumeemes.dao.system.SystemDictDataMapper; 
 | 
import doumeemes.dao.system.model.SystemDictData; 
 | 
import doumeemes.service.business.WOutboundService; 
 | 
import doumeemes.service.business.WTransferService; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.baomidou.mybatisplus.core.metadata.IPage; 
 | 
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 
 | 
import doumeemes.service.ext.NoticesExtService; 
 | 
import doumeemes.service.ext.WStockRecordExtService; 
 | 
import net.sf.json.JSONArray; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.shiro.SecurityUtils; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.util.CollectionUtils; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.util.*; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 仓库管理-换库单信息表Service实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2022/04/20 09:37 
 | 
 */ 
 | 
@Service 
 | 
public class WTransferServiceImpl implements WTransferService { 
 | 
    @Autowired 
 | 
    private RedisTemplate<String, Object> redisTemplate; 
 | 
  
 | 
    @Autowired 
 | 
    private WTransferMapper wTransferMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WTransferExtMapper wTransferExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WarehouseMapper warehouseMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WTransferDetailMapper wTransferDetailMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WTransferDetailExtMapper wTransferDetailExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WOutboundExtMapper wOutboundExtMapper; 
 | 
    @Autowired 
 | 
    private WOutboundMapper wOutboundMapper; 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private WorkorderRecordExtMapper workorderRecordExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WOutboundRecordMapper wOutboundRecordMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private CompanyUserExtMapper companyUserExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private DepartmentExtMapper departmentExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WorkorderExtMapper workorderExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WOutboundService wOutboundService; 
 | 
  
 | 
    @Autowired 
 | 
    private DeviceExtMapper deviceExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WOutboundDetailExtMapper wOutboundDetailExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WOutboundDetailMapper wOutboundDetailMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WOutboundRecordExtMapper wOutboundRecordExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private AppliancesExtMapper appliancesExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private AppliancesMapper appliancesMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WStockExtMapper wStockExtMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private DeviceMapper deviceMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private NoticesExtService noticesExtService; 
 | 
    @Autowired 
 | 
    private CompanyUserMapper companyUserMapper; 
 | 
    @Autowired 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
    @Autowired 
 | 
    private WStockMapper wStockMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WHistoryMapper wHistoryMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WorkorderUserExtMapper workorderUserExtMapper; 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private SystemDictDataMapper systemDictDataMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WStockRecordExtService wStockRecordExtService; 
 | 
  
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private MaterialDistributeMapper materialDistributeMapper; 
 | 
  
 | 
    @Override 
 | 
    public Integer create(WTransfer wTransfer) { 
 | 
        wTransferMapper.insert(wTransfer); 
 | 
        return wTransfer.getId(); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteById(Integer id) { 
 | 
        wTransferMapper.deleteById(id); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void delete(WTransfer wTransfer) { 
 | 
        UpdateWrapper<WTransfer> deleteWrapper = new UpdateWrapper<>(wTransfer); 
 | 
        wTransferMapper.delete(deleteWrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void deleteByIdInBatch(List<Integer> ids) { 
 | 
        if (CollectionUtils.isEmpty(ids)) { 
 | 
            return; 
 | 
        } 
 | 
        wTransferMapper.deleteBatchIds(ids); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void updateById(WTransfer wTransfer) { 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void updateByIdInBatch(List<WTransfer> wTransfers) { 
 | 
        if (CollectionUtils.isEmpty(wTransfers)) { 
 | 
            return; 
 | 
        } 
 | 
        for (WTransfer wTransfer: wTransfers) { 
 | 
            this.updateById(wTransfer); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public WTransfer findById(Integer id) { 
 | 
        return wTransferMapper.selectById(id); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public WTransfer findOne(WTransfer wTransfer) { 
 | 
        QueryWrapper<WTransfer> wrapper = new QueryWrapper<>(wTransfer); 
 | 
        return wTransferMapper.selectOne(wrapper); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public List<WTransfer> findList(WTransfer wTransfer) { 
 | 
        QueryWrapper<WTransfer> wrapper = new QueryWrapper<>(wTransfer); 
 | 
        return wTransferMapper.selectList(wrapper); 
 | 
    } 
 | 
   
 | 
    @Override 
 | 
    public PageData<WTransfer> findPage(PageWrap<WTransfer> pageWrap) { 
 | 
        IPage<WTransfer> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); 
 | 
        QueryWrapper<WTransfer> queryWrapper = new QueryWrapper<>(); 
 | 
        Utils.MP.blankToNull(pageWrap.getModel()); 
 | 
        if (pageWrap.getModel().getId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getId, pageWrap.getModel().getId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getDeleted() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getDeleted, pageWrap.getModel().getDeleted()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getCreateUser() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getCreateUser, pageWrap.getModel().getCreateUser()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getCreateTime() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime())); 
 | 
            queryWrapper.lambda().le(WTransfer::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getUpdateUser() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getUpdateUser, pageWrap.getModel().getUpdateUser()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getUpdateTime() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime())); 
 | 
            queryWrapper.lambda().le(WTransfer::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getRemark() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getRemark, pageWrap.getModel().getRemark()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getRootDepartId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getRootDepartId, pageWrap.getModel().getRootDepartId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getCode() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getCode, pageWrap.getModel().getCode()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOrigin() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOrigin, pageWrap.getModel().getOrigin()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getValidDate() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getValidDate, Utils.Date.getStart(pageWrap.getModel().getValidDate())); 
 | 
            queryWrapper.lambda().le(WTransfer::getValidDate, Utils.Date.getEnd(pageWrap.getModel().getValidDate())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOriginType() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOriginType, pageWrap.getModel().getOriginType()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOriginCode() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOriginCode, pageWrap.getModel().getOriginCode()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOriginId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOriginId, pageWrap.getModel().getOriginId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getAbstracts() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getAbstracts, pageWrap.getModel().getAbstracts()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOutDepartId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOutDepartId, pageWrap.getModel().getOutDepartId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOutUserId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOutUserId, pageWrap.getModel().getOutUserId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOutWarehouseId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getOutWarehouseId, pageWrap.getModel().getOutWarehouseId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOutPlandate() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getOutPlandate, Utils.Date.getStart(pageWrap.getModel().getOutPlandate())); 
 | 
            queryWrapper.lambda().le(WTransfer::getOutPlandate, Utils.Date.getEnd(pageWrap.getModel().getOutPlandate())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getOutActdate() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getOutActdate, Utils.Date.getStart(pageWrap.getModel().getOutActdate())); 
 | 
            queryWrapper.lambda().le(WTransfer::getOutActdate, Utils.Date.getEnd(pageWrap.getModel().getOutActdate())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getInDepartId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getInDepartId, pageWrap.getModel().getInDepartId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getInUserId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getInUserId, pageWrap.getModel().getInUserId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getInWarehouseId() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getInWarehouseId, pageWrap.getModel().getInWarehouseId()); 
 | 
        } 
 | 
        if (pageWrap.getModel().getInPlandate() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getInPlandate, Utils.Date.getStart(pageWrap.getModel().getInPlandate())); 
 | 
            queryWrapper.lambda().le(WTransfer::getInPlandate, Utils.Date.getEnd(pageWrap.getModel().getInPlandate())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getInActdate() != null) { 
 | 
            queryWrapper.lambda().ge(WTransfer::getInActdate, Utils.Date.getStart(pageWrap.getModel().getInActdate())); 
 | 
            queryWrapper.lambda().le(WTransfer::getInActdate, Utils.Date.getEnd(pageWrap.getModel().getInActdate())); 
 | 
        } 
 | 
        if (pageWrap.getModel().getStatus() != null) { 
 | 
            queryWrapper.lambda().eq(WTransfer::getStatus, pageWrap.getModel().getStatus()); 
 | 
        } 
 | 
        for(PageWrap.SortData sortData: pageWrap.getSorts()) { 
 | 
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { 
 | 
                queryWrapper.orderByDesc(sortData.getProperty()); 
 | 
            } else { 
 | 
                queryWrapper.orderByAsc(sortData.getProperty()); 
 | 
            } 
 | 
        } 
 | 
        return PageData.from(wTransferMapper.selectPage(page, queryWrapper)); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public long count(WTransfer wTransfer) { 
 | 
        QueryWrapper<WTransfer> wrapper = new QueryWrapper<>(wTransfer); 
 | 
        return wTransferMapper.selectCount(wrapper); 
 | 
    } 
 | 
  
 | 
    public String sub(WTransferDetailBean i){ 
 | 
        StringBuffer sub = new StringBuffer(); 
 | 
        sub.append(i.getMaterialId() 
 | 
                +i.getUnitId() 
 | 
                +i.getQualityType() 
 | 
        ); 
 | 
        if(!Objects.isNull(i.getOutWarehouseId())){ 
 | 
            sub.append(i.getOutWarehouseId()); 
 | 
        } 
 | 
        if(!Objects.isNull(i.getInWarehouseId())){ 
 | 
            sub.append(i.getInWarehouseId()); 
 | 
        } 
 | 
//        if(!Objects.isNull(i.getOutLocationId())){ 
 | 
//            sub.append(i.getOutLocationId()); 
 | 
//        } 
 | 
//        if(!Objects.isNull(i.getInLocationId())){ 
 | 
//            sub.append(i.getInLocationId()); 
 | 
//        } 
 | 
        if(!Objects.isNull(i.getBatch())){ 
 | 
            sub.append(i.getBatch()); 
 | 
        } 
 | 
        if(!Objects.isNull(i.getProcedureId())){ 
 | 
            sub.append(i.getProcedureId()); 
 | 
        } 
 | 
        return  sub.toString(); 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse saveBean(WTransferBean wTransferBean, LoginUserInfo loginUserInfo){ 
 | 
        WTransfer wTransfer = new WTransfer(); 
 | 
        wTransfer.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
        wTransfer.setOrigin(wTransferBean.getOrigin()); 
 | 
        wTransfer.setOriginType(wTransferBean.getOriginType()); 
 | 
        wTransfer.setOriginCode(wTransferBean.getOriginCode()); 
 | 
        wTransfer.setOriginId(wTransferBean.getOriginId()); 
 | 
        wTransfer.setOutDepartId(wTransferBean.getOutDepartId()); 
 | 
        wTransfer.setInDepartId(wTransferBean.getInDepartId()); 
 | 
        wTransfer.setOutWarehouseId(wTransferBean.getOutWarehouseId()); 
 | 
        wTransfer.setInWarehouseId(wTransferBean.getInWarehouseId()); 
 | 
        wTransfer.setOutUserId(wTransferBean.getOutUserId()); 
 | 
        wTransfer.setInUserId(wTransferBean.getInUserId()); 
 | 
        wTransfer.setOutPlandate(wTransferBean.getOutPlandate()); 
 | 
        wTransfer.setInPlandate(wTransferBean.getInPlandate()); 
 | 
        wTransfer.setType(wTransferBean.getType()); 
 | 
        wTransfer.setCreateTime(new Date()); 
 | 
        wTransfer.setAbstracts(wTransferBean.getAbstracts()); 
 | 
        wTransfer.setCreateUser(loginUserInfo.getId()); 
 | 
        wTransfer.setCode(getNextCode(loginUserInfo.getCompany().getId())); 
 | 
        wTransfer.setValidDate(new Date()); 
 | 
        wTransfer.setBackorderId(wTransferBean.getBackOrderId()); 
 | 
  
 | 
        Warehouse warehouseOut =  warehouseMapper.selectById(wTransferBean.getOutWarehouseId()); 
 | 
        if(Objects.isNull(warehouseOut)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转出仓库信息异常"); 
 | 
        } 
 | 
        wTransfer.setOutDepartId(warehouseOut.getDepartId()); 
 | 
        wTransfer.setOutUserId(warehouseOut.getManagerId()); 
 | 
        Warehouse warehouseIn =  warehouseMapper.selectById(wTransferBean.getInWarehouseId()); 
 | 
        if(Objects.isNull(warehouseIn)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转入仓库信息异常"); 
 | 
        } 
 | 
        wTransfer.setInDepartId(warehouseIn.getDepartId()); 
 | 
        wTransfer.setStatus(Constants.ZERO); 
 | 
        wTransferMapper.insert(wTransfer); 
 | 
        //处理明细数据 
 | 
        List<WTransferDetailBean> wTransferDetailBeanList = wTransferBean.getWTransferDetailBeanList(); 
 | 
        if(wTransferDetailBeanList.size()<=0){ 
 | 
            throw new BusinessException(ResponseStatus.ITEM_ERR_STATUS.getCode(), "请选择转库物料信息"); 
 | 
        } 
 | 
  
 | 
        Map<String, List<WTransferDetailBean>> wTransferDetailBeanMap = wTransferDetailBeanList.stream() 
 | 
                .collect(Collectors.groupingBy(i -> this.sub(i))); 
 | 
        Iterator<String> iter = wTransferDetailBeanMap.keySet().iterator(); 
 | 
        while(iter.hasNext()) { 
 | 
            String key = iter.next(); 
 | 
            //获取当前行处理数据 
 | 
            List<WTransferDetailBean> wOutboundInBodyBeanList = wTransferDetailBeanMap.get(key); 
 | 
            BigDecimal sumNum = BigDecimal.ZERO; 
 | 
            if(wOutboundInBodyBeanList.size()>0){ 
 | 
                for (WTransferDetailBean wTransferDetailBean:wOutboundInBodyBeanList) { 
 | 
                    sumNum = sumNum.add(wTransferDetailBean.getOutPlanNum()); 
 | 
                } 
 | 
                WTransferDetailBean w = wOutboundInBodyBeanList.get(Constants.ZERO); 
 | 
                WTransferDetail wTransferDetail = new WTransferDetail(); 
 | 
                wTransferDetail.setUnitId(w.getUnitId()); 
 | 
                wTransferDetail.setMaterialId(w.getMaterialId()); 
 | 
                wTransferDetail.setBatch(w.getBatch()); 
 | 
                wTransferDetail.setOutPlannum(sumNum); 
 | 
                wTransferDetail.setOutWarehouseId(wTransferBean.getOutWarehouseId()); 
 | 
                wTransferDetail.setInWarehouseId(wTransferBean.getInWarehouseId()); 
 | 
    //            if(Objects.isNull(wTransferDetail.getBatch())||Objects.isNull(wTransferDetail.getOutPlannum()) 
 | 
    //                    ||Objects.isNull(wTransferDetail.getMaterialId())||Objects.isNull(wTransferDetail.getUnitId())){ 
 | 
    //                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "入参数据异常"); 
 | 
    //            } 
 | 
                if(Objects.isNull(wTransferDetail.getOutPlannum()) 
 | 
                        ||Objects.isNull(wTransferDetail.getMaterialId())||Objects.isNull(wTransferDetail.getUnitId())){ 
 | 
                    throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "入参数据异常"); 
 | 
                } 
 | 
                wTransferDetail.setCreateUser(loginUserInfo.getId()); 
 | 
                wTransferDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
                wTransferDetail.setTransferId(wTransfer.getId()); 
 | 
                wTransferDetail.setOutDepartId(wTransfer.getOutDepartId()); 
 | 
                wTransferDetail.setOutWarehouseId(wTransfer.getOutWarehouseId()); 
 | 
                wTransferDetail.setInDepartId(wTransfer.getInDepartId()); 
 | 
                wTransferDetail.setInWarehouseId(wTransfer.getInWarehouseId()); 
 | 
                wTransferDetail.setInLcoationId(w.getInLocationId()); 
 | 
                wTransferDetail.setQualityType(w.getQualityType()); 
 | 
                wTransferDetail.setProcedureId(w.getProcedureId()); 
 | 
                wTransferDetailExtMapper.insert(wTransferDetail); 
 | 
            } 
 | 
  
 | 
        } 
 | 
  
 | 
//        wTransferDetailBeanList.forEach(i->{ 
 | 
//            WTransferDetail wTransferDetail = new WTransferDetail(); 
 | 
//            wTransferDetail.setUnitId(i.getUnitId()); 
 | 
//            wTransferDetail.setMaterialId(i.getMaterialId()); 
 | 
//            wTransferDetail.setBatch(i.getBatch()); 
 | 
//            wTransferDetail.setOutPlannum(i.getOutPlanNum()); 
 | 
//            wTransferDetail.setOutWarehouseId(wTransferBean.getOutWarehouseId()); 
 | 
//            wTransferDetail.setInWarehouseId(wTransferBean.getInWarehouseId()); 
 | 
////            if(Objects.isNull(wTransferDetail.getBatch())||Objects.isNull(wTransferDetail.getOutPlannum()) 
 | 
////                    ||Objects.isNull(wTransferDetail.getMaterialId())||Objects.isNull(wTransferDetail.getUnitId())){ 
 | 
////                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "入参数据异常"); 
 | 
////            } 
 | 
//            if(Objects.isNull(wTransferDetail.getOutPlannum()) 
 | 
//                    ||Objects.isNull(wTransferDetail.getMaterialId())||Objects.isNull(wTransferDetail.getUnitId())){ 
 | 
//                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "入参数据异常"); 
 | 
//            } 
 | 
//            wTransferDetail.setCreateUser(loginUserInfo.getId()); 
 | 
//            wTransferDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
//            wTransferDetail.setTransferId(wTransfer.getId()); 
 | 
//            wTransferDetail.setOutDepartId(wTransfer.getOutDepartId()); 
 | 
//            wTransferDetail.setOutWarehouseId(wTransfer.getOutWarehouseId()); 
 | 
//            wTransferDetail.setInDepartId(wTransfer.getInDepartId()); 
 | 
//            wTransferDetail.setInWarehouseId(wTransfer.getInWarehouseId()); 
 | 
//            wTransferDetail.setInLcoationId(i.getInLocationId()); 
 | 
//            wTransferDetail.setQualityType(i.getQualityType()); 
 | 
//            wTransferDetail.setProcedureId(i.getProcedureId()); 
 | 
//            wTransferDetailExtMapper.insert(wTransferDetail); 
 | 
//        }); 
 | 
  
 | 
        CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",wTransfer.getOutUserId()) 
 | 
                .eq("DELETED",0) 
 | 
                .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
        ); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库仓管员信息【"+wTransfer.getOutUserId()+"】"); 
 | 
        } 
 | 
  
 | 
        Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()); 
 | 
        if(Objects.isNull(notices_type_transfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单类型信息【"+wTransfer.getType()+"】"); 
 | 
        } 
 | 
  
 | 
        sendOutNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),notices_type_transfer,Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.out)); 
 | 
  
 | 
        //记录操作记录 
 | 
        WHistory wHistory = wTransfer.toWHistory(loginUserInfo); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
  
 | 
        return ApiResponse.success(wTransfer); 
 | 
    } 
 | 
  
 | 
  
 | 
    public void sendOutNotice(Integer userId ,Integer billId , String billCode ,Constants.Notices_Type_Transfer notices_type_transfer,String url){ 
 | 
        //发送通知 
 | 
        Notices notices = new Notices(); 
 | 
        notices.setCompanyUserId(userId); 
 | 
        notices.setType(notices_type_transfer.getNoticeOutType()); 
 | 
        notices.setContent("【"+billCode+"】"+ notices_type_transfer.getContent().replace("{optType}","出库")); 
 | 
        notices.setTitle(notices_type_transfer.getTitle()); 
 | 
        notices.setObjId(billId); 
 | 
        notices.setUrl(url.replace("{id}",billId.toString())); 
 | 
        noticesExtService.sendNotice(notices); 
 | 
    } 
 | 
    public void sendOutNotice(LoginUserInfo user,Integer userId ,Integer billId , String billCode ,Constants.Notices_Type_Transfer notices_type_transfer,String url){ 
 | 
        //发送通知 
 | 
        Notices notices = new Notices(); 
 | 
        notices.setCompanyUserId(userId); 
 | 
        notices.setType(notices_type_transfer.getNoticeOutType()); 
 | 
        notices.setContent("【"+billCode+"】"+ notices_type_transfer.getContent().replace("{optType}","出库")); 
 | 
        notices.setTitle(notices_type_transfer.getTitle()); 
 | 
        notices.setObjId(billId); 
 | 
        notices.setUrl(url.replace("{id}",billId.toString())); 
 | 
        noticesExtService.sendNoticeNologin(notices,user); 
 | 
    } 
 | 
  
 | 
    public void sendInNotice(Integer userId ,Integer billId , String billCode ,Constants.Notices_Type_Transfer notices_type_transfer,String url){ 
 | 
        //发送通知 
 | 
        Notices notices = new Notices(); 
 | 
        notices.setCompanyUserId(userId); 
 | 
        notices.setType(notices_type_transfer.getNoticeInType()); 
 | 
        notices.setContent("【"+billCode+"】"+ notices_type_transfer.getContent().replace("{optType}","入库")); 
 | 
        notices.setTitle(notices_type_transfer.getTitle()); 
 | 
        notices.setObjId(billId); 
 | 
        notices.setUrl(url.replace("{id}",billId.toString())); 
 | 
        noticesExtService.sendNotice(notices); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public WTransfer getBeanById(Integer id){ 
 | 
        WTransfer wTransfer = wTransferExtMapper.wTransferById(id); 
 | 
        wTransfer.setWTransferDetailList(wTransferDetailExtMapper.wTransferDetailListById(id)); 
 | 
        return wTransfer; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    @Override 
 | 
    public synchronized  String  getNextCode(Integer comId){ 
 | 
        String prefix =  "ZK-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; 
 | 
        Integer countNum  = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_TRANSFER_KEY+comId,Integer.class); 
 | 
        countNum = Constants.formatIntegerNum(countNum)+1; 
 | 
        //更新缓存 
 | 
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_TRANSFER_KEY+comId,countNum); 
 | 
        String nextIndex =Integer.toString( countNum); 
 | 
        return prefix + StringUtils.leftPad(nextIndex,4,"0"); 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse cancel(Integer id,String detail,LoginUserInfo loginUserInfo){ 
 | 
        WTransfer wTransfer =  wTransferExtMapper.selectById(id); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到对象信息"); 
 | 
        } 
 | 
        if(1 ==wTransfer.getStatus()||2 == wTransfer.getStatus()){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "单据已处理,无法取消"); 
 | 
        }else if(3 == wTransfer.getStatus()){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "单据已取消"); 
 | 
        } 
 | 
        wTransfer.setStatus(3); 
 | 
        wTransfer.setCancelDate(new Date()); 
 | 
        wTransfer.setCancelInfo(detail); 
 | 
        wTransfer.setCancelUserId(loginUserInfo.getId()); 
 | 
        wTransferExtMapper.updateById(wTransfer); 
 | 
  
 | 
        //记录操作记录 
 | 
        WHistory wHistory = wTransfer.toWHistory(loginUserInfo); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
  
 | 
        //取消通知 
 | 
        noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()).getNoticeOutType(),null); 
 | 
        return ApiResponse.success(wTransfer); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public ApiResponse<WTransferConfirmBean> wTransferConfirm(Integer id){ 
 | 
        WTransfer wTransfer = wTransferExtMapper.selectOne(new QueryWrapper<WTransfer>().eq("id",id)); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(wTransfer.getStatus()!=Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误无法进行备料确认,请检查单据状态"); 
 | 
        } 
 | 
        if(wTransfer.getType()!=Constants.THREE){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据类型错误"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne( 
 | 
                new QueryWrapper<CompanyUser>() 
 | 
                        .eq("USER_ID",wTransfer.getInUserId()) 
 | 
                        .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                        .eq("deleted","0") 
 | 
        ); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
        WTransferConfirmBean wTransferConfirmBean = new WTransferConfirmBean(); 
 | 
        wTransferConfirmBean.setTransferNo(wTransfer.getCode()); 
 | 
        wTransferConfirmBean.setValidDate(wTransfer.getValidDate()); 
 | 
        wTransferConfirmBean.setWorker(companyUser.getName()); 
 | 
        wTransferConfirmBean.setGroupName(department.getName()); 
 | 
  
 | 
//        wTransferConfirmBean.setDeviceList(deviceMapper.selectList(new QueryWrapper<Device>() 
 | 
//                .apply(" PRODUCE_WAREHOUSE_LOCATION_ID in (  select w.IN_LCOATION_ID from w_transfer_detail w where w.TRANSFER_ID = "+wTransfer.getId()+" )") 
 | 
//        )); 
 | 
  
 | 
        wTransferConfirmBean.setDeviceList(deviceMapper.selectList(new QueryWrapper<Device>() 
 | 
                        .apply(" id in ( select w.PRO_GROUP_ID from  workorder w  where FIND_IN_SET(w.id,'"+wTransfer.getOriginId()+"') ) ") 
 | 
        )); 
 | 
  
 | 
        wTransferConfirmBean.setQualifiedBeanList( 
 | 
                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Integer.toString(Constants.QUALITIY_TYPE.normal)) 
 | 
        ); 
 | 
        wTransferConfirmBean.setRejectsBeanList( 
 | 
                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Integer.toString(Constants.QUALITIY_TYPE.unqulified)) 
 | 
        ); 
 | 
        wTransferConfirmBean.setScrapBeanList( 
 | 
                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Integer.toString(Constants.QUALITIY_TYPE.scrap)) 
 | 
        ); 
 | 
  
 | 
//        wTransferConfirmBean.setQualifiedBeanList( 
 | 
//                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Constants.APPLIANCES_TYPE_LABLE.qualified) 
 | 
//        ); 
 | 
//        wTransferConfirmBean.setRejectsBeanList( 
 | 
//                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Constants.APPLIANCES_TYPE_LABLE.rejects) 
 | 
//        ); 
 | 
//        wTransferConfirmBean.setScrapBeanList( 
 | 
//                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Constants.APPLIANCES_TYPE_LABLE.scrap) 
 | 
//        ); 
 | 
//        wTransferConfirmBean.setMixBeanList( 
 | 
//                wTransferDetailExtMapper.wTransferConfirmDetail(wTransfer.getId(),Constants.APPLIANCES_TYPE_LABLE.mix) 
 | 
//        ); 
 | 
  
 | 
        List<WTransferConfirmWorkOrderBean> wTransferConfirmWorkOrderBeanList  = 
 | 
                workorderExtMapper.workOrderForWTransferConfirm(wTransfer.getOriginId().toString()); 
 | 
        if(!Objects.isNull(wTransferConfirmWorkOrderBeanList)){ 
 | 
            wTransferConfirmWorkOrderBeanList.forEach(i->{ 
 | 
                QueryWorkorderUserExtDTO dto = new QueryWorkorderUserExtDTO(); 
 | 
                dto.setWorkorderId(i.getId()); 
 | 
                i.setWorkOrderUserList(workorderUserExtMapper.selectListByOrderId(dto)); 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        wTransferConfirmBean.setWTransferConfirmWorkOrderBeanList(wTransferConfirmWorkOrderBeanList); 
 | 
        return ApiResponse.success(wTransferConfirmBean); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse acceptWTransfer(Integer id,LoginUserInfo loginUserInfo){ 
 | 
        WTransfer wTransfer = wTransferExtMapper.selectOne(new QueryWrapper<WTransfer>().eq("id",id)); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(wTransfer.getStatus()!=Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误无法进行备料确认,请检查单据状态"); 
 | 
        } 
 | 
        if(wTransfer.getType()!=Constants.THREE){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据类型错误"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne( 
 | 
                new QueryWrapper<CompanyUser>().eq("USER_ID",wTransfer.getInUserId()) 
 | 
                        .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                        .eq("DELETED",0)); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
        List<WTransferDetail> wTransferDetailList = wTransferDetailMapper.selectList( 
 | 
                new QueryWrapper<WTransferDetail>().eq("TRANSFER_ID",wTransfer.getId()) 
 | 
        ); 
 | 
        if(wTransferDetailList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单明细信息"); 
 | 
        } 
 | 
        //仓库数据 
 | 
        Warehouse warehouse = warehouseMapper.selectById(wTransfer.getInWarehouseId()); 
 | 
        if(Objects.isNull(warehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库仓库数据"); 
 | 
        } 
 | 
  
 | 
        List<WOutbound> wOutboundOutList  = wOutboundMapper.selectList(new QueryWrapper<WOutbound>() 
 | 
                .eq("ORIGIN_ID",wTransfer.getId()) 
 | 
                .eq("ORIGIN_TYPE",3) 
 | 
        ); 
 | 
        if(wOutboundOutList.size() == Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对应出库单数据!"); 
 | 
        }else if(wOutboundOutList.size() > Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "转库单对应出库单数据异常"); 
 | 
        } 
 | 
        WOutbound wOutboundOut = wOutboundOutList.get(Constants.ZERO); 
 | 
//        List<WOutboundRecord> wOutboundRecordOutList = wOutboundRecordMapper.selectList( 
 | 
//                new QueryWrapper<WOutboundRecord>().eq("OUTBOUND_ID",wOutboundOut.getId()) 
 | 
//        ); 
 | 
        //1、由于生成转库单是根据操作人 仓位分组, 所以转库单上只会有一个入库仓库 
 | 
        //2、生成入库单单头 
 | 
        WOutbound wOutbound = new WOutbound(); 
 | 
        wOutbound.setCreateUser(loginUserInfo.getId()); 
 | 
        wOutbound.setCreateTime(new Date()); 
 | 
        wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
        wOutbound.setDepartId(loginUserInfo.getComDepartment().getId()); 
 | 
        wOutbound.setCode(wOutboundService.getNextInCode(loginUserInfo.getCompany().getId()));//单据编码 RK-20220519-0001 
 | 
        wOutbound.setOrigin(Constants.ONE); 
 | 
        wOutbound.setValidDate(new Date()); 
 | 
        wOutbound.setType(Constants.ONE); 
 | 
        wOutbound.setOriginType(3); 
 | 
        wOutbound.setOriginCode(wTransfer.getCode()); 
 | 
        wOutbound.setOriginId(wTransfer.getId()); 
 | 
        wOutbound.setUserId(loginUserInfo.getId()); 
 | 
        wOutbound.setWarehouseId(wTransfer.getInWarehouseId()); 
 | 
        wOutbound.setDealDate(new Date()); 
 | 
        wOutbound.setStatus(Constants.ONE); 
 | 
        wOutbound.setPlanDate(wTransfer.getInPlandate()); 
 | 
        wOutbound.setBillType(wTransfer.getType()); 
 | 
        wOutboundExtMapper.insert(wOutbound); 
 | 
  
 | 
        List<WOutboundDetail> wOutboundDetailOutList = wOutboundDetailMapper.selectList( 
 | 
                new QueryWrapper<WOutboundDetail>().eq("OUTBOUND_ID",wOutboundOut.getId())); 
 | 
  
 | 
        for (WOutboundDetail wOutboundDetail:wOutboundDetailOutList) { 
 | 
            WOutboundDetail wOutboundInDetail = new WOutboundDetail(); 
 | 
            wOutboundInDetail.setId(null); 
 | 
            wOutboundInDetail.setOutboundId(wOutbound.getId()); 
 | 
            wOutboundInDetail.setDeleted(Constants.ZERO); 
 | 
            wOutboundInDetail.setCreateUser(loginUserInfo.getId()); 
 | 
            wOutboundInDetail.setCreateTime(new Date()); 
 | 
            wOutboundInDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
            wOutboundInDetail.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
            wOutboundInDetail.setUnitId(wOutboundDetail.getUnitId()); 
 | 
            wOutboundInDetail.setBatch(wOutboundDetail.getBatch()); 
 | 
            wOutboundInDetail.setNum(wOutboundDetail.getDoneNum()); 
 | 
            wOutboundInDetail.setDoneDate(new Date()); 
 | 
            wOutboundInDetail.setDoneNum(wOutboundDetail.getDoneNum()); 
 | 
            wOutboundInDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
            wOutboundInDetail.setStatus(Constants.ONE); 
 | 
            wOutboundInDetail.setQualityType(wOutboundDetail.getQualityType()); 
 | 
            wOutboundInDetail.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
            for (WTransferDetail wTransferDetail:wTransferDetailList) { 
 | 
                if(StringUtils.equals(wTransferDetail.getMaterialId().toString(),wOutboundDetail.getMaterialId().toString())){ 
 | 
                    wOutboundInDetail.setLocationId(wTransferDetail.getInLcoationId()); 
 | 
                    wTransferDetail.setInActdate(new Date()); 
 | 
                    wTransferDetail.setInActnum(wOutboundDetail.getDoneNum()); 
 | 
                    wTransferDetailMapper.updateById(wTransferDetail); 
 | 
                } 
 | 
            } 
 | 
            wOutboundDetailExtMapper.insert(wOutboundInDetail); 
 | 
  
 | 
            //记录库存变动记录 
 | 
            wStockRecordExtService.saveRecord(Constants.ONE,wOutboundDetail.getId(),loginUserInfo); 
 | 
  
 | 
  
 | 
            List<WOutboundRecord> wOutboundRecordOutListByDetail = wOutboundRecordMapper.selectList( 
 | 
                    new QueryWrapper<WOutboundRecord>().eq("DETAIL_ID",wOutboundDetail.getId()) 
 | 
            ); 
 | 
            for (WOutboundRecord wOutboundRecord:wOutboundRecordOutListByDetail) { 
 | 
                WOutboundRecord wOutboundRecordIn = wOutboundRecord; 
 | 
                wOutboundRecordIn.setId(null); 
 | 
                wOutboundRecordIn.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundRecordIn.setCreateTime(new Date()); 
 | 
                wOutboundRecordIn.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                wOutboundRecordIn.setOutboundId(wOutboundInDetail.getOutboundId()); 
 | 
                wOutboundRecordIn.setDetailId(wOutboundInDetail.getId()); 
 | 
                wOutboundRecordIn.setLocationId(wOutboundInDetail.getLocationId()); 
 | 
                wOutboundRecordIn.setQualityType(wOutboundRecord.getQualityType()); 
 | 
                wOutboundRecordIn.setProcedureId(wOutboundRecord.getProcedureId()); 
 | 
                wOutboundRecordExtMapper.insert(wOutboundRecordIn); 
 | 
                //更新工装器具数据 
 | 
                Appliances appliances = appliancesExtMapper.selectById(wOutboundRecordIn.getAppliancesId()); 
 | 
                if(!Objects.isNull(appliances)){ 
 | 
                    appliances.setCurObjType(Constants.ZERO); 
 | 
                    appliances.setCurObjId(wOutbound.getId()); 
 | 
                    appliances.setWarehouseId(wOutboundInDetail.getWarehouseId()); 
 | 
                    appliances.setLocationId(wOutboundInDetail.getLocationId()); 
 | 
                    appliancesExtMapper.updateById(appliances); 
 | 
                } 
 | 
            } 
 | 
            QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
            wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
            wrapper.eq("MATERIAL_ID", wOutboundInDetail.getMaterialId()); 
 | 
            wrapper.eq("WAREHOUSE_ID", wOutbound.getWarehouseId()); 
 | 
            wrapper.eq("QUALITY_TYPE", wOutboundInDetail.getQualityType()); 
 | 
            if(!Objects.isNull(wOutboundInDetail.getProcedureId())){ 
 | 
                wrapper.eq("PROCEDURE_ID" , wOutboundInDetail.getProcedureId()); 
 | 
            }else{ 
 | 
                wrapper.apply("PROCEDURE_ID is null "); 
 | 
            } 
 | 
            if(StringUtils.isNotBlank(wOutboundInDetail.getBatch())){ 
 | 
                wrapper.eq("BATCH" , wOutboundInDetail.getBatch()); 
 | 
            }else{ 
 | 
                wrapper.apply("BATCH is null "); 
 | 
            } 
 | 
            wrapper.eq(!Objects.isNull(wOutboundInDetail.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundInDetail.getLocationId()); 
 | 
            wrapper.eq("DELETED",0); 
 | 
            //更新库存 
 | 
            WStock wStock = wStockExtMapper.selectOne(wrapper); 
 | 
            if (Objects.isNull(wStock)) { 
 | 
                WStock newWStock = new WStock(); 
 | 
                newWStock.setCreateTime(new Date()); 
 | 
                newWStock.setCreateUser(loginUserInfo.getId()); 
 | 
                newWStock.setRootDepartId(wOutboundInDetail.getRootDepartId()); 
 | 
                newWStock.setMaterialId(wOutboundInDetail.getMaterialId()); 
 | 
                newWStock.setBatch(wOutboundInDetail.getBatch()); 
 | 
                newWStock.setDeleted(Constants.ZERO); 
 | 
                newWStock.setWarehouseId(warehouse.getId()); 
 | 
                newWStock.setProcedureId(wOutboundInDetail.getProcedureId()); 
 | 
                newWStock.setQualityType(wOutboundInDetail.getQualityType()); 
 | 
                //此仓库 开启仓位 
 | 
                if(warehouse.getUseLocation()==Constants.ONE){ 
 | 
                    newWStock.setLocationId(wOutboundInDetail.getLocationId()); 
 | 
                } 
 | 
                newWStock.setUnitId(wOutboundInDetail.getUnitId()); 
 | 
                newWStock.setNum(wOutboundInDetail.getDoneNum()); 
 | 
                wStockExtMapper.insert(newWStock); 
 | 
            }else{ 
 | 
                wStock.setNum(wStock.getNum().add(wOutboundInDetail.getDoneNum())); 
 | 
                wStockExtMapper.updateById(wStock); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        wTransfer.setStatus(Constants.TWO); 
 | 
        wTransfer.setInActdate(new Date()); 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
  
 | 
        //记录操作记录 1、转库单 2、出入库单 
 | 
        WHistory wHistoryTransfer = wTransfer.toWHistory(loginUserInfo); 
 | 
        wHistoryMapper.insert(wHistoryTransfer); 
 | 
        WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
  
 | 
        noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()).getNoticeInType(),null); 
 | 
  
 | 
        return ApiResponse.success("备料成功"); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 转库单 进行出入库操作 
 | 
     * @param id 转库单主键 
 | 
     * @param wTransferType 转库单类别 0:转出操作;1:转入操作 
 | 
     * @param optType 操作类别:1 添加 2 移除 
 | 
     * @param jsonBean 添加移除 扫描条码类 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional 
 | 
    public WTransferRedisBean wTransferForInOut(Integer id, Integer wTransferType ,Integer optType, String jsonBean){ 
 | 
        WTransferRedisBean wTransferRedisBean = new WTransferRedisBean(); 
 | 
        WTransfer wTransfer = wTransferExtMapper.wTransferById(id); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(!StringUtils.equals(wTransfer.getStatus().toString(),wTransferType.toString())){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "转库单数据状态错误"); 
 | 
        } 
 | 
        //获取明细所有仓库信息(分组) 
 | 
        List<WTransferWarehouse> wTransferWarehouses = new ArrayList<>(); 
 | 
        if(wTransferType == Constants.ZERO ){ 
 | 
            wTransferWarehouses = wTransferDetailExtMapper.wTransferOutWarehouseListById(id); 
 | 
        }else{ 
 | 
            wTransferWarehouses = wTransferDetailExtMapper.wTransferInWarehouseListById(id); 
 | 
        } 
 | 
        if(Objects.isNull(wTransferWarehouses)||wTransferWarehouses.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库信息"); 
 | 
        } 
 | 
        //获取明细所有物料信息 
 | 
        List<WTransferDetail> wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListById(id); 
 | 
        for (int i = 0; i < wTransferDetailList.size(); i++) { 
 | 
            WTransferDetail wTransferDetail = wTransferDetailList.get(i); 
 | 
            if(wTransferType == Constants.ONE&&wTransferDetail.getOutActnum().compareTo(BigDecimal.ZERO)==Constants.ZERO){ 
 | 
                wTransferDetailList.remove(i); 
 | 
            } 
 | 
            if(wTransferType == Constants.ZERO&&wTransferDetail.getOutPlannum().compareTo(BigDecimal.ZERO)==Constants.ZERO){ 
 | 
                wTransferDetailList.remove(i); 
 | 
            } 
 | 
        } 
 | 
        if(Objects.isNull(wTransferDetailList)||wTransferDetailList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库下物料信息"); 
 | 
        } 
 | 
        for (WTransferDetail wTransferDetail:wTransferDetailList ) { 
 | 
            QueryWStockDto queryWStockDto = new QueryWStockDto(); 
 | 
            queryWStockDto.setRootDepartId(wTransferDetail.getRootDepartId()); 
 | 
            queryWStockDto.setMaterialId(wTransferDetail.getMaterialId()); 
 | 
            queryWStockDto.setWarehouseId(wTransferDetail.getOutWarehouseId()); 
 | 
            queryWStockDto.setUnitId(wTransferDetail.getUnitId()); 
 | 
            queryWStockDto.setBatch(wTransferDetail.getBatch()); 
 | 
            queryWStockDto.setQualityType(wTransferDetail.getQualityType()); 
 | 
            if(!Objects.isNull(wTransferDetail.getProcedureId())){ 
 | 
                queryWStockDto.setProcedureId(wTransferDetail.getProcedureId()); 
 | 
            } 
 | 
            //获取仓库信息 根据 
 | 
            Warehouse warehouse = warehouseMapper.selectById(wTransferDetail.getOutWarehouseId()); 
 | 
            if(Objects.isNull(warehouse)){ 
 | 
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到仓库信息"); 
 | 
            }else{ 
 | 
                if(Constants.ZERO == warehouse.getUseLocation()){ 
 | 
                    wTransferDetail.setWStockExtListVOList(wStockExtMapper.choiceStockListNoLocation(queryWStockDto)); 
 | 
                }else{ 
 | 
                    wTransferDetail.setWStockExtListVOList(wStockExtMapper.choiceStockList(queryWStockDto)); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //TODO 根据主键查询redis 整理返回数据 
 | 
        List<WTransferRedisCodeBean> wTransferRedisCodeBeanList = new ArrayList<>(); 
 | 
        String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_WTRANSFER_KEY+wTransfer.getId(),String.class); 
 | 
        List<WTransferRedisCodeBean> redisWTransferRedisCodeBeanList = JSON.parseArray(jsonArray,WTransferRedisCodeBean.class); 
 | 
  
 | 
        if(!Objects.isNull(redisWTransferRedisCodeBeanList)&&redisWTransferRedisCodeBeanList.size()>Constants.ZERO){ 
 | 
            //TODO 特殊处理 批次为null redis 转义后 变为“” 
 | 
            for (WTransferRedisCodeBean wTransferRedisCodeBean:redisWTransferRedisCodeBeanList) { 
 | 
                if(StringUtils.isEmpty(wTransferRedisCodeBean.getBatch())){ 
 | 
                    wTransferRedisCodeBean.setBatch(null); 
 | 
                } 
 | 
                //TODO redis 自动转换 null = > 0 
 | 
                if(wTransferRedisCodeBean.getProcedureId()==0){ 
 | 
                    wTransferRedisCodeBean.setProcedureId(null); 
 | 
                } 
 | 
            } 
 | 
            wTransferRedisCodeBeanList.addAll(redisWTransferRedisCodeBeanList); 
 | 
        } 
 | 
        if(!Objects.isNull(optType)&&StringUtils.isNotBlank(jsonBean)){ 
 | 
            WTransferRedisCodeBean codeBean =  JSON.parseObject(jsonBean,WTransferRedisCodeBean.class); 
 | 
            if(StringUtils.isEmpty(codeBean.getBatch())){ 
 | 
                codeBean.setBatch(null); 
 | 
            } 
 | 
            if(Objects.isNull(codeBean.getProcedureId())){ 
 | 
                codeBean.setProcedureId(null); 
 | 
            } 
 | 
            if(wTransferType == Constants.ZERO && optType==Constants.ONE){ 
 | 
                if(workorderRecordExtMapper.checkIsWork(codeBean.getAppliancesId().toString()).size()>Constants.ZERO){ 
 | 
                    throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前篮筐处于投料中"); 
 | 
                }; 
 | 
            } 
 | 
            this.updateRedisCode(wTransferRedisCodeBeanList,optType,codeBean,wTransferType); 
 | 
        } 
 | 
        wTransferRedisBean.setWTransferRedisCodeBeanList(wTransferRedisCodeBeanList); 
 | 
        for (WTransferWarehouse wTransferWarehouse:wTransferWarehouses) { 
 | 
            List<WTransferDetail> detail = new ArrayList<>(); 
 | 
            for (WTransferDetail wTransferDetail:wTransferDetailList ) { 
 | 
                Integer warehouseId = wTransferType==Constants.ZERO?wTransferDetail.getOutWarehouseId():wTransferDetail.getInWarehouseId(); 
 | 
                if(StringUtils.equals(wTransferWarehouse.getWarehouseId().toString(),warehouseId.toString())){ 
 | 
                    detail.add(wTransferDetail); 
 | 
                } 
 | 
            } 
 | 
            wTransferWarehouse.setWTransferDetailList(detail); 
 | 
            if(!Objects.isNull(wTransferType)){ 
 | 
                //TODO 整理出入库数据 
 | 
                this.handleWTransferOutCode(wTransferWarehouse,wTransferRedisCodeBeanList,wTransferType); 
 | 
            } 
 | 
        } 
 | 
        wTransferRedisBean.setWTransferWarehouseList(wTransferWarehouses); 
 | 
        if(!Objects.isNull(optType)){ 
 | 
            //TODO 更新至 Redis 
 | 
            RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_WTRANSFER_KEY+wTransfer.getId(),JSONArray.fromObject(wTransferRedisCodeBeanList).toString()); 
 | 
        } 
 | 
        wTransferRedisBean.setWTransfer(wTransfer); 
 | 
        return wTransferRedisBean; 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public void dealScrapApply(Backorder backorder,CompanyExtListVO com){ 
 | 
//        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        WTransfer wTransfer = backorder.toWTransfer(); 
 | 
        wTransfer.setCreateUser(backorder.getCreateUser()); 
 | 
        wTransfer.setCode(this.getNextCode(backorder.getOrderDepartId())); 
 | 
        Warehouse outWarehouse = warehouseMapper.selectById(backorder.getWarehouseOutId()); 
 | 
        if(Objects.isNull(outWarehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转出仓库对象信息"); 
 | 
        } 
 | 
        wTransfer.setOutDepartId(outWarehouse.getDepartId()); 
 | 
        wTransfer.setOutUserId(outWarehouse.getManagerId()); 
 | 
        Warehouse inWarehouse = warehouseMapper.selectById(backorder.getWarehouseId()); 
 | 
        if(Objects.isNull(inWarehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转入仓库对象信息"); 
 | 
        } 
 | 
        wTransfer.setInDepartId(inWarehouse.getDepartId()); 
 | 
        wTransfer.setInUserId(inWarehouse.getManagerId()); 
 | 
        wTransfer.setBackorderId(backorder.getId()); 
 | 
        wTransferMapper.insert(wTransfer); 
 | 
        List<WTransferDetail> wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListByBackOrderId(backorder.getId()); 
 | 
        if(Objects.isNull(wTransferDetailList)||wTransferDetailList.size()<=0){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转仓明细行信息"); 
 | 
        } 
 | 
        for (WTransferDetail w:wTransferDetailList ) { 
 | 
            w.setCreateTime(new Date()); 
 | 
            w.setCreateUser(backorder.getCreateUser()); 
 | 
            w.setRootDepartId(wTransfer.getRootDepartId()); 
 | 
            w.setTransferId(wTransfer.getId()); 
 | 
            w.setOutPlannum(w.getOutPlannum()); 
 | 
            w.setOutDepartId(wTransfer.getOutDepartId()); 
 | 
            w.setOutWarehouseId(wTransfer.getOutWarehouseId()); 
 | 
            w.setOutActdate(new Date()); 
 | 
            w.setInWarehouseId(wTransfer.getInWarehouseId()); 
 | 
            w.setInDepartId(wTransfer.getInDepartId()); 
 | 
            w.setInActdate(new Date()); 
 | 
            w.setProcedureId(backorder.getProcedureId()); 
 | 
            wTransferDetailMapper.insert(w); 
 | 
        } 
 | 
        CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",wTransfer.getOutUserId()) 
 | 
                .eq("DELETED",0) 
 | 
                .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
        ); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库仓管员信息【"+wTransfer.getOutUserId()+"】"); 
 | 
        } 
 | 
        Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()); 
 | 
        if(Objects.isNull(notices_type_transfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单类型信息【"+wTransfer.getType()+"】"); 
 | 
        } 
 | 
        LoginUserInfo user = new LoginUserInfo(); 
 | 
        user.setRootDepartment(new DepartmentExtListVO()); 
 | 
        user.getRootDepartment().setId(backorder.getRootDepartId()); 
 | 
        user.setCurComDepartment(new DepartmentExtListVO()); 
 | 
        user.getCurComDepartment().setId(backorder.getOrderDepartId()); 
 | 
        user.setId(backorder.getCreateUser()); 
 | 
        user.setCompany(com); 
 | 
  
 | 
        //发送通知 
 | 
        this.sendOutNotice(user,companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),notices_type_transfer,Constants.getNoticeUrl(user.getCompany(),Constants.DINGDING_NOTICE_URL.woutOut)); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public void wTransferForInOutUpload(Integer id, Integer wTransferType,LoginUserInfo loginUserInfo){ 
 | 
        WTransferRedisBean wTransferRedisBean = new WTransferRedisBean(); 
 | 
        WTransfer wTransfer = wTransferExtMapper.wTransferById(id); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(!StringUtils.equals(wTransfer.getStatus().toString(),wTransferType.toString())){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "转库单数据状态错误"); 
 | 
        } 
 | 
        //获取明细所有仓库信息(分组) 
 | 
        List<WTransferWarehouse> wTransferWarehouses = new ArrayList<>(); 
 | 
        if(wTransferType == Constants.ZERO ){ 
 | 
            wTransferWarehouses =  wTransferDetailExtMapper.wTransferOutWarehouseListById(id); 
 | 
        }else{ 
 | 
            wTransferWarehouses = wTransferDetailExtMapper.wTransferInWarehouseListById(id); 
 | 
        } 
 | 
        if(Objects.isNull(wTransferWarehouses)||wTransferWarehouses.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库信息"); 
 | 
        } 
 | 
        //获取明细所有物料信息 
 | 
        List<WTransferDetail> wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListById(id); 
 | 
        if(Objects.isNull(wTransferDetailList)||wTransferDetailList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库下物料信息"); 
 | 
        } 
 | 
        //TODO 根据主键查询redis 整理返回数据 
 | 
        List<WTransferRedisCodeBean> wTransferRedisCodeBeanList = new ArrayList<>(); 
 | 
        String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_WTRANSFER_KEY+wTransfer.getId(),String.class); 
 | 
        List<WTransferRedisCodeBean> redisWTransferRedisCodeBeanList = JSON.parseArray(jsonArray,WTransferRedisCodeBean.class); 
 | 
  
 | 
        if(Objects.isNull(redisWTransferRedisCodeBeanList)||redisWTransferRedisCodeBeanList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "Redis未读取到操作数据"); 
 | 
        } 
 | 
  
 | 
        //2022年9月26日11:23:29 加入 验证所有篮筐必须处于未投料状态 
 | 
        if(wTransferType==Constants.ZERO){ 
 | 
            List<String> idList = redisWTransferRedisCodeBeanList.stream().map(x -> x.getAppliancesId().toString()).collect(Collectors.toList()); 
 | 
            String ids = StringUtils.join(idList.toArray(), ","); 
 | 
            List<WorkorderRecordExtListVO>  workorderRecordExtListVOList = workorderRecordExtMapper.checkIsWork(ids); 
 | 
            if(workorderRecordExtListVOList.size()>Constants.ZERO){ 
 | 
                List<String> useIdList = workorderRecordExtListVOList.stream().map(x -> x.getAppliancesId().toString()).collect(Collectors.toList()); 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(),"【" + StringUtils.join(useIdList.toArray(), ",") +  "】篮筐处于投料中"); 
 | 
            } 
 | 
  
 | 
            // 所有篮筐必须与出库单据仓库一致 
 | 
            redisWTransferRedisCodeBeanList.forEach(i->{ 
 | 
                WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(i.getWTransferDetailId()); 
 | 
                Appliances appliances = appliancesExtMapper.selectById(i.getAppliancesId()); 
 | 
                if(Objects.isNull(appliances.getWarehouseId())){ 
 | 
                    throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(),"【" + i.getScanCode() +  "】篮筐归属仓库信息错误"); 
 | 
                } 
 | 
  
 | 
                if(!Objects.equals(appliances.getWarehouseId().toString(),wTransferDetail.getOutWarehouseId().toString())){ 
 | 
                    throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(),"【" + i.getScanCode() +  "】篮筐归属仓库信息错误"); 
 | 
                } 
 | 
            }); 
 | 
        }else{ 
 | 
            //入库的篮筐不能有仓库信息 
 | 
            redisWTransferRedisCodeBeanList.forEach(i->{ 
 | 
                Appliances appliances = appliancesExtMapper.selectById(i.getAppliancesId()); 
 | 
                if(!Objects.isNull(appliances.getWarehouseId())||!Objects.isNull(appliances.getLocationId())){ 
 | 
                    throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(),"【" + i.getScanCode() +  "】篮筐存在归属仓库信息"); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        //限制入库数据数量 必须等于已出库数量 
 | 
        if(wTransferType==Constants.ONE){ 
 | 
            List<WTransferDetail> detailList =  wTransferDetailMapper.selectList(new QueryWrapper<WTransferDetail>().eq("TRANSFER_ID",id)); 
 | 
            for (WTransferDetail wTransferDetail:detailList) { 
 | 
                BigDecimal scanNum = BigDecimal.ZERO; 
 | 
                for (WTransferRedisCodeBean wTransferRedisCodeBean:redisWTransferRedisCodeBeanList) { 
 | 
                    if(Objects.equals(wTransferRedisCodeBean.getWTransferDetailId(),wTransferDetail.getId())){ 
 | 
                        scanNum = scanNum.add(wTransferRedisCodeBean.getNum()); 
 | 
                    } 
 | 
                } 
 | 
                if(wTransferDetail.getOutActnum().compareTo(scanNum)!=Constants.ZERO){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "入库数量应与待入库数量相同"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        if(!Objects.isNull(redisWTransferRedisCodeBeanList)&&redisWTransferRedisCodeBeanList.size()>Constants.ZERO){ 
 | 
            //TODO 特殊处理 批次为null redis 转义后 变为“” 
 | 
            for (WTransferRedisCodeBean wTransferRedisCodeBean:redisWTransferRedisCodeBeanList) { 
 | 
                if(StringUtils.isEmpty(wTransferRedisCodeBean.getBatch())){ 
 | 
                    wTransferRedisCodeBean.setBatch(null); 
 | 
                } 
 | 
                //TODO redis 自动转换 null = > 0 
 | 
                if(wTransferRedisCodeBean.getProcedureId()==0){ 
 | 
                    wTransferRedisCodeBean.setProcedureId(null); 
 | 
                } 
 | 
            } 
 | 
            wTransferRedisCodeBeanList.addAll(redisWTransferRedisCodeBeanList); 
 | 
        } 
 | 
  
 | 
        wTransferRedisBean.setWTransferRedisCodeBeanList(wTransferRedisCodeBeanList); 
 | 
        for (WTransferWarehouse wTransferWarehouse:wTransferWarehouses) { 
 | 
            List<WTransferDetail> detail = new ArrayList<>(); 
 | 
            for (WTransferDetail wTransferDetail:wTransferDetailList ) { 
 | 
                if(StringUtils.equals(wTransferWarehouse.getWarehouseId().toString(),wTransferDetail.getInWarehouseId().toString())){ 
 | 
                    detail.add(wTransferDetail); 
 | 
                } 
 | 
            } 
 | 
            if(!Objects.isNull(wTransferType)){ 
 | 
                //TODO 整理出入库数据 
 | 
                this.handleWTransferOutCode(wTransferWarehouse,wTransferRedisCodeBeanList,wTransferType); 
 | 
            } 
 | 
        } 
 | 
        wTransferRedisBean.setWTransferWarehouseList(wTransferWarehouses); 
 | 
  
 | 
  
 | 
  
 | 
        this.uploadWTransfer(wTransfer,wTransferRedisBean,wTransferType,loginUserInfo); 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    public void handleWTransferOutCode(WTransferWarehouse wTransferWarehouse , List<WTransferRedisCodeBean> wTransferRedisCodeBeanList,Integer wTransferType){ 
 | 
        //TODO 获取当前仓库下所有出库条码 
 | 
        List<WTransferRedisCodeBean> warehouseCode = new ArrayList<>(); 
 | 
        for (WTransferRedisCodeBean wTransferRedisCodeBean:wTransferRedisCodeBeanList) { 
 | 
            if(StringUtils.equals(wTransferWarehouse.getWarehouseId().toString(),wTransferRedisCodeBean.getWarehouseId().toString())){ 
 | 
                warehouseCode.add(wTransferRedisCodeBean); 
 | 
            } 
 | 
        } 
 | 
        //TODO 整理当前仓库下所有出库的物料数据 根据条码数据添加 
 | 
        wTransferWarehouse.setWtScanMaterialBeanList(this.handleWtScanMaterial(warehouseCode,wTransferType)); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    @Transactional 
 | 
    public List<WtScanMaterialBean> handleWtScanMaterial(List<WTransferRedisCodeBean> warehouseCode,Integer wTransferType){ 
 | 
        List<WtScanMaterialBean> wtScanMaterialBeanList = new ArrayList<>(); 
 | 
        //TODO 获取仓库下已扫描物料类别 
 | 
        for (WTransferRedisCodeBean wTransferRedisCodeBean:warehouseCode) { 
 | 
            if(wtScanMaterialBeanList.size()==Constants.ZERO || !isRepeatMaterialData(wTransferRedisCodeBean,wtScanMaterialBeanList)){ 
 | 
                wtScanMaterialBeanList.add(wTransferRedisCodeBean.toWtScanMaterialBean()); 
 | 
            } 
 | 
        } 
 | 
        //TODO 已扫描物料数据 绑定已扫描条码 更新已扫描数量 
 | 
        for (WtScanMaterialBean wtScanMaterialBean:wtScanMaterialBeanList) { 
 | 
            BigDecimal scanNum = BigDecimal.ZERO; 
 | 
            List<WTransferRedisCodeBean> wTransferRedisCodeBeanList = new ArrayList<>(); 
 | 
            for (WTransferRedisCodeBean wTransferRedisCodeBean:warehouseCode) { 
 | 
                if(StringUtils.equals(wtScanMaterialBean.getWTransferDetailId().toString(),wTransferRedisCodeBean.getWTransferDetailId().toString()) 
 | 
                        &&StringUtils.equals(wtScanMaterialBean.getMaterialId().toString(),wTransferRedisCodeBean.getMaterialId().toString()) 
 | 
                        && StringUtils.equals(wtScanMaterialBean.getLocationId().toString(),wTransferRedisCodeBean.getLocationId().toString()) 
 | 
                        && wtScanMaterialBean.getQualityType().intValue() == wTransferRedisCodeBean.getQualityType().intValue() 
 | 
                ){ 
 | 
                        //&& StringUtils.equals(wtScanMaterialBean.getBatch(),wTransferRedisCodeBean.getBatch())){ 
 | 
                    //TODO 判断工序是否都不为空 
 | 
                    if(!Objects.isNull(wtScanMaterialBean.getProcedureId())&&!Objects.isNull(wTransferRedisCodeBean.getProcedureId())){ 
 | 
                        if(wtScanMaterialBean.getProcedureId() != wTransferRedisCodeBean.getProcedureId()){ 
 | 
                            continue; 
 | 
                        } 
 | 
                    }else if(Objects.isNull(wtScanMaterialBean.getProcedureId())&&!Objects.isNull(wTransferRedisCodeBean.getProcedureId())){ 
 | 
                        continue; 
 | 
                    }else if(!Objects.isNull(wtScanMaterialBean.getProcedureId())&&Objects.isNull(wTransferRedisCodeBean.getProcedureId())){ 
 | 
                        continue; 
 | 
                    } 
 | 
                    //TODO 若批次为 null /“” 则不验证批次,否则验证 
 | 
                    if(StringUtils.isNotEmpty(wtScanMaterialBean.getBatch())){ 
 | 
                        if(StringUtils.equals(wtScanMaterialBean.getBatch(),wTransferRedisCodeBean.getBatch())) { 
 | 
                            wTransferRedisCodeBeanList.add(wTransferRedisCodeBean); 
 | 
                            scanNum = scanNum.add(wTransferRedisCodeBean.getNum()); 
 | 
                        } 
 | 
                    }else{ 
 | 
                        wTransferRedisCodeBeanList.add(wTransferRedisCodeBean); 
 | 
                        scanNum = scanNum.add(wTransferRedisCodeBean.getNum()); 
 | 
                    } 
 | 
  
 | 
                } 
 | 
            } 
 | 
            WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(wtScanMaterialBean.getWTransferDetailId()); 
 | 
            if(wTransferType==Constants.ZERO&&scanNum.compareTo(wTransferDetail.getOutPlannum())>Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.EXCEED_PLAN_NUM.getCode(), "超出计划数量,扫描失败"); 
 | 
            }else if(wTransferType==Constants.ONE&&scanNum.compareTo(wTransferDetail.getOutActnum())>Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.EXCEED_PLAN_NUM.getCode(), "超出计划数量,扫描失败"); 
 | 
            } 
 | 
            wtScanMaterialBean.setScanNum(scanNum); 
 | 
            wtScanMaterialBean.setWTransferRedisCodeBeanList(wTransferRedisCodeBeanList); 
 | 
        } 
 | 
        return wtScanMaterialBeanList; 
 | 
    } 
 | 
    private boolean isRepeatMaterialData(WTransferRedisCodeBean wTransferRedisCodeBean, List<WtScanMaterialBean> wtScanMaterialBeanList) { 
 | 
  
 | 
        //TODO 物料/批次/货位是否相同 相同则跳过,否则加入数据 
 | 
        for (WtScanMaterialBean wtScanMaterialBean:wtScanMaterialBeanList) { 
 | 
            if(StringUtils.equals(wtScanMaterialBean.getWTransferDetailId().toString(),wTransferRedisCodeBean.getWTransferDetailId().toString()) 
 | 
                    &&StringUtils.equals(wtScanMaterialBean.getMaterialId().toString(),wTransferRedisCodeBean.getMaterialId().toString()) 
 | 
                    && StringUtils.equals(wtScanMaterialBean.getLocationId().toString(),wTransferRedisCodeBean.getLocationId().toString()) 
 | 
                    && wtScanMaterialBean.getQualityType().intValue() == wTransferRedisCodeBean.getQualityType().intValue() 
 | 
            ) { 
 | 
                // 物料/批次/货位相同 
 | 
                //TODO 判断工序是否都不为空 
 | 
                //TODO 若批次为 null /“” 则不验证批次,否则验证 
 | 
                if(StringUtils.isNotEmpty(wtScanMaterialBean.getBatch())&&!StringUtils.equals(wtScanMaterialBean.getBatch(),wTransferRedisCodeBean.getBatch())){ 
 | 
                    return false; 
 | 
                }else if(StringUtils.isEmpty(wtScanMaterialBean.getBatch()) && StringUtils.isNotEmpty(wTransferRedisCodeBean.getBatch()) ){ 
 | 
                    return false; 
 | 
                }else if(StringUtils.isNotEmpty(wtScanMaterialBean.getBatch()) && StringUtils.isEmpty(wTransferRedisCodeBean.getBatch()) ){ 
 | 
                    return false; 
 | 
                } 
 | 
                //TODO 判断工序是否都不为空 
 | 
                if(!Objects.isNull(wtScanMaterialBean.getProcedureId())&&!Objects.isNull(wTransferRedisCodeBean.getProcedureId())&&!Constants.equalsInteger(wtScanMaterialBean.getProcedureId(),wTransferRedisCodeBean.getProcedureId())){ 
 | 
                    return false; 
 | 
                }else if(Objects.isNull(wtScanMaterialBean.getProcedureId())&&!Objects.isNull(wTransferRedisCodeBean.getProcedureId())){ 
 | 
                    return false; 
 | 
                }else if(!Objects.isNull(wtScanMaterialBean.getProcedureId())&&Objects.isNull(wTransferRedisCodeBean.getProcedureId())){ 
 | 
                    return false; 
 | 
                } 
 | 
  
 | 
                return true; 
 | 
            } 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 更新条码列表 
 | 
     * @param wTransferRedisCodeBeanList 所有条码列表 
 | 
     * @param optType 1:添加;2:删除 
 | 
     * @param codeBean 工装器具 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void updateRedisCode(List<WTransferRedisCodeBean> wTransferRedisCodeBeanList,Integer optType,WTransferRedisCodeBean codeBean,Integer wTransferType){ 
 | 
        if(Objects.isNull(optType)&&optType!=Constants.ONE&&optType!=Constants.TWO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "更新操作类别异常"); 
 | 
        }else if(optType==Constants.ONE){ 
 | 
            //TODO 校验 工装器具数据是否已扫描 
 | 
            for (WTransferRedisCodeBean wTransferRedisCodeBean:wTransferRedisCodeBeanList) { 
 | 
                if(StringUtils.equals(wTransferRedisCodeBean.getAppliancesId().toString(),codeBean.getAppliancesId().toString())){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "工装器具数据已扫描,无法重复扫描"); 
 | 
                } 
 | 
            } 
 | 
            //TODO 判断条码是是否在当前转库单中 
 | 
            WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(codeBean.getWTransferDetailId()); 
 | 
            Integer warehouseId = wTransferType==Constants.ZERO?wTransferDetail.getOutWarehouseId():wTransferDetail.getInWarehouseId(); 
 | 
  
 | 
            //2022-9-14 13:41:33 处理 添加验证篮筐属性与仓库属性 
 | 
            Warehouse warehouse = warehouseMapper.selectById(warehouseId); 
 | 
            //获取仓库属性 判断扫描篮筐数据属性 
 | 
            SystemDictData systemDictData = systemDictDataMapper.selectById(warehouse.getSystemDicDataId()); 
 | 
            if(Objects.isNull(systemDictData)){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库类型数据"); 
 | 
            } 
 | 
            // 0合格 1不良 2报废 ; 
 | 
            Integer wareHouseQualityType = 3 ; 
 | 
            if(systemDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.qualified)){ 
 | 
                wareHouseQualityType = 0 ; 
 | 
            }else if(systemDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.rejects)){ 
 | 
                wareHouseQualityType = 1 ; 
 | 
            }else if(systemDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.scrap)){ 
 | 
                wareHouseQualityType = 2 ; 
 | 
            } 
 | 
            if(wareHouseQualityType != 3){ 
 | 
                if(codeBean.getQualityType()!=wareHouseQualityType){ 
 | 
                    throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "篮筐质量属性与仓库属性不一致"); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            if(StringUtils.equals(wTransferDetail.getMaterialId().toString(),codeBean.getMaterialId().toString()) 
 | 
                &&StringUtils.equals(warehouseId.toString(),codeBean.getWarehouseId().toString()) 
 | 
                    &&wTransferDetail.getQualityType().intValue() == codeBean.getQualityType().intValue() 
 | 
            ){ 
 | 
                if(!Objects.isNull(wTransferDetail.getProcedureId())&&!Objects.isNull( codeBean.getProcedureId())){ 
 | 
                    if(!wTransferDetail.getProcedureId().equals(codeBean.getProcedureId())){ 
 | 
                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); 
 | 
                    } 
 | 
                }else if(Objects.isNull(wTransferDetail.getProcedureId())&&!Objects.isNull( codeBean.getProcedureId())){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); 
 | 
                }else if(!Objects.isNull(wTransferDetail.getProcedureId())&&Objects.isNull( codeBean.getProcedureId())){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); 
 | 
                } 
 | 
                if(StringUtils.isNotBlank(wTransferDetail.getBatch())){ 
 | 
                    if(!wTransferDetail.getBatch().equals(codeBean.getBatch())){ 
 | 
                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据批次不匹配"); 
 | 
                    } 
 | 
                } 
 | 
                if(wTransferType==Constants.ZERO){ 
 | 
                    if(!Objects.isNull(wTransferDetail.getOutLocationId())){ 
 | 
                        if(wTransferDetail.getOutLocationId()!= codeBean.getLocationId()){ 
 | 
                            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据货位不匹配"); 
 | 
                        } 
 | 
                    } 
 | 
                }else if(wTransferType==Constants.ONE){ 
 | 
                    if(!Objects.isNull(wTransferDetail.getInLcoationId())){ 
 | 
                        if(wTransferDetail.getInLcoationId()!= codeBean.getLocationId()){ 
 | 
                            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据货位不匹配"); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
  
 | 
            }else{ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据不匹配"); 
 | 
            } 
 | 
  
 | 
            wTransferRedisCodeBeanList.add(codeBean); 
 | 
        }else if(optType==Constants.TWO){ 
 | 
            //TODO 是否在当前单据数据内 
 | 
            Boolean isHave = true; 
 | 
            for (WTransferRedisCodeBean wTransferRedisCodeBean:wTransferRedisCodeBeanList) { 
 | 
                if (StringUtils.equals(wTransferRedisCodeBean.getAppliancesId().toString(), codeBean.getAppliancesId().toString())) { 
 | 
                    wTransferRedisCodeBeanList.remove(wTransferRedisCodeBean); 
 | 
                    isHave = false; 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
            if(isHave){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "扫描条码未存在当前单据内"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 创建WOutbound数据 
 | 
     * @param wTransferRedisBean 
 | 
     * @param wTransferType 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void uploadWTransfer(WTransfer wTransfer,WTransferRedisBean wTransferRedisBean,Integer wTransferType, LoginUserInfo loginUserInfo){ 
 | 
        List<WTransferWarehouse> wTransferWarehouseList = wTransferRedisBean.getWTransferWarehouseList(); 
 | 
        for (WTransferWarehouse wTransferWarehouse:wTransferWarehouseList) { 
 | 
            Warehouse warehouse = warehouseMapper.selectById(wTransferWarehouse.getWarehouseId()); 
 | 
            List<WtScanMaterialBean>  wtScanMaterialBeanList = wTransferWarehouse.getWtScanMaterialBeanList(); 
 | 
            if(Objects.isNull(wtScanMaterialBeanList)||wtScanMaterialBeanList.size()==Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(),"仓库:【" + warehouse.getName() + "】未扫描数据"); 
 | 
            } 
 | 
            // TODO 根据转库单 单头 创建数据 
 | 
            WOutbound wOutbound = wTransfer.toWOutbound(wTransferType); 
 | 
            if(Objects.isNull(warehouse)){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到生成仓库信息数据"); 
 | 
            } 
 | 
            wOutbound.setRootDepartId(warehouse.getRootDepartId()); 
 | 
            wOutbound.setDepartId(warehouse.getDepartId()); 
 | 
            wOutbound.setUserId(warehouse.getManagerId()); 
 | 
            wOutbound.setWarehouseId(warehouse.getId()); 
 | 
            wOutbound.setCode( 
 | 
                    wTransferType==Constants.ZERO 
 | 
                            ?wOutboundService.getNextOutCode(loginUserInfo.getCompany().getId()) 
 | 
                            :wOutboundService.getNextInCode(loginUserInfo.getCompany().getId()) ); 
 | 
            wOutboundMapper.insert(wOutbound); 
 | 
            for (WtScanMaterialBean wtScanMaterialBean:wtScanMaterialBeanList) { 
 | 
                WOutboundDetail wOutboundDetail = new WOutboundDetail(); 
 | 
                wOutboundDetail.setDeleted(Constants.ZERO); 
 | 
                wOutboundDetail.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundDetail.setCreateTime(new Date()); 
 | 
                wOutboundDetail.setOutboundId(wOutbound.getId()); 
 | 
                wOutboundDetail.setMaterialId(wtScanMaterialBean.getMaterialId()); 
 | 
                wOutboundDetail.setUnitId(wtScanMaterialBean.getUnitId()); 
 | 
                wOutboundDetail.setBatch(wtScanMaterialBean.getBatch()); 
 | 
                wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                wOutboundDetail.setLocationId(wtScanMaterialBean.getLocationId()); 
 | 
                wOutboundDetail.setNum(wtScanMaterialBean.getScanNum()); 
 | 
                wOutboundDetail.setDoneNum(wtScanMaterialBean.getScanNum()); 
 | 
                wOutboundDetail.setDoneDate(new Date()); 
 | 
                wOutboundDetail.setStatus(Constants.ONE); 
 | 
                wOutboundDetail.setQualityType(wtScanMaterialBean.getQualityType()); 
 | 
                wOutboundDetail.setProcedureId(wtScanMaterialBean.getProcedureId()); 
 | 
                wOutboundDetail.setRootDepartId(wOutbound.getRootDepartId()); 
 | 
                wOutboundDetailMapper.insert(wOutboundDetail); 
 | 
  
 | 
  
 | 
                //记录库存变动记录 
 | 
                wStockRecordExtService.saveRecord(wTransferType,wOutboundDetail.getId(),loginUserInfo); 
 | 
                //TODO 更新篮筐数据 
 | 
                this.updateAppliances(wtScanMaterialBean.getWTransferRedisCodeBeanList(),wOutbound,wOutboundDetail,loginUserInfo); 
 | 
                //TODO 更新库存 
 | 
                this.updateStock(wOutbound,wOutboundDetail,warehouse,loginUserInfo); 
 | 
  
 | 
//                //TODO 更新转库单数据 
 | 
//                WTransferDetail wTransferDetail = wTransferDetailMapper.selectById(wtScanMaterialBean.getWTransferDetailId()); 
 | 
//                if(wTransferType == Constants.ZERO){ 
 | 
//                    wTransferDetail.setOutActdate(new Date()); 
 | 
//                    wTransferDetail.setOutActnum(wtScanMaterialBean.getScanNum()); 
 | 
//                }else{ 
 | 
//                    wTransferDetail.setInActdate(new Date()); 
 | 
//                    wTransferDetail.setInActnum(wtScanMaterialBean.getScanNum()); 
 | 
//                } 
 | 
//                wTransferDetailMapper.updateById(wTransferDetail); 
 | 
            } 
 | 
            //更新转库单数据 
 | 
            Map<String, List<WtScanMaterialBean>> wTScanMaterialBeanMap = wtScanMaterialBeanList.stream() 
 | 
                    .collect(Collectors.groupingBy(i -> i.getWTransferDetailId().toString())); 
 | 
            Iterator<String> iter = wTScanMaterialBeanMap.keySet().iterator(); 
 | 
            while(iter.hasNext()) { 
 | 
                String key = iter.next(); 
 | 
                //获取当前行处理数据 
 | 
                List<WtScanMaterialBean> wtScanMaterialBeans = wTScanMaterialBeanMap.get(key); 
 | 
                WTransferDetail wTransferDetail = wTransferDetailMapper.selectById(wtScanMaterialBeans.get(Constants.ZERO).getWTransferDetailId()); 
 | 
                if(wTransferType == Constants.ZERO){ 
 | 
                    wTransferDetail.setOutActdate(new Date()); 
 | 
                    wTransferDetail.setOutActnum(wtScanMaterialBeans.stream().map(s -> s.getScanNum()).reduce(BigDecimal.ZERO, BigDecimal::add)); 
 | 
                }else{ 
 | 
                    wTransferDetail.setInActdate(new Date()); 
 | 
                    wTransferDetail.setInActnum(wtScanMaterialBeans.stream().map(s -> s.getScanNum()).reduce(BigDecimal.ZERO, BigDecimal::add)); 
 | 
                } 
 | 
                wTransferDetailMapper.updateById(wTransferDetail); 
 | 
            } 
 | 
  
 | 
            //TODO 发送钉钉通知 
 | 
            CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                    .eq("USER_ID",wTransfer.getInUserId()) 
 | 
                    .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                    .eq("DELETED",0) 
 | 
            ); 
 | 
            //出入库单操作记录 
 | 
            WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
            wHistoryMapper.insert(wHistory); 
 | 
            //处理通知 
 | 
            Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()); 
 | 
            if(Objects.isNull(notices_type_transfer)){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单类型信息【"+wTransfer.getType()+"】"); 
 | 
            } 
 | 
            if(wTransferType == Constants.ZERO){ 
 | 
                noticesExtService.dealNotice(wTransfer.getId(),notices_type_transfer.getNoticeOutType(),null); 
 | 
                String url = Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.in); 
 | 
                if(notices_type_transfer.getType() == 3){ 
 | 
                    url =Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.finish); 
 | 
                } 
 | 
                sendInNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),notices_type_transfer,url); 
 | 
            }else{ 
 | 
                noticesExtService.dealNotice(wTransfer.getId(),notices_type_transfer.getNoticeInType(),null); 
 | 
            } 
 | 
        } 
 | 
        //TODO 更新转库单状态 
 | 
        if(wTransferType == Constants.ZERO){ 
 | 
            wTransfer.setStatus(Constants.ONE); 
 | 
            wTransfer.setOutActdate(new Date()); 
 | 
        }else{ 
 | 
            wTransfer.setStatus(Constants.TWO); 
 | 
            wTransfer.setInActdate(new Date()); 
 | 
        } 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
        //转库单操作记录 
 | 
        WHistory wHistoryTransfer = wTransfer.toWHistory(loginUserInfo); 
 | 
        wHistoryMapper.insert(wHistoryTransfer); 
 | 
        // TODO 清除redis记录 
 | 
        RedisUtil.deleteObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_WTRANSFER_KEY+wTransfer.getId()); 
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 更新篮筐数据 添加操作记录 
 | 
     * @param wTransferRedisCodeBeanList 
 | 
     * @param wOutbound 
 | 
     * @param wOutboundDetail 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void updateAppliances(List<WTransferRedisCodeBean> wTransferRedisCodeBeanList,WOutbound wOutbound,WOutboundDetail wOutboundDetail,LoginUserInfo loginUserInfo){ 
 | 
        for (WTransferRedisCodeBean wTransferRedisCodeBean:wTransferRedisCodeBeanList) { 
 | 
            Appliances appliances = appliancesMapper.selectById(wTransferRedisCodeBean.getAppliancesId()); 
 | 
            appliances.setCurObjId(wOutbound.getId()); 
 | 
            appliances.setCurObjType(Constants.ZERO); 
 | 
            if(wOutbound.getType()==Constants.ZERO){ 
 | 
                if(!Objects.isNull(appliances)){ 
 | 
                    appliances.setWarehouseId(null); 
 | 
                    appliances.setLocationId(null); 
 | 
                } 
 | 
            }else if(wOutbound.getType()==Constants.ONE){ 
 | 
                appliances.setWarehouseId(wOutboundDetail.getWarehouseId()); 
 | 
                appliances.setLocationId(wOutboundDetail.getLocationId()); 
 | 
            } 
 | 
            appliancesMapper.updateById(appliances); 
 | 
            WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord(appliances,loginUserInfo); 
 | 
            if(wOutbound.getType()==Constants.ONE){ 
 | 
                wOutboundRecord.setLocationId(appliances.getLocationId()); 
 | 
            } 
 | 
            wOutboundRecordMapper.insert(wOutboundRecord); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 更新库存信息 
 | 
     * @param wOutbound 
 | 
     * @param wOutboundDetail 
 | 
     * @param loginUserInfo 
 | 
     */ 
 | 
    @Transactional 
 | 
    public void updateStock(WOutbound wOutbound,WOutboundDetail wOutboundDetail,Warehouse warehouse,LoginUserInfo loginUserInfo){ 
 | 
        //TODO 查询库存数据 
 | 
        QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
        wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
        wrapper.eq("MATERIAL_ID", wOutboundDetail.getMaterialId()); 
 | 
        wrapper.eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()); 
 | 
        wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); 
 | 
        wrapper.eq(!Objects.isNull(wOutboundDetail.getProcedureId()),"procedure_id",wOutboundDetail.getProcedureId()); 
 | 
        wrapper.apply(Objects.isNull(wOutboundDetail.getProcedureId())," procedure_id is null "); 
 | 
        if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ 
 | 
            wrapper.eq("BATCH" , wOutboundDetail.getBatch()); 
 | 
        }else{ 
 | 
            wrapper.apply("BATCH is null "); 
 | 
        } 
 | 
        wrapper.eq(!Objects.isNull(wOutboundDetail.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundDetail.getLocationId()); 
 | 
        wrapper.eq("DELETED",0); 
 | 
        List<WStock> wStockList = wStockMapper.selectList(wrapper); 
 | 
        if(wOutbound.getType()==Constants.ZERO){ 
 | 
            if(Objects.isNull(wStockList)||wStockList.size()==Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存信息异常:【"+warehouse.getId()+"】 - 【"+wOutboundDetail.getLocationId()+"】 - 【"+wOutboundDetail.getMaterialId()+"】- 【"+wOutboundDetail.getBatch()+"】"); 
 | 
            } 
 | 
            WStock wStock = wStockList.get(0); 
 | 
            if (wStock.getNum().compareTo(wOutboundDetail.getNum()) < Constants.ZERO) { 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前货位库存数量不足;剩余数量【" + wStock.getNum().toString() + "】;出库数量【" + wOutboundDetail.getNum().toString() + "】"); 
 | 
            } 
 | 
            wStock.setNum(wStock.getNum().subtract(wOutboundDetail.getNum())); 
 | 
            wStockMapper.updateById(wStock); 
 | 
        }else{ 
 | 
            if(Objects.isNull(wStockList)||wStockList.size()==Constants.ZERO){ 
 | 
                WStock newWStock = new WStock(); 
 | 
                newWStock.setCreateTime(new Date()); 
 | 
                newWStock.setCreateUser(loginUserInfo.getId()); 
 | 
                newWStock.setRootDepartId(wOutbound.getRootDepartId()); 
 | 
                newWStock.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                newWStock.setQualityType(wOutboundDetail.getQualityType()); 
 | 
                if(!Objects.isNull(wOutboundDetail.getProcedureId())){ 
 | 
                    newWStock.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
                } 
 | 
                //此仓库 开启仓位 
 | 
                if(warehouse.getUseLocation()==Constants.ONE){ 
 | 
                    newWStock.setLocationId(wOutboundDetail.getLocationId()); 
 | 
                } 
 | 
                newWStock.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
                newWStock.setBatch(wOutboundDetail.getBatch()); 
 | 
                newWStock.setUnitId(wOutboundDetail.getUnitId()); 
 | 
                newWStock.setNum(wOutboundDetail.getNum()); 
 | 
                wStockMapper.insert(newWStock); 
 | 
            }else{ 
 | 
                WStock wStock = wStockList.get(0); 
 | 
                wStock.setNum(wStock.getNum().add(wOutboundDetail.getNum())); 
 | 
                wStockMapper.updateById(wStock); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public void sendNotice(Integer userId ,Integer billId , String billCode ,Constants.Notices_Type notices_type,String constantsUrlConfig){ 
 | 
        //发送通知 
 | 
        Notices notices = new Notices(); 
 | 
        notices.setCompanyUserId(userId); 
 | 
        notices.setType(notices_type.getType()); 
 | 
        notices.setContent("【"+billCode+"】" + notices_type.getContent()); 
 | 
        notices.setTitle(notices_type.getTitle()); 
 | 
        notices.setObjId(billId); 
 | 
        notices.setUrl(systemDictDataBiz.queryByCode(Constants.ROUTE_CONFIG,constantsUrlConfig).getCode().replace("{id}",billId.toString()).replace("{type}","9")); 
 | 
        noticesExtService.sendNotice(notices); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 转库单退回 
 | 
     * @param id 
 | 
     * @param loginUserInfo 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse wTransferReturn(Integer id,LoginUserInfo loginUserInfo){ 
 | 
        WTransfer wTransfer = wTransferExtMapper.selectOne(new QueryWrapper<WTransfer>().eq("id",id)); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(wTransfer.getStatus()!=Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误无法进行退回,请检查单据状态"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne( 
 | 
                new QueryWrapper<CompanyUser>().eq("USER_ID",wTransfer.getInUserId()) 
 | 
                        .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                        .eq("DELETED",0)); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
        List<WTransferDetail> wTransferDetailList = wTransferDetailMapper.selectList( 
 | 
                new QueryWrapper<WTransferDetail>().eq("TRANSFER_ID",wTransfer.getId()) 
 | 
        ); 
 | 
        if(wTransferDetailList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单明细信息"); 
 | 
        } 
 | 
        //仓库数据 
 | 
        Warehouse warehouse = warehouseMapper.selectById(wTransfer.getOutWarehouseId()); 
 | 
        if(Objects.isNull(warehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库仓库数据"); 
 | 
        } 
 | 
  
 | 
        List<WOutbound> wOutboundOutList  = wOutboundMapper.selectList(new QueryWrapper<WOutbound>() 
 | 
                .eq("ORIGIN_ID",wTransfer.getId()) 
 | 
                .eq("ORIGIN_TYPE",3) 
 | 
        ); 
 | 
        if(wOutboundOutList.size() == Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对应出库单数据!"); 
 | 
        }else if(wOutboundOutList.size() > Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "转库单对应出库单数据异常"); 
 | 
        } 
 | 
        WOutbound wOutboundOut = wOutboundOutList.get(Constants.ZERO); 
 | 
        //1、由于生成转库单是根据操作人 仓位分组, 所以转库单上只会有一个入库仓库 
 | 
        //2、生成入库单单头 
 | 
        WOutbound wOutbound = new WOutbound(); 
 | 
        wOutbound.setCreateUser(loginUserInfo.getId()); 
 | 
        wOutbound.setCreateTime(new Date()); 
 | 
        wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
        wOutbound.setDepartId(loginUserInfo.getComDepartment().getId()); 
 | 
        wOutbound.setCode(wOutboundService.getNextInCode(loginUserInfo.getCompany().getId()));//单据编码 RK-20220519-0001 
 | 
        wOutbound.setOrigin(Constants.ONE); 
 | 
        wOutbound.setValidDate(new Date()); 
 | 
        wOutbound.setType(Constants.ONE); 
 | 
        wOutbound.setOriginType(3); 
 | 
        wOutbound.setOriginCode(wTransfer.getCode()); 
 | 
        wOutbound.setOriginId(wTransfer.getId()); 
 | 
        wOutbound.setUserId(loginUserInfo.getId()); 
 | 
        wOutbound.setWarehouseId(wTransfer.getOutWarehouseId()); 
 | 
        wOutbound.setDealDate(new Date()); 
 | 
        wOutbound.setStatus(Constants.ONE); 
 | 
        wOutbound.setPlanDate(wTransfer.getInPlandate()); 
 | 
        wOutbound.setBillType(29); 
 | 
        wOutboundExtMapper.insert(wOutbound); 
 | 
  
 | 
        List<WOutboundRecord> wOutboundDetailOutList = wOutboundRecordMapper.selectList( 
 | 
                new QueryWrapper<WOutboundRecord>() 
 | 
                        .select(" OUTBOUND_ID , DETAIL_ID , MATERIAL_ID , UNIT_ID , WAREHOUSE_ID , BATCH , LOCATION_ID , QUALITY_TYPE , PROCEDURE_ID , sum(NUM) as NUM ") 
 | 
                        .eq("OUTBOUND_ID",wOutboundOut.getId()) 
 | 
                        .groupBy(" OUTBOUND_ID, DETAIL_ID , MATERIAL_ID , UNIT_ID , WAREHOUSE_ID , BATCH , LOCATION_ID , QUALITY_TYPE , PROCEDURE_ID  ") 
 | 
        ); 
 | 
  
 | 
        for (WOutboundRecord wOutboundDetail:wOutboundDetailOutList) { 
 | 
            WOutboundDetail wOutboundInDetail = new WOutboundDetail(); 
 | 
            wOutboundInDetail.setId(null); 
 | 
            wOutboundInDetail.setOutboundId(wOutbound.getId()); 
 | 
            wOutboundInDetail.setDeleted(Constants.ZERO); 
 | 
            wOutboundInDetail.setCreateUser(loginUserInfo.getId()); 
 | 
            wOutboundInDetail.setCreateTime(new Date()); 
 | 
            wOutboundInDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
            wOutboundInDetail.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
            wOutboundInDetail.setUnitId(wOutboundDetail.getUnitId()); 
 | 
            wOutboundInDetail.setBatch(wOutboundDetail.getBatch()); 
 | 
            wOutboundInDetail.setNum(wOutboundDetail.getNum()); 
 | 
            wOutboundInDetail.setDoneDate(new Date()); 
 | 
            wOutboundInDetail.setDoneNum(wOutboundDetail.getNum()); 
 | 
            wOutboundInDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
            wOutboundInDetail.setStatus(Constants.ONE); 
 | 
            wOutboundInDetail.setQualityType(wOutboundDetail.getQualityType()); 
 | 
            wOutboundInDetail.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
            wOutboundInDetail.setLocationId(wOutboundDetail.getLocationId()); 
 | 
            wOutboundDetailExtMapper.insert(wOutboundInDetail); 
 | 
  
 | 
            //记录库存变动记录 
 | 
            wStockRecordExtService.saveRecord(Constants.ONE,wOutboundDetail.getDetailId(),loginUserInfo); 
 | 
  
 | 
            List<WOutboundRecord> wOutboundRecordOutListByDetail = wOutboundRecordMapper.selectList( 
 | 
                    new QueryWrapper<WOutboundRecord>().eq("DETAIL_ID",wOutboundDetail.getDetailId()) 
 | 
            ); 
 | 
            for (WOutboundRecord wOutboundRecord:wOutboundRecordOutListByDetail) { 
 | 
                WOutboundRecord wOutboundRecordIn = wOutboundRecord; 
 | 
                wOutboundRecordIn.setId(null); 
 | 
                wOutboundRecordIn.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundRecordIn.setCreateTime(new Date()); 
 | 
                wOutboundRecordIn.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                wOutboundRecordIn.setOutboundId(wOutboundInDetail.getOutboundId()); 
 | 
                wOutboundRecordIn.setDetailId(wOutboundInDetail.getId()); 
 | 
                wOutboundRecordIn.setLocationId(wOutboundRecord.getLocationId()); 
 | 
                wOutboundRecordIn.setQualityType(wOutboundRecord.getQualityType()); 
 | 
                wOutboundRecordIn.setProcedureId(wOutboundRecord.getProcedureId()); 
 | 
                wOutboundRecordExtMapper.insert(wOutboundRecordIn); 
 | 
                //更新工装器具数据 
 | 
                Appliances appliances = appliancesExtMapper.selectById(wOutboundRecordIn.getAppliancesId()); 
 | 
                if(!Objects.isNull(appliances)){ 
 | 
                    appliances.setCurObjType(Constants.ZERO); 
 | 
                    appliances.setCurObjId(wOutbound.getId()); 
 | 
                    appliances.setWarehouseId(wOutboundInDetail.getWarehouseId()); 
 | 
                    appliances.setLocationId(wOutboundInDetail.getLocationId()); 
 | 
                    appliancesExtMapper.updateById(appliances); 
 | 
                } 
 | 
            } 
 | 
            QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
            wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
            wrapper.eq("MATERIAL_ID", wOutboundInDetail.getMaterialId()); 
 | 
            wrapper.eq("WAREHOUSE_ID", wOutbound.getWarehouseId()); 
 | 
            wrapper.eq("QUALITY_TYPE", wOutboundInDetail.getQualityType()); 
 | 
            if(!Objects.isNull(wOutboundInDetail.getProcedureId())){ 
 | 
                wrapper.eq("PROCEDURE_ID" , wOutboundInDetail.getProcedureId()); 
 | 
            }else{ 
 | 
                wrapper.apply("PROCEDURE_ID is null "); 
 | 
            } 
 | 
            if(StringUtils.isNotBlank(wOutboundInDetail.getBatch())){ 
 | 
                wrapper.eq("BATCH" , wOutboundInDetail.getBatch()); 
 | 
            }else{ 
 | 
                wrapper.apply("BATCH is null "); 
 | 
            } 
 | 
            wrapper.eq(!Objects.isNull(wOutboundInDetail.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundInDetail.getLocationId()); 
 | 
            wrapper.eq("DELETED",0); 
 | 
            //更新库存 
 | 
            WStock wStock = wStockExtMapper.selectOne(wrapper); 
 | 
            if (Objects.isNull(wStock)) { 
 | 
                WStock newWStock = new WStock(); 
 | 
                newWStock.setCreateTime(new Date()); 
 | 
                newWStock.setCreateUser(loginUserInfo.getId()); 
 | 
                newWStock.setRootDepartId(wOutboundInDetail.getRootDepartId()); 
 | 
                newWStock.setMaterialId(wOutboundInDetail.getMaterialId()); 
 | 
                newWStock.setBatch(wOutboundInDetail.getBatch()); 
 | 
                newWStock.setDeleted(Constants.ZERO); 
 | 
                newWStock.setWarehouseId(warehouse.getId()); 
 | 
                newWStock.setProcedureId(wOutboundInDetail.getProcedureId()); 
 | 
                newWStock.setQualityType(wOutboundInDetail.getQualityType()); 
 | 
                //此仓库 开启仓位 
 | 
                if(warehouse.getUseLocation()==Constants.ONE){ 
 | 
                    newWStock.setLocationId(wOutboundInDetail.getLocationId()); 
 | 
                } 
 | 
                newWStock.setUnitId(wOutboundInDetail.getUnitId()); 
 | 
                newWStock.setNum(wOutboundInDetail.getDoneNum()); 
 | 
                wStockExtMapper.insert(newWStock); 
 | 
            }else{ 
 | 
                wStock.setNum(wStock.getNum().add(wOutboundInDetail.getDoneNum())); 
 | 
                wStockExtMapper.updateById(wStock); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        wTransfer.setStatus(4); 
 | 
        wTransfer.setInActdate(new Date()); 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
  
 | 
        //记录操作记录 1、转库单 2、出入库单 
 | 
        WHistory wHistoryTransfer = wTransfer.toWHistory(loginUserInfo); 
 | 
        wHistoryMapper.insert(wHistoryTransfer); 
 | 
        WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
  
 | 
        noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()).getNoticeInType(),null); 
 | 
  
 | 
        return ApiResponse.success("退回成功"); 
 | 
    } 
 | 
  
 | 
  
 | 
    @Transactional 
 | 
    @Override 
 | 
    public void scanTransfer(ScanWTransferExtDTO scanWTransferExtDTO,LoginUserInfo loginUserInfo){ 
 | 
        boolean same = Objects.equals(scanWTransferExtDTO.getOutWarehouseId(),scanWTransferExtDTO.getInWarehouseId()); 
 | 
  
 | 
        Warehouse warehouseOut =  warehouseMapper.selectById(scanWTransferExtDTO.getOutWarehouseId()); 
 | 
        if(Objects.isNull(warehouseOut)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转出仓库信息异常"); 
 | 
        } 
 | 
  
 | 
        Warehouse warehouseIn =  warehouseMapper.selectById(scanWTransferExtDTO.getInWarehouseId()); 
 | 
        if(Objects.isNull(warehouseIn)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转入仓库信息异常"); 
 | 
        } 
 | 
  
 | 
        //出库仓库与入库相等时,必须有转入货位 
 | 
        if(scanWTransferExtDTO.getOutWarehouseId().equals(scanWTransferExtDTO.getInWarehouseId()) 
 | 
                &&Objects.equals(warehouseIn.getUseLocation(),Constants.ONE) 
 | 
                &&Objects.isNull(scanWTransferExtDTO.getInLocationId())){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "入库货位为空!"); 
 | 
        } 
 | 
//        if(scanWTransferExtDTO.getOutWarehouseId().equals(scanWTransferExtDTO.getInWarehouseId())){ 
 | 
//            same = true; 
 | 
//        } 
 | 
        List<Long> idList = scanWTransferExtDTO.getIdList(); 
 | 
        if(Objects.isNull(idList)||idList.size()<=Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "篮筐数据为空!"); 
 | 
        } 
 | 
        //查询是否存在篮筐为空的数据 
 | 
       if(appliancesMapper.selectCount(new QueryWrapper<Appliances>() 
 | 
                .apply("  LOCATION_ID is null  and find_in_set(id,'"+StringUtils.join(idList.toArray(), ",")+"') ") 
 | 
        )>Constants.ZERO){ 
 | 
           throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "存在篮筐无货位信息数据!"); 
 | 
       }; 
 | 
        //获取所有篮筐数据 
 | 
        List<Appliances> detailList = appliancesMapper.selectList(new QueryWrapper<Appliances>() 
 | 
                .select(" MATERIAL_ID,BATCH,WAREHOUSE_ID,LOCATION_ID,QUALITY_TYPE,PROCEDURE_ID,sum(NUM) as NUM ") 
 | 
                .apply(" find_in_set(id,'"+StringUtils.join(idList.toArray(), ",")+"') ") 
 | 
                .groupBy(" MATERIAL_ID,BATCH,WAREHOUSE_ID,LOCATION_ID,QUALITY_TYPE,PROCEDURE_ID ") 
 | 
        ); 
 | 
  
 | 
        List<Appliances> appliancesList = appliancesMapper.selectList(new QueryWrapper<Appliances>() 
 | 
                .apply(" find_in_set(id,'"+StringUtils.join(idList.toArray(), ",")+"') ") 
 | 
        ); 
 | 
  
 | 
  
 | 
        for(Appliances appliances:appliancesList) { 
 | 
            //查询篮筐是否处于投料中 
 | 
            if(appliancesExtMapper.selectCount(new QueryWrapper<Appliances>() 
 | 
                    .eq("id",appliances.getId()) 
 | 
                    .apply("  id in ( select b.APPLIANCES_ID from workorder a inner join  workorder_record b on a.id = b.WORKORDER_ID and a.status in ( 0,1,2,3 ) and b.DELETED = 0 )    ") 
 | 
            )>Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,工装【" + appliances.getCode() + "】处于投料中"); 
 | 
            }; 
 | 
            if (same) { 
 | 
                if (!Objects.isNull(appliances.getLocationId()) && Objects.equals(appliances.getLocationId(), scanWTransferExtDTO.getInLocationId())) { 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装【" + appliances.getCode() + "】的转出货位与转入货位相同!"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        //验证所有篮筐数据是否满足仓库属性 
 | 
        //根据货位类别 区分是否验证工装器具类别 
 | 
        SystemDictData outWarehouseDictData = systemDictDataMapper.selectById(warehouseOut.getSystemDicDataId()); 
 | 
        if(Objects.isNull(outWarehouseDictData)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库仓库属性类别"); 
 | 
        } 
 | 
        SystemDictData inWarehouseDictData = systemDictDataMapper.selectById(warehouseIn.getSystemDicDataId()); 
 | 
        if(Objects.isNull(inWarehouseDictData)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库仓库属性类别"); 
 | 
        } 
 | 
  
 | 
        if(!outWarehouseDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.mix)){ 
 | 
            for(Appliances appliances:appliancesList){ 
 | 
                //验证篮筐不一致 
 | 
                SystemDictData appliancesDictData = systemDictDataMapper.selectById(appliances.getType()); 
 | 
                if(appliancesDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.mix)){ 
 | 
                    continue; 
 | 
                } 
 | 
                if(!Objects.equals(appliancesDictData.getId(),outWarehouseDictData.getId())){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装【"+appliances.getCode()+"】的质量属性与出库仓库属性不一致!"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if(!inWarehouseDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.mix)){ 
 | 
            for(Appliances appliances:appliancesList){ 
 | 
                SystemDictData appliancesDictData = systemDictDataMapper.selectById(appliances.getType()); 
 | 
                if(appliancesDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.mix)){ 
 | 
                    continue; 
 | 
                } 
 | 
                if(!Objects.equals(appliancesDictData.getId(),inWarehouseDictData.getId())){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装【"+appliances.getCode()+"】的质量属性与入库仓库属性不一致!"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        WTransfer wTransfer = new WTransfer(); 
 | 
        wTransfer.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
        wTransfer.setInDepartId(loginUserInfo.getCurComDepartment().getId());   
 | 
        wTransfer.setOutPlandate(new Date()); 
 | 
        wTransfer.setInPlandate(new Date()); 
 | 
        wTransfer.setCreateTime(new Date()); 
 | 
        wTransfer.setCreateUser(loginUserInfo.getId()); 
 | 
        wTransfer.setCode(getNextCode(loginUserInfo.getCompany().getId())); 
 | 
        wTransfer.setValidDate(new Date()); 
 | 
        wTransfer.setOutDepartId(warehouseOut.getDepartId()); 
 | 
        wTransfer.setOutUserId(warehouseOut.getManagerId()); 
 | 
        wTransfer.setOutWarehouseId(warehouseOut.getId()); 
 | 
        wTransfer.setType(this.checkBillType(warehouseOut,warehouseIn)); 
 | 
        wTransfer.setInUserId(warehouseIn.getManagerId()); 
 | 
        wTransfer.setInDepartId(warehouseIn.getDepartId()); 
 | 
        wTransfer.setInWarehouseId(warehouseIn.getId()); 
 | 
        wTransfer.setStatus(same?Constants.TWO:Constants.ONE); 
 | 
        wTransfer.setInActdate(same?new Date():null); 
 | 
        wTransfer.setOutActdate(new Date()); 
 | 
        wTransferMapper.insert(wTransfer); 
 | 
        detailList.forEach(i->{ 
 | 
            MaterialDistribute materialDistribute = materialDistributeMapper.selectById(i.getMaterialId()); 
 | 
            WTransferDetail wTransferDetail = new WTransferDetail(); 
 | 
            wTransferDetail.setCreateUser(loginUserInfo.getId()); 
 | 
            wTransferDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
            wTransferDetail.setTransferId(wTransfer.getId()); 
 | 
            wTransferDetail.setMaterialId(i.getMaterialId()); 
 | 
            wTransferDetail.setUnitId(materialDistribute.getUnitId()); 
 | 
            wTransferDetail.setOutDepartId(wTransfer.getOutDepartId()); 
 | 
            wTransferDetail.setOutWarehouseId(wTransfer.getOutWarehouseId()); 
 | 
            wTransferDetail.setOutLocationId(i.getLocationId()); 
 | 
            wTransferDetail.setBatch(i.getBatch()); 
 | 
            wTransferDetail.setOutPlannum(i.getNum()); 
 | 
            wTransferDetail.setOutActnum(i.getNum()); 
 | 
            wTransferDetail.setOutActdate(new Date()); 
 | 
            wTransferDetail.setInDepartId(wTransfer.getInDepartId()); 
 | 
            wTransferDetail.setInWarehouseId(wTransfer.getInWarehouseId()); 
 | 
            wTransferDetail.setInLcoationId(scanWTransferExtDTO.getInLocationId()); 
 | 
            if(same){ 
 | 
                wTransferDetail.setInActdate(new Date()); 
 | 
                wTransferDetail.setInActnum(i.getNum()); 
 | 
            } 
 | 
            wTransferDetail.setQualityType(i.getQualityType()); 
 | 
            wTransferDetail.setProcedureId(i.getProcedureId()); 
 | 
            wTransferDetailExtMapper.insert(wTransferDetail); 
 | 
        }); 
 | 
        //创建出库单据 
 | 
        WOutbound wOutbound = new WOutbound(); 
 | 
        wOutbound.setPlanDate(new Date()); 
 | 
        wOutbound.setBillType(wTransfer.getType()); 
 | 
        wOutbound.setType(Constants.ZERO); 
 | 
        wOutbound.setWarehouseId(warehouseOut.getId()); 
 | 
        wOutbound.setCreateTime(new Date()); 
 | 
        wOutbound.setCreateUser(loginUserInfo.getId()); 
 | 
        wOutbound.setValidDate(new Date()); 
 | 
        wOutbound.setStatus(Constants.ONE); 
 | 
        wOutbound.setOriginType(3); 
 | 
        wOutbound.setOriginCode(wTransfer.getCode()); 
 | 
        wOutbound.setOriginId(wTransfer.getId()); 
 | 
        wOutbound.setOrigin(Constants.ONE); 
 | 
        wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
        wOutbound.setDepartId(loginUserInfo.getCurComDepartment().getId()); 
 | 
        wOutbound.setUserId(loginUserInfo.getId()); 
 | 
        wOutbound.setCode(wOutboundService.getNextOutCode(loginUserInfo.getCompany().getId())); 
 | 
        wOutbound.setDealDate(new Date()); 
 | 
        wOutboundMapper.insert(wOutbound); 
 | 
        detailList.forEach(i->{ 
 | 
            MaterialDistribute materialDistribute = materialDistributeMapper.selectById(i.getMaterialId()); 
 | 
            WOutboundDetail wOutboundDetail = new WOutboundDetail(); 
 | 
            wOutboundDetail.setNum(i.getNum()); 
 | 
            wOutboundDetail.setDoneNum(i.getNum()); 
 | 
            wOutboundDetail.setUnitId(materialDistribute.getId()); 
 | 
            wOutboundDetail.setBatch(i.getBatch()); 
 | 
            wOutboundDetail.setMaterialId(i.getMaterialId()); 
 | 
            wOutboundDetail.setLocationId(i.getLocationId()); 
 | 
            wOutboundDetail.setOutboundId(wOutbound.getId()); 
 | 
            wOutboundDetail.setCreateTime(new Date()); 
 | 
            wOutboundDetail.setCreateUser(loginUserInfo.getId()); 
 | 
            wOutboundDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
            wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
            wOutboundDetail.setDoneDate(new Date()); 
 | 
            wOutboundDetail.setStatus(Constants.ONE); 
 | 
            wOutboundDetail.setQualityType(i.getQualityType()); 
 | 
            wOutboundDetail.setProcedureId(i.getProcedureId()); 
 | 
            wOutboundDetailMapper.insert(wOutboundDetail); 
 | 
  
 | 
            //添加操作记录 
 | 
            for (Appliances appliances:appliancesList) { 
 | 
                if(Objects.equals(appliances.getMaterialId(),i.getMaterialId()) 
 | 
                        &&Objects.equals(appliances.getBatch(),i.getBatch()) 
 | 
                        &&Objects.equals(appliances.getWarehouseId(),i.getWarehouseId()) 
 | 
                        &&Objects.equals(appliances.getQualityType(),i.getQualityType()) 
 | 
                        &&Objects.equals(appliances.getLocationId(),i.getLocationId()) 
 | 
                        &&Objects.equals(appliances.getProcedureId(),i.getProcedureId()) 
 | 
                ){ 
 | 
                    WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord(appliances,loginUserInfo); 
 | 
                    wOutboundRecordMapper.insert(wOutboundRecord); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            //记录库存变动记录 
 | 
            wStockRecordExtService.saveRecord(wOutbound.getType(),wOutboundDetail.getId(),loginUserInfo); 
 | 
  
 | 
            //更新库存 记录库存记录数据 
 | 
            QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
            wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
            wrapper.eq("MATERIAL_ID", wOutboundDetail.getMaterialId()); 
 | 
            wrapper.eq("WAREHOUSE_ID", wOutbound.getWarehouseId()); 
 | 
            wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); 
 | 
            if(!Objects.isNull(wOutboundDetail.getProcedureId())){ 
 | 
                wrapper.eq("PROCEDURE_ID" , wOutboundDetail.getProcedureId()); 
 | 
            }else{ 
 | 
                wrapper.apply("PROCEDURE_ID is null "); 
 | 
            } 
 | 
            if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ 
 | 
                wrapper.eq("BATCH" , wOutboundDetail.getBatch()); 
 | 
            }else{ 
 | 
                wrapper.apply("BATCH is null "); 
 | 
            } 
 | 
            wrapper.eq(!Objects.isNull(wOutboundDetail.getLocationId())&&warehouseOut.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundDetail.getLocationId()); 
 | 
            wrapper.eq("DELETED",0); 
 | 
            WStock wStock = wStockExtMapper.selectOne(wrapper); 
 | 
            if(Objects.isNull(wStock)||wOutboundDetail.getNum().compareTo(wStock.getNum())>Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "库存数据不足!"); 
 | 
            } 
 | 
            wStock.setNum(wStock.getNum().subtract(wOutboundDetail.getNum())); 
 | 
            wStockExtMapper.updateById(wStock); 
 | 
            //记录操作记录 1、转库单 2、出入库单 
 | 
            WHistory wHistoryTransfer = wTransfer.toWHistory(loginUserInfo); 
 | 
            wHistoryMapper.insert(wHistoryTransfer); 
 | 
            WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
            wHistoryMapper.insert(wHistory); 
 | 
  
 | 
        }); 
 | 
  
 | 
        //发送通知 
 | 
        if(!same){ 
 | 
            CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                    .eq("USER_ID",wTransfer.getInUserId()) 
 | 
                    .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                    .eq("DELETED",0) 
 | 
            ); 
 | 
            Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()); 
 | 
            if(Objects.isNull(notices_type_transfer)){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单类型信息【"+wTransfer.getType()+"】"); 
 | 
            } 
 | 
            String url = Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.in); 
 | 
            if(notices_type_transfer.getType() == 3){ 
 | 
                url = Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.finish); 
 | 
            } 
 | 
            sendInNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),notices_type_transfer,url); 
 | 
        }else{ 
 | 
            WOutbound wOutboundIn = new WOutbound(); 
 | 
            wOutboundIn.setPlanDate(new Date()); 
 | 
            wOutboundIn.setBillType(wTransfer.getType()); 
 | 
            wOutboundIn.setType(Constants.ONE); 
 | 
            wOutboundIn.setWarehouseId(warehouseIn.getId()); 
 | 
            wOutboundIn.setCreateTime(new Date()); 
 | 
            wOutboundIn.setCreateUser(loginUserInfo.getId()); 
 | 
            wOutboundIn.setValidDate(new Date()); 
 | 
            wOutboundIn.setStatus(Constants.ONE); 
 | 
            wOutboundIn.setOriginType(3); 
 | 
            wOutboundIn.setOriginCode(wTransfer.getCode()); 
 | 
            wOutboundIn.setOriginId(wTransfer.getId()); 
 | 
            wOutboundIn.setOrigin(Constants.ONE); 
 | 
            wOutboundIn.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
            wOutboundIn.setDepartId(loginUserInfo.getCurComDepartment().getId()); 
 | 
            wOutboundIn.setUserId(loginUserInfo.getId()); 
 | 
            wOutboundIn.setDealDate(new Date()); 
 | 
            wOutboundIn.setCode(wOutboundService.getNextInCode(loginUserInfo.getCompany().getId())); 
 | 
            wOutboundMapper.insert(wOutboundIn); 
 | 
            detailList.forEach(i-> { 
 | 
                MaterialDistribute materialDistribute = materialDistributeMapper.selectById(i.getMaterialId()); 
 | 
                WOutboundDetail wOutboundDetail = new WOutboundDetail(); 
 | 
                wOutboundDetail.setNum(i.getNum()); 
 | 
                wOutboundDetail.setDoneNum(i.getNum()); 
 | 
                wOutboundDetail.setUnitId(materialDistribute.getUnitId()); 
 | 
                wOutboundDetail.setBatch(i.getBatch()); 
 | 
                wOutboundDetail.setMaterialId(i.getMaterialId()); 
 | 
                wOutboundDetail.setLocationId(Objects.equals(warehouseIn.getUseLocation(),Constants.ONE)?scanWTransferExtDTO.getInLocationId():null); 
 | 
                wOutboundDetail.setOutboundId(wOutboundIn.getId()); 
 | 
                wOutboundDetail.setCreateTime(new Date()); 
 | 
                wOutboundDetail.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
                wOutboundDetail.setWarehouseId(wOutboundIn.getWarehouseId()); 
 | 
                wOutboundDetail.setQualityType(i.getQualityType()); 
 | 
                wOutboundDetail.setProcedureId(i.getProcedureId()); 
 | 
                wOutboundDetail.setDoneDate(new Date()); 
 | 
                wOutboundDetail.setStatus(Constants.ONE); 
 | 
                wOutboundDetailMapper.insert(wOutboundDetail); 
 | 
                //添加操作记录 
 | 
                for (Appliances appliances : appliancesList) { 
 | 
                    if (Objects.equals(appliances.getMaterialId(), i.getMaterialId()) 
 | 
                            && Objects.equals(appliances.getBatch(), i.getBatch()) 
 | 
                            && Objects.equals(appliances.getWarehouseId(), i.getWarehouseId()) 
 | 
                            && Objects.equals(appliances.getQualityType(), i.getQualityType()) 
 | 
                            && Objects.equals(appliances.getLocationId(), i.getLocationId()) 
 | 
                            && Objects.equals(appliances.getProcedureId(), i.getProcedureId()) 
 | 
                    ) { 
 | 
                        WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord(appliances, loginUserInfo); 
 | 
                        wOutboundRecordMapper.insert(wOutboundRecord); 
 | 
                    } 
 | 
                } 
 | 
  
 | 
                //记录库存变动记录 
 | 
                wStockRecordExtService.saveRecord(wOutboundIn.getType(),wOutboundDetail.getId(),loginUserInfo); 
 | 
  
 | 
                //更新库存 记录库存记录数据 
 | 
                QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
                wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
                wrapper.eq("MATERIAL_ID", wOutboundDetail.getMaterialId()); 
 | 
                wrapper.eq("WAREHOUSE_ID", wOutbound.getWarehouseId()); 
 | 
                wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); 
 | 
                if(!Objects.isNull(wOutboundDetail.getProcedureId())){ 
 | 
                    wrapper.eq("PROCEDURE_ID" , wOutboundDetail.getProcedureId()); 
 | 
                }else{ 
 | 
                    wrapper.apply("PROCEDURE_ID is null "); 
 | 
                } 
 | 
                if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ 
 | 
                    wrapper.eq("BATCH" , wOutboundDetail.getBatch()); 
 | 
                }else{ 
 | 
                    wrapper.apply("BATCH is null "); 
 | 
                } 
 | 
                wrapper.eq(!Objects.isNull(wOutboundDetail.getLocationId())&&warehouseIn.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundDetail.getLocationId()); 
 | 
                wrapper.eq("DELETED",0); 
 | 
                WStock wStock = wStockExtMapper.selectOne(wrapper); 
 | 
                if (Objects.isNull(wStock)) { 
 | 
                    WStock newWStock = new WStock(); 
 | 
                    newWStock.setCreateTime(new Date()); 
 | 
                    newWStock.setCreateUser(loginUserInfo.getId()); 
 | 
                    newWStock.setRootDepartId(wOutboundIn.getRootDepartId()); 
 | 
                    newWStock.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
                    newWStock.setBatch(wOutboundDetail.getBatch()); 
 | 
                    newWStock.setDeleted(Constants.ZERO); 
 | 
                    newWStock.setWarehouseId(warehouseIn.getId()); 
 | 
                    newWStock.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
                    newWStock.setQualityType(wOutboundDetail.getQualityType()); 
 | 
                    newWStock.setLocationId(Objects.equals(warehouseIn.getUseLocation(),Constants.ONE)?scanWTransferExtDTO.getInLocationId():null); 
 | 
                    newWStock.setUnitId(wOutboundDetail.getUnitId()); 
 | 
                    newWStock.setNum(wOutboundDetail.getDoneNum()); 
 | 
                    wStockExtMapper.insert(newWStock); 
 | 
                }else{ 
 | 
                    wStock.setNum(wStock.getNum().add(wOutboundDetail.getDoneNum())); 
 | 
                    wStockExtMapper.updateById(wStock); 
 | 
                } 
 | 
                WHistory wHistory = wOutboundIn.toWHistory(loginUserInfo.getId()); 
 | 
                wHistoryMapper.insert(wHistory); 
 | 
            }); 
 | 
        } 
 | 
        //更新篮筐归属数据 
 | 
        appliancesList.forEach(i->{ 
 | 
            if(same){ 
 | 
                i.setLocationId(Objects.equals(warehouseIn.getUseLocation(),Constants.ONE)?scanWTransferExtDTO.getInLocationId():null); 
 | 
            }else{ 
 | 
                i.setLocationId(null); 
 | 
                i.setWarehouseId(null); 
 | 
            } 
 | 
            appliancesMapper.updateById(i); 
 | 
        }); 
 | 
    } 
 | 
  
 | 
    public Integer checkBillType(Warehouse outWarehouse,Warehouse inWarehouse){ 
 | 
        //转出仓库 - 公司库 
 | 
        if(Objects.equals(outWarehouse.getAscription(),Constants.ZERO)){ 
 | 
            if(Objects.equals(outWarehouse.getType(),7)&&Objects.equals(inWarehouse.getType(),7)){ 
 | 
                return Constants.Notices_Type_Transfer.title11.getType();//让步放行转库 
 | 
            } 
 | 
            if(Objects.equals(inWarehouse.getAscription(),Constants.ZERO)){ 
 | 
                if(Objects.equals(outWarehouse.getRootDepartId(),inWarehouse.getRootDepartId())){ 
 | 
                    return Constants.Notices_Type_Transfer.title9.getType(); //成品转库 
 | 
                }else{ 
 | 
                    return Constants.Notices_Type_Transfer.title14.getType();//跨组织转库 
 | 
                } 
 | 
            }else if(Objects.equals(inWarehouse.getAscription(),Constants.ONE)){ 
 | 
                if(Objects.equals(outWarehouse.getType(),6)){ 
 | 
                    return Constants.Notices_Type_Transfer.title12.getType();//客返品返修 
 | 
                }else if(Objects.equals(outWarehouse.getType(),5)){ 
 | 
                    return Constants.Notices_Type_Transfer.title16.getType();//客退品返修 
 | 
                }else{ 
 | 
                    return Constants.Notices_Type_Transfer.title1.getType();//车间领料 
 | 
                } 
 | 
            }else{ 
 | 
                if(!Objects.equals(outWarehouse.getType(),8)&&!Objects.equals(inWarehouse.getType(),8)){ 
 | 
                    return Constants.Notices_Type_Transfer.title6.getType();//外协领料转库 
 | 
                }else{ 
 | 
                    throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
                } 
 | 
            } 
 | 
        //转出仓库 - 车间库 
 | 
        }else if(Objects.equals(outWarehouse.getAscription(),Constants.ONE)){ 
 | 
            if(Objects.equals(inWarehouse.getAscription(),Constants.ZERO)){ 
 | 
                if(Objects.equals(outWarehouse.getType(),8)&&Objects.equals(inWarehouse.getType(),8)){ 
 | 
                    return Constants.Notices_Type_Transfer.title30.getType();//产品入库 
 | 
                }else if(Objects.equals(outWarehouse.getType(),7)&&Objects.equals(inWarehouse.getType(),7)){ 
 | 
                    return Constants.Notices_Type_Transfer.title10.getType();//让步放行 
 | 
                }else if(Objects.equals(inWarehouse.getType(),6)){ 
 | 
                    return Constants.Notices_Type_Transfer.title13.getType();//客返品返修 
 | 
                }else if(Objects.equals(inWarehouse.getType(),5)){ 
 | 
                    return Constants.Notices_Type_Transfer.title17.getType();//客退品返修入库 
 | 
                }else{ 
 | 
                    if(Objects.equals(inWarehouse.getType(),8)||Objects.equals(outWarehouse.getType(),8)){ 
 | 
                        throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
                    }else{ 
 | 
                        return Constants.Notices_Type_Transfer.title8.getType();//产品入库 
 | 
                    } 
 | 
                } 
 | 
            }else if(Objects.equals(inWarehouse.getAscription(),Constants.ONE)){ 
 | 
                if(!Objects.equals(outWarehouse.getType(),7)&&!Objects.equals(inWarehouse.getType(),7)){ 
 | 
                    return Constants.Notices_Type_Transfer.title5.getType();//车间转库 
 | 
                }else if(Objects.equals(outWarehouse.getType(),7)&&Objects.equals(inWarehouse.getType(),7)){ 
 | 
                    return Constants.Notices_Type_Transfer.title11.getType();//让步放行转库 
 | 
                }else{ 
 | 
                    throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
                } 
 | 
            }else{ 
 | 
                if(Objects.equals(outWarehouse.getType(),7)&&Objects.equals(inWarehouse.getType(),7)){ 
 | 
                    return Constants.Notices_Type_Transfer.title11.getType();//让步放行转库 
 | 
                } 
 | 
                throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
            } 
 | 
        //转出仓库 - 外协库 
 | 
        }else if(Objects.equals(outWarehouse.getAscription(),Constants.TWO)){ 
 | 
  
 | 
            if(Objects.equals(inWarehouse.getAscription(),Constants.ZERO)){ 
 | 
                if(!Objects.equals(outWarehouse.getType(),8)&&!Objects.equals(inWarehouse.getType(),8)){ 
 | 
                    return Constants.Notices_Type_Transfer.title7.getType();//外协完工转库 
 | 
                }else{ 
 | 
                    throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
                } 
 | 
            }else{ 
 | 
                throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
            } 
 | 
        }else{ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未匹配到对应的转库类型"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    public Integer testWarehouse(Integer outWarehouseId, Integer inWarehouseId){ 
 | 
  
 | 
        Warehouse warehouseOut =  warehouseMapper.selectById(outWarehouseId); 
 | 
        if(Objects.isNull(warehouseOut)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转出仓库信息异常"); 
 | 
        } 
 | 
        Warehouse warehouseIn =  warehouseMapper.selectById(inWarehouseId); 
 | 
        if(Objects.isNull(warehouseOut)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转入仓库信息异常"); 
 | 
        } 
 | 
  
 | 
        return this.checkBillType(warehouseOut,warehouseIn); 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    /********************************************************************* 调整业务 开始 *********************************************************************/ 
 | 
    //2023年7月19日14:12:22 
 | 
  
 | 
    /** 
 | 
     * 转库出库业务 标准版使用 
 | 
     * @param submitTransferOutDTO 
 | 
     * @param loginUserInfo 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {Exception.class,BusinessException.class}) 
 | 
    public void wTransferForOutUpload(SubmitTransferOutDTO submitTransferOutDTO,LoginUserInfo loginUserInfo){ 
 | 
        WTransfer wTransfer = wTransferExtMapper.wTransferById(submitTransferOutDTO.getWTransferId()); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(!StringUtils.equals(wTransfer.getStatus().toString(),"0")){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "转库单数据状态错误"); 
 | 
        } 
 | 
        //提交所有行数据 
 | 
        List<SubmitTransferOutDetailDTO> submitTransferOutDetailDTOList = submitTransferOutDTO.getSubmitTransferOutDetailDTOList(); 
 | 
        if(Objects.isNull(submitTransferOutDetailDTOList)||submitTransferOutDetailDTOList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "无行项目数据"); 
 | 
        } 
 | 
        Warehouse warehouse = warehouseMapper.selectById(wTransfer.getOutWarehouseId()); 
 | 
        // 根据转库单 单头 创建出库数据 
 | 
        WOutbound wOutbound = wTransfer.toWOutbound(Constants.ZERO); 
 | 
        if(Objects.isNull(warehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库仓库信息数据"); 
 | 
        } 
 | 
        wOutbound.setRootDepartId(warehouse.getRootDepartId()); 
 | 
        wOutbound.setDepartId(warehouse.getDepartId()); 
 | 
        wOutbound.setUserId(warehouse.getManagerId()); 
 | 
        wOutbound.setWarehouseId(warehouse.getId()); 
 | 
        wOutbound.setCode( wOutboundService.getNextOutCode(loginUserInfo.getCompany().getId())); 
 | 
        wOutboundMapper.insert(wOutbound); 
 | 
        //根据转库单行项目主键分组 
 | 
        Map<String, List<SubmitTransferOutDetailDTO>> submitTransferOutDetailDTOMap = submitTransferOutDetailDTOList.stream() 
 | 
                .collect(Collectors.groupingBy(i -> i.getWTransferDetailId().toString())); 
 | 
        Iterator<String> iter = submitTransferOutDetailDTOMap.keySet().iterator(); 
 | 
        while(iter.hasNext()) { 
 | 
            String key = iter.next(); 
 | 
            WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(key); 
 | 
            if(Objects.isNull(wTransferDetail)){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "转库出库行项目未查询到数据!"); 
 | 
            } 
 | 
            if(!wTransferDetail.getTransferId().equals(submitTransferOutDTO.getWTransferId())){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "转库出库行项目数据与转库单匹配失败!"); 
 | 
            } 
 | 
            List<SubmitTransferOutDetailDTO> dealSubmitTransferOutDetailDTOList =  submitTransferOutDetailDTOList.stream().filter(x -> x.getWTransferDetailId().toString().equals(key)).collect(Collectors.toList()); 
 | 
            BigDecimal sumOut = dealSubmitTransferOutDetailDTOList.stream().map(s -> s.getOutNum()).reduce(BigDecimal.ZERO, BigDecimal::add); 
 | 
            if(sumOut.compareTo(wTransferDetail.getOutPlannum())>Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "填写数量超出转库出库数量!"); 
 | 
            } 
 | 
            wTransferDetail.setOutActdate(new Date()); 
 | 
            wTransferDetail.setOutActnum(sumOut); 
 | 
            wTransferDetailExtMapper.updateById(wTransferDetail); 
 | 
            for (SubmitTransferOutDetailDTO submitTransferOutDetailDTO:dealSubmitTransferOutDetailDTOList) { 
 | 
                WStock wStock = wStockExtMapper.selectById(submitTransferOutDetailDTO.getWStockId()); 
 | 
                WStockRecord wStockRecord = new WStockRecord(); 
 | 
                BeanUtils.copyProperties(wStock,wStockRecord); 
 | 
                wStockRecord.setId(null); 
 | 
                wStockRecord.setNum(submitTransferOutDetailDTO.getOutNum()); 
 | 
                if(Objects.isNull(wStock)){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "未查询到选择库存数据!"); 
 | 
                } 
 | 
                //验证库存信息 
 | 
                if(wStock.getNum().compareTo(submitTransferOutDetailDTO.getOutNum())<Constants.ZERO){ 
 | 
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "库存记录发生变化,无法进行出库!"); 
 | 
                } 
 | 
                //比对批次等数据信息 
 | 
                this.checkDetailStandard(wStock,wTransferDetail); 
 | 
                //存储出库记录 
 | 
                WOutboundDetail wOutboundDetail = new WOutboundDetail(); 
 | 
                wOutboundDetail.setDeleted(Constants.ZERO); 
 | 
                wOutboundDetail.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundDetail.setCreateTime(new Date()); 
 | 
                wOutboundDetail.setOutboundId(wOutbound.getId()); 
 | 
                wOutboundDetail.setMaterialId(wTransferDetail.getMaterialId()); 
 | 
                wOutboundDetail.setUnitId(wTransferDetail.getUnitId()); 
 | 
                wOutboundDetail.setBatch(wTransferDetail.getBatch()); 
 | 
                wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                wOutboundDetail.setLocationId(wStock.getLocationId()); 
 | 
                wOutboundDetail.setNum(wTransferDetail.getOutActnum()); 
 | 
                wOutboundDetail.setDoneNum(submitTransferOutDetailDTO.getOutNum()); 
 | 
                wOutboundDetail.setDoneDate(new Date()); 
 | 
                wOutboundDetail.setStatus(Constants.ONE); 
 | 
                wOutboundDetail.setQualityType(wTransferDetail.getQualityType()); 
 | 
                wOutboundDetail.setProcedureId(wTransferDetail.getProcedureId()); 
 | 
                wOutboundDetail.setRootDepartId(wOutbound.getRootDepartId()); 
 | 
                wOutboundDetailMapper.insert(wOutboundDetail); 
 | 
                 
 | 
                WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord( loginUserInfo); 
 | 
                wOutboundRecordMapper.insert(wOutboundRecord); 
 | 
                 
 | 
                wStockRecord.setBeforNum(wStock.getNum()); 
 | 
                wStock.setNum(wStock.getNum().subtract(submitTransferOutDetailDTO.getOutNum())); 
 | 
                wStockExtMapper.updateById(wStock); 
 | 
                wStockRecord.setAfterNum(wStock.getNum()); 
 | 
                wStockRecord.setOutboundId(wOutbound.getId()); 
 | 
                wStockRecord.setWStockId(wStock.getId()); 
 | 
                wStockRecord.setDetailId(wOutboundDetail.getId()); 
 | 
                wStockRecordExtService.insertWStockRecord(wStockRecord); 
 | 
            } 
 | 
  
 | 
        } 
 | 
        wTransfer.setStatus(Constants.ONE); 
 | 
        wTransfer.setOutActdate(new Date()); 
 | 
        wTransfer.setUpdateTime(new Date()); 
 | 
        wTransfer.setUpdateUser(loginUserInfo.getId()); 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
        //发送钉钉通知 
 | 
        CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",wTransfer.getInUserId()) 
 | 
                .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                .eq("DELETED",0) 
 | 
        ); 
 | 
        //出入库单操作记录 
 | 
        WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
        //处理通知 
 | 
        Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()); 
 | 
        if(Objects.isNull(notices_type_transfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单类型信息【"+wTransfer.getType()+"】"); 
 | 
        } 
 | 
        noticesExtService.dealNotice(wTransfer.getId(),notices_type_transfer.getNoticeOutType(),null); 
 | 
        String url = Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.in); 
 | 
        if(notices_type_transfer.getType() == 3){ 
 | 
            url =Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.finish); 
 | 
        } 
 | 
        sendInNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),notices_type_transfer,url); 
 | 
    } 
 | 
  
 | 
  
 | 
    public void checkDetailStandard(WStock wStock , WTransferDetail wTransferDetail){ 
 | 
        if(!Objects.isNull(wTransferDetail.getOutLocationId())&&!Objects.equals(wStock.getLocationId(),wTransferDetail.getOutLocationId())){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "仓位信息信息不匹配"); 
 | 
        } 
 | 
        if(!Objects.equals(wTransferDetail.getMaterialId(),wStock.getMaterialId())){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料信息信息不匹配"); 
 | 
        } 
 | 
        if(!Objects.isNull(wTransferDetail.getBatch())&&!Objects.equals(wStock.getBatch(),wTransferDetail.getBatch())){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料批次信息不匹配"); 
 | 
        } 
 | 
        if(!Objects.equals(wStock.getQualityType(),wTransferDetail.getQualityType())){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料质量属性信息不匹配"); 
 | 
        } 
 | 
        if(!Objects.isNull(wTransferDetail.getProcedureId())&&!Objects.equals(wTransferDetail.getProcedureId(),wStock.getProcedureId())){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料工序信息不匹配"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {Exception.class,BusinessException.class}) 
 | 
    public void wTransferForInUpload(SubmitTransferInDTO submitTransferInDTO, LoginUserInfo loginUserInfo){ 
 | 
        WTransferRedisBean wTransferRedisBean = new WTransferRedisBean(); 
 | 
        WTransfer wTransfer = wTransferExtMapper.wTransferById(submitTransferInDTO.getWTransferId()); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(!StringUtils.equals(wTransfer.getStatus().toString(),"1")){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "转库单数据状态错误"); 
 | 
        } 
 | 
        //提交所有行数据 
 | 
        List<SubmitTransferInDetailDTO> submitTransferInDetailDTOList = submitTransferInDTO.getSubmitTransferInDetailDTOList(); 
 | 
        if(Objects.isNull(submitTransferInDetailDTOList)||submitTransferInDetailDTOList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "无行项目数据"); 
 | 
        } 
 | 
        Warehouse warehouse = warehouseMapper.selectById(wTransfer.getInWarehouseId()); 
 | 
        // 根据转库单 单头 创建入库数据 
 | 
        WOutbound wOutbound = wTransfer.toWOutbound(Constants.ONE); 
 | 
        if(Objects.isNull(warehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库仓库信息数据"); 
 | 
        } 
 | 
        wOutbound.setRootDepartId(warehouse.getRootDepartId()); 
 | 
        wOutbound.setDepartId(warehouse.getDepartId()); 
 | 
        wOutbound.setUserId(warehouse.getManagerId()); 
 | 
        wOutbound.setWarehouseId(warehouse.getId()); 
 | 
        wOutbound.setCode( wOutboundService.getNextInCode(loginUserInfo.getCompany().getId())); 
 | 
        wOutboundMapper.insert(wOutbound); 
 | 
        //根据转库单行项目主键分组 
 | 
        Map<String, List<SubmitTransferInDetailDTO>> submitTransferInDetailDTOMap = submitTransferInDetailDTOList.stream() 
 | 
                .collect(Collectors.groupingBy(i -> i.getWTransferDetailId().toString())); 
 | 
        Iterator<String> iter = submitTransferInDetailDTOMap.keySet().iterator(); 
 | 
        while(iter.hasNext()) { 
 | 
            String key = iter.next(); 
 | 
            WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(key); 
 | 
            if(Objects.isNull(wTransferDetail)){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "转库出库行项目未查询到数据!"); 
 | 
            } 
 | 
            if(!wTransferDetail.getTransferId().equals(submitTransferInDTO.getWTransferId())){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "转库入库行项目数据与转库单匹配失败!"); 
 | 
            } 
 | 
            List<SubmitTransferInDetailDTO> dealSubmitTransferInDetailDTOList =  submitTransferInDetailDTOList.stream() 
 | 
                    .filter(x -> x.getWTransferDetailId().toString().equals(key)).collect(Collectors.toList()); 
 | 
            BigDecimal sumIn = dealSubmitTransferInDetailDTOList.stream().map(s -> s.getInNum()).reduce(BigDecimal.ZERO, BigDecimal::add); 
 | 
            if(sumIn.compareTo(wTransferDetail.getOutActnum())!=Constants.ZERO){ 
 | 
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "转库入库数量需等于转出库数量!"); 
 | 
            } 
 | 
            wTransferDetail.setInActdate(new Date()); 
 | 
            wTransferDetail.setInActnum(sumIn); 
 | 
            wTransferDetailExtMapper.updateById(wTransferDetail); 
 | 
            for (SubmitTransferInDetailDTO submitTransferInDetailDTO:dealSubmitTransferInDetailDTOList) { 
 | 
  
 | 
                QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
                wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
                wrapper.eq("MATERIAL_ID", wTransferDetail.getMaterialId()); 
 | 
                wrapper.eq("WAREHOUSE_ID", wOutbound.getWarehouseId()); 
 | 
                wrapper.eq("QUALITY_TYPE", wTransferDetail.getQualityType()); 
 | 
                if(!Objects.isNull(wTransferDetail.getProcedureId())){ 
 | 
                    wrapper.eq("PROCEDURE_ID" , wTransferDetail.getProcedureId()); 
 | 
                }else{ 
 | 
                    wrapper.apply("PROCEDURE_ID is null "); 
 | 
                } 
 | 
                if(StringUtils.isNotBlank(wTransferDetail.getBatch())){ 
 | 
                    wrapper.eq("BATCH" , wTransferDetail.getBatch()); 
 | 
                }else{ 
 | 
                    wrapper.apply("BATCH is null "); 
 | 
                } 
 | 
                wrapper.eq(!Objects.isNull(submitTransferInDetailDTO.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", submitTransferInDetailDTO.getLocationId()); 
 | 
                wrapper.eq("DELETED",0); 
 | 
                WStock wStock = wStockExtMapper.selectOne(wrapper); 
 | 
                WStockRecord wStockRecord = new WStockRecord(); 
 | 
                if (Objects.isNull(wStock)) { 
 | 
                    WStock newWStock = new WStock(); 
 | 
                    newWStock.setCreateTime(new Date()); 
 | 
                    newWStock.setCreateUser(loginUserInfo.getId()); 
 | 
                    newWStock.setRootDepartId(wOutbound.getRootDepartId()); 
 | 
                    newWStock.setMaterialId(wTransferDetail.getMaterialId()); 
 | 
                    newWStock.setBatch(wTransferDetail.getBatch()); 
 | 
                    newWStock.setDeleted(Constants.ZERO); 
 | 
                    newWStock.setWarehouseId(warehouse.getId()); 
 | 
                    newWStock.setProcedureId(wTransferDetail.getProcedureId()); 
 | 
                    newWStock.setQualityType(wTransferDetail.getQualityType()); 
 | 
                    newWStock.setLocationId(Objects.equals(warehouse.getUseLocation(),Constants.ONE)?submitTransferInDetailDTO.getLocationId():null); 
 | 
                    newWStock.setUnitId(wTransferDetail.getUnitId()); 
 | 
                    newWStock.setNum(submitTransferInDetailDTO.getInNum()); 
 | 
                    wStockExtMapper.insert(newWStock); 
 | 
                    BeanUtils.copyProperties(newWStock,wStockRecord); 
 | 
                    wStockRecord.setNum(submitTransferInDetailDTO.getInNum()); 
 | 
                    wStockRecord.setBeforNum(BigDecimal.ZERO); 
 | 
                    wStockRecord.setAfterNum(submitTransferInDetailDTO.getInNum()); 
 | 
                    wStockRecord.setWStockId(newWStock.getId()); 
 | 
                }else{ 
 | 
                    BeanUtils.copyProperties(wStock,wStockRecord); 
 | 
                    wStockRecord.setNum(submitTransferInDetailDTO.getInNum()); 
 | 
                    wStockRecord.setBeforNum(wStock.getNum()); 
 | 
                    wStockRecord.setAfterNum(submitTransferInDetailDTO.getInNum()); 
 | 
                    wStockRecord.setWStockId(wStock.getId()); 
 | 
                    wStock.setNum(wStock.getNum().add(submitTransferInDetailDTO.getInNum())); 
 | 
                    wStockExtMapper.updateById(wStock); 
 | 
                } 
 | 
                wStockRecordExtService.insertWStockRecord(wStockRecord); 
 | 
  
 | 
                WOutboundDetail wOutboundDetail = new WOutboundDetail(); 
 | 
                wOutboundDetail.setDeleted(Constants.ZERO); 
 | 
                wOutboundDetail.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundDetail.setCreateTime(new Date()); 
 | 
                wOutboundDetail.setOutboundId(wOutbound.getId()); 
 | 
                wOutboundDetail.setMaterialId(wTransferDetail.getMaterialId()); 
 | 
                wOutboundDetail.setUnitId(wTransferDetail.getUnitId()); 
 | 
                wOutboundDetail.setBatch(wTransferDetail.getBatch()); 
 | 
                wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                wOutboundDetail.setLocationId(submitTransferInDetailDTO.getLocationId()); 
 | 
                wOutboundDetail.setNum(wTransferDetail.getOutActnum()); 
 | 
                wOutboundDetail.setDoneNum(submitTransferInDetailDTO.getInNum()); 
 | 
                wOutboundDetail.setDoneDate(new Date()); 
 | 
                wOutboundDetail.setStatus(Constants.ONE); 
 | 
                wOutboundDetail.setQualityType(wTransferDetail.getQualityType()); 
 | 
                wOutboundDetail.setProcedureId(wTransferDetail.getProcedureId()); 
 | 
                wOutboundDetail.setRootDepartId(wOutbound.getRootDepartId()); 
 | 
                wOutboundDetailMapper.insert(wOutboundDetail); 
 | 
  
 | 
                WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord( loginUserInfo); 
 | 
                wOutboundRecordMapper.insert(wOutboundRecord); 
 | 
  
 | 
                wStockRecord.setOutboundId(wOutbound.getId()); 
 | 
                wStockRecord.setDetailId(wOutboundDetail.getId()); 
 | 
                wStockRecordExtService.insertWStockRecord(wStockRecord); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //出入库单操作记录 
 | 
        WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
        //发送钉钉通知 
 | 
        CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",wTransfer.getInUserId()) 
 | 
                .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                .eq("DELETED",0) 
 | 
        ); 
 | 
        //处理通知 
 | 
        Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()); 
 | 
        if(Objects.isNull(notices_type_transfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单类型信息【"+wTransfer.getType()+"】"); 
 | 
        } 
 | 
        noticesExtService.dealNotice(wTransfer.getId(),notices_type_transfer.getNoticeInType(),null); 
 | 
  
 | 
        wTransfer.setStatus(Constants.TWO); 
 | 
        wTransfer.setInActdate(new Date()); 
 | 
        wTransfer.setUpdateTime(new Date()); 
 | 
        wTransfer.setUpdateUser(loginUserInfo.getId()); 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 转库单退回 
 | 
     * @param id 
 | 
     * @param loginUserInfo 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse wTransferReturnForStandard(Integer id,LoginUserInfo loginUserInfo){ 
 | 
        WTransfer wTransfer = wTransferExtMapper.selectOne(new QueryWrapper<WTransfer>().eq("id",id)); 
 | 
        if(Objects.isNull(wTransfer)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对象信息"); 
 | 
        } 
 | 
        if(wTransfer.getStatus()!=Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误无法进行退回,请检查单据状态"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne( 
 | 
                new QueryWrapper<CompanyUser>().eq("USER_ID",wTransfer.getInUserId()) 
 | 
                        .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
                        .eq("DELETED",0)); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
        List<WTransferDetail> wTransferDetailList = wTransferDetailMapper.selectList( 
 | 
                new QueryWrapper<WTransferDetail>().eq("TRANSFER_ID",wTransfer.getId()) 
 | 
        ); 
 | 
        if(wTransferDetailList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单明细信息"); 
 | 
        } 
 | 
        //仓库数据 
 | 
        Warehouse warehouse = warehouseMapper.selectById(wTransfer.getOutWarehouseId()); 
 | 
        if(Objects.isNull(warehouse)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库仓库数据"); 
 | 
        } 
 | 
  
 | 
        List<WOutbound> wOutboundOutList  = wOutboundMapper.selectList(new QueryWrapper<WOutbound>() 
 | 
                .eq("ORIGIN_ID",wTransfer.getId()) 
 | 
                .eq("ORIGIN_TYPE",3) 
 | 
        ); 
 | 
        if(wOutboundOutList.size() == Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对应出库单数据!"); 
 | 
        }else if(wOutboundOutList.size() > Constants.ONE){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "转库单对应出库单数据异常"); 
 | 
        } 
 | 
        WOutbound wOutboundOut = wOutboundOutList.get(Constants.ZERO); 
 | 
        //1、由于生成转库单是根据操作人 仓位分组, 所以转库单上只会有一个入库仓库 
 | 
        //2、生成入库单单头 
 | 
        WOutbound wOutbound = new WOutbound(); 
 | 
        wOutbound.setCreateUser(loginUserInfo.getId()); 
 | 
        wOutbound.setCreateTime(new Date()); 
 | 
        wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
        wOutbound.setDepartId(loginUserInfo.getComDepartment().getId()); 
 | 
        wOutbound.setCode(wOutboundService.getNextInCode(loginUserInfo.getCompany().getId()));//单据编码 RK-20220519-0001 
 | 
        wOutbound.setOrigin(Constants.ONE); 
 | 
        wOutbound.setValidDate(new Date()); 
 | 
        wOutbound.setType(Constants.ONE); 
 | 
        wOutbound.setOriginType(3); 
 | 
        wOutbound.setOriginCode(wTransfer.getCode()); 
 | 
        wOutbound.setOriginId(wTransfer.getId()); 
 | 
        wOutbound.setUserId(loginUserInfo.getId()); 
 | 
        wOutbound.setWarehouseId(wTransfer.getOutWarehouseId()); 
 | 
        wOutbound.setDealDate(new Date()); 
 | 
        wOutbound.setStatus(Constants.ONE); 
 | 
        wOutbound.setPlanDate(wTransfer.getInPlandate()); 
 | 
        wOutbound.setBillType(29); 
 | 
        wOutboundExtMapper.insert(wOutbound); 
 | 
  
 | 
        List<WOutboundRecord> wOutboundDetailOutList = wOutboundRecordMapper.selectList( 
 | 
                new QueryWrapper<WOutboundRecord>() 
 | 
                        .select(" OUTBOUND_ID , DETAIL_ID , MATERIAL_ID , UNIT_ID , WAREHOUSE_ID , BATCH , LOCATION_ID , QUALITY_TYPE , PROCEDURE_ID , sum(NUM) as NUM ") 
 | 
                        .eq("OUTBOUND_ID",wOutboundOut.getId()) 
 | 
                        .groupBy(" OUTBOUND_ID, DETAIL_ID , MATERIAL_ID , UNIT_ID , WAREHOUSE_ID , BATCH , LOCATION_ID , QUALITY_TYPE , PROCEDURE_ID  ") 
 | 
        ); 
 | 
  
 | 
        for (WOutboundRecord wOutboundDetail:wOutboundDetailOutList) { 
 | 
            WOutboundDetail wOutboundInDetail = new WOutboundDetail(); 
 | 
            wOutboundInDetail.setId(null); 
 | 
            wOutboundInDetail.setOutboundId(wOutbound.getId()); 
 | 
            wOutboundInDetail.setDeleted(Constants.ZERO); 
 | 
            wOutboundInDetail.setCreateUser(loginUserInfo.getId()); 
 | 
            wOutboundInDetail.setCreateTime(new Date()); 
 | 
            wOutboundInDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); 
 | 
            wOutboundInDetail.setMaterialId(wOutboundDetail.getMaterialId()); 
 | 
            wOutboundInDetail.setUnitId(wOutboundDetail.getUnitId()); 
 | 
            wOutboundInDetail.setBatch(wOutboundDetail.getBatch()); 
 | 
            wOutboundInDetail.setNum(wOutboundDetail.getNum()); 
 | 
            wOutboundInDetail.setDoneDate(new Date()); 
 | 
            wOutboundInDetail.setDoneNum(wOutboundDetail.getNum()); 
 | 
            wOutboundInDetail.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
            wOutboundInDetail.setStatus(Constants.ONE); 
 | 
            wOutboundInDetail.setQualityType(wOutboundDetail.getQualityType()); 
 | 
            wOutboundInDetail.setProcedureId(wOutboundDetail.getProcedureId()); 
 | 
            wOutboundInDetail.setLocationId(wOutboundDetail.getLocationId()); 
 | 
            wOutboundDetailExtMapper.insert(wOutboundInDetail); 
 | 
  
 | 
            //记录库存变动记录 
 | 
            wStockRecordExtService.saveRecord(Constants.ONE,wOutboundDetail.getDetailId(),loginUserInfo); 
 | 
  
 | 
            List<WOutboundRecord> wOutboundRecordOutListByDetail = wOutboundRecordMapper.selectList( 
 | 
                    new QueryWrapper<WOutboundRecord>().eq("DETAIL_ID",wOutboundDetail.getDetailId()) 
 | 
            ); 
 | 
            for (WOutboundRecord wOutboundRecord:wOutboundRecordOutListByDetail) { 
 | 
                WOutboundRecord wOutboundRecordIn = wOutboundRecord; 
 | 
                wOutboundRecordIn.setId(null); 
 | 
                wOutboundRecordIn.setCreateUser(loginUserInfo.getId()); 
 | 
                wOutboundRecordIn.setCreateTime(new Date()); 
 | 
                wOutboundRecordIn.setWarehouseId(wOutbound.getWarehouseId()); 
 | 
                wOutboundRecordIn.setOutboundId(wOutboundInDetail.getOutboundId()); 
 | 
                wOutboundRecordIn.setDetailId(wOutboundInDetail.getId()); 
 | 
                wOutboundRecordIn.setLocationId(wOutboundRecord.getLocationId()); 
 | 
                wOutboundRecordIn.setQualityType(wOutboundRecord.getQualityType()); 
 | 
                wOutboundRecordIn.setProcedureId(wOutboundRecord.getProcedureId()); 
 | 
                wOutboundRecordExtMapper.insert(wOutboundRecordIn);  
 | 
            } 
 | 
            QueryWrapper wrapper = new QueryWrapper<WStock>(); 
 | 
            wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); 
 | 
            wrapper.eq("MATERIAL_ID", wOutboundInDetail.getMaterialId()); 
 | 
            wrapper.eq("WAREHOUSE_ID", wOutbound.getWarehouseId()); 
 | 
            wrapper.eq("QUALITY_TYPE", wOutboundInDetail.getQualityType()); 
 | 
            if(!Objects.isNull(wOutboundInDetail.getProcedureId())){ 
 | 
                wrapper.eq("PROCEDURE_ID" , wOutboundInDetail.getProcedureId()); 
 | 
            }else{ 
 | 
                wrapper.apply("PROCEDURE_ID is null "); 
 | 
            } 
 | 
            if(StringUtils.isNotBlank(wOutboundInDetail.getBatch())){ 
 | 
                wrapper.eq("BATCH" , wOutboundInDetail.getBatch()); 
 | 
            }else{ 
 | 
                wrapper.apply("BATCH is null "); 
 | 
            } 
 | 
            wrapper.eq(!Objects.isNull(wOutboundInDetail.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundInDetail.getLocationId()); 
 | 
            wrapper.eq("DELETED",0); 
 | 
            //更新库存 
 | 
            WStock wStock = wStockExtMapper.selectOne(wrapper); 
 | 
            if (Objects.isNull(wStock)) { 
 | 
                WStock newWStock = new WStock(); 
 | 
                newWStock.setCreateTime(new Date()); 
 | 
                newWStock.setCreateUser(loginUserInfo.getId()); 
 | 
                newWStock.setRootDepartId(wOutboundInDetail.getRootDepartId()); 
 | 
                newWStock.setMaterialId(wOutboundInDetail.getMaterialId()); 
 | 
                newWStock.setBatch(wOutboundInDetail.getBatch()); 
 | 
                newWStock.setDeleted(Constants.ZERO); 
 | 
                newWStock.setWarehouseId(warehouse.getId()); 
 | 
                newWStock.setProcedureId(wOutboundInDetail.getProcedureId()); 
 | 
                newWStock.setQualityType(wOutboundInDetail.getQualityType()); 
 | 
                //此仓库 开启仓位 
 | 
                if(warehouse.getUseLocation()==Constants.ONE){ 
 | 
                    newWStock.setLocationId(wOutboundInDetail.getLocationId()); 
 | 
                } 
 | 
                newWStock.setUnitId(wOutboundInDetail.getUnitId()); 
 | 
                newWStock.setNum(wOutboundInDetail.getDoneNum()); 
 | 
                wStockExtMapper.insert(newWStock); 
 | 
            }else{ 
 | 
                wStock.setNum(wStock.getNum().add(wOutboundInDetail.getDoneNum())); 
 | 
                wStockExtMapper.updateById(wStock); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        wTransfer.setStatus(4); 
 | 
        wTransfer.setInActdate(new Date()); 
 | 
        wTransferMapper.updateById(wTransfer); 
 | 
  
 | 
        //记录操作记录 1、转库单 2、出入库单 
 | 
        WHistory wHistoryTransfer = wTransfer.toWHistory(loginUserInfo); 
 | 
        wHistoryMapper.insert(wHistoryTransfer); 
 | 
        WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); 
 | 
        wHistoryMapper.insert(wHistory); 
 | 
  
 | 
        noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type_Transfer.checkEnum(wTransfer.getType()).getNoticeInType(),null); 
 | 
  
 | 
         
 | 
        return ApiResponse.success("退回成功"); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    /********************************************************************* 调整业务 结束 *********************************************************************/ 
 | 
} 
 |