/* * Copyright (c) 2018-2025, ztt All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the pig4cloud.com developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: ztt */ package com.chinaztt.mes.quality.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.chinaztt.mes.quality.dto.ProductionInfoDTO; import com.chinaztt.mes.quality.dto.QualityMoSamplingRuleDTO; import com.chinaztt.mes.quality.entity.Report; import com.chinaztt.mes.quality.entity.ReportSamplingRecord; import com.chinaztt.mes.quality.mapper.ReportMapper; import com.chinaztt.mes.quality.mapper.ReportSamplingRecordMapper; import com.chinaztt.mes.quality.service.ReportSamplingRecordService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Objects; /** * 检测汇报抽检记录 * * @author shz * @date 2023-04-14 10:59:13 */ @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class ReportSamplingRecordServiceImpl extends ServiceImpl implements ReportSamplingRecordService { private ReportMapper reportMapper; @Override public Long generateSamplingRecord(String systemNo, Long reportId, String applyType) { // 根据系统号获取生产相关信息 ProductionInfoDTO productionInfo = this.baseMapper.getProductionInfo(systemNo); if (productionInfo == null) { return null; } // 查询是否存在抽检规则 QualityMoSamplingRuleDTO moSamplingRule = this.baseMapper.getMoSamplingRule(productionInfo.getMoId(), productionInfo.getMoRoutingOperationId(), applyType); if (moSamplingRule == null) { return null; } // 找出该产出符合条件的投入批次 String inputOutBatchNo = this.baseMapper.getInputOutBatchNo(productionInfo.getProductMainId(), moSamplingRule.getRetrospectOperationId()); if (inputOutBatchNo == null) { return null; } // 存在相关抽检记录,更新抽检记录相关次数,否则新增抽检记录 ReportSamplingRecord reportSamplingRecord = this.baseMapper.selectOne(Wrappers.lambdaQuery() .eq(ReportSamplingRecord::getMoId, productionInfo.getMoId()) .eq(ReportSamplingRecord::getMoSamplingRuleId, moSamplingRule.getId()) .eq(ReportSamplingRecord::getOutBatchNo, inputOutBatchNo) .ne(ReportSamplingRecord::getCheckedNum, moSamplingRule.getSamplingDenominator()) .last("LIMIT 1")); if (reportSamplingRecord != null) { // 判断是否满足继承条件 if (reportSamplingRecord.getSamplingNum() > 0 && judgeInherit(reportSamplingRecord)) { boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(reportSamplingRecord.getId(), 1, null, null, reportSamplingRecord.getVersion())); if (!updateResult) { throw new RuntimeException("更新抽检记录失败请重试"); } this.reportMapper.update(null, Wrappers.lambdaUpdate() .set(Report::getSamplingRecordId, reportSamplingRecord.getId()) .set(Report::getSamplingCorrectState, true) .eq(Report::getId, reportId)); return reportSamplingRecord.getReportId(); } } else { // 新增抽检记录 ReportSamplingRecord newReportSamplingRecord = new ReportSamplingRecord(); newReportSamplingRecord.setMoSamplingRuleId(moSamplingRule.getId()); newReportSamplingRecord.setMoId(productionInfo.getMoId()); newReportSamplingRecord.setReportId(reportId); newReportSamplingRecord.setOutBatchNo(inputOutBatchNo); newReportSamplingRecord.setSamplingNum(0); newReportSamplingRecord.setCheckedNum(0); newReportSamplingRecord.setVersion(0); newReportSamplingRecord.setSamplingDenominator(moSamplingRule.getSamplingDenominator()); newReportSamplingRecord.setSamplingNumerator(moSamplingRule.getSamplingNumerator()); newReportSamplingRecord.setSamplingPosition(moSamplingRule.getSamplingPosition()); this.save(newReportSamplingRecord); // this.reportMapper.update(null, Wrappers.lambdaUpdate() // .set(Report::getSamplingRecordId, newReportSamplingRecord.getId()) // .set(Report::getSamplingCorrectState, false) // .eq(Report::getId, reportId)); } return null; } private boolean judgeInherit(ReportSamplingRecord reportSamplingRecord) { // 检测数量还不满足,则需要判断是否继承 if (!reportSamplingRecord.getSamplingNum().equals(reportSamplingRecord.getSamplingNumerator())) { // 获取目前已检测次数 Integer count = this.reportMapper.selectCount(Wrappers.lambdaQuery().eq(Report::getSamplingRecordId, reportSamplingRecord.getId())); int samplingPosition = Integer.parseInt(reportSamplingRecord.getSamplingPosition().split(",")[reportSamplingRecord.getSamplingNum()]); if (count + 1 < samplingPosition) { return true; } } else { return true; } return false; } @Override public Long addSamplingRecordNum(String systemNo, Long reportId, String applyType) { Report report = this.reportMapper.selectById(reportId); if (report.getSamplingRecordId() != null) { ReportSamplingRecord record = this.baseMapper.selectById(report.getSamplingRecordId()); ReportSamplingRecord newRecord = this.getOne(Wrappers.lambdaQuery() .eq(ReportSamplingRecord::getMoId, record.getMoId()) .eq(ReportSamplingRecord::getMoSamplingRuleId, record.getMoSamplingRuleId()) .eq(ReportSamplingRecord::getOutBatchNo, record.getOutBatchNo()) .ne(ReportSamplingRecord::getCheckedNum, record.getSamplingDenominator()) .last("LIMIT 1")); if (newRecord != null) { boolean flag = false; // 抽检数量不满足,则抽检也许新增次数 if (!newRecord.getSamplingNum().equals(newRecord.getSamplingNumerator())) { boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(newRecord.getId(), 1, 1, reportId, newRecord.getVersion())); newRecord.setReportId(reportId); if (!updateResult) { throw new RuntimeException("更新抽检记录失败请重试"); } } else { boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(newRecord.getId(), 1, null, null, newRecord.getVersion())); flag = true; if (!updateResult) { throw new RuntimeException("更新抽检记录失败请重试"); } } this.reportMapper.update(null, Wrappers.lambdaUpdate() .set(Report::getSamplingRecordId, newRecord.getId()) .set(Report::getSamplingCorrectState, true) .eq(Report::getId, reportId)); if (flag) { return newRecord.getReportId(); } } else { // 新增抽检记录 ReportSamplingRecord newReportSamplingRecord = new ReportSamplingRecord(); newReportSamplingRecord.setMoSamplingRuleId(record.getMoSamplingRuleId()); newReportSamplingRecord.setMoId(record.getMoId()); newReportSamplingRecord.setReportId(reportId); newReportSamplingRecord.setOutBatchNo(record.getOutBatchNo()); newReportSamplingRecord.setSamplingNum(1); newReportSamplingRecord.setCheckedNum(1); newReportSamplingRecord.setSamplingDenominator(record.getSamplingDenominator()); newReportSamplingRecord.setSamplingNumerator(record.getSamplingNumerator()); this.save(newReportSamplingRecord); this.reportMapper.update(null, Wrappers.lambdaUpdate() .set(Report::getSamplingRecordId, newReportSamplingRecord.getId()) .set(Report::getSamplingCorrectState, true) .eq(Report::getId, reportId)); } } return null; } @Override public void reduceSamplingRecordNum(Long id, Long reportId) { ReportSamplingRecord reportSamplingRecord = this.baseMapper.selectById(id); if (reportSamplingRecord.getCheckedNum() == 1) { this.removeById(id); return; } // 根据目前抽检次数获取当前抽检位置 int samplingPosition = Integer.parseInt(reportSamplingRecord.getSamplingPosition().split(",")[reportSamplingRecord.getSamplingNum() - 1]); Long updateReportId = null; // 如果删除的是抽检记录,则需要更新抽检记录的汇报id if (reportSamplingRecord.getReportId().equals(reportId)) { Report report = reportMapper.selectOne(Wrappers.lambdaQuery() .eq(Report::getSamplingRecordId, id) .eq(Report::getIsSubmit, true) .last("LIMIT 1")); if (report == null) { throw new RuntimeException("不存在已提交的抽检汇报记录,无法删除"); } updateReportId = report.getId(); } if (reportSamplingRecord.getCheckedNum() > samplingPosition) { baseMapper.updateSamplingRecordNum(id, -1, null, updateReportId, reportSamplingRecord.getVersion()); } else { baseMapper.updateSamplingRecordNum(id, -1, -1, updateReportId, reportSamplingRecord.getVersion()); } } @Override public void submitSamplingRecord(String systemNo, Long reportId, String applyType) { // 根据系统号获取生产相关信息 ProductionInfoDTO productionInfo = this.baseMapper.getProductionInfo(systemNo); if (productionInfo == null) { return; } // 查询是否存在抽检规则 QualityMoSamplingRuleDTO moSamplingRule = this.baseMapper.getMoSamplingRule(productionInfo.getMoId(), productionInfo.getMoRoutingOperationId(), applyType); if (moSamplingRule == null) { return; } // 找出该产出符合条件的投入批次 String inputOutBatchNo = this.baseMapper.getInputOutBatchNo(productionInfo.getProductMainId(), moSamplingRule.getRetrospectOperationId()); if (inputOutBatchNo == null) { return; } ReportSamplingRecord reportSamplingRecord = this.getOne(Wrappers.lambdaQuery() .eq(ReportSamplingRecord::getMoId, productionInfo.getMoId()) .eq(ReportSamplingRecord::getMoSamplingRuleId, moSamplingRule.getId()) .eq(ReportSamplingRecord::getOutBatchNo, inputOutBatchNo) .ne(ReportSamplingRecord::getSamplingNum, moSamplingRule.getSamplingNumerator()) .last("LIMIT 1")); if (reportSamplingRecord != null) { boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(reportSamplingRecord.getId(), 1, 1, reportId, reportSamplingRecord.getVersion())); if (!updateResult) { throw new RuntimeException("更新抽检记录失败请重试"); } this.reportMapper.update(null, Wrappers.lambdaUpdate() .set(Report::getSamplingRecordId, reportSamplingRecord.getId()) .set(Report::getSamplingCorrectState, true) .eq(Report::getId, reportId)); } } }