| 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("退回成功"); | 
|     } | 
|   | 
|   | 
|   | 
|     /********************************************************************* 调整业务 结束 *********************************************************************/ | 
| } |