package com.chinaztt.mes.quality.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; 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.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.chinaztt.ifs.api.feign.IfsFeignClient; import com.chinaztt.mes.basic.dto.LocationIfsMoveDTO; import com.chinaztt.mes.basic.entity.Location; import com.chinaztt.mes.basic.entity.Part; import com.chinaztt.mes.basic.entity.Staff; import com.chinaztt.mes.basic.entity.WorkstationLocation; import com.chinaztt.mes.basic.mapper.LocationMapper; import com.chinaztt.mes.basic.mapper.PartMapper; import com.chinaztt.mes.basic.mapper.StaffMapper; import com.chinaztt.mes.basic.mapper.WorkstationLocationMapper; import com.chinaztt.mes.basic.service.LocationService; import com.chinaztt.mes.basic.util.BigDecimalUtils; import com.chinaztt.mes.basic.util.DictUtils; import com.chinaztt.mes.common.numgen.NumberGenerator; import com.chinaztt.mes.common.oa.OAProcess; import com.chinaztt.mes.common.oa.OAProperty; import com.chinaztt.mes.common.oa.OAResult; import com.chinaztt.mes.common.util.WechatMsgTips; import com.chinaztt.mes.quality.dto.*; import com.chinaztt.mes.quality.entity.Apply; import com.chinaztt.mes.quality.entity.QualityUnqualifiedConfiguration; import com.chinaztt.mes.quality.entity.UnqualifiedProcess; import com.chinaztt.mes.quality.entity.UnqualifiedProcessFile; import com.chinaztt.mes.quality.mapper.ApplyMapper; import com.chinaztt.mes.quality.mapper.ApplyPartMapper; import com.chinaztt.mes.quality.mapper.QualityUnqualifiedConfigurationMapper; import com.chinaztt.mes.quality.mapper.UnqualifiedProcessMapper; import com.chinaztt.mes.quality.service.ApplyService; import com.chinaztt.mes.quality.service.UnqualifiedProcessFileService; import com.chinaztt.mes.quality.service.UnqualifiedProcessService; import com.chinaztt.mes.quality.state.unqualifiedprocess.constant.UnqualifiedprocessStateStringValues; import com.chinaztt.mes.warehouse.dto.StockDTO; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.StockMapper; import com.chinaztt.mes.warehouse.service.StockService; import com.chinaztt.mes.warehouse.util.StockUtils; import com.chinaztt.ztt.common.core.util.R; import com.chinaztt.ztt.common.oss.OssProperties; import com.chinaztt.ztt.common.oss.service.OssTemplate; import com.chinaztt.ztt.common.security.service.ZttUser; import com.chinaztt.ztt.common.security.util.SecurityUtils; import lombok.AllArgsConstructor; import net.bytebuddy.implementation.bytecode.Throw; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** * 不合格处理表 * * @author cxf * @date 2021-04-16 13:15:30 */ @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class UnqualifiedProcessServiceImpl extends ServiceImpl implements UnqualifiedProcessService { private LocationService locationService; private ApplyPartMapper applyPartMapper; private ApplyMapper applyMapper; private PartMapper partMapper; private WorkstationLocationMapper workstationLocationMapper; private StockUtils stockUtils; private IfsFeignClient ifsFeignClient; private LocationMapper locationMapper; private final OssProperties ossProperties; private final OssTemplate minioTemplate; private UnqualifiedProcessFileService processFileService; private OAProperty oaProperty; private NumberGenerator unqualifiedProcessNumberGenerator; private DictUtils dictUtils; private ApplyService applyService; private StockService stockService; private StockMapper stockMapper; private StaffMapper staffMapper; private QualityUnqualifiedConfigurationMapper qualityUnqualifiedConfigurationMapper; public static final String OA_ERROR_CODE = "999"; @Override public boolean saveDto(List unqualifiedProcessDTOList) { String mainProcessNo = unqualifiedProcessNumberGenerator.generateNumberWithPrefix(UnqualifiedProcess.DIGIT, "MAIN-" + UnqualifiedProcess.PREFIX, UnqualifiedProcess::getMainProcessNo); for (UnqualifiedProcessDTO unqualifiedProcessDTO : unqualifiedProcessDTOList) { checkProcessNo(unqualifiedProcessDTO); if (StringUtils.isNotBlank(unqualifiedProcessDTO.getProcessResult())) { if (unqualifiedProcessDTO.getProcessResult().equals(UnqualifiedprocessStateStringValues.RESULT_PASS)) { unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.ACCEPTED); } else if (unqualifiedProcessDTO.getProcessResult().equals(UnqualifiedprocessStateStringValues.RESULT_REJECT)) { unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.REJECT); } } else { unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.DRAFT); } unqualifiedProcessDTO.setMainProcessNo(mainProcessNo); baseMapper.insert(unqualifiedProcessDTO); UnqualifiedProcessDTO process = baseMapper.getById(unqualifiedProcessDTO.getId()); //查找审核人 List qualityUnqualifiedConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.lambdaQuery() .eq(QualityUnqualifiedConfiguration::getWorkShop, process.getWorkShop()) .eq(QualityUnqualifiedConfiguration::getType, process.getType()) .orderByDesc(QualityUnqualifiedConfiguration::getCreateTime)); if(CollectionUtil.isNotEmpty(qualityUnqualifiedConfigurationList)){ unqualifiedProcessDTO.setExaminer(qualityUnqualifiedConfigurationList.get(0).getExaminer()); } baseMapper.updateById(unqualifiedProcessDTO); //企业微信通知 if(StringUtils.isNotBlank(unqualifiedProcessDTO.getExaminer())) { process.setExaminer(unqualifiedProcessDTO.getExaminer()); remindExamine(process, 1); } } return true; } @Override public IPage> getPage(Page page, QueryWrapper gen) { //return getBaseMapper().getPage(page, gen); return baseMapper.getPage(page,gen); } @Override public boolean updateById(UnqualifiedProcessDTO unqualifiedProcessDTO) { checkProcessNo(unqualifiedProcessDTO); UnqualifiedProcessDTO old = this.getById(unqualifiedProcessDTO.getId()); if (old.getState().equals(UnqualifiedprocessStateStringValues.PENDING)||old.getState().equals(UnqualifiedprocessStateStringValues.ACCEPTED) ||old.getState().equals(UnqualifiedprocessStateStringValues.EXECUTED) ) { throw new RuntimeException("待审核和退回状态才可以修改"); } //查找审核人 List qualityUnqualifiedConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.lambdaQuery() .eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop()) .eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType()) .orderByDesc(QualityUnqualifiedConfiguration::getCreateTime)); if(CollectionUtil.isNotEmpty(qualityUnqualifiedConfigurationList)){ unqualifiedProcessDTO.setExaminer(qualityUnqualifiedConfigurationList.get(0).getExaminer()); } baseMapper.updateById(unqualifiedProcessDTO); // execute(unqualifiedProcess.getId()); return true; } private void checkProcessNo(UnqualifiedProcess unqualifiedProcess) { if (StringUtils.isBlank(unqualifiedProcess.getProcessNo())) { // 1. 自动生成编号 unqualifiedProcess.setProcessNo(unqualifiedProcessNumberGenerator.generateNumberWithPrefix(UnqualifiedProcess.DIGIT, UnqualifiedProcess.PREFIX, UnqualifiedProcess::getProcessNo)); } else { // 2.判断是否重复 List repeatNos = baseMapper.selectList(Wrappers.query().lambda() .eq(UnqualifiedProcess::getProcessNo, unqualifiedProcess.getProcessNo()) .ne(UnqualifiedProcess::getId, unqualifiedProcess.getId())); if (CollectionUtil.isNotEmpty(repeatNos)) { throw new RuntimeException("编号重复"); } } } @Override public boolean deleteById(Long id) throws Exception { UnqualifiedProcess unqualifiedProcess = getBaseMapper().selectById(id); if (unqualifiedProcess.getState().equals("") || unqualifiedProcess.getState().equals("")) { } // 删除附件 List processes = this.list(Wrappers.lambdaQuery().eq(UnqualifiedProcess::getMainProcessNo, unqualifiedProcess.getMainProcessNo())); if (processes.size() == 1) { List fileList = processFileService.list(Wrappers.lambdaQuery().eq(UnqualifiedProcessFile::getMainProcessNo, unqualifiedProcess.getMainProcessNo())); if (!fileList.isEmpty()) { for (UnqualifiedProcessFile processFile : fileList) { this.processFileService.delById(processFile.getId()); } } } return SqlHelper.retBool(baseMapper.deleteById(id)); } @Override public UnqualifiedProcessDTO getById(Long id) { return getBaseMapper().getById(id); } @Override public R startOa(Long id) { UnqualifiedProcessOaDTO unqualifiedProcess = getBaseMapper().getOaById(id); if (UnqualifiedprocessStateStringValues.PENDING.equals(unqualifiedProcess.getState())) { return R.failed("当前已发起OA流程,请耐心等待审核结果"); } if (UnqualifiedprocessStateStringValues.ACCEPTED.equals(unqualifiedProcess.getState())) { return R.failed("当前流程已通过,无须再发起OA流程"); } Map mainFields = new LinkedHashMap<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); mainFields.put("lcbh", unqualifiedProcess.getProcessNo()); //流程编号 mainFields.put("fkr", SecurityUtils.getUser().getUsername()); //反馈人 mainFields.put("fkrq", simpleDateFormat.format(new Date())); //反馈时间 mainFields.put("jclx", unqualifiedProcess.getApplyType()); //检测类型 mainFields.put("lsh", unqualifiedProcess.getOutBatchNo()); //流水号 mainFields.put("ggxh", unqualifiedProcess.getSpecs()); //规格型号 mainFields.put("gx", unqualifiedProcess.getOperationName()); //工序 mainFields.put("ys", null); //颜色 暂时没有 mainFields.put("ph", unqualifiedProcess.getReelNumber()); //盘号 mainFields.put("gzh", unqualifiedProcess.getOptaskNo()); //工单编号 mainFields.put("bombh", unqualifiedProcess.getPartNo()); //零件号 mainFields.put("bomgg", unqualifiedProcess.getPartName()); //零件描述 mainFields.put("scjt", unqualifiedProcess.getWorkstationName()); //生产机台 mainFields.put("scry", unqualifiedProcess.getStaffName()); //生产人员 mainFields.put("scsl", unqualifiedProcess.getProductQty().toString());//生产数量 mainFields.put("jcjd", unqualifiedProcess.getApplyType()); //检测阶段 mainFields.put("jcr", unqualifiedProcess.getReportPerson()); //检测人 if (null != unqualifiedProcess.getReportTime()) { //检测时间 mainFields.put("jcsj", simpleDateFormat.format(unqualifiedProcess.getReportTime())); } mainFields.put("bhgms", unqualifiedProcess.getReason()); //不合格描述 OAResult oaResult; try { oaResult = OAProcess.start(mainFields, "不合格评审流程", oaProperty.getUnqualifiedProcessId(), SecurityUtils.getUser().getUsername()); } catch (Exception e) { return R.failed("发起OA流程失败"); } if (OA_ERROR_CODE.equals(oaResult.getErrorCode())) { return R.failed(oaResult.getErrorMsg()); } else { if (StringUtils.isNotBlank(oaResult.getAddWorkflowResult())) { unqualifiedProcess.setWorkflowId(Long.parseLong(oaResult.getAddWorkflowResult())); } } unqualifiedProcess.setState(UnqualifiedprocessStateStringValues.PENDING); getBaseMapper().updateById(unqualifiedProcess); return R.ok(); } @Override public void oaReturnDeal(Long oaWorkId, String isAudit, String processMode) { UnqualifiedProcess unqualifiedProcess = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(UnqualifiedProcess::getWorkflowId, oaWorkId)); if (null != unqualifiedProcess) { unqualifiedProcess.setState(isAudit); // unqualifiedProcess.setProcessMode(processMode); baseMapper.updateById(unqualifiedProcess); //企业微信消息提醒 UnqualifiedProcessDTO processDTO = baseMapper.getById(unqualifiedProcess.getId()); if(StringUtils.isNotBlank(processDTO.getHandler())) { remindExamine(processDTO, 2); } // execute(unqualifiedProcess.getId()); } } @Override public R rfOa(Long id) { UnqualifiedProcessRfOaDTO info = this.baseMapper.getRfOaInfoById(id, SecurityUtils.getUser().getId()); if (!UnqualifiedprocessStateStringValues.DRAFT.equals(info.getState())) { return R.failed("当前状态不允许发起OA流程"); } Map mainFields = new LinkedHashMap<>(); mainFields.put("sccj", getWorkShopNumber(info.getWorkShop())); //生产车间012 mainFields.put("fxgx", info.getOperationName()); //工序名称 mainFields.put("cpmc", info.getPartName()); //产品名称 mainFields.put("scrq", DateUtil.format(info.getActualFinishDate(), DatePattern.NORM_DATE_PATTERN)); //生产日期 mainFields.put("lh", info.getSn()); //缆号 mainFields.put("ggxh", StringUtils.isNotBlank(info.getSpecs()) ? info.getSpecs() : ""); //规格型号 mainFields.put("cdm", info.getUnqualifiedArrived().toString()); //长度KM mainFields.put("zl", info.getType()); //种类 mainFields.put("sqrq", DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN)); //申请时间 mainFields.put("sqr", info.getUsername()); //申请人 mainFields.put("sqbm1", info.getDivisionName()); //申请部门 mainFields.put("bhglb", info.getUnqualifiedType()); //不合格类别 mainFields.put("sqclfs", info.getProcessMode()); //不合格处理方式 mainFields.put("bhgms", info.getUnqualifiedDesc()); //不合格描述 //不合格描述 OAResult oaResult; Long workflowId = null; try { System.out.println(JSONObject.toJSONString(mainFields)); oaResult = OAProcess.start(mainFields, "不合格评审流程", oaProperty.getUnqualifiedProcessId(), info.getUsername()); } catch (Exception e) { throw new RuntimeException("发起OA流程失败"); } if (OA_ERROR_CODE.equals(oaResult.getErrorCode())) { throw new RuntimeException(oaResult.getErrorMsg()); } else { if (StringUtils.isNotBlank(oaResult.getAddWorkflowResult())) { workflowId = Long.parseLong(oaResult.getAddWorkflowResult()); } } UpdateWrapper wrapper = new UpdateWrapper(); this.update(wrapper.lambda().eq(UnqualifiedProcess::getId, id).set(UnqualifiedProcess::getState, UnqualifiedprocessStateStringValues.PENDING).set(UnqualifiedProcess::getWorkflowId, workflowId)); return R.ok(); } public Boolean uploadFile(String mainProcessNo, MultipartFile file) throws Exception { String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename()); String url = String.format("/mes/unqualifiedProcess/%s/%s", ossProperties.getBucketName(), fileName); minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream()); UnqualifiedProcessFile processFile = new UnqualifiedProcessFile(); processFile.setOriginal(file.getOriginalFilename()); processFile.setPath(url); processFile.setFileName(fileName); processFile.setMainProcessNo(mainProcessNo); processFileService.save(processFile); return true; } @Override public void getFile(String bucket, String fileName, HttpServletResponse response) { try (InputStream inputStream = minioTemplate.getObject(bucket, fileName)) { response.setContentType("application/octet-stream; charset=UTF-8"); IoUtil.copy(inputStream, response.getOutputStream()); } catch (Exception e) { throw new RuntimeException("文件读取失败"); } } @Override public List showDefaultLocation(List ids){ List list = this.baseMapper.getExecuteList(ids); if (list.isEmpty()) { throw new RuntimeException("无可处理数据"); } ZttUser currentUser = SecurityUtils.getUser(); Staff staff = staffMapper.selectOne(Wrappers.lambdaQuery().eq(Staff::getStaffNo, currentUser.getUsername())); for (UnqualifiedProcessDTO unqualifiedProcessDTO:list) { //查找执行人 List qualityCheckConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.lambdaQuery() .eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop()) .eq(QualityUnqualifiedConfiguration::getProcessMode, unqualifiedProcessDTO.getProcessMode()) .eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType()) .orderByDesc(QualityUnqualifiedConfiguration::getCreateTime)); //判断是否有执行权限 if(CollectionUtil.isNotEmpty(qualityCheckConfigurationList)){ if(staff==null){ throw new RuntimeException("没有执行权限"); } String handler = qualityCheckConfigurationList.get(0).getHandler(); boolean b = handler.contains(staff.getStaffName()); if(!b){ throw new RuntimeException("没有执行权限"); } } } List returnList = new ArrayList<>(); Long defaultLocationId; for (UnqualifiedProcessDTO process : list){ UnqualifiedProcessDTO unqualifiedProcessDTO = new UnqualifiedProcessDTO(); unqualifiedProcessDTO.setId(process.getId()); unqualifiedProcessDTO.setProcessNo(process.getProcessNo()); unqualifiedProcessDTO.setProcessMode(process.getProcessMode()); unqualifiedProcessDTO.setIsShow(true); // 首检不做移库操作 if (StringUtils.equals(process.getApplyType(), Apply.FIRST_APPLY)) { unqualifiedProcessDTO.setIsShow(false); } if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REWORK) || process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REPAIR)) { // 不合格库位移动到检测待处理库位 defaultLocationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.PENDING_LOCATION);//检测待处理库位 if(defaultLocationId!=null) { Location location = locationMapper.selectById(defaultLocationId); unqualifiedProcessDTO.setDefaultLocation(location.getLocName()); } }else if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_ALLOW)){ Boolean moveToPreInspection = validateMoveToPreInspection(process); defaultLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(process.getSystemNo()); // 合格库位 if (moveToPreInspection) { defaultLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(process.getSystemNo()); } if(defaultLocationId!=null) { Location location = locationMapper.selectById(defaultLocationId); unqualifiedProcessDTO.setDefaultLocation(location.getLocName()); } } returnList.add(unqualifiedProcessDTO); } return returnList; } @Override public void executeByIds(List unqualifiedProcessDTOList) { List ids = unqualifiedProcessDTOList.stream().map(UnqualifiedProcessDTO::getId).collect(Collectors.toList()); List list = this.baseMapper.getExecuteList(ids); if (list.isEmpty()) { throw new RuntimeException("无可处理数据"); } // Map> collect = list.stream().collect(Collectors.groupingBy(UnqualifiedProcess::getProcessMode)); // if (collect.size() > 1) { // throw new RuntimeException("处理方式不一致,无法一起执行"); // } LocationIfsMoveDTO ifsResult = new LocationIfsMoveDTO(); ifsResult.setRECORD_ID(UUID.randomUUID().toString().replace("-", "")); List beanList = new ArrayList<>(); ifsResult.setBATCH_INFO(beanList); for (UnqualifiedProcessDTO process : list) { unqualifiedProcessDTOList.stream().forEach(a->{ if(process.getId().equals(a.getId())){ process.setTargetLocationId(a.getTargetLocationId()); } }); Long locationId = null; Long toLocationId = null; // 首检不做移库操作,只更新状态为已执行 if (StringUtils.equals(process.getApplyType(), Apply.FIRST_APPLY)) { continue; } // 报废不变动 // 返工 if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REWORK) || process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REPAIR)) { // 不合格库位移动到检测待处理库位 locationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 if(process.getTargetLocationId()==null) { toLocationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.PENDING_LOCATION);//检测待处理库位 if (locationId == null || toLocationId == null) { throw new RuntimeException("该工作站未设置库位,无法执行!"); } }else{ toLocationId = process.getTargetLocationId(); } // 移库 stockUtils.localMove(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId); } else if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_ALLOW)) { // 当前是工序检或者尾检 如果配置了成品待检库和成品检,则自动生成成品检的检测申请,并且移到成品待检库 Boolean moveToPreInspection = validateMoveToPreInspection(process); if (BooleanUtil.isTrue(moveToPreInspection)) { ApplyPartDTO applyPartDTO = new ApplyPartDTO(); applyPartDTO.setOutBatchNo(process.getLotBatchNo()); applyPartDTO.setPartId(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId()); applyPartDTO.setSystemNo(process.getSystemNo()); applyPartDTO.setPartName(process.getReplacePartId() == null ? process.getPartDesc() : process.getReplacePartName()); applyPartDTO.setPartNo(process.getReplacePartId() == null ? process.getPartNo() : process.getReplacePartNo()); applyPartDTO.setCheckLength(process.getCheckLength()); ApplyDTO applyDTO = new ApplyDTO(); applyDTO.setApplyPartList(Collections.singletonList(applyPartDTO)); applyDTO.setApplyType(Apply.PRODUCT_APPLY); applyDTO.setFinishedProductAutoInsp(Boolean.TRUE); applyService.saveDto(applyDTO); } // 不合格品库移动到合格库 locationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 if(process.getTargetLocationId()==null) { toLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(process.getSystemNo()); // 合格库位 if (moveToPreInspection) { toLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(process.getSystemNo()); } if (locationId == null || toLocationId == null) { throw new RuntimeException("该工作站未设置库位,无法执行!"); } }else{ toLocationId = process.getTargetLocationId(); } // 移库 stockUtils.localMove(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId); } else { continue; } List stockOperationStatus = stockMapper.getStockOperationStatus(process.getOutBatchNo(), process.getPartId(), process.getSystemNo()); Boolean stokOperationStatu = stockOperationStatus.get(0); if (null == stokOperationStatu) { Part part = partMapper.selectById(process.getPartId()); if (StringUtils.equals(part.getMaterialType(), "3")) { stokOperationStatu = Boolean.FALSE; } } // 零件计划是A,且不为首检,需要ifs移库 if (process.getPlanningMethod() != null && process.getPlanningMethod().equals("A") && !process.getApplyType().equals(Apply.FIRST_APPLY) && BooleanUtil.isFalse(stokOperationStatu)) { Part part = partMapper.selectById(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId()); LocationIfsMoveDTO.DataBean bean = new LocationIfsMoveDTO.DataBean(); Location location = locationMapper.selectById(locationId); Location toLocation = locationMapper.selectById(toLocationId); bean.setPART_NO(part.getPartNo()); if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { bean.setLOT_BATCH_NO(process.getIfsBatchNo()); bean.setWAIV_DEV_REJ_NO(process.getOutBatchNo()); } else { bean.setLOT_BATCH_NO("*"); bean.setWAIV_DEV_REJ_NO("*"); } bean.setMOVE_QTY(process.getUnqualifiedQuantity()); bean.setLOCATION_NO(location.getIfsLocation()); bean.setTO_LOCATION_NO(toLocation.getIfsLocation()); beanList.add(bean); } } if (beanList.size() > 0) { R response = locationService.moveIfsLocation(ifsResult); if (response.getCode() == 0) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); this.update(updateWrapper.lambda().in(UnqualifiedProcess::getId, ids) .set(UnqualifiedProcess::getIfsNo, ifsResult.getRECORD_ID()) .set(UnqualifiedProcess::getState, UnqualifiedprocessStateStringValues.EXECUTED) .set(UnqualifiedProcess::getHandleTime,LocalDateTime.now())); } } else { UpdateWrapper updateWrapper = new UpdateWrapper<>(); this.update(updateWrapper.lambda().in(UnqualifiedProcess::getId, ids) .set(UnqualifiedProcess::getState, UnqualifiedprocessStateStringValues.EXECUTED) .set(UnqualifiedProcess::getHandleTime,LocalDateTime.now())); } //处理后SN号赋值 for (Long id:ids) { baseMapper.updateExecuteSn(id); } } /** * 判断是否需要移到成品待检库 *

