From 1c0cf8959b261e405d3656b6087d2e9dd3e1cbda Mon Sep 17 00:00:00 2001
From: yyy <1083599556@qq.com>
Date: 星期二, 12 五月 2026 21:09:48 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpAdminOperationLogExportExcel.java  |   58 ++++++++++++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/SysGroup.java                                       |    2 
 xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/annotation/AdminOperationLog.java         |    2 
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpAdminOperationLogService.java         |    4 +
 xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/aspect/AdminOperationLogAspect.java       |   16 +---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/AdminOperationLogPageQuery.java            |    5 +
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAdminOperationLogServiceImpl.java |   19 ++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAdminOperationLog.java                          |    2 
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAdminOperationLogController.java    |   79 ++++++++++++++++++-
 9 files changed, 165 insertions(+), 22 deletions(-)

diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/SysGroup.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/SysGroup.java
index 0489ca0..f03b9b3 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/SysGroup.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/SysGroup.java
@@ -42,5 +42,5 @@
     private Integer groupType;
 
     @ApiModelProperty(value = "手机脱敏(0=否,1=是)")
-    private Integer phoneDesensitizationExempt;
+    private Integer phoneDesensitization;
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAdminOperationLog.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAdminOperationLog.java
index 33c67e1..d2fd7bd 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAdminOperationLog.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpAdminOperationLog.java
@@ -25,7 +25,7 @@
     @ApiModelProperty("主键ID")
     private Long id;
 
-    @ApiModelProperty("业务类型:1订单 2车辆 3车队 4账号 5运维 6交易定价 7内容中心 8系统 9白名单 10服务中心 11测试demo电子围栏管理 12测试计划 13账号管理 14权限组管理 15角色管理 16APP版本管理 17用户优惠券管理 18活动管理 19优惠券管理 20Banner管理 21开通城市管理 22电子围栏管理 23现场情况上报 24巡游计划 25在库车辆管理 26运营车辆管理 27车队管理 28车型管理 29定价管理 30路线规划配置管理 31定向服务 32免密支付策略 33运维人员管理 34打卡点管理 35班次管理 36排班计划管理 37任务工单管理 38巡检打卡规则管理 39资质审核 40政策申请 41意见反馈类型管理 42工单管理 43订单管理 44测试demo点位管理 45正式点位管理 46邀请码管理 99其他")
+    @ApiModelProperty("业务类型:1订单 2车辆 3车队 4账号 5运维 6交易定价 7内容中心 8系统 9白名单 10服务中心 11测试demo电子围栏管理 12测试计划 13账号管理 14权限组管理 15角色管理 16APP版本管理 17用户优惠券管理 18活动管理 19优惠券管理 20Banner管理 21开通城市管理 22电子围栏管理 23现场情况上报 24巡游计划 25在库车辆管理 26运营车辆管理 27车队管理 28车型管理 29定价管理 30路线规划配置管理 31定向服务 32免密支付策略 33运维人员管理 34打卡点管理 35班次管理 36排班计划管理 37任务工单管理 38巡检打卡规则管理 39资质审核 40政策申请 41意见反馈类型管理 42工单管理 43订单管理 44测试demo点位管理 45正式点位管理 46邀请码管理")
     private Integer businessType;
 
     @ApiModelProperty("业务类型名称")
diff --git a/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/annotation/AdminOperationLog.java b/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/annotation/AdminOperationLog.java
index 6a5724f..7e93b36 100644
--- a/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/annotation/AdminOperationLog.java
+++ b/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/annotation/AdminOperationLog.java
@@ -20,7 +20,7 @@
     /**
      * 业务类型。不配置时从 ApiOperation tags 中推断。
      */
