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