| | |
| | | import doumeemes.core.utils.redis.RedisUtil; |
| | | import doumeemes.dao.business.BackOrderDetailMapper; |
| | | import doumeemes.dao.business.BackorderMapper; |
| | | import doumeemes.dao.business.SalaryParamMapper; |
| | | import doumeemes.dao.business.dto.CreateMaterialDTO; |
| | | import doumeemes.dao.business.dto.CreateWorkorderRecordDTO; |
| | | import doumeemes.dao.business.dto.DealWorkorderRecordDTO; |
| | | import doumeemes.dao.business.dto.MaterialListDTO; |
| | | import doumeemes.dao.business.model.*; |
| | |
| | | private WOutboundRecordExtMapper wOutboundRecordExtMapper; |
| | | @Autowired |
| | | private MaterialExtMapper materialExtMapper; |
| | | @Autowired |
| | | private SalaryParamMapper salaryParamMapper; |
| | | @Autowired |
| | | private PlansExtMapper plansExtMapper; |
| | | @Autowired |
| | | private DeviceExtMapper deviceExtMapper; |
| | | |
| | | @Transactional(rollbackFor = {BusinessException.class,Exception.class}) |
| | | @Override |
| | |
| | | recordList.add(getWorkrecordModel(user,wStock,mp,materialListDTO.getNum())); |
| | | } |
| | | } |
| | | |
| | | //批量插入投料记录 |
| | | workorderRecordExtMapper.insertBatch(recordList); |
| | | //单添加历史记录(判断更新为生产中) |
| | | //单添加历史记录(不更新状态) |
| | | updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.material); |
| | | return param.getId(); |
| | | } |
| | |
| | | return mp; |
| | | } |
| | | |
| | | private void getPlansAndValid(LoginUserInfo user, Plans mp) throws BusinessException{ |
| | | if(mp== null){ |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); |
| | | } |
| | | if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!"); |
| | | } |
| | | } |
| | | |
| | | private QueryBomDetailExtDTO initBomParam(LoginUserInfo user, Workorder mp) throws BusinessException{ |
| | | QueryBomExtDTO bb = new QueryBomExtDTO(); |
| | |
| | | bom.setBomId(versionBom.getBomVersionId()); |
| | | // bom.setProcedureId(mp.getProcedureId()); |
| | | bom.setWorkorderId(mp.getId()); |
| | | return bom; |
| | | } |
| | | |
| | | private QueryBomDetailExtDTO initBomParamForPlans(LoginUserInfo user, Plans plans) throws BusinessException{ |
| | | QueryBomExtDTO bb = new QueryBomExtDTO(); |
| | | bb.setDepartId(plans.getDepartId()); |
| | | bb.setDeleted(Constants.ZERO); |
| | | bb.setRootDepartId(user.getRootDepartment().getId()); |
| | | bb.setMaterialId(plans.getMaterialId()); |
| | | bb.setProcedureId(plans.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信息配置有误,请联系管理员!"); |
| | | } |
| | | plans.setBomModel(versionBom); |
| | | QueryBomDetailExtDTO bom = new QueryBomDetailExtDTO(); |
| | | bom.setDeleted(Constants.ZERO); |
| | | bom.setBomId(versionBom.getBomVersionId()); |
| | | // bom.setProcedureId(mp.getProcedureId()); |
| | | bom.setPlansId(plans.getId()); |
| | | return bom; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | private void updateOrderInfo(LoginUserInfo user, Workorder mp,int status) { |
| | | |
| | | List<WorkorderHistory> whList = new ArrayList<>(); |
| | | //工单历史数据 |
| | | Workorder order = new Workorder(); |
| | |
| | | order.setStatus(Constants.WORKORDER_STATUS.material); |
| | | }else if(status ==Constants.WORKORDER_HISTORY_STATUS.done){ |
| | | order.setStatus(Constants.WORKORDER_STATUS.done); |
| | | }else if(status ==Constants.WORKORDER_HISTORY_STATUS.material ||status ==Constants.WORKORDER_HISTORY_STATUS.produce){ |
| | | //投料操作 |
| | | if(Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create) |
| | | ||Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material)){ |
| | | //如果是已创建或者已备料状态的工单,修改其状态为【生产中】 |
| | | order.setStatus(Constants.WORKORDER_STATUS.producing); |
| | | } |
| | | } |
| | | workorderExtMapper.updateById(order); |
| | | workorderHistoryExtMapper.insertBatch(whList); |
| | |
| | | //处理产出数据 |
| | | dealAppliancePro(mp,user,allRecordList,updateApplianceList,updateApplianceProList, outboundDetailList,stockList); |
| | | } |
| | | |
| | | |
| | | //如果有没bom配置,检查产出(包含检验的不良和报废品)和投料数量是否相等匹配,不一致提示错误 |
| | | if(bdparam==null){ |
| | |
| | | //如果需要投料的物料集合,在库存中寻找投料来源 |
| | | 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())); |
| | |
| | | //如果已经满足剩余需求量 |
| | | isfull =true; |
| | | } |
| | | |
| | | //添加投料记录 |
| | | workorderRecordExtMapper.insert(getWorkrecordModel(user,ts,mp,actNum)); |
| | | |
| | | //更新已经投料数量 |
| | | model.setTNum(Constants.formatBigdecimal(model.getTNum()).add(actNum)); |
| | | WOutbound outbound = getFromOutboundList(ts.getWarehouseId(),outboundList); |
| | |
| | | if (bomDetailList == null || bomDetailList.size() == 0) { |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该生产物料的bom配置有误,请联系管理员!"); |
| | | } |
| | | // for (BomDetailExtListVO i :bomDetailList) { |
| | | // //查询是否投料 |
| | | // if(workorderRecordExtMapper.selectCount(new QueryWrapper<WorkorderRecord>() |
| | | // .eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",i.getMaterialId()).eq("TYPE",Constants.ZERO))<=0){ |
| | | // throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在未投料BOM物料,无法进行报工"); |
| | | // } |
| | | // } |
| | | for (BomDetailExtListVO i :bomDetailList) { |
| | | //查询是否投料 |
| | | if(workorderRecordExtMapper.selectCount(new QueryWrapper<WorkorderRecord>() |
| | | .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(); |
| | |
| | | } |
| | | //如果是产出 |
| | | 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())); |
| | | // } |
| | | 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); |
| | |
| | | List<WStockExtListVO> result = wStockExtMapper.choiceStockList(pageWrap.getModel()); |
| | | return PageData.from(new PageInfo<>(result)); |
| | | } |
| | | |
| | | @Override |
| | | public PageData<WStockExtListVO> choiceStockPageForPlans(PageWrap<QueryWStockDto> pageWrap,LoginUserInfo userInfo) { |
| | | Plans plans =plansExtMapper.selectById(pageWrap.getModel().getPlansId()); |
| | | if(Objects.isNull(plans)){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到工序计划信息!"); |
| | | } |
| | | Device device = deviceExtMapper.selectById(pageWrap.getModel().getDeviceId()); |
| | | if(Objects.isNull(plans)){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到设备信息!"); |
| | | } |
| | | //查询并验证工单信息 |
| | | this.getPlansAndValid(userInfo,plans); |
| | | //查询全部bom组成数据,如果有BOM配置,按照BOM组成进行投料,如果没有BOM配置,则投料物料为待生产库位的物料本身 |
| | | QueryBomDetailExtDTO bdparam = initBomParamForPlans(userInfo,plans); |
| | | List<BomDetailExtListVO> bomDetailList = null; |
| | | if(bdparam!=null){ |
| | | bomDetailList = bomDetailExtMapper.selectList(bdparam); |
| | | List<Integer> materialDistributeId = bomDetailList.stream().map(BomDetailExtListVO::getMaterialId).collect(Collectors.toList()); |
| | | pageWrap.getModel().setMaterialDistributeId(materialDistributeId); |
| | | }else{ |
| | | //查询物料BOM信息 |
| | | Bom bom = bomExtMapper.selectOne(new QueryWrapper<Bom>().eq("MATERIAL_ID",plans.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<RouteProcedure>() |
| | | .eq("ROUTE_ID",bom.getRouteId()) |
| | | .eq("PROCEDURE_ID",plans.getProcedureId()) |
| | | .last(" limit 1 ") |
| | | ); |
| | | if(currentRouteProcedure!=null){ |
| | | RouteProcedure routeProcedure = routeProcedureExtMapper.selectOne(new QueryWrapper<RouteProcedure>() |
| | | .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(plans.getMaterialId()); |
| | | } |
| | | } |
| | | pageWrap.getModel().setLocationId(device.getProduceWarehouseLocationId()); |
| | | PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity()); |
| | | List<WStockExtListVO> result = wStockExtMapper.choiceStockList(pageWrap.getModel()); |
| | | return PageData.from(new PageInfo<>(result)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = {BusinessException.class,Exception.class}) |
| | | public WorkorderRecord createWorkorderRecord(CreateWorkorderRecordDTO createWorkorderRecordDTO, LoginUserInfo loginUserInfo){ |
| | | Workorder workorder = workorderExtMapper.selectById(createWorkorderRecordDTO.getWorkorderId()); |
| | | if(Objects.isNull(workorder)){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未查询到该工单信息!"); |
| | | } |
| | | if(Objects.isNull(createWorkorderRecordDTO.getUnQualifiedNum()) |
| | | ||Objects.isNull(createWorkorderRecordDTO.getUnQualifiedNum()) |
| | | ||Objects.isNull(createWorkorderRecordDTO.getWorkorderId()) |
| | | ){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST); |
| | | } |
| | | BigDecimal num = createWorkorderRecordDTO.getQualifiedNum().add(createWorkorderRecordDTO.getUnQualifiedNum()); |
| | | WorkorderRecord workorderRecord = new WorkorderRecord(); |
| | | //查询工单下是否存在对应记录 |
| | | workorderRecord = workorderRecordExtMapper.selectOne(new QueryWrapper<WorkorderRecord>() |
| | | .eq("WORKORDER_ID",createWorkorderRecordDTO.getWorkorderId()) |
| | | .eq("TYPE",Constants.ONE) |
| | | .eq("DELETED",Constants.ZERO) |
| | | .last(" limit 1 ") |
| | | ); |
| | | if(!Objects.isNull(workorderRecord)){ |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的该类产出记录已存在!"); |
| | | } |
| | | if(num.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.setNum(num); |
| | | workorderRecord.setRootDepartId(loginUserInfo.getRootDepartment().getId()); |
| | | workorderRecord.setDepartId(loginUserInfo.getCurComDepartment().getId()); |
| | | workorderRecord.setPlanId(workorder.getPlanId()); |
| | | workorderRecord.setWorkorderId(createWorkorderRecordDTO.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()); |
| | | workorderRecord.setUnqualifiedNum(createWorkorderRecordDTO.getUnQualifiedNum()); |
| | | workorderRecord.setQualifiedNum(createWorkorderRecordDTO.getQualifiedNum()); |
| | | //计算工资信息 |
| | | SalaryParam salaryParam = salaryParamMapper.selectOne(new QueryWrapper<SalaryParam>().eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",workorderRecord.getMaterialId()) |
| | | .eq("DEPART_ID",workorderRecord.getFactoryId()).eq("PROCEDURE_ID",workorderRecord.getProcedureId()).last(" limit 1 ")); |
| | | if(Objects.isNull(salaryParam)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未配置工资绩效配置!"); |
| | | } |
| | | workorderRecord.setSalaryPrice(salaryParam.getSalary()); |
| | | workorderRecord.setSalaryType(salaryParam.getType()); |
| | | workorderRecord.setSalaryUnqualified(salaryParam.getUnqualified()); |
| | | |
| | | //计件工资 |
| | | if(salaryParam.getType().equals(Constants.ZERO)){ |
| | | workorderRecord.setSalaryNum(salaryParam.getNum()); |
| | | workorderRecord.setSalary(salaryParam.getSalary().multiply(salaryParam.getUnqualified()==Constants.ZERO?num:createWorkorderRecordDTO.getUnQualifiedNum())); |
| | | }else{ |
| | | workorderRecord.setDuration(createWorkorderRecordDTO.getDuration()); |
| | | workorderRecord.setSalary(BigDecimal.valueOf(createWorkorderRecordDTO.getDuration()).multiply(salaryParam.getSalary()).divide(new BigDecimal(3600))); |
| | | } |
| | | |
| | | //插入工单操作记录,并且判断是否更改为工单的状态【生产中】 |
| | | updateOrderInfo(loginUserInfo,workorder,Constants.WORKORDER_HISTORY_STATUS.produce); |
| | | workorderRecordExtMapper.insert(workorderRecord); |
| | | return workorderRecord; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |