hyy 7 maanden geleden
bovenliggende
commit
8adbecbde0

+ 0 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java

@@ -56,7 +56,6 @@ public class FileController {
         return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), another));
     }
 
-
     @GetMapping("/presigned-url")
     @Operation(summary = "获取文件预签名地址", description = "模式二:前端上传文件:用于前端直接上传七牛、阿里云 OSS 等文件存储器")
     public CommonResult<FilePresignedUrlRespVO> getFilePresignedUrl(@RequestParam("path") String path) throws Exception {

+ 5 - 4
yudao-module-museums/yudao-module-museums-api/src/main/java/cn/iocoder/yudao/module/museums/enums/social/LogRecordConstants.java

@@ -29,8 +29,9 @@ public interface LogRecordConstants {
 //    String SYSTEM_SPECIMEN_TYPE = "MUSEUMS 标本出库单";
     String MUSEUMS_SPECIMEN_OUTBOUND_SUB_TYPE = "标本出库";
     String MUSEUMS_SPECIMEN_RETURN_SUB_TYPE = "标本回库";
-    String MUSEUMS_SPECIMEN_CREATE_OUTBOUND_SUCCESS = "创建了标本出库单【{{#specimenOutbound.id}}】, 出库标本:{{#createReqVO.infoId}},申请人: {{#createReqVO.applicantName}}, 用途: {{#createReqVO.applicationUsage}}}";
-    String MUSEUMS_SPECIMEN_UPDATE_RETURN_SUCCESS = "更新了标本回库单【{{#existingSpecimen.id}}】,  回库标本:{{#createReqVO.infoId}},标本情况: {{#existingSpecimen.specimenCondition}}, 退还人: {{#updateReqVO.returner}}, 点收人: {{#updateReqVO.receiver}}, 备注: {{#updateReqVO.remarks}}";
-    String MUSEUMS_SPECIMEN_UPDATE_RECOMPILE_SUCCESS = "修改了标本出库单【{{#updateReqVO.id}}】: 出库标本:{{#updateReqVO.infoId}},{_DIFF{#updateReqVO}}";
-    String MUSEUMS_SPECIMEN_CREATE_CONFIEM_OUTBOUND_SUCCESS = "{{#operator}}确认了标本出库,出库标本:{{#existingSpecimen.infoId}}";
+    String MUSEUMS_SPECIMEN_CREATE_OUTBOUND_SUCCESS = "创建了标本出库单【{{#specimenOutbound.id}}】,申请人: {{#createReqVO.applicantName}}, 用途: {{#createReqVO.applicationUsage}}";
+    String MUSEUMS_SPECIMEN_UPDATE_RETURN_SUCCESS = "更新了标本回库单【{{#existingSpecimen.id}}】, 标本情况: {{#existingSpecimen.specimenCondition}}, 退还人: {{#updateReqVO.returner}}, 点收人: {{#updateReqVO.receiver}}, 备注: {{#updateReqVO.remarks}}";
+    String MUSEUMS_SPECIMEN_UPDATE_RECOMPILE_SUCCESS = "修改了标本出库单【{{#updateReqVO.id}}】:{_DIFF{#updateReqVO}}";
+    String MUSEUMS_SPECIMEN_CREATE_CONFIEM_OUTBOUND_SUCCESS = "{{#operator}}确认了标本出库";
+    String MUSEUMS_SPECIMEN_APPROVE_OUTBOUND_SUCCESS = "审批结果:{{#approvalMessage}},审批人ID:{{#userId}},驳回原因:{{#processInstanceId}}{{#rejectionReasons}}";
 }

+ 0 - 3
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/photogroup/PhotoGroupController.java

@@ -123,7 +123,4 @@ public class PhotoGroupController {
         }
     }
 
-
-
-
 }

+ 12 - 14
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimenoutbound/SpecimenOutboundController.java

@@ -52,19 +52,10 @@ public class SpecimenOutboundController {
         return success(specimenOutboundService.createSpecimenOutbound(createReqVO));
     }
 