-    AdminBusinessType businessType() default AdminBusinessType.OTHER;
+    AdminBusinessType businessType();
 
     /**
      * 操作类型。不配置时从注解内容或 ApiOperation value 中推断。
diff --git a/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/aspect/AdminOperationLogAspect.java b/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/aspect/AdminOperationLogAspect.java
index 2439520..f95d16e 100644
--- a/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/aspect/AdminOperationLogAspect.java
+++ b/xp-robotaxi-common/xp-common-log/src/main/java/com/xiaopeng/common/log/aspect/AdminOperationLogAspect.java
@@ -59,16 +59,12 @@
     @Resource
     private AsyncLogService asyncLogService;
 
-    @Around("@annotation(com.xiaopeng.common.log.annotation.AdminOperationLog) || execution(public * com.xiaopeng..controller..*(..))")
+    @Around("@annotation(com.xiaopeng.common.log.annotation.AdminOperationLog)")
     public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
         Method method = getMethod(joinPoint);
         AdminOperationLog annotation = method.getAnnotation(AdminOperationLog.class);
         ApiOperationMeta apiMeta = getApiOperationMeta(method, joinPoint.getTarget().getClass());
         AdminOperationType operationType = resolveOperationType(annotation, apiMeta, method, joinPoint.getArgs());
-        boolean shouldRecord = shouldRecord(annotation, apiMeta, operationType);
-        if (!shouldRecord) {
-            return joinPoint.proceed();
-        }
 
         Object result = null;
         Throwable error = null;
@@ -83,18 +79,14 @@
         }
     }
 
-    private boolean shouldRecord(AdminOperationLog annotation, ApiOperationMeta apiMeta, AdminOperationType operationType) {
-        if (annotation != null) {
-            return true;
-        }
-        return apiMeta.hasAdminTag() && operationType != AdminOperationType.OTHER;
-    }
-
     private void saveLog(ProceedingJoinPoint joinPoint, Method method, AdminOperationLog annotation,
                          ApiOperationMeta apiMeta, AdminOperationType operationType, Object result, Throwable error) {
         try {
             XpAdminOperationLog operationLog = new XpAdminOperationLog();
             AdminBusinessType businessType = resolveBusinessType(annotation, apiMeta);
+            if (businessType == AdminBusinessType.OTHER || operationType == AdminOperationType.OTHER) {
+                return;
+            }
             operationLog.setBusinessType(businessType.getCode());
             operationLog.setBusinessTypeName(businessType.getDesc());
             operationLog.setOperationType(operationType.getCode());
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAdminOperationLogController.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAdminOperationLogController.java
index 1c16a4c..c8bfc18 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAdminOperationLogController.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpAdminOperationLogController.java
@@ -1,17 +1,25 @@
 package com.xiaopeng.operation.controller;
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.xiaopeng.api.model.operation.XpAdminOperationLog;
 import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.WebUtils;
 import com.xiaopeng.common.core.web.domain.AjaxResult;
 import com.xiaopeng.common.core.web.page.PageInfo;
+import com.xiaopeng.common.log.annotation.AdminOperationLog;
 import com.xiaopeng.common.log.enums.AdminBusinessType;
+import com.xiaopeng.common.log.enums.AdminOperationType;
 import com.xiaopeng.common.security.annotation.InnerAuth;
 import com.xiaopeng.common.security.annotation.Logical;
 import com.xiaopeng.common.security.annotation.RequiresPermissions;
+import com.xiaopeng.operation.exportExcle.XpAdminOperationLogExportExcel;
 import com.xiaopeng.operation.query.AdminOperationLogPageQuery;
 import com.xiaopeng.operation.service.IXpAdminOperationLogService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -19,7 +27,13 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.LinkedHashMap;
@@ -31,18 +45,51 @@
  * 管理后台操作记录
  */
 @RestController
