Răsfoiți Sursa

G3-2 tl-control/business 接入 M8 全量操作日志(@OperateLog 埋点)

- 两服务装三件套:service+aivfo-log-spring-boot-starter、manage+aivfo-kafka-spring-boot-starter、lanucher+aivfo-oplog-client;application-local 配 kafka(${server.ip}:9092, producer.enable=true)
- tl-control 15 Controller / 90 方法、business 24 Controller / 121 方法贴 @OperateLog(module=@Api tags、operation=@ApiOperation 中文值)
- business 三端(pc/surface/app):oplog-client 加父聚合 lanucher 一处覆盖三端,三 application-local 各配独立 consumer.group
- 两服务 Maven 编译 BUILD SUCCESS;真入 operation_log 待起 Kafka+oplog 端到端抽查(运行期,非真机门控)

附:本会话进度文档回写(覆盖 G4-2 + G3-2)——进度状态.yaml / 进度数据.js / 工作计划表.md / 交接卡.md / 当前开发计划.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 4 zile în urmă
părinte
comite
269d79dc73
60 a modificat fișierele cu 368 adăugiri și 21 ștergeri
  1. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/culture/EmbryoCultureRecordController.java
  2. 2 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/culture/EmbryoMarkController.java
  3. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/resource/MessageController.java
  4. 4 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/resource/ResourceController.java
  5. 2 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/api/EmbryoApiController.java
  6. 2 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/api/MessageApiController.java
  7. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/culture/BalanceController.java
  8. 15 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/culture/EmbryoCultureRecordController.java
  9. 7 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/culture/EmbryoMarkController.java
  10. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/identify/PictureIdentifyController.java
  11. 4 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/resource/OutController.java
  12. 24 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/resource/ResourceController.java
  13. 2 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/scanpermission/PermissionController.java
  14. 6 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/setting/DictionaryController.java
  15. 7 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/setting/PhotoSearchButtonController.java
  16. 13 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/setting/ScoreModelSettingController.java
  17. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/culture/BalanceController.java
  18. 10 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/culture/EmbryoCultureRecordController.java
  19. 6 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/culture/EmbryoMarkController.java
  20. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/identify/PictureIdentifyController.java
  21. 10 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/resource/ResourceController.java
  22. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/setting/DictionaryController.java
  23. 7 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/setting/MarkController.java
  24. 3 0
      aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/setting/PhotoSearchButtonController.java
  25. 4 0
      aivfo-business-manage/aivfo-business-manage-lanucher/.flattened-pom.xml
  26. 7 1
      aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-app-lanucher/src/main/resources/application-local.properties
  27. 7 1
      aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-pc-lanucher/src/main/resources/application-local.properties
  28. 7 1
      aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-surface-lanucher/src/main/resources/application-local.properties
  29. 5 0
      aivfo-business-manage/aivfo-business-manage-lanucher/pom.xml
  30. 4 0
      aivfo-business-manage/aivfo-business-manage-manage/.flattened-pom.xml
  31. 5 0
      aivfo-business-manage/aivfo-business-manage-manage/pom.xml
  32. 4 0
      aivfo-business-manage/aivfo-business-manage-service/.flattened-pom.xml
  33. 5 0
      aivfo-business-manage/aivfo-business-manage-service/pom.xml
  34. 5 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmController.java
  35. 9 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmSettingController.java
  36. 8 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmSettingNewController.java
  37. 13 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmSysSettingController.java
  38. 6 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/AlarmApiController.java
  39. 2 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/AutofocusApiController.java
  40. 6 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/MqttSendApiController.java
  41. 5 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/TlInfoApiController.java
  42. 7 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/data/DataController.java
  43. 2 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/mqtt/MqttController.java
  44. 2 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/scanpermission/PermissionController.java
  45. 18 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/setting/TimeLapseSettingController.java
  46. 4 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/tl/HouseCollectController.java
  47. 10 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/tl/TimeLapseEquipmentController.java
  48. 8 0
      aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/tl/TlInfoController.java
  49. 4 0
      aivof-tl-control/aivfo-tl-control-lanucher/.flattened-pom.xml
  50. 5 0
      aivof-tl-control/aivfo-tl-control-lanucher/pom.xml
  51. 6 1
      aivof-tl-control/aivfo-tl-control-lanucher/src/main/resources/application-local.properties
  52. 4 0
      aivof-tl-control/aivfo-tl-control-manage/.flattened-pom.xml
  53. 5 0
      aivof-tl-control/aivfo-tl-control-manage/pom.xml
  54. 4 0
      aivof-tl-control/aivfo-tl-control-service/.flattened-pom.xml
  55. 5 0
      aivof-tl-control/aivfo-tl-control-service/pom.xml
  56. 2 2
      项目文档/开发计划/2026-06-20-当前开发计划.md
  57. 18 0
      项目文档/进度/交接卡.md
  58. 2 2
      项目文档/进度/工作计划表.md
  59. 8 6
      项目文档/进度/进度数据.js
  60. 7 7
      项目文档/进度/进度状态.yaml

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/culture/EmbryoCultureRecordController.java