-    //用于回库表单填写(完成)
-    @PutMapping("/update")
-    @Operation(summary = "更新标本回库信息")
-    @PreAuthorize("@ss.hasPermission('museums:specimen-outbound:update')")
-    public CommonResult<Boolean> updateSpecimenOutbound(@Valid @RequestBody SpecimenOutboundReturnReqVO updateReqVO) {
-        specimenOutboundService.updateSpecimenOutbound(updateReqVO);
-        return success(true);
-    }
-
     @PostMapping("/approve")
     @Operation(summary = "标本出库审批")
     @PreAuthorize("@ss.hasPermission('museums:specimen-outbound:approve')")
-    public CommonResult<Void> approveSpecimenOutbound(@RequestBody SpecimenOutboundApprovalReqVO req) {
+    public CommonResult<Boolean> approveSpecimenOutbound(@RequestBody SpecimenOutboundApprovalReqVO req) {
         Long operatorId = getLoginUserId();
         LocalDateTime now = LocalDateTime.now();
 
@@ -88,7 +79,7 @@ public class SpecimenOutboundController {
         }
         // 调用更新状态方法
         specimenOutboundService.updateStatus(req);
-        return success(null);
+        return success(true);
     }
 
     @PutMapping("/recompile")
@@ -111,7 +102,6 @@ public class SpecimenOutboundController {
         }
     }
 
-
     @PostMapping("/confirmOutbound")
     @Operation(summary = "确认标本出库")
     @PreAuthorize("@ss.hasPermission('museums:specimen-outbound:confirm')")
@@ -120,6 +110,16 @@ public class SpecimenOutboundController {
         return success(true);
     }
 
+    //用于回库表单填写(完成)
+    @PutMapping("/update")
+    @Operation(summary = "填写标本回库单")
+    @PreAuthorize("@ss.hasPermission('museums:specimen-outbound:update')")
+    public CommonResult<Boolean> updateSpecimenOutbound(@Valid @RequestBody SpecimenOutboundReturnReqVO updateReqVO) {
+        specimenOutboundService.updateSpecimenOutbound(updateReqVO);
+        return success(true);
+    }
+
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除标本出库回库信息")
     @Parameter(name = "id", description = "编号", required = true)
@@ -241,6 +241,4 @@ public class SpecimenOutboundController {
         return success(specimenOutbound);
     }
 
-
-
 }

+ 1 - 1
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimenoutbound/vo/SpecimenOutboundReturnReqVO.java

