package nc.oss.utils;

import java.util.Date;

import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.server.ServerConfiguration;
import nc.md.model.MetaDataException;
import nc.md.persist.framework.MDPersistenceService;
import nc.oss.common.OSSConst;
import nc.vo.oss.log.AggLogVO;
import nc.vo.oss.log.LogDetailVO;
import nc.vo.oss.log.LogVO;
import nc.vo.pub.VOStatus;
import nc.vo.pub.lang.UFDateTime; import org.apache.commons.lang.StringUtils; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; /**
* 日志切面类
*
*
*/
public class LoggerAspect { /**
* 记录日志
* @param serviceName 调用服务接口名
* @param msgObj 服务返回日志
*/
public static void saveLogger(String serviceName, JSONObject msgObj) {
if (!StringUtils.isEmpty(serviceName) && msgObj != null) {
AggLogVO aggVO = new AggLogVO();
LogVO logVO = new LogVO();
aggVO.setParentVO(logVO);
UFDateTime creationtime = new UFDateTime(new Date());
JSONObject retMsgContent = msgObj.getJSONObject(OSSConst.RETURN_MSG);
String serverAddr = InvocationInfoProxy.getInstance().getCallServer();
serverAddr = ServerConfiguration.getServerConfiguration().getServerName(); logVO.setPk_service(serviceName);
logVO.setService_name(serviceName);
logVO.setServer_addr(serverAddr); // 服务器地址
logVO.setRun_status(msgObj.getIntValue(OSSConst.STATUS));
logVO.setLog_msg(retMsgContent.getString(OSSConst.MSG_SUMMARY)); // 消息摘要
logVO.setExt_system(msgObj.getString(OSSConst.EXT_SYSTEM)); // 外部系统
logVO.setBill_type(msgObj.getString(OSSConst.BILL_TYPE)); // 单据类型
logVO.setCreationtime(creationtime);
// 构造日志明细VO
aggVO.setChildrenVO(createLogDetails(serviceName, retMsgContent)); try {
logVO.setStatus(VOStatus.NEW);
MDPersistenceService.lookupPersistenceService().saveBill(aggVO);
} catch (MetaDataException e) {
e.printStackTrace();
}
}
} private static LogDetailVO[] createLogDetails(String serviceName, JSONObject msgContent) {
LogDetailVO[] detailVOs = null;
JSONArray msgDetails = msgContent.getJSONArray(OSSConst.MSG_CONTENT);
if (msgDetails != null && msgDetails.size()>0) {
int count = msgDetails.size();
detailVOs = new LogDetailVO[count];
for (int i=0; i<count; i++) {
LogDetailVO detailVO = new LogDetailVO();
JSONObject jsonMsgDetail = msgDetails.getJSONObject(i); detailVO.setPk_business(jsonMsgDetail.getString(OSSConst.BILL_PK)); // 单据PK
detailVO.setPk_business_ext(jsonMsgDetail.getString(OSSConst.SRC_BILL_PK)); // 来源单据PK
detailVO.setPk_service(serviceName);
detailVO.setRun_status(jsonMsgDetail.getIntValue(OSSConst.STATUS));
detailVO.setLog_msg(jsonMsgDetail.getString(OSSConst.MSG_DETAIL_DESC));
detailVO.setCreationtime(new UFDateTime(new Date()));
detailVO.setStatus(VOStatus.NEW);
detailVOs[i] = detailVO;
}
}
return detailVOs;
} }

LoggerAspect的更多相关文章

  1. 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】

    一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...

  2. 【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】

    之前说过,如果一个数据库中要存储的数据量整体比较小,但是其中一个表存储的数据比较多,比如日志表,这时候就要考虑分表存储了:但是如果一个数据库整体存储的容量就比较大,该怎么办呢?这时候就需要考虑分库了, ...

  3. 【Java EE 学习 76 下】【数据采集系统第八天】【通过AOP实现日志管理】【日志管理功能分析和初步实现】

    一.日志管理相关分析 1.日志管理是一种典型的系统级别的应用,非常适合使用spring AOP实现. 2.使用日志管理的目的:对系统修改的动作进行记录,比如对权限.角色.用户的写操作.修改操作.删除操 ...

  4. springMVC之AOP

    AOP(Aspect-Oriented Programming,面向切面编程) 切面(Aepect):横切关注点(跨越应用程序多个模块的功能)被模块化的对象: 通知(Advice):切面必须要完成的工 ...

  5. SSH配置文件和SSM配置文件的写法

    一.SSH配置文件的写法(XML版本) <util:properties id="jdbc" location="classpath:db.properties&q ...

  6. SpringMVC+spring-security+sitemesh+hibernate+freemarker整合-转

    http://www.oschina.net/code/snippet_170632_46774 代码分享 当前位置: 代码分享 » Java  » Web编程 搜 索   SpringMVC+spr ...

  7. Spring基础学习(四)—AOP

    一.AOP基础 1.基本需求      需求: 日志功能,在程序执行期间记录发生的活动. ArithmeticCalculate.java public interface ArithmeticCal ...

  8. Spring4 AOP详解

    Spring4 AOP详解 第一章Spring 快速入门并没有对Spring4 的 AOP 做太多的描述,是因为AOP切面编程概念不好理解.所以这章主要从三个方面详解AOP:AOP简介(了解),基于注 ...

  9. Spring学习(1)——快速入门

    认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP( ...

随机推荐

  1. ZJOI2002 昂贵的聘礼

    题目描述 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...

  2. 元类编程-- 实现orm,以django Model为例

    # 需求 import numbers class Field: pass class IntField(Field): # 数据描述符 def __init__(self, db_column, m ...

  3. 【Foreign】数据结构C [线段树]

    数据结构C Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input Sample Output H ...

  4. Deep learning with Theano 官方中文教程(翻译)(三)——多层感知机(MLP)

    关于更多的http://deeplearning.net/tutorial/的翻译还有学习笔记会陆续整理传到博客. 供大家相互交流和学习,本人水平有限,若有各种大小错误,还请巨牛大牛小牛微牛们立马拍砖 ...

  5. this指针再解

     this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一 ...

  6. javascript中null与undefined的区别

    1.null null是一个对象,表示一个空对象指针,typeof(null)返回object,null参与运算时会转化为0,将对象初始化为null,可以知道变量是否保存了对象的引用 2.undefi ...

  7. 记一次Powershell反混淆 (1)

    样本地址: https://www.virustotal.com/#/file/6f9034646e6fcead5342f708031412e3c2efdb4fb0f37bba43133a471d1c ...

  8. 用python玩微信(聊天机器人,好友信息统计)

    1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...

  9. Centos 7 smb 安装使用

    安装: yum install samba 添加smb用户: smbpasswd -a root /etc/samba/smb.conf 追加: [public] path = / valid use ...

  10. 详见github

    本栏博客不再专门更新,详见:https://github.com/dxscjx123/LeetCode