满足以下条件,则需生成成品检,并且将库存从不合格库移到成品待检库

*

当前检测是工序检/产出尾检

*

配置了成品待检库

*

配置了成品检

* @param process * @return */ private Boolean validateMoveToPreInspection(UnqualifiedProcessDTO process) { if (!StringUtils.equals(Apply.OUTPUT_APPLY, process.getApplyType()) && !StringUtils.equals(Apply.PROCESS_APPLY, process.getApplyType())) { return Boolean.FALSE; } if (!applyPartMapper.isConfigFinishedProdTest(process.getSystemNo())) { return Boolean.FALSE; } if (null == workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(process.getSystemNo())) { return Boolean.FALSE; } return Boolean.TRUE; } @Override public boolean updateProcessResult(Long id, String processResult) { UnqualifiedProcessDTO old = this.getById(id); if (!old.getState().equals(UnqualifiedprocessStateStringValues.DRAFT)) { throw new RuntimeException("只有草稿状态才能修改"); } UnqualifiedProcessDTO update = new UnqualifiedProcessDTO(); update.setId(id); update.setProcessResult(processResult); if (processResult.equals(UnqualifiedprocessStateStringValues.RESULT_PASS)) { update.setState(UnqualifiedprocessStateStringValues.ACCEPTED); } else if (processResult.equals(UnqualifiedprocessStateStringValues.RESULT_REJECT)) { update.setState(UnqualifiedprocessStateStringValues.REJECT); } baseMapper.updateById(update); execute(update.getId()); return true; } public Map checkLocation(String systemNo) { Map result = new HashMap<>(); Long disqualifiedLocationId = workstationLocationMapper.selectBySystemNo(systemNo, WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 Long pendingLocationId = workstationLocationMapper.selectBySystemNo(systemNo, WorkstationLocation.PENDING_LOCATION);//检测待处理库位 Long qualifiedLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(systemNo);// 合格库位 if (disqualifiedLocationId == null || pendingLocationId == null || qualifiedLocationId == null) { throw new RuntimeException("该工作站未设置库位,无法执行!"); } result.put(WorkstationLocation.DISQUALIFIED_LOCATION, disqualifiedLocationId); result.put(WorkstationLocation.PENDING_LOCATION, pendingLocationId); result.put(WorkstationLocation.QUALIFIED_LOCATION, qualifiedLocationId); return result; } public void execute(Long id) { List list = this.baseMapper.getExecuteList(Arrays.asList(id)); if (list.isEmpty()) { throw new RuntimeException("无可处理数据"); } Map> collect = list.stream().collect(Collectors.groupingBy(UnqualifiedProcess::getProcessMode)); if (collect.size() > 1) { throw new RuntimeException("处理方式不一致,无法一起执行"); } LocationIfsMoveDTO ifsResult = new LocationIfsMoveDTO(); ifsResult.setRECORD_ID(UUID.randomUUID().toString().replace("-", "")); List beanList = new ArrayList<>(); ifsResult.setBATCH_INFO(beanList); for (UnqualifiedProcessDTO process : list) { Map locationMap = checkLocation(process.getSystemNo()); Long locationId = null; Long toLocationId = null; // 报废不变动 // 返工 if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REWORK) || process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REPAIR)) { // 不合格库位移动到检测待处理库位 locationId = locationMap.get(WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 toLocationId = locationMap.get(WorkstationLocation.PENDING_LOCATION);//检测待处理库位 if (locationId == null || toLocationId == null) { throw new RuntimeException("该工作站未设置库位,无法执行!"); } // 移库 stockUtils.localMove(process.getPartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId); // 让步放行 } else if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_ALLOW)) { // 不合格品库移动到合格库 locationId = locationMap.get(WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 toLocationId = locationMap.get(WorkstationLocation.QUALIFIED_LOCATION); // 合格库位 if (locationId == null || toLocationId == null) { throw new RuntimeException("该工作站未设置库位,无法执行!"); } // 移库 stockUtils.localMove(process.getPartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId); } else { continue; } List stockOperationStatus = stockMapper.getStockOperationStatus(process.getOutBatchNo(), process.getPartId(), process.getSystemNo()); Boolean stokOperationStatu = stockOperationStatus.get(0); if (null == stokOperationStatu) { Part part = partMapper.selectById(process.getPartId()); if (StringUtils.equals(part.getMaterialType(), "3")) { stokOperationStatu = Boolean.FALSE; } } // 零件计划是A需要ifs移库 if (process.getPlanningMethod() != null && process.getPlanningMethod().equals("A") && BooleanUtil.isFalse(stokOperationStatu)) { Part part = partMapper.selectById(process.getPartId()); LocationIfsMoveDTO.DataBean bean = new LocationIfsMoveDTO.DataBean(); Location location = locationMapper.selectById(locationId); Location toLocation = locationMapper.selectById(toLocationId); bean.setPART_NO(process.getPartNo()); if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { bean.setLOT_BATCH_NO(process.getIfsBatchNo()); bean.setWAIV_DEV_REJ_NO(process.getOutBatchNo()); } else { bean.setLOT_BATCH_NO("*"); bean.setWAIV_DEV_REJ_NO("*"); } bean.setMOVE_QTY(process.getUnqualifiedQuantity()); bean.setLOCATION_NO(location.getLocNo()); bean.setTO_LOCATION_NO(toLocation.getLocNo()); beanList.add(bean); } } if (beanList.size() > 0) { R response = locationService.moveIfsLocation(ifsResult); if (response.getCode() == 0) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); this.update(updateWrapper.lambda().eq(UnqualifiedProcess::getId, id).set(UnqualifiedProcess::getIfsNo, ifsResult.getRECORD_ID())); } } } private String getWorkShopNumber(String workShop) { switch (workShop) { case "漏缆车间" : return "5"; case "馈线车间" : return "6"; case "信号缆车间" : return "7"; case "高温缆车间" : return "8"; case "跳线车间" : return "9"; case "光电混合缆车间" : return "10"; case "机车缆车间" : return "11"; } return ""; } @Override public void partDegrade(Long id,Long partId){ //零件满足是库存件且非工序库存,处理方式为返工返修,执行操作之后允许进行降级操作 UnqualifiedProcessDTO unqualifiedProcessDTO = baseMapper.getById(id); if(!"05executed".equals(unqualifiedProcessDTO.getState())){ throw new RuntimeException("执行操作之后才允许进行降级操作"); } List stockOperationStateList = stockMapper.getStockOperationStatus(unqualifiedProcessDTO.getLotBatchNo(), unqualifiedProcessDTO.getPartId(),unqualifiedProcessDTO.getSystemNo()); Boolean stockOperationState = true; if(CollectionUtils.isNotEmpty(stockOperationStateList)){ stockOperationState = stockOperationStateList.get(0); } Part part = partMapper.selectById(unqualifiedProcessDTO.getPartId()); if(!"A".equals(part.getPlanningMethod()) || stockOperationState || !"2".equals(unqualifiedProcessDTO.getProcessMode())){ throw new RuntimeException("零件需满足是库存件且非工序库存,处理方式为返工返修"); } //实时库存变更零件 List stockList = stockMapper.selectList(Wrappers.lambdaQuery().eq(Stock::getPartBatchNo, unqualifiedProcessDTO.getLotBatchNo()) .eq(Stock::getSystemNo, unqualifiedProcessDTO.getSystemNo()) .eq(Stock::getPartId, unqualifiedProcessDTO.getPartId()) .gt(Stock::getStockQuantity, BigDecimal.ZERO)); if(CollectionUtil.isEmpty(stockList)){ throw new RuntimeException("实时库存找不到该条记录"); } Stock stock = stockList.get(0); BigDecimal stockQuantityMove = stock.getStockQuantity(); //库存事务 //库存发放 stockUtils.updateById(stock.getId(), stockQuantityMove.negate(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "STOCK"); StockDTO issueStockDTO = new StockDTO(); BeanUtil.copyProperties(stock,issueStockDTO); List issueStockDTOList = new ArrayList<>(); issueStockDTO.setAdjustType("Issue"); issueStockDTO.setAdjustMemo("库存发放"); issueStockDTOList.add(issueStockDTO); stockService.inventAdjustForRfcable(issueStockDTOList,"Issue", "R01"); //库存调整 stock.setPartId(partId); stockMapper.updateById(stock); //库存接收 stockUtils.updateById(stock.getId(), stockQuantityMove, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE"); StockDTO receiveStockDTO = new StockDTO(); BeanUtil.copyProperties(stock,receiveStockDTO); List receiveStockDTOList = new ArrayList<>(); receiveStockDTO.setAdjustType("Issue"); receiveStockDTO.setAdjustMemo("库存发放"); receiveStockDTOList.add(receiveStockDTO); stockService.inventAdjustForRfcable(receiveStockDTOList,"Issue", "R01"); //不合格处理变更零件 UnqualifiedProcess updateProcess = new UnqualifiedProcess(); updateProcess.setId(id); updateProcess.setDegradePartId(partId); baseMapper.updateById(updateProcess); } @Override public Boolean examineApprove(UnqualifiedProcessDTO unqualifiedProcessDTO) { ZttUser currentUser = SecurityUtils.getUser(); Staff staff = staffMapper.selectOne(Wrappers.lambdaQuery().eq(Staff::getStaffNo, currentUser.getUsername())); //查找审核人 List qualityCheckConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.lambdaQuery() .eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop()) .eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType()) .orderByDesc(QualityUnqualifiedConfiguration::getCreateTime)); //判断是否有审批权限 if(CollectionUtil.isNotEmpty(qualityCheckConfigurationList)){ if(staff==null){ throw new RuntimeException("没有审批权限"); } String examiner = qualityCheckConfigurationList.get(0).getExaminer(); boolean b = examiner.contains(staff.getStaffName()); if(!b){ throw new RuntimeException("没有审批权限"); } } if (!UnqualifiedprocessStateStringValues.DRAFT.equals(unqualifiedProcessDTO.getState())) { throw new RuntimeException("当前状态无法审批"); } if(UnqualifiedprocessStateStringValues.RESULT_PASS.equals(unqualifiedProcessDTO.getProcessResult())){ unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.ACCEPTED); }else { unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.DRAFT); unqualifiedProcessDTO.setExamineTime(LocalDateTime.now()); baseMapper.updateById(unqualifiedProcessDTO); } //查找执行人 List qualityUnqualifiedConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.lambdaQuery() .eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop()) .eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType()) .eq(QualityUnqualifiedConfiguration::getProcessMode, unqualifiedProcessDTO.getProcessMode()) .orderByDesc(QualityUnqualifiedConfiguration::getCreateTime)); if(CollectionUtil.isNotEmpty(qualityUnqualifiedConfigurationList)){ unqualifiedProcessDTO.setHandler(qualityUnqualifiedConfigurationList.get(0).getHandler()); } unqualifiedProcessDTO.setExamineTime(LocalDateTime.now()); baseMapper.updateById(unqualifiedProcessDTO); //企业微信通知 UnqualifiedProcessDTO processDTO = baseMapper.getById(unqualifiedProcessDTO.getId()); if(StringUtils.isNotBlank(processDTO.getHandler())) { remindExamine(processDTO, 2); } return true; } //微信消息提醒 public Boolean remindExamine(UnqualifiedProcessDTO unqualifiedProcessDTO,Integer type){ if("1".equals(unqualifiedProcessDTO.getType())){ unqualifiedProcessDTO.setType("半成品"); }else if("2".equals(unqualifiedProcessDTO.getType())){ unqualifiedProcessDTO.setType("成品"); } //type为1发送审核通知,type为2发送执行通知 List userNameList = null; String commonString = ""; if(type ==1) { userNameList = Arrays.asList(unqualifiedProcessDTO.getExaminer().split(" ")); commonString = "您好,以下不合格处理待评审,请及时处理:
"; }else if(type ==2){ userNameList = Arrays.asList(unqualifiedProcessDTO.getHandler().split(" ")); commonString = "您好,以下不合格处理待执行,请及时处理:
"; } List staffList = staffMapper.selectList(Wrappers.lambdaQuery().in(Staff::getStaffName, userNameList)); List staffNoList = staffList.stream().map(Staff::getStaffNo).collect(Collectors.toList()); StringBuilder builder = new StringBuilder(commonString); builder.append("不合格编号:").append(unqualifiedProcessDTO.getProcessNo()).append("
") .append("种类:").append(unqualifiedProcessDTO.getType()).append("
") .append("车间:").append(unqualifiedProcessDTO.getWorkShop()).append("
") .append("工序:").append(unqualifiedProcessDTO.getOperationName()).append("
") .append("机台:").append(unqualifiedProcessDTO.getWorkstationName()).append("
") .append("零件编号:").append(unqualifiedProcessDTO.getPartNo()).append("
") .append("产品缆号:").append(unqualifiedProcessDTO.getLotBatchNo()).append("
") .append("不合格数量:").append(unqualifiedProcessDTO.getUnqualifiedArrived()).append("
") .append("不合格情况:").append(unqualifiedProcessDTO.getCorrectiveMeasures()).append("
") .append("评审意见:").append(unqualifiedProcessDTO.getExamineIdea()).append("
") .append("发起人:").append(unqualifiedProcessDTO.getStaffName()).append("
") .append("发起时间:").append(unqualifiedProcessDTO.getCreateTime()).append("
"); WechatMsgTips.sendOaNotice(staffNoList, builder.toString(), "MES消息提醒:"); return true; } }