@@ -17,7 +17,7 @@ public class SpecimenOutboundReturnReqVO {
     private Long id;
 
     @Schema(description = "关联到总表中的标本ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    private String infoId;
+    private List<String> infoId;
 
     @Schema(description = "标本情况")
     private String specimenCondition;

+ 5 - 2
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimenoutbound/vo/SpecimenOutboundSaveReqVO.java

@@ -18,7 +18,8 @@ public class SpecimenOutboundSaveReqVO {
     @Schema(description = "关联到总表中的标本ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotEmpty(message = "关联到总表中的标本ID不能为空")
     @DiffLogField(name = "关联到总表中的标本ID")
-    private String infoId;
+//    private String infoId;
+    private List<String> infoId;
 
     @Schema(description = "中文名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
 //    @NotEmpty(message = "中文名称不能为空")
@@ -57,6 +58,8 @@ public class SpecimenOutboundSaveReqVO {
     @DiffLogField(name = "预计退还时间时间")
     private LocalDateTime estimatedReturnTime;
 
+
+
 //    @Schema(description = "出库时间")
 //    private LocalDateTime outgoingTime;
 //
@@ -87,4 +90,4 @@ public class SpecimenOutboundSaveReqVO {
 //    @Schema(description = "审批员")
 //    private Long approveUsers;
 
-}
+}

+ 0 - 1
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/specimenoutbound/SpecimenOutboundService.java

@@ -105,5 +105,4 @@ public interface SpecimenOutboundService {
 
 
 
-
 }

+ 132 - 96
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/specimenoutbound/SpecimenOutboundServiceImpl.java

@@ -20,6 +20,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.museums.dal.mysql.specimenoutbound.SpecimenOutboundMapper;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -57,7 +58,12 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
 //        // 返回
 //        return specimenOutbound.getId();
 //    }
+
 //    @Override
+//    @Transactional(rollbackFor = Exception.class)
+//    @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_OUTBOUND_SUB_TYPE,
+//            bizNo = "{{#specimenOutbound.id}}", // 使用新增的出库单 ID
+//            success = MUSEUMS_SPECIMEN_CREATE_OUTBOUND_SUCCESS, extra = "{{#createReqVO.infoId}}")
 //    public Long createSpecimenOutbound(SpecimenOutboundSaveReqVO createReqVO) {
 //        // 将逗号分隔的字符串拆分为List<String>
 //        List<String> infoIds = Arrays.asList(createReqVO.getInfoId().split(","));
@@ -65,13 +71,12 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
 //        // 校验标本状态,收集有效的ID
 //        List<Long> validInfoIds = infoIds.stream()
 //                .map(infoId -> {
-//                    SpecimenInfoDO specimenInfo = specimenInfoMapper.selectById(infoId.trim()); // 去除可能的空格
+//                    SpecimenInfoDO specimenInfo = specimenInfoMapper.selectById(infoId.trim());
 //                    if (specimenInfo == null) {
 //                        throw exception(SPECIMEN_OUTBOUND_NOT_EXISTS);
 //                    }
-//                    // 判断标本是否在馆或展陈
 //                    if (specimenInfo.getCollectionStatus() == 0 || specimenInfo.getCollectionStatus() == 2) {
-//                        return Long.valueOf(infoId); // 收集符合条件的ID
+//                        return Long.valueOf(infoId);
 //                    } else {
 //                        throw exception(SPECIMEN_IS_LENDING_OUT);
 //                    }
@@ -83,8 +88,13 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
 //
 //        // 创建出库记录
 //        SpecimenOutboundDO specimenOutbound = BeanUtils.toBean(createReqVO, SpecimenOutboundDO.class);
-//        specimenOutbound.setInfoId(infoIdString); // 存储逗号分隔的标本ID
+//        specimenOutbound.setInfoId(infoIdString);
 //        specimenOutboundMapper.insert(specimenOutbound);
+//
+//        // 记录日志上下文
+//        LogRecordContext.putVariable("specimenOutbound", specimenOutbound); // 添加出库单对象
+//        LogRecordContext.putVariable("createReqVO", createReqVO); // 添加请求对象
+//
 //        // 返回出库记录ID
 //        return specimenOutbound.getId();
 //    }
@@ -92,29 +102,25 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_OUTBOUND_SUB_TYPE,
-            bizNo = "{{#specimenOutbound.id}}", // 使用新增的出库单 ID
+            bizNo = "{{#specimenOutbound.id}}",
             success = MUSEUMS_SPECIMEN_CREATE_OUTBOUND_SUCCESS, extra = "{{#createReqVO.infoId}}")
     public Long createSpecimenOutbound(SpecimenOutboundSaveReqVO createReqVO) {
-        // 将逗号分隔的字符串拆分为List<String>
-        List<String> infoIds = Arrays.asList(createReqVO.getInfoId().split(","));
-
         // 校验标本状态,收集有效的ID
-        List<Long> validInfoIds = infoIds.stream()
-                .map(infoId -> {
-                    SpecimenInfoDO specimenInfo = specimenInfoMapper.selectById(infoId.trim());
-                    if (specimenInfo == null) {
-                        throw exception(SPECIMEN_OUTBOUND_NOT_EXISTS);
-                    }
-                    if (specimenInfo.getCollectionStatus() == 0 || specimenInfo.getCollectionStatus() == 2) {
-                        return Long.valueOf(infoId);
-                    } else {
-                        throw exception(SPECIMEN_IS_LENDING_OUT);
-                    }
-                })
-                .collect(Collectors.toList());
+        List<String> validInfoIds = new ArrayList<>();
+        for (String id : createReqVO.getInfoId()) {
+            SpecimenInfoDO specimenInfo = specimenInfoMapper.selectById(id);
+            if (specimenInfo == null) {
+                throw exception(SPECIMEN_OUTBOUND_NOT_EXISTS);
+            }
+            if (specimenInfo.getCollectionStatus() == 0 || specimenInfo.getCollectionStatus() == 2) {
+                validInfoIds.add(id);
+            } else {
+                throw exception(SPECIMEN_IS_LENDING_OUT);
+            }
+        }
 
-        // 拼接info_id字符串
-        String infoIdString = String.join(",", validInfoIds.stream().map(String::valueOf).toArray(String[]::new));
+        // 将有效ID转换为字符串
+        String infoIdString = validInfoIds.toString();
 
         // 创建出库记录
         SpecimenOutboundDO specimenOutbound = BeanUtils.toBean(createReqVO, SpecimenOutboundDO.class);
@@ -122,84 +128,20 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         specimenOutboundMapper.insert(specimenOutbound);
 
         // 记录日志上下文
-        LogRecordContext.putVariable("specimenOutbound", specimenOutbound); // 添加出库单对象
-        LogRecordContext.putVariable("createReqVO", createReqVO); // 添加请求对象
+        LogRecordContext.putVariable("specimenOutbound", specimenOutbound);
+        LogRecordContext.putVariable("createReqVO", createReqVO);
 
         // 返回出库记录ID
         return specimenOutbound.getId();
     }
 
-
-    //用来填写回库表单,为方便添加数据,现在先用上面这段
-//    @Override
-//    public void updateSpecimenOutbound(SpecimenOutboundSaveReqVO updateReqVO) {
-//        // 校验存在
-//        validateSpecimenOutboundExists(updateReqVO.getId());
-//        // 更新
-//        SpecimenOutboundDO updateObj = BeanUtils.toBean(updateReqVO, SpecimenOutboundDO.class);
-//        specimenOutboundMapper.updateById(updateObj);
-//    }
-    //填写回库表单
+    //出库审批
     @Override
     @Transactional(rollbackFor = Exception.class)
-    @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_RETURN_SUB_TYPE,
-            bizNo = "{{#existingSpecimen.id}}", // 使用更新的出库单 ID
-            success = MUSEUMS_SPECIMEN_UPDATE_RETURN_SUCCESS , extra = "{{#createReqVO.infoId}}") // 定义更新成功的日志消息
-    public void updateSpecimenOutbound(SpecimenOutboundReturnReqVO updateReqVO) {
-        // 校验存在
-        validateSpecimenOutboundExists(updateReqVO.getId());
-
-        // 获取当前标本的状态
-        SpecimenOutboundDO existingSpecimen = specimenOutboundMapper.selectById(updateReqVO.getId());
-
-        // 判断状态是否为已出库(3)
-        if (existingSpecimen == null || existingSpecimen.getStatus() != 3) {
-            throw new IllegalStateException("只能更新状态为已出库的标本回库单");
-        }
-
-        // 使用链式调用合并设置
-        existingSpecimen.setStatus(4) // 修改状态为已回库
-                .setReturnDate(LocalDateTime.now()) // 设置回库时间为当前时间
-                .setSpecimenCondition(updateReqVO.getSpecimenCondition()) // 设置标本状态
-                .setReturner(updateReqVO.getReturner()) // 设置归还人
-                .setReceiver(updateReqVO.getReceiver()) // 设置接收人
-                .setRemarks(updateReqVO.getRemarks()); // 设置备注
-
-        // 更新数据库
-        specimenOutboundMapper.updateById(existingSpecimen);
-
-        // 更新 info_id 字符串为列表,假设 info_id 是一个用逗号分隔的字符串
-        String[] infoIds = existingSpecimen.getInfoId().split(",");
-
-        // 更新所有标本信息的馆藏状态为0(在馆)
-        for (String infoId : infoIds) {
-            specimenInfoMapper.updateCollectionStatus(Long.valueOf(infoId.trim()), 0);
-        }
-
-        // 记录日志上下文
-        LogRecordContext.putVariable("existingSpecimen", existingSpecimen); // 添加更新的出库单对象
-        LogRecordContext.putVariable("updateReqVO", updateReqVO); // 添加请求对象
-    }
-
-    @Override
     @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_OUTBOUND_SUB_TYPE,
-            bizNo = "{{#updateReqVO.id}}", // 使用更新的出库单 ID
-            success = MUSEUMS_SPECIMEN_UPDATE_RECOMPILE_SUCCESS, extra = "{{#updateReqVO.infoId}}")
-    public void recompileSpecimenOutbound(@Valid SpecimenOutboundSaveReqVO updateReqVO) {
-        // 校验存在
-        validateSpecimenOutboundExists(updateReqVO.getId());
-
-        // 更新
-        SpecimenOutboundDO updateObj = BeanUtils.toBean(updateReqVO, SpecimenOutboundDO.class);
-        specimenOutboundMapper.updateById(updateObj);
-
-        // 记录日志上下文
-        LogRecordContext.putVariable("specimenOutbound", updateObj); // 添加更新后的出库单对象
-        LogRecordContext.putVariable("updateReqVO", updateReqVO); // 添加请求对象
-    }
-
-    //出库审批
-    @Override
+            bizNo = "{{#req.id}}",
+            success = MUSEUMS_SPECIMEN_APPROVE_OUTBOUND_SUCCESS,
+            extra = "{{#specimenOutbound.infoId}}")
     public void updateStatus(SpecimenOutboundApprovalReqVO req) {
         // 从数据库获取标本出库记录
         SpecimenOutboundDO specimenOutbound = specimenOutboundMapper.selectById(req.getId());
@@ -210,6 +152,14 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
             throw new IllegalStateException("标本记录不存在");
         }
 
+        String approvalMessage = getApprovalMessage(req.getStatus());
+        Long userId = getLoginUserId();
+
+        // 将对象添加到日志上下文中
+        LogRecordContext.putVariable("specimenOutbound", specimenOutbound);
+        LogRecordContext.putVariable("userId", userId);
+        LogRecordContext.putVariable("approvalMessage", approvalMessage);
+
         // 一审逻辑
         if (req.getStatus() == 1 || req.getStatus() == 2) {
             if (specimenOutbound.getStatus() != 0) {
@@ -237,10 +187,39 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
             specimenOutbound.setTwoApprovalTime(req.getTwoApprovalTime()); // 设置当前审批时间
             specimenOutbound.setTwoApproveUsers(getLoginUserId()); // 设置二审操作员 ID
         }
+        LogRecordContext.putVariable("rejectionReasons", req.getRejectionReasons());
+        LogRecordContext.putVariable("processInstanceId", req.getProcessInstanceId());
 
         // 更新数据库
         specimenOutboundMapper.updateById(specimenOutbound);
     }
+    private String getApprovalMessage(int status) {
+        switch (status) {
+            case 1: return "一审通过";
+            case 2: return "一审驳回";
+            case 5: return "二审通过";
+            case 6: return "二审驳回";
+            default: return "未知状态";
+        }
+    }
+
+    //审批前或审批驳回修改出库单
+    @Override
+    @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_OUTBOUND_SUB_TYPE,
+            bizNo = "{{#updateReqVO.id}}", // 使用更新的出库单 ID
+            success = MUSEUMS_SPECIMEN_UPDATE_RECOMPILE_SUCCESS, extra = "{{#updateReqVO.infoId}}")
+    public void recompileSpecimenOutbound(@Valid SpecimenOutboundSaveReqVO updateReqVO) {
+        // 校验存在
+        validateSpecimenOutboundExists(updateReqVO.getId());
+
+        // 更新
+        SpecimenOutboundDO updateObj = BeanUtils.toBean(updateReqVO, SpecimenOutboundDO.class);
+        specimenOutboundMapper.updateById(updateObj);
+
+        // 记录日志上下文
+        LogRecordContext.putVariable("specimenOutbound", updateObj); // 添加更新后的出库单对象
+        LogRecordContext.putVariable("updateReqVO", updateReqVO); // 添加请求对象
+    }
 
     //确认出库,已经简化
     @Override