-@RequestMapping({"/api/v1/adminOperationLog"})
+@RequestMapping({""})
 @Api(tags = "管理后台-操作记录")
 public class XpAdminOperationLogController {
+
+    private static final DateTimeFormatter EXPORT_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     @Resource
     private IXpAdminOperationLogService adminOperationLogService;
 
-    @RequiresPermissions(value = {"/adminOperationLog/list", "/operationLog/list"}, logical = Logical.OR)
-    @GetMapping("/list")
+//    @RequiresPermissions(value = {"/adminOperationLog/list", "/operationLog/list"}, logical = Logical.OR)
+    @GetMapping("/api/v1/adminOperationLog/list")
     @ApiOperation(value = "管理后台操作记录分页列表", tags = {"管理后台-操作记录"})
     public AjaxResult<PageInfo<XpAdminOperationLog>> list(AdminOperationLogPageQuery query) {
         return AjaxResult.success(adminOperationLogService.pageList(query));
+    }
+
+    @PostMapping("/api/v1/adminOperationLog/exportExcel")
+    @ApiOperation(value = "管理后台操作记录导出", tags = {"管理后台-操作记录"})
+    @AdminOperationLog(
+            businessType = AdminBusinessType.SYSTEM,
+            operationType = AdminOperationType.EXPORT,
+            content = "导出管理后台操作记录",
+            appendRequestData = true
+    )
+    public void exportExcel(@RequestBody AdminOperationLogPageQuery query) {
+        List<XpAdminOperationLog> list = adminOperationLogService.exportList(query);
+        List<XpAdminOperationLogExportExcel> exportList = list == null ? new ArrayList<>() : list.stream()
+                .map(this::toExportRow)
+                .collect(Collectors.toList());
+        HttpServletResponse response = WebUtils.response();
+        if (response == null) {
+            throw new ServiceException("导出失败:未获取到响应对象");
+        }
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        try {
+            String fileName = URLEncoder.encode("管理后台操作记录.xls", "utf-8");
+            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
+            try (Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpAdminOperationLogExportExcel.class, exportList);
+                 ServletOutputStream outputStream = response.getOutputStream()) {
+                workbook.write(outputStream);
+            }
+        } catch (IOException e) {
+            throw new ServiceException("管理后台操作记录导出失败");
+        }
     }
 
     @RequiresPermissions(value = {"/adminOperationLog/list", "/operationLog/list"}, logical = Logical.OR)
