| package doumeemes.service.business.impl; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.baomidou.mybatisplus.core.conditions.Wrapper; | 
| import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 
| 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.QueryWStockDto; | 
| import doumeemes.dao.ext.vo.BarcodeParamExtListVO; | 
| import doumeemes.dao.ext.vo.WOutboundRecordExtListVO; | 
| import doumeemes.dao.ext.vo.WorkorderRecordExtListVO; | 
| import doumeemes.dao.system.SystemDictDataMapper; | 
| import doumeemes.dao.system.SystemUserMapper; | 
| import doumeemes.dao.system.model.SystemDictData; | 
| import doumeemes.dao.system.model.SystemUser; | 
| import doumeemes.service.business.BarcodeParamService; | 
| import doumeemes.service.business.WOutboundService; | 
| 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.BarcodeParamExtService; | 
| import doumeemes.service.ext.NoticesExtService; | 
| import doumeemes.service.ext.WStockRecordExtService; | 
| import doumeemes.service.system.SystemUserExternalService; | 
| import doumeemes.service.system.SystemUserService; | 
| import io.swagger.models.auth.In; | 
| 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 WOutboundServiceImpl implements WOutboundService { | 
|   | 
|     @Autowired | 
|     private RedisTemplate<String, Object> redisTemplate; | 
|   | 
|     @Autowired | 
|     private WOutboundMapper wOutboundMapper; | 
|   | 
|     @Autowired | 
|     private WOutboundExtMapper wOutboundExtMapper; | 
|   | 
|     @Autowired | 
|     private WOutboundDetailExtMapper wOutboundDetailExtMapper; | 
|   | 
|     @Autowired | 
|     private WOutboundDetailMapper wOutboundDetailMapper; | 
|   | 
|     @Autowired | 
|     private WOutboundRecordMapper wOutboundRecordMapper; | 
|   | 
|     @Autowired | 
|     private WOutboundRecordExtMapper wOutboundRecordExtMapper; | 
|   | 
|     @Autowired | 
|     private WorkorderRecordExtMapper workorderRecordExtMapper; | 
|   | 
|     @Autowired | 
|     private WarehouseMapper warehouseMapper; | 
|   | 
|     @Autowired | 
|     private WTransferExtMapper wTransferExtMapper; | 
|   | 
|     @Autowired | 
|     private WHistoryMapper wHistoryMapper; | 
|   | 
|     @Autowired | 
|     private WTransferDetailExtMapper wTransferDetailExtMapper; | 
|   | 
|     @Autowired | 
|     private WTransferDetailMapper wTransferDetailMapper; | 
|     @Autowired | 
|     private AppliancesExtMapper appliancesExtMapper; | 
|   | 
|     @Autowired | 
|     private WStockExtMapper wStockExtMapper; | 
|   | 
|     @Autowired | 
|     private WStockMapper wStockMapper; | 
|   | 
|     @Autowired | 
|     private BarcodeParamExtService barcodeParamExtService; | 
|   | 
|     @Autowired | 
|     private WarehouseLocationExtMapper warehouseLocationExtMapper; | 
|   | 
|     @Autowired | 
|     private SystemDictDataMapper systemDictDataMapper; | 
|   | 
|     @Autowired | 
|     private CompanyUserMapper companyUserMapper; | 
|   | 
|     @Autowired | 
|     private SystemDictDataBiz systemDictDataBiz; | 
|   | 
|     @Autowired | 
|     private NoticesExtService noticesExtService; | 
|   | 
|     @Autowired | 
|     private WTransferMapper wTransferMapper; | 
|   | 
|     @Autowired | 
|     private AppliancesMapper appliancesMapper; | 
|   | 
|     @Autowired | 
|     private MaterialDistributeMapper materialDistributeMapper; | 
|   | 
|     @Autowired | 
|     private MaterialMapper materialMapper; | 
|   | 
|     @Autowired | 
|     private BomMapper bomMapper; | 
|   | 
|     @Autowired | 
|     private RouteProcedureMapper routeProcedureMapper; | 
|   | 
|     @Autowired | 
|     private ProceduresMapper proceduresMapper; | 
|   | 
|     @Autowired | 
|     private AdjustmentRecordMapper adjustmentRecordMapper; | 
|   | 
|     @Autowired | 
|     private WStockRecordExtService wStockRecordExtService; | 
|   | 
|   | 
|     @Autowired | 
|     private CompanyUserExtMapper companyUserExtMapper; | 
|   | 
|     @Autowired | 
|     private DepartmentExtMapper departmentExtMapper; | 
|   | 
|     @Override | 
|     public Integer create(WOutbound wOutbound) { | 
|         wOutboundMapper.insert(wOutbound); | 
|         return wOutbound.getId(); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteById(Integer id) { | 
|         wOutboundMapper.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public void delete(WOutbound wOutbound) { | 
|         UpdateWrapper<WOutbound> deleteWrapper = new UpdateWrapper<>(wOutbound); | 
|         wOutboundMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<Integer> ids) { | 
|         if (CollectionUtils.isEmpty(ids)) { | 
|             return; | 
|         } | 
|         wOutboundMapper.deleteBatchIds(ids); | 
|     } | 
|   | 
|     @Override | 
|     public void updateById(WOutbound wOutbound) { | 
|         wOutboundMapper.updateById(wOutbound); | 
|     } | 
|   | 
|     @Override | 
|     public void updateByIdInBatch(List<WOutbound> wOutbounds) { | 
|         if (CollectionUtils.isEmpty(wOutbounds)) { | 
|             return; | 
|         } | 
|         for (WOutbound wOutbound: wOutbounds) { | 
|             this.updateById(wOutbound); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public WOutbound findById(Integer id) { | 
|         return wOutboundMapper.selectById(id); | 
|     } | 
|   | 
|     @Override | 
|     public WOutbound findOne(WOutbound wOutbound) { | 
|         QueryWrapper<WOutbound> wrapper = new QueryWrapper<>(wOutbound); | 
|         return wOutboundMapper.selectOne(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<WOutbound> findList(WOutbound wOutbound) { | 
|         QueryWrapper<WOutbound> wrapper = new QueryWrapper<>(wOutbound); | 
|         return wOutboundMapper.selectList(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public PageData<WOutbound> findPage(PageWrap<WOutbound> pageWrap) { | 
|         IPage<WOutbound> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
|         QueryWrapper<WOutbound> queryWrapper = new QueryWrapper<>(); | 
|         Utils.MP.blankToNull(pageWrap.getModel()); | 
|         if (pageWrap.getModel().getId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getId, pageWrap.getModel().getId()); | 
|         } | 
|         if (pageWrap.getModel().getDeleted() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getDeleted, pageWrap.getModel().getDeleted()); | 
|         } | 
|         if (pageWrap.getModel().getCreateUser() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getCreateUser, pageWrap.getModel().getCreateUser()); | 
|         } | 
|         if (pageWrap.getModel().getCreateTime() != null) { | 
|             queryWrapper.lambda().ge(WOutbound::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime())); | 
|             queryWrapper.lambda().le(WOutbound::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime())); | 
|         } | 
|         if (pageWrap.getModel().getUpdateUser() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getUpdateUser, pageWrap.getModel().getUpdateUser()); | 
|         } | 
|         if (pageWrap.getModel().getUpdateTime() != null) { | 
|             queryWrapper.lambda().ge(WOutbound::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime())); | 
|             queryWrapper.lambda().le(WOutbound::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime())); | 
|         } | 
|         if (pageWrap.getModel().getRemark() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getRemark, pageWrap.getModel().getRemark()); | 
|         } | 
|         if (pageWrap.getModel().getRootDepartId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getRootDepartId, pageWrap.getModel().getRootDepartId()); | 
|         } | 
|         if (pageWrap.getModel().getDepartId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getDepartId, pageWrap.getModel().getDepartId()); | 
|         } | 
|         if (pageWrap.getModel().getCode() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getCode, pageWrap.getModel().getCode()); | 
|         } | 
|         if (pageWrap.getModel().getOrigin() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getOrigin, pageWrap.getModel().getOrigin()); | 
|         } | 
|         if (pageWrap.getModel().getValidDate() != null) { | 
|             queryWrapper.lambda().ge(WOutbound::getValidDate, Utils.Date.getStart(pageWrap.getModel().getValidDate())); | 
|             queryWrapper.lambda().le(WOutbound::getValidDate, Utils.Date.getEnd(pageWrap.getModel().getValidDate())); | 
|         } | 
|         if (pageWrap.getModel().getType() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getType, pageWrap.getModel().getType()); | 
|         } | 
|         if (pageWrap.getModel().getOriginType() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getOriginType, pageWrap.getModel().getOriginType()); | 
|         } | 
|         if (pageWrap.getModel().getOriginCode() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getOriginCode, pageWrap.getModel().getOriginCode()); | 
|         } | 
|         if (pageWrap.getModel().getOriginId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getOriginId, pageWrap.getModel().getOriginId()); | 
|         } | 
|         if (pageWrap.getModel().getAbstracts() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getAbstracts, pageWrap.getModel().getAbstracts()); | 
|         } | 
|         if (pageWrap.getModel().getUserId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getUserId, pageWrap.getModel().getUserId()); | 
|         } | 
|         if (pageWrap.getModel().getWarehouseId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getWarehouseId, pageWrap.getModel().getWarehouseId()); | 
|         } | 
|         if (pageWrap.getModel().getDealDate() != null) { | 
|             queryWrapper.lambda().ge(WOutbound::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate())); | 
|             queryWrapper.lambda().le(WOutbound::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate())); | 
|         } | 
|         if (pageWrap.getModel().getStatus() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getStatus, pageWrap.getModel().getStatus()); | 
|         } | 
|         if (pageWrap.getModel().getPlanDate() != null) { | 
|             queryWrapper.lambda().ge(WOutbound::getPlanDate, Utils.Date.getStart(pageWrap.getModel().getPlanDate())); | 
|             queryWrapper.lambda().le(WOutbound::getPlanDate, Utils.Date.getEnd(pageWrap.getModel().getPlanDate())); | 
|         } | 
|         if (pageWrap.getModel().getProcedureId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getProcedureId, pageWrap.getModel().getProcedureId()); | 
|         } | 
|         if (pageWrap.getModel().getCancelUserId() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getCancelUserId, pageWrap.getModel().getCancelUserId()); | 
|         } | 
|         if (pageWrap.getModel().getCancelDate() != null) { | 
|             queryWrapper.lambda().ge(WOutbound::getCancelDate, Utils.Date.getStart(pageWrap.getModel().getCancelDate())); | 
|             queryWrapper.lambda().le(WOutbound::getCancelDate, Utils.Date.getEnd(pageWrap.getModel().getCancelDate())); | 
|         } | 
|         if (pageWrap.getModel().getCancelInfo() != null) { | 
|             queryWrapper.lambda().eq(WOutbound::getCancelInfo, pageWrap.getModel().getCancelInfo()); | 
|         } | 
|         for(PageWrap.SortData sortData: pageWrap.getSorts()) { | 
|             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { | 
|                 queryWrapper.orderByDesc(sortData.getProperty()); | 
|             } else { | 
|                 queryWrapper.orderByAsc(sortData.getProperty()); | 
|             } | 
|         } | 
|         return PageData.from(wOutboundMapper.selectPage(page, queryWrapper)); | 
|     } | 
|   | 
|     @Override | 
|     public long count(WOutbound wOutbound) { | 
|         QueryWrapper<WOutbound> wrapper = new QueryWrapper<>(wOutbound); | 
|         return wOutboundMapper.selectCount(wrapper); | 
|     } | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse saveBean(WOutBoundBean wOutBoundBean, LoginUserInfo loginUserInfo){ | 
|         WOutbound wOutbound = new WOutbound(); | 
|         wOutbound.setPlanDate(wOutBoundBean.getPlanDate()); | 
|         wOutbound.setType(wOutBoundBean.getType()); | 
|         wOutbound.setWarehouseId(wOutBoundBean.getWarehouseId()); | 
|         wOutbound.setCreateTime(new Date()); | 
|         wOutbound.setCreateUser(loginUserInfo.getId()); | 
|         wOutbound.setValidDate(new Date()); | 
|         wOutbound.setOrigin(wOutBoundBean.getOrigin()); | 
|         wOutbound.setOrigin(Constants.ZERO); | 
|         wOutbound.setAbstracts(wOutBoundBean.getAbstracts()); | 
|         wOutbound.setStatus(Constants.ZERO); | 
|         wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|         wOutbound.setDepartId(loginUserInfo.getCurComDepartment().getId()); | 
|         wOutbound.setUserId(loginUserInfo.getId()); | 
|         wOutbound.setBillType(wOutBoundBean.getBillType()); | 
|         //TODO 关联单据查询是否使用 | 
|         List<WoutBoundDetailBean> woutBoundDetailBeans = wOutBoundBean.getWoutBoundDetailBeans(); | 
|         if(woutBoundDetailBeans.size()<=0){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "仓库信息异常"); | 
|         } | 
|         woutBoundDetailBeans.forEach(i->{ | 
|             if(Objects.isNull(i.getNum()) | 
|                     ||Objects.isNull(i.getMaterialId())||Objects.isNull(i.getUnitId())){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "明细入参数据异常"); | 
|             } | 
|         }); | 
|         //TODO 工序信息 | 
|         Warehouse warehouse =  warehouseMapper.selectById(wOutbound.getWarehouseId()); | 
|         if(Objects.isNull(warehouse)){ | 
|             throw new BusinessException(ResponseStatus.ITEM_ERR_STATUS.getCode(), "无行项目数据"); | 
|         } | 
|         if(Constants.ONE == wOutBoundBean.getType()){ | 
|             wOutbound.setCode(getNextInCode(loginUserInfo.getCompany().getId()));//TODO 单据编码 | 
|         }else{ | 
|             wOutbound.setCode(getNextOutCode(loginUserInfo.getCompany().getId()));//TODO 单据编码 | 
|         } | 
|         wOutboundMapper.insert(wOutbound); | 
|         woutBoundDetailBeans.forEach(i->{ | 
|             WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
|             wOutboundDetail.setNum(i.getNum()); | 
|             wOutboundDetail.setUnitId(i.getUnitId()); | 
|             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.setQualityType(i.getQualityType()); | 
|             wOutboundDetail.setProcedureId(i.getProcedureId()); | 
|             wOutboundDetailMapper.insert(wOutboundDetail); | 
|         }); | 
|   | 
|         CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() | 
|                 .eq("USER_ID",warehouse.getManagerId()) | 
|                 .eq("DELETED",0) | 
|                 .eq("ROOT_DEPART_ID",wOutbound.getRootDepartId()) | 
|         ); | 
|         if(Objects.isNull(companyUser)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库仓管员信息【"+wOutbound.getCreateUser()+"】"); | 
|         } | 
|   | 
|         Constants.Notices_Type_Transfer notices_type_transfer =  Constants.Notices_Type_Transfer.checkEnum(wOutbound.getBillType()); | 
|         if(Objects.isNull(notices_type_transfer)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库单类型信息【"+wOutbound.getBillType()+"】"); | 
|         } | 
|   | 
|         sendOutNotice(companyUser.getId(),wOutbound.getId(),wOutbound.getCode(),notices_type_transfer,Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.woutOut)); | 
|         return ApiResponse.success(wOutbound); | 
|     } | 
|   | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse saveBeanForStandard(WOutBoundBean wOutBoundBean, LoginUserInfo loginUserInfo){ | 
|         WOutbound wOutbound = new WOutbound(); | 
|         wOutbound.setPlanDate(wOutBoundBean.getPlanDate()); | 
|         wOutbound.setType(wOutBoundBean.getType()); | 
|         wOutbound.setWarehouseId(wOutBoundBean.getWarehouseId()); | 
|         wOutbound.setCreateTime(new Date()); | 
|         wOutbound.setCreateUser(loginUserInfo.getId()); | 
|         wOutbound.setValidDate(new Date()); | 
|         wOutbound.setOrigin(wOutBoundBean.getOrigin()); | 
|         wOutbound.setAbstracts(wOutBoundBean.getAbstracts()); | 
|         wOutbound.setStatus(Constants.ONE); | 
|         wOutbound.setDealDate(new Date()); | 
|         wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|         wOutbound.setDepartId(loginUserInfo.getCurComDepartment().getId()); | 
|         wOutbound.setUserId(loginUserInfo.getId()); | 
|         wOutbound.setBillType(wOutBoundBean.getBillType()); | 
|         //TODO 关联单据查询是否使用 | 
|         List<WoutBoundDetailBean> woutBoundDetailBeans = wOutBoundBean.getWoutBoundDetailBeans(); | 
|         if(woutBoundDetailBeans.size()<=0){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "仓库信息异常"); | 
|         } | 
|         woutBoundDetailBeans.forEach(i->{ | 
|             if(Objects.isNull(i.getNum()) | 
|                     ||Objects.isNull(i.getMaterialId())||Objects.isNull(i.getUnitId())){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "明细入参数据异常"); | 
|             } | 
|         }); | 
|         //  工序信息 | 
|         Warehouse warehouse =  warehouseMapper.selectById(wOutbound.getWarehouseId()); | 
|         if(Objects.isNull(warehouse)){ | 
|             throw new BusinessException(ResponseStatus.ITEM_ERR_STATUS.getCode(), "无行项目数据"); | 
|         } | 
|         if(Constants.ONE == wOutBoundBean.getType()){ | 
|             wOutbound.setCode(getNextInCode(loginUserInfo.getCompany().getId())); | 
|         }else{ | 
|             wOutbound.setCode(getNextOutCode(loginUserInfo.getCompany().getId())); | 
|         } | 
|         wOutboundMapper.insert(wOutbound); | 
|         woutBoundDetailBeans.forEach(i->{ | 
|             WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
|             wOutboundDetail.setNum(i.getNum()); | 
|             wOutboundDetail.setUnitId(i.getUnitId()); | 
|             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.setStatus(Constants.ONE); | 
|             wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); | 
|             wOutboundDetail.setDoneNum(wOutboundDetail.getNum()); | 
|             wOutboundDetail.setQualityType(i.getQualityType()); | 
|             wOutboundDetail.setProcedureId(i.getProcedureId()); | 
|             wOutboundDetailMapper.insert(wOutboundDetail); | 
|             //处理库存 | 
|             if(Objects.isNull(warehouse)){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + warehouse.getId() + "】"); | 
|             } | 
|             List<WStock> wStockList = wStockMapper.selectList(new QueryWrapper<WStock>() | 
|                     .eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()) | 
|                     .eq("MATERIAL_ID", wOutboundDetail.getMaterialId()) | 
|                     .eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()) | 
|                     .eq(StringUtils.isNotBlank(wOutboundDetail.getBatch()),"BATCH", i.getBatch()) | 
|                     .isNull(StringUtils.isBlank(wOutboundDetail.getBatch()),"BATCH") | 
|                     .eq(!Objects.isNull(wOutboundDetail.getProcedureId()),"PROCEDURE_ID",wOutboundDetail.getProcedureId()) | 
|                     .isNull(Objects.isNull(wOutboundDetail.getProcedureId()),"PROCEDURE_ID") | 
|                     .eq("QUALITY_TYPE",wOutboundDetail.getQualityType()) | 
|                     .eq(StringUtils.isNotBlank(wOutboundDetail.getBatch())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", i.getLocationId()) | 
|             ); | 
|             if (wStockList.size()<=Constants.ZERO) { | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库/货位库存信息"); | 
|             }else if(wStockList.size()>1){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存数据异常,存在多条库存信息,请检查库存数据"); | 
|             } | 
|             WStock wStock = wStockList.get(0); | 
|             // 更新货位库存 | 
|             if (wOutboundDetail.getNum().compareTo(wStock.getNum()) > Constants.ZERO) { | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "货位库存不足,请刷新查看"); | 
|             } | 
|             wStock.setNum(wStock.getNum().subtract(wOutboundDetail.getNum())); | 
|             wStockExtMapper.updateById(wStock); | 
|         }); | 
|         return ApiResponse.success(wOutbound); | 
|     } | 
|   | 
|   | 
|     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); | 
|     } | 
|   | 
|     @Override | 
|     public WOutbound getBeanById(Integer id){ | 
|         WOutbound wOutbound = wOutboundExtMapper.wOutboundById(id); | 
|         List<WOutboundDetail> wOutboundDetailList = wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ZERO); | 
| //        if(wOutbound.getType()==Constants.ZERO){ | 
| //            for (WOutboundDetail wOutboundDetail:wOutboundDetailList) { | 
| //                QueryWStockDto queryWStockDto = new QueryWStockDto(); | 
| //                queryWStockDto.setRootDepartId(wOutboundDetail.getRootDepartId()); | 
| //                queryWStockDto.setMaterialId(wOutboundDetail.getMaterialId()); | 
| //                queryWStockDto.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
| //                queryWStockDto.setLocationId(wOutboundDetail.getLocationId()); | 
| //                queryWStockDto.setUnitId(wOutboundDetail.getUnitId()); | 
| //                queryWStockDto.setBatch(wOutboundDetail.getBatch()); | 
| //                wOutboundDetail.setWStockExtListVOList(wStockExtMapper.stockListByDto(queryWStockDto)); | 
| //            } | 
|             wOutbound.setWOutboundDetailsOut(wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ONE)); | 
| //        } | 
|         wOutbound.setWOutboundDetailsWait(wOutboundDetailList); | 
|         return wOutbound; | 
|     } | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse cancel(Integer id,String detail,LoginUserInfo loginUserInfo){ | 
|         WOutbound wOutbound =  wOutboundMapper.selectById(id); | 
|         if(Objects.isNull(wOutbound)){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到对象信息"); | 
|         } | 
|         if(Constants.ONE ==wOutbound.getStatus()){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "单据已处理,无法取消"); | 
|         }else if(Constants.TWO == wOutbound.getStatus()){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "单据已取消"); | 
|         } | 
|         wOutbound.setStatus(Constants.TWO); | 
|         wOutbound.setCancelDate(new Date()); | 
|         wOutbound.setCancelInfo(detail); | 
|         wOutbound.setCancelUserId(loginUserInfo.getId()); | 
|         wOutboundMapper.updateById(wOutbound); | 
|   | 
|         //2022年8月8日10:05:21  处理 清空条码与入库单 绑定信息的数据 | 
|         if(wOutbound.getType() == Constants.ONE && wOutbound.getOrigin() == Constants.ZERO){ | 
|             List<AdjustmentRecord> adjustmentRecords = adjustmentRecordMapper.selectList(new QueryWrapper<AdjustmentRecord>().eq("OUTBOUND_ID",id)); | 
|             if(!Objects.isNull(adjustmentRecords)&&adjustmentRecords.size()>0){ | 
|                 for (AdjustmentRecord adjustmentRecord:adjustmentRecords) { | 
|                     Appliances appliances = appliancesMapper.selectById(adjustmentRecord.getAppliancesId()); | 
|                     LambdaUpdateWrapper<Appliances> updateWrapper = new LambdaUpdateWrapper<>(); | 
|                     updateWrapper.eq(Appliances::getId,appliances.getId()); | 
|                     updateWrapper.set(Appliances::getMaterialId,null); | 
|                     updateWrapper.set(Appliances::getStatus,Constants.ONE); | 
|                     updateWrapper.set(Appliances::getQualityType,null); | 
|                     updateWrapper.set(Appliances::getBatch,null); | 
|                     updateWrapper.set(Appliances::getProcedureId,null); | 
|                     updateWrapper.set(Appliances::getNum,BigDecimal.ZERO); | 
|                     updateWrapper.set(Appliances::getPositionType,null); | 
|                     updateWrapper.set(Appliances::getNextProcedureId,null); | 
|                     appliancesExtMapper.update(appliances,updateWrapper); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         //消除待办 | 
|         Constants.Notices_Type_Transfer notices_type_transfer = Constants.Notices_Type_Transfer.checkEnum(wOutbound.getBillType()); | 
|         noticesExtService.dealNotice(id,wOutbound.getType()==Constants.ZERO?notices_type_transfer.getNoticeOutType():notices_type_transfer.getNoticeInType(),null); | 
|   | 
|         //记录操作记录 | 
|         WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); | 
|         wHistory.setTitle("出入库单取消"); | 
|         wHistory.setInfo("出入库单取消"); | 
|         wHistoryMapper.insert(wHistory); | 
|   | 
|         return ApiResponse.success(wOutbound); | 
|     } | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse<WTransfer> getOutByWTransferId(Integer id){ | 
|         WTransfer wTransfer = wTransferExtMapper.wTransferById(id); | 
|         if(Objects.isNull(wTransfer)){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); | 
|         } | 
|         if(wTransfer.getStatus()!=Constants.ZERO){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "转库单状态已转出!"); | 
|         } | 
|         //获取明细所有仓库信息(分组) | 
|         List<WTransferWarehouse> wTransferOutWarehouses = wTransferDetailExtMapper.wTransferOutWarehouseListById(id); | 
|         //获取明细所有物料信息 并获取库存仓位信息 | 
|         List<WTransferDetail> wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListById(id); | 
|         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()); | 
|             //获取仓库信息 根据 | 
|             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.stockListByDto(queryWStockDto)); | 
|                     wTransferDetail.setWStockExtListVOList(wStockExtMapper.choiceStockList(queryWStockDto)); | 
|                 } | 
|             } | 
|         } | 
|         //物料信息根据仓库信息 添加至各个仓库下 返回 | 
|         wTransferOutWarehouses.forEach(i->{ | 
|             List<WTransferDetail> detail = new ArrayList<>(); | 
|             wTransferDetailList.forEach(j->{ | 
|                 if(i.getWarehouseId() == j.getOutWarehouseId()){ | 
|                     detail.add(j); | 
|                 } | 
|             }); | 
|             i.setWTransferDetailList(detail); | 
|         }); | 
|         wTransfer.setWTransferWarehouseList(wTransferOutWarehouses); | 
|         return ApiResponse.success(wTransfer); | 
|     } | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse<WTransfer> getInByWTransferId(Integer id){ | 
|         WTransfer wTransfer = wTransferExtMapper.wTransferById(id); | 
|         if(Objects.isNull(wTransfer)){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); | 
|         } | 
|         //获取明细所有仓库信息(分组) | 
|         List<WTransferWarehouse> wTransferInWarehouses = wTransferDetailExtMapper.wTransferInWarehouseListById(id); | 
|         //获取明细所有物料信息 | 
|         List<WTransferDetail> wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListById(id); | 
|         //物料信息根据仓库信息 添加至各个仓库下 返回 | 
|         wTransferInWarehouses.forEach(i->{ | 
|             List<WTransferDetail> detail = new ArrayList<>(); | 
|             wTransferDetailList.forEach(j->{ | 
|                 if(i.getWarehouseId() == j.getInWarehouseId()){ | 
|                     detail.add(j); | 
|                 } | 
|             }); | 
|             i.setWTransferDetailList(detail); | 
|         }); | 
|         wTransfer.setWTransferWarehouseList(wTransferInWarehouses); | 
|         return ApiResponse.success(wTransfer); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 出入库扫描条码 | 
|      * @param barCode 扫描条码 | 
|      * @param type 类别:转库单/出库单/入库单 1/2/3 | 
|      * @param pId 转库单主键/出库单主键/入库单主键 | 
|      * @param warehouseId 仓库主键 | 
|      * @param locationId 货位主键 | 
|      * @param loginUserInfo 当前登录人 | 
|      * @return | 
|      */ | 
|     @Override | 
|     public ApiResponse<OutScanBean> outScanAppliances(String barCode,Integer type,Integer pId,Integer warehouseId,Integer locationId,LoginUserInfo loginUserInfo){ | 
|         BarcodeParamExtListVO barcodeParamExtListVO =barcodeParamExtService.getByCode(loginUserInfo.getCompany().getId(),loginUserInfo.getCurComDepartment().getId(),barCode); | 
|         if(Objects.isNull(barcodeParamExtListVO)){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到【BarcodeParam】对象信息"); | 
|         } | 
|         if(4 != barcodeParamExtListVO.getType()){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "条码类别错误,非篮筐类条码"); | 
|         } | 
|         OutScanBean outScanBean = appliancesExtMapper.scanDetailForOut( | 
|                 barcodeParamExtListVO.getId(), | 
|                 barCode.replaceFirst(barcodeParamExtListVO.getPrefix(),"") | 
|                 //,loginUserInfo.getCompany().getId() | 
|                 ,loginUserInfo.getCurComDepartment().getId() | 
|         ); | 
|         if(Objects.isNull(outScanBean)){ | 
|             throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到条码信息"); | 
|         } | 
|   | 
|   | 
| //        outScanBean.setScanCode(barCode); | 
|         //查询物料是否在明细中 | 
|         if(Constants.ONE == type){ | 
|             //查询物料是否在转库单据中 | 
|             Integer isHave = wTransferDetailExtMapper.selectCount(new QueryWrapper<WTransferDetail>() | 
|                     .eq("TRANSFER_ID",pId) | 
|                     .eq("MATERIAL_ID",outScanBean.getMaterialId()) | 
|             ); | 
|             if(isHave <= Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "扫描篮筐数据未存在于当前转库单中"); | 
|             } | 
|             WTransfer wTransfer = wTransferMapper.selectById(pId); | 
|             if(wTransfer.getStatus()==0){ | 
|                 if(null == outScanBean.getWarehouseId() || null == outScanBean.getLocationId()){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "篮筐数据异常:未存在归属仓库【" + outScanBean.getId() + "】"); | 
|                 } | 
|                 //查询篮筐是否处于投料中 | 
|                 if(appliancesExtMapper.selectCount(new QueryWrapper<Appliances>() | 
|                         .eq("id",outScanBean.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(), "该工装处于投料中"); | 
|                 }; | 
|   | 
|             }else if(wTransfer.getStatus()==1){ | 
|                 //验证扫描篮筐是否在当前操作的入库单使用的出库单中 | 
|                 if(wOutboundRecordExtMapper.selectCount(new QueryWrapper<WOutboundRecord>() | 
|                         .eq("APPLIANCES_ID",outScanBean.getId()) | 
|                         .apply(" OUTBOUND_ID in( select w.id from w_outbound w where w.ORIGIN_ID = '"+pId+"' and w.ORIGIN_TYPE = 3 and w.STATUS = 1   ) ") | 
|                 )<=Constants.ZERO){ | 
|                     throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "扫描篮筐数据未存在于当前转库出库单中"); | 
|                 }; | 
|   | 
|                 if(null != outScanBean.getWarehouseId() || null != outScanBean.getLocationId()){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "篮筐数据异常:存在归属仓库【" + outScanBean.getId() + "】"); | 
|                 } | 
|             }else{ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "转库单状态错误!"); | 
|             } | 
|   | 
|   | 
|         }else if(Constants.TWO == type){ | 
|             //查询物料是否在出库单据中 | 
|             Integer isHave =  wOutboundDetailExtMapper.selectCount(new QueryWrapper<WOutboundDetail>() | 
|                     .eq("OUTBOUND_ID",pId) | 
|                     .eq("MATERIAL_ID",outScanBean.getMaterialId()) | 
| //                    .eq("BATCH",outScanBean.getBatch()) | 
|             ); | 
|             if(isHave <= Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "扫描篮筐物料数据未存在于当前出库单中"); | 
|             } | 
|             if(null == outScanBean.getWarehouseId() || null == outScanBean.getLocationId()){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "篮筐数据异常:未存在归属仓库【" + outScanBean.getId() + "】"); | 
|             } | 
|             //查询篮筐是否处于投料中 | 
|             if(appliancesExtMapper.selectCount(new QueryWrapper<Appliances>() | 
|                     .eq("id",outScanBean.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(), "该工装处于投料中"); | 
|             }; | 
|   | 
|         }else{ | 
|             //获取仓库信息 | 
|             Warehouse warehouse = warehouseMapper.selectById(warehouseId); | 
|             if(Objects.isNull(warehouse)){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + warehouseId + "】"); | 
|             } | 
|             if(null != outScanBean.getWarehouseId() || null != outScanBean.getLocationId()){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "篮筐数据异常:存在归属仓库【" + outScanBean.getId() + "】"); | 
|             } | 
|             WOutbound wOutbound = wOutboundMapper.selectById(pId); | 
|             if(Objects.isNull(wOutbound)){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库单信息"); | 
|             } | 
|             //验证扫描篮筐是否在当前操作的入库单使用的出库单中 | 
|             if(!(wOutbound.getBillType()==28||wOutbound.getBillType()==25)&&wOutboundRecordExtMapper.selectCount(new QueryWrapper<WOutboundRecord>() | 
|                     .eq("APPLIANCES_ID",outScanBean.getId()) | 
|                     .eq("OUTBOUND_ID",pId))<=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "扫描篮筐数据未存在于当前出库单中"); | 
|             }; | 
|             //开启仓位 | 
|             if(warehouse.getUseLocation()==Constants.ONE){ | 
|                 //查询货位类别 混合无需处理 | 
|                 WarehouseLocation warehouseLocation = warehouseLocationExtMapper.selectById(locationId); | 
|                 if(Objects.isNull(warehouseLocation)){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到货位信息"); | 
|                 } | 
|                 //根据货位类别 区分是否验证工装器具类别 | 
|                 SystemDictData systemDictData = systemDictDataMapper.selectById(warehouseLocation.getSystemDicDataId()); | 
|                 if(Objects.isNull(systemDictData)){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到货位类别"); | 
|                 } | 
| //                if(!Constants.isQualityTypeValid(outScanBean.getQualityType(),systemDictData.getLabel())){ | 
| //                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装【"+barCode+"】的质量属性与货位属性不一致!"); | 
| //                } | 
|                 if(!systemDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.mix)){ | 
|                     if(!StringUtils.equals(outScanBean.getType(),warehouseLocation.getSystemDicDataId())){ | 
|                         throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装【"+barCode+"】的质量属性与货位属性不一致!"); | 
|                     } | 
|                 } | 
|                 outScanBean.setLocationName(warehouseLocation.getUnionName()); | 
|             }else{ | 
|                 //根据货位类别 区分是否验证工装器具类别 | 
|                 SystemDictData systemDictData = systemDictDataMapper.selectById(warehouse.getSystemDicDataId()); | 
|                 if(Objects.isNull(systemDictData)){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到货位类别"); | 
|                 } | 
|                 //如果是入库操作,并且是提交数据,检查是否篮筐的质量属性,满足仓库和库位的质量属性 | 
| //                if(!Constants.isQualityTypeValid(outScanBean.getQualityType(),systemDictData.getLabel())){ | 
| //                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装【"+barCode+"】的质量属性与仓库属性不一致!"); | 
| //                } | 
|                 if(!systemDictData.getLabel().equals(Constants.APPLIANCES_TYPE_LABLE.mix)){ | 
|                     if(outScanBean.getType()!=warehouse.getSystemDicDataId()){ | 
|                         throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "工装属性与库位属性不一致"); | 
|                     } | 
|                 } | 
|             } | 
|             //查询篮筐是否被占用 | 
|             if(!Objects.isNull(appliancesExtMapper.selectById(outScanBean.getId()).getLocationId())){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "篮筐使用中,无法进行入库"); | 
|             }; | 
|             //查询物料是否在入库单中 | 
|             Integer isHave =  wOutboundDetailExtMapper.selectCount(new QueryWrapper<WOutboundDetail>() | 
|                     .eq("OUTBOUND_ID",pId) | 
|                     .eq("MATERIAL_ID",outScanBean.getMaterialId()) | 
| //                    .eq("BATCH",outScanBean.getBatch()) | 
|             ); | 
|             if(isHave <= Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "扫描篮筐数据未存在于当前入库单中"); | 
|             } | 
|             //判断篮筐是否是处理 | 
|         } | 
|         return ApiResponse.success(outScanBean); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse saveOut(WOutBoundOutBean wOutBoundOutBean, LoginUserInfo loginUserInfo){ | 
|         // billType = 1  转库单(未生成出库数据) ; 2 :出库单(已存在出库数据) | 
|         if(Constants.ONE == wOutBoundOutBean.getBillType()){ | 
|             //获取转库单数据 | 
|             WTransfer wTransfer = wTransferExtMapper.wTransferById(wOutBoundOutBean.getId()); | 
|             if (Objects.isNull(wTransfer)) { | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对象信息"); | 
|             } | 
|             if(wTransfer.getStatus()!=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "转库单状态错误,无法进行出库"); | 
|             } | 
|             List<WOutBoundOutWarehouse> wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); | 
|             if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); | 
|             } | 
|             wOutBoundOutWarehouseList.forEach(wOutBoundOutWarehouse-> { | 
|                 //明细行项目信息 | 
|                 List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList = wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); | 
|                 if (wOutBoundOutDetailBeanList.size() == Constants.ZERO) { | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); | 
|                 } | 
|                 //生成出库单单头 | 
|                 WOutbound wOutbound = new WOutbound(); | 
|                 wOutbound.setCreateUser(loginUserInfo.getId()); | 
|                 wOutbound.setCreateTime(new Date()); | 
|                 wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|                 wOutbound.setDepartId(loginUserInfo.getComDepartment().getId()); | 
|                 wOutbound.setCode(getNextOutCode(loginUserInfo.getCompany().getId())); | 
|                 wOutbound.setOrigin(Constants.ONE); | 
|                 wOutbound.setValidDate(new Date()); | 
|                 wOutbound.setType(Constants.ZERO); | 
|                 wOutbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.transfer); | 
|                 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.getOutPlandate()); | 
|                 //TODO 工序编码 wOutbound.setProcedureId(); | 
|                 wOutboundMapper.insert(wOutbound); | 
|                 //生成出库单明细 | 
|                 wOutBoundOutDetailBeanList.forEach(i -> { | 
|                     WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(i.getId()); | 
|                     if (Objects.isNull(wTransferDetail)) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单明细行数据【" + i.getId() + "】"); | 
|                     } | 
|                     //获取仓库信息 | 
|                     Warehouse warehouse = warehouseMapper.selectById(wTransferDetail.getOutWarehouseId()); | 
|                     if(Objects.isNull(warehouse)){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + i.getId() + "】"); | 
|                     } | 
|   | 
|                     if(wTransferDetail.getOutPlannum().compareTo(i.getOutNum())<Constants.ZERO){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "入库数量超出转库单已出数量!"); | 
|                     } | 
|                     QueryWrapper wrapper = new QueryWrapper<WStock>(); | 
|                     wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); | 
|                     wrapper.eq("MATERIAL_ID", wTransferDetail.getMaterialId()); | 
|                     wrapper.eq("WAREHOUSE_ID", wTransferDetail.getOutWarehouseId()); | 
|                     if(StringUtils.isNotBlank(wTransferDetail.getBatch())){ | 
|                         wrapper.eq("BATCH" , i.getBatch()); | 
|                     }else{ | 
|                         wrapper.apply("BATCH is null "); | 
|                     } | 
|                     wrapper.eq(!Objects.isNull(i.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", i.getLocationId()); | 
|                     wrapper.eq("DELETED",0); | 
|   | 
|                     List<WStock> wStockList = wStockMapper.selectList(  wrapper ); | 
|                     if (wStockList.size()<=Constants.ZERO) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库/货位库存信息【" + i.getId() + "】"); | 
|                     }else if(wStockList.size()>1){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存数据异常,存在多条库存信息,请检查库存数据【" + i.getId() + "】"); | 
|                     } | 
|                     WStock wStock = wStockList.get(0); | 
|                     if (wStock.getNum().compareTo(i.getOutNum()) < Constants.ZERO) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前货位库存数量不足;剩余数量【" + wStock.getNum() + "】;出库数量【" + i.getOutNum() + "】"); | 
|                     } | 
|                     //使用篮筐数据 | 
|                     List<OutScanBarcodeBean> outScanBarcodeBeanList = i.getOutScanBarcodeBeanList(); | 
|                     if (outScanBarcodeBeanList.size() == Constants.ZERO) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无扫描条码数据,请检查数据信息【" + i.getId() + "】"); | 
|                     } | 
|                     WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
|                     wOutboundDetail.setCreateUser(loginUserInfo.getId()); | 
|                     wOutboundDetail.setCreateTime(new Date()); | 
|                     wOutboundDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|                     wOutboundDetail.setOutboundId(wOutbound.getId()); | 
|                     wOutboundDetail.setMaterialId(wTransferDetail.getMaterialId()); | 
|                     wOutboundDetail.setUnitId(wTransferDetail.getUnitId()); | 
|                     wOutboundDetail.setBatch(i.getBatch()); | 
|                     wOutboundDetail.setNum(i.getOutNum()); | 
|                     wOutboundDetail.setDoneDate(new Date()); | 
|                     wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); | 
|                     wOutboundDetail.setLocationId(i.getLocationId()); | 
|                     wOutboundDetail.setStatus(Constants.ONE); | 
|                     wOutboundDetail.setDoneNum(i.getOutNum()); | 
|                     wOutboundDetailExtMapper.insert(wOutboundDetail); | 
|                     // 更新货位库存 | 
|                     if (i.getOutNum().compareTo(wStock.getNum()) > Constants.ZERO) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "货位库存不足,请刷新查看"); | 
|                     } | 
|                     wStock.setNum(wStock.getNum().subtract(i.getOutNum())); | 
|                     wStockExtMapper.updateById(wStock); | 
|                     // 更新篮筐数据 | 
|                     updAppliances(outScanBarcodeBeanList,wOutbound.getId()); | 
|                     // 添加操作记录 | 
|                     saveOutBoundRecord(outScanBarcodeBeanList, wOutboundDetail, loginUserInfo); | 
|                 }); | 
|             }); | 
|             //更新转库单信息 | 
|             updWTransfer(wOutBoundOutBean,wTransfer); | 
|   | 
|             CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() | 
|                     .eq("USER_ID",wTransfer.getInUserId()) | 
|                     .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) | 
|                     .eq("DELETED",0) | 
|             ); | 
|             //处理通知 | 
|             if(wTransfer.getType() == Constants.ONE){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.workShopOut.getType(),null); | 
|                 sendNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),Constants.Notices_Type.workShopIn,Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.in)); | 
|             }else if(wTransfer.getType() == Constants.TWO){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.transferWaitOut.getType(),null); | 
|                 sendNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),Constants.Notices_Type.transferWaitIn,Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.finish)); | 
|             }else if(wTransfer.getType() == 3){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.wStockTransferOut.getType(),null); | 
|                 sendNotice(companyUser.getId(),wTransfer.getId(),wTransfer.getCode(),Constants.Notices_Type.wStockTransferIn,Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.in)); | 
|             } | 
|   | 
|             }else if(Constants.TWO == wOutBoundOutBean.getBillType()){ //使用出库单出库 | 
|                 WOutbound wOutbound = wOutboundMapper.selectById(wOutBoundOutBean.getId()); | 
|                 if(Objects.isNull(wOutbound)){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库单据信息"); | 
|                 } | 
|                 List<WOutBoundOutWarehouse> wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); | 
|                 if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); | 
|                 } | 
|                 for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { | 
|                     List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList = wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); | 
|                     wOutBoundOutDetailBeanList.forEach(i->{ | 
|                         WOutboundDetail wOutboundDetail = wOutboundDetailExtMapper.selectById(i.getId()); | 
|                         //更新出库单明细 实际出库数量 | 
|                         if(wOutboundDetail.getStatus() == Constants.ZERO){ | 
|                             updWOutBoundDetail(wOutBoundOutDetailBeanList,wOutboundDetail); | 
|                         } | 
|                         //使用篮筐数据 | 
|                         List<OutScanBarcodeBean> outScanBarcodeBeanList = i.getOutScanBarcodeBeanList(); | 
|                         if(outScanBarcodeBeanList.size() == Constants.ZERO ){ | 
|                             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无扫描条码数据,请检查数据信息【"+i.getId()+"】"); | 
|                         } | 
|                         //获取仓库信息 | 
|                         Warehouse warehouse = warehouseMapper.selectById(wOutboundDetail.getWarehouseId()); | 
|                         if(Objects.isNull(warehouse)){ | 
|                             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + i.getId() + "】"); | 
|                         } | 
|                         List<WStock> wStockList = wStockMapper.selectList(new QueryWrapper<WStock>() | 
|                                 .eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()) | 
|                                 .eq("MATERIAL_ID", wOutboundDetail.getMaterialId()) | 
|                                 .eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()) | 
|                                 .eq(StringUtils.isNotBlank(wOutboundDetail.getBatch()),"BATCH", i.getBatch()) | 
|                                 .eq(StringUtils.isNotBlank(wOutboundDetail.getBatch())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", i.getLocationId()) | 
|                         ); | 
|                         if (wStockList.size()<=Constants.ZERO) { | 
|                             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库/货位库存信息【" + i.getId() + "】"); | 
|                         }else if(wStockList.size()>1){ | 
|                             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存数据异常,存在多条库存信息,请检查库存数据【" + i.getId() + "】"); | 
|                         } | 
|                         WStock wStock = wStockList.get(0); | 
|                         if(i.getOutNum().compareTo(wStock.getNum())>Constants.ZERO){ | 
|                             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "货位库存不足,请刷新查看"); | 
|                         } | 
|                         // 更新货位库存 | 
|                         wStock.setNum(wStock.getNum().subtract(i.getOutNum())); | 
|                         wStockExtMapper.updateById(wStock); | 
|                         // 更新篮筐数据 取消绑定关系 | 
|                         updAppliances(outScanBarcodeBeanList,wOutbound.getId()); | 
|                         // 添加操作记录 | 
|                         saveOutBoundRecord(outScanBarcodeBeanList,wOutboundDetail,loginUserInfo); | 
|                     }); | 
|                 } | 
|                 wOutbound.setStatus(Constants.ONE); | 
|                 wOutbound.setUpdateTime(new Date()); | 
|                 wOutbound.setUpdateUser(loginUserInfo.getId()); | 
|                 wOutbound.setDealDate(new Date()); | 
|                 wOutboundMapper.updateById(wOutbound); | 
|             } | 
|         return ApiResponse.success("操作成功"); | 
|     } | 
|   | 
|   | 
|     public void sendNotice(Integer userId ,Integer billId , String billCode ,Constants.Notices_Type notices_type,String url){ | 
|         //发送通知 | 
|         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(url.replace("{id}",billId.toString()).replace("{type}","9")); | 
|         noticesExtService.sendNotice(notices); | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|     /** | 
|      * 更新转库单明细信息 | 
|      * @param wOutBoundOutBean | 
|      * @param wTransfer | 
|      */ | 
|     public void updWTransfer(WOutBoundOutBean wOutBoundOutBean,WTransfer wTransfer){ | 
|         List<WTransferDetail> wTransferDetailList = wTransferDetailMapper.selectList( | 
|                 new QueryWrapper<WTransferDetail>().eq("TRANSFER_ID",wTransfer.getId()) | 
|         ); | 
|         if(wOutBoundOutBean.getBillType()==Constants.ONE&&wTransfer.getStatus()==Constants.ZERO){ | 
|             //更新转库单明细已出库数量 | 
|             wTransferDetailList.forEach(i->{ | 
|                 BigDecimal outNum = BigDecimal.ZERO; | 
|                 List<WOutBoundOutWarehouse> wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); | 
|                 for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { | 
|                     List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList =  wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); | 
|                     for (WOutBoundOutDetailBean w:wOutBoundOutDetailBeanList) { | 
|                         if(w.getId().toString().equals(i.getId().toString())){ | 
|                             outNum = outNum.add(w.getOutNum()); | 
|                         } | 
|                     } | 
|                 }; | 
|                 i.setOutActnum(outNum); | 
|                 i.setOutActdate(new Date()); | 
|                 wTransferDetailExtMapper.updateById(i); | 
|             }); | 
|             //更新转库单状态 | 
|             wTransfer.setStatus(Constants.ONE); | 
|             wTransfer.setOutActdate(new Date()); | 
|         }else  if(wOutBoundOutBean.getBillType()==Constants.ONE&&wTransfer.getStatus()==Constants.ONE){ | 
|             wTransferDetailList.forEach(i->{ | 
|                 BigDecimal inNum = BigDecimal.ZERO; | 
|                 List<WOutBoundOutWarehouse> wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); | 
|                 for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { | 
|                     List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList =  wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); | 
|                     for (WOutBoundOutDetailBean w:wOutBoundOutDetailBeanList) { | 
|                         if(w.getId().toString().equals(i.getId().toString())){ | 
|                             inNum = inNum.add(w.getOutNum()); | 
|                         } | 
|                     } | 
|                 }; | 
|                 i.setInActnum(inNum); | 
|                 i.setInActdate(new Date()); | 
|                 wTransferDetailExtMapper.updateById(i); | 
|             }); | 
|             wTransfer.setStatus(Constants.TWO); | 
|             wTransfer.setInActdate(new Date()); | 
|         } | 
|         wTransferExtMapper.updateById(wTransfer); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 更新出入库明细行数据 | 
|      * @param wOutBoundOutDetailBeanList | 
|      * @param wOutboundDetail | 
|      */ | 
|     public void updWOutBoundDetail(List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList,WOutboundDetail wOutboundDetail){ | 
|         BigDecimal num = BigDecimal.ZERO; | 
|         for (WOutBoundOutDetailBean w: wOutBoundOutDetailBeanList) { | 
|             if(w.getId() == wOutboundDetail.getId()){ | 
|                 num = num.add(w.getOutNum()); | 
|             } | 
|         } | 
|         wOutboundDetail.setStatus(Constants.ONE); | 
|         wOutboundDetail.setNum(num); | 
|         wOutboundDetailExtMapper.updateById(wOutboundDetail); | 
|     } | 
|   | 
|     /** | 
|      * 更新工装器具信息 - 出库 | 
|      * @param outScanBarcodeBeanList | 
|      * @param curObjId | 
|      */ | 
|     public void updAppliances(List<OutScanBarcodeBean> outScanBarcodeBeanList,Integer curObjId){ | 
|         outScanBarcodeBeanList.forEach(j->{ | 
|             Appliances appliances = appliancesExtMapper.selectById(j.getAppliancesId()); | 
|             if(Objects.isNull(appliances)){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到工装器具信息【"+j.getAppliancesId()+"】"); | 
|             } | 
|             appliances.setWarehouseId(null); | 
|             appliances.setLocationId(null); | 
|             appliances.setCurObjId(curObjId); | 
|             appliances.setCurObjType(0); | 
|             appliancesExtMapper.updateById(appliances); | 
|         }); | 
|     } | 
|   | 
|     /** | 
|      * 保存出库明细记录 | 
|      * @param outScanBarcodeBeanList | 
|      * @param wOutboundDetail | 
|      * @param loginUserInfo | 
|      */ | 
|     public void saveOutBoundRecord(List<OutScanBarcodeBean> outScanBarcodeBeanList,WOutboundDetail wOutboundDetail,LoginUserInfo loginUserInfo){ | 
|         List<WOutboundRecord> wOutboundRecordList = new ArrayList<>(); | 
|         outScanBarcodeBeanList.forEach(j->{ | 
|             WOutboundRecord wOutboundRecord = new WOutboundRecord(); | 
|             wOutboundRecord.setCreateTime(new Date()); | 
|             wOutboundRecord.setCreateUser(loginUserInfo.getId()); | 
|             wOutboundRecord.setOutboundId(wOutboundDetail.getOutboundId()); | 
|             wOutboundRecord.setDetailId(wOutboundDetail.getId()); | 
|             wOutboundRecord.setMaterialId(wOutboundDetail.getMaterialId()); | 
|             wOutboundRecord.setUnitId(wOutboundDetail.getUnitId()); | 
|             wOutboundRecord.setRootDepartId(wOutboundDetail.getRootDepartId()); | 
|             wOutboundRecord.setBatch(j.getBatch()); | 
|             wOutboundRecord.setNum(j.getNum()); | 
|             wOutboundRecord.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|             wOutboundRecord.setAppliancesId(j.getAppliancesId()); | 
|             wOutboundRecordList.add(wOutboundRecord); | 
|             wOutboundRecordExtMapper.insert(wOutboundRecord); | 
|         }); | 
| //        wOutboundRecordExtMapper.insertBatch(wOutboundRecordList); | 
|     } | 
|   | 
|   | 
| //    @Override | 
| //    @Transactional | 
| //    public ApiResponse saveInByOut(WOutBoundInBean wOutBoundInBean, LoginUserInfo loginUserInfo){ | 
| //        WOutbound wOutbound = wOutboundExtMapper.selectById(wOutBoundInBean.getId()); | 
| //        if(Objects.isNull(wOutbound)){ | 
| //            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库单据信息【"+wOutBoundInBean.getWOutBoundInDetailBeanList()+"】"); | 
| //        }else if(Objects.isNull(wOutbound.getOriginId())){ | 
| //            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "出库单未关联转库单信息"); | 
| //        } | 
| //        WTransfer wTransfer = wTransferExtMapper.wTransferById(wOutbound.getOriginId()); | 
| //        if(Objects.isNull(wTransfer)){ | 
| //            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库据信息【"+wOutbound.getOriginId()+"】"); | 
| //        } | 
| //        List<WOutBoundInDetailBean> wOutBoundInDetailBeanList = wOutBoundInBean.getWOutBoundInDetailBeanList(); | 
| //        if(wOutBoundInDetailBeanList.size()<=Constants.ZERO){ | 
| //            throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "未传入入库行数据信息"); | 
| //        } | 
| //        WOutbound wOutboundIn = new WOutbound(); | 
| //        wOutboundIn.setCreateUser(loginUserInfo.getId()); | 
| //        wOutboundIn.setCreateTime(new Date()); | 
| //        wOutboundIn.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
| //        wOutboundIn.setDepartId(loginUserInfo.getDepartment().getId()); | 
| //        // 单据编码 RK-20220519-0001 | 
| //        wOutboundIn.setCode(getNextInCode(loginUserInfo.getCompany().getId())); | 
| //        wOutboundIn.setOrigin(Constants.ONE); | 
| //        wOutboundIn.setValidDate(new Date()); | 
| //        wOutboundIn.setType(Constants.ONE); | 
| //        wOutboundIn.setOriginType(3); | 
| //        wOutboundIn.setOriginCode(wTransfer.getCode()); | 
| //        wOutboundIn.setOriginId(wTransfer.getId()); | 
| //        wOutboundIn.setUserId(wTransfer.getInUserId()); | 
| //        wOutboundIn.setWarehouseId(wTransfer.getInWarehouseId()); | 
| //        wOutboundIn.setStatus(Constants.ONE); | 
| //        wOutboundIn.setDealDate(new Date()); | 
| //        wOutboundIn.setPlanDate(wTransfer.getInPlandate()); | 
| //        wOutboundExtMapper.insert(wOutboundIn); | 
| // | 
| //        wOutBoundInDetailBeanList.forEach(i->{ | 
| //            WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
| //            wOutboundDetail.setCreateUser(loginUserInfo.getId()); | 
| //            wOutboundDetail.setCreateTime(new Date()); | 
| //            wOutboundDetail.setRootDepartId(wOutboundIn.getRootDepartId()); | 
| //            wOutboundDetail.setOutboundId(wOutboundIn.getId()); | 
| //            wOutboundDetail.setMaterialId(i.getMaterialId()); | 
| //            wOutboundDetail.setUnitId(i.getUnitId()); | 
| //            wOutboundDetail.setBatch(i.getBatch()); | 
| //            wOutboundDetail.setNum(i.getNum()); | 
| //            wOutboundDetail.setWarehouseId(wOutboundIn.getWarehouseId()); | 
| //            wOutboundDetail.setLocationId(i.getLocationId()); | 
| //            wOutboundDetail.setStatus(Constants.ONE); | 
| //            wOutboundDetail.setDoneDate(new Date()); | 
| //            wOutboundDetail.setDoneNum(i.getNum()); | 
| //            wOutboundDetailExtMapper.insert(wOutboundDetail); | 
| //            WOutboundRecord wOutboundRecord = new WOutboundRecord(); | 
| //            BeanUtils.copyProperties(wOutboundDetail,wOutboundRecord); | 
| //            wOutboundRecord.setId(null); | 
| //            wOutboundRecord.setDetailId(wOutboundDetail.getId()); | 
| //            wOutboundRecordExtMapper.insert(wOutboundRecord); | 
| //            //获取货位库存信息 | 
| //            WStock wStock = wStockMapper.selectOne(new QueryWrapper<WStock>() | 
| //                    .eq("ROOT_DEPART_ID",wOutbound.getRootDepartId()) | 
| //                    .eq("WAREHOUSE_ID",wTransfer.getInWarehouseId()) | 
| //                    .eq("LOCATION_ID",i.getLocationId()) | 
| //                    .eq("DELETED",Constants.ZERO) | 
| //            ); | 
| //            if(Objects.isNull(wStock)){ | 
| //                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到库位信息【"+i.getLocationId()+"】"); | 
| //            } | 
| //            //更新货位库存 | 
| //            if(StringUtils.isEmpty(wStock.getBatch())&&Objects.isNull(wStock.getMaterialId())){ | 
| //                wStock.setBatch(i.getBatch()); | 
| //                wStock.setMaterialId(i.getMaterialId()); | 
| //                wStock.setUnitId(i.getUnitId()); | 
| //                wStock.setNum(i.getNum()); | 
| //                wStockMapper.updateById(wStock); | 
| //            }else{ | 
| //                wStock.setNum(wStock.getNum().add(i.getNum())); | 
| //                wStockExtMapper.updateById(wStock); | 
| //            } | 
| //            //更新篮筐数据 | 
| //            updInAppliances(i.getOutScanBarcodeBeanList(),wOutboundDetail); | 
| //        }); | 
| //        return ApiResponse.success("操作成功"); | 
| //    } | 
|   | 
|     /** | 
|      * 更新工装器具信息 - 入库 | 
|      * @param outScanBarcodeBeanList | 
|      * @param wOutboundDetail | 
|      */ | 
|     public void updInAppliances(List<OutScanBarcodeBean> outScanBarcodeBeanList,WOutboundDetail wOutboundDetail){ | 
|         outScanBarcodeBeanList.forEach(j->{ | 
|             Appliances appliances = appliancesExtMapper.selectById(j.getAppliancesId()); | 
|             if(Objects.isNull(appliances)){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到工装器具信息【"+j.getAppliancesId()+"】"); | 
|             } | 
|             appliances.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|             appliances.setLocationId(wOutboundDetail.getLocationId()); | 
|             appliances.setCurObjId(wOutboundDetail.getOutboundId()); | 
|             appliances.setCurObjType(Constants.ZERO); | 
|             appliancesExtMapper.updateById(appliances); | 
|         }); | 
|     } | 
|   | 
|   | 
|   | 
|     @Override | 
|     @Transactional | 
|     public ApiResponse saveIn(WOutBoundOutBean wOutBoundOutBean, LoginUserInfo loginUserInfo){ | 
|         // billType = 1  转库单(未生成入库数据) ; 2 :入库单(已存在入库数据) | 
|         if(Constants.ONE == wOutBoundOutBean.getBillType()){ | 
|             //获取转库单数据 | 
|             WTransfer wTransfer = wTransferExtMapper.wTransferById(wOutBoundOutBean.getId()); | 
|             if (Objects.isNull(wTransfer)) { | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单对象信息"); | 
|             } | 
|             if(wTransfer.getStatus()!=Constants.ONE){ | 
|                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "转库单状态错误,无法进行入库"); | 
|             } | 
|             List<WOutBoundOutWarehouse> wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); | 
|             if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); | 
|             } | 
|             wOutBoundOutWarehouseList.forEach(wOutBoundOutWarehouse-> { | 
|                 //明细行项目信息 | 
|                 List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList = wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); | 
|                 if (wOutBoundOutDetailBeanList.size() == Constants.ZERO) { | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); | 
|                 } | 
|                 //生成入库单单头 | 
|                 WOutbound wOutbound = new WOutbound(); | 
|                 wOutbound.setCreateUser(loginUserInfo.getId()); | 
|                 wOutbound.setCreateTime(new Date()); | 
|                 wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|                 wOutbound.setDepartId(loginUserInfo.getComDepartment().getId()); | 
|                 wOutbound.setCode(getNextInCode(loginUserInfo.getCompany().getId()));//单据编码 CK-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()); | 
|                 //TODO 工序编码 wOutbound.setProcedureId(); | 
|                 wOutboundMapper.insert(wOutbound); | 
|                 //生成入库单明细 | 
|                 wOutBoundOutDetailBeanList.forEach(i -> { | 
|                     WTransferDetail wTransferDetail = wTransferDetailExtMapper.selectById(i.getId()); | 
|                     if (Objects.isNull(wTransferDetail)) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到转库单明细行数据【" + i.getId() + "】"); | 
|                     } | 
|                     if(wTransferDetail.getOutActnum().compareTo(i.getOutNum())<Constants.ZERO){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "入库数量超出转库单已出数量!"); | 
|                     } | 
|                     //使用篮筐数据 | 
|                     List<OutScanBarcodeBean> outScanBarcodeBeanList = i.getOutScanBarcodeBeanList(); | 
|                     if (outScanBarcodeBeanList.size() == Constants.ZERO) { | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无扫描条码数据,请检查数据信息【" + i.getId() + "】"); | 
|                     } | 
|                     WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
|                     wOutboundDetail.setCreateUser(loginUserInfo.getId()); | 
|                     wOutboundDetail.setCreateTime(new Date()); | 
|                     wOutboundDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|                     wOutboundDetail.setOutboundId(wOutbound.getId()); | 
|                     wOutboundDetail.setMaterialId(wTransferDetail.getMaterialId()); | 
|                     wOutboundDetail.setUnitId(wTransferDetail.getUnitId()); | 
|                     wOutboundDetail.setBatch(i.getBatch()); | 
|                     wOutboundDetail.setNum(wTransferDetail.getOutActnum()); | 
|                     wOutboundDetail.setDoneDate(new Date()); | 
|                     wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); | 
|                     wOutboundDetail.setLocationId(i.getLocationId()); | 
|                     wOutboundDetail.setStatus(Constants.ONE); | 
|                     wOutboundDetail.setDoneNum(i.getOutNum()); | 
|                     wOutboundDetailExtMapper.insert(wOutboundDetail); | 
|                     //仓库数据 | 
|                     Warehouse warehouse = warehouseMapper.selectById(wTransferDetail.getOutWarehouseId()); | 
|                     if(Objects.isNull(warehouse)){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + i.getId() + "】"); | 
|                     } | 
|   | 
|                     QueryWrapper wrapper = new QueryWrapper<WStock>(); | 
|                     wrapper.eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()); | 
|                     wrapper.eq("MATERIAL_ID", wTransferDetail.getMaterialId()); | 
|                     wrapper.eq("WAREHOUSE_ID", wTransferDetail.getInWarehouseId()); | 
|                     if(StringUtils.isNotBlank(wTransferDetail.getBatch())){ | 
|                         wrapper.eq("BATCH" , i.getBatch()); | 
|                     }else{ | 
|                         wrapper.apply("BATCH is null "); | 
|                     } | 
|                     wrapper.eq(!Objects.isNull(i.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", i.getLocationId()); | 
|                     wrapper.eq("DELETED",0); | 
|   | 
|                     //获取货位库存信息 | 
|                     WStock wStock = wStockMapper.selectOne(wrapper); | 
|                     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(i.getBatch()); | 
|                         newWStock.setDeleted(Constants.ZERO); | 
|                         newWStock.setWarehouseId(wTransferDetail.getInWarehouseId()); | 
|                         //此仓库 开启仓位 | 
|                         if(warehouse.getUseLocation()==Constants.ONE){ | 
|                             newWStock.setLocationId(i.getLocationId()); | 
|                         } | 
|                         newWStock.setUnitId(wTransferDetail.getUnitId()); | 
|                         newWStock.setNum(i.getOutNum()); | 
|                         wStockMapper.insert(newWStock); | 
|                     }else{ | 
|                         wStock.setNum(wStock.getNum().add(i.getOutNum())); | 
|                         wStockExtMapper.updateById(wStock); | 
|                     } | 
|                     // 更新篮筐数据 | 
|                     updInAppliances(i.getOutScanBarcodeBeanList(),wOutboundDetail); | 
|                     // 添加操作记录 | 
|                     saveOutBoundRecord(outScanBarcodeBeanList, wOutboundDetail, loginUserInfo); | 
|                 }); | 
|             }); | 
|             //更新转库单信息 | 
|             updWTransfer(wOutBoundOutBean,wTransfer); | 
|   | 
|             //处理通知 | 
|             if(wTransfer.getType() == Constants.ONE){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.workShopIn.getType(),null); | 
|             }else if(wTransfer.getType() == Constants.TWO){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.transferWaitIn.getType(),null); | 
|             }else if(wTransfer.getType() == 3){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.wStockTransferIn.getType(),null); | 
|             }else if(wTransfer.getType() == 4){ | 
|                 noticesExtService.dealNotice(wTransfer.getId(),Constants.Notices_Type.finishIn.getType(),null); | 
|             } | 
|   | 
|         }else if(Constants.TWO == wOutBoundOutBean.getBillType()){ //使用入库单入库 | 
|             WOutbound wOutbound = wOutboundMapper.selectById(wOutBoundOutBean.getId()); | 
|             if(Objects.isNull(wOutbound)){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到入库单据信息"); | 
|             } | 
|             if(wOutbound.getStatus()!=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "入库单据已操作,无法再次处理"); | 
|             } | 
|             List<WOutBoundOutWarehouse> wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); | 
|             if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); | 
|             } | 
|             for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { | 
|                 List<WOutBoundOutDetailBean> wOutBoundOutDetailBeanList = wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); | 
|                 wOutBoundOutDetailBeanList.forEach(i->{ | 
|                     WOutboundDetail wOutboundDetail = wOutboundDetailExtMapper.selectById(i.getId()); | 
|                     //更新入库单明细 实际入库数量 | 
|                     if(wOutboundDetail.getStatus() == Constants.ZERO){ | 
|                         updWOutBoundDetail(wOutBoundOutDetailBeanList,wOutboundDetail); | 
|                     } | 
|                     //使用篮筐数据 | 
|                     List<OutScanBarcodeBean> outScanBarcodeBeanList = i.getOutScanBarcodeBeanList(); | 
|                     if(outScanBarcodeBeanList.size() == Constants.ZERO ){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无扫描条码数据,请检查数据信息【"+i.getId()+"】"); | 
|                     } | 
|                     //仓库数据 | 
|                     Warehouse warehouse = warehouseMapper.selectById(wOutbound.getWarehouseId()); | 
|                     if(Objects.isNull(warehouse)){ | 
|                         throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + i.getId() + "】"); | 
|                     } | 
|   | 
|                     //获取货位库存信息 | 
|                     WStock wStock = wStockMapper.selectOne(new QueryWrapper<WStock>() | 
|                             .eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()) | 
|                             .eq("MATERIAL_ID", wOutboundDetail.getMaterialId()) | 
|                             .eq("WAREHOUSE_ID", wOutbound.getWarehouseId()) | 
|                             .eq("BATCH", i.getBatch()) | 
|                             .eq(warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", i.getLocationId()) | 
|                     ); | 
|                     if (Objects.isNull(wStock)) { | 
|                         WStock newWStock = new WStock(); | 
|                         newWStock.setCreateTime(new Date()); | 
|                         newWStock.setCreateUser(loginUserInfo.getId()); | 
|                         newWStock.setRootDepartId(wOutbound.getRootDepartId()); | 
|                         newWStock.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                         newWStock.setBatch(i.getBatch()); | 
|                         newWStock.setWarehouseId(wOutbound.getWarehouseId()); | 
|                         //此仓库 开启仓位 | 
|                         if(warehouse.getUseLocation()==Constants.ONE){ | 
|                             newWStock.setLocationId(i.getLocationId()); | 
|                         } | 
|                         newWStock.setUnitId(wOutboundDetail.getUnitId()); | 
|                         newWStock.setNum(i.getOutNum()); | 
|                         wStockMapper.insert(newWStock); | 
|                     }else{ | 
|                         wStock.setNum(wStock.getNum().add(i.getOutNum())); | 
|                         wStockExtMapper.updateById(wStock); | 
|                     } | 
|                     // 更新篮筐数据 | 
|                     updInAppliances(i.getOutScanBarcodeBeanList(),wOutboundDetail); | 
|                     // 添加操作记录 | 
|                     saveOutBoundRecord(outScanBarcodeBeanList,wOutboundDetail,loginUserInfo); | 
|                 }); | 
|             } | 
|             wOutbound.setStatus(Constants.ONE); | 
|             wOutbound.setDealDate(new Date()); | 
|             wOutboundMapper.updateById(wOutbound); | 
|         } | 
|         return ApiResponse.success("操作成功"); | 
|     } | 
|   | 
|   | 
|     @Override | 
|     public synchronized  String  getNextInCode(Integer comId ){ | 
|         String prefix =  "RK-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; | 
|         Integer countNum  = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_OUTBOUND_IN_KEY+comId,Integer.class); | 
|         countNum = Constants.formatIntegerNum(countNum)+1; | 
|         //更新缓存 | 
|         RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_OUTBOUND_IN_KEY+comId,countNum); | 
|         String nextIndex =Integer.toString( countNum); | 
|         return prefix + StringUtils.leftPad(nextIndex,4,"0"); | 
|     } | 
|   | 
|     @Override | 
|     public synchronized String  getNextOutCode(Integer comId ){ | 
|         String prefix =  "CK-" + DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; | 
|         Integer countNum  = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_OUTBOUND_OUT_KEY+comId,Integer.class); | 
|         countNum = Constants.formatIntegerNum(countNum)+1; | 
|         //更新缓存 | 
|         RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_OUTBOUND_OUT_KEY+comId,countNum); | 
|         String nextIndex =Integer.toString( countNum ); | 
|         return prefix + StringUtils.leftPad(nextIndex,4,"0"); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 出入库单详情与出入库业务处理 | 
|      * @param id | 
|      * @param wOutboundType 操作类别 0 出库 1 入库 | 
|      * @param optType 1: 添加 2 移除 | 
|      * @param jsonBean 操作条码信息 | 
|      * @return | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public WOutboundRedisBean wOutBoundForInOut(Integer id,Integer wOutboundType,Integer optType,String jsonBean){ | 
|         WOutboundRedisBean wOutboundRedisBean = new WOutboundRedisBean(); | 
|         if(!(wOutboundType==Constants.ONE||wOutboundType==Constants.ZERO)){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "操作单据类型错误"); | 
|         } | 
|         WOutbound wOutbound = wOutboundExtMapper.wOutboundById(id); | 
|         if(Objects.isNull(wOutbound)||wOutbound.getType()!=wOutboundType){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未查询到对应类型单据"); | 
|         } | 
|         if(wOutbound.getStatus()!=Constants.ZERO){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误"); | 
|         } | 
|         List<WOutboundDetail> wOutboundDetailList = wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ZERO); | 
|         if(wOutbound.getType()==Constants.ZERO){ | 
|             for (WOutboundDetail wOutboundDetail:wOutboundDetailList) { | 
|                 QueryWStockDto queryWStockDto = new QueryWStockDto(); | 
|                 queryWStockDto.setRootDepartId(wOutboundDetail.getRootDepartId()); | 
|                 queryWStockDto.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                 queryWStockDto.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                 queryWStockDto.setLocationId(wOutboundDetail.getLocationId()); | 
|                 queryWStockDto.setUnitId(wOutboundDetail.getUnitId()); | 
|                 queryWStockDto.setBatch(wOutboundDetail.getBatch()); | 
|                 queryWStockDto.setQualityType(wOutboundDetail.getQualityType()); | 
|                 queryWStockDto.setProcedureId(wOutboundDetail.getProcedureId()); | 
|                 wOutboundDetail.setWStockExtListVOList(wStockExtMapper.stockListByDto(queryWStockDto)); | 
|             } | 
|             wOutbound.setWOutboundDetailsOut(wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ONE)); | 
|         } | 
|   | 
|         List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList = new ArrayList<>(); | 
|         String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(),String.class); | 
|         List<WOutboundRedisCodeBean> redisWOutboundRedisCodeBeanList = JSON.parseArray(jsonArray,WOutboundRedisCodeBean.class); | 
|         if(!Objects.isNull(redisWOutboundRedisCodeBeanList)&&redisWOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|             //TODO 特殊处理 批次为null redis 转义后 变为“” | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:redisWOutboundRedisCodeBeanList) { | 
|                 if(StringUtils.isEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     wOutboundRedisCodeBean.setBatch(null); | 
|                 } | 
|                 if(Objects.isNull(wOutboundRedisCodeBean.getProcedureId())||wOutboundRedisCodeBean.getProcedureId()==Constants.ZERO){ | 
|                     wOutboundRedisCodeBean.setProcedureId(null); | 
|                 } | 
|             } | 
|             wOutboundRedisCodeBeanList.addAll(redisWOutboundRedisCodeBeanList); | 
|         } | 
|         if(!Objects.isNull(optType)){ | 
|             WOutboundRedisCodeBean codeBean =  JSON.parseObject(jsonBean,WOutboundRedisCodeBean.class); | 
|             if(StringUtils.isEmpty(codeBean.getBatch())){ | 
|                 codeBean.setBatch(null); | 
|             } | 
|             if(Objects.isNull(codeBean.getProcedureId())){ | 
|                 codeBean.setProcedureId(null); | 
|             } | 
|             if(wOutboundType == Constants.ZERO && optType==Constants.ONE){ | 
|                 if(workorderRecordExtMapper.checkIsWork(codeBean.getAppliancesId().toString()).size()>Constants.ZERO){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前篮筐处于投料中"); | 
|                 }; | 
|             } | 
|             //2022-9-14 13:41:33 处理 添加验证篮筐属性与仓库属性 | 
|             Warehouse warehouse = warehouseMapper.selectById(wOutbound.getWarehouseId()); | 
|             //获取仓库属性 判断扫描篮筐数据属性 | 
|             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(optType==Constants.ONE){ | 
|                 this.checkDetail(codeBean); | 
|             } | 
|             //TODO 更新数据 | 
|             this.updateRedisCode(wOutboundRedisCodeBeanList,optType,codeBean,wOutboundType); | 
|   | 
|         } | 
|         if(!Objects.isNull(wOutboundType)){ | 
|             //TODO 整理已扫描物料数据 | 
|             this.handleWOutboundOutCode(wOutboundRedisBean,wOutboundRedisCodeBeanList,false); | 
|         } | 
|         wOutboundRedisBean.setWOutbound(wOutbound); | 
|         wOutboundRedisBean.setWOutboundDetailsWait(wOutboundDetailList); | 
|         wOutboundRedisBean.setWOutboundRedisCodeBeanList(wOutboundRedisCodeBeanList); | 
|         wOutboundRedisBean.setWarehouse(warehouseMapper.selectById(wOutbound.getWarehouseId())); | 
|         if(!Objects.isNull(optType)){ | 
|             RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(), JSONArray.fromObject(wOutboundRedisCodeBeanList).toString()); | 
|         } | 
|   | 
| //        Constants.Notices_Type_Transfer notices_type_transfer = Constants.Notices_Type_Transfer.checkEnum(wOutbound.getBillType()); | 
| //        noticesExtService.dealNotice(wOutbound.getId(),notices_type_transfer.getNoticeInType(),null); | 
|         return wOutboundRedisBean; | 
|     } | 
|   | 
|     public void checkDetail(WOutboundRedisCodeBean codeBean){ | 
|         WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(codeBean.getWOutboundDetailId()); | 
|         if(Objects.isNull(wOutboundDetail)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库明细信息"); | 
|         } | 
|         if(!Objects.equals(codeBean.getWarehouseId(),wOutboundDetail.getWarehouseId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "仓库信息不匹配"); | 
|         } | 
|         if(!Objects.isNull(wOutboundDetail.getLocationId())&&!Objects.equals(codeBean.getLocationId(),wOutboundDetail.getLocationId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "仓位信息信息不匹配"); | 
|         } | 
|         if(!Objects.equals(codeBean.getMaterialId(),wOutboundDetail.getMaterialId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料信息信息不匹配"); | 
|         } | 
|         if(!Objects.isNull(wOutboundDetail.getBatch())&&!Objects.equals(codeBean.getBatch(),wOutboundDetail.getBatch())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料批次信息不匹配"); | 
|         } | 
|         if(!Objects.equals(codeBean.getQualityType(),wOutboundDetail.getQualityType())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料质量属性信息不匹配"); | 
|         } | 
|         if(!Objects.isNull(wOutboundDetail.getProcedureId())&&!Objects.equals(codeBean.getProcedureId(),wOutboundDetail.getProcedureId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料工序信息不匹配"); | 
|         } | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 出入库业务处理提交 | 
|      * @param id | 
|      * @param wOutboundType 操作类别 0 出库 1 入库 | 
|      * @return | 
|      */ | 
|     @Override | 
|     @Transactional | 
|     public void wOutBoundForUpload(Integer id,Integer wOutboundType,LoginUserInfo loginUserInfo){ | 
|         WOutboundRedisBean wOutboundRedisBean = new WOutboundRedisBean(); | 
|         if(!(wOutboundType==Constants.ONE||wOutboundType==Constants.ZERO)){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "操作单据类型错误"); | 
|         } | 
|         WOutbound wOutbound = wOutboundExtMapper.wOutboundById(id); | 
|         if(Objects.isNull(wOutbound)||wOutbound.getType()!=wOutboundType){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未查询到对应类型单据"); | 
|         } | 
|         if(wOutbound.getStatus()!=Constants.ZERO){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误"); | 
|         } | 
|         Warehouse warehouse = warehouseMapper.selectById(wOutbound.getWarehouseId()); | 
|         List<WOutboundDetail> wOutboundDetailList = wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ZERO); | 
|         if(wOutbound.getType()==Constants.ZERO){ | 
|             for (WOutboundDetail wOutboundDetail:wOutboundDetailList) { | 
|                 QueryWStockDto queryWStockDto = new QueryWStockDto(); | 
|                 queryWStockDto.setRootDepartId(wOutboundDetail.getRootDepartId()); | 
|                 queryWStockDto.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                 queryWStockDto.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                 queryWStockDto.setLocationId(wOutboundDetail.getLocationId()); | 
|                 queryWStockDto.setUnitId(wOutboundDetail.getUnitId()); | 
|                 queryWStockDto.setBatch(wOutboundDetail.getBatch()); | 
|                 queryWStockDto.setQualityType(wOutboundDetail.getQualityType()); | 
|                 queryWStockDto.setProcedureId(wOutboundDetail.getProcedureId()); | 
|                 wOutboundDetail.setWStockExtListVOList(wStockExtMapper.stockListByDto(queryWStockDto)); | 
|             } | 
|             wOutbound.setWOutboundDetailsOut(wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ONE)); | 
|         } | 
|   | 
|         List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList = new ArrayList<>(); | 
|         String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(),String.class); | 
|         List<WOutboundRedisCodeBean> redisWOutboundRedisCodeBeanList = JSON.parseArray(jsonArray,WOutboundRedisCodeBean.class); | 
|   | 
|         //2022年9月26日11:23:29 加入 验证所有篮筐必须处于未投料状态 所有篮筐必须与出库单据仓库一致 | 
|         if(wOutboundType==Constants.ZERO){ | 
|             List<String> idList = redisWOutboundRedisCodeBeanList.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(), ",") +  "】篮筐处于投料中"); | 
|             } | 
|             // 所有篮筐必须与出库单据仓库一致 | 
|             redisWOutboundRedisCodeBeanList.forEach(i->{ | 
|                 Appliances appliances = appliancesExtMapper.selectById(i.getAppliancesId()); | 
|                 if(!Objects.equals(appliances.getWarehouseId(),wOutbound.getWarehouseId())){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(),"【" + i.getScanCode() +  "】篮筐归属仓库信息错误"); | 
|                 } | 
|             }); | 
|         }else{ | 
|             //入库的篮筐不能有仓库信息 | 
|             redisWOutboundRedisCodeBeanList.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(wOutboundType==Constants.ONE){ | 
|             List<WOutboundDetail> detailList =  wOutboundDetailMapper.selectList(new QueryWrapper<WOutboundDetail>().eq("OUTBOUND_ID",id)); | 
|             for (WOutboundDetail wOutboundDetail:detailList) { | 
|                 BigDecimal scanNum = BigDecimal.ZERO; | 
|                 for (WOutboundRedisCodeBean wOutboundRedisCodeBean:redisWOutboundRedisCodeBeanList) { | 
|                     if(Objects.equals(wOutboundRedisCodeBean.getWOutboundDetailId(),wOutboundDetail.getId())){ | 
|                         scanNum = scanNum.add(wOutboundRedisCodeBean.getNum()); | 
|                     } | 
|                 } | 
|                 if(wOutboundDetail.getNum().compareTo(scanNum)!=Constants.ZERO){ | 
|                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "入库数量应与待入库数量相同"); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         if(!Objects.isNull(redisWOutboundRedisCodeBeanList)&&redisWOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|             //TODO 特殊处理 批次为null redis 转义后 变为“” | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:redisWOutboundRedisCodeBeanList) { | 
|                 if(StringUtils.isEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     wOutboundRedisCodeBean.setBatch(null); | 
|                 } | 
|                 if(Objects.isNull(wOutboundRedisCodeBean.getProcedureId())||wOutboundRedisCodeBean.getProcedureId()==Constants.ZERO){ | 
|                     wOutboundRedisCodeBean.setProcedureId(null); | 
|                 } | 
|             } | 
|             wOutboundRedisCodeBeanList.addAll(redisWOutboundRedisCodeBeanList); | 
|         } | 
|         //TODO 整理已扫描物料数据 | 
|         this.handleWOutboundOutCode(wOutboundRedisBean,wOutboundRedisCodeBeanList,true); | 
|         wOutboundRedisBean.setWOutbound(wOutbound); | 
|         wOutboundRedisBean.setWOutboundDetailsWait(wOutboundDetailList); | 
|         wOutboundRedisBean.setWOutboundRedisCodeBeanList(wOutboundRedisCodeBeanList); | 
|         // TODO 更新篮筐库存数据 添加操作记录 | 
|         this.updateAppliances(wOutboundRedisBean.getWoScanMaterialBeanList(),warehouse,wOutboundType,loginUserInfo,wOutbound.getOrigin()); | 
|         // TODO 更新单据数据 | 
|         wOutbound.setStatus(Constants.ONE); | 
|         wOutbound.setDealDate(new Date()); | 
|         wOutboundMapper.updateById(wOutbound); | 
|         RedisUtil.deleteObject(redisTemplate,wOutbound.getId().toString()); | 
|         Constants.Notices_Type_Transfer notices_type_transfer = Constants.Notices_Type_Transfer.checkEnum(wOutbound.getBillType()); | 
|         noticesExtService.dealNotice(wOutbound.getId(),wOutboundType==Constants.ZERO?notices_type_transfer.getNoticeOutType():notices_type_transfer.getNoticeInType(),null); | 
|         //记录操作记录 | 
|         WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); | 
|         wHistory.setTitle("出入库单完成"); | 
|         wHistory.setInfo("出入库单完成"); | 
|         wHistoryMapper.insert(wHistory); | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 更新篮筐库存数据 添加操作记录 | 
|      * @param woScanMaterialBeanList | 
|      * @param wOutboundType | 
|      * @param loginUserInfo | 
|      */ | 
|     @Transactional | 
|     public void updateAppliances(List<WoScanMaterialBean>  woScanMaterialBeanList,Warehouse warehouse,Integer wOutboundType,LoginUserInfo loginUserInfo,Integer orgin){ | 
|         if(Objects.isNull(woScanMaterialBeanList)||woScanMaterialBeanList.size()==Constants.ZERO){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "无扫描数据,提交失败"); | 
|         } | 
|         for (WoScanMaterialBean woScanMaterialBean:woScanMaterialBeanList) { | 
|             List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList = woScanMaterialBean.getWOutboundRedisCodeBeanList(); | 
|             if(wOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|                 WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(woScanMaterialBean.getWOutboundDetailId()); | 
|                 for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                     Appliances appliances = appliancesMapper.selectById(wOutboundRedisCodeBean.getAppliancesId()); | 
|                     appliances.setCurObjId(wOutboundDetail.getOutboundId()); | 
|                     appliances.setCurObjType(Constants.ZERO); | 
|                     Integer outLocationId = Constants.ZERO ; | 
|                     if(wOutboundType==Constants.ZERO){ | 
|                         if(!Objects.isNull(appliances)){ | 
|                             if(warehouse.getUseLocation()==Constants.ONE) { | 
|                                 outLocationId = appliances.getLocationId(); | 
|                             } | 
|                             appliances.setWarehouseId(null); | 
|                             appliances.setLocationId(null); | 
|                         } | 
|                     }else if(wOutboundType==Constants.ONE){ | 
|                         appliances.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                         if(warehouse.getUseLocation()==Constants.ONE){ | 
|                             appliances.setLocationId(woScanMaterialBean.getLocationId()); | 
|                         } | 
|                     } | 
|                     WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord(appliances,loginUserInfo); | 
|                     if(warehouse.getUseLocation()==Constants.ONE){ | 
|                         //根据出入库类别 记录record表货位数据  入库由扫描货位来 出库由原工装器具数据来 | 
|                         if(wOutboundType==Constants.ZERO){ | 
|                             wOutboundRecord.setLocationId(outLocationId); | 
|                         }else{ | 
|                             wOutboundRecord.setLocationId(appliances.getLocationId()); | 
|                         } | 
|   | 
|                     } | 
|                     wOutboundRecordMapper.insert(wOutboundRecord); | 
|                     //手工创建出库单 要更新掉工装器具内所有数据 2022年10月27日11:04:22 | 
|                     if(wOutboundType==Constants.ZERO&&!Objects.isNull(orgin)&&Constants.ZERO == orgin){ | 
|                         appliances.setSerialNum(null); | 
|                         appliances.setStatus(Constants.ONE); | 
|                         appliances.setWorkorderId(null); | 
|                         appliances.setMaterialId(null); | 
|                         appliances.setNum(null); | 
|                         appliances.setPositionType(null); | 
|                         appliances.setProcedureId(null); | 
|                         appliances.setNextProcedureId(null); | 
|                         appliances.setCurObjId(null); | 
|                         appliances.setCurObjType(null); | 
|                         appliances.setBatch(null); | 
|                         appliances.setQualityType(null); | 
|                         appliances.setBackorderId(null); | 
|                         appliances.setSaleorderId(null); | 
|                         appliances.setBackProcedureId(null); | 
|                         appliances.setRelobjType(null); | 
|                     } | 
|                     if(!Objects.isNull(orgin)&&Constants.ZERO == orgin){ | 
|                         appliancesExtMapper.editById(appliances); | 
|                     }else{ | 
|                         appliancesMapper.updateById(appliances); | 
|                     } | 
|                 } | 
|                 wOutboundDetail.setDoneNum(woScanMaterialBean.getScanNum()); | 
|                 wOutboundDetail.setStatus(Constants.ONE); | 
|                 wOutboundDetail.setDoneDate(new Date()); | 
|                 wOutboundDetailMapper.updateById(wOutboundDetail); | 
|                 //记录库存变动记录 | 
|                 wStockRecordExtService.saveRecordNoLocationId(wOutboundType,wOutboundDetail.getId(),loginUserInfo,woScanMaterialBean.getLocationId()); | 
|                 this.updateStock(woScanMaterialBean,wOutboundDetail,warehouse,wOutboundType,loginUserInfo); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 更新库存信息 | 
|      * @param woScanMaterialBean | 
|      * @param wOutboundDetail | 
|      * @param loginUserInfo | 
|      */ | 
|     @Transactional | 
|     public void updateStock(WoScanMaterialBean woScanMaterialBean,WOutboundDetail wOutboundDetail,Warehouse warehouse,Integer wOutboundType,LoginUserInfo loginUserInfo){ | 
|         //TODO 查询库存数据 | 
|         QueryWrapper wrapper = new QueryWrapper<WStock>(); | 
|         wrapper.eq("ROOT_DEPART_ID", wOutboundDetail.getRootDepartId()); | 
|         wrapper.eq("MATERIAL_ID", woScanMaterialBean.getMaterialId()); | 
|         wrapper.eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()); | 
|         wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); | 
|         if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ | 
|             wrapper.eq("BATCH" , wOutboundDetail.getBatch()); | 
|         }else{ | 
|             wrapper.apply("BATCH is null "); | 
|         } | 
|         if(Objects.isNull(wOutboundDetail.getProcedureId())){ | 
|             wrapper.apply(" PROCEDURE_ID is null  "); | 
|         }else{ | 
|             wrapper.eq("PROCEDURE_ID" , wOutboundDetail.getProcedureId()); | 
|         } | 
|         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(wOutboundType==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(woScanMaterialBean.getScanNum()) < Constants.ZERO) { | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前货位库存数量不足;剩余数量【" + wStock.getNum() + "】;出库数量【" + woScanMaterialBean.getScanNum() + "】"); | 
|             } | 
|             wStock.setNum(wStock.getNum().subtract(woScanMaterialBean.getScanNum())); | 
|             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(wOutboundDetail.getRootDepartId()); | 
|                 newWStock.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                 //此仓库 开启仓位 | 
|                 if(warehouse.getUseLocation()==Constants.ONE){ | 
|                     newWStock.setLocationId(woScanMaterialBean.getLocationId()); | 
|                 } | 
|                 newWStock.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                 newWStock.setBatch(wOutboundDetail.getBatch()); | 
|                 newWStock.setUnitId(wOutboundDetail.getUnitId()); | 
|                 newWStock.setNum(woScanMaterialBean.getScanNum()); | 
|                 newWStock.setQualityType(wOutboundDetail.getQualityType()); | 
|                 newWStock.setProcedureId(wOutboundDetail.getProcedureId()); | 
|                 wStockMapper.insert(newWStock); | 
|             }else{ | 
|                 WStock wStock = wStockList.get(0); | 
|                 wStock.setNum(wStock.getNum().add(woScanMaterialBean.getScanNum())); | 
|                 wStockMapper.updateById(wStock); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|     public void handleWOutboundOutCode(WOutboundRedisBean wOutboundRedisBean,List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList,boolean isError){ | 
|         List<WoScanMaterialBean>  woScanMaterialBeanList = new ArrayList<>(); | 
|         if(!Objects.isNull(wOutboundRedisCodeBeanList)&&wOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|             //获取仓库属性 判断扫描篮筐数据属性 | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                 //遍历已扫工装数据 | 
|                 if(woScanMaterialBeanList.size()==Constants.ZERO || !isRepeatMaterialData(woScanMaterialBeanList,wOutboundRedisCodeBean)){ | 
|                     woScanMaterialBeanList.add(wOutboundRedisCodeBean.toWoScanMaterialBean()); | 
|                 } | 
|             } | 
|             //TODO 已扫描物料数据 绑定已扫描条码 更新已扫描数量 | 
|             for (WoScanMaterialBean woScanMaterialBean:woScanMaterialBeanList) { | 
|                 BigDecimal scanNum = BigDecimal.ZERO; | 
|   | 
|                 List<WOutboundRedisCodeBean> wOutboundRedisCodeBeans = new ArrayList<>(); | 
|                 for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                     if(StringUtils.equals(woScanMaterialBean.getWOutboundDetailId().toString(),wOutboundRedisCodeBean.getWOutboundDetailId().toString()) | 
|                             &&StringUtils.equals(woScanMaterialBean.getMaterialId().toString(),wOutboundRedisCodeBean.getMaterialId().toString()) | 
| //                            &&StringUtils.equals(woScanMaterialBean.getLocationId().toString(),wOutboundRedisCodeBean.getLocationId().toString()) | 
|                             &&woScanMaterialBean.getQualityType().intValue() == wOutboundRedisCodeBean.getQualityType().intValue() | 
|                     ){ | 
|                         if(!Objects.equals(woScanMaterialBean.getLocationId(),wOutboundRedisCodeBean.getLocationId())){ | 
|                             continue; | 
|                         } | 
|                         //TODO 判断工序是否都不为空 | 
|                         if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                             if(!woScanMaterialBean.getProcedureId().equals(wOutboundRedisCodeBean.getProcedureId())){ | 
|                                 continue; | 
|                             } | 
|                         }else if(Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                             continue; | 
|                         }else if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                             continue; | 
|                         } | 
|                         //TODO 若批次为 null /“” 则不验证批次,否则验证 | 
|                         if(StringUtils.isNotEmpty(woScanMaterialBean.getBatch())&&StringUtils.equals(woScanMaterialBean.getBatch(),wOutboundRedisCodeBean.getBatch())){ | 
|                             wOutboundRedisCodeBeans.add(wOutboundRedisCodeBean); | 
|                             scanNum = scanNum.add(wOutboundRedisCodeBean.getNum()); | 
|                         }else if(StringUtils.isEmpty(woScanMaterialBean.getBatch())){ | 
|                             wOutboundRedisCodeBeans.add(wOutboundRedisCodeBean); | 
|                             scanNum = scanNum.add(wOutboundRedisCodeBean.getNum()); | 
|                         } | 
|                     } | 
|                 } | 
|                 if(isError){ | 
|                     WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(woScanMaterialBean.getWOutboundDetailId()); | 
|   | 
|                     if( scanNum.compareTo(wOutboundDetail.getNum())>0){ | 
|                         throw new BusinessException(ResponseStatus.EXCEED_PLAN_NUM.getCode(), "超出计划数量,扫描失败"); | 
|                     } | 
|   | 
|                 } | 
|                 woScanMaterialBean.setWOutboundRedisCodeBeanList(wOutboundRedisCodeBeans); | 
|                 woScanMaterialBean.setScanNum(scanNum); | 
|             } | 
|             wOutboundRedisBean.setWoScanMaterialBeanList(woScanMaterialBeanList); | 
|          } | 
|     } | 
|   | 
|     private boolean isRepeatMaterialData(List<WoScanMaterialBean> woScanMaterialBeanList, WOutboundRedisCodeBean wOutboundRedisCodeBean) { | 
|         //TODO 物料/批次/货位是否相同 相同则跳过,否则加入数据 | 
|         for (WoScanMaterialBean woScanMaterialBean:woScanMaterialBeanList) { | 
|             if(StringUtils.equals(woScanMaterialBean.getWOutboundDetailId().toString(),wOutboundRedisCodeBean.getWOutboundDetailId().toString()) | 
|                     &&StringUtils.equals(woScanMaterialBean.getMaterialId().toString(),wOutboundRedisCodeBean.getMaterialId().toString()) | 
|                     &&StringUtils.equals(woScanMaterialBean.getLocationId().toString(),wOutboundRedisCodeBean.getLocationId().toString()) | 
|                     &&Constants.equalsInteger(woScanMaterialBean.getQualityType(),wOutboundRedisCodeBean.getQualityType()) | 
|             ) { | 
|                 // 物料/批次/货位相同 | 
|                 //TODO 判断工序是否都不为空 | 
|                 if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId()) && !Constants.equalsInteger(woScanMaterialBean.getProcedureId(),(wOutboundRedisCodeBean.getProcedureId()))){ | 
|                         return false; | 
|                 }else if(Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                     return false; | 
|                 }else if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                     return false; | 
|                 } | 
|                 //TODO 若批次为 null /“” 则不验证批次,否则验证 | 
|                 if(StringUtils.isNotEmpty(woScanMaterialBean.getBatch())&&!StringUtils.equals(woScanMaterialBean.getBatch(),wOutboundRedisCodeBean.getBatch())){ | 
|                     return false; | 
|                 }else if(StringUtils.isNotEmpty(woScanMaterialBean.getBatch()) && StringUtils.isEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     return false; | 
|                 }else if(StringUtils.isEmpty(woScanMaterialBean.getBatch()) && StringUtils.isNotEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     return false; | 
|                 } | 
|                 return true; | 
|             } | 
|   | 
|         } | 
|          return false; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 更新条码列表 | 
|      * @param wOutboundRedisCodeBeanList 所有条码列表 | 
|      * @param optType 1:添加;2:删除 | 
|      * @param codeBean 工装器具 | 
|      */ | 
|     @Transactional | 
|     public void updateRedisCode(List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList,Integer optType,WOutboundRedisCodeBean codeBean,Integer wOutboundType){ | 
|         if(Objects.isNull(optType)|| (optType!=Constants.ONE&&optType!=Constants.TWO)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "更新操作类别异常"); | 
|         }if(optType==Constants.ONE){ | 
|             // 校验 工装器具数据是否已扫描 | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                 if(StringUtils.equals(wOutboundRedisCodeBean.getAppliancesId().toString(),codeBean.getAppliancesId().toString())){ | 
|                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "工装器具数据已扫描,无法重复扫描"); | 
|                 } | 
|                 //判断条码是是否在当前单据中 | 
|                 WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(codeBean.getWOutboundDetailId()); | 
|                 if(StringUtils.equals(wOutboundDetail.getMaterialId().toString(),codeBean.getMaterialId().toString()) | 
|                         &&StringUtils.equals(wOutboundDetail.getWarehouseId().toString(),codeBean.getWarehouseId().toString())){ | 
|   | 
|                     if(!Objects.isNull(wOutboundDetail.getProcedureId())&&!Objects.isNull( codeBean.getProcedureId())){ | 
|                         if(!wOutboundDetail.getProcedureId().equals(codeBean.getProcedureId())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); | 
|                         } | 
|                     }else if(Objects.isNull(wOutboundDetail.getProcedureId())&&!Objects.isNull( codeBean.getProcedureId())){ | 
|                         throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); | 
|                     }else if(!Objects.isNull(wOutboundDetail.getProcedureId())&&Objects.isNull( codeBean.getProcedureId())){ | 
|                         throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); | 
|                     } | 
|                     if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ | 
|                         if(!wOutboundDetail.getBatch().equals(codeBean.getBatch())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据批次不匹配"); | 
|                         } | 
|                     } | 
|                     if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ | 
|                         if(!wOutboundDetail.getBatch().equals(codeBean.getBatch())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据批次不匹配"); | 
|                         } | 
|                     } | 
|                     if(!Objects.isNull(wOutboundDetail.getLocationId())){ | 
|                         if(!Objects.equals(wOutboundDetail.getLocationId(),codeBean.getLocationId())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据货位不匹配"); | 
|                         } | 
|                     } | 
|                 }else{ | 
|                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据不匹配"); | 
|                 } | 
|             } | 
|             wOutboundRedisCodeBeanList.add(codeBean); | 
|         }else if(optType==Constants.TWO){ | 
|             //TODO 是否在当前单据数据内 | 
|             Boolean isHave = true; | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                 if (StringUtils.equals(wOutboundRedisCodeBean.getAppliancesId().toString(), codeBean.getAppliancesId().toString())) { | 
|                     wOutboundRedisCodeBeanList.remove(wOutboundRedisCodeBean); | 
|                     isHave = false; | 
|                     break; | 
|                 } | 
|             } | 
|             if(isHave){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "扫描条码未存在当前单据内"); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void wOutBoundForStockUp(WOutboundInHeadBean wOutboundInHeadBean,LoginUserInfo loginUserInfo){ | 
|         if(!(wOutboundInHeadBean.getType()==25||wOutboundInHeadBean.getType()==26||wOutboundInHeadBean.getType()==27||wOutboundInHeadBean.getType()==28)){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据类别错误"); | 
|         } | 
|         Warehouse warehouse = warehouseMapper.selectById(wOutboundInHeadBean.getWarehouseId()); | 
|         if(Objects.isNull(warehouse)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据"); | 
|         } | 
|         WOutbound wOutbound = new WOutbound(); | 
|         wOutbound.setPlanDate(new Date()); | 
|         wOutbound.setType(Constants.ONE); | 
|         wOutbound.setBillType(wOutboundInHeadBean.getType()); | 
|         wOutbound.setWarehouseId(wOutboundInHeadBean.getWarehouseId()); | 
|         wOutbound.setCreateTime(new Date()); | 
|         wOutbound.setCreateUser(loginUserInfo.getId()); | 
|         wOutbound.setOrigin(Constants.ZERO); | 
|         wOutbound.setValidDate(wOutboundInHeadBean.getValidDate()); | 
|         wOutbound.setStatus(Constants.ONE); | 
|         wOutbound.setCode(getNextInCode(loginUserInfo.getCompany().getId()));// 单据编码 | 
|         wOutbound.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|         wOutbound.setDepartId(loginUserInfo.getCurComDepartment().getId()); | 
|         wOutbound.setUserId(loginUserInfo.getId()); | 
|         wOutbound.setAbstracts(wOutboundInHeadBean.getAbstracts()); | 
|         wOutboundMapper.insert(wOutbound); | 
|         List<WOutboundInBodyBean> wOutboundInBodyBeanList = wOutboundInHeadBean.getWOutboundInBodyBeanList(); | 
|         if(Objects.isNull(wOutboundInBodyBeanList)){ | 
|             throw new BusinessException(ResponseStatus.ITEM_ERR_STATUS.getCode(), "无行项目数据"); | 
|         } | 
|         //获取仓库属性 判断扫描篮筐数据属性 | 
|         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 ; | 
|         } | 
|         //记录操作记录 | 
|         WHistory wHistory = wOutbound.toWHistory(loginUserInfo.getId()); | 
|          if(wOutboundInHeadBean.getType()==25||wOutboundInHeadBean.getType()==26||wOutboundInHeadBean.getType()==27|wOutboundInHeadBean.getType()==28){ | 
|             this.purchaseIn(wOutboundInHeadBean,warehouse,wOutbound,loginUserInfo,wareHouseQualityType); | 
|         } | 
| //         else if(wOutboundInHeadBean.getType()==28){ | 
| //            this.adjustmentIn(wOutboundInHeadBean,warehouse,wOutbound,loginUserInfo,wareHouseQualityType); | 
| //        } | 
|         wHistory.setTitle( "完成出入库业务"); | 
|         wHistory.setInfo("完成出入库业务"); | 
|         wHistoryMapper.insert(wHistory); | 
|     } | 
|   | 
|     public String sub(WOutboundInBodyBean i){ | 
|         StringBuffer sub = new StringBuffer(); | 
|         sub.append(i.getMaterialId() | 
|                 +i.getUnitId() | 
|                 +i.getQualityType() | 
|                 ); | 
|         if(!Objects.isNull(i.getLocationId())){ | 
|             sub.append(i.getLocationId()); | 
|         } | 
|         if(!Objects.isNull(i.getBatch())){ | 
|             sub.append(i.getBatch()); | 
|         } | 
|         if(!Objects.isNull(i.getProcedureId())){ | 
|             sub.append(i.getProcedureId()); | 
|         } | 
|         return  sub.toString(); | 
|     } | 
|   | 
|     @Transactional | 
|     public void purchaseIn(WOutboundInHeadBean wOutboundInHeadBean,Warehouse warehouse,WOutbound wOutbound,LoginUserInfo loginUserInfo,Integer wareHouseQualityType){ | 
|         List<WOutboundInBodyBean> wOutboundInBodyBeanList =  wOutboundInHeadBean.getWOutboundInBodyBeanList(); | 
|         //整理数据过滤 相同属性数据合并后 进行数据写入 | 
|         Map<String, List<WOutboundInBodyBean>> wOutboundInBodyBeanMap = wOutboundInBodyBeanList.stream() | 
|                     .collect(Collectors.groupingBy(i -> this.sub(i))); | 
|         Iterator<String> iter = wOutboundInBodyBeanMap.keySet().iterator(); | 
|         while(iter.hasNext()) { | 
|             String key = iter.next(); | 
|             //获取当前行处理数据 | 
|             List<WOutboundInBodyBean> wOutboundInBodyBeans = wOutboundInBodyBeanMap.get(key); | 
|             WOutboundInBodyBean wOutboundInBodyBean = wOutboundInBodyBeans.get(Constants.ZERO); | 
|             //累计入库数量 | 
|             wOutboundInBodyBean.setNum(wOutboundInBodyBeans.stream().map(s -> s.getNum()).reduce(BigDecimal.ZERO, BigDecimal::add)); | 
|             if(wOutboundInBodyBean.getNum().compareTo(BigDecimal.ZERO)<=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "数量异常,请检查数量!"); | 
|             } | 
|             WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
|             //查询物料数据 | 
|             MaterialDistribute materialDistribute = materialDistributeMapper.selectById(wOutboundInBodyBean.getMaterialId()); | 
|             if(Objects.isNull(materialDistribute)){ | 
|                 throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "未查询到物料数据:"+wOutboundInBodyBean.getMaterialId()); | 
|             } | 
|             if(wareHouseQualityType != 3){ | 
|                 if(wOutboundInBodyBean.getQualityType()!=wareHouseQualityType){ | 
|                     throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "仓库质量属性与入库数据质量属性不一致"); | 
|                 } | 
|             } | 
|             wOutboundDetail.setNum(wOutboundInBodyBean.getNum()); | 
|             wOutboundDetail.setMaterialId(materialDistribute.getId()); | 
|             wOutboundDetail.setUnitId(wOutboundInBodyBean.getUnitId()); | 
|             if(StringUtils.isNotBlank(wOutboundInBodyBean.getBatch())){ | 
|                 wOutboundDetail.setBatch(wOutboundInBodyBean.getBatch()); | 
|             } | 
|             wOutboundDetail.setOutboundId(wOutbound.getId()); | 
|             wOutboundDetail.setCreateTime(new Date()); | 
|             wOutboundDetail.setCreateUser(loginUserInfo.getId()); | 
|             wOutboundDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|             wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); | 
|             wOutboundDetail.setQualityType(wOutboundInBodyBean.getQualityType()); | 
|             wOutboundDetail.setDoneNum(wOutboundInBodyBean.getNum()); | 
|             wOutboundDetail.setDoneDate(new Date()); | 
|             wOutboundDetail.setStatus(Constants.ONE); | 
|             //此仓库 开启仓位 | 
|             if(warehouse.getUseLocation()==Constants.ONE){ | 
|                 wOutboundDetail.setLocationId(wOutboundInBodyBean.getLocationId()); | 
|             } | 
|             if(StringUtils.isNotBlank(wOutboundInBodyBean.getProcedureId())){ | 
|                 wOutboundDetail.setProcedureId(Integer.valueOf(wOutboundInBodyBean.getProcedureId())); | 
|             } | 
|             wOutboundDetailMapper.insert(wOutboundDetail); | 
|             //更新库存数据 | 
|             QueryWrapper wrapper = new QueryWrapper<WStock>(); | 
|             wrapper.eq("ROOT_DEPART_ID", wOutboundDetail.getRootDepartId()); | 
|             wrapper.eq("MATERIAL_ID", wOutboundDetail.getMaterialId()); | 
|             wrapper.eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()); | 
|             wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); | 
|             wrapper.eq(StringUtils.isNotBlank(wOutboundDetail.getBatch()),"BATCH", wOutboundDetail.getBatch()); | 
|             wrapper.apply(StringUtils.isBlank(wOutboundDetail.getBatch()),"BATCH is null"); | 
|             wrapper.eq(!Objects.isNull(wOutboundDetail.getProcedureId()),"PROCEDURE_ID" , wOutboundDetail.getProcedureId()); | 
|             wrapper.apply(Objects.isNull(wOutboundDetail.getProcedureId()),"PROCEDURE_ID is null"); | 
|             wrapper.eq(!Objects.isNull(wOutboundDetail.getLocationId())&&warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", wOutboundDetail.getLocationId()); | 
|             wrapper.eq("DELETED",0); | 
|             WStock wStock  = wStockMapper.selectOne(wrapper); | 
|             if(Objects.isNull(wStock)){ | 
|                 WStock newWStock = new WStock(); | 
|                 newWStock.setCreateTime(new Date()); | 
|                 newWStock.setCreateUser(loginUserInfo.getId()); | 
|                 newWStock.setRootDepartId(wOutboundDetail.getRootDepartId()); | 
|                 newWStock.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                 //此仓库 开启仓位 | 
|                 if(warehouse.getUseLocation()==Constants.ONE){ | 
|                     newWStock.setLocationId(wOutboundInBodyBean.getLocationId()); | 
|                 } | 
|                 newWStock.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                 newWStock.setBatch(wOutboundDetail.getBatch()); | 
|                 newWStock.setUnitId(wOutboundDetail.getUnitId()); | 
|                 newWStock.setNum(wOutboundInBodyBean.getNum()); | 
|                 newWStock.setQualityType(wOutboundDetail.getQualityType()); | 
|                 newWStock.setProcedureId(wOutboundDetail.getProcedureId()); | 
|                 wStockMapper.insert(newWStock); | 
|             }else{ | 
|                 wStock.setNum(wStock.getNum().add(wOutboundInBodyBean.getNum())); | 
|                 wStockMapper.updateById(wStock); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @Transactional | 
|     public void adjustmentIn(WOutboundInHeadBean wOutboundInHeadBean,Warehouse warehouse,WOutbound wOutbound,LoginUserInfo loginUserInfo,Integer wareHouseQualityType){ | 
|         List<Map<String,Object>> mapList = new ArrayList<>(); | 
|         List<WOutboundInBodyBean> wOutboundInBodyBeanList =  wOutboundInHeadBean.getWOutboundInBodyBeanList(); | 
|   | 
|   | 
|         //整理数据入库数据类别  根据 物料主键,生产工序,质量属性,批次  分类 更新篮筐数据 | 
|         for (WOutboundInBodyBean i:wOutboundInBodyBeanList) { | 
|             if(Objects.isNull(i.getMaterialId()) | 
|                     ||Objects.isNull(i.getBatch()) | 
|                     ||Objects.isNull(i.getProcedureId()) | 
|                     ||Objects.isNull(i.getQualityType()) | 
|                     ||Objects.isNull(i.getNum()) | 
|                     ||Objects.isNull(i.getAppliancesId()) | 
|             ){ | 
|                 throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "参数异常"); | 
|             } | 
|             if(i.getNum().compareTo(BigDecimal.ZERO)<=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "篮筐数量不能为0"); | 
|             } | 
|             if(wareHouseQualityType != 3){ | 
|                 if(i.getQualityType()!=wareHouseQualityType){ | 
|                     throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "篮筐质量属性与仓库属性不一致"); | 
|                 } | 
|             } | 
|             MaterialDistribute materialDistribute = materialDistributeMapper.selectById(i.getMaterialId()); | 
|             if(Objects.isNull(materialDistribute)){ | 
|                 throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未查询到物料分配数据"); | 
|             } | 
|             Material material = materialMapper.selectById(materialDistribute.getMaterialId()); | 
|             if(Objects.isNull(material)){ | 
|                 throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未查询到物料数据"); | 
|             } | 
|   | 
|             //更新篮筐数据 | 
|             Appliances appliances = appliancesMapper.selectById(i.getAppliancesId()); | 
|             if(Objects.isNull(appliances)){ | 
|                 throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "未查询到篮筐:" + i.getAppliancesId()); | 
|             } | 
|             appliances.setMaterialId(i.getMaterialId()); | 
|             appliances.setStatus(3); | 
|             appliances.setQualityType(i.getQualityType()); | 
|             appliances.setBatch(i.getBatch()); | 
|             appliances.setPositionType(Constants.ZERO); | 
|             appliances.setNum(i.getNum()); | 
|   | 
|             //根据物料查询当前BOM分配的工序 | 
|             List<Bom> bomList = bomMapper.selectList(new QueryWrapper<Bom>().eq("MATERIAL_ID",i.getMaterialId()).eq("STATUS",1)); | 
|             if(!Objects.isNull(bomList)&&bomList.size()>Constants.ZERO){ | 
|                 if(StringUtils.isBlank(i.getProcedureId())){ | 
|                     throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "物料存在工序,请选择工序"); | 
|                 } | 
|                 if(bomList.size()>Constants.ONE){ | 
|                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前物料对应BOM数据异常,存在多条启用BOM!"); | 
|                 } | 
|                 Bom bom = bomList.get(Constants.ZERO); | 
|                 //查询当前生产工序在工艺路线数据中的序号 | 
|                 RouteProcedure routeProcedure = routeProcedureMapper.selectOne(new QueryWrapper<RouteProcedure>().eq("DELETED",Constants.ZERO) | 
|                                 .eq("ROUTE_ID",bom.getRouteId()) | 
|                                 .eq("PROCEDURE_ID",i.getProcedureId()) | 
| //                        .eq("DEPART_ID",bom.getDepartId()) | 
|                 ); | 
|                 if(Objects.isNull(routeProcedure)){ | 
|                     throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "对不起,未查询到当前工艺路线数据"); | 
|                 } | 
|                 RouteProcedure nextRouteProcedure =  routeProcedureMapper.selectOne(new QueryWrapper<RouteProcedure>() | 
|                                 .eq("ROUTE_ID",routeProcedure.getRouteId()) | 
| //                        .eq("DEPART_ID",bom.getDepartId()) | 
|                                 .apply("  SORTNUM >  "+routeProcedure.getSortnum()+" ") | 
|                                 .last(" limit 1  ") | 
|                 ); | 
|                 if(!Objects.isNull(nextRouteProcedure)){ | 
|                     appliances.setNextProcedureId(nextRouteProcedure.getProcedureId()); | 
|                 } | 
|                 appliances.setProcedureId(Integer.valueOf(i.getProcedureId())); | 
|             } | 
|             appliancesMapper.updateById(appliances); | 
|   | 
|             //添加调整明细记录 用于取消业务使用 2022年8月8日10:01:36 | 
|             AdjustmentRecord adjustmentRecord = new AdjustmentRecord(); | 
|             adjustmentRecord.setCreateTime(new Date()); | 
|             adjustmentRecord.setCreateUser(loginUserInfo.getId()); | 
|             adjustmentRecord.setAppliancesId(appliances.getId()); | 
|             adjustmentRecord.setOutboundId(wOutbound.getId()); | 
|             adjustmentRecord.setDeleted(Constants.ZERO); | 
|             adjustmentRecord.setRootDepartId(wOutbound.getRootDepartId()); | 
|             adjustmentRecordMapper.insert(adjustmentRecord); | 
|   | 
|             Map<String,Object> map = new HashMap<>(); | 
|             map.put("materialId",i.getMaterialId()); | 
|             map.put("batch",i.getBatch()); | 
|             map.put("procedureId",i.getProcedureId()); | 
|             map.put("qualityType",i.getQualityType()); | 
|             map.put("unitId",material.getUnitId()); | 
|             map.put("num",i.getNum()); | 
|             //整理入库明细数据 | 
|             if(Objects.isNull(mapList)||mapList.size()==Constants.ZERO){ | 
|                 mapList.add(map); | 
|             }else{ | 
|                 Boolean flag = true ; | 
|                 for (Map<String,Object> m:mapList) { | 
|                     if(Objects.equals(m.get("materialId"),map.get("materialId")) | 
|                             &&Objects.equals(m.get("batch"),map.get("batch")) | 
|                             &&Objects.equals(m.get("procedureId"),map.get("procedureId")) | 
|                             &&Objects.equals(m.get("qualityType"),map.get("qualityType")) | 
|                     ){ | 
|                         BigDecimal num = new BigDecimal(m.get("num").toString()); | 
|                         num = num.add(new BigDecimal(map.get("num").toString())); | 
|                         m.put("num",num); | 
|                         flag = false; | 
|                         continue; | 
|                     } | 
|                 } | 
|                 if(flag){ | 
|                     mapList.add(map); | 
|                 } | 
|             } | 
|         }; | 
|         if(!(Objects.isNull(mapList)||mapList.size()==Constants.ZERO)){ | 
|             for (Map<String,Object> m:mapList) { | 
|                 WOutboundDetail wOutboundDetail = new WOutboundDetail(); | 
|                 //查询物料数据 | 
|                 MaterialDistribute materialDistribute = materialDistributeMapper.selectById(m.get("materialId").toString()); | 
|                 if(Objects.isNull(materialDistribute)){ | 
|                     throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "未查询到物料数据:"+m.get("materialId").toString()); | 
|                 } | 
|                 wOutboundDetail.setNum(new BigDecimal(m.get("num").toString())); | 
|                 wOutboundDetail.setMaterialId(materialDistribute.getId()); | 
|                 wOutboundDetail.setUnitId(Integer.valueOf(m.get("unitId").toString())); | 
|                 if(StringUtils.isNotBlank(m.get("batch").toString())){ | 
|                     wOutboundDetail.setBatch(m.get("batch").toString()); | 
|                 } | 
|                 wOutboundDetail.setOutboundId(wOutbound.getId()); | 
|                 wOutboundDetail.setCreateTime(new Date()); | 
|                 wOutboundDetail.setCreateUser(loginUserInfo.getId()); | 
|                 wOutboundDetail.setRootDepartId(loginUserInfo.getRootDepartment().getId()); | 
|                 wOutboundDetail.setWarehouseId(wOutbound.getWarehouseId()); | 
|                 wOutboundDetail.setQualityType(Integer.valueOf(m.get("qualityType").toString())); | 
|                 if(StringUtils.isNotBlank(m.get("procedureId").toString())){ | 
|                     wOutboundDetail.setProcedureId(Integer.valueOf(m.get("procedureId").toString())); | 
|                 } | 
|                 wOutboundDetailMapper.insert(wOutboundDetail); | 
|             } | 
|         } | 
|   | 
|         //发送钉钉通知 | 
|         CompanyUser companyUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() | 
|                 .eq("USER_ID",warehouse.getManagerId()) | 
|                 .eq("ROOT_DEPART_ID",wOutbound.getRootDepartId()) | 
|                 .eq("DELETED",0) | 
|         ); | 
|         Constants.Notices_Type_Transfer notices_type_transfer = Constants.Notices_Type_Transfer.checkEnum(wOutboundInHeadBean.getType()); | 
|         if(Objects.isNull(notices_type_transfer)){ | 
|             throw new BusinessException(ResponseStatus.DEFECT_PARAMETER.getCode(), "单据操作类型错误!"); | 
|         } | 
|         String url = Constants.getNoticeUrl(loginUserInfo.getCompany(),Constants.DINGDING_NOTICE_URL.woutIn); | 
|         Notices notices = new Notices(); | 
|         notices.setCompanyUserId(companyUser.getId()); | 
|         notices.setType(notices_type_transfer.getNoticeInType()); | 
|         notices.setContent("【"+wOutbound.getCode()+"】"+ notices_type_transfer.getContent().replace("{optType}","入库")); | 
|         notices.setTitle(notices_type_transfer.getTitle()); | 
|         notices.setObjId(wOutbound.getId()); | 
|         notices.setUrl(url.replace("{id}",wOutbound.getId().toString())); | 
|         noticesExtService.sendNotice(notices); | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|     /********************************************************标准版本接口开始***************************************************************/ | 
|   | 
| //    @Override | 
|     @Transactional | 
|     public WOutboundRedisBean wOutBoundForInOutStandard(Integer id,Integer wOutboundType,Integer optType,String jsonBean){ | 
|         WOutboundRedisBean wOutboundRedisBean = new WOutboundRedisBean(); | 
|         if(!(wOutboundType==Constants.ONE||wOutboundType==Constants.ZERO)){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "操作单据类型错误"); | 
|         } | 
|         WOutbound wOutbound = wOutboundExtMapper.wOutboundById(id); | 
|         if(Objects.isNull(wOutbound)||wOutbound.getType()!=wOutboundType){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "未查询到对应类型单据"); | 
|         } | 
|         if(wOutbound.getStatus()!=Constants.ZERO){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "单据状态错误"); | 
|         } | 
|         List<WOutboundDetail> wOutboundDetailList = wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ZERO); | 
|         if(wOutbound.getType()==Constants.ZERO){ | 
|             for (WOutboundDetail wOutboundDetail:wOutboundDetailList) { | 
|                 QueryWStockDto queryWStockDto = new QueryWStockDto(); | 
|                 queryWStockDto.setRootDepartId(wOutboundDetail.getRootDepartId()); | 
|                 queryWStockDto.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                 queryWStockDto.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                 queryWStockDto.setLocationId(wOutboundDetail.getLocationId()); | 
|                 queryWStockDto.setUnitId(wOutboundDetail.getUnitId()); | 
|                 queryWStockDto.setBatch(wOutboundDetail.getBatch()); | 
|                 queryWStockDto.setQualityType(wOutboundDetail.getQualityType()); | 
|                 queryWStockDto.setProcedureId(wOutboundDetail.getProcedureId()); | 
|                 wOutboundDetail.setWStockExtListVOList(wStockExtMapper.stockListByDto(queryWStockDto)); | 
|             } | 
|             wOutbound.setWOutboundDetailsOut(wOutboundDetailExtMapper.wOutboundDetailListById(id,Constants.ONE)); | 
|         } | 
|   | 
|         List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList = new ArrayList<>(); | 
|         String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(),String.class); | 
|         List<WOutboundRedisCodeBean> redisWOutboundRedisCodeBeanList = JSON.parseArray(jsonArray,WOutboundRedisCodeBean.class); | 
|         if(!Objects.isNull(redisWOutboundRedisCodeBeanList)&&redisWOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|             //TODO 特殊处理 批次为null redis 转义后 变为“” | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:redisWOutboundRedisCodeBeanList) { | 
|                 if(StringUtils.isEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     wOutboundRedisCodeBean.setBatch(null); | 
|                 } | 
|                 if(Objects.isNull(wOutboundRedisCodeBean.getProcedureId())||wOutboundRedisCodeBean.getProcedureId()==Constants.ZERO){ | 
|                     wOutboundRedisCodeBean.setProcedureId(null); | 
|                 } | 
|             } | 
|             wOutboundRedisCodeBeanList.addAll(redisWOutboundRedisCodeBeanList); | 
|         } | 
|         if(!Objects.isNull(optType)){ | 
|             WOutboundRedisCodeBean codeBean =  JSON.parseObject(jsonBean,WOutboundRedisCodeBean.class); | 
|             if(StringUtils.isEmpty(codeBean.getBatch())){ | 
|                 codeBean.setBatch(null); | 
|             } | 
|             if(Objects.isNull(codeBean.getProcedureId())){ | 
|                 codeBean.setProcedureId(null); | 
|             } | 
| //            if(wOutboundType == Constants.ZERO && optType==Constants.ONE){ | 
| //                if(workorderRecordExtMapper.checkIsWork(codeBean.getAppliancesId().toString()).size()>Constants.ZERO){ | 
| //                    throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前篮筐处于投料中"); | 
| //                }; | 
| //            } | 
|             //2022-9-14 13:41:33 处理 添加验证篮筐属性与仓库属性 | 
|             Warehouse warehouse = warehouseMapper.selectById(wOutbound.getWarehouseId()); | 
|             //获取仓库属性 判断扫描篮筐数据属性 | 
|             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(optType==Constants.ONE){ | 
|                 this.checkDetailStandard(codeBean); | 
|             } | 
|             //TODO 更新数据 | 
|             this.updateRedisCodeStandard(wOutboundRedisCodeBeanList,optType,codeBean,wOutboundType); | 
|   | 
|         } | 
|         if(!Objects.isNull(wOutboundType)){ | 
|             //TODO 整理已扫描物料数据 | 
|             this.handleWOutboundOutCodeStandard(wOutboundRedisBean,wOutboundRedisCodeBeanList,false); | 
|         } | 
|         wOutboundRedisBean.setWOutbound(wOutbound); | 
|         wOutboundRedisBean.setWOutboundDetailsWait(wOutboundDetailList); | 
|         wOutboundRedisBean.setWOutboundRedisCodeBeanList(wOutboundRedisCodeBeanList); | 
|         wOutboundRedisBean.setWarehouse(warehouseMapper.selectById(wOutbound.getWarehouseId())); | 
|         if(!Objects.isNull(optType)){ | 
|             RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(), JSONArray.fromObject(wOutboundRedisCodeBeanList).toString()); | 
|         } | 
|   | 
| //        Constants.Notices_Type_Transfer notices_type_transfer = Constants.Notices_Type_Transfer.checkEnum(wOutbound.getBillType()); | 
| //        noticesExtService.dealNotice(wOutbound.getId(),notices_type_transfer.getNoticeInType(),null); | 
|         return wOutboundRedisBean; | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|     @Transactional | 
|     public void updateAppliancesStandard(List<WoScanMaterialBean>  woScanMaterialBeanList,Warehouse warehouse,Integer wOutboundType,LoginUserInfo loginUserInfo,Integer orgin){ | 
|         if(Objects.isNull(woScanMaterialBeanList)||woScanMaterialBeanList.size()==Constants.ZERO){ | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(), "无扫描数据,提交失败"); | 
|         } | 
|         for (WoScanMaterialBean woScanMaterialBean:woScanMaterialBeanList) { | 
|             List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList = woScanMaterialBean.getWOutboundRedisCodeBeanList(); | 
|             if(wOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|                 WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(woScanMaterialBean.getWOutboundDetailId()); | 
|                 for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                     Appliances appliances = appliancesMapper.selectById(wOutboundRedisCodeBean.getAppliancesId()); | 
|                     appliances.setCurObjId(wOutboundDetail.getOutboundId()); | 
|                     appliances.setCurObjType(Constants.ZERO); | 
|                     Integer outLocationId = Constants.ZERO ; | 
|                     if(wOutboundType==Constants.ZERO){ | 
|                         if(!Objects.isNull(appliances)){ | 
|                             if(warehouse.getUseLocation()==Constants.ONE) { | 
|                                 outLocationId = appliances.getLocationId(); | 
|                             } | 
|                             appliances.setWarehouseId(null); | 
|                             appliances.setLocationId(null); | 
|                         } | 
|                     }else if(wOutboundType==Constants.ONE){ | 
|                         appliances.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                         if(warehouse.getUseLocation()==Constants.ONE){ | 
|                             appliances.setLocationId(woScanMaterialBean.getLocationId()); | 
|                         } | 
|                     } | 
|                     WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord(appliances,loginUserInfo); | 
|                     if(warehouse.getUseLocation()==Constants.ONE){ | 
|                         //根据出入库类别 记录record表货位数据  入库由扫描货位来 出库由原工装器具数据来 | 
|                         if(wOutboundType==Constants.ZERO){ | 
|                             wOutboundRecord.setLocationId(outLocationId); | 
|                         }else{ | 
|                             wOutboundRecord.setLocationId(appliances.getLocationId()); | 
|                         } | 
|   | 
|                     } | 
|                     wOutboundRecordMapper.insert(wOutboundRecord); | 
|                     //手工创建出库单 要更新掉工装器具内所有数据 2022年10月27日11:04:22 | 
|                     if(wOutboundType==Constants.ZERO&&!Objects.isNull(orgin)&&Constants.ZERO == orgin){ | 
|                         appliances.setSerialNum(null); | 
|                         appliances.setStatus(Constants.ONE); | 
|                         appliances.setWorkorderId(null); | 
|                         appliances.setMaterialId(null); | 
|                         appliances.setNum(null); | 
|                         appliances.setPositionType(null); | 
|                         appliances.setProcedureId(null); | 
|                         appliances.setNextProcedureId(null); | 
|                         appliances.setCurObjId(null); | 
|                         appliances.setCurObjType(null); | 
|                         appliances.setBatch(null); | 
|                         appliances.setQualityType(null); | 
|                         appliances.setBackorderId(null); | 
|                         appliances.setSaleorderId(null); | 
|                         appliances.setBackProcedureId(null); | 
|                         appliances.setRelobjType(null); | 
|                     } | 
|                     if(!Objects.isNull(orgin)&&Constants.ZERO == orgin){ | 
|                         appliancesExtMapper.editById(appliances); | 
|                     }else{ | 
|                         appliancesMapper.updateById(appliances); | 
|                     } | 
|                 } | 
|                 wOutboundDetail.setDoneNum(woScanMaterialBean.getScanNum()); | 
|                 wOutboundDetail.setStatus(Constants.ONE); | 
|                 wOutboundDetail.setDoneDate(new Date()); | 
|                 wOutboundDetailMapper.updateById(wOutboundDetail); | 
|                 //记录库存变动记录 | 
|                 wStockRecordExtService.saveRecordNoLocationId(wOutboundType,wOutboundDetail.getId(),loginUserInfo,woScanMaterialBean.getLocationId()); | 
|                 this.updateStock(woScanMaterialBean,wOutboundDetail,warehouse,wOutboundType,loginUserInfo); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 更新库存信息 | 
|      * @param woScanMaterialBean | 
|      * @param wOutboundDetail | 
|      * @param loginUserInfo | 
|      */ | 
|     @Transactional | 
|     public void updateStockStandard(WoScanMaterialBean woScanMaterialBean,WOutboundDetail wOutboundDetail,Warehouse warehouse,Integer wOutboundType,LoginUserInfo loginUserInfo){ | 
|         //TODO 查询库存数据 | 
|         QueryWrapper wrapper = new QueryWrapper<WStock>(); | 
|         wrapper.eq("ROOT_DEPART_ID", wOutboundDetail.getRootDepartId()); | 
|         wrapper.eq("MATERIAL_ID", woScanMaterialBean.getMaterialId()); | 
|         wrapper.eq("WAREHOUSE_ID", wOutboundDetail.getWarehouseId()); | 
|         wrapper.eq("QUALITY_TYPE", wOutboundDetail.getQualityType()); | 
|         if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ | 
|             wrapper.eq("BATCH" , wOutboundDetail.getBatch()); | 
|         }else{ | 
|             wrapper.apply("BATCH is null "); | 
|         } | 
|         if(Objects.isNull(wOutboundDetail.getProcedureId())){ | 
|             wrapper.apply(" PROCEDURE_ID is null  "); | 
|         }else{ | 
|             wrapper.eq("PROCEDURE_ID" , wOutboundDetail.getProcedureId()); | 
|         } | 
|         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(wOutboundType==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(woScanMaterialBean.getScanNum()) < Constants.ZERO) { | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前货位库存数量不足;剩余数量【" + wStock.getNum() + "】;出库数量【" + woScanMaterialBean.getScanNum() + "】"); | 
|             } | 
|             wStock.setNum(wStock.getNum().subtract(woScanMaterialBean.getScanNum())); | 
|             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(wOutboundDetail.getRootDepartId()); | 
|                 newWStock.setWarehouseId(wOutboundDetail.getWarehouseId()); | 
|                 //此仓库 开启仓位 | 
|                 if(warehouse.getUseLocation()==Constants.ONE){ | 
|                     newWStock.setLocationId(woScanMaterialBean.getLocationId()); | 
|                 } | 
|                 newWStock.setMaterialId(wOutboundDetail.getMaterialId()); | 
|                 newWStock.setBatch(wOutboundDetail.getBatch()); | 
|                 newWStock.setUnitId(wOutboundDetail.getUnitId()); | 
|                 newWStock.setNum(woScanMaterialBean.getScanNum()); | 
|                 newWStock.setQualityType(wOutboundDetail.getQualityType()); | 
|                 newWStock.setProcedureId(wOutboundDetail.getProcedureId()); | 
|                 wStockMapper.insert(newWStock); | 
|             }else{ | 
|                 WStock wStock = wStockList.get(0); | 
|                 wStock.setNum(wStock.getNum().add(woScanMaterialBean.getScanNum())); | 
|                 wStockMapper.updateById(wStock); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|     public void handleWOutboundOutCodeStandard(WOutboundRedisBean wOutboundRedisBean,List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList,boolean isError){ | 
|         List<WoScanMaterialBean>  woScanMaterialBeanList = new ArrayList<>(); | 
|         if(!Objects.isNull(wOutboundRedisCodeBeanList)&&wOutboundRedisCodeBeanList.size()>Constants.ZERO){ | 
|             //获取仓库属性 判断扫描篮筐数据属性 | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                 //遍历已扫工装数据 | 
|                 if(woScanMaterialBeanList.size()==Constants.ZERO || !isRepeatMaterialDataStandard(woScanMaterialBeanList,wOutboundRedisCodeBean)){ | 
|                     woScanMaterialBeanList.add(wOutboundRedisCodeBean.toWoScanMaterialBean()); | 
|                 } | 
|             } | 
|             //TODO 已扫描物料数据 绑定已扫描条码 更新已扫描数量 | 
|             for (WoScanMaterialBean woScanMaterialBean:woScanMaterialBeanList) { | 
|                 BigDecimal scanNum = BigDecimal.ZERO; | 
|   | 
|                 List<WOutboundRedisCodeBean> wOutboundRedisCodeBeans = new ArrayList<>(); | 
|                 for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                     if(StringUtils.equals(woScanMaterialBean.getWOutboundDetailId().toString(),wOutboundRedisCodeBean.getWOutboundDetailId().toString()) | 
|                             &&StringUtils.equals(woScanMaterialBean.getMaterialId().toString(),wOutboundRedisCodeBean.getMaterialId().toString()) | 
| //                            &&StringUtils.equals(woScanMaterialBean.getLocationId().toString(),wOutboundRedisCodeBean.getLocationId().toString()) | 
|                             &&woScanMaterialBean.getQualityType().intValue() == wOutboundRedisCodeBean.getQualityType().intValue() | 
|                     ){ | 
|                         if(!Objects.equals(woScanMaterialBean.getLocationId(),wOutboundRedisCodeBean.getLocationId())){ | 
|                             continue; | 
|                         } | 
|                         //TODO 判断工序是否都不为空 | 
|                         if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                             if(!woScanMaterialBean.getProcedureId().equals(wOutboundRedisCodeBean.getProcedureId())){ | 
|                                 continue; | 
|                             } | 
|                         }else if(Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                             continue; | 
|                         }else if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                             continue; | 
|                         } | 
|                         //TODO 若批次为 null /“” 则不验证批次,否则验证 | 
|                         if(StringUtils.isNotEmpty(woScanMaterialBean.getBatch())&&StringUtils.equals(woScanMaterialBean.getBatch(),wOutboundRedisCodeBean.getBatch())){ | 
|                             wOutboundRedisCodeBeans.add(wOutboundRedisCodeBean); | 
|                             scanNum = scanNum.add(wOutboundRedisCodeBean.getNum()); | 
|                         }else if(StringUtils.isEmpty(woScanMaterialBean.getBatch())){ | 
|                             wOutboundRedisCodeBeans.add(wOutboundRedisCodeBean); | 
|                             scanNum = scanNum.add(wOutboundRedisCodeBean.getNum()); | 
|                         } | 
|                     } | 
|                 } | 
|                 if(isError){ | 
|                     WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(woScanMaterialBean.getWOutboundDetailId()); | 
|   | 
|                     if( scanNum.compareTo(wOutboundDetail.getNum())>0){ | 
|                         throw new BusinessException(ResponseStatus.EXCEED_PLAN_NUM.getCode(), "超出计划数量,扫描失败"); | 
|                     } | 
|   | 
|                 } | 
|                 woScanMaterialBean.setWOutboundRedisCodeBeanList(wOutboundRedisCodeBeans); | 
|                 woScanMaterialBean.setScanNum(scanNum); | 
|             } | 
|             wOutboundRedisBean.setWoScanMaterialBeanList(woScanMaterialBeanList); | 
|         } | 
|     } | 
|   | 
|     private boolean isRepeatMaterialDataStandard(List<WoScanMaterialBean> woScanMaterialBeanList, WOutboundRedisCodeBean wOutboundRedisCodeBean) { | 
|         //TODO 物料/批次/货位是否相同 相同则跳过,否则加入数据 | 
|         for (WoScanMaterialBean woScanMaterialBean:woScanMaterialBeanList) { | 
|             if(StringUtils.equals(woScanMaterialBean.getWOutboundDetailId().toString(),wOutboundRedisCodeBean.getWOutboundDetailId().toString()) | 
|                     &&StringUtils.equals(woScanMaterialBean.getMaterialId().toString(),wOutboundRedisCodeBean.getMaterialId().toString()) | 
|                     &&StringUtils.equals(woScanMaterialBean.getLocationId().toString(),wOutboundRedisCodeBean.getLocationId().toString()) | 
|                     &&Constants.equalsInteger(woScanMaterialBean.getQualityType(),wOutboundRedisCodeBean.getQualityType()) | 
|             ) { | 
|                 // 物料/批次/货位相同 | 
|                 //TODO 判断工序是否都不为空 | 
|                 if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId()) && !Constants.equalsInteger(woScanMaterialBean.getProcedureId(),(wOutboundRedisCodeBean.getProcedureId()))){ | 
|                     return false; | 
|                 }else if(Objects.isNull(woScanMaterialBean.getProcedureId())&&!Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                     return false; | 
|                 }else if(!Objects.isNull(woScanMaterialBean.getProcedureId())&&Objects.isNull(wOutboundRedisCodeBean.getProcedureId())){ | 
|                     return false; | 
|                 } | 
|                 //TODO 若批次为 null /“” 则不验证批次,否则验证 | 
|                 if(StringUtils.isNotEmpty(woScanMaterialBean.getBatch())&&!StringUtils.equals(woScanMaterialBean.getBatch(),wOutboundRedisCodeBean.getBatch())){ | 
|                     return false; | 
|                 }else if(StringUtils.isNotEmpty(woScanMaterialBean.getBatch()) && StringUtils.isEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     return false; | 
|                 }else if(StringUtils.isEmpty(woScanMaterialBean.getBatch()) && StringUtils.isNotEmpty(wOutboundRedisCodeBean.getBatch())){ | 
|                     return false; | 
|                 } | 
|                 return true; | 
|             } | 
|   | 
|         } | 
|         return false; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 更新条码列表 | 
|      * @param wOutboundRedisCodeBeanList 所有条码列表 | 
|      * @param optType 1:添加;2:删除 | 
|      * @param codeBean 工装器具 | 
|      */ | 
|     @Transactional | 
|     public void updateRedisCodeStandard(List<WOutboundRedisCodeBean> wOutboundRedisCodeBeanList,Integer optType,WOutboundRedisCodeBean codeBean,Integer wOutboundType){ | 
|         if(Objects.isNull(optType)|| (optType!=Constants.ONE&&optType!=Constants.TWO)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "更新操作类别异常"); | 
|         }if(optType==Constants.ONE){ | 
|             // 校验 工装器具数据是否已扫描 | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                 if(StringUtils.equals(wOutboundRedisCodeBean.getAppliancesId().toString(),codeBean.getAppliancesId().toString())){ | 
|                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "工装器具数据已扫描,无法重复扫描"); | 
|                 } | 
|                 //判断条码是是否在当前单据中 | 
|                 WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(codeBean.getWOutboundDetailId()); | 
|                 if(StringUtils.equals(wOutboundDetail.getMaterialId().toString(),codeBean.getMaterialId().toString()) | 
|                         &&StringUtils.equals(wOutboundDetail.getWarehouseId().toString(),codeBean.getWarehouseId().toString())){ | 
|   | 
|                     if(!Objects.isNull(wOutboundDetail.getProcedureId())&&!Objects.isNull( codeBean.getProcedureId())){ | 
|                         if(!wOutboundDetail.getProcedureId().equals(codeBean.getProcedureId())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); | 
|                         } | 
|                     }else if(Objects.isNull(wOutboundDetail.getProcedureId())&&!Objects.isNull( codeBean.getProcedureId())){ | 
|                         throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); | 
|                     }else if(!Objects.isNull(wOutboundDetail.getProcedureId())&&Objects.isNull( codeBean.getProcedureId())){ | 
|                         throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据工序数据不匹配"); | 
|                     } | 
|                     if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ | 
|                         if(!wOutboundDetail.getBatch().equals(codeBean.getBatch())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据批次不匹配"); | 
|                         } | 
|                     } | 
|                     if(StringUtils.isNotBlank(wOutboundDetail.getBatch())){ | 
|                         if(!wOutboundDetail.getBatch().equals(codeBean.getBatch())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据批次不匹配"); | 
|                         } | 
|                     } | 
|                     if(!Objects.isNull(wOutboundDetail.getLocationId())){ | 
|                         if(!Objects.equals(wOutboundDetail.getLocationId(),codeBean.getLocationId())){ | 
|                             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据货位不匹配"); | 
|                         } | 
|                     } | 
|                 }else{ | 
|                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "添加条码数据不匹配"); | 
|                 } | 
|             } | 
|             wOutboundRedisCodeBeanList.add(codeBean); | 
|         }else if(optType==Constants.TWO){ | 
|             //TODO 是否在当前单据数据内 | 
|             Boolean isHave = true; | 
|             for (WOutboundRedisCodeBean wOutboundRedisCodeBean:wOutboundRedisCodeBeanList) { | 
|                 if (StringUtils.equals(wOutboundRedisCodeBean.getAppliancesId().toString(), codeBean.getAppliancesId().toString())) { | 
|                     wOutboundRedisCodeBeanList.remove(wOutboundRedisCodeBean); | 
|                     isHave = false; | 
|                     break; | 
|                 } | 
|             } | 
|             if(isHave){ | 
|                 throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "扫描条码未存在当前单据内"); | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|     public void checkDetailStandard(WOutboundRedisCodeBean codeBean){ | 
|         WOutboundDetail wOutboundDetail = wOutboundDetailMapper.selectById(codeBean.getWOutboundDetailId()); | 
|         if(Objects.isNull(wOutboundDetail)){ | 
|             throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到出库明细信息"); | 
|         } | 
|         if(!Objects.equals(codeBean.getWarehouseId(),wOutboundDetail.getWarehouseId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "仓库信息不匹配"); | 
|         } | 
|         if(!Objects.isNull(wOutboundDetail.getLocationId())&&!Objects.equals(codeBean.getLocationId(),wOutboundDetail.getLocationId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "仓位信息信息不匹配"); | 
|         } | 
|         if(!Objects.equals(codeBean.getMaterialId(),wOutboundDetail.getMaterialId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料信息信息不匹配"); | 
|         } | 
|         if(!Objects.isNull(wOutboundDetail.getBatch())&&!Objects.equals(codeBean.getBatch(),wOutboundDetail.getBatch())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料批次信息不匹配"); | 
|         } | 
|         if(!Objects.equals(codeBean.getQualityType(),wOutboundDetail.getQualityType())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料质量属性信息不匹配"); | 
|         } | 
|         if(!Objects.isNull(wOutboundDetail.getProcedureId())&&!Objects.equals(codeBean.getProcedureId(),wOutboundDetail.getProcedureId())){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "物料工序信息不匹配"); | 
|         } | 
|     } | 
|   | 
|   | 
|     /********************************************************标准版本接口结束***************************************************************/ | 
| } |