@@ -266,7 +245,9 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         // 更新数据库
         specimenOutboundMapper.updateById(existingSpecimen);
         // 更新标本信息的馆藏状态为1(借出)
-        String[] infoIds = existingSpecimen.getInfoId().split(",");
+        String infoIdString = existingSpecimen.getInfoId();
+        infoIdString = infoIdString.replaceAll("[\\[\\] ]", ""); // 移除方括号和空格
+        String[] infoIds = infoIdString.split(","); // 按逗号分割
 
         for (String infoId : infoIds) {
             specimenInfoMapper.updateCollectionStatus(Long.valueOf(infoId.trim()), 1);
@@ -274,9 +255,59 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         // 记录日志上下文
         LogRecordContext.putVariable("existingSpecimen", existingSpecimen); // 添加更新后的出库单对象
 
-        return "标本ID"+existingSpecimen.getId()+"出库成功";
+        return "标本ID"+existingSpecimen.getInfoId()+"出库成功";
     }
 
+    //用来填写回库表单,为方便添加数据,现在先用上面这段
+//    @Override
+//    public void updateSpecimenOutbound(SpecimenOutboundSaveReqVO updateReqVO) {
+//        // 校验存在
+//        validateSpecimenOutboundExists(updateReqVO.getId());
+//        // 更新
+//        SpecimenOutboundDO updateObj = BeanUtils.toBean(updateReqVO, SpecimenOutboundDO.class);
+//        specimenOutboundMapper.updateById(updateObj);
+//    }
+    //填写回库表单
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_RETURN_SUB_TYPE,
+            bizNo = "{{#existingSpecimen.id}}", // 使用更新的出库单 ID
+            success = MUSEUMS_SPECIMEN_UPDATE_RETURN_SUCCESS , extra = "{{#existingSpecimen.infoId}}") // 定义更新成功的日志消息
+    public void updateSpecimenOutbound(SpecimenOutboundReturnReqVO updateReqVO) {
+        // 校验存在
+        validateSpecimenOutboundExists(updateReqVO.getId());
+
+        // 获取当前标本的状态
+        SpecimenOutboundDO existingSpecimen = specimenOutboundMapper.selectById(updateReqVO.getId());
+
+        // 判断状态是否为已出库(3)
+        if (existingSpecimen == null || existingSpecimen.getStatus() != 3) {
+            throw new IllegalStateException("只能更新状态为已出库的标本回库单");
+        }
+
+        // 使用链式调用合并设置
+        existingSpecimen.setStatus(4) // 修改状态为已回库
+                .setReturnDate(LocalDateTime.now()) // 设置回库时间为当前时间
+                .setSpecimenCondition(updateReqVO.getSpecimenCondition()) // 设置标本状态
+                .setReturner(updateReqVO.getReturner()) // 设置归还人
+                .setReceiver(updateReqVO.getReceiver()) // 设置接收人
+                .setRemarks(updateReqVO.getRemarks()); // 设置备注
+
+        // 更新数据库
+        specimenOutboundMapper.updateById(existingSpecimen);
+
+        String infoIdString = existingSpecimen.getInfoId();
+        infoIdString = infoIdString.replaceAll("[\\[\\] ]", ""); // 移除方括号和空格
+        String[] infoIds = infoIdString.split(","); // 按逗号分割
+
+        // 更新所有标本信息的馆藏状态为0(在馆)
+        for (String infoId : infoIds) {
+            specimenInfoMapper.updateCollectionStatus(Long.valueOf(infoId.trim()), 0);
+        }
+
+        // 记录日志上下文
+        LogRecordContext.putVariable("existingSpecimen", existingSpecimen); // 添加更新的出库单对象
+    }
 
     @Override
     public void deleteSpecimenOutbound(Long id) {
@@ -302,7 +333,6 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
     public SpecimenOutboundDO getSpecimenReturnInformation(Long id) {
         // 获取标本出库回库信息
         SpecimenOutboundDO specimenOutbound = specimenOutboundMapper.selectById(id);
-
         // 检查审批状态是否为4(已回库)
         if (specimenOutbound != null && specimenOutbound.getStatus() == 4) {
             return specimenOutbound;
@@ -340,13 +370,18 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         if (specimenOutbound == null) {
             return null; // 或抛出自定义异常
         }
+
         // 查询关联的标本信息
         String infoIds = specimenOutbound.getInfoId(); // 获取 info_id,假设是字符串
+        // 处理 infoId 字段
+        infoIds = infoIds.replaceAll("[\\[\\] ]", ""); // 移除方括号和空格
         List<Long> idList = Arrays.stream(infoIds.split(","))
                 .map(Long::parseLong)
                 .collect(Collectors.toList());
+
         // 查询所有关联的标本信息
         List<SpecimenOutboundFormRespVO> specimenInfoList = specimenInfoMapper.selectByIds(idList); // 假设你有这个 Mapper
+
         // 创建返回对象
         SpecimenOutboundWithInfoRespVO response = new SpecimenOutboundWithInfoRespVO();
         // 手动复制出库信息属性
@@ -360,4 +395,5 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         response.setSpecimenInfoList(specimenInfoList);
         return response;
     }
+
 }