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 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 deleteWrapper = new UpdateWrapper<>(wOutbound); wOutboundMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } wOutboundMapper.deleteBatchIds(ids); } @Override public void updateById(WOutbound wOutbound) { wOutboundMapper.updateById(wOutbound); } @Override public void updateByIdInBatch(List 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 wrapper = new QueryWrapper<>(wOutbound); return wOutboundMapper.selectOne(wrapper); } @Override public List findList(WOutbound wOutbound) { QueryWrapper wrapper = new QueryWrapper<>(wOutbound); return wOutboundMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper 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 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 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() .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 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 wStockList = wStockMapper.selectList(new QueryWrapper() .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 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 adjustmentRecords = adjustmentRecordMapper.selectList(new QueryWrapper().eq("OUTBOUND_ID",id)); if(!Objects.isNull(adjustmentRecords)&&adjustmentRecords.size()>0){ for (AdjustmentRecord adjustmentRecord:adjustmentRecords) { Appliances appliances = appliancesMapper.selectById(adjustmentRecord.getAppliancesId()); LambdaUpdateWrapper 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 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 wTransferOutWarehouses = wTransferDetailExtMapper.wTransferOutWarehouseListById(id); //获取明细所有物料信息 并获取库存仓位信息 List 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 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 getInByWTransferId(Integer id){ WTransfer wTransfer = wTransferExtMapper.wTransferById(id); if(Objects.isNull(wTransfer)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "未查询到转库单对象信息"); } //获取明细所有仓库信息(分组) List wTransferInWarehouses = wTransferDetailExtMapper.wTransferInWarehouseListById(id); //获取明细所有物料信息 List wTransferDetailList = wTransferDetailExtMapper.wTransferDetailListById(id); //物料信息根据仓库信息 添加至各个仓库下 返回 wTransferInWarehouses.forEach(i->{ List 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 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() .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() .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() .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() .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() .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() .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() .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 wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); } wOutBoundOutWarehouseList.forEach(wOutBoundOutWarehouse-> { //明细行项目信息 List 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())(); 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 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 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() .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 wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); } for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { List wOutBoundOutDetailBeanList = wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); wOutBoundOutDetailBeanList.forEach(i->{ WOutboundDetail wOutboundDetail = wOutboundDetailExtMapper.selectById(i.getId()); //更新出库单明细 实际出库数量 if(wOutboundDetail.getStatus() == Constants.ZERO){ updWOutBoundDetail(wOutBoundOutDetailBeanList,wOutboundDetail); } //使用篮筐数据 List 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 wStockList = wStockMapper.selectList(new QueryWrapper() .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 wTransferDetailList = wTransferDetailMapper.selectList( new QueryWrapper().eq("TRANSFER_ID",wTransfer.getId()) ); if(wOutBoundOutBean.getBillType()==Constants.ONE&&wTransfer.getStatus()==Constants.ZERO){ //更新转库单明细已出库数量 wTransferDetailList.forEach(i->{ BigDecimal outNum = BigDecimal.ZERO; List wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { List 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 wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { List 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 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 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 outScanBarcodeBeanList,WOutboundDetail wOutboundDetail,LoginUserInfo loginUserInfo){ List 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 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() // .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 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 wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); } wOutBoundOutWarehouseList.forEach(wOutBoundOutWarehouse-> { //明细行项目信息 List 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()) 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(); 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 wOutBoundOutWarehouseList = wOutBoundOutBean.getWOutBoundOutWarehouseList(); if(wOutBoundOutWarehouseList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "无行数据,请检查数据信息"); } for (WOutBoundOutWarehouse wOutBoundOutWarehouse:wOutBoundOutWarehouseList) { List wOutBoundOutDetailBeanList = wOutBoundOutWarehouse.getWOutBoundOutDetailBeanList(); wOutBoundOutDetailBeanList.forEach(i->{ WOutboundDetail wOutboundDetail = wOutboundDetailExtMapper.selectById(i.getId()); //更新入库单明细 实际入库数量 if(wOutboundDetail.getStatus() == Constants.ZERO){ updWOutBoundDetail(wOutBoundOutDetailBeanList,wOutboundDetail); } //使用篮筐数据 List 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() .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 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 wOutboundRedisCodeBeanList = new ArrayList<>(); String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(),String.class); List 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 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 wOutboundRedisCodeBeanList = new ArrayList<>(); String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(),String.class); List redisWOutboundRedisCodeBeanList = JSON.parseArray(jsonArray,WOutboundRedisCodeBean.class); //2022年9月26日11:23:29 加入 验证所有篮筐必须处于未投料状态 所有篮筐必须与出库单据仓库一致 if(wOutboundType==Constants.ZERO){ List idList = redisWOutboundRedisCodeBeanList.stream().map(x -> x.getAppliancesId().toString()).collect(Collectors.toList()); String ids = StringUtils.join(idList.toArray(), ","); List workorderRecordExtListVOList = workorderRecordExtMapper.checkIsWork(ids); if(workorderRecordExtListVOList.size()>Constants.ZERO){ List 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 detailList = wOutboundDetailMapper.selectList(new QueryWrapper().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 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 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(); 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 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 wOutboundRedisCodeBeanList,boolean isError){ List 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 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 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 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 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 wOutboundInBodyBeanList = wOutboundInHeadBean.getWOutboundInBodyBeanList(); //整理数据过滤 相同属性数据合并后 进行数据写入 Map> wOutboundInBodyBeanMap = wOutboundInBodyBeanList.stream() .collect(Collectors.groupingBy(i -> this.sub(i))); Iterator iter = wOutboundInBodyBeanMap.keySet().iterator(); while(iter.hasNext()) { String key = iter.next(); //获取当前行处理数据 List wOutboundInBodyBeans = wOutboundInBodyBeanMap.get(key); WOutboundInBodyBean wOutboundInBodyBean = wOutboundInBodyBeans.get(Constants.ZERO); //累计入库数量 wOutboundInBodyBean.setNum(wOutboundInBodyBeans.stream().map(s -> s.getNum()).reduce(BigDecimal.ZERO, BigDecimal::add)); 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(); 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> mapList = new ArrayList<>(); List 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 bomList = bomMapper.selectList(new QueryWrapper().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().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() .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 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 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 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() .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 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 wOutboundRedisCodeBeanList = new ArrayList<>(); String jsonArray = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_WOUTBOUND_KEY+wOutbound.getId(),String.class); List 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 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 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(); 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 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 wOutboundRedisCodeBeanList,boolean isError){ List 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 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 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 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(), "物料工序信息不匹配"); } } /********************************************************标准版本接口结束***************************************************************/ }