Browse Source

做了标本审批模块的部分日志

hyy 9 months ago
parent
commit
b9ed368bd6

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

@@ -19,8 +19,17 @@ public interface LogRecordConstants {
     String MUSEUMS_SPECIMEN_DELETE_SUCCESS = "删除了标本【编号: {{#specimenNumber}}】, 理由: {{#deletedReason}}";
 
     // ======================= SPECIMEN 导入 =======================
-    String SPECIMEN_IMPORT_TYPE = "标本导入";
+    String SPECIMEN_IMPORT_TYPE = "MUSEUMS 标本导入";
     String SPECIMEN_IMPORT_SUB_TYPE = "导入标本";
     String SPECIMEN_IMPORT_SUCCESS = "成功导入标本,总数量: {{#totalImported}}";
 
+
+    // ======================= SPECIMEN_OUTBOUND 相关日志 =======================
+//    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}}";
 }

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.museums.controller.admin.specimenoutbound.vo;
 
+import com.mzt.logapi.starter.annotation.DiffLogField;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
@@ -15,6 +16,9 @@ public class SpecimenOutboundReturnReqVO {
     @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     private Long id;
 
+    @Schema(description = "关联到总表中的标本ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private String infoId;
+
     @Schema(description = "标本情况")
     private String specimenCondition;
 

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.museums.controller.admin.specimenoutbound.vo;
 
+import com.mzt.logapi.starter.annotation.DiffLogField;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
@@ -16,6 +17,7 @@ public class SpecimenOutboundSaveReqVO {
 
     @Schema(description = "关联到总表中的标本ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotEmpty(message = "关联到总表中的标本ID不能为空")
+    @DiffLogField(name = "关联到总表中的标本ID")
     private String infoId;
 
     @Schema(description = "中文名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@@ -28,22 +30,27 @@ public class SpecimenOutboundSaveReqVO {
 
     @Schema(description = "申请人或申请单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
     @NotEmpty(message = "申请人或申请单位不能为空")
+    @DiffLogField(name = "申请人(单位)")
     private String applicantName;
 
     @Schema(description = "申请时间")
+    @DiffLogField(name = "申请时间")
     private LocalDateTime applicationDate;
 
     @Schema(description = "申请出库的用途", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotEmpty(message = "申请出库的用途不能为空")
+    @DiffLogField(name = "申请出库的用途")
     private String applicationUsage;
 
     @Schema(description = "出库附件上传")
+    @DiffLogField(name = "出库附件上传")
     private String attachments;
 
     @Schema(description = "审批状态", example = "2")
     private Integer status;
 
     @Schema(description = "备注信息")
+    @DiffLogField(name = "备注信息")
     private String remarks;
 
 //    @Schema(description = "出库时间")

+ 0 - 5
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/dal/mysql/specimenoutbound/SpecimenOutboundMapper.java

@@ -106,11 +106,6 @@ public interface SpecimenOutboundMapper extends BaseMapperX<SpecimenOutboundDO>
     })
     List<SpecimenOutboundDO> selectByIds(@Param("infoIds") List<Long> infoIds);
 
-    // TODO selectById 干嘛还单独写一个这个
-    @Select("SELECT * FROM museums_specimen_outbound WHERE id = #{outboundId}")
-    SpecimenOutboundDO selectById(@Param("outboundId") Long outboundId);
-
-
     @Select({
             "<script>",
             "SELECT si.specimen_number, si.image_path, si.storage_location ",

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

@@ -3,10 +3,13 @@ package cn.iocoder.yudao.module.museums.service.specimenoutbound;
 import cn.iocoder.yudao.module.museums.controller.admin.specimeninfo.vo.SpecimenOutboundFormRespVO;
 import cn.iocoder.yudao.module.museums.dal.dataobject.specimeninfo.SpecimenInfoDO;
 import cn.iocoder.yudao.module.museums.dal.mysql.specimeninfo.SpecimenInfoMapper;
+import com.mzt.logapi.context.LogRecordContext;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import cn.iocoder.yudao.module.museums.controller.admin.specimenoutbound.vo.*;
@@ -25,6 +28,8 @@ import java.util.stream.Collectors;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.iocoder.yudao.module.museums.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.museums.enums.social.LogRecordConstants.*;
+import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
 
 
 /**
@@ -52,7 +57,43 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
 //        // 返回
 //        return specimenOutbound.getId();
 //    }
+//    @Override
+//    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); // 收集符合条件的ID
+//                    } else {
+//                        throw exception(SPECIMEN_IS_LENDING_OUT);
+//                    }
+//                })
+//                .collect(Collectors.toList());
+//
+//        // 拼接info_id字符串
+//        String infoIdString = String.join(",", validInfoIds.stream().map(String::valueOf).toArray(String[]::new));
+//
+//        // 创建出库记录
+//        SpecimenOutboundDO specimenOutbound = BeanUtils.toBean(createReqVO, SpecimenOutboundDO.class);
+//        specimenOutbound.setInfoId(infoIdString); // 存储逗号分隔的标本ID
+//        specimenOutboundMapper.insert(specimenOutbound);
+//        // 返回出库记录ID
+//        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) // 使用_DIFF记录变化
     public Long createSpecimenOutbound(SpecimenOutboundSaveReqVO createReqVO) {
         // 将逗号分隔的字符串拆分为List<String>
         List<String> infoIds = Arrays.asList(createReqVO.getInfoId().split(","));
@@ -60,13 +101,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);
                     }
@@ -78,14 +118,18 @@ 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();
     }
 
 
-
     //用来填写回库表单,为方便添加数据,现在先用上面这段
 //    @Override
 //    public void updateSpecimenOutbound(SpecimenOutboundSaveReqVO updateReqVO) {
@@ -97,6 +141,10 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
 //    }
     //填写回库表单
     @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) // 定义更新成功的日志消息
     public void updateSpecimenOutbound(SpecimenOutboundReturnReqVO updateReqVO) {
         // 校验存在
         validateSpecimenOutboundExists(updateReqVO.getId());
@@ -127,15 +175,27 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         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) // 使用_DIFF记录变化
     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); // 添加请求对象
     }
 
     //出库审批
@@ -182,12 +242,12 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         specimenOutboundMapper.updateById(specimenOutbound);
     }
 
-
-
-
-
     //确认出库,已经简化
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = MUSEUMS_SPECIMEN_TYPE, subType = MUSEUMS_SPECIMEN_OUTBOUND_SUB_TYPE,
+            bizNo = "{{#id}}", // 使用出库单 ID
+            success = MUSEUMS_SPECIMEN_CREATE_CONFIEM_OUTBOUND_SUCCESS) // 使用_DIFF记录变化
     public String confirmOutbound(Long id, Long operator) {
         // 校验存在
         validateSpecimenOutboundExists(id);
@@ -201,14 +261,22 @@ public class SpecimenOutboundServiceImpl implements SpecimenOutboundService {
         existingSpecimen.setStatus(3) // 更新状态为已出库(3)
                 .setOperator(operator) // 设置出库员ID
                 .setOutgoingTime(LocalDateTime.now()); // 设置出库时间
+
         // 更新数据库
         specimenOutboundMapper.updateById(existingSpecimen);
+
         // 更新标本信息的馆藏状态为1(借出)
         specimenInfoMapper.updateCollectionStatus(Long.valueOf(existingSpecimen.getInfoId()), 1);
+
+        // 记录日志上下文
+        LogRecordContext.putVariable("specimenOutbound", existingSpecimen); // 添加出库单对象
+        LogRecordContext.putVariable("operator", operator); // 添加操作员ID
+
         return null;
     }
 
 
+
     @Override
     public void deleteSpecimenOutbound(Long id) {