From 5944f19e61e9ee4fcf5ffb85623610300d78f3b6 Mon Sep 17 00:00:00 2001 From: yangmaofu Date: Fri, 3 Apr 2026 16:32:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=88=97=E8=A1=A8=E6=92=A4?= =?UTF-8?q?=E5=9B=9E=E5=8F=96=E6=B6=88=E9=A2=86=E5=8F=96=EF=BC=8C=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=88=97=E8=A1=A8=E6=B7=BB=E5=8A=A0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lims/controller/ExamineController.java | 211 +++++++++++++++++- .../lims/service/IExamineService.java | 9 + .../lims/service/impl/ExamineServiceImpl.java | 67 ++++++ 3 files changed, 286 insertions(+), 1 deletion(-) diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java index 9be3397..de7d05e 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/controller/ExamineController.java @@ -1,6 +1,9 @@ package org.springblade.lims.controller; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -9,7 +12,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; +import org.apache.http.client.utils.DateUtils; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; @@ -17,6 +22,8 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.StringUtil; import org.springblade.lims.ao.CommonAo; import org.springblade.lims.entry.*; +import org.springblade.lims.excel.ExamineExcel; +import org.springblade.lims.excel.ExamineExportExcel; import org.springblade.lims.service.*; import org.springblade.system.cache.DictBizCache; import org.springblade.system.enums.DictBizEnum; @@ -25,6 +32,7 @@ import org.springblade.system.user.entity.User; import org.springblade.system.user.feign.IUserClient; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; @@ -281,8 +289,22 @@ public class ExamineController extends BladeController { public R> list(Examine examine, Query query) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); String dept = sysClient.getParamValue("is_limit_by_dept").getData(); + + //修改前 +// if ("1".equals(dept) || dept == null) { +// wrapper.eq(Examine::getDeptId, examine.getDeptId()); +// } + + //修改后 if ("1".equals(dept) || dept == null) { - wrapper.eq(Examine::getDeptId, examine.getDeptId()); + //判断部门是否为空 + if(examine.getDeptId() != null){ + wrapper.eq(Examine::getDeptId, examine.getDeptId()); + } + } + //验收编号 + if(StringUtil.isNotBlank(examine.getAcceptanceNum())){ + wrapper.eq(Examine::getAcceptanceNum, examine.getAcceptanceNum()); } //待领取 if ("000".equals(examine.getEntrustStatus())) { @@ -325,6 +347,10 @@ public class ExamineController extends BladeController { } + } + //添加时间范围查询 + if(StringUtil.isNotBlank(examine.getStartTime()) && StringUtil.isNotBlank(examine.getEndTime())){ + wrapper.between(Examine::getCreateTime, examine.getStartTime(), examine.getEndTime()); } wrapper.orderByDesc(Examine::getCreateTime); // 1. 手动构建分页对象,关闭自动count @@ -345,11 +371,16 @@ public class ExamineController extends BladeController { ExamineItem byId = examineItemService.getById(examineItemId); ExamineWay byId1 = examineWayService.getById(examineWayId); ExamineBasis byId2 = examineBasisService.getById(examineBasisId); + QueryWrapper resultQueryWrapper = new QueryWrapper<>(); + resultQueryWrapper.eq("examine_id", record.getId()); + ExamineResult examineResult = examineResultService.getOne(resultQueryWrapper, false); + record.setExamineResult(examineResult); if (byId != null) { record.setExamineItemName(byId.getName()); } if (byId1 != null) { record.setExamineWayName(byId1.getName()); + record.setInputMode(byId1.getInputMode()); } if (byId2 != null) { record.setExamineBasisName(byId2.getName()); @@ -447,4 +478,182 @@ public class ExamineController extends BladeController { public R batchUpdate(@RequestBody Simple simple) { return R.status(examineService.batchUpdate(simple)); } + + /** + * @MethodName: receiveRevoke + * @Annotation: 撤回领取 + * @author: YangMaoFu + * @date: 2026/3/26 15:51 + * @Version: 1.0 + */ + @PostMapping("/receiveRevoke") + @ApiOperation(value = "撤回领取", notes = "撤回已领取的检验任务") + public R receiveRevoke(@RequestParam String id) { + try { + examineService.receiveRevoke(id); + return R.success("撤回成功"); + } catch (Exception e) { + return R.fail(e.getMessage()); + } + } + + + /** + * 单个任务取消 + */ + @PostMapping("/cancelExamine") + public R cancelExamine(@RequestBody Examine examine) { + try { + //先更新检测表中状态 + examineService.updateById(examine); + // 获取委托单对应所有检测数据 + Examine examineInfo = examineService.getById(examine.getId()); + Long entrustId = examineInfo.getEntrustId(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("entrust_id", entrustId); + List list = examineService.list(queryWrapper); + // 通过数量 + int tgNum = 0; + //计数器计算校核通过的检测 + for (Examine examine1 : list) { + if (examine1.getStatus() == 1 || examine1.getStatus() == 2) { + tgNum += 1; + } + } + //判断是否为最后一条检测,如果全部通过修改委托单为审核通过状态 + if (tgNum == list.size()) { + Entrust entrust = service.getById(entrustId); + entrust.setEntrustStatus("8"); + service.updateById(entrust); + } + return R.success("操作成功"); + } catch (Exception e) { + return R.fail("操作失败:" + e.getMessage()); + } + } + + + @GetMapping("/exportExamineList") + public void exportExamineList(Examine examine, Query query, HttpServletResponse response + ) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + String dept = sysClient.getParamValue("is_limit_by_dept").getData(); + + if ("1".equals(dept) || dept == null) { + //判断部门是否为空 + if(examine.getDeptId() != null){ + wrapper.eq(Examine::getDeptId, examine.getDeptId()); + } + } + //验收编号 + if(StringUtil.isNotBlank(examine.getAcceptanceNum())){ + wrapper.eq(Examine::getAcceptanceNum, examine.getAcceptanceNum()); + } + //待领取 + if ("000".equals(examine.getEntrustStatus())) { + wrapper.eq(Examine::getIsDistribute, 0) + .eq(Examine::getStatus, 0); + } + //待检测 + if ("111".equals(examine.getEntrustStatus())) { + wrapper.eq(Examine::getIsFinished, "-1") + .eq(Examine::getStatus, 0) + .eq(Examine::getIsDistribute, 1); + } + //待审核 + if ("3".equals(examine.getEntrustStatus())) { + wrapper.eq(Examine::getIsFinished, "1") + .eq(Examine::getStatus, 0); + } + //审核通过 + if ("4".equals(examine.getEntrustStatus())) { + wrapper.eq(Examine::getStatus, 1); + } + //审核作废 + if ("-1".equals(examine.getEntrustStatus())) { + wrapper.eq(Examine::getStatus, -1); + } + // 模糊查询 + + if (examine.getSimpleName() != null && !examine.getSimpleName().trim().isEmpty()) { + String[] keywords = examine.getSimpleName().trim().split("\\s+"); + + // 遍历每个关键词,每个关键词都要满足「匹配simpleName 或 匹配t_examine_item.name」 + for (String keyword : keywords) { + if (keyword.isEmpty()) { + continue; // 跳过空的关键词(比如连续空格导致的空字符串) + } + wrapper.and(w -> w.like(Examine::getSimpleName, keyword) // 匹配主表simpleName + .or() // 匹配关联的t_examine_item.name + .exists("SELECT 1 FROM t_examine_item t WHERE t.id = examine_item_id AND t.name LIKE '%" + keyword + "%'")); + } + + + } + //添加时间范围查询 + if(StringUtil.isNotBlank(examine.getStartTime()) && StringUtil.isNotBlank(examine.getEndTime())){ + wrapper.between(Examine::getCreateTime, examine.getStartTime(), examine.getEndTime()); + } + wrapper.orderByDesc(Examine::getCreateTime); + List records = examineService.list(wrapper); + if (records.size() > 0 && records != null) { + for (Examine record : records) { + Long examineItemId = record.getExamineItemId(); + Long examineWayId = record.getExamineWayId(); + Long examineBasisId = record.getExamineBasisId(); + ExamineItem byId = examineItemService.getById(examineItemId); + ExamineWay byId1 = examineWayService.getById(examineWayId); + ExamineBasis byId2 = examineBasisService.getById(examineBasisId); + QueryWrapper resultQueryWrapper = new QueryWrapper<>(); + resultQueryWrapper.eq("examine_id", record.getId()); + ExamineResult examineResult = examineResultService.getOne(resultQueryWrapper); + record.setExamineResult(examineResult); + if (byId != null) { + record.setExamineItemName(byId.getName()); + } + if (byId1 != null) { + record.setExamineWayName(byId1.getName()); + record.setInputMode(byId1.getInputMode()); + } + if (byId2 != null) { + record.setExamineBasisName(byId2.getName()); + } + if (record.getExamineBy() != null && !"".equals(record.getExamineBy())) { + R userR = userClient.userInfoById(Long.valueOf(record.getExamineBy())); + record.setExamineByName(userR.getData().getName()); + } + } + } + + List list = records.stream().map(m -> { + ExamineExportExcel examineExportExcel = new ExamineExportExcel(); + examineExportExcel.setExamineItemName(m.getExamineItemName()); + examineExportExcel.setSimpleName(m.getSimpleName()); + examineExportExcel.setExperieNum(m.getExperieNum()); + examineExportExcel.setSimpleCount(String.valueOf(m.getSimpleCount())); + + examineExportExcel.setExamineWayName(m.getExamineWayName()); + examineExportExcel.setExamineBasisName(m.getExamineBasisName()); + examineExportExcel.setDemandCompletionTime(DateUtils.formatDate(m.getDemandCompletionTime(), "yyyy-MM-dd HH:mm:ss")); + examineExportExcel.setCreateTime(DateUtils.formatDate(m.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + examineExportExcel.setExamineByName(m.getExamineByName()); + examineExportExcel.setSimpleCurrPlace(m.getSimpleCurrPlace()); + + if(m.getIsDistribute() == 0 && m.getStatus() != -1){ + examineExportExcel.setStatus("待领取"); + } else if(m.getStatus() == 2 && m.getStatus() != -1){ + examineExportExcel.setStatus("已取消"); + } else if(m.getIsDistribute() == 1 && m.getIsFinished().equals("-1") && m.getStatus() != -1){ + examineExportExcel.setStatus("待检测"); + } else if(m.getIsFinished().equals("1") && m.getStatus() == 0 && m.getStatus() != -1){ + examineExportExcel.setStatus("待校核"); + } else if(m.getIsFinished().equals("1") && m.getStatus() == 1 && m.getStatus() != -1){ + examineExportExcel.setStatus("校核通过"); + } else if(m.getStatus() == -1){ + examineExportExcel.setStatus("已驳回"); + } + return examineExportExcel; + }).collect(Collectors.toList());; + ExcelUtil.export(response, "检测清单统计", "检测清单", list, ExamineExportExcel.class); + } } diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineService.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineService.java index f6ef062..07c9eb1 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineService.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/IExamineService.java @@ -19,4 +19,13 @@ public interface IExamineService extends BaseService { void receiveSubmit(Examine examine) throws Exception; boolean batchUpdate(Simple simple); + + /** + * @MethodName: receiveRevoke + * @Annotation: 撤回领取 + * @author: YangMaoFu + * @date: 2026/3/26 15:50 + * @Version: 1.0 + */ + void receiveRevoke(String id) throws Exception; } diff --git a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineServiceImpl.java b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineServiceImpl.java index ccef0d8..3d3bb4c 100644 --- a/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineServiceImpl.java +++ b/lab-service/lab-lims/src/main/java/org/springblade/lims/service/impl/ExamineServiceImpl.java @@ -309,4 +309,71 @@ public class ExamineServiceImpl extends BaseServiceImpl } return newNum; } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveRevoke(String id) throws Exception { + Examine examine = this.getById(id); + if (examine == null) { + throw new Exception("检验记录不存在!"); + } + if (examine.getIsDistribute() != 1) { + throw new Exception("当前状态不可撤回!"); + } + // 重置本条检验记录状态为未领取 + Examine update = new Examine(); + update.setId(Long.valueOf(id)); + update.setIsDistribute(0); + update.setExamineBy(""); + update.setReceiveTime(null); + update.setLockBy(""); + update.setSimpleReceiver(""); + update.setSimpleReceiverName(""); + update.setSimpleReceiverTime(null); + this.updateById(update); + + // 同步清空同一 eTaskId 下其他未领取检验的领样人信息(领取时曾同步写入) + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Examine::getETaskId, examine.getETaskId()); + List examineList = this.list(wrapper); + boolean hasDistributed = false; + for (Examine e : examineList) { + if (e.getIsDistribute() == 1 && !e.getId().equals(id)) { + hasDistributed = true; + } else if (e.getIsDistribute() == 0 && !e.getId().equals(id)) { + // 领取时将 isDistribute==0 的同任务检验同步更新了领样信息,此处一并清空 + e.setSimpleSource(""); + e.setSimpleReceiver(""); + e.setSimpleReceiverName(""); + e.setSimpleReceiverTime(null); + } + } + this.updateBatchById(examineList); + + if (!hasDistributed) { + // 同一任务下全部撤回,子任务状态回退为 0(待领取) + ETask eTask = new ETask(); + eTask.setId(examine.getETaskId()); + eTask.setStatus(0); + eTask.setSimpleSource(""); + eTask.setSimpleReceiver(""); + eTask.setSimpleReceiverName(""); + eTask.setSimpleReceiveTime(null); + taskService.updateById(eTask); + } + + // 清空收样登记表(ContractSample)中的领样人信息(领取时若为空则写入,撤回时对应清空) + LambdaQueryWrapper cqw = new LambdaQueryWrapper<>(); + cqw.eq(ContractSample::getEntrustId, examine.getEntrustId()); + List contractSamples = contractSampleService.list(cqw); + if (CollectionUtils.isNotEmpty(contractSamples)) { + for (ContractSample contractSample : contractSamples) { + contractSample.setSampleReceiver(""); + contractSample.setSampleReceiverName(""); + contractSample.setSampleReceiverTime(null); + } + contractSampleService.updateBatchById(contractSamples); + } + } }