| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.gkhy.exam.common.api.CommonPage; |
| | | import com.gkhy.exam.common.api.CommonResult; |
| | | import com.gkhy.exam.common.constant.UserConstant; |
| | | import com.gkhy.exam.common.exception.ApiException; |
| | | import com.gkhy.exam.common.utils.PageUtils; |
| | | import com.gkhy.exam.common.utils.SecurityUtils; |
| | | import com.gkhy.exam.system.domain.AnnualVerificationDevice; |
| | | import com.gkhy.exam.system.domain.AnnualVerificationPlan; |
| | | import com.gkhy.exam.system.domain.OutsourcedReview; |
| | | import com.gkhy.exam.system.domain.OutsourcedReviewSubsidiary; |
| | | import com.gkhy.exam.system.mapper.AnnualVerificationDeviceMapper; |
| | | import com.gkhy.exam.system.mapper.AnnualVerificationPlanMapper; |
| | | import com.gkhy.exam.system.service.AnnualVerificationPlanService; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | if (ObjectUtils.isEmpty(annualVerificationDevices)){ |
| | | return CommonResult.failed("保存参数不能为空"); |
| | | } |
| | | |
| | | LambdaQueryWrapper<AnnualVerificationPlan> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE); |
| | | queryWrapper.eq(AnnualVerificationPlan::getCompanyId, annualVerificationPlan.getCompanyId()); |
| | | int i = 0; |
| | | if (annualVerificationPlan.getId() == null){ |
| | | queryWrapper.eq(AnnualVerificationPlan::getYear, annualVerificationPlan.getYear()); |
| | | Long l = annualVerificationPlanMapper.selectCount(queryWrapper); |
| | | if (l > 0){ |
| | | return CommonResult.failed("该年度计划已存在"); |
| | | } |
| | | annualVerificationPlan.setCreateBy(SecurityUtils.getUsername()); |
| | | annualVerificationPlan.setCreateTime(LocalDateTime.now()); |
| | | i = annualVerificationPlanMapper.insert(annualVerificationPlan); |
| | | }else { |
| | | queryWrapper.eq(AnnualVerificationPlan::getYear, annualVerificationPlan.getYear()); |
| | | queryWrapper.ne(AnnualVerificationPlan::getId, annualVerificationPlan.getId()); |
| | | Long l = annualVerificationPlanMapper.selectCount(queryWrapper); |
| | | if (l > 0){ |
| | | return CommonResult.failed("该年度计划已存在"); |
| | | } |
| | | annualVerificationPlan.setUpdateTime(LocalDateTime.now()); |
| | | annualVerificationPlan.setUpdateBy(SecurityUtils.getUsername()); |
| | | i = annualVerificationPlanMapper.updateById(annualVerificationPlan); |
| | |
| | | .in(AnnualVerificationDevice::getId, delData) |
| | | ); |
| | | if (update <= 0){ |
| | | throw new RuntimeException("操作失败"); |
| | | throw new ApiException("操作失败"); |
| | | } |
| | | } |
| | | annualVerificationDevices.forEach(annualVerificationDevice -> { |
| | |
| | | |
| | | return CommonResult.success(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult copyAnnualVerificationPlan(Integer companyId, String sourceYear, String targetYear) { |
| | | if (ObjectUtils.isEmpty(sourceYear) || ObjectUtils.isEmpty(targetYear)) { |
| | | return CommonResult.failed("源年份和目标年份不能为空"); |
| | | } |
| | | |
| | | if (ObjectUtils.isEmpty(companyId)) { |
| | | return CommonResult.failed("公司ID不能为空"); |
| | | } |
| | | |
| | | if (sourceYear.equals(targetYear)) { |
| | | return CommonResult.failed("源年份和目标年份不能相同"); |
| | | } |
| | | |
| | | LambdaQueryWrapper<AnnualVerificationPlan> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE) |
| | | .eq(AnnualVerificationPlan::getCompanyId, companyId) |
| | | .eq(AnnualVerificationPlan::getYear, sourceYear); |
| | | |
| | | AnnualVerificationPlan sourcePlan = annualVerificationPlanMapper.selectOne(queryWrapper); |
| | | if (sourcePlan == null) { |
| | | return CommonResult.failed("未找到源年份的年度检定计划"); |
| | | } |
| | | |
| | | LambdaQueryWrapper<AnnualVerificationPlan> checkWrapper = new LambdaQueryWrapper<>(); |
| | | checkWrapper.eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE) |
| | | .eq(AnnualVerificationPlan::getCompanyId, companyId) |
| | | .eq(AnnualVerificationPlan::getYear, targetYear); |
| | | Long count = annualVerificationPlanMapper.selectCount(checkWrapper); |
| | | if (count > 0) { |
| | | return CommonResult.failed("目标年份的年度检定计划已存在"); |
| | | } |
| | | |
| | | // 检查是否存在已逻辑删除的计划,如果存在则先进行物理删除或更新(根据业务需求,这里通常意味着可以复用或需要清理) |
| | | // 但根据指令“已存在数据进行逻辑删除”,通常指如果目标年份已有数据(无论是否删除),可能需要处理。 |
| | | // 然而,标准的“逻辑删除”检查通常只针对未删除的数据。如果指令意思是“如果目标年份已有数据,将其逻辑删除后再插入”或者“检查时忽略已逻辑删除的数据”, |
| | | // 结合上下文 `copy` 操作,通常如果目标年份已有**有效**计划则禁止复制。 |
| | | // 如果指令意图是:如果目标年份存在**已逻辑删除**的数据,是否需要特殊处理? |
| | | // 重新解读指令:“已存在数据进行逻辑删除”。这可能意味着:在复制前,如果目标年份已经存在计划(即使是逻辑删除的),也应该被视为“已存在”并阻止,或者需要先清理。 |
| | | // 但更常见的场景是:如果目标年份存在**未删除**的计划,则报错。如果存在**已删除**的计划,可能允许覆盖或报错。 |
| | | // 让我们看原代码逻辑:它只检查了 `ENABLE` 状态。 |
| | | // 如果指令的意思是“对于已存在的数据(指目标年份的计划),执行逻辑删除操作”,这在 copy 场景中不太合理,因为 copy 是创建新数据。 |
| | | // 另一种理解:指令可能是指在检查是否存在时,也要考虑那些已经被逻辑删除的数据?不,通常 `del_flag` 为 disable 的就是被删除的。 |
| | | // 再仔细看图和常见业务:如果目标年份有一个**已被逻辑删除**的计划,是否允许再次复制生成一个新的? |
| | | // 如果指令是“已存在数据进行逻辑删除”,这可能是指:如果查询到目标年份有数据(不管状态),都视为冲突?或者,如果存在旧数据,先把它逻辑删除? |
| | | // 考虑到 `copy` 操作的原子性和安全性,通常如果目标年份有任何记录(包括逻辑删除的),为了避免ID冲突或数据混乱,往往不允许直接复制,或者需要更复杂的清理逻辑。 |
| | | // 但是,最直接的解读可能是:原代码只检查了 `ENABLE`,现在要求如果存在任何记录(包括已逻辑删除的),都视为“已存在”并返回失败? |
| | | // 或者,指令是说:如果目标年份存在计划,**不要**报错,而是将旧计划逻辑删除,然后继续执行复制? |
| | | // 让我们看返回值类型。方法是 `CommonResult`。如果中间执行了删除,继续执行插入,最后返回 success。 |
| | | // 这种解释更符合“已存在数据进行逻辑删除”作为**动作**的描述,而不是**检查条件**。 |
| | | // 即:如果目标年份已有计划(无论状态),先将其逻辑删除,然后再创建新的。 |
| | | |
| | | // 步骤1: 查找目标年份的所有计划(包括已删除和未删除) |
| | | LambdaQueryWrapper<AnnualVerificationPlan> existingWrapper = new LambdaQueryWrapper<>(); |
| | | existingWrapper.eq(AnnualVerificationPlan::getCompanyId, companyId) |
| | | .eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE) |
| | | .eq(AnnualVerificationPlan::getYear, targetYear); |
| | | List<AnnualVerificationPlan> existingPlans = annualVerificationPlanMapper.selectList(existingWrapper); |
| | | |
| | | // 步骤2: 如果存在,将它们逻辑删除 |
| | | if (ObjectUtils.isNotEmpty(existingPlans)) { |
| | | for (AnnualVerificationPlan plan : existingPlans) { |
| | | // 如果已经是禁用状态,跳过或更新更新时间?通常只需确保它是禁用状态 |
| | | AnnualVerificationPlan updatePlan = new AnnualVerificationPlan(); |
| | | updatePlan.setId(plan.getId()); |
| | | updatePlan.setDelFlag(UserConstant.DISENABLE); |
| | | updatePlan.setUpdateTime(LocalDateTime.now()); |
| | | updatePlan.setUpdateBy(SecurityUtils.getUsername()); |
| | | annualVerificationPlanMapper.updateById(updatePlan); |
| | | |
| | | // 同时逻辑删除关联的设备 |
| | | annualVerificationDeviceMapper.update(new AnnualVerificationDevice(), |
| | | new LambdaUpdateWrapper<AnnualVerificationDevice>() |
| | | .eq(AnnualVerificationDevice::getAnnualVerificationId, plan.getId()) |
| | | .set(AnnualVerificationDevice::getDelFlag, UserConstant.DISENABLE) |
| | | .set(AnnualVerificationDevice::getUpdateTime, LocalDateTime.now()) |
| | | .set(AnnualVerificationDevice::getUpdateBy, SecurityUtils.getUsername())); |
| | | } |
| | | |
| | | } |
| | | |
| | | List<AnnualVerificationDevice> sourceDevices = annualVerificationDeviceMapper.selectList( |
| | | new LambdaQueryWrapper<AnnualVerificationDevice>() |
| | | .eq(AnnualVerificationDevice::getAnnualVerificationId, sourcePlan.getId()) |
| | | .eq(AnnualVerificationDevice::getDelFlag, UserConstant.ENABLE) |
| | | ); |
| | | |
| | | AnnualVerificationPlan newPlan = new AnnualVerificationPlan(); |
| | | newPlan.setCompanyId(sourcePlan.getCompanyId()); |
| | | newPlan.setName(sourcePlan.getName().replace(sourceYear, targetYear)); |
| | | newPlan.setYear(targetYear); |
| | | newPlan.setEstablishmentId(sourcePlan.getEstablishmentId()); |
| | | newPlan.setEstablishmentName(sourcePlan.getEstablishmentName()); |
| | | newPlan.setEstablishmentTime(LocalDateTime.now()); |
| | | newPlan.setProcessId(sourcePlan.getProcessId()); |
| | | newPlan.setProcessName(sourcePlan.getProcessName()); |
| | | newPlan.setProcessTime(LocalDateTime.now()); |
| | | newPlan.setCertificate(sourcePlan.getCertificate()); |
| | | newPlan.setCertificateName(sourcePlan.getCertificateName()); |
| | | newPlan.setDelFlag(UserConstant.ENABLE); |
| | | newPlan.setCreateBy(SecurityUtils.getUsername()); |
| | | newPlan.setCreateTime(LocalDateTime.now()); |
| | | newPlan.setVersion(0); |
| | | |
| | | int insertResult = annualVerificationPlanMapper.insert(newPlan); |
| | | if (insertResult <= 0) { |
| | | throw new ApiException("复制年度检定计划失败"); |
| | | } |
| | | |
| | | if (ObjectUtils.isNotEmpty(sourceDevices)) { |
| | | for (AnnualVerificationDevice sourceDevice : sourceDevices) { |
| | | AnnualVerificationDevice newDevice = new AnnualVerificationDevice(); |
| | | newDevice.setAnnualVerificationId(newPlan.getId()); |
| | | newDevice.setDeviceNumber(sourceDevice.getDeviceNumber()); |
| | | newDevice.setDeviceName(sourceDevice.getDeviceName()); |
| | | newDevice.setModel(sourceDevice.getModel()); |
| | | newDevice.setCalibrationCycle(sourceDevice.getCalibrationCycle()); |
| | | LocalDateTime newNextCalibrationTime = sourceDevice.getNextCalibrationTime() |
| | | .withYear(Integer.parseInt(targetYear)); |
| | | newDevice.setNextCalibrationTime(newNextCalibrationTime); |
| | | |
| | | LocalDateTime newActCalibrationTime = sourceDevice.getActCalibrationTime() |
| | | .withYear(Integer.parseInt(targetYear)); |
| | | newDevice.setActCalibrationTime(newActCalibrationTime); |
| | | newDevice.setCalibrationUser(sourceDevice.getCalibrationUser()); |
| | | newDevice.setUseUser(sourceDevice.getUseUser()); |
| | | newDevice.setStatus(sourceDevice.getStatus()); |
| | | newDevice.setPlanType(sourceDevice.getPlanType()); |
| | | newDevice.setCertificate(sourceDevice.getCertificate()); |
| | | newDevice.setCertificateName(sourceDevice.getCertificateName()); |
| | | newDevice.setDelFlag(UserConstant.ENABLE); |
| | | newDevice.setCreateBy(SecurityUtils.getUsername()); |
| | | newDevice.setCreateTime(LocalDateTime.now()); |
| | | newDevice.setVersion(0); |
| | | |
| | | int deviceInsertResult = annualVerificationDeviceMapper.insert(newDevice); |
| | | if (deviceInsertResult <= 0) { |
| | | throw new ApiException("复制设备信息失败"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return CommonResult.success("复制成功"); |
| | | } |
| | | |
| | | |
| | | } |