@@ -50,6 +97,7 @@
     @ApiOperation(value = "管理后台操作记录业务类型列表", tags = {"管理后台-操作记录"})
     public AjaxResult<List<Map<String, Object>>> businessTypeList() {
         List<Map<String, Object>> list = Arrays.stream(AdminBusinessType.values())
+                .filter(type -> type != AdminBusinessType.OTHER)
                 .sorted(Comparator.comparingInt(AdminBusinessType::getCode))
                 .map(type -> {
                     Map<String, Object> item = new LinkedHashMap<>();
@@ -62,13 +110,34 @@
         return AjaxResult.success(list);
     }
 
-    @InnerAuth
-    @PostMapping("/saveLog")
+//    @InnerAuth
+    @PostMapping("/logan/adminOperationLog/saveLog")
     public R<Boolean> saveLog(@RequestBody XpAdminOperationLog adminOperationLog) {
+        if (adminOperationLog == null
+                || Integer.valueOf(AdminBusinessType.OTHER.getCode()).equals(adminOperationLog.getBusinessType())
+                || Integer.valueOf(AdminOperationType.OTHER.getCode()).equals(adminOperationLog.getOperationType())) {
+            return R.ok(false);
+        }
         if (adminOperationLog.getOperationTime() == null) {
             adminOperationLog.setOperationTime(LocalDateTime.now());
         }
         adminOperationLog.setCreateTime(LocalDateTime.now());
         return R.ok(adminOperationLogService.save(adminOperationLog));
     }
+
+    private XpAdminOperationLogExportExcel toExportRow(XpAdminOperationLog log) {
+        XpAdminOperationLogExportExcel row = new XpAdminOperationLogExportExcel();
+        row.setBusinessTypeName(log.getBusinessTypeName());
+        row.setOperationTypeName(log.getOperationTypeName());
+        row.setOperatorName(log.getOperatorName());
+        row.setOperatorAccount(log.getOperatorAccount());
+        row.setOperationContent(log.getOperationContent());
+        row.setOperationIp(log.getOperationIp());
+        row.setRequestUri(log.getRequestUri());
+        row.setRequestMethod(log.getRequestMethod());
+        row.setStatusName(Integer.valueOf(0).equals(log.getStatus()) ? "成功" : "失败");
+        row.setErrorMsg(log.getErrorMsg());
+        row.setOperationTime(log.getOperationTime() == null ? null : EXPORT_TIME_FORMATTER.format(log.getOperationTime()));
+        return row;
+    }
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpAdminOperationLogExportExcel.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpAdminOperationLogExportExcel.java
new file mode 100644
index 0000000..dd57ede
--- /dev/null
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/exportExcle/XpAdminOperationLogExportExcel.java
@@ -0,0 +1,58 @@
+package com.xiaopeng.operation.exportExcle;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 管理后台操作记录导出
+ */
+@Data
+@ApiModel(value = "管理后台操作记录导出")
+public class XpAdminOperationLogExportExcel {
+
+    @ApiModelProperty(value = "业务类型")
+    @Excel(name = "业务类型", width = 25)
+    private String businessTypeName;
+
+    @ApiModelProperty(value = "操作类型")
+    @Excel(name = "操作类型", width = 20)
+    private String operationTypeName;
+
+    @ApiModelProperty(value = "操作人")
+    @Excel(name = "操作人", width = 20)
+    private String operatorName;
+
+    @ApiModelProperty(value = "操作账号")
+    @Excel(name = "操作账号", width = 25)
+    private String operatorAccount;
+
+    @ApiModelProperty(value = "操作内容")
+    @Excel(name = "操作内容", width = 40)
+    private String operationContent;
+
+    @ApiModelProperty(value = "操作IP")
+    @Excel(name = "操作IP", width = 20)
+    private String operationIp;
+
+    @ApiModelProperty(value = "请求地址")
+    @Excel(name = "请求地址", width = 35)
+    private String requestUri;
+
+    @ApiModelProperty(value = "请求方法")
+    @Excel(name = "请求方法", width = 15)
+    private String requestMethod;
+
+    @ApiModelProperty(value = "状态")
+    @Excel(name = "状态", width = 15)
+    private String statusName;
+
+    @ApiModelProperty(value = "错误信息")
+    @Excel(name = "错误信息", width = 40)
+    private String errorMsg;
+
+    @ApiModelProperty(value = "操作时间")
+    @Excel(name = "操作时间", width = 30)
+    private String operationTime;
+}
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/AdminOperationLogPageQuery.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/AdminOperationLogPageQuery.java
index 814189a..046c606 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/AdminOperationLogPageQuery.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/query/AdminOperationLogPageQuery.java
@@ -13,9 +13,12 @@
 @ApiModel(value = "管理后台操作记录分页查询")
 public class AdminOperationLogPageQuery extends BasePage {
 
-    @ApiModelProperty(value = "业务类型:1订单 2车辆 3车队 4账号 5运维 6交易定价 7内容中心 8系统 9白名单 10服务中心 11测试demo电子围栏管理 12测试计划 13账号管理 14权限组管理 15角色管理 16APP版本管理 17用户优惠券管理 18活动管理 19优惠券管理 20Banner管理 21开通城市管理 22电子围栏管理 23现场情况上报 24巡游计划 25在库车辆管理 26运营车辆管理 27车队管理 28车型管理 29定价管理 30路线规划配置管理 31定向服务 32免密支付策略 33运维人员管理 34打卡点管理 35班次管理 36排班计划管理 37任务工单管理 38巡检打卡规则管理 39资质审核 40政策申请 41意见反馈类型管理 42工单管理 43订单管理 44测试demo点位管理 45正式点位管理 46邀请码管理 99其他")
+    @ApiModelProperty(value = "业务类型:1订单 2车辆 3车队 4账号 5运维 6交易定价 7内容中心 8系统 9白名单 10服务中心 11测试demo电子围栏管理 12测试计划 13账号管理 14权限组管理 15角色管理 16APP版本管理 17用户优惠券管理 18活动管理 19优惠券管理 20Banner管理 21开通城市管理 22电子围栏管理 23现场情况上报 24巡游计划 25在库车辆管理 26运营车辆管理 27车队管理 28车型管理 29定价管理 30路线规划配置管理 31定向服务 32免密支付策略 33运维人员管理 34打卡点管理 35班次管理 36排班计划管理 37任务工单管理 38巡检打卡规则管理 39资质审核 40政策申请 41意见反馈类型管理 42工单管理 43订单管理 44测试demo点位管理 45正式点位管理 46邀请码管理")
     private Integer businessType;
 
+    @ApiModelProperty(value = "业务类型名称")
+    private String businessTypeName;
+
     @ApiModelProperty(value = "操作人")
     private String operatorName;
 
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpAdminOperationLogService.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpAdminOperationLogService.java
index c46f831..2e10b7e 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpAdminOperationLogService.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpAdminOperationLogService.java
@@ -5,10 +5,14 @@
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.operation.query.AdminOperationLogPageQuery;
 
+import java.util.List;
+
 /**
  * 管理后台操作记录服务
  */
 public interface IXpAdminOperationLogService extends IService<XpAdminOperationLog> {
 
     PageInfo<XpAdminOperationLog> pageList(AdminOperationLogPageQuery query);
+
+    List<XpAdminOperationLog> exportList(AdminOperationLogPageQuery query);
 }
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAdminOperationLogServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAdminOperationLogServiceImpl.java
index f01c0d9..bdc2ee8 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAdminOperationLogServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpAdminOperationLogServiceImpl.java
@@ -10,6 +10,8 @@
 import com.xiaopeng.operation.service.IXpAdminOperationLogService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 管理后台操作记录服务实现
  */
@@ -20,9 +22,24 @@
     @Override
     public PageInfo<XpAdminOperationLog> pageList(AdminOperationLogPageQuery query) {
         PageInfo<XpAdminOperationLog> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        return page(pageInfo, buildQueryWrapper(query));
+    }
+
+    @Override
+    public List<XpAdminOperationLog> exportList(AdminOperationLogPageQuery query) {
+        return list(buildQueryWrapper(query));
+    }
+
+    private LambdaQueryWrapper<XpAdminOperationLog> buildQueryWrapper(AdminOperationLogPageQuery query) {
         LambdaQueryWrapper<XpAdminOperationLog> wrapper = new LambdaQueryWrapper<>();
+        if (query == null) {
+            return wrapper.orderByDesc(XpAdminOperationLog::getOperationTime);
+        }
         if (query.getBusinessType() != null) {
             wrapper.eq(XpAdminOperationLog::getBusinessType, query.getBusinessType());
+        }
+        if (StringUtils.isNotEmpty(query.getBusinessTypeName())) {
+            wrapper.like(XpAdminOperationLog::getBusinessTypeName, query.getBusinessTypeName());
         }
         if (StringUtils.isNotEmpty(query.getOperatorName())) {
             wrapper.like(XpAdminOperationLog::getOperatorName, query.getOperatorName());
@@ -36,6 +53,6 @@
         if (query.getStartTime() != null && query.getEndTime() != null) {
             wrapper.between(XpAdminOperationLog::getOperationTime, query.getStartTime(), query.getEndTime());
         }
-        return page(pageInfo, wrapper.orderByDesc(XpAdminOperationLog::getOperationTime));
+        return wrapper.orderByDesc(XpAdminOperationLog::getOperationTime);
     }
 }

--
Gitblit v1.7.1