package doumeemes.service.ext.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import doumeemes.biz.system.SystemDictDataBiz; import doumeemes.core.annotation.excel.ExcelExporter; import doumeemes.core.constants.ResponseStatus; import doumeemes.core.exception.BusinessException; 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.redis.RedisUtil; import doumeemes.dao.business.BackOrderDetailMapper; import doumeemes.dao.business.BackorderMapper; import doumeemes.dao.business.dto.CreateMaterialDTO; import doumeemes.dao.business.dto.DealWorkorderRecordDTO; import doumeemes.dao.business.dto.MaterialListDTO; import doumeemes.dao.business.model.*; import doumeemes.dao.ext.*; import doumeemes.dao.ext.bean.EndCheckApBean; import doumeemes.dao.ext.beanDto.QueryWStockDto; import doumeemes.dao.ext.dto.*; import doumeemes.dao.ext.vo.*; import doumeemes.dao.system.model.SystemDictData; import doumeemes.service.business.WOutboundService; import doumeemes.service.ext.*; import doumeemes.service.system.SystemDictDataService; 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 javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * 工单生产过程记录Service实现 * @author 江蹄蹄 * @date 2022/04/20 10:56 */ @Service public class WorkorderRecordStandardServiceImpl implements WorkorderRecordStandardService { @Autowired private WorkorderExtMapper workorderExtMapper; @Autowired private BomExtMapper bomExtMapper; @Autowired private RouteProcedureExtMapper routeProcedureExtMapper; @Autowired private BomDetailExtMapper bomDetailExtMapper; @Autowired private WorkorderRecordExtMapper workorderRecordExtMapper; @Autowired private WorkorderHistoryExtMapper workorderHistoryExtMapper; @Autowired private WStockExtMapper wStockExtMapper; @Autowired private WOutboundDetailExtMapper wOutboundDetailExtMapper; @Autowired private WOutboundService wOutboundService; @Autowired private WStockRecordExtService wStockRecordExtService; @Autowired private WOutboundRecordExtMapper wOutboundRecordExtMapper; @Autowired private MaterialExtMapper materialExtMapper; @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public Integer createMaterialStandard(CreateMaterialDTO param) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } //查询并验证工单信息 Workorder mp = getOrderAndValid(user,param.getId()); //查询全部bom组成数据,如果有BOM配置,按照BOM组成进行投料,如果没有BOM配置,则投料物料为待生产库位的物料本身 QueryBomDetailExtDTO bdparam = initBomParam(user,mp); if(mp.getBomModel()!=null&&Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.pull)){ //如果是拉式投料,系统根据BOM自动扣减库存,不需要手动投料 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该物料投料方式是扣减库存,无需主动投料!"); } //带批量插入投料记录集合 List recordList = new ArrayList<>(); if(Constants.equalsInteger(mp.getType(),Constants.WORKORDER_TYPE.normal)){ //如果是正常单 List bomDetailList = null; //如果有bom配置 if(bdparam!=null){ bomDetailList = bomDetailExtMapper.selectList(bdparam); } for(MaterialListDTO materialListDTO : param.getRecordList()){ //查询工单下 是否已存在该库存记录的使用记录 if(workorderRecordExtMapper.selectList(new QueryWrapper().eq("DELETED",Constants.ZERO) .eq("WORKORDER_ID",param.getId()).eq("APPLIANCES_ID",materialListDTO.getWStockId())).size()>Constants.ZERO){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前库存已投料,请修改记录数据!"); }; WStock wStock = wStockExtMapper.selectById(materialListDTO.getWStockId()); if(materialListDTO.getNum().compareTo(BigDecimal.ZERO)>Constants.ZERO){ if(bdparam!=null) { //如果有bom配置,按bom进行投料 //判断器具装载物料数量是否满足提交条件 isValideApplianceNum(wStock,materialListDTO.getNum(),mp,bomDetailList); }else { //如果没有bom配置,投生产物料本身 //判断器具装载物料数量是否满足提交条件 isValideApplianceNum(materialListDTO.getNum(),user,wStock,mp); } }else{ if(!wStock.getMaterialId().equals(mp.getMaterialId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,提交物料非BOM组成物料!"); } } //初始化投料记录对象 recordList.add(getWorkrecordModel(user,wStock,mp,materialListDTO.getNum())); } }else{ //如果是返工返修申请 if(mp.getBackorderId() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单关联返修申请信息有误,请联系管理员!"); } for(MaterialListDTO materialListDTO : param.getRecordList()){ WStock wStock = wStockExtMapper.selectById(materialListDTO.getWStockId()); if(!wStock.getMaterialId().equals(mp.getMaterialId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,提交物料非BOM组成物料!"); } recordList.add(getWorkrecordModel(user,wStock,mp,materialListDTO.getNum())); } } //批量插入投料记录 workorderRecordExtMapper.insertBatch(recordList); //单添加历史记录(不更新状态) updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.material); return param.getId(); } private BigDecimal getNumFromParam(Integer id, List apList) { for(MaterialListDTO l : apList){ if(Constants.equalsInteger(id,l.getApplianceId())){ return l.getNum(); } } return BigDecimal.ZERO; } private Workorder getOrderAndValid(LoginUserInfo user, Integer id) throws BusinessException{ if(id== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!"); } Workorder mp = new Workorder(); mp.setDeleted(Constants.ZERO); mp.setId(id); mp.setRootDepartId(user.getRootDepartment().getId()); mp = workorderExtMapper.selectOne(mp); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); } if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!"); } if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create) && !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material) && !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.check) && !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.done)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!"); } return mp; } private QueryBomDetailExtDTO initBomParam(LoginUserInfo user, Workorder mp) throws BusinessException{ QueryBomExtDTO bb = new QueryBomExtDTO(); bb.setDepartId(mp.getDepartId()); bb.setDeleted(Constants.ZERO); bb.setRootDepartId(user.getRootDepartment().getId()); bb.setMaterialId(mp.getMaterialId()); bb.setProcedureId(mp.getProcedureId()); BomExtListVO versionBom = bomExtMapper.selectByModel( bb); if(versionBom == null || StringUtils.isBlank(versionBom.getVersion()) || versionBom.getBomVersionId() == null){ return null; // throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该工单物料BOM信息配置有误,请联系管理员!"); } mp.setBomModel(versionBom); QueryBomDetailExtDTO bom = new QueryBomDetailExtDTO(); bom.setDeleted(Constants.ZERO); bom.setBomId(versionBom.getBomVersionId()); // bom.setProcedureId(mp.getProcedureId()); bom.setWorkorderId(mp.getId()); return bom; } private void isValideApplianceNum(WStock wStock ,BigDecimal useNum,Workorder mp, List bomDetailList) throws BusinessException { if(wStock.getNum().compareTo(useNum)<0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,提交物料大于库存数量!"); } //获取该物料的组成部分 BomDetailExtListVO detial =getBomMaterial(wStock.getMaterialId(),bomDetailList); if(detial == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,提交物料非BOM组成物料!"); } if(!Constants.equalsInteger(wStock.getLocationId(),mp.getProduceWarehouseLocationId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,物料信息必须来自工单待生产机台货位!"); } } /** * 如果没有bom配置 直接投自己,只能从工单上设备关联的待生产机台货位投料 * @param user * @param wStock * @param mp */ private void isValideApplianceNum(BigDecimal pNum,LoginUserInfo user,WStock wStock, Workorder mp) { // BarcodeParamExtListVO barCode = barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),amodel.getBrcode()); // String pName =barCode==null? "":barCode.getPrefix(); if(pNum.compareTo(BigDecimal.ZERO)==0 || pNum.compareTo(Constants.formatBigdecimal(wStock.getNum()))>0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,提交数据不合法,投料数量大于库存数量!"); } if(!Constants.equalsInteger(wStock.getMaterialId(),mp.getMaterialId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,投料选择库存记录装载物料信息不符合工单投料要求!"); } if(!Constants.equalsInteger(wStock.getLocationId(),mp.getProduceWarehouseLocationId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,装载物料信息必须来自工单待生产机台货位!"); } } private BomDetailExtListVO getBomMaterial(Integer materialId, List bomDetailList) { for(BomDetailExtListVO d : bomDetailList){ if(Constants.equalsInteger(materialId,d.getMaterialId())){ return d; } } return null; } private WorkorderRecord getWorkrecordModel(LoginUserInfo user, WStock wStock, Workorder mp,BigDecimal pNum) { WorkorderRecord wrModel = new WorkorderRecord(); wrModel.setWorkorderId(mp.getId()); wrModel.setDeleted(Constants.ZERO); wrModel.setRootDepartId(mp.getRootDepartId()); wrModel.setMaterialId(wStock.getMaterialId()); wrModel.setDepartId(mp.getDepartId()); wrModel.setCreateTime(DateUtil.getCurrentDate()); wrModel.setCreateUser(user.getId()); wrModel.setMaterialBatch(mp.getBatch()); wrModel.setType(Constants.WORKORDER_RECORD_TYPE.materail); wrModel.setFactoryId(mp.getFactoryId()); wrModel.setProcedureId(mp.getProcedureId()); wrModel.setBatch(mp.getBatch()); wrModel.setUnitId(mp.getUnitId()); wrModel.setPlanId(mp.getPlanId()); //TODO 目前使用工装主键存储货位主键 wrModel.setAppliancesId(wStock.getId()); wrModel.setMaterialDonetype(wStock.getQualityType()); wrModel.setMaterialProcedureId(wStock.getProcedureId()); wrModel.setNum(pNum); wrModel.setRelobjType(Constants.ZERO); wrModel.setRelobjId(mp.getId()); return wrModel; } private void updateOrderInfo(LoginUserInfo user, Workorder mp,int status) { List whList = new ArrayList<>(); //工单历史数据 Workorder order = new Workorder(); order.setId(mp.getId()); order.setUpdateTime(DateUtil.getCurrentDate()); order.setUpdateUser(user.getId()); order.setRootDepartId(mp.getRootDepartId()); order.setDepartId(mp.getDepartId()); whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),status)); if(status == Constants.WORKORDER_HISTORY_STATUS.baogong){ order.setStatus(Constants.WORKORDER_STATUS.baogong); order.setQualifiedNum(mp.getQualifiedNum()); order.setUnqualifiedNum(mp.getUnqualifiedNum()); }else if(status ==Constants.WORKORDER_HISTORY_STATUS.readyMaterial){ order.setStatus(Constants.WORKORDER_STATUS.material); }else if(status ==Constants.WORKORDER_HISTORY_STATUS.done){ order.setStatus(Constants.WORKORDER_STATUS.done); } workorderExtMapper.updateById(order); workorderHistoryExtMapper.insertBatch(whList); } @Override public List findAllForStandard(QueryWorkorderRecordExtDTO pageWrap) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } pageWrap.setDeleted(Constants.ZERO); //只能查看当前根组织的数据 pageWrap.setRootDepartId(user.getRootDepartment().getId()); List result = workorderRecordExtMapper.choiceWorkorderRecordUseStockList(pageWrap); return result; } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public Integer comfirmDone(Workorder param){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(param.getId()== null ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!"); } Workorder mp = new Workorder(); mp.setDeleted(Constants.ZERO); mp.setId(param.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = workorderExtMapper.selectOne(mp); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); } /* Plans plans = new Plans(); plans.setId(mp.getPlanId()); //查询计划已报工数量 plans = plansExtMapper.selectOne(new QueryWrapper<>(plans).select("(select sum(workorders.plan_num) from workorders where workorders.plan_id=plans.id and workorders.deleted=0 and workorders.status="+Constants.WORKORDER_STATUS.baogong+") as baogongNum").last(" limit 1")); */ param.setPlanId(mp.getPlanId()); if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!"); } //如果需要完工检才能检验 if(Constants.equalsInteger(mp.getNeedcheck(),Constants.ZERO)){ //只有已完工状态才能确认报工 if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.done)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!"); } } // //出入库记录集合 // List outboundList = new ArrayList<>(); // //出入库明细记录集合 List outboundDetailList = new ArrayList<>(); //待更新工装集合投料 List updateApplianceList = new ArrayList<>(); //待更新工装集合产出 List updateApplianceProList = new ArrayList<>(); //待更新库存集合 List stockList = new ArrayList<>(); //查询投料和报工记录列表 List allRecordList = workorderRecordExtMapper.selectAllList(getQueryRecordParam(param)); if(Objects.isNull(allRecordList)||allRecordList.size()==Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未查询投料和报工记录!"); } //检查数据信息 // caculateCheckRecord(user, mp,allRecordList); QueryBomDetailExtDTO bdparam = initBomParam(user,mp); if(mp.getBomModel()!=null&&Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.pull)){ //如果是拉式投料,系统根据BOM自动扣减库存 dealApplianceMateialPull(mp,user,bdparam,updateApplianceList, stockList); } if(allRecordList!=null && allRecordList.size()>0){ if(mp.getBomModel()==null||Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.push)){ //如果是推式投料,走正常生产手动投料 dealApplianceMateial(mp,user,bdparam,allRecordList,updateApplianceList, outboundDetailList,stockList); } //处理产出数据 dealAppliancePro(mp,user,allRecordList,updateApplianceList,updateApplianceProList, outboundDetailList,stockList); } if(1==1){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"123"); } //如果有没bom配置,检查产出(包含检验的不良和报废品)和投料数量是否相等匹配,不一致提示错误 if(bdparam==null){ //投料数量 和 产出数量不相等 if(Constants.formatBigdecimal(mp.getHasMaterialNum()).intValue() != Constants.formatIntegerNum(mp.getHasProduceNum())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单投料和产出数量不一致,请确认后重试!"); } } //更新工单状态为已报工 updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.baogong); /*if(updateApplianceList!=null && updateApplianceList.size()>0){ //遍历更新工装器具信息 for(Appliances a : updateApplianceList){ appliancesExtMapper.updateById(a); } }*/ //更新工装本身状态数据,以产出报工的工装状态为主,如果既有投料 也有产出的工单,以产出的状态为主进行更新 // updateApplianceList(updateApplianceList,updateApplianceProList); //批量插入出入库明细记录 if(outboundDetailList!=null && outboundDetailList.size()>0){ wOutboundDetailExtMapper.insertBatch(outboundDetailList); } if(stockList != null && stockList.size()>0){ for(WStock s : stockList){ WStock s1 = new WStock(); s1.setLocationId(s.getLocationId()); s1.setWarehouseId(s.getWarehouseId()); s1.setDeleted(Constants.ZERO); s1.setMaterialId(s.getMaterialId()); s1.setQualityType(s.getQualityType()); s1.setProcedureId(s.getProcedureId()); if(StringUtils.isBlank(s.getBatch() )){ s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1).isNull("batch").last(" limit 1")); }else{ s1.setBatch(s.getBatch()); s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1).last(" limit 1")); } if(s1 ==null){ //如果库存记录不存在,插入数据 s.setDeleted(Constants.ZERO); s.setCreateTime(DateUtil.getCurrentDate()); s.setCreateUser(user.getId()); s.setRootDepartId(mp.getRootDepartId()); if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){ //如果库存不足 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,仓库余料不足,请联系仓库管理员!"); } wStockExtMapper.insert(s); }else{ //如果库存记录存在,则更新库存量 s.setId(s1.getId()); s.setUpdateTime(DateUtil.getCurrentDate()); s.setUpdateUser(user.getId()); s.setNum(Constants.formatBigdecimal(s1.getNum()).add(Constants.formatBigdecimal(s.getNum()))); if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){ //如果库存不足 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,仓库余料不足,请联系仓库管理员!!"); } wStockExtMapper.updateById(s); } } } // if(1==1){ // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起!"); // } return param.getId(); } private QueryWorkorderRecordExtDTO getQueryRecordParam(Workorder param) { QueryWorkorderRecordExtDTO mParam = new QueryWorkorderRecordExtDTO(); mParam.setWorkorderId(param.getId()); mParam.setDeleted(Constants.ZERO); return mParam; } private void dealApplianceMateialPull(Workorder mp , LoginUserInfo user ,QueryBomDetailExtDTO bdparam , List updateApplianceList ,List stockList) { //记录需要投料的物料和数量 List tempIds = new ArrayList<>(); List materialList = new ArrayList<>(); //如果有bom配置,查询全部bom组成,进行库存投料 if(bdparam!=null){ List bomDetailList = bomDetailExtMapper.selectList(bdparam); if(bomDetailList == null || bomDetailList.size()==0){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该生产物料的bom配置有误,请联系管理员!"); } for(BomDetailExtListVO d : bomDetailList){ //安装物料组成 乘以 生产量,拉式扣减的BOM每行物料数量=产出产品数量×BOM每行物料使用数量; BigDecimal num = Constants.formatBigdecimal(d.getNum()).multiply(new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum()))); materialList.add(initMaterialNum(d.getMaterialId(),num)); tempIds.add(Constants.formatIntegerNum( d.getMaterialId())); } }else{ //投料为自己,1:1投生产物料 materialList.add(initMaterialNum(mp.getMaterialId(),new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum())))); tempIds.add(Constants.formatIntegerNum( mp.getMaterialId())); } //根据物料、质量属性(合格)去库存余额,并进行扣减,如果有多条库存余量则按创建时间顺序(正序)扣减;单条余额不够,支持扣多条余额数据;如果存在多仓库扣减,则产生多个出库单; WStock sparam = new WStock(); sparam.setDeleted(Constants.ZERO); sparam.setQualityType(Constants.QUALITIY_TYPE.normal); sparam.setRootDepartId(mp.getRootDepartId()); //限制只从工单关联设备配置的待生产货位进行投料扣除 sparam.setWarehouseId(mp.getProduceWarehouseId()); sparam.setLocationId(mp.getProduceWarehouseLocationId()); //查询所有合格的符合物料需要的库存记录,按创建时间正序,库存量>0。 List allList = wStockExtMapper.selectList(new QueryWrapper<>(sparam) .isNull(mp.getProduceWarehouseLocationId()== null,"LOCATION_ID" ) .in("MATERIAL_ID",tempIds).gt("NUM",new BigDecimal(0)).orderByAsc("CREATE_TIME")); if(allList!=null && allList.size()>0){ List outboundList = new ArrayList<>(); //如果需要投料的物料集合,在库存中寻找投料来源 for(WStock model : materialList){ for(WStock ts : allList){ if(Constants.equalsInteger(model.getMaterialId(),ts.getMaterialId())){ //还需要投料数量 BigDecimal actNum = Constants.formatBigdecimal(model.getNum()).subtract(Constants.formatBigdecimal(model.getTNum())); if(actNum.compareTo(new BigDecimal(0))==0){ //如果已经投料完全,直接跳出 break; } boolean isfull =false; if(actNum.compareTo(Constants.formatBigdecimal(ts.getNum())) ==1 ){ //如果当前库存不能满足剩余需求量,有多少投多少 actNum = Constants.formatBigdecimal(ts.getNum()); }else{ //如果已经满足剩余需求量 isfull =true; } //更新已经投料数量 model.setTNum(Constants.formatBigdecimal(model.getTNum()).add(actNum)); WOutbound outbound = getFromOutboundList(ts.getWarehouseId(),outboundList); if(outbound==null){ outbound = new WOutbound(); outbound.setDeleted(Constants.ZERO); outbound.setCreateTime(DateUtil.getCurrentDate()); outbound.setDealDate(outbound.getCreateTime()); outbound.setValidDate(outbound.getCreateTime()); outbound.setCreateUser(user.getId()); outbound.setRootDepartId(mp.getRootDepartId()); outbound.setDepartId(mp.getDepartId()); outbound.setStatus(Constants.WOUTBOUND_STATUS.dealed); outbound.setType(Constants.WOUTBOUND_TYPE.out); //2022年7月1日14:42:41 加入单据类别 outbound.setBillType(Constants.WOUTBOUND_BILLTYPE.workerOrderOut); outbound.setCode(wOutboundService.getNextOutCode(user.getCompany().getId())); outbound.setOrigin(Constants.ONE); outbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.produce); outbound.setOriginCode(mp.getCode()); outbound.setOriginId(mp.getId()); outbound.setPlanDate(DateUtil.getCurrentDate()); outbound.setUserId(user.getId()); outbound.setWarehouseId(ts.getWarehouseId()); wOutboundService.create(outbound); outboundList.add(outbound); } WOutboundDetail detail = new WOutboundDetail(); detail.setDeleted(Constants.ZERO); detail.setCreateTime(DateUtil.getCurrentDate()); detail.setCreateUser(user.getId()); detail.setRootDepartId(mp.getRootDepartId()); detail.setOutboundId(outbound.getId()); detail.setBatch(ts.getBatch()); detail.setWarehouseId(outbound.getWarehouseId()); detail.setLocationId(ts.getLocationId()); detail.setMaterialId(ts.getMaterialId()); detail.setNum(actNum); detail.setDoneDate(new Date()); detail.setDoneNum(actNum); detail.setStatus(Constants.ONE); detail.setUnitId(ts.getUnitId()); detail.setProcedureId(ts.getProcedureId()); detail.setQualityType(ts.getQualityType()); wOutboundDetailExtMapper.insert(detail); //记录库存变动记录 wStockRecordExtService.saveRecord(Constants.ZERO,detail.getId(),user); WStock s = new WStock(); s.setId(ts.getId()); s.setUpdateTime(DateUtil.getCurrentDate()); s.setUpdateUser(user.getId()); s.setNum(Constants.formatBigdecimal(ts.getNum()).subtract(Constants.formatBigdecimal(actNum))); if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){ //如果库存不足 s.setNum(new BigDecimal(0)); } wStockExtMapper.updateById(s); /*WStock stock = getFromStockList(ts.getLocationId(),ts.getWarehouseId(),ts.getMaterialId(),ts.getBatch(),ts.getProcedureId(),ts.getQualityType(),stockList); if(stock!=null){ //如果库存对象已存在,直接减少对应的库存量 stock.setNum(Constants.formatBigdecimal(stock.getNum()).subtract(actNum)); }else{ stock = new WStock(); stock.setMaterialId(ts.getMaterialId()); stock.setLocationId(ts.getLocationId()); stock.setNum(actNum.multiply(new BigDecimal(-1))); stock.setWarehouseId(ts.getWarehouseId()); stock.setUnitId(ts.getUnitId()); stock.setBatch(ts.getBatch()); stock.setProcedureId(ts.getProcedureId()); stock.setQualityType(ts.getQualityType()); //待更新库存信息 stockList.add(stock); }*/ if(isfull){ //如果已经满足剩余需求量,终止当前需求物料的库存查询 break; } } } } }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"生产所需物料库存不足,无法报工"); } } private void dealApplianceMateial(Workorder mp , LoginUserInfo user ,QueryBomDetailExtDTO bdparam , List allRecordList , List updateApplianceList , List outboundDetailList ,List stockList) { if(bdparam!=null) { List bomDetailList = bomDetailExtMapper.selectList(bdparam); if (bomDetailList == null || bomDetailList.size() == 0) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该生产物料的bom配置有误,请联系管理员!"); } for (BomDetailExtListVO i :bomDetailList) { //查询是否投料 if(workorderRecordExtMapper.selectCount(new QueryWrapper() .eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",i.getMaterialId()).eq("TYPE",Constants.ZERO))<=0){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在未投料BOM物料,无法进行报工"); } } } WOutbound outbound = new WOutbound(); outbound.setDeleted(Constants.ZERO); outbound.setCreateTime(DateUtil.getCurrentDate()); outbound.setDealDate(outbound.getCreateTime()); outbound.setValidDate(outbound.getCreateTime()); outbound.setCreateUser(user.getId()); outbound.setRootDepartId(mp.getRootDepartId()); outbound.setDepartId(mp.getDepartId()); outbound.setStatus(Constants.WOUTBOUND_STATUS.dealed); outbound.setType(Constants.WOUTBOUND_TYPE.out); //2022年7月1日14:42:41 加入单据类别 outbound.setBillType(Constants.WOUTBOUND_BILLTYPE.workerOrderOut); outbound.setCode(wOutboundService.getNextOutCode(user.getCompany().getId())); outbound.setOrigin(Constants.ONE); outbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.produce); outbound.setOriginId(mp.getId()); outbound.setOriginCode(mp.getCode()); outbound.setPlanDate(DateUtil.getCurrentDate()); outbound.setProcedureId(mp.getProcedureId()); outbound.setUserId(user.getId()); outbound.setWarehouseId(mp.getProduceWarehouseId()); wOutboundService.create(outbound); List detailList = new ArrayList<>(); for(WorkorderRecordExtListVO tModel :allRecordList){ if(Constants.equalsInteger(tModel.getType(),Constants.WORKORDER_RECORD_TYPE.materail)){ //如果是投料 mp.setHasMaterialNum(Constants.formatBigdecimal(tModel.getNum()).add(Constants.formatBigdecimal(mp.getHasMaterialNum()))); WStock stock = wStockExtMapper.selectById(tModel.getAppliancesId()); if(Objects.isNull(stock)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,投料选择库存记录不存在!"); } if(!Constants.equalsInteger(stock.getLocationId(),mp.getProduceWarehouseLocationId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,投料记录物料信息必须来自工单待生产机台货位!"); } if(stock.getNum().compareTo(tModel.getNum())()); detailList.add(detail); } WOutboundRecord record = new WOutboundRecord(); record.setDeleted(Constants.ZERO); record.setCreateTime(DateUtil.getCurrentDate()); record.setCreateUser(user.getId()); record.setAppliancesId(tModel.getAppliancesId()); record.setBatch(detail.getBatch()); record.setDetailId(detail.getId()); record.setRootDepartId(mp.getRootDepartId()); record.setNum(tModel.getNum()); record.setOutboundId(detail.getOutboundId()); record.setUnitId(detail.getUnitId()); record.setWarehouseId(detail.getWarehouseId()); record.setMaterialId(detail.getMaterialId()); record.setProcedureId(detail.getProcedureId()); record.setQualityType(detail.getQualityType()); record.setLocationId(detail.getLocationId()); detail.getWOutboundRecordInList().add(record); // wOutboundRecordExtMapper.insert(record); if(stock!=null){ //如果库存对象已存在,直接减少对应的库存量 WStockRecord wStockRecord = new WStockRecord(); BeanUtils.copyProperties(stock,wStockRecord); wStockRecord.setBeforNum(stock.getNum()); stock.setNum(Constants.formatBigdecimal(stock.getNum()).subtract(Constants.formatBigdecimal(tModel.getNum()))); wStockRecord.setNum(tModel.getNum()); wStockRecord.setAfterNum(stock.getNum()); wStockRecord.setWStockId(stock.getId()); wStockExtMapper.updateById(stock); wStockRecordExtService.insertWStockRecord(wStockRecord); }else{ stock = new WStock(); stock.setMaterialId(detail.getMaterialId()); stock.setLocationId(mp.getProduceWarehouseLocationId()); stock.setNum(Constants.formatBigdecimal(tModel.getNum()).multiply(new BigDecimal(-1))); stock.setWarehouseId(outbound.getWarehouseId()); stock.setUnitId(detail.getUnitId()); stock.setBatch(detail.getBatch()); stock.setProcedureId(tModel.getAmodel().getProcedureId()); stock.setQualityType(tModel.getAmodel().getQualityType()); //待更新库存信息 stockList.add(stock); } } } for(WOutboundDetail detail : detailList){ wOutboundDetailExtMapper.insert(detail); } } private void dealAppliancePro(Workorder mp , LoginUserInfo user , List allRecordList , List updateApplianceList , List updateApplianceProList , List outboundDetailList , List stockList) { WOutbound outbound = new WOutbound(); outbound.setDeleted(Constants.ZERO); outbound.setCreateTime(DateUtil.getCurrentDate()); outbound.setDealDate(outbound.getCreateTime()); outbound.setValidDate(outbound.getCreateTime()); outbound.setCreateUser(user.getId()); outbound.setRootDepartId(mp.getRootDepartId()); outbound.setDepartId(mp.getDepartId()); outbound.setStatus(Constants.WOUTBOUND_STATUS.dealed); outbound.setType(Constants.WOUTBOUND_TYPE.in); //2022年7月1日14:42:41 加入单据类别 outbound.setBillType(Constants.WOUTBOUND_BILLTYPE.workerOrderIn); outbound.setCode(wOutboundService.getNextInCode(user.getCompany().getId())); outbound.setOrigin(Constants.ONE); outbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.produce); outbound.setOriginCode(mp.getCode()); outbound.setOriginId(mp.getId()); outbound.setPlanDate(DateUtil.getCurrentDate()); outbound.setProcedureId(mp.getProcedureId()); outbound.setUserId(user.getId()); outbound.setWarehouseId(mp.getFinishWarehouseId()); wOutboundService.create(outbound); List detailList = new ArrayList<>(); List recordList = new ArrayList<>(); for(WorkorderRecordExtListVO tModel :allRecordList){ if(Constants.equalsInteger(tModel.getType(),Constants.WORKORDER_RECORD_TYPE.produce)){ if(tModel.getNum().compareTo(BigDecimal.ZERO)<=Constants.ZERO){ continue; } //如果是产出 mp.setHasProduceNum(Constants.formatBigdecimal(tModel.getNum()).intValue()+Constants.formatIntegerNum(mp.getHasProduceNum())); if(tModel.getDoneType() == null){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装器具【"+tModel.getAmodel().getCode()+"】产出质量属性为空,无法报工!"); } if(!Constants.equalsInteger(tModel.getDoneType(),Constants.ZERO)){ //如果不良,累计工单的不良产出 mp.setUnqualifiedNum(Constants.formatIntegerNum(mp.getUnqualifiedNum())+(Constants.formatBigdecimal(tModel.getNum()).intValue())); }else{ //如果是合格,累计工单的合格数量 mp.setQualifiedNum(Constants.formatIntegerNum(mp.getQualifiedNum())+(Constants.formatBigdecimal(tModel.getNum()).intValue())); } //物料+批次+工序+质量属性去重 WOutboundDetail detail =getWoutbondDetailByList(tModel,detailList); if(detail!=null){ detail.setNum(Constants.formatBigdecimal(detail.getNum()).add(tModel.getNum())); }else{ detail = new WOutboundDetail(); detail.setDeleted(Constants.ZERO); detail.setCreateTime(DateUtil.getCurrentDate()); detail.setCreateUser(user.getId()); detail.setOutboundId(outbound.getId()); detail.setRootDepartId(outbound.getRootDepartId()); detail.setWarehouseId(outbound.getWarehouseId()); detail.setLocationId(mp.getFinishWarehouseLocationId()); detail.setNum(tModel.getNum()); detail.setStatus(Constants.ONE); detail.setDoneNum(tModel.getNum()); detail.setDoneDate(new Date()); detail.setUnitId(tModel.getUnitId()); detail.setBatch(tModel.getMaterialBatch()); detail.setProcedureId(tModel.getProcedureId()); detail.setMaterialId(tModel.getMaterialId()); detail.setQualityType(tModel.getDoneType()); detail.setWOutboundRecordInList(new ArrayList<>()); detailList.add(detail); } WOutboundRecord record = new WOutboundRecord(); record.setDeleted(Constants.ZERO); record.setCreateTime(DateUtil.getCurrentDate()); record.setCreateUser(user.getId()); record.setAppliancesId(tModel.getAppliancesId()); record.setBatch(detail.getBatch()); record.setRootDepartId(mp.getRootDepartId()); record.setNum(tModel.getNum()); record.setOutboundId(detail.getOutboundId()); record.setUnitId(detail.getUnitId()); record.setWarehouseId(detail.getWarehouseId()); record.setMaterialId(detail.getMaterialId()); record.setProcedureId(detail.getProcedureId()); record.setLocationId(detail.getLocationId()); record.setQualityType(detail.getQualityType()); detail.getWOutboundRecordInList().add(record); WStock stock = getFromStockList(mp.getFinishWarehouseLocationId(),detail.getWarehouseId(),detail.getMaterialId(),detail.getBatch(), tModel.getProcedureId(),tModel.getDoneType(),stockList); if(stock!=null){ //如果库存对象已存在,直接增加对应的库存量 stock.setNum(Constants.formatBigdecimal(stock.getNum()).add(Constants.formatBigdecimal(tModel.getNum()))); }else{ stock = new WStock(); stock.setMaterialId(detail.getMaterialId()); stock.setBatch(detail.getBatch()); stock.setWarehouseId(outbound.getWarehouseId()); stock.setLocationId(mp.getFinishWarehouseLocationId()); stock.setUnitId(detail.getUnitId()); stock.setNum(Constants.formatBigdecimal(tModel.getNum())); stock.setProcedureId(tModel.getProcedureId()); stock.setQualityType(tModel.getDoneType()); //待更新库存信息 stockList.add(stock); } } } for(WOutboundDetail detail : detailList){ wOutboundDetailExtMapper.insert(detail); //记录库存变动记录 wStockRecordExtService.saveRecord(Constants.ONE,detail.getId(),user); if(detail.getWOutboundRecordInList()!=null){ for(WOutboundRecord r : detail.getWOutboundRecordInList()){ r.setDetailId(detail.getId()); wOutboundRecordExtMapper.insert(r); } } } if(Constants.formatIntegerNum(mp.getHasProduceNum()) >Constants.formatIntegerNum(mp.getPlanNum())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的产出数量不能大于工单计划数量!"); } } private WStock initMaterialNum(Integer materialId, BigDecimal num) { WStock s = new WStock(); s.setMaterialId(materialId); //1:1投料 s.setNum(num); return s; } private WOutbound getFromOutboundList(Integer warehouseId, List outboundList) { for(WOutbound o : outboundList){ if(Constants.equalsInteger(warehouseId,o.getWarehouseId())){ return o; } } return null; } private WStock getFromStockList(Integer produceWarehouseLocationId, Integer warehouseId, Integer mId,String batch,Integer procedureId,Integer qtype,List stockList) { for(WStock s : stockList){ if(Constants.equalsInteger(produceWarehouseLocationId,s.getLocationId()) && Constants.equalsInteger(procedureId,s.getProcedureId()) && Constants.equalsInteger(qtype,s.getQualityType()) && Constants.equalsInteger(warehouseId,s.getWarehouseId()) && StringUtils.equals(batch,s.getBatch()) && Constants.equalsInteger(mId,s.getMaterialId())){ return s; } } return null; } private Integer getNextProcudureId(Integer proceduresId, Workorder mp) { List rpList = null; if (mp.getBomModel() != null && mp.getBomModel().getRouteId() != null) { // if (mp.getBomModel().getRouteId() != null) { RouteProcedure rp = new RouteProcedure(); rp.setDeleted(Constants.ZERO); rp.setRouteId(mp.getBomModel().getRouteId()); rp.setDepartId(mp.getFactoryId()); rpList = routeProcedureExtMapper.selectList(new QueryWrapper<>(rp).orderByAsc("SORTNUM")); } } else { //没有bom的情况 RouteProcedure rp = new RouteProcedure(); rp.setDeleted(Constants.ZERO); rp.setDepartId(mp.getFactoryId()); rpList = routeProcedureExtMapper.selectList(new QueryWrapper<>(rp).exists("select bom.id from bom where bom.material_id=" + mp.getMaterialId() + " and bom.route_id =route_procedure.route_id and bom.deleted=0").orderByAsc("SORTNUM")); } if(rpList!=null && rpList.size()>0){ for(int i=0;i detailList) { for(WOutboundDetail detail : detailList){ if(Constants.equalsInteger(detail.getProcedureId(),tModel.getProcedureId()) && StringUtils.equals(detail.getBatch(),tModel.getMaterialBatch()) && Constants.equalsInteger(detail.getMaterialId(),tModel.getMaterialId()) && Constants.equalsInteger(detail.getQualityType(),tModel.getDoneType())){ return detail; } } return null; } private Appliances getApplianceFromList(Integer appliancesId, List updateApplianceList) { for(Appliances tModel :updateApplianceList){ if(Constants.equalsInteger(appliancesId,tModel.getId())){ return tModel; } } return null; } @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public WorkorderRecord dealWorkorderRecord(DealWorkorderRecordDTO dealWorkorderRecordDTO, LoginUserInfo loginUserInfo){ Workorder workorder = workorderExtMapper.selectById(dealWorkorderRecordDTO.getWorkorderId()); if(Objects.isNull(workorder)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单信息!"); } if(Objects.isNull(dealWorkorderRecordDTO.getDownType()) ||Objects.isNull(dealWorkorderRecordDTO.getWorkorderId()) ||Objects.isNull(dealWorkorderRecordDTO.getNum()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } WorkorderRecord workorderRecord = new WorkorderRecord(); if(Objects.isNull(dealWorkorderRecordDTO.getRecordId())){ //查询工单下是否存在对应记录 workorderRecord = workorderRecordExtMapper.selectOne(new QueryWrapper() .eq("WORKORDER_ID",dealWorkorderRecordDTO.getWorkorderId()) .eq("DONE_TYPE",dealWorkorderRecordDTO.getDownType()) .eq("TYPE",Constants.ONE) .eq("DELETED",Constants.ZERO) .last(" limit 1 ") ); if(!Objects.isNull(workorderRecord)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的该类产出记录已存在!"); } BigDecimal havaNum = new BigDecimal(Constants.ZERO); List workorderRecords = workorderRecordExtMapper.selectList(new QueryWrapper() .eq("WORKORDER_ID",dealWorkorderRecordDTO.getWorkorderId()).eq("TYPE",Constants.ONE).eq("DELETED",Constants.ZERO)); if(!Objects.isNull(workorderRecords)&&workorderRecords.size()>Constants.ZERO){ havaNum = workorderRecords.stream().map(s -> s.getNum()).reduce(BigDecimal.ZERO, BigDecimal::add); } if((havaNum.add(dealWorkorderRecordDTO.getNum())).compareTo(BigDecimal.valueOf(workorder.getPlanNum()))>Constants.ZERO){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的产出数量不能大于工单计划数量!"); } //数据存储 workorderRecord = new WorkorderRecord(); workorderRecord.setDeleted(Constants.ZERO); workorderRecord.setCreateUser(loginUserInfo.getId()); workorderRecord.setCreateTime(new Date()); workorderRecord.setDoneType(dealWorkorderRecordDTO.getDownType()); workorderRecord.setNum(dealWorkorderRecordDTO.getNum()); workorderRecord.setRootDepartId(loginUserInfo.getRootDepartment().getId()); workorderRecord.setDepartId(loginUserInfo.getCurComDepartment().getId()); workorderRecord.setPlanId(workorder.getPlanId()); workorderRecord.setWorkorderId(dealWorkorderRecordDTO.getWorkorderId()); workorderRecord.setBatch(workorder.getBatch()); workorderRecord.setFactoryId(workorder.getFactoryId()); workorderRecord.setProcedureId(workorder.getProcedureId()); workorderRecord.setProDate(new Date()); workorderRecord.setType(Constants.ONE); workorderRecord.setMaterialId(workorder.getMaterialId()); workorderRecord.setUnitId(workorder.getUnitId()); workorderRecord.setMaterialBatch(workorder.getBatch()); workorderRecordExtMapper.insert(workorderRecord); }else{ //查询工单下是否存在对应记录 workorderRecord = workorderRecordExtMapper.selectById(dealWorkorderRecordDTO.getRecordId()); BigDecimal havaNum = new BigDecimal(Constants.ZERO); List workorderRecords = workorderRecordExtMapper.selectList(new QueryWrapper() .eq("WORKORDER_ID",dealWorkorderRecordDTO.getWorkorderId()).eq("TYPE",Constants.ONE).eq("DELETED",Constants.ZERO).ne("id",dealWorkorderRecordDTO.getRecordId())); if(!Objects.isNull(workorderRecords)&&workorderRecords.size()>Constants.ZERO){ havaNum = workorderRecords.stream().map(s -> s.getNum()).reduce(BigDecimal.ZERO, BigDecimal::add); } if((havaNum.add(dealWorkorderRecordDTO.getNum())).compareTo(BigDecimal.valueOf(workorder.getPlanNum()))>Constants.ZERO){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的产出数量不能大于工单计划数量!"); } if(dealWorkorderRecordDTO.getNum().compareTo(BigDecimal.ZERO)==Constants.ZERO){ workorderRecord.setDeleted(Constants.ONE); }else{ workorderRecord.setDeleted(Constants.ZERO); } workorderRecord.setUpdateTime(new Date()); workorderRecord.setUpdateUser(loginUserInfo.getId()); workorderRecord.setNum(dealWorkorderRecordDTO.getNum()); workorderRecordExtMapper.updateById(workorderRecord); } return workorderRecord; } @Override public List getWorkorderRecordList(Integer workorderId) { List workorderRecordList = workorderRecordExtMapper.selectList( new QueryWrapper().eq("WORKORDER_ID",workorderId).eq("TYPE",Constants.ONE).eq("DELETED",Constants.ZERO).orderByAsc(" DONE_TYPE ")); return workorderRecordList; } @Override public PageData choiceStockPageForWorkorder(PageWrap pageWrap,LoginUserInfo userInfo) { Workorder workorder = workorderExtMapper.selectById(pageWrap.getModel().getWorkorderId()); if(Objects.isNull(workorder)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到工单信息!"); } //查询并验证工单信息 Workorder mp = getOrderAndValid(userInfo,workorder.getId()); //查询全部bom组成数据,如果有BOM配置,按照BOM组成进行投料,如果没有BOM配置,则投料物料为待生产库位的物料本身 QueryBomDetailExtDTO bdparam = initBomParam(userInfo,mp); List bomDetailList = null; if(bdparam!=null){ bomDetailList = bomDetailExtMapper.selectList(bdparam); List materialDistributeId = bomDetailList.stream().map(BomDetailExtListVO::getMaterialId).collect(Collectors.toList()); pageWrap.getModel().setMaterialDistributeId(materialDistributeId); }else{ //查询物料BOM信息 Bom bom = bomExtMapper.selectOne(new QueryWrapper().eq("MATERIAL_ID",workorder.getMaterialId()).eq("DELETED",Constants.ZERO).last(" limit 1 ")); if(Objects.isNull(bom)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到BOM信息!"); } RouteProcedure currentRouteProcedure = routeProcedureExtMapper.selectOne(new QueryWrapper() .eq("ROUTE_ID",bom.getRouteId()) .eq("PROCEDURE_ID",workorder.getProcedureId()) .last(" limit 1 ") ); if(currentRouteProcedure!=null){ RouteProcedure routeProcedure = routeProcedureExtMapper.selectOne(new QueryWrapper() .eq("ROUTE_ID",currentRouteProcedure.getRouteId()).apply(" SORTNUM < " + currentRouteProcedure.getSortnum() ).eq("STATUS",Constants.ONE).orderByDesc(" SORTNUM ").last(" limit 1 ") ); if(Objects.isNull(routeProcedure)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到生产物料上一步工序信息!"); } pageWrap.getModel().setProcedureId(routeProcedure.getProcedureId()); pageWrap.getModel().setMaterialId(workorder.getMaterialId()); } } pageWrap.getModel().setLocationId(workorder.getProduceWarehouseLocationId()); PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity()); List result = wStockExtMapper.choiceStockList(pageWrap.getModel()); return PageData.from(new PageInfo<>(result)); } }