@@ -5,6 +5,7 @@ import com.aivfo.business.manage.entity.vo.culture.embryorecord.HouseCultureList
 import com.aivfo.business.manage.entity.vo.tl.tlinfo.TlInfoAppVO;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -36,6 +37,7 @@ public class EmbryoCultureRecordController {
      * 设备管理 - 查看设备信息列表
      */
     @PostMapping(value = "/getTlInfoList")
+    @OperateLog(module = "患者培养接口", operation = "设备管理 - 设备列表")
     @ApiOperation(value = "设备管理 - 设备列表")
     public Result<List<TlInfoAppVO>> getTlInfoList() {
         return R.succeed(embryoCultureRecordManage.getTlInfoList());
@@ -45,6 +47,7 @@ public class EmbryoCultureRecordController {
      * 患者管理 - 仓室列表
      */
     @PostMapping(value = "/getHouseCultureList")
+    @OperateLog(module = "患者培养接口", operation = "患者管理 - 仓室列表")
     @ApiOperation(value = "患者管理 - 仓室列表")
     public Result<HouseCultureList> getHouseCultureList(@RequestParam String tlSn) {
         return R.succeed(embryoCultureRecordManage.getCultureListByTlSn(tlSn));

+ 2 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/culture/EmbryoMarkController.java

@@ -4,6 +4,7 @@ import com.aivfo.business.manage.app.manage.culture.EmbryoMarkManage;
 import com.aivfo.business.manage.entity.param.culture.embryo.EmbryoMarkDestinationDTO;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -24,6 +25,7 @@ public class EmbryoMarkController {
      * 胚胎去向标记
      */
     @PostMapping(value = "/markEmbryoDestination")
+    @OperateLog(module = "胚胎标记接口", operation = "胚胎去向标记")
     @ApiOperation(value = "胚胎去向标记", notes = "标记胚胎移植、冷冻、删除等,传入胚胎id")
     public Result<Void> markEmbryoDestination(@Validated @RequestBody EmbryoMarkDestinationDTO dto) {
         embryoMarkManage.markEmbryoDestination(dto);

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/resource/MessageController.java

@@ -5,6 +5,7 @@ import com.aivfo.business.manage.entity.param.query.resource.MessageReadDTO;
 import com.aivfo.business.manage.entity.vo.resource.MessageVO;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -37,6 +38,7 @@ public class MessageController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getMessage")
+    @OperateLog(module = "站内信接口", operation = "获取未读站内信")
     @ApiOperation(value = "获取未读站内信")
     public Result<List<MessageVO>> getMessage() {
         return R.succeed(messageManage.getMessage());
@@ -49,6 +51,7 @@ public class MessageController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/readMessages")
+    @OperateLog(module = "站内信接口", operation = "站内信已读")
     @ApiOperation(value = "站内信已读")
     public Result<Void> getPicturesByRecordId(@RequestBody MessageReadDTO messageReadDTO) {
         messageManage.readMessages(messageReadDTO);

+ 4 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-app-controller/src/main/java/com/aivfo/business/manage/app/controller/resource/ResourceController.java

@@ -8,6 +8,7 @@ import com.aivfo.business.manage.entity.vo.resource.SoftWareVersionVO;
 import com.aivfo.business.manage.entity.vo.resource.picture.SwitchVideoPictureLayerVO;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -42,6 +43,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getPicturesByRecordId")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-获取指定well所有图层视频及视频最清晰图层图片")
     @ApiOperation(value = "患者管理-详情-获取指定well所有图层视频及视频最清晰图层图片")
     public Result<List<ResourceListVO>> getPicturesByRecordId(@Validated @RequestBody PictureAndVideoQueryDTO dto) {
         return R.succeed(resourceManage.getPicturesAndVideos(dto));
@@ -54,6 +56,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/switchVideoPictureLayers")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-获取指定指定well的指定图层图片")
     @ApiOperation(value = "患者管理-详情-获取指定指定well的指定图层图片")
     public Result<List<SwitchVideoPictureLayerVO>> switchVideoPictureLayers(@Validated @RequestBody SwitchVideoPictureLayerDTO dto) {
         return R.succeed(resourceManage.switchVideoPictureLayers(dto));
@@ -66,6 +69,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getSoftWareVersion")
+    @OperateLog(module = "设备数据接口", operation = "获取软件版本")
     @ApiOperation(value = "获取软件版本")
     public Result<SoftWareVersionVO> getSoftWareVersion() {
         return R.succeed(resourceManage.getSoftwareVersion());

+ 2 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/api/EmbryoApiController.java

@@ -6,6 +6,7 @@ import com.aivfo.business.manage.facade.EmbryoApi;
 import com.aivfo.business.manage.pc.manage.culture.EmbryoCultureRecordManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -29,6 +30,7 @@ public class EmbryoApiController implements EmbryoApi {
      * @author wangyl
      */
     @Override
+    @OperateLog(module = "服务内部接口 - 获取指定tl舱室信息", operation = "获取指定tl舱室信息")
     @ApiOperation(value = "获取指定tl舱室信息")
     public Result<HouseStateVO> getHouseState(String tlSn) {
         HouseStateVO houseStateVO = embryoCultureRecordManage.getHouseState(tlSn);

+ 2 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/api/MessageApiController.java

@@ -5,6 +5,7 @@ import com.aivfo.business.manage.facade.MessageApi;
 import com.aivfo.business.manage.pc.manage.resource.MessageManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +36,7 @@ public class MessageApiController implements MessageApi {
      * @date 2023/8/23 16:52
      **/
     @Override
+    @OperateLog(module = "服务内部接口 - 站内信对外接口", operation = "发送消息")
     @ApiOperation(value = "发送消息")
     public Result<Void> sendAlarmMessage(MessageSendDTO message) {
         messageManage.sendAlarmMessage(message);

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/culture/BalanceController.java

@@ -9,6 +9,7 @@ import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.exception.BusinessException;
 import com.aivfo.el.starter.base.Result;
 import com.aivfo.el.starter.base.utils.StringPool;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -37,6 +38,7 @@ public class BalanceController {
      * 仓室列表 - 开始平衡
      */
     @PostMapping(value = "/startBalance")
+    @OperateLog(module = "仓室平衡接口", operation = "仓室列表 - 开始平衡")
     @ApiOperation(value = "仓室列表 - 开始平衡")
     public Result<Void> startBalance(@Validated @RequestBody BalanceInsertDTO balanceInsertDTO) {
         String id = balanceInsertDTO.getTlSn() + StringPool.COLON + balanceInsertDTO.getHouseSn();
@@ -56,6 +58,7 @@ public class BalanceController {
      * 仓室列表 - 结束平衡
      */
     @PostMapping(value = "/stopBalance")
+    @OperateLog(module = "仓室平衡接口", operation = "仓室列表 - 结束平衡")
     @ApiOperation(value = "仓室列表 - 结束平衡")
     public Result<Void> stopBalance(@Validated @RequestBody BalanceUpdateDTO balanceUpdateDTO) {
         balanceMange.stop(balanceUpdateDTO);

+ 15 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/culture/EmbryoCultureRecordController.java

@@ -16,6 +16,7 @@ import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.exception.BusinessException;
 import com.aivfo.el.starter.base.Result;
 import com.aivfo.el.starter.base.utils.StringPool;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.web.core.common.annotation.NoToken;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
@@ -47,6 +48,7 @@ public class EmbryoCultureRecordController {
      * 设备管理 - 查看设备信息列表
      */
     @PostMapping(value = "/getTlInfoList")
+    @OperateLog(module = "患者培养接口", operation = "设备管理 - 设备列表")
     @ApiOperation(value = "设备管理 - 设备列表")
     public Result<List<TlInfoRpcVO>> getTlInfoList() {
         return R.succeed(embryoCultureRecordManage.getTlInfoList());
@@ -57,6 +59,7 @@ public class EmbryoCultureRecordController {
      * 患者管理 - 仓室列表
      */
     @PostMapping(value = "/getHouseCultureList")
+    @OperateLog(module = "患者培养接口", operation = "患者管理 - 仓室列表")
     @ApiOperation(value = "患者管理 - 仓室列表")
     public Result<HouseCultureList> getHouseCultureList(@RequestParam String tlSn) {
         return R.succeed(embryoCultureRecordManage.getCultureListByTlSn(tlSn));
@@ -67,6 +70,7 @@ public class EmbryoCultureRecordController {
      * 添加患者 - 培养记录
      */
     @PostMapping("/addCultureRecord")
+    @OperateLog(module = "患者培养接口", operation = "开始培养 - 添加患者信息")
     @ApiOperation(value = "开始培养 - 添加患者信息")
     public Result<Void> addCultureRecord(@Validated @RequestBody EmbryoCultureRecordInsertDTO dto) {
         String id = dto.getTlSn() + StringPool.COLON + dto.getHouseSn();
@@ -88,6 +92,7 @@ public class EmbryoCultureRecordController {
      * 修改信息
      */
     @PostMapping("/updateCultureRecord")
+    @OperateLog(module = "患者培养接口", operation = "编辑患者信息")
     @ApiOperation(value = "编辑患者信息")
     public Result<Void> addCultureRecord(@Validated @RequestBody EmbryoCultureRecordUpdateDTO dto) {
         embryoCultureRecordManage.updateEmbryoCultureRecord(dto);
@@ -98,6 +103,7 @@ public class EmbryoCultureRecordController {
      * 添加患者 - 获取历史病例信息
      */
     @PostMapping("/getHistoryCaseInfo")
+    @OperateLog(module = "患者培养接口", operation = "添加患者信息 - 获取历史病例信息")
     @ApiOperation(value = "添加患者信息 - 获取历史病例信息")
     public Result<List<CaseInfoVO>> getHistoryCaseInfo(@Validated @RequestBody CaseHistoryQuery dto) {
         return R.succeed(embryoCultureRecordManage.getHistoryCaseInfo(dto));
@@ -108,6 +114,7 @@ public class EmbryoCultureRecordController {
      * 结束培养
      */
     @PostMapping("/endCultureRecord")
+    @OperateLog(module = "患者培养接口", operation = "结束培养")
     @ApiOperation(value = "结束培养", notes = "培养记录id")
     public Result<Void> endCultureRecord(@RequestParam Long id) {
         embryoCultureRecordManage.endCultureRecord(id);
@@ -119,6 +126,7 @@ public class EmbryoCultureRecordController {
      * 通过id查询培养记录详情
      */
     @PostMapping(value = "/getCultureRecordById")
+    @OperateLog(module = "患者培养接口", operation = "患者管理 - 详情")
     @ApiOperation(value = "患者管理 - 详情", notes = "传入培养记录id")
     public Result<EmbryoCultureRecordDetailVO> getCultureRecordById(@RequestParam("id") Long id) {
         return R.succeed(embryoCultureRecordManage.getEmbryoCultureRecordById(id));
@@ -129,6 +137,7 @@ public class EmbryoCultureRecordController {
      * 培养记录 - 分页查询
      */
     @PostMapping(value = "/getEmbryoCultureRecord")
+    @OperateLog(module = "患者培养接口", operation = "培养记录 - 分页查询")
     @ApiOperation(value = "培养记录 - 分页查询")
     public Result<Page<EmbryoCultureRecordPageVO>> getEmbryoCultureRecord(@Validated @RequestBody EmbryoCultureRecordQuery query) {
         return R.succeed(embryoCultureRecordManage.getEmbryoCultureRecord(query));
@@ -138,6 +147,7 @@ public class EmbryoCultureRecordController {
      * 查询培养记录的数量
      */
     @PostMapping(value = "/getEmbryoCultureRecordNum")
+    @OperateLog(module = "患者培养接口", operation = "培养记录 - 查询数量")
     @ApiOperation(value = "培养记录 - 查询数量")
     @PreAuthorize(name = "培养记录 - 查询数量", functionKey = "getEmbryoCultureRecordNum", functionTypeKey = "culture")
     public Result<EmbryoRecordNumVO> getEmbryoCultureRecordNum(@RequestBody EmbryoCultureRecordQuery query) {
@@ -149,6 +159,7 @@ public class EmbryoCultureRecordController {
      * 删除培养记录
      */
     @PostMapping(value = "/deleteEmbryoCultureRecord")
+    @OperateLog(module = "患者培养接口", operation = "删除培养记录")
     @ApiOperation(value = "删除培养记录")
     @PreAuthorize(name = "删除培养记录", functionKey = "deleteEmbryoCultureRecord", functionTypeKey = "culture")
     public Result<Void> deleteEmbryoCultureRecord(@RequestParam("id") Long id) {
@@ -161,6 +172,7 @@ public class EmbryoCultureRecordController {
      * 添加患者 - 培养记录
      */
     @PostMapping("/addCultureRecordTest")
+    @OperateLog(module = "患者培养接口", operation = "开始培养 - 测试用(开启指定舱室满仓培养)")
     @ApiOperation(value = "开始培养 - 测试用(开启指定舱室满仓培养)")
     @NoToken
     public Result<Void> addCultureRecordTest(@RequestBody EmbryoCultureRecordInsertTestDTO dto) {
@@ -177,18 +189,21 @@ public class EmbryoCultureRecordController {
      * @return: com.aivfo.el.starter.base.Result<com.aivfo.business.manage.entity.vo.culture.embryorecord.EmbryoCultureRecordExportVO>
      **/
     @PostMapping(value = "/getCultureRecordDetailById")
+    @OperateLog(module = "患者培养接口", operation = "获取培养详细信息")
     @ApiOperation(value = "获取培养详细信息", notes = "传入培养记录id")
     public Result<EmbryoCultureRecordExportVO> getCultureRecordDetailById(@RequestParam("id") Long id) {
         return R.succeed(embryoCultureRecordManage.getCultureRecordDetailById(id));
     }
 
     @PostMapping(value = "/getAiExportData")
+    @OperateLog(module = "患者培养接口", operation = "获取ai导出数据")
     @ApiOperation(value = "获取ai导出数据", notes = "传入培养记录id")
     public Result<EmbryoCultureRecordExportVO> getAiExportData(@RequestParam("id") Long id) {
         return R.succeed(embryoCultureRecordManage.getAiExportData(id));
     }
 
     @PostMapping(value = "/pullIdentifyResult")
+    @OperateLog(module = "患者培养接口", operation = "拉取ai结果")
     @ApiOperation(value = "拉取ai结果")
     public Result<Void> pullIdentifyResult() {
         embryoCultureRecordManage.pullIdentifyResult();

+ 7 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/culture/EmbryoMarkController.java

@@ -8,6 +8,7 @@ import com.aivfo.business.manage.entity.vo.culture.embryomark.EmbryoCultureRecor
 import com.aivfo.business.manage.pc.manage.culture.EmbryoMarkManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -32,6 +33,7 @@ public class EmbryoMarkController {
      * 胚胎去向标记
      */
     @PostMapping(value = "/markEmbryoDestination")
+    @OperateLog(module = "胚胎标记接口", operation = "胚胎去向标记")
     @ApiOperation(value = "胚胎去向标记", notes = "标记胚胎移植、冷冻、删除等,传入胚胎id")
     public Result<Void> markEmbryoDestination(@Validated @RequestBody EmbryoMarkDestinationDTO dto) {
         embryoMarkManage.markEmbryoDestination(dto);
@@ -42,6 +44,7 @@ public class EmbryoMarkController {
      * 胚胎形态学标记 - 通过发育时间找胚胎发育图片
      */
     @PostMapping(value = "/markEmbryoByDevelopTime")
+    @OperateLog(module = "胚胎标记接口", operation = "胚胎形态学标记-通过发育时间找胚胎发育图片")
     @ApiOperation(value = "胚胎形态学标记-通过发育时间找胚胎发育图片")
     public Result<Void> markEmbryoPictureNew(@Valid @RequestBody EmbryoMarkInsertNewDTO dto) {
         embryoMarkManage.markEmbryoNew(dto);
@@ -52,6 +55,7 @@ public class EmbryoMarkController {
      * 查询单个
      */
     @PostMapping(value = "/getEmbryoMarkByEmbryoId")
+    @OperateLog(module = "胚胎标记接口", operation = "标记结果 - 标记结果明细")
     @ApiOperation(value = "标记结果 - 标记结果明细", notes = "传入胚胎id")
     public Result<EmbryoMarkResultVO> getEmbryoMarkByEmbryoId(@RequestParam("id") Long id) {
         return R.succeed(embryoMarkManage.getEmbryoMarkByEmbryoId(id));
@@ -61,6 +65,7 @@ public class EmbryoMarkController {
      * 查询所有
      */
     @PostMapping(value = "/getMarkResultByRecordId")
+    @OperateLog(module = "胚胎标记接口", operation = "患者管理 - 标记详情")
     @ApiOperation(value = "患者管理 - 标记详情", notes = "传入培养记录id")
     public Result<EmbryoCultureRecordMarkVO> getMarkResultByRecordId(@RequestParam("id") Long id) {
         return R.succeed(embryoMarkManage.getMarkResultByRecordId(id));
@@ -70,6 +75,7 @@ public class EmbryoMarkController {
      * 标记结果导出
      */
     @GetMapping(value = "/exportMarkResult")
+    @OperateLog(module = "胚胎标记接口", operation = "患者管理 - 标记结果-导出")
     @ApiOperation(value = "患者管理 - 标记结果-导出", notes = "传入选中胚胎id")
     public Result<Void> exportMarkResult(@Validated EmbryoMarkExportDTO dto, HttpServletResponse response) {
         embryoMarkManage.exportMarkResult(dto, response);
@@ -84,6 +90,7 @@ public class EmbryoMarkController {
      * @date 2024/5/9 10:33
      **/
     @PostMapping(value = "/scoreEmbryos")
+    @OperateLog(module = "胚胎标记接口", operation = "触发胚胎算分")
     @ApiOperation(value = "触发胚胎算分")
     public Result<Void> scoreEmbryos(@RequestBody List<Long> embryoRecordIds) {
         embryoMarkManage.scoreEmbryos(embryoRecordIds);

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/identify/PictureIdentifyController.java

@@ -5,6 +5,7 @@ import com.aivfo.business.manage.entity.vo.culture.embryomark.EmbryoMarkVO;
 import com.aivfo.business.manage.pc.manage.identify.PictureIdentifyManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -33,6 +34,7 @@ public class PictureIdentifyController {
      * 查询当前胚胎 - 图片识别结果
      */
     @PostMapping(value = "/getIdentifyResultByEmbryoId")
+    @OperateLog(module = "图片识别接口", operation = "查询当前胚胎 - 图片识别结果")
     @ApiOperation(value = "查询当前胚胎 - 图片识别结果")
     public Result<List<EmbryoMarkVO>> getIdentifyResultByEmbryoId(@RequestParam("id")Long id){
         return R.succeed(pictureIdentifyManage.getIdentifyResultByEmbryoId(id));
@@ -42,6 +44,7 @@ public class PictureIdentifyController {
      * 查询当前培养记录 - 图片识别结果
      */
     @PostMapping(value = "/getIdentifyResultByRecordId")
+    @OperateLog(module = "图片识别接口", operation = "查询当前培养记录 - 图片识别结果")
     @ApiOperation(value = "查询当前培养记录 - 图片识别结果")
     public Result<EmbryoCultureRecordMarkVO> getIdentifyResultByRecordId(@RequestParam("id")Long id){
         return R.succeed(pictureIdentifyManage.getIdentifyResultByRecordId(id));

+ 4 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/resource/OutController.java

@@ -10,6 +10,7 @@ import com.aivfo.business.manage.entity.vo.out.EmbryoPictureVO;
 import com.aivfo.business.manage.pc.manage.culture.EmbryoCultureRecordManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.web.core.common.annotation.NoToken;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
@@ -34,6 +35,7 @@ public class OutController {
     final EmbryoCultureRecordManage embryoCultureRecordManage;
 
     @PostMapping(value = "/caseList")
+    @OperateLog(module = "对外相关接口", operation = "获取所有病例")
     @ApiOperation(value = "获取所有病例")
     @NoToken
     public Result<Page<CultureRecordPageVO>> caseList(@Validated @RequestBody EmbryoCultureRecordQuery query) {
@@ -45,6 +47,7 @@ public class OutController {
      * 获取病例信息(包含胚胎信息)
      */
     @GetMapping(value = "/caseEmbryoInfo")
+    @OperateLog(module = "对外相关接口", operation = "获取病例信息(包括胚胎信息)")
     @ApiOperation(value = "获取病例信息(包括胚胎信息)")
     @NoToken
     public Result<CaseEmbryoInfoVO> caseEmbryoInfo(@Validated @RequestParam("caseId") String caseId) {
@@ -52,6 +55,7 @@ public class OutController {
     }
 
     @PostMapping(value = "/embryoPictures")
+    @OperateLog(module = "对外相关接口", operation = "获取胚胎照片信息")
     @ApiOperation(value = "获取胚胎照片信息")
     @NoToken
     public Result<List<EmbryoPictureVO>> embryoPictures(@Validated @RequestBody EmbryoPictureQuery query) {

+ 24 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/resource/ResourceController.java

@@ -7,6 +7,7 @@ import com.aivfo.business.manage.entity.vo.resource.picture.*;
 import com.aivfo.business.manage.pc.manage.resource.ResourceManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.web.core.common.annotation.NoToken;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
@@ -43,6 +44,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getPicturesByRecordId")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-获取所有图层视频及清晰图层图片")
     @ApiOperation(value = "患者管理-详情-获取所有图层视频及清晰图层图片")
     @Deprecated
     public Result<List<ResourceListVO>> getPicturesByRecordId(@Validated @RequestBody PictureAndVideoQueryDTO dto) {
@@ -56,6 +58,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/switchVideoPictureLayers")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-视频切换图层(获取所有图片)")
     @ApiOperation(value = "患者管理-详情-视频切换图层(获取所有图片)")
     @Deprecated
     public Result<List<SwitchVideoPictureLayerVO>> switchVideoPictureLayers(@Validated @RequestBody SwitchVideoPictureLayerDTO dto) {
@@ -72,6 +75,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getRecordDetail")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-获取所有图层视频及视频时间轴")
     @ApiOperation(value = "患者管理-详情-获取所有图层视频及视频时间轴")
     public Result<List<EmbryoRecordDetailResourceVO>> getRecordDetail(@Validated @RequestBody PictureAndVideoQueryDTO dto) {
         return R.succeed(resourceManage.getRecordDetail(dto));
@@ -84,6 +88,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/switchVideoLayerByPicture")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-视频切换图层(获取单张图片地址)")
     @ApiOperation(value = "患者管理-详情-视频切换图层(获取单张图片地址)")
     public Result<String> switchVideoLayerByPicture(@Validated @RequestBody SwitchVideoLayerByPictureDTO dto) {
         return R.succeed(resourceManage.switchVideoLayerByPicture(dto));
@@ -96,6 +101,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getImageInfo")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-获取单张图片信息")
     @ApiOperation(value = "患者管理-详情-获取单张图片信息")
     public Result<ImageInfoVO> getImageInfo(@Validated @RequestBody SwitchVideoLayerByPictureDTO dto) {
         return R.succeed(resourceManage.getImageInfo(dto));
@@ -108,6 +114,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getVideoTimeLine")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-视频切换图层(获取时间轴)")
     @ApiOperation(value = "患者管理-详情-视频切换图层(获取时间轴)")
     public Result<List<VideoLinePictureVO>> getVideoTimeLine(@Validated @RequestBody SwitchVideoLayerDTO dto) {
         return R.succeed(resourceManage.getVideoTimeLine(dto));
@@ -122,6 +129,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getEmbryosLastPictures")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-胚胎标记详情-获取指定胚胎最新图片")
     @ApiOperation(value = "患者管理-胚胎标记详情-获取指定胚胎最新图片")
     public Result<List<PictureVO>> getEmbryosLastPictures(@Validated @RequestBody RecordPictureDTO dto) {
         return R.succeed(resourceManage.getEmbryosLastPictures(dto));
@@ -134,6 +142,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getSourcePictures")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-图片查看(获取原图)")
     @ApiOperation(value = "患者管理-详情-图片查看(获取原图)")
     public Result<List<SourcePictureVO>> getPictures(@Validated @RequestBody PictureQuerySourceDTO pictureListDTO) {
         return R.succeed(resourceManage.getSourcePictures(pictureListDTO));
@@ -146,6 +155,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getSourcePicturesByPage")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-图片查看(获取原图)分页")
     @ApiOperation(value = "患者管理-详情-图片查看(获取原图)分页")
     public Result<Page<SourcePictureVO>> getSourcePicturesByPage(@Validated @RequestBody PictureQuerySourcePageDTO pictureListDTO) {
         return R.succeed(resourceManage.pageQuerySourcePictures(pictureListDTO));
@@ -158,6 +168,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getSourcePicturesTotalLayer")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-获取原图最大层数")
     @ApiOperation(value = "患者管理-详情-获取原图最大层数")
     public Result<Integer> getSourcePicturesTotalLayer(@Validated @RequestBody PictureQuerySourcePageDTO pictureListDTO) {
         return R.succeed(resourceManage.getSourcePicturesTotalLayer(pictureListDTO));
@@ -170,6 +181,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getPictures")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-图片查看(获取抠图)")
     @ApiOperation(value = "患者管理-详情-图片查看(获取抠图)")
     public Result<List<PictureViewVO>> getPictures(@Validated @RequestBody PictureViewDTO pictureViewDTO) {
         return R.succeed(resourceManage.getPictures(pictureViewDTO));
@@ -182,6 +194,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getPicturesByPage")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-图片分页查看")
     @ApiOperation(value = "患者管理-详情-图片分页查看")
     @Deprecated
     public Result<Page<PictureVO>> pageQueryPictures(@Validated @RequestBody PictureQueryDTO pictureListDTO) {
@@ -190,6 +203,7 @@ public class ResourceController {
 
 
     @PostMapping("/getAutofocusPictures")
+    @OperateLog(module = "设备数据接口", operation = "患者管理-详情-对焦预览")
     @ApiOperation(value = "患者管理-详情-对焦预览")
     public Result<FocusPreviewVO> getAutofocusPictures(@Validated @RequestBody FocusPreviewQueryDTO focusPreviewQueryDTO) {
         return R.succeed(resourceManage.getAutofocusPictures(focusPreviewQueryDTO));
@@ -199,6 +213,7 @@ public class ResourceController {
     // =============================视频图片下载部分=============================
 
     @GetMapping("/downloadFocusPicture")
+    @OperateLog(module = "设备数据接口", operation = "下载对焦图片")
     @ApiOperation(value = "下载对焦图片")
     @NoToken
     public void downloadFocusPicture(FocusPreviewQueryDTO focusPreviewQueryDTO, HttpServletRequest request, HttpServletResponse response) {
@@ -213,6 +228,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/downloadPicture")
+    @OperateLog(module = "设备数据接口", operation = "下载选中扣图-单张")
     @ApiOperation(value = "下载选中扣图-单张")
     public void downloadPicture(@Validated PictureSelectExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.downloadPicture(dto, request, response);
@@ -225,6 +241,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/downloadSourcePicture")
+    @OperateLog(module = "设备数据接口", operation = "下载选中原图-单张")
     @ApiOperation(value = "下载选中原图-单张")
     public void downloadSourcePicture(@Validated PictureSelectExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.downloadSourcePicture(dto, request, response);
@@ -237,6 +254,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/downloadSelectPictures")
+    @OperateLog(module = "设备数据接口", operation = "下载选中图片-压缩包")
     @ApiOperation(value = "下载选中图片-压缩包")
     public void downloadSelectPictures(@Validated @RequestBody PictureSelectExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.downloadSelectPictures(dto, request, response);
@@ -249,6 +267,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/downloadPictures")
+    @OperateLog(module = "设备数据接口", operation = "下载指定胚胎-指定图层所有图片")
     @ApiOperation(value = "下载指定胚胎-指定图层所有图片")
     public void downloadPictures(@Validated PictureExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.downloadPictures(dto, request, response);
@@ -262,6 +281,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/downloadSourcePictures")
+    @OperateLog(module = "设备数据接口", operation = "下载源图")
     @ApiOperation(value = "下载源图")
     public void downloadSourcePictures(@Validated @RequestBody SourcePictureExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.downloadSourcePictures(dto, request, response);
@@ -274,18 +294,21 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/downloadVideos")
+    @OperateLog(module = "设备数据接口", operation = "下载指定胚胎视频- 指定图层")
     @ApiOperation(value = "下载指定胚胎视频- 指定图层")
     public void downloadVideos(@Validated VideoExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.downloadVideos(dto, request, response);
     }
 
     @GetMapping("/download")
+    @OperateLog(module = "设备数据接口", operation = "下载")
     @NoToken
     public void download(HttpServletRequest request, HttpServletResponse response) {
         resourceManage.download(request, response);
     }
 
     @PostMapping("/cleanData")
+    @OperateLog(module = "设备数据接口", operation = "清理数据")
     @NoToken
     public void cleanData() {
         String tlSn = "";
@@ -301,6 +324,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @GetMapping("/exportPictures")
+    @OperateLog(module = "设备数据接口", operation = "导出图片")
     @ApiOperation(value = "导出图片")
     public void exportPictures(@Validated PictureBatchExportDTO dto, HttpServletRequest request, HttpServletResponse response) {
         resourceManage.exportPictures(dto, request, response);

+ 2 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/scanpermission/PermissionController.java

@@ -5,6 +5,7 @@ import com.aivfo.auth.util.PermissionaScan;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
 import com.aivfo.el.starter.base.utils.JsonUtils;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Value;
@@ -38,6 +39,7 @@ public class PermissionController {
      * 获取权限配置初始化数据
      */
     @PostMapping("/getInitPermissionInfo")
+    @OperateLog(module = "扫描权限接口", operation = "获取权限配置初始化数据")
     @ApiOperation(value = "获取权限配置初始化数据", notes = "传入一个实体")
     @PreAuthorize(name = "获取权限配置初始化数据", functionKey = "businessInitPermissionInfo", functionTypeKey = "auth")
     public Result<String> getInitPermissionInfo() {

+ 6 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/setting/DictionaryController.java

@@ -9,6 +9,7 @@ import com.aivfo.business.manage.entity.vo.setting.dictionary.DictionaryQueryVO;
 import com.aivfo.business.manage.pc.manage.setting.DictionaryManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -38,6 +39,7 @@ public class DictionaryController {
      * 添加数据字典 - 标记key
      */
     @PostMapping("/add")
+    @OperateLog(module = "数据字典接口", operation = "通用 - 添加")
     @ApiOperation(value = "通用 - 添加")
     @PreAuthorize(name = "通用 - 添加", functionKey = "addDictionary", functionTypeKey = "setting")
     public Result<Long> add(@Validated @RequestBody DictionaryInsertDTO insertDTO ) {
@@ -48,6 +50,7 @@ public class DictionaryController {
      * 修改数据字典 - 标记key
      */
     @PostMapping("/update")
+    @OperateLog(module = "数据字典接口", operation = "通用 - 修改")
     @ApiOperation(value = "通用 - 修改")
     @PreAuthorize(name = "通用 - 修改", functionKey = "updateDictionary", functionTypeKey = "Dictionary")
     public Result<Void> update(@Validated @RequestBody DictionaryUpdateDTO dto) {
@@ -60,6 +63,7 @@ public class DictionaryController {
      * 删除数据字典
      */
     @PostMapping("/id")
+    @OperateLog(module = "数据字典接口", operation = "通过id删除数据字典")
     @ApiOperation(value = "通过id删除数据字典", notes = "传入设备id")
     @PreAuthorize(name = "删除数据字典", functionKey = "deleteDictionary", functionTypeKey = "Dictionary")
     public Result<Void> delete(@RequestParam Long id) {
@@ -71,6 +75,7 @@ public class DictionaryController {
      * 根据字典key查询 - 含根节点
      */
     @PostMapping(value = "/queryDictionaries")
+    @OperateLog(module = "数据字典接口", operation = "根据字典key查询 - 含根节点")
     @ApiOperation(value = "根据字典key查询 - 含根节点", produces = MediaType.APPLICATION_JSON_VALUE)
     @PreAuthorize(name = "根据字典key查询 - 含根节点", functionKey = "queryDictionarys", functionTypeKey = "Dictionary")
     public Result<List<DictionaryQueryVO>> queryDictionaries(@RequestBody DictionaryQuery query) {
@@ -82,6 +87,7 @@ public class DictionaryController {
      * 根据字典key查询 - 不含根节点
      */
     @PostMapping(value = "/queryDictionaryByType")
+    @OperateLog(module = "数据字典接口", operation = "根据字典key查询 - 不含根节点")
     @ApiOperation(value = "根据字典key查询 - 不含根节点", produces = MediaType.APPLICATION_JSON_VALUE)
     @PreAuthorize(name = "根据字典key查询 - 不含根节点", functionKey = "queryDictionarysByType", functionTypeKey = "Dictionary")
     public Result<List<DictionaryListVO>> queryDictionariesByType(@RequestBody DictionaryQuery query) {

+ 7 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/setting/PhotoSearchButtonController.java

@@ -7,6 +7,7 @@ import com.aivfo.business.manage.entity.vo.setting.photosearchbutton.PhotoSearch
 import com.aivfo.business.manage.pc.manage.setting.PhotoSearchButtonManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -33,6 +34,7 @@ public class PhotoSearchButtonController {
      * 添加图片查看按钮
      */
     @PostMapping("/save")
+    @OperateLog(module = "按钮管理接口", operation = "维护 - 添加按钮")
     @ApiOperation(value = "维护 - 添加按钮")
     public Result<Long> save(@Validated @RequestBody InsertPhotoSearchButtonDTO photoSearchButtonDto) {
         return R.succeed(photoSearchButtonManage.save(photoSearchButtonDto));
@@ -42,6 +44,7 @@ public class PhotoSearchButtonController {
      * 修改图片查看按钮
      */
     @PostMapping("/update")
+    @OperateLog(module = "按钮管理接口", operation = "维护 - 修改按钮")
     @ApiOperation(value = "维护 - 修改按钮")
     public Result<Void> update(@Validated @RequestBody UpdatePhotoSearchButtonDTO photoSearchButtonDto) {
         photoSearchButtonManage.update(photoSearchButtonDto);
@@ -52,6 +55,7 @@ public class PhotoSearchButtonController {
      * 修改状态
      */
     @PostMapping("/updateState")
+    @OperateLog(module = "按钮管理接口", operation = "修改按钮状态")
     @ApiOperation(value = "修改按钮状态")
     public Result<Void> updateState(@RequestParam("id")Long id,@RequestParam("state") Integer state) {
         photoSearchButtonManage.updateState(id,state);
@@ -63,6 +67,7 @@ public class PhotoSearchButtonController {
      * 查询指定类型按钮信息 - 启用的
      */
     @PostMapping(value = "/getButtons")
+    @OperateLog(module = "按钮管理接口", operation = "查询指定类型按钮信息 - 启用的")
     @ApiOperation(value = "查询指定类型按钮信息 - 启用的")
     public Result<List<PhotoSearchButtonQueryVO> > getCommonButtonList(@RequestBody PhotoSearchButtonQuery query) {
         return R.succeed(photoSearchButtonManage.getButtons(query));
@@ -72,6 +77,7 @@ public class PhotoSearchButtonController {
      * 查询指定类型按钮信息 - 含禁用
      */
     @PostMapping(value = "/getButtonList")
+    @OperateLog(module = "按钮管理接口", operation = "查询指定类型按钮信息 - 含禁用")
     @ApiOperation(value = "查询指定类型按钮信息 - 含禁用")
     public Result<List<PhotoSearchButtonQueryVO> > getButtonList(@RequestBody PhotoSearchButtonQuery query) {
         return R.succeed(photoSearchButtonManage.getButtonList(query));
@@ -82,6 +88,7 @@ public class PhotoSearchButtonController {
      * 删除图片查看按钮
      */
     @PostMapping("/id")
+    @OperateLog(module = "按钮管理接口", operation = "维护 - 删除按钮")
     @ApiOperation(value = "维护 - 删除按钮")
     public Result<Void> delete(@RequestParam Long id) {
         photoSearchButtonManage.removeById(id);

+ 13 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-pc-controller/src/main/java/com/aivfo/business/manage/pc/controller/setting/ScoreModelSettingController.java

@@ -13,6 +13,7 @@ import com.aivfo.business.manage.entity.vo.setting.ScoreModel.MarkWeightVO;
 import com.aivfo.business.manage.pc.manage.setting.ScoreModelSettingManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -40,6 +41,7 @@ public class ScoreModelSettingController {
      * 添加标记key
      */
     @PostMapping("/addMarkKey")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "添加标记key")
     @ApiOperation(value = "添加标记key")
     @PreAuthorize(name = "添加标记key", functionKey = "addMarkKey", functionTypeKey = "setting")
     public Result<Long> addMarkKey(@Validated @RequestBody MarkKeyInsertDTO markKeyInsertDTO) {
@@ -50,6 +52,7 @@ public class ScoreModelSettingController {
      * 修改标记key
      */
     @PostMapping("/updateMarkKey")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "修改标记key")
     @ApiOperation(value = "修改标记key")
     @PreAuthorize(name = "修改标记key", functionKey = "updateMarkKey", functionTypeKey = "Dictionary")
     public Result<Void> updateMarkKey(@Validated @RequestBody MarkKeyUpdataDTO dto) {
@@ -61,6 +64,7 @@ public class ScoreModelSettingController {
      * 获取所有标记key
      */
     @PostMapping("/getMarkKeyList")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "获取所有标记key")
     @ApiOperation(value = "获取所有标记key")
     @PreAuthorize(name = "获取所有标记key", functionKey = "getMarkKeyList", functionTypeKey = "Dictionary")
     public Result<List<MarkKeyVO>> getMarkKeyList() {
@@ -71,6 +75,7 @@ public class ScoreModelSettingController {
      * 删除标记key
      */
     @PostMapping("/deleteMarkKey")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "删除标记key")
     @ApiOperation(value = "删除标记key")
     @PreAuthorize(name = "删除标记key", functionKey = "deleteMarkKey", functionTypeKey = "Dictionary")
     public Result<Void> deleteMarkKey(@RequestParam("id") Long id ) {
@@ -84,6 +89,7 @@ public class ScoreModelSettingController {
      * 添加胚胎等级
      */
     @PostMapping("/addEmbryoLevel")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "维护胚胎等级 - 添加")
     @ApiOperation(value = "维护胚胎等级 - 添加")
     @PreAuthorize(name = "维护胚胎等级 - 添加", functionKey = "addDictionary", functionTypeKey = "setting")
     public Result<Long> addEmbryoLevel(@Validated @RequestBody EmbryoLevelInsertDTO dto) {
@@ -94,6 +100,7 @@ public class ScoreModelSettingController {
      * 修改胚胎等级
      */
     @PostMapping("/updateEmbryoLevel")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "维护胚胎等级 - 修改")
     @ApiOperation(value = "维护胚胎等级 - 修改")
     @PreAuthorize(name = "维护胚胎等级 - 修改", functionKey = "updateDictionary", functionTypeKey = "Dictionary")
     public Result<Void> updateEmbryoLevel(@Validated @RequestBody EmbryoLevelUpdateDTO dto) {
@@ -105,6 +112,7 @@ public class ScoreModelSettingController {
      * 获取所有胚胎等级
      */
     @PostMapping("/getEmbryoLevelList")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "获取所有胚胎等级")
     @ApiOperation(value = "获取所有胚胎等级")
     @PreAuthorize(name = "获取所有胚胎等级", functionKey = "getEmbryoLevelList", functionTypeKey = "Dictionary")
     public Result<List<EmbryoLevelVO>> getEmbryoLevelList() {
@@ -115,6 +123,7 @@ public class ScoreModelSettingController {
      * 删除胚胎等级
      */
     @PostMapping("/deleteEmbryoLevel")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "删除胚胎等级")
     @ApiOperation(value = "删除胚胎等级")
     @PreAuthorize(name = "删除胚胎等级", functionKey = "deleteEmbryoLevel", functionTypeKey = "Dictionary")
     public Result<Void> deleteEmbryoLevel(@RequestParam("id") Long id ) {
@@ -127,6 +136,7 @@ public class ScoreModelSettingController {
      * 添加评分权重
      */
     @PostMapping("/addMarkWeight")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "添加评分权重")
     @ApiOperation(value = "添加评分权重")
     @PreAuthorize(name = "添加评分权重", functionKey = "addMarkWeight", functionTypeKey = "setting")
     public Result<Long> addMarkWeight(@Validated @RequestBody MarkWeightInsertDTO dto) {
@@ -138,6 +148,7 @@ public class ScoreModelSettingController {
      * 修改评分权重
      */
     @PostMapping("/updateMarkWeight")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "修改评分权重")
     @ApiOperation(value = "修改评分权重")
     @PreAuthorize(name = "修改评分权重", functionKey = "updateMarkWeight", functionTypeKey = "setting")
     public Result<Long> updateMarkWeight(@Validated @RequestBody MarkWeightIUpdateDTO dto) {
@@ -149,6 +160,7 @@ public class ScoreModelSettingController {
      * 删除评分权重
      */
     @PostMapping("/deleteMarkWeight")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "删除评分权重")
     @ApiOperation(value = "删除评分权重")
     @PreAuthorize(name = "删除评分权重", functionKey = "updateMarkWeight", functionTypeKey = "setting")
     public Result<Void> deleteMarkWeight(@RequestParam("id") Long id ) {
@@ -160,6 +172,7 @@ public class ScoreModelSettingController {
      * 修改评分权重
      */
     @PostMapping("/getMarkWeightList")
+    @OperateLog(module = "评分模型相关设置配置接口", operation = "查询评分权重")
     @ApiOperation(value = "查询评分权重")
     @PreAuthorize(name = "查询评分权重", functionKey = "getMarkWeightList", functionTypeKey = "setting")
     public Result<List<MarkWeightVO>> MarkWeight() {

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/culture/BalanceController.java

@@ -9,6 +9,7 @@ import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.exception.BusinessException;
 import com.aivfo.el.starter.base.Result;
 import com.aivfo.el.starter.base.utils.StringPool;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -37,6 +38,7 @@ public class BalanceController {
      * 仓室列表 - 开始平衡
      */
     @PostMapping(value = "/startBalance")
+    @OperateLog(module = "仓室平衡", operation = "开始平衡")
     @ApiOperation(value = "仓室列表 - 开始平衡")
     public Result<Void> startBalance(@Validated @RequestBody BalanceInsertDTO balanceInsertDTO) {
         String id = balanceInsertDTO.getTlSn() + StringPool.COLON + balanceInsertDTO.getHouseSn();
@@ -56,6 +58,7 @@ public class BalanceController {
      * 仓室列表 - 结束平衡
      */
     @PostMapping(value = "/stopBalance")
+    @OperateLog(module = "仓室平衡", operation = "结束平衡")
     @ApiOperation(value = "仓室列表 - 结束平衡")
     public Result<Void> stopBalance(@Validated @RequestBody BalanceUpdateDTO balanceUpdateDTO) {
         balanceMange.stop(balanceUpdateDTO);

+ 10 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/culture/EmbryoCultureRecordController.java

@@ -17,6 +17,7 @@ import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.exception.BusinessException;
 import com.aivfo.el.starter.base.Result;
 import com.aivfo.el.starter.base.utils.StringPool;
+import com.aivfo.log.annotation.OperateLog;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -47,6 +48,7 @@ public class EmbryoCultureRecordController {
      * 患者管理 - 仓室列表
      */
     @PostMapping(value = "/getHouseCultureList")
+    @OperateLog(module = "患者培养", operation = "仓室列表")
     @ApiOperation(value = "患者管理 - 仓室列表")
     public Result<HouseCultureList> getHouseCultureList(@RequestParam String tlSn) {
         return R.succeed(embryoCultureRecordManage.getCultureListByTlSn(tlSn));
@@ -57,6 +59,7 @@ public class EmbryoCultureRecordController {
      * 添加患者 - 培养记录
      */
     @PostMapping("/addCultureRecord")
+    @OperateLog(module = "患者培养", operation = "添加患者信息")
     @ApiOperation(value = "开始培养 - 添加患者信息")
     public Result<Void> addCultureRecord(@Validated @RequestBody EmbryoCultureRecordInsertDTO dto) {
         String id = dto.getTlSn() + StringPool.COLON + dto.getHouseSn();
@@ -77,6 +80,7 @@ public class EmbryoCultureRecordController {
      * 添加患者 - 获取历史病例信息
      */
     @PostMapping("/getHistoryCaseInfo")
+    @OperateLog(module = "患者培养", operation = "获取历史病例信息")
     @ApiOperation(value = "添加患者信息 - 获取历史病例信息")
     public Result<List<CaseInfoVO>> getHistoryCaseInfo(@Validated @RequestBody CaseHistoryQuery dto) {
         return R.succeed(embryoCultureRecordManage.getHistoryCaseInfo(dto));
@@ -87,6 +91,7 @@ public class EmbryoCultureRecordController {
      * 修改信息
      */
     @PostMapping("/updateCultureRecord")
+    @OperateLog(module = "患者培养", operation = "编辑患者信息")
     @ApiOperation(value = "编辑患者信息")
     public Result<Void> addCultureRecord(@Validated @RequestBody EmbryoCultureRecordUpdateDTO dto) {
         embryoCultureRecordManage.updateEmbryoCultureRecord(dto);
@@ -98,6 +103,7 @@ public class EmbryoCultureRecordController {
      * 结束培养
      */
     @PostMapping("/endCultureRecord")
+    @OperateLog(module = "患者培养", operation = "结束培养")
     @ApiOperation(value = "结束培养", notes = "培养记录id")
     public Result<Void> endCultureRecord(@RequestParam Long id) {
         embryoCultureRecordManage.endCultureRecord(id);
@@ -109,6 +115,7 @@ public class EmbryoCultureRecordController {
      * 通过id查询培养记录详情
      */
     @PostMapping(value = "/getCultureRecordById")
+    @OperateLog(module = "患者培养", operation = "患者详情")
     @ApiOperation(value = "患者管理 - 详情", notes = "传入培养记录id")
     public Result<EmbryoCultureRecordDetailVO> getCultureRecordById(@RequestParam("id") Long id) {
         return R.succeed(embryoCultureRecordManage.getEmbryoCultureRecordById(id));
@@ -118,6 +125,7 @@ public class EmbryoCultureRecordController {
      * 带条件查询数据
      */
     @PostMapping(value = "/getEmbryoCultureRecord")
+    @OperateLog(module = "患者培养", operation = "培养记录分页查询")
     @ApiOperation(value = "培养记录 - 分页查询")
     public Result<Page<EmbryoCultureRecordPageVO>> getEmbryoCultureRecord(@Validated @RequestBody EmbryoCultureRecordQuery query) {
         return R.succeed(embryoCultureRecordManage.getEmbryoCultureRecord(query));
@@ -128,6 +136,7 @@ public class EmbryoCultureRecordController {
      * 查询培养记录的数量
      */
     @PostMapping(value = "/getEmbryoCultureRecordNum")
+    @OperateLog(module = "患者培养", operation = "查询培养记录数量")
     @ApiOperation(value = "培养记录 - 查询数量")
     @PreAuthorize(name = "培养记录 - 查询数量", functionKey = "getEmbryoCultureRecordNum", functionTypeKey = "culture")
     public Result<EmbryoRecordNumVO> getEmbryoCultureRecordNum(@RequestBody EmbryoCultureRecordQuery query) {
@@ -138,6 +147,7 @@ public class EmbryoCultureRecordController {
      * 删除培养记录
      */
     @PostMapping(value = "/deleteEmbryoCultureRecord")
+    @OperateLog(module = "患者培养", operation = "删除培养记录")
     @ApiOperation(value = "删除培养记录")
     @PreAuthorize(name = "删除培养记录", functionKey = "deleteEmbryoCultureRecord", functionTypeKey = "culture")
     public Result<Void> deleteEmbryoCultureRecord(@RequestParam("id") Long id) {

+ 6 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/culture/EmbryoMarkController.java

@@ -8,6 +8,7 @@ import com.aivfo.business.manage.entity.vo.culture.embryomark.EmbryoCultureRecor
 import com.aivfo.business.manage.surface.manage.culture.EmbryoMarkManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -30,6 +31,7 @@ public class EmbryoMarkController {
      * 胚胎去向标记
      */
     @PostMapping(value = "/markEmbryoDestination")
+    @OperateLog(module = "胚胎标记", operation = "胚胎去向标记")
     @ApiOperation(value = "胚胎去向标记", notes = "标记胚胎移植、冷冻、删除等,传入胚胎id")
     public Result<Void> markEmbryoDestination(@Validated @RequestBody EmbryoMarkDestinationDTO dto) {
         embryoMarkManage.markEmbryoDestination(dto);
@@ -40,6 +42,7 @@ public class EmbryoMarkController {
      * 胚胎形态学标记
      */
     @PostMapping(value = "/markEmbryo")
+    @OperateLog(module = "胚胎标记", operation = "胚胎形态学标记")
     @ApiOperation(value = "胚胎形态学标记", notes = "标记胚胎形态:2PN、囊胚等")
     public Result<Void> markEmbryo(@Validated @RequestBody EmbryoMarkInsertDTO dto) {
         embryoMarkManage.markEmbryo(dto);
@@ -50,6 +53,7 @@ public class EmbryoMarkController {
      * 通过胚胎id查询胚胎标记信息
      */
     @PostMapping(value = "/getEmbryoMark")
+    @OperateLog(module = "胚胎标记", operation = "标记结果-单个well")
     @ApiOperation(value = "标记结果 - 单个well", notes = "传入胚胎id")
     @Deprecated
     public Result<EmbryoMarkResultVO> getEmbryoMark(@RequestParam Long id) {
@@ -60,6 +64,7 @@ public class EmbryoMarkController {
      * 通过培养记录id查询标记结果
      */
     @PostMapping(value = "/getMarkResultById")
+    @OperateLog(module = "胚胎标记", operation = "标记结果")
     @ApiOperation(value = "患者管理 - 标记结果", notes = "传入培养记录id")
     @Deprecated
     public Result<EmbryoCultureRecordMarkVO> getMarkResultById(@RequestParam("id") Long id) {
@@ -70,6 +75,7 @@ public class EmbryoMarkController {
      * 标记结果导出
      */
     @PostMapping(value = "/exportMarkResult")
+    @OperateLog(module = "胚胎标记", operation = "标记结果导出")
     @ApiOperation(value = "患者管理 - 标记结果-导出", notes = "传入选中胚胎id")
     @Deprecated
     public Result<Void> exportMarkResult(@Validated @RequestBody EmbryoMarkExportDTO dto, HttpServletResponse response) {

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/identify/PictureIdentifyController.java

@@ -5,6 +5,7 @@ import com.aivfo.business.manage.entity.vo.culture.embryomark.PictureIdentifyRes
 import com.aivfo.business.manage.surface.manage.identify.PictureIdentifyManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -33,6 +34,7 @@ public class PictureIdentifyController {
      * 查询当前胚胎 - 图片识别结果
      */
     @PostMapping(value = "/getIdentifyResultByEmbryoId")
+    @OperateLog(module = "图片识别", operation = "查询当前胚胎图片识别结果")
     @ApiOperation(value = "查询当前胚胎 - 图片识别结果")
     public Result<List<PictureIdentifyResultVO>> getIdentifyResultByEmbryoId(@RequestParam("id")Long id){
         return R.succeed(pictureIdentifyManage.getIdentifyResultByEmbryoId(id));
@@ -42,6 +44,7 @@ public class PictureIdentifyController {
      * 查询当前培养记录 - 图片识别结果
      */
     @PostMapping(value = "/getIdentifyResultByRecordId")
+    @OperateLog(module = "图片识别", operation = "查询当前培养记录图片识别结果")
     @ApiOperation(value = "查询当前培养记录 - 图片识别结果")
     public Result<EmbryoCultureRecordIdentifyVO> getIdentifyResultByRecordId(@RequestParam("id")Long id){
         return R.succeed(pictureIdentifyManage.getIdentifyResultByRecordId(id));

+ 10 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/resource/ResourceController.java

@@ -11,6 +11,7 @@ import com.aivfo.business.manage.entity.vo.resource.picture.surface.SourcePictur
 import com.aivfo.business.manage.surface.manage.resource.ResourceManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -46,6 +47,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getPicturesByRecordId")
+    @OperateLog(module = "设备数据", operation = "获取指定well所有图层视频及最清晰图层图片")
     @ApiOperation(value = "患者管理-详情-获取指定well所有图层视频及视频最清晰图层图片")
     @Deprecated
     public Result<List<ResourceListVO>> getPicturesByRecordId(@Validated @RequestBody PictureAndVideoQueryDTO dto) {
@@ -59,6 +61,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/switchVideoPictureLayers")
+    @OperateLog(module = "设备数据", operation = "获取指定well的指定图层图片")
     @ApiOperation(value = "患者管理-详情-获取指定指定well的指定图层图片")
     @Deprecated
     public Result<List<SwitchVideoPictureLayerVO>> switchVideoPictureLayers(@Validated @RequestBody SwitchVideoPictureLayerDTO dto) {
@@ -72,6 +75,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getRecordDetail")
+    @OperateLog(module = "设备数据", operation = "获取所有图层视频及视频时间轴")
     @ApiOperation(value = "患者管理-详情-获取所有图层视频及视频时间轴")
     public Result<List<EmbryoRecordDetailResourceVO>> getRecordDetail(@Validated @RequestBody PictureAndVideoQueryDTO dto) {
         return R.succeed(resourceManage.getRecordDetail(dto));
@@ -85,6 +89,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/switchVideoLayerByPicture")
+    @OperateLog(module = "设备数据", operation = "视频切换图层-获取单张图片")
     @ApiOperation(value = "患者管理-详情-图片视频 - 视频切换图层 - 获取单张图片")
     public Result<String> switchVideoLayerByPicture(@Validated @RequestBody SwitchVideoLayerByPictureDTO dto) {
         return R.succeed(resourceManage.switchVideoLayerByPicture(dto));
@@ -97,6 +102,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getVideoTimeLine")
+    @OperateLog(module = "设备数据", operation = "视频切换图层-获取时间轴")
     @ApiOperation(value = "患者管理-详情-视频切换图层(获取时间轴)")
     public Result<List<VideoLinePictureVO>> getVideoTimeLine(@Validated @RequestBody SwitchVideoLayerDTO dto) {
         return R.succeed(resourceManage.getVideoTimeLine(dto));
@@ -110,6 +116,7 @@ public class ResourceController {
      * @date 2023/7/12 11:53
      **/
     @PostMapping("/getEmbryosLastPictures")
+    @OperateLog(module = "设备数据", operation = "获取指定培养记录所有well最新图片")
     @ApiOperation(value = "获取指定培养记录所有well最新图片")
     public Result<List<PictureVO>> getEmbryosLastPictures(@Validated @RequestBody RecordPictureDTO dto) {
         return R.succeed(resourceManage.getEmbryosLastPictures(dto));
@@ -123,6 +130,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getSourcePictures")
+    @OperateLog(module = "设备数据", operation = "图片查看-获取原图")
     @ApiOperation(value = "患者管理-详情-图片查看(获取原图)")
     public Result<List<SourcePictureVO>> getPictures(@Validated @RequestBody PictureQuerySourceDTO pictureListDTO) {
         return R.succeed(resourceManage.getSourcePictures(pictureListDTO));
@@ -135,6 +143,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getPictures")
+    @OperateLog(module = "设备数据", operation = "图片查看-获取抠图")
     @ApiOperation(value = "患者管理-详情-图片查看(获取抠图)")
     public Result<List<PictureViewVO>> getPictures(@Validated @RequestBody PictureViewDTO pictureViewDTO) {
         return R.succeed(resourceManage.getPictures(pictureViewDTO));
@@ -149,6 +158,7 @@ public class ResourceController {
      * @date 2023/7/12 13:26
      **/
     @PostMapping("/getPicturesByPage")
+    @OperateLog(module = "设备数据", operation = "图片查看-分页查询")
     @ApiOperation(value = "详情-图片查看(分页查询)")
     @Deprecated
     public Result<Page<PictureVO>> getPictures(@Validated @RequestBody PictureQueryDTO pictureListDTO) {

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/setting/DictionaryController.java

@@ -7,6 +7,7 @@ import com.aivfo.business.manage.entity.vo.setting.dictionary.DictionaryQueryVO;
 import com.aivfo.business.manage.surface.manage.setting.DictionaryManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -34,6 +35,7 @@ public class DictionaryController {
      * 根据字典key查询 - 含根节点
      */
     @PostMapping(value = "/queryDictionaries")
+    @OperateLog(module = "数据字典", operation = "根据字典key查询-含根节点")
     @ApiOperation(value = "根据字典key查询 - 含根节点", produces = MediaType.APPLICATION_JSON_VALUE)
     @PreAuthorize(name = "根据字典key查询 - 含根节点", functionKey = "queryDictionarys", functionTypeKey = "Dictionary")
     public Result<List<DictionaryQueryVO>> queryDictionaries(@RequestBody DictionaryQuery query) {
@@ -45,6 +47,7 @@ public class DictionaryController {
      * 根据字典key查询 - 不含根节点
      */
     @PostMapping(value = "/queryDictionaryByType")
+    @OperateLog(module = "数据字典", operation = "根据字典key查询-不含根节点")
     @ApiOperation(value = "根据字典key查询 - 不含根节点", produces = MediaType.APPLICATION_JSON_VALUE)
     @PreAuthorize(name = "根据字典key查询 - 不含根节点", functionKey = "queryDictionarysByType", functionTypeKey = "Dictionary")
     public Result<List<DictionaryListVO>> queryDictionariesByType(@RequestBody DictionaryQuery query) {

+ 7 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/setting/MarkController.java

@@ -7,6 +7,7 @@ import com.aivfo.business.manage.entity.vo.setting.mark.MarkQueryVO;
 import com.aivfo.business.manage.surface.manage.setting.MarkManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -32,6 +33,7 @@ public class MarkController {
      * 查询所有评分模型 - 含禁用
      */
     @PostMapping("/getModels")
+    @OperateLog(module = "评分配置", operation = "查询所有评分模型-含禁用")
     @ApiOperation(value = "查询所有评分模型 - 含禁用")
     @PreAuthorize(name = "查询所有评分模型 - 含禁用", functionKey = "getModels", functionTypeKey = "Mark")
     public Result<List<MarkModelVO>> getModels() {
@@ -42,6 +44,7 @@ public class MarkController {
      * 查询所有启用的评分模型
      */
     @PostMapping("/getEnableModels")
+    @OperateLog(module = "评分配置", operation = "查询所有启用的评分模型")
     @ApiOperation(value = "查询所有启用的评分模型")
     @PreAuthorize(name = "查询所有启用的评分模型", functionKey = "getEnableModels", functionTypeKey = "Mark")
     public Result<List<MarkModelVO>> getEnableModels() {
@@ -52,6 +55,7 @@ public class MarkController {
      * 查询所有评分配置信息 - 启用的
      */
     @PostMapping(value = "/getEnableMarkTreeList")
+    @OperateLog(module = "评分配置", operation = "查询所有评分配置信息-启用的")
     @ApiOperation(value = "查询所有评分配置信息 - 启用的", notes = "树形结构数据")
     @PreAuthorize(name = "查询所有评分配置信息 - 启用的", functionKey = "getMarkTreeList", functionTypeKey = "Mark")
     public Result<List<MarkQueryVO>> getEnableMarkTreeList(@RequestBody MarkQuery markQuery) {
@@ -63,6 +67,7 @@ public class MarkController {
      * 查询所有评分配置信息 - 含禁用
      */
     @PostMapping(value = "/getMarkTreeList")
+    @OperateLog(module = "评分配置", operation = "查询所有评分配置信息-含禁用")
     @ApiOperation(value = "查询所有评分配置信息 - 含禁用", notes = "树形结构数据")
     @PreAuthorize(name = "查询所有评分配置信息 - 含禁用", functionKey = "getMarkTreeList", functionTypeKey = "Mark")
     public Result<List<MarkQueryVO>> getMarkTreeList(@RequestBody MarkQuery markQuery) {
@@ -74,6 +79,7 @@ public class MarkController {
      * 查询所有阶段
      */
     @PostMapping(value = "/getStages")
+    @OperateLog(module = "评分配置", operation = "查询所有阶段")
     @ApiOperation(value = "查询所有阶段")
     @PreAuthorize(name = "查询所有阶段", functionKey = "getStages", functionTypeKey = "Mark")
     public Result<List<MarkQueryVO>> getStages(@RequestParam(required = false) Long model) {
@@ -84,6 +90,7 @@ public class MarkController {
      * 通过id查询评分配置信息
      */
     @PostMapping(value = "/getMarkTreeNodeById")
+    @OperateLog(module = "评分配置", operation = "查询当前节点及其子节点")
     @ApiOperation(value = "查询当前节点及其子节点", notes = "树形结构数据")
     @PreAuthorize(name = "当前节点及其子节点", functionKey = "getMarkById", functionTypeKey = "Mark")
     @Deprecated

+ 3 - 0
aivfo-business-manage/aivfo-business-manage-controller/aivfo-business-manage-surface-controller/src/main/java/com/aivfo/business/manage/surface/controller/setting/PhotoSearchButtonController.java

@@ -5,6 +5,7 @@ import com.aivfo.business.manage.entity.vo.setting.photosearchbutton.PhotoSearch
 import com.aivfo.business.manage.surface.manage.setting.PhotoSearchButtonManage;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -33,6 +34,7 @@ public class PhotoSearchButtonController {
      * 查询指定类型按钮信息 - 启用的
      */
     @PostMapping(value = "/getButtons")
+    @OperateLog(module = "按钮管理", operation = "查询指定类型按钮信息-启用的")
     @ApiOperation(value = "查询指定类型按钮信息 - 启用的")
     public Result<List<PhotoSearchButtonQueryVO> > getCommonButtonList(@RequestBody PhotoSearchButtonQuery query) {
         return R.succeed(photoSearchButtonManage.getButtons(query));
@@ -42,6 +44,7 @@ public class PhotoSearchButtonController {
      * 查询指定类型按钮信息 - 含禁用
      */
     @PostMapping(value = "/getButtonList")
+    @OperateLog(module = "按钮管理", operation = "查询指定类型按钮信息-含禁用")
     @ApiOperation(value = "查询指定类型按钮信息 - 含禁用")
     public Result<List<PhotoSearchButtonQueryVO> > getButtonList(@RequestBody PhotoSearchButtonQuery query) {
         return R.succeed(photoSearchButtonManage.getButtonList(query));

+ 4 - 0
aivfo-business-manage/aivfo-business-manage-lanucher/.flattened-pom.xml

@@ -25,5 +25,9 @@
       <groupId>com.aivfo</groupId>
       <artifactId>aivfo-safety-spring-boot-starter</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.aivfo</groupId>
+      <artifactId>aivfo-oplog-client</artifactId>
+    </dependency>
   </dependencies>
 </project>

+ 7 - 1
aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-app-lanucher/src/main/resources/application-local.properties

@@ -51,4 +51,10 @@ aivfo.identify.tlsn[0]=NEO-1-20230107
 aivfo.identify.model.automark=false
 aivfo.identify.model.showresult=false
 #==================服务监控==================
-aivfo.monitor.client.monitorConf.serveId=519ae5bd2e6af6d1f938af8209437140
+aivfo.monitor.client.monitorConf.serveId=519ae5bd2e6af6d1f938af8209437140
+
+# kafka(操作日志发送端,M8 G3-2)
+aivfo.kafka.properties.ips=${server.ip}:9092
+aivfo.kafka.properties.producer.enable=true
+aivfo.kafka.properties.consumer.group=business-app-oplog
+aivfo.kafka.properties.consumer.autoOffsetReset=earliest

+ 7 - 1
aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-pc-lanucher/src/main/resources/application-local.properties

@@ -57,4 +57,10 @@ aivfo.monitor.client.monitorConf.robotType=1
 
 #异常信息国际化
 aivfo.internationalization.enable=true
-aivfo.internationalization.language=en
+aivfo.internationalization.language=en
+
+# kafka(操作日志发送端,M8 G3-2)
+aivfo.kafka.properties.ips=${server.ip}:9092
+aivfo.kafka.properties.producer.enable=true
+aivfo.kafka.properties.consumer.group=business-pc-oplog
+aivfo.kafka.properties.consumer.autoOffsetReset=earliest

+ 7 - 1
aivfo-business-manage/aivfo-business-manage-lanucher/aivfo-business-manage-surface-lanucher/src/main/resources/application-local.properties

@@ -58,4 +58,10 @@ server.servlet.encoding.charset=UTF-8
 server.servlet.encoding.enabled=true
 server.tomcat.uri-encoding=UTF-8
 aivfo.monitor.client.monitorConf.serveId=d7b24f981c9ad0f927842788f950df6d
-aivfo.monitor.client.monitorConf.robotType=1
+aivfo.monitor.client.monitorConf.robotType=1
+
+# kafka(操作日志发送端,M8 G3-2)
+aivfo.kafka.properties.ips=${server.ip}:9092
+aivfo.kafka.properties.producer.enable=true
+aivfo.kafka.properties.consumer.group=business-surface-oplog
+aivfo.kafka.properties.consumer.autoOffsetReset=earliest

+ 5 - 0
aivfo-business-manage/aivfo-business-manage-lanucher/pom.xml

@@ -25,5 +25,10 @@
             <groupId>com.aivfo</groupId>
             <artifactId>aivfo-safety-spring-boot-starter</artifactId>
         </dependency>
+        <!-- 操作日志 Kafka 发送端:KafkaOperationLogSender 自动装配(@ConditionalOnBean ProducerNormal)(M8 G3-2) -->
+        <dependency>
+            <groupId>com.aivfo</groupId>
+            <artifactId>aivfo-oplog-client</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 4 - 0
aivfo-business-manage/aivfo-business-manage-manage/.flattened-pom.xml

@@ -64,5 +64,9 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.aivfo</groupId>
+      <artifactId>aivfo-kafka-spring-boot-starter</artifactId>
+    </dependency>
   </dependencies>
 </project>

+ 5 - 0
aivfo-business-manage/aivfo-business-manage-manage/pom.xml

@@ -72,5 +72,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
+        <!-- 操作日志 Kafka 基础设施(M8 G3-2) -->
+        <dependency>
+            <groupId>com.aivfo</groupId>
+            <artifactId>aivfo-kafka-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 4 - 0
aivfo-business-manage/aivfo-business-manage-service/.flattened-pom.xml

@@ -15,5 +15,9 @@
       <groupId>com.aivfo</groupId>
       <artifactId>aivfo-business-manage-entity</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.aivfo</groupId>
+      <artifactId>aivfo-log-spring-boot-starter</artifactId>
+    </dependency>
   </dependencies>
 </project>

+ 5 - 0
aivfo-business-manage/aivfo-business-manage-service/pom.xml

@@ -15,5 +15,10 @@
             <artifactId>aivfo-business-manage-entity</artifactId>
         </dependency>
         <!-- ==========entity======== -->
+        <!-- 操作日志注解+切面(M8 G3-2) -->
+        <dependency>
+            <groupId>com.aivfo</groupId>
+            <artifactId>aivfo-log-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 5 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.alarm;
 import com.aivfo.auth.annotation.PreAuthorize;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.alarm.alarm.AlarmQuery;
 import com.aivfo.tl.control.entity.param.alarm.alarm.HouseCropAlarmQuery;
 import com.aivfo.tl.control.entity.param.alarm.alarm.MuteAlarmDTO;
@@ -35,6 +36,7 @@ public class AlarmController {
      * 带条件查询数据
      */
     @PostMapping(value = "/getAlarm")
+    @OperateLog(module = "报警数据接口", operation = "带条件查询系统异常")
     @ApiOperation(value = "带条件查询系统异常", notes = "传入AlarmQuery实体: " +
             "高级查询条件: selectType=查询范围, tlSn=设备编号 , houseSn=舱室编号 , alarmTypeId=报警类型id")
     @PreAuthorize(name = "查询系统异常", functionKey = "getAlarm", functionTypeKey = "alarm")
@@ -46,6 +48,7 @@ public class AlarmController {
      * 查询各种异常的数量x
      */
     @PostMapping(value = "/getAlarmNum")
+    @OperateLog(module = "报警数据接口", operation = "带条件查询系统异常数量")
     @ApiOperation(value = "带条件查询系统异常数量", notes = "只需要:" +
             "高级查询条件: tlSn=设备编号 , houseSn=舱室编号 , alarmTypeId=报警类型id")
     @PreAuthorize(name = "查询系统异常数量", functionKey = "getAlarmNum", functionTypeKey = "alarm")
@@ -57,6 +60,7 @@ public class AlarmController {
      * 修改报警静音状态
      */
     @PostMapping(value = "/muteAlarm")
+    @OperateLog(module = "报警数据接口", operation = "修改报警警报、通知信息")
     @ApiOperation(value = "修改报警警报、通知信息")
     public Result<Long> muteAlarm(@RequestBody MuteAlarmDTO muteAlarmDTO) {
         return R.succeed(alarmManage.muteAlarm(muteAlarmDTO));
@@ -66,6 +70,7 @@ public class AlarmController {
      * 查询舱室报警状态
      */
     @PostMapping(value = "/getHouseCropAlarm")
+    @OperateLog(module = "报警数据接口", operation = "查询舱室抠图报警")
     @ApiOperation(value = "查询舱室抠图报警")
     @PreAuthorize(name = "查询舱室抠图报警", functionKey = "getHouseCropAlarm", functionTypeKey = "alarm")
     public Result<List<HouseCropAlarmVO>> getHouseCropAlarm(@RequestBody HouseCropAlarmQuery query) {

+ 9 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmSettingController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.alarm;
 import com.aivfo.auth.annotation.PreAuthorize;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.alarm.alarmpermission.InsertAlarmPermissionDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarmpermission.UpdateAlarmPermissionDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarmpersonnel.InsertAlarmPersonnelDTO;
@@ -34,6 +35,7 @@ public class AlarmSettingController {
      * 添加报警联系人
      */
     @PostMapping("/addAlarmPersonnel")
+    @OperateLog(module = "报警通知配置接口", operation = "添加报警联系人信息")
     @ApiOperation(value = "添加报警联系人信息", notes = "传入一个AlarmPersonnel实体:添加id")
     @PreAuthorize(name = "添加报警联系人信息", functionKey = "addAlarmPersonnel", functionTypeKey = "alarm")
     public Result<Void> addAlarmPersonnel(@Validated(Insert.class) @RequestBody InsertAlarmPersonnelDTO dto) {
@@ -45,6 +47,7 @@ public class AlarmSettingController {
      * 修改报警联系人信息
      */
     @PostMapping("/updateAlarmPersonnel")
+    @OperateLog(module = "报警通知配置接口", operation = "修改报警联系人信息")
     @ApiOperation(value = "修改报警联系人信息", notes = "传入一个AlarmPersonnel实体:修改带id")
     @PreAuthorize(name = "修改报警联系人信息", functionKey = "updateAlarmPersonnel", functionTypeKey = "alarm")
     public Result<Void> updateAlarmPersonnel(@Validated(Update.class) @RequestBody UpdateAlarmPersonnelDTO dto) {
@@ -56,6 +59,7 @@ public class AlarmSettingController {
      * 通过id删除报警联系人
      */
     @PostMapping("/deleteAlarmPersonnel")
+    @OperateLog(module = "报警通知配置接口", operation = "通过id删除报警联系人")
     @ApiOperation(value = "通过id删除报警联系人", notes = "传入删除对象id")
     @PreAuthorize(name = "通过id删除报警联系人", functionKey = "removeAlarmPersonnelById", functionTypeKey = "alarm")
     public Result<Void> deleteAlarmPersonnel(@RequestParam("id") Long id) {
@@ -67,6 +71,7 @@ public class AlarmSettingController {
      * 查询所有报警联系人信息
      */
     @PostMapping(value = "/getAlarmPersonnellist")
+    @OperateLog(module = "报警通知配置接口", operation = "查询所有报警联系人及配置信息")
     @ApiOperation(value = "查询所有报警联系人及配置信息", notes = "xx")
     @PreAuthorize(name = "查询所有报警联系人及配置信息", functionKey = "getAlarmPersonnellist", functionTypeKey = "alarm")
     public Result<List<AlarmPersonnelVO>> getAlarmPersonnellist() {
@@ -77,6 +82,7 @@ public class AlarmSettingController {
      * 添加的报警配置信息
      */
     @PostMapping("/insertPersonnelPermission")
+    @OperateLog(module = "报警通知配置接口", operation = "添加的报警配置信息")
     @ApiOperation(value = "添加的报警配置信息")
     @PreAuthorize(name = "添加的报警配置信息", functionKey = "insertPersonnelPermission", functionTypeKey = "alarm")
     public Result<Long> insertPersonnelPermission(@Validated @RequestBody InsertAlarmPermissionDTO dto) {
@@ -88,6 +94,7 @@ public class AlarmSettingController {
      * 修改报警配置
      */
     @PostMapping("/updatePersonnelPermission")
+    @OperateLog(module = "报警通知配置接口", operation = "修改报警配置信息")
     @ApiOperation(value = "修改报警配置信息")
     @PreAuthorize(name = "修改报警配置信息", functionKey = "updatePersonnelPermission", functionTypeKey = "alarm")
     public Result<Void> updatePersonnelPermission(@Validated @RequestBody UpdateAlarmPermissionDTO alarmPermissions) {
@@ -99,6 +106,7 @@ public class AlarmSettingController {
      * 通过id查询报警类型及其所有报警编码
      */
     @PostMapping("/getTypeAndTemplateById")
+    @OperateLog(module = "报警通知配置接口", operation = "通过id查询报警类型所有报警编码")
     @ApiOperation(value = "通过id查询报警类型所有报警编码", notes = "传入删除对象id")
     @PreAuthorize(name = "通过id查询报警类型所有报警编码", functionKey = "getTypeAndTemplateById", functionTypeKey = "alarm")
     public Result<AlarmTypeQueryVO> getTypeAndTemplateById(@RequestParam("id") Long id) {
@@ -110,6 +118,7 @@ public class AlarmSettingController {
      * 查询所有报警类型及其报警编码信息
      */
     @PostMapping(value = "/getTypeAndTemplateList")
+    @OperateLog(module = "报警通知配置接口", operation = "查询所有报警类型及其报警编码信息")
     @ApiOperation(value = "查询所有报警类型及其报警编码信息", notes = "xx")
     @PreAuthorize(name = "查询所有报警类型及其报警编码信息", functionKey = "getTypeAndTemplateList", functionTypeKey = "alarm")
     public Result<List<AlarmTypeQueryVO>> getTypeAndTemplateList() {

+ 8 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmSettingNewController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.alarm;
 import com.aivfo.auth.annotation.PreAuthorize;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.alarm.alarmpersonnel.ConfigAlarmPersonnelLevelDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarmpersonnel.InsertAlarmPersonnelNewDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarmpersonnel.UpdateAlarmPersonnelNewDTO;
@@ -34,6 +35,7 @@ public class AlarmSettingNewController {
      * 添加报警联系人
      */
     @PostMapping("/addAlarmPersonnel")
+    @OperateLog(module = "报警配置接口", operation = "添加报警联系人信息")
     @ApiOperation(value = "添加报警联系人信息", notes = "传入一个AlarmPersonnel实体:添加id")
     @PreAuthorize(name = "添加报警联系人信息", functionKey = "addAlarmPersonnel", functionTypeKey = "alarm")
     public Result<Void> addAlarmPersonnel(@Validated(Insert.class) @RequestBody InsertAlarmPersonnelNewDTO dto) {
@@ -45,6 +47,7 @@ public class AlarmSettingNewController {
      * 修改报警联系人信息
      */
     @PostMapping("/updateAlarmPersonnel")
+    @OperateLog(module = "报警配置接口", operation = "修改报警联系人信息")
     @ApiOperation(value = "修改报警联系人信息", notes = "传入一个AlarmPersonnel实体:修改带id")
     @PreAuthorize(name = "修改报警联系人信息", functionKey = "updateAlarmPersonnel", functionTypeKey = "alarm")
     public Result<Void> updateAlarmPersonnel(@Validated(Update.class) @RequestBody UpdateAlarmPersonnelNewDTO dto) {
@@ -56,6 +59,7 @@ public class AlarmSettingNewController {
      * 通过id删除报警联系人
      */
     @PostMapping("/deleteAlarmPersonnel")
+    @OperateLog(module = "报警配置接口", operation = "通过id删除报警联系人")
     @ApiOperation(value = "通过id删除报警联系人", notes = "传入删除对象id")
     @PreAuthorize(name = "通过id删除报警联系人", functionKey = "removeAlarmPersonnelById", functionTypeKey = "alarm")
     public Result<Void> deleteAlarmPersonnel(@RequestParam("id") Long id) {
@@ -67,6 +71,7 @@ public class AlarmSettingNewController {
      * 查询所有报警联系人信息
      */
     @PostMapping(value = "/getAlarmPersonnelList")
+    @OperateLog(module = "报警配置接口", operation = "查询所有报警联系人信息")
     @ApiOperation(value = "查询所有报警联系人信息")
     @PreAuthorize(name = "查询所有报警联系人信息", functionKey = "getAlarmPersonnelList", functionTypeKey = "alarm")
     public Result<List<AlarmPersonnelNewVO>> getAlarmPersonnelList() {
@@ -77,6 +82,7 @@ public class AlarmSettingNewController {
      * 配置报警联系人
      */
     @PostMapping(value = "/configAlarmPersonnelLevel")
+    @OperateLog(module = "报警配置接口", operation = "配置报警联系人")
     @ApiOperation(value = "配置报警联系人")
     @PreAuthorize(name = "配置报警联系人", functionKey = "configAlarmPersonnelLevel", functionTypeKey = "alarm")
     public Result<Void> configAlarmPersonnelLevel(@RequestBody List<ConfigAlarmPersonnelLevelDTO> list) {
@@ -88,6 +94,7 @@ public class AlarmSettingNewController {
      * 查询所有报警类型及其报警编码信息
      */
     @PostMapping(value = "/getTypeAndTemplateList")
+    @OperateLog(module = "报警配置接口", operation = "查询所有报警类型及其报警编码信息")
     @ApiOperation(value = "查询所有报警类型及其报警编码信息")
     @PreAuthorize(name = "查询所有报警类型及其报警编码信息", functionKey = "getTypeAndTemplateList", functionTypeKey = "alarm")
     public Result<List<AlarmTypeQueryNewVO>> getTypeAndTemplateList() {
@@ -98,6 +105,7 @@ public class AlarmSettingNewController {
      * 修改报警类型信息
      */
     @PostMapping(value = "/UpdateAlarmType")
+    @OperateLog(module = "报警配置接口", operation = "修改报警类型信息")
     @ApiOperation(value = "修改报警类型信息")
     @PreAuthorize(name = "修改报警类型信息", functionKey = "UpdateAlarmType", functionTypeKey = "alarm")
     public Result<Void> UpdateAlarmType(@RequestBody UpdateAlarmTypeDTO updateAlarmTypeDTO) {

+ 13 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/alarm/AlarmSysSettingController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.alarm;
 import com.aivfo.auth.annotation.PreAuthorize;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.alarm.alarmtemplate.AlarmTemplateQuery;
 import com.aivfo.tl.control.entity.param.alarm.alarmtemplate.InsertAlarmTemplateDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarmtemplate.UpdateAlarmTemplateDTO;
@@ -42,6 +43,7 @@ public class AlarmSysSettingController {
 
     /**报警模板 - 添加*/
     @PostMapping("/saveAlarmTemplate")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警模板 - 添加")
     @ApiOperation(value = "报警模板 - 添加", notes = "传入一个AlarmTemplate实体")
     @PreAuthorize(name = "报警模板 - 添加",functionKey = "saveAlarmTemplate",functionTypeKey = "alarm")
     public Result<Void> saveAlarmTemplate(@Validated(Insert.class) @RequestBody InsertAlarmTemplateDTO dto) {
@@ -51,6 +53,7 @@ public class AlarmSysSettingController {
 
     /** 报警模板 - 修改*/
     @PostMapping("/updateAlarmTemplate")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警模板 - 修改")
     @ApiOperation(value = "报警模板 - 修改", notes = "传入一个AlarmTemplate实体:修改带id")
     @PreAuthorize(name = "报警模板 - 修改",functionKey = "updateAlarmTemplate",functionTypeKey = "alarm")
     public Result<Void> updateAlarmTemplate(@Validated(Update.class) @RequestBody UpdateAlarmTemplateDTO dto) {
@@ -60,6 +63,7 @@ public class AlarmSysSettingController {
 
     /**报警模板 - 通过id删除*/
     @PostMapping("/deleteAlarmTemplateById")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警模板 - 通过id删除 - 禁止删除在使用中模板")
     @ApiOperation(value = "报警模板 - 通过id删除 - 禁止删除在使用中模板", notes = "传入删除对象id")
     @PreAuthorize(name = "报警模板 - 通过id删除",functionKey = "deleteAlarmTemplate",functionTypeKey = "alarm")
     public Result<Void> deleteAlarmTemplate(@RequestParam("id") Long id) {
@@ -69,6 +73,7 @@ public class AlarmSysSettingController {
 
     /**报警模板 - 查询单个*/
     @PostMapping(value = "/getAlarmTemplateById")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警模板 - 查询单个")
     @ApiOperation(value = "报警模板 - 查询单个", notes = "传入删除对象id")
     @PreAuthorize(name = "报警模板 - 查询单个",functionKey = "getAlarmTemplateById",functionTypeKey = "alarm")
     public Result<AlarmTemplateVO> getAlarmTemplateById(@RequestParam("id") Long id) {
@@ -77,6 +82,7 @@ public class AlarmSysSettingController {
 
     /**报警模板 - 带条件分页查询数据*/
     @PostMapping(value = "/getAlarmTemplatePageList")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警模板 - 带条件分页查询数据")
     @ApiOperation(value = "报警模板 - 带条件分页查询数据",
             notes = "传入AlarmTemplateQuery实体:current:当前页 size:每页显示条数(-1为查询全部);高级查询条件:templateCode-编码  alarmTypeId-所属告警类型id")
     @PreAuthorize(name = "报警模板 - 带条件分页查询数据",functionKey = "getAlarmTemplatePage",functionTypeKey = "alarm")
@@ -88,6 +94,7 @@ public class AlarmSysSettingController {
 
     /**报警类型 - 添加*/
     @PostMapping("/save")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警类型 - 添加 - 必须初始化添加短信模板")
     @ApiOperation(value = "报警类型 - 添加 - 必须初始化添加短信模板", notes = "传入一个AlarmType实体:添加id")
     @PreAuthorize(name = "报警类型 - 添加",functionKey = "saveAlarmType",functionTypeKey = "alarm")
     public Result<Void> saveAlarmType(@Validated(Insert.class) @RequestBody InsertAlarmTypeDTO alarmType) {
@@ -97,6 +104,7 @@ public class AlarmSysSettingController {
 
     /**报警类型 - 修改*/
     @PostMapping("/update")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警类型 - 修改")
     @ApiOperation(value = "报警类型 - 修改", notes = "传入一个AlarmType实体:修改带id")
     @PreAuthorize(name = "报警类型 - 修改",functionKey = "updateAlarmType",functionTypeKey = "alarm")
     public Result<Void> updateAlarmType(@Validated(Update.class) @RequestBody UpdateAlarmTypeDTO alarmType) {
@@ -106,6 +114,7 @@ public class AlarmSysSettingController {
 
     /**报警类型 - 通过id删除*/
     @PostMapping("/deleteAlarmType")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警类型 - 通过id删除")
     @ApiOperation(value = "报警类型 - 通过id删除", notes = "传入删除对象id")
     @PreAuthorize(name = "报警类型 - 通过id删除",functionKey = "deleteAlarmType",functionTypeKey = "alarm")
     public Result<Void> deleteAlarmType(@RequestParam("id") Long id) {
@@ -115,6 +124,7 @@ public class AlarmSysSettingController {
 
     /**报警类型 - 查询所有*/
     @PostMapping(value = "/getAlarmTypeList")
+    @OperateLog(module = "报警模板类型设置接口", operation = "报警类型 - 查询所有")
     @ApiOperation(value = "报警类型 - 查询所有", notes = "xx")
     @PreAuthorize(name = "报警类型 - 查询所有",functionKey = "getAlarmTypeList",functionTypeKey = "alarm")
     public Result<List<AlarmTypeVO>> getAlarmTypeList() {
@@ -123,6 +133,7 @@ public class AlarmSysSettingController {
 
     /**报警类型 - 带条件分页查询数据*/
     @PostMapping(value = "/getAlarmTypePageList")
+    @OperateLog(module = "报警模板类型设置接口", operation = "带条件的分页查询")
     @ApiOperation(value = "带条件的分页查询",
             notes = "传入AlarmTypeQuery实体:current:当前页 size:每页显示条数(-1为查询全部);高级查询条件: alarmLevel-报警级别 alarmTitle-报警标题"
     )
@@ -134,6 +145,7 @@ public class AlarmSysSettingController {
 
     /**跟新报警系统缓存*/
     @PostMapping(value = "/updateAlarmSettingCache")
+    @OperateLog(module = "报警模板类型设置接口", operation = "跟新报警系统缓存 - 系统设置、设备信息、报警类型、")
     @ApiOperation(value = "跟新报警系统缓存 - 系统设置、设备信息、报警类型、")
     public Result<Void> updateAlarmSettingCache() {
         cacheManager.updateAlarmSettingCache();
@@ -142,6 +154,7 @@ public class AlarmSysSettingController {
 
 
     @PostMapping("/updateAlarmCache")
+    @OperateLog(module = "报警模板类型设置接口", operation = "刷新报警缓存")
     @ApiOperation(value = "刷新报警缓存")
     public Result<Void> updateAlarmCache(){
         cacheManager.updateAlarmCache();

+ 6 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/AlarmApiController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.api;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.alarm.alarm.AlarmCloudDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarm.ReportAlarmDTO;
 import com.aivfo.tl.control.entity.param.alarm.alarm.ReportAlarmDataDTO;
@@ -42,6 +43,7 @@ public class AlarmApiController implements AlarmReportApi {
      * @date 2023/7/28 15:00
      **/
     @PostMapping("/reportAlarm")
+    @OperateLog(module = "告警信息推送接口", operation = "推送串口、相机、拍照状态、换气状态")
     @ApiOperation(value = "推送串口、相机、拍照状态、换气状态")
     public Result<String> reportAlarm(@Validated  @RequestBody ReportAlarmDTO dto) {
         return R.succeed(alarmManage.reportAlarm(dto));
@@ -54,6 +56,7 @@ public class AlarmApiController implements AlarmReportApi {
      * @date 2023/10/19 18:23
      **/
     @PostMapping("/pushMessage")
+    @OperateLog(module = "告警信息推送接口", operation = "tl心跳检测")
     @ApiOperation(value = "tl心跳检测")
     public Result<String> pushMessage(@Validated @RequestBody TlAliveDTO tlAliveDTO) {
         return R.succeed(alarmManage.checkTlState(tlAliveDTO));
@@ -70,6 +73,7 @@ public class AlarmApiController implements AlarmReportApi {
      * @date 2023/7/28 15:00
      **/
     @PostMapping("/reportAlarmData")
+    @OperateLog(module = "告警信息推送接口", operation = "报告异常数据 - 服务内部接口")
     @ApiOperation(value = "报告异常数据 - 服务内部接口")
     @Override
     public Result<String> reportAlarmData(@Validated  @RequestBody ReportAlarmDataDTO reportAlarmDataDTO) {
@@ -86,6 +90,7 @@ public class AlarmApiController implements AlarmReportApi {
      * @date 2023/7/28 15:00
      **/
     @PostMapping("/reportCloudAlarm")
+    @OperateLog(module = "告警信息推送接口", operation = "推送报警信息到云端信息")
     @ApiOperation(value = "推送报警信息到云端信息")
     @Override
     public Result<Void> reportCloudAlarm(@Validated   @RequestBody AlarmCloudDTO dto) {
@@ -95,6 +100,7 @@ public class AlarmApiController implements AlarmReportApi {
 
 
     @PostMapping("/reportKafkaAlarm")
+    @OperateLog(module = "告警信息推送接口", operation = "报告kafka报警信息 - 服务内部接口")
     @ApiOperation(value = "报告kafka报警信息 - 服务内部接口")
     @Override
     public Result<String> reportKafkaAlarm(@Validated  @RequestBody ReportAlarmDataDTO reportAlarmDataDTO) {

+ 2 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/AutofocusApiController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.api;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.util.JsonUtils;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.start.common.context.SpringContext;
 import com.aivfo.tl.control.entity.constant.UrlPath;
 import com.aivfo.tl.control.entity.dto.facade.CalAutoFocusPositionParamDTO;
@@ -42,6 +43,7 @@ public class AutofocusApiController implements AutofocusApi {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "接收机旁本地对焦结果接口", operation = "接收机旁本地对焦结果并计算拍照位置")
     @ApiOperation(value = "接收机旁本地对焦结果并计算拍照位置")
     public Result<Void> calAutofocusPosition(@RequestBody CalAutoFocusPositionParamDTO calAutoFocusPositionParamDTO) {
         Integer mattingSuccessNumber = calAutoFocusPositionParamDTO.getMattingSuccessNumber();

+ 6 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/MqttSendApiController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.api;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.constant.UrlPath;
 import com.aivfo.tl.control.entity.dto.mqtt.message.BalanceMessageDTO;
 import com.aivfo.tl.control.entity.dto.mqtt.message.ChangeEmbryoStateMessageDTO;
@@ -34,6 +35,7 @@ public class MqttSendApiController implements MqttSendApi {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "mqtt通讯下位机消息", operation = "开始平衡")
     @ApiOperation(value = "开始平衡")
     public Result<Void> sendStartBalance(@RequestBody BalanceMessageDTO balanceMessageDTO) {
         mqttSendHandlerManage.sendStartBalance(balanceMessageDTO);
@@ -49,6 +51,7 @@ public class MqttSendApiController implements MqttSendApi {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "mqtt通讯下位机消息", operation = "结束平衡")
     @ApiOperation(value = "结束平衡")
     public Result<Void> sendStopBalance(@RequestBody BalanceMessageDTO balanceMessageDTO) {
         mqttSendHandlerManage.sendStopBalance(balanceMessageDTO);
@@ -64,6 +67,7 @@ public class MqttSendApiController implements MqttSendApi {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "mqtt通讯下位机消息", operation = "修改胚胎状态")
     @ApiOperation(value = "修改胚胎状态")
     public Result<Void> sendChangeEmbryoState(@RequestBody ChangeEmbryoStateMessageDTO changeEmbryoStateMessageDTO) {
         mqttSendHandlerManage.sendChangeEmbryoState(changeEmbryoStateMessageDTO);
@@ -79,6 +83,7 @@ public class MqttSendApiController implements MqttSendApi {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "mqtt通讯下位机消息", operation = "开始培养")
     @ApiOperation(value = "开始培养")
     public Result<Void> sendStartEmbryoCulture(@RequestBody EmbryoCultureStartMessageDTO calAutoFocusPositionParamDTO) {
         mqttSendHandlerManage.sendStartEmbryoCulture(calAutoFocusPositionParamDTO);
@@ -94,6 +99,7 @@ public class MqttSendApiController implements MqttSendApi {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "mqtt通讯下位机消息", operation = "结束培养")
     @ApiOperation(value = "结束培养")
     public Result<Void> sendStopEmbryoCulture(@RequestBody EmbryoCultureStopMessageDTO embryoCultureStopMessageDTO) {
         mqttSendHandlerManage.sendStopEmbryoCulture(embryoCultureStopMessageDTO);

+ 5 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/api/TlInfoApiController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.api;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.vo.TLDataTransmissionSettingVO;
 import com.aivfo.tl.control.entity.vo.tlinfovo.TlInfoAllVO;
 import com.aivfo.tl.control.entity.vo.tlinfovo.TlInfoQueryVO;
@@ -30,6 +31,7 @@ public class TlInfoApiController implements TlInfoFeignClient {
      * 查询所有TL设备信息及其舱室信息
      */
     @Override
+    @OperateLog(module = "TL设备信息接口Feign", operation = "获取所有设备及其舱室信息")
     @ApiOperation(value = "获取所有设备及其舱室信息")
     public Result<List<TlInfoQueryVO>> getTlInfoAndHouses() {
         return R.succeed(tlInfoManage.getTlInfoAndHouses());
@@ -43,6 +45,7 @@ public class TlInfoApiController implements TlInfoFeignClient {
      * @Author lbq
      */
     @Override
+    @OperateLog(module = "TL设备信息接口Feign", operation = "查询所有tl设备信息")
     @ApiOperation(value = "查询所有tl设备信息")
     public Result<List<TlInfoAllVO>> getTlInfo() {
         List<TlInfoAllVO> tlInfoList = tlInfoManage.getTlInfoList();
@@ -58,6 +61,7 @@ public class TlInfoApiController implements TlInfoFeignClient {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "TL设备信息接口Feign", operation = "获取Tl数据传输的设置")
     @ApiOperation(value = "获取Tl数据传输的设置")
     public Result<List<TLDataTransmissionSettingVO>> getTlDataTransmissionSetting(String tlSn) {
         List<TLDataTransmissionSettingVO> tlDataTransmissionSettingVOS = timeLapseSettingManage.getTlDataTransmissionSetting(tlSn);
@@ -72,6 +76,7 @@ public class TlInfoApiController implements TlInfoFeignClient {
      * @Author wangyl
      */
     @Override
+    @OperateLog(module = "TL设备信息接口Feign", operation = "获取TL系统设置")
     public Result<TlSystemSettingVO> getTlSetting(String tlSn) {
         TlSystemSettingVO tlSettingVO = timeLapseSettingManage.getSystemSettings(tlSn);
         return R.succeed(tlSettingVO);

+ 7 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/data/DataController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.data;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.LanguageDTO;
 import com.aivfo.tl.control.entity.vo.LanguageVO;
 import com.aivfo.tl.control.entity.vo.data.CnRegionInfoVO;
@@ -43,12 +44,14 @@ public class DataController {
     LanguageHandle languageHandle;
 
     @PostMapping("/getReign")
+    @OperateLog(module = "数据接口", operation = "获取地图资源")
     @ApiOperation(value = "获取地图资源")
     public Result<List<CnRegionInfoVO>> getReign() {
         return R.succeed(dataManage.getReignTree());
     }
 
     @PostMapping("/updateReign")
+    @OperateLog(module = "数据接口", operation = "刷新地图资源")
     @ApiOperation(value = "刷新地图资源")
     public Result<Void> updateReign() {
         dataManage.updateReign();
@@ -56,6 +59,7 @@ public class DataController {
     }
 
     @PostMapping("/getLanguageConf")
+    @OperateLog(module = "数据接口", operation = "获取语言配置")
     @ApiOperation(value = "获取语言配置")
     public Result<List<LanguageVO>> getLanguageConf(@Validated @RequestBody LanguageDTO languageDTO) {
         List<LanguageVO> res = dataManage.getLanguageConf(languageDTO);
@@ -63,6 +67,7 @@ public class DataController {
     }
 
     @PostMapping(value = "/importLanguageConf",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @OperateLog(module = "数据接口", operation = "导入语言配置")
     @ApiOperation(value = "导入语言配置")
     @NoToken
     public Result<Void> importLanguageConf(@RequestPart("files")  List<MultipartFile> files) throws IOException {
@@ -79,6 +84,7 @@ public class DataController {
     }
 
     @GetMapping("/downloadLanguageConf")
+    @OperateLog(module = "数据接口", operation = "下载语言配置")
     @ApiOperation(value = "下载语言配置")
     @NoToken
     public Result<Void> downloadLanguageConf(@RequestBody LanguageDTO languageDTO, HttpServletResponse response) throws IOException {
@@ -87,6 +93,7 @@ public class DataController {
     }
 
     @PostMapping("/changeLanguage")
+    @OperateLog(module = "数据接口", operation = "切换语言")
     @ApiOperation(value = "切换语言,请求头添加参数:Accept-Language   zh 中文  en 英语")
     @NoToken
     public Result<Void> changeLanguage(HttpServletRequest request) throws IOException {

+ 2 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/mqtt/MqttController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.mqtt;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.util.JsonUtils;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.constant.UrlPath;
 import com.aivfo.tl.control.entity.dto.mqtt.MqttCallbackDTO;
 import com.aivfo.tl.control.manage.mqtt.MqttMessageCallBackManage;
@@ -33,6 +34,7 @@ public class MqttController {
      * @date 2023/12/18 9:38
      **/
     @PostMapping("/callback")
+    @OperateLog(module = "mqtt回调接口", operation = "mqtt回调消息处理")
     public Result<Void> callback(@RequestBody MqttCallbackDTO tlStatusDTO) {
         log.info("收到mqtt回调消息【{}】", JsonUtils.toJson(tlStatusDTO));
         mqttMessageCallBackManage.messageHandle(tlStatusDTO);

+ 2 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/scanpermission/PermissionController.java

@@ -5,6 +5,7 @@ import com.aivfo.auth.util.PermissionaScan;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.start.core.util.JsonUtils;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Value;
@@ -32,6 +33,7 @@ public class PermissionController {
 
     /**获取权限配置初始化数据*/
     @PostMapping("/getInitPermissionInfo")
+    @OperateLog(module = "扫描权限接口", operation = "获取权限配置初始化数据")
     @ApiOperation(value = "获取权限配置初始化数据", notes = "传入一个实体")
     @PreAuthorize(name="获取权限配置初始化数据",functionKey = "controlInitPermissionInfo",functionTypeKey = "auth")
     public Result<String> getInitPermissionInfo() {

+ 18 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/setting/TimeLapseSettingController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.setting;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.constant.UrlPath;
 import com.aivfo.tl.control.entity.dto.house.HouseFocusSettingDTO;
 import com.aivfo.tl.control.entity.dto.house.WellFocusStartDTO;
@@ -48,6 +49,7 @@ public class TimeLapseSettingController {
     final TimeLapseEquipmentManage timeLapseEquipmentManage;
 
     @PostMapping("/common")
+    @OperateLog(module = "TL相关设置数据接口", operation = "获取指定tlSn的tl通用设置")
     @ApiOperation(value = "获取指定tlSn的tl通用设置")
     public Result<TlCommonSettingVO> getCommonSettings(@RequestParam("tlSn") String tlSn) {
         TlCommonSettingVO tlSettingVO = timeLapseSettingManage.getCommonSettings(tlSn);
@@ -55,6 +57,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/common/update")
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新指定tlSn通用设置")
     @ApiOperation(value = "更新指定tlSn通用设置")
     public Result<TlCommonSettingVO> updateCommonSettings(@RequestBody TlCommonUpdateDTO tlCommonUpdateDTO) {
         TlCommonSettingVO tlSettingVO = timeLapseSettingManage.updateCommonSettings(tlCommonUpdateDTO);
@@ -62,6 +65,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping(value = "/common/updateLogoFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新logo图片")
     @ApiOperation(value = "更新logo图片")
     public Result<String> updateLogoFile(@RequestPart(value = "reportHospitalLogoFile") MultipartFile reportHospitalLogoFile,
                                          @RequestParam("tlSn")String tlSn) {
@@ -70,6 +74,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping(value = "/common/deleteLogoFile")
+    @OperateLog(module = "TL相关设置数据接口", operation = "清空logo图片")
     @ApiOperation(value = "清空logo图片")
     public Result<Void> deleteLogoFile(@RequestParam("tlSn")String tlSn) {
         timeLapseSettingManage.updateLogoFile(null,tlSn);
@@ -77,6 +82,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/system")
+    @OperateLog(module = "TL相关设置数据接口", operation = "获取指定tlSn的系统设置")
     @ApiOperation(value = "获取指定tlSn的系统设置")
     public Result<TlSystemSettingVO> getSystemSettings(@RequestParam("tlSn") String tlSn) {
         TlSystemSettingVO tlSystemSettingVO = timeLapseSettingManage.getSystemSettings(tlSn);
@@ -84,6 +90,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/system/update")
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新指定tlSn系统设置")
     @ApiOperation(value = "更新指定tlSn系统设置")
     public Result<TlSystemSettingVO> updateSystemSettings(@RequestBody TlSystemSettingUpdateDTO tlSystemSettingUpdateDTO) {
         TlSystemSettingVO tlSettingVO = timeLapseSettingManage.updateSystemSettings(tlSystemSettingUpdateDTO);
@@ -92,6 +99,7 @@ public class TimeLapseSettingController {
 
 
     @PostMapping("/lights")
+    @OperateLog(module = "TL相关设置数据接口", operation = "获取指定tlSn的灯光设置(待定),不通知下位机器")
     @ApiOperation(value = "获取指定tlSn的灯光设置(待定),不通知下位机器")
     public Result<TlLightsSettingVO> getLightsSettings(@RequestParam("tlSn") String tlSn) {
         TlLightsSettingVO tlLightsSettingVO = timeLapseSettingManage.getLightsSettings(tlSn);
@@ -99,6 +107,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/lights/update")
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新指定tlSn灯光设置以及缓冲瓶进气阀打开时间 调试模式")
     @ApiOperation(value = "更新指定tlSn灯光设置以及缓冲瓶进气阀打开时间 调试模式")
     public Result<Void> updateLightsSettings(@RequestBody TlLightsSettingUpdateDTO tlSystemSettingUpdateDTO) {
         timeLapseSettingManage.updateLightsSettings(tlSystemSettingUpdateDTO, false);
@@ -106,6 +115,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/house")
+    @OperateLog(module = "TL相关设置数据接口", operation = "获取指定tlSn的舱室配置")
     @ApiOperation(value = "获取指定tlSn的舱室配置")
     public Result<Page<TlHouseSettingVO>> getHouseSettings(@RequestBody TlHouseSettingQuery tlHouseSettingVO) {
         Page<TlHouseSettingVO> tlHouseSettingVOPage = timeLapseSettingManage.getHouseSettings(tlHouseSettingVO);
@@ -113,6 +123,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/house/update")
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新指定tlSn舱室配置")
     @ApiOperation(value = "更新指定tlSn舱室配置")
     public Result<Void> updateHouseSettings(@RequestBody List<TlHouseSettingUpdateDTO> tlSystemSettingUpdateDTO) {
         timeLapseSettingManage.updateHouseSettings(tlSystemSettingUpdateDTO);
@@ -121,6 +132,7 @@ public class TimeLapseSettingController {
 
 
     @PostMapping("/house/well/update")
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新well的位置信息")
     @ApiOperation(value = "更新well的位置信息")
     public Result<Void> updateHouseWellSettings(@RequestBody HouseWellSettingUpdate houseWellSettingUpdate) {
         timeLapseSettingManage.updateHouseWellSettings(houseWellSettingUpdate);
@@ -128,6 +140,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/house/debugging")
+    @OperateLog(module = "TL相关设置数据接口", operation = "更新舱室调试的配置信息 没有发消息触发控制软件更新 调试模式")
     @ApiOperation(value = "更新舱室调试的配置信息 没有发消息触发控制软件更新 调试模式")
     public Result<Void> updateTlDebugging(@RequestBody TlHouseDebugSettingDTO tlHouseDebugSettingDTO) {
         timeLapseSettingManage.updateTlDebugging(tlHouseDebugSettingDTO);
@@ -135,6 +148,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/house/focus/setting")
+    @OperateLog(module = "TL相关设置数据接口", operation = "获取对焦参数设置")
     @ApiOperation(value = "获取对焦参数设置")
     public Result<List<HouseFocusSettingVO>> getHouseFocusSetting(@RequestParam("tlSn") String tlSn) {
         List<HouseFocusSettingVO> houseFocusSetting = timeLapseSettingManage.getHouseFocusSetting(tlSn);
@@ -142,6 +156,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/house/immediately")
+    @OperateLog(module = "TL相关设置数据接口", operation = "对焦参数立即对焦,对焦参数更新")
     @ApiOperation(value = "对焦参数立即对焦,对焦参数更新")
     public Result<Void> updateHouseFocusSetting(@RequestBody List<HouseFocusSettingDTO> houseFocusSettingList) {
         timeLapseSettingManage.updateHouseFocusSetting(houseFocusSettingList);
@@ -149,6 +164,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/house/autofocus/position")
+    @OperateLog(module = "TL相关设置数据接口", operation = "获取一个舱室的自动对焦起点")
     @ApiOperation(value = "获取一个舱室的自动对焦起点")
     public Result<List<HouseAutofocusPositionVO>> getAutofocusPosition(@RequestBody HousePositionDTO housePositionDTO) {
         List<HouseAutofocusPositionVO> autofocusPosition = timeLapseEquipmentManage.getAutofocusPositionHouse(housePositionDTO);
@@ -156,6 +172,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/well/immediately")
+    @OperateLog(module = "TL相关设置数据接口", operation = "well立即对焦")
     @ApiOperation(value = "well立即对焦")
     public Result<Void> wellFocusImmediately(@RequestBody WellFocusStartDTO wellFocusStartDTO) {
         timeLapseSettingManage.wellFocusImmediately(wellFocusStartDTO);
@@ -163,6 +180,7 @@ public class TimeLapseSettingController {
     }
 
     @PostMapping("/sync/tl/setting")
+    @OperateLog(module = "TL相关设置数据接口", operation = "同步tl设置到下位机")
     @ApiOperation(value = "同步tl设置到下位机")
     public Result<Void> syncTlSetting(@RequestParam("tlSn") String tlSn) {
         timeLapseSettingManage.syncSetting(tlSn);

+ 4 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/tl/HouseCollectController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.tl;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.tl.control.entity.param.housecollect.HouseCollectDTO;
 import com.aivfo.tl.control.entity.param.housecollect.HouseCollectExportDTO;
 import com.aivfo.tl.control.entity.vo.housecollect.HouseEnvironmentShowVO;
@@ -32,6 +33,7 @@ public class HouseCollectController {
     final HouseCollectManage houseCollectManage;
 
     @PostMapping("/getHouseEnviroment")
+    @OperateLog(module = "舱室环境接口", operation = "查询舱室历史环境")
     @ApiOperation(value = "查询舱室历史环境")
     @Deprecated
     public Result<List<HouseEnvironmentVO>> getHouseEnvironment(@Validated @RequestBody HouseCollectDTO houseEnviromentDTO) {
@@ -39,12 +41,14 @@ public class HouseCollectController {
     }
 
     @GetMapping("/exportHouseEnvironment")
+    @OperateLog(module = "舱室环境接口", operation = "导出舱室历史环境")
     @ApiOperation(value = "导出舱室历史环境")
     public void exportHouseEnvironment(@Validated  HouseCollectExportDTO houseEnviromentDTO, HttpServletResponse response) {
         houseCollectManage.exportHouseEnvironmentByPage(houseEnviromentDTO, response);
     }
 
     @PostMapping("/getHouseEnvironmentList")
+    @OperateLog(module = "舱室环境接口", operation = "查询舱室历史环境列表")
     @ApiOperation(value = "查询舱室历史环境")
     public Result<HouseEnvironmentShowVO> getHouseEnvironmentList(@Validated @RequestBody HouseCollectDTO houseEnvironmentDTO) {
         return R.succeed(houseCollectManage.getHouseEnvironmentHistoryData(houseEnvironmentDTO));

+ 10 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/tl/TimeLapseEquipmentController.java

@@ -2,6 +2,7 @@ package com.aivfo.tl.control.controller.tl;
 
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.log.annotation.SkipLogRequest;
 import com.aivfo.tl.control.entity.dto.BaseDTO;
 import com.aivfo.tl.control.entity.dto.mqtt.MqttResultDTO;
@@ -42,6 +43,7 @@ public class TimeLapseEquipmentController {
     final MqttMessageCallBackManage mqttMessageCallBackManage;
 
     @PostMapping("/link")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "tl每次连接调用的接口")
     @ApiOperation(value = "tl每次连接调用的接口")
     public Result<TlLinkResultVO> linksControl(@RequestBody @Valid TlLinkDataDTO tlInitDataDTO) {
         TlLinkResultVO tlLinkResultVO = timeLapseEquipmentManage.linkTLData(tlInitDataDTO);
@@ -49,6 +51,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/info")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "获取配置信息")
     @ApiOperation(value = "获取配置信息")
     public Result<TlLinkResultVO> info(@RequestBody BaseDTO tlSn) {
         TlLinkResultVO tlLinkResultVO = timeLapseEquipmentManage.info(tlSn.getTlSn());
@@ -56,6 +59,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/setting/data")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "获取所有设置")
     @ApiOperation(value = "获取所有设置")
     @Deprecated
     public Result<TlLinkSettingResultVO> getSettingDate(@RequestBody @Valid TlLinkDataDTO tlInitDataDTO) {
@@ -64,6 +68,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/autofocus/position")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "获取一个舱室的自动对焦起点")
     @ApiOperation(value = "获取一个舱室的自动对焦起点")
     public Result<List<AutofocusPositionVO>> getAutofocusPosition(@RequestBody @Valid PositionDTO positionDTO) {
         List<AutofocusPositionVO> autofocusPosition = timeLapseEquipmentManage.getAutofocusPosition(positionDTO);
@@ -71,6 +76,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/ccd/position")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "获取获取一个舱室的指定well的ccd拍照位置")
     @ApiOperation(value = "获取获取一个舱室的指定well的ccd拍照位置")
     public Result<PictureStateVO> getCCDPosition(@RequestBody @Valid PositionDTO positionDTO) {
         PictureStateVO ccdPosition = timeLapseEquipmentManage.getCCDPosition(positionDTO);
@@ -78,6 +84,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/house/data")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "获取培养中的胚胎和平衡中的数据")
     @ApiOperation(value = "获取培养中的胚胎和平衡中的数据")
     public Result<EmbryoDataVO> houseData(@RequestParam("tlSn") String tlSn) {
         EmbryoDataVO houseData = timeLapseEquipmentManage.getHouseData(tlSn);
@@ -85,6 +92,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/report/data")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "上报tl的采集数据")
     @ApiOperation(value = "上报tl的采集数据")
     @SkipLogRequest
     public Result<Void> reportData(@RequestBody List<HouseCollectInsertDTO> positionDTOList) {
@@ -93,6 +101,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/result")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "mqtt命令执行结果")
     @ApiOperation(value = "mqtt命令执行结果")
     public Result<Void> result(@RequestBody MqttResultDTO mqttResultDTO) throws ExecutionException {
         mqttMessageCallBackManage.updateExecutionResult(mqttResultDTO);
@@ -100,6 +109,7 @@ public class TimeLapseEquipmentController {
     }
 
     @PostMapping("/change/autofocus/state")
+    @OperateLog(module = "tl下位机通讯交互接口", operation = "修改自动对焦的状态")
     @ApiOperation(value = "修改自动对焦的状态")
     public Result<Void> changeAutoFocusState(@RequestBody HouseAutoFocusDTO houseAutoFocusDTO) {
         timeLapseEquipmentManage.updateHouseAutoFocusState(houseAutoFocusDTO);

+ 8 - 0
aivof-tl-control/aivfo-tl-control-controller/src/main/java/com/aivfo/tl/control/controller/tl/TlInfoController.java

@@ -3,6 +3,7 @@ package com.aivfo.tl.control.controller.tl;
 import com.aivfo.auth.annotation.PreAuthorize;
 import com.aivfo.el.start.core.api.R;
 import com.aivfo.el.starter.base.Result;
+import com.aivfo.log.annotation.OperateLog;
 import com.aivfo.log.annotation.SkipLogRequest;
 import com.aivfo.tl.control.entity.dto.tl.tlinfo.TlInfoDTO;
 import com.aivfo.tl.control.entity.vo.tlinfovo.TlInfoAllVO;
@@ -37,6 +38,7 @@ public class TlInfoController {
      * 获取TL相关的时间
      */
     @PostMapping("/time")
+    @OperateLog(module = "TL设备信息接口", operation = "获取TL相关的时间")
     @ApiOperation(value = "获取TL相关的时间")
     @SkipLogRequest
     public Result<TlTimeVO> time(@RequestParam("tlSn") String tlSn) {
@@ -48,6 +50,7 @@ public class TlInfoController {
      * 修改tl设备信息
      */
     @PostMapping("/update")
+    @OperateLog(module = "TL设备信息接口", operation = "修改TL设备信息")
     @ApiOperation(value = "修改TL设备信息", notes = "传入一个TlInfo实体:修改带id,添加id为null")
     @PreAuthorize(name = "修改TL设备信息", functionKey = "updateTlInfo", functionTypeKey = "TL")
     public Result<String> update(@Validated @RequestBody TlInfoDTO tlInfoDTO) {
@@ -60,6 +63,7 @@ public class TlInfoController {
      * 查询单个TL设备信息
      */
     @PostMapping(value = "/getTlInfoById")
+    @OperateLog(module = "TL设备信息接口", operation = "修改回显 - 通过id查询TlInfo信息")
     @ApiOperation(value = "修改回显 - 通过id查询TlInfo信息")
     @PreAuthorize(name = "修改回显 - 通过id查询TlInfo信息", functionKey = "getTlInfoById", functionTypeKey = "TL")
     public Result<TlInfoAllVO> getTlInfoById(@RequestParam("id") Long id) {
@@ -72,6 +76,7 @@ public class TlInfoController {
      * 通过id剔除设备
      */
     @PostMapping("/removeTlById")
+    @OperateLog(module = "TL设备信息接口", operation = "隐藏设备")
     @ApiOperation(value = "隐藏设备", notes = "传入设备id")
     @PreAuthorize(name = "隐藏设备", functionKey = "removeTlById", functionTypeKey = "TL")
     public Result<String> delete(@RequestParam("id") Long id) {
@@ -83,6 +88,7 @@ public class TlInfoController {
      * 获取指定tl 软件信息
      */
     @PostMapping("/getVersionBySn")
+    @OperateLog(module = "TL设备信息接口", operation = "获取指定tl 软件信息")
     @ApiOperation(value = "获取指定tl 软件信息")
     @PreAuthorize(name = "获取指定tl", functionKey = "getVersionBySn", functionTypeKey = "TL")
     public Result<TLSoftVersionVO> getVersionBySn(@RequestParam("tlSn") String tlSn) {
@@ -93,6 +99,7 @@ public class TlInfoController {
      * 获取指定tl 软件信息
      */
     @PostMapping("/getEnvironmentTemperature")
+    @OperateLog(module = "TL设备信息接口", operation = "获取环境温度")
     @ApiOperation(value = "获取环境温度")
     @PreAuthorize(name = "获取环境温度", functionKey = "getEnvironmentTemperature", functionTypeKey = "TL")
     public Result<List<TLEnvironmentTemperatureVO>> getEnvironmentTemperature() {
@@ -103,6 +110,7 @@ public class TlInfoController {
      * 通过id剔除设备
      */
     @PostMapping("/deleteTlById")
+    @OperateLog(module = "TL设备信息接口", operation = "通过id删除设备")
     @ApiOperation(value = "通过id删除设备", notes = "传入设备id")
     @PreAuthorize(name = "通过id删除设备", functionKey = "deleteTlById", functionTypeKey = "TL")
     public Result<String> deleteTlById(@RequestParam("id") Long id) {

+ 4 - 0
aivof-tl-control/aivfo-tl-control-lanucher/.flattened-pom.xml

@@ -19,6 +19,10 @@
       <groupId>com.aivfo</groupId>
       <artifactId>aivfo-nacos-spring-boot-starter</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.aivfo</groupId>
+      <artifactId>aivfo-oplog-client</artifactId>
+    </dependency>
   </dependencies>
   <build>
     <resources>

+ 5 - 0
aivof-tl-control/aivfo-tl-control-lanucher/pom.xml

@@ -20,6 +20,11 @@
             <groupId>com.aivfo</groupId>
             <artifactId>aivfo-nacos-spring-boot-starter</artifactId>
         </dependency>
+        <!-- 操作日志 Kafka 发送端:KafkaOperationLogSender 自动装配(@ConditionalOnBean ProducerNormal) -->
+        <dependency>
+            <groupId>com.aivfo</groupId>
+            <artifactId>aivfo-oplog-client</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <resources>

+ 6 - 1
aivof-tl-control/aivfo-tl-control-lanucher/src/main/resources/application-local.properties

@@ -62,4 +62,9 @@ aivfo.internationalization.language=en
 spring.cloud.nacos.discovery.enabled=true
 #数据清理时间配置
 aivfo.alarm.dataClean.houseCollectDataCleanTime=90
-aivfo.alarm.dataClean.alarmDataCleanTime=90
+aivfo.alarm.dataClean.alarmDataCleanTime=90
+# kafka(操作日志发送端,M8 G3-2)
+aivfo.kafka.properties.ips=${server.ip}:9092
+aivfo.kafka.properties.producer.enable=true
+aivfo.kafka.properties.consumer.group=tl-control-oplog
+aivfo.kafka.properties.consumer.autoOffsetReset=earliest

+ 4 - 0
aivof-tl-control/aivfo-tl-control-manage/.flattened-pom.xml

@@ -64,5 +64,9 @@
       <groupId>com.aivfo</groupId>
       <artifactId>aivfo-monitor-spring-boot-starter</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.aivfo</groupId>
+      <artifactId>aivfo-kafka-spring-boot-starter</artifactId>
+    </dependency>
   </dependencies>
 </project>

+ 5 - 0
aivof-tl-control/aivfo-tl-control-manage/pom.xml

@@ -76,5 +76,10 @@
             <groupId>com.aivfo</groupId>
             <artifactId>aivfo-monitor-spring-boot-starter</artifactId>
         </dependency>
+        <!-- Kafka 生产者 ProducerNormal(操作日志发送依赖,M8 G3-2) -->
+        <dependency>
+            <groupId>com.aivfo</groupId>
+            <artifactId>aivfo-kafka-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 4 - 0
aivof-tl-control/aivfo-tl-control-service/.flattened-pom.xml

@@ -19,5 +19,9 @@
       <groupId>com.aivfo</groupId>
       <artifactId>aivfo-notify-spring-boot-starter</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.aivfo</groupId>
+      <artifactId>aivfo-log-spring-boot-starter</artifactId>
+    </dependency>
   </dependencies>
 </project>

+ 5 - 0
aivof-tl-control/aivfo-tl-control-service/pom.xml

@@ -18,5 +18,10 @@
             <groupId>com.aivfo</groupId>
             <artifactId>aivfo-notify-spring-boot-starter</artifactId>
         </dependency>
+        <!-- 操作日志:切面+注解(M8 G3-2) -->
+        <dependency>
+            <groupId>com.aivfo</groupId>
+            <artifactId>aivfo-log-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 2
项目文档/开发计划/2026-06-20-当前开发计划.md

@@ -67,7 +67,7 @@
 **涉及文件**:operate 各 ViewModel/命令、Java `tl-control`/`business` 关键 Controller/Service(`@OperateLog`)、M8 §10 配置中心下发 + 本地兜底补送逻辑。
 
 - [ ] **G3-1** `[纯代码][P1]` operate 逐方法埋点(逐 ViewModel/命令接入)。
-- [ ] **G3-2** `[纯代码][P1]` Java 埋点:tl-control / business 关键 Controller/Service 加 `@OperateLog`。
+- [x] **G3-2** `[纯代码][P1]` Java 埋点:tl-control / business 关键 Controller/Service 加 `@OperateLog`。 ✅2026-06-20 完成:两服务装 M8 三件套(log-starter+kafka-starter+oplog-client)+ application-local 配 kafka(${server.ip}:9092);tl-control 15 Controller/90 方法、business 24 Controller/121 方法贴 `@OperateLog`(module=@Api tags、operation=@ApiOperation 中文值);两服务 Maven 编译 BUILD SUCCESS。★真入 operation_log 待起 Kafka+oplog 端到端抽查(运行期,非真机门控)。
 - [ ] **G3-3** `[纯代码][P2]` M8 配置集中下发 + 本地兜底补送(C4):改配置热生效;Kafka 恢复后补送。
 
 **验收**:抽查各端关键操作有 `operation_log` 记录;改配置热生效、Kafka 恢复后补送成功。
@@ -80,7 +80,7 @@
 **涉及文件**:operate 对焦清理任务、两个 migration + base 建库脚本 + 幂等 runner、`清单.md`、本地 SQLite(`tl_setting`/`house_well_setting`)列迁移。
 
 - [ ] **G4-1** `[纯代码][P2]` 对焦标定清理任务(C6):按天数,scene=1 删 / scene=0 保留;可跑。
-- [ ] **G4-2** `[纯代码][P1]` 建库脚本与 migration 合并 + 幂等 runner(C2):两 migration 并入 base 或部署清单强制登记;`清单.md` 补 operation_log/对焦表;全新部署一次跑完不缺表/列。
+- [x] **G4-2** `[纯代码][P1]` 建库脚本与 migration 合并 + 幂等 runner(C2):两 migration 并入 base 或部署清单强制登记;`清单.md` 补 operation_log/对焦表;全新部署一次跑完不缺表/列。 ✅2026-06-20 完成:对焦表/列并入 `aivfo_tl_setting.sql`、operation_log 并入 `log.sql`、新增幂等 `sql/init-database.sh`、`清单.md` 补全;临时 MySQL 容器全量跑通+二次幂等零报错验证(18 表/7+2 列/operation_log 齐)。
 - [ ] **G4-3** `[真机][P1]` 本地 SQLite 列迁移(V-046):对 tl_setting/house_well_setting 加 AddColumn(IF NOT EXISTS 语义)或重发预置 db;旧 db 升级后写缓存不报 no such column。
 
 **验收**:清理任务可跑;全新部署一次到位;旧 db 升级写缓存不报 no such column。

+ 18 - 0
项目文档/进度/交接卡.md

@@ -496,3 +496,21 @@
 - 删除:实现符合性审计报告、会话完整续接文档、合并收尾与质量修复总计划、临时/1735方案。
 - 归档:7个历史子计划→开发计划/已完成归档/;3份历史报告(SQL与代码一致性核对/全量文档体检-0618/文档源码审核)→进度/历史报告/。
 - 下一步:按《2026-06-20-当前开发计划.md》推剩余工作(G1串口收尾/G2 UI/G3日志/G4对焦数据/G5业务回归)+真机GUI验证;续接锚=《工作计划表》+《当前开发计划》+《进度状态.yaml》三件。
+
+## 2026-06-20 · G4-2 建库脚本与 migration 合并 + 幂等 runner(C2)完成
+- 改动:①两 migration 内容并入 base CREATE TABLE(非追加 ALTER,更干净且天然幂等)——`aivfo_tl_setting.sql`:tl_setting +5 对焦列(focus_layer_spacing_pulse/count/down/peak_ratio_threshold/local_autofocus_enabled)、house_well_setting +2 覆盖列、新增 house_autofocus_calibration 表;`log.sql`:system_log 后追加 operation_log 表。②两 migration 文件头加注"全新部署 base 已含,仅供旧库增量升级"(autofocus 迁移强调 MySQL8 ADD COLUMN 无 IF NOT EXISTS,旧库重跑前 DESC 判列)。③新增幂等 runner `sql/init-database.sh`(建 7 库 CREATE DATABASE IF NOT EXISTS + 导 base,可重跑)。④`清单.md`:aivfo_tl_setting 表数 17→18、log 行补 operation_log、新增"〇一键部署"与"四 migrations 分工"段。
+- ★核实(真实闭环,非纸面):起一次性 MySQL8 容器 tl-sql-verify(独立名,不碰 tl-mysql/108)→ docker cp sql 进去 → 跑 init-database.sh:7 库零报错。information_schema 抽查:house_autofocus_calibration 存在、tl_setting 5 列全在、house_well_setting 2 列全在、log 库={operation_log,system_log}、aivfo_tl_setting 18 表(对齐清单)。★二次执行 runner 零报错=幂等验证通过★。验毕 docker rm -f 销毁容器,生产容器 tl-mysql/tl-nacos 健在。
+- 踩坑:git-bash 把 docker exec 的容器内路径 /sql/... 转成 Windows 路径(C:/Program Files/Git/sql/...),需 export MSYS_NO_PATHCONV=1 禁用转换。
+- 下一步:G4-2 是纯代码闭环已交付。剩余纯代码 P1 候选:G3 日志铺开(operate 逐方法/Java @OperateLog)、G2 UI(弹框/13 子页自适应,最终视觉真机为准)。真机门控 G1-1/G4-3/G5 待用户在场。
+
+## 2026-06-20 · G3-2 Java 操作日志埋点完成(tl-control + business,两 subagent + 编译验证)
+- 背景:调研发现 tl-control/business 原本无 log starter 也无 Kafka 生产者,真入 operation_log 需补 M8 三件套(用户已拍板"引三件套真入库")。配方来自 data-transmission 模板。
+- 改动(每服务):①service 模块 pom 引 aivfo-log-spring-boot-starter(切面+@OperateLog 注解);②manage 模块引 aivfo-kafka-spring-boot-starter(ProducerNormal);③lanucher 引 aivfo-oplog-client(KafkaOperationLogSender,@ConditionalOnBean ProducerNormal 自动装配);④application-local 配 kafka(aivfo.kafka.properties.ips=${server.ip}:9092 / producer.enable=true / consumer.group)。topic 固定 tl-oplog。
+- 埋点:operation=方法 @ApiOperation 中文值逐字照抄(过长留核心动作)、module=类 @Api tags(去版本号/状态尾巴噪声)。覆盖写操作+查询,不改方法体/签名,保留已有 @PreAuthorize/@SkipLogRequest 等。
+  · tl-control:15 Controller / 90 方法。
+  · business:24 Controller / 121 方法(三端 pc/surface/app:oplog-client 加在父聚合 lanucher 公共 dependencies 一处即覆盖三端;三个 application-local 各配 kafka 且 consumer.group 三端各异 business-{pc/surface/app}-oplog 避免抢分区)。
+- ★编译核实:tl-control 全模块 BUILD SUCCESS;business Reactor 19 模块全 SUCCESS 0 error(01:28)。三件套 artifact 已在本地仓库,未动 framework install。clean 阶段偶报 jar 文件锁(进程占用旧 jar),改不带 clean 的 compile 即过,非代码问题。★ codegraph sync already up to date。
+- 主线核实:git status 改动文件齐;三件套依赖/ kafka 配置/ @OperateLog 计数(tl-control 90+15import、business 121+24import)全对上;抽查 DataController 注解 module/operation 取值正确。
+- 真机/运行待验:★真入 operation_log 表需起 Kafka+oplog 微服务端到端抽查(运行期,非真机硬件门控)——GUI/接口触发任一操作后查 log 库 operation_log 有记录即闭环★。
+- 下一步:G3 余下 G3-1(operate 逐方法埋点,C# 大量 ViewModel)/G3-3(配置下发 C4);或 G2 UI / G4 纯代码。
+- 提醒:本批改动含 .flattened-pom.xml(flatten 插件产物)与 target/classes 副本随编译变化,提交时留意是否纳入。

+ 2 - 2
项目文档/进度/工作计划表.md

@@ -19,7 +19,7 @@
 
 **续接三件套(无缝接续,不依赖对话记忆)**:① 本表(里程碑状态)② 《2026-06-20-当前开发计划.md》(剩余工作)③ 进度状态.yaml(当前断点)。
 
-**剩余工作总览**(详见《当前开发计划》):G1 串口收尾(T1.4 真机/ComBin 枚举迁移去重/写EEPROM V-010)|G2 UI(首页舱室弹框位置大小/13 子页自适应/TabTip/well 三态)|G3 日志铺开(operate 逐方法/Java 埋点/C4 配置下发)|G4 对焦·数据(C6 清理任务/C2 建库 runner/V-046 列迁移)|G5 业务回归(M6/M7)。多数受真机 GUI 门控。
+**剩余工作总览**(详见《当前开发计划》):G1 串口收尾(T1.4 真机/ComBin 枚举迁移去重/写EEPROM V-010)|G2 UI(首页舱室弹框位置大小/13 子页自适应/TabTip/well 三态)|G3 日志铺开(operate 逐方法/**Java 埋点 ✅2026-06-20 完成**/C4 配置下发)|G4 对焦·数据(C6 清理任务/**C2 建库 runner ✅2026-06-20 完成**/V-046 列迁移)|G5 业务回归(M6/M7)。多数受真机 GUI 门控。
 
 ---
 
@@ -146,7 +146,7 @@
 |------|------|------|------|----------|--------------|---------|
 | M8-01 | 日志库 operation_log 表 + 微服务 aivfo-oplog | ☑ | — | 操作日志经 Kafka 入库 | 14;P1 完成(发消息→入库✔) | ✔ |
 | M8-02 | Kafka topic tl-oplog + 统一 schema | ☑ | M8-01 | 两端日志格式一致 | 14 §5/6;三端同 schema | ✔ |
-| M8-03 | Java @OperateLog 切面机制 + 关键方法注解 | 🔶 | M8-02 | Java 操作入库、trace 串联 | 14 §8;机制✔ + data-transmission 真实链路✔;**tl-control/business 待埋点** | ✔ |
+| M8-03 | Java @OperateLog 切面机制 + 关键方法注解 | 🟢 | M8-02 | Java 操作入库、trace 串联 | 14 §8;机制✔ + data-transmission✔;**tl-control 15C/90法 + business 24C/121法 已贴 @OperateLog + 装三件套(G3-2),编译 BUILD SUCCESS;真入库待 Kafka+oplog 运行验** | ✔ |
 | M8-04 | C# 组件 Aivfo.OperationLog | ☑ | M8-02 | 组件可复用 | 14 §9;P3a 端到端✔ | ✔ |
 | M8-05 | C# 全埋 operate + front | 🔶 | M8-04 | 操作全覆盖 | 14 §2/9;operate 边界埋点✔ + **front 接入✔(C5)**;**operate 逐方法手埋 待** | ✔ |
 | M8-06 | 可配置 + 配置集中下发 / 本地兜底补送 | 🔶 | M8-03,M8-05 | 配置热生效 | 14 §10;组件开关✔ + 规约✔;**§10 集中下发/补送 待(C4)** | ✔ |

+ 8 - 6
项目文档/进度/进度数据.js

@@ -1,10 +1,10 @@
 // 进度数据(监控面板.html 读取)。每完成一步由助手回写,generatedAt 用于停滞检测。
 window.PROGRESS_DATA = {
   project: "时差培养箱合并改造",
-  generatedAt: "2026-06-20T16:30:00",
-  currentTask: "★文档重组中(进度层归位 Phase A)★:按2026-06-20文档重组方案,把审计报告/会话续接文档内容三层归位——工作计划表/待验证清单/进度数据反映合并后真实状态(取代旧'代码完成'虚标)。三项目合并物理收尾已完成:control并入operate/control/、autofocustool已删、编译三关0错误、真机硬件层+业务API+data-transmission起 全闭环。",
-  currentStep: "文档重组中",
-  nextStep: "按《当前开发计划》(Phase B 建立)推剩余工作:G1串口收尾(T1.4真机/ComBin枚举迁移/写EEPROM)、G2 UI(弹框/13子页自适应/TabTip)、G3日志铺开(operate逐方法/Java埋点/配置下发)、G4对焦数据(清理任务/migration runner/SQLite列迁移)、G5业务回归+真机GUI验收(待验证清单V-129~V-134)。",
+  generatedAt: "2026-06-20T19:20:00",
+  currentTask: "★G3-2 Java 操作日志埋点完成(tl-control+business 接入 M8)★:两服务各装三件套(log-starter+kafka-starter+oplog-client)+application-local 配 kafka;tl-control 15 Controller/90方法、business 24 Controller/121方法贴 @OperateLog(module=@Api tags/operation=@ApiOperation 中文)。两服务 Maven 编译 BUILD SUCCESS。真入 operation_log 待起 Kafka+oplog 端到端抽查(运行期)。前序:G4-2 建库脚本合并(临时容器幂等验证通过)。",
+  currentStep: "G3-2 Java 埋点完成",
+  nextStep: "G3 余下:G3-1(operate 逐方法埋点,C# 大量 ViewModel)/G3-3(配置下发 C4);或 G2 UI(弹框/13子页自适应)/G4(C6清理任务)。真机门控 G1-1/G4-3/G5 待用户在场。",
   phase: "★★三项目合并物理收尾完成 + 串口占用代码层已修(T1.1~T1.3,T1.4待GUI验) + Phase0功能bug已修(scene=0不拍照/kfka重复键/front去imageScore) + 真机硬件+API+服务起全闭环★★ 文档重组进行中,真机GUI全流程验收待续",
   note: "2026-06-20:在2026-06-19灾后恢复基础上,本会话完成三项目合并最后一公里——control物理并入operate/control/(顶层ivf_tl_control_2.0消失,operate自包含)、autofocustool删除、编译operate/front/单测三关0错误。真机验证:硬件层(7舱握手+三路温度+压力+舱门+电机偏差0+相机出图2592×1944+CCDSN映射)+业务API(登录/tl-control/business/surface getButtons/对焦下发V-047上行V-064)全闭环;data-transmission补建aivfo-tl库后Started(nacos 6服务)。串口占用代码层修复T1.1~T1.3(T1.4真机待GUI);功能bug修复T0.1~T0.3。M2-02单测重建23断言全通过。审计报告与会话续接文档内容已三层归位后删除。详见交接卡。",
   planTasks: [
@@ -15,6 +15,8 @@ window.PROGRESS_DATA = {
     { id: "T0.1-3", name: "★Phase0功能bug修复:删kfka重复键+对焦scene=0降级回退修不拍照+front去imageScore★", status: "☑" },
     { id: "M2-02test", name: "★M2-02单测重建23断言全通过+对焦公式逻辑验证★", status: "☑" },
     { id: "Phase4", name: "★容错读取接崩点(B6)+HTTP失联标记(C3)+down<count校验下沉+front接日志(C5)★", status: "☑" },
+    { id: "G4-2", name: "★建库脚本与migration合并+幂等runner(C2):对焦表列/operation_log并入base+init-database.sh,临时容器全量+幂等验证★", status: "☑" },
+    { id: "G3-2", name: "★Java操作日志埋点(tl-control 15C/90法+business 24C/121法贴@OperateLog)+两服务装M8三件套,编译BUILD SUCCESS;真入库待Kafka+oplog运行验★", status: "☑" },
     { id: "Task1-4", name: "进度文件组(4文件)", status: "☑" },
     { id: "Task5", name: "M0-00 文档源码审核", status: "☑" },
     { id: "Task6-8", name: "自动对焦数据层 SQL 迁移", status: "☑" },
@@ -23,7 +25,7 @@ window.PROGRESS_DATA = {
     { id: "BACKEND-UP", name: "★后端微服务集群真机起(nacos 6服务,含data-transmission)★", status: "☑" },
     { id: "M8-CORE", name: "★M8操作日志核心机制完成(四段链路+全链路traceId)+front接入★", status: "☑" },
     { id: "AUDIT", name: "★2026-06-20实现符合性审计(10单元逐条file:line核实,建可信基线)★", status: "☑" },
-    { id: "DOC-REORG", name: "文档重组(进度层归位:工作计划表/待验证清单/进度数据)", status: "" }
+    { id: "DOC-REORG", name: "文档重组(进度层归位:工作计划表/待验证清单/进度数据)", status: "" }
   ],
   milestones: [
     { id: "M0", name: "基线与脚手架", tasks: [
@@ -84,7 +86,7 @@ window.PROGRESS_DATA = {
     { id: "M8", name: "全量操作日志(审计U8)", tasks: [
       { id: "M8-01", name: "operation_log表+aivfo-oplog微服务(发消息→入库✔)", status: "☑", env: false },
       { id: "M8-02", name: "Kafka topic tl-oplog+三端同schema", status: "☑", env: false },
-      { id: "M8-03", name: "Java @OperateLog切面(机制✔+data-trans✔,tl-control/business待)", status: "🔶", env: false },
+      { id: "M8-03", name: "Java @OperateLog切面(机制✔+data-trans✔+tl-control/business已接G3-2,真入库待运行验)", status: "🟢", env: false },
       { id: "M8-04", name: "C#组件 Aivfo.OperationLog(P3a端到端✔)", status: "☑", env: false },
       { id: "M8-05", name: "C#全埋operate+front(边界埋点+front接入✔,逐方法手埋待)", status: "🔶", env: false },
       { id: "M8-06", name: "可配置+配置集中下发(组件开关✔,§10下发待C4)", status: "🔶", env: false }

+ 7 - 7
项目文档/进度/进度状态.yaml

@@ -1,14 +1,14 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-20 文档重组完成(需求/开发计划/进度三层就位
+更新时间: 2026-06-20 G3-2 完成(tl-control/business Java 操作日志埋点
 当前任务: >
-  【★文档重组完成——一套全新文档就位(需求/开发计划/进度三层)★】
-  · 需求文档=合并后现实(01架构合并/13硬件访问层已更新到"已合并");
-  · 开发计划=《2026-06-20-当前开发计划.md》(5组15任务统摄剩余工作),7历史子计划已移入 已完成归档/;
-  · 进度=工作计划表已重写为真实状态、待验证清单/进度数据.js 已更;3历史报告→进度/历史报告/
-  下一步:按《2026-06-20-当前开发计划.md》推剩余工作(G1串口收尾/G2 UI/G3日志/G4对焦数据/G5业务回归)+ 真机GUI验证
-  续接读《工作计划表》+《当前开发计划》+ 本文件 + 交接卡末尾。
+  【★G3-2 Java 埋点完成(tl-control + business 接入 M8 操作日志)★】
+  · 两服务各装三件套:service+log-starter、manage+kafka-starter、lanucher+oplog-client;application-local 配 kafka(${server.ip}:9092, producer.enable=true)。
+  · tl-control 15 Controller/90 方法、business 24 Controller/121 方法贴 @OperateLog(module=@Api tags、operation=@ApiOperation 中文值);两服务 Maven 编译 BUILD SUCCESS。
+  · ★真入 operation_log 待起 Kafka+oplog 端到端抽查(运行期,非真机硬件门控)★
+  下一步:G3-1(operate 逐方法埋点,C# 大量 ViewModel)或 G3-3(配置下发 C4);或挑 G2/G4 纯代码任务。真机门控 G1-1/G4-3/G5 待用户在场
+  续接读:《工作计划表》+《当前开发计划》+ 本文件 + 交接卡末尾。
 说明: >
   M0-M5 全部【可写源码】已完成,C#合并端 0 error + M2-02 单测 15/15。工具链就位(JDK11.0.25 + Maven3.9.9
   @ C:\TLData\tools),Nexus 凭证(admin)已配 ~/.m2/settings.xml(401 解除);framework install(93 个 aivfo