first commit

This commit is contained in:
Ray
2026-02-19 03:37:37 +08:00
commit ccfd8c79a4
2813 changed files with 453657 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Class-Path:

203
comm/Log/WebContent/log_list.jsp Executable file
View File

@@ -0,0 +1,203 @@
<%@ page language="java" pageEncoding="utf-8"%>
<%@ include file="include/pagetop.jsp"%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="include/head.jsp"%>
</head>
<body>
<%@ include file="include/loading.jsp"%>
<%@ include file="include/top.jsp"%>
<%@ include file="include/menu_left.jsp"%>
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START CONTENT -->
<div class="content">
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START CONTAINER -->
<div class="container-default">
<h3>用户操作日志</h3>
<%@ include file="include/alert.jsp"%>
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START queryForm -->
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-title">查询条件</div>
<div class="panel-body">
<form class="form-horizontal"
action="<%=basePath%>normal/adminLogAction!list.action"
method="post" id="queryForm">
<input type="hidden" name="pageNo" id="pageNo"
value="${param.pageNo}">
<!--
<div class="col-md-12 col-lg-6" >
<fieldset>
<div class="control-group">
<div class="controls">
<div class="input-prepend input-group">
<span class="add-on input-group-addon"><i class="fa fa-calendar"></i></span>
<s:textfield id="date_para" name="date_para"
cssClass="form-control " placeholder="变更日期" />
</div>
</div>
</div>
</fieldset>
</div>
-->
<div class="col-md-12 col-lg-4" >
<fieldset>
<div class="control-group">
<div class="controls">
<s:textfield id="name_para" name="name_para"
cssClass="form-control " placeholder="用户名" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-12 col-lg-6">
<fieldset>
<div class="control-group">
<div class="controls">
<s:textfield id="log_para" name="log_para"
cssClass="form-control " placeholder="日志" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-12 col-lg-3" style="margin-top: 10px;">
<fieldset>
<div class="control-group">
<div class="controls">
<s:textfield id="operator" name="operator"
cssClass="form-control " placeholder="操作者" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-12 col-lg-3" style="margin-top: 10px;">
<fieldset>
<div class="control-group">
<div class="controls">
<s:select id="category" cssClass="form-control " headerValue="分类" headerKey=""
name="category" list="category_map"
listKey="key" listValue="value" value="category" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-12 col-lg-2" style="margin-top: 10px;">
<button type="submit" class="btn btn-light btn-block">查询</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- END queryForm -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<div class="row">
<div class="col-md-12">
<!-- Start Panel -->
<div class="panel panel-default">
<div class="panel-title">查询结果</div>
<div class="panel-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<sec:authorize ifAnyGranted="ROLE_ADMIN,ROLE_ROOT,ROLE_ADMINGUEST,ROLE_FINANCE,ROLE_DEBUG">
<!-- <td>名称</td>-->
<td>用户名</td>
</sec:authorize>
<td>日志</td>
<td>操作者</td>
<td width="150px">时间</td>
</tr>
</thead>
<tbody>
<s:iterator value="page.elements" status="stat">
<tr>
<!-- <td><s:property value="name" /></td>-->
<td><s:property value="username" /></td>
<td><s:property value="log" /></td>
<td><s:property value="operator" /></td>
<td><s:date name="createTime" format="yyyy-MM-dd HH:mm " /></td>
</tr>
</s:iterator>
</tbody>
</table>
<%@ include file="include/page_simple.jsp"%>
<nav>
</div>
</div>
<!-- End Panel -->
</div>
</div>
</div>
<!-- END CONTAINER -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<%@ include file="include/footer.jsp"%>
</div>
<!-- End Content -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<%@ include file="include/js.jsp"%>
<script type="text/javascript">
$(document).ready(function() {
$('#date_para').daterangepicker({
timePicker : true, //显示时间
timePicker24Hour : true, //时间制
timePickerSeconds : true, //时间显示到秒
format : 'YYYY-MM-DD HH:mm:ss',
startDate : new Date(),
endDate : new Date(),
minDate : 1999 - 12 - 12,
maxDate : 2050 - 12 - 30,
timePicker : true,
timePickerIncrement : 1,
locale : {
applyLabel : "确认",
cancelLabel : "取消",
resetLabel : "重置",
}
}, function(start, end, label) {
console.log(start.toISOString(), end.toISOString(), label);
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,148 @@
<%@ page language="java" pageEncoding="utf-8"%>
<%@ include file="include/pagetop.jsp"%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="include/head.jsp"%>
</head>
<body>
<%@ include file="include/loading.jsp"%>
<%@ include file="include/top.jsp"%>
<%@ include file="include/menu_left.jsp"%>
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START CONTENT -->
<div class="content">
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START CONTAINER -->
<div class="container-default">
<h3>账变记录</h3>
<%@ include file="include/alert.jsp"%>
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START queryForm -->
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-title">查询条件</div>
<div class="panel-body">
<s:if test='isResourceAccessible("ADMIN_MONEY_LOG_LIST")'>
<form class="form-horizontal"
action="<%=basePath%>normal/adminMoneyLogAction!list.action"
method="post" id="queryForm">
<input type="hidden" name="pageNo" id="pageNo"
value="${param.pageNo}">
<div class="col-md-12 col-lg-4">
<fieldset>
<div class="control-group">
<div class="controls">
<s:textfield id="name_para" name="name_para"
cssClass="form-control " placeholder="用户名、UID(完整)" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-12 col-lg-6">
<fieldset>
<div class="control-group">
<div class="controls">
<s:textfield id="log_para" name="log_para"
cssClass="form-control " placeholder="日志" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-12 col-lg-2" >
<s:if test='isResourceAccessible("ADMIN_MONEY_LOG_LIST")'>
<button type="submit" class="btn btn-light btn-block">查询</button>
</s:if>
</div>
</form>
</s:if>
</div>
</div>
</div>
</div>
<!-- END queryForm -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<div class="row">
<div class="col-md-12">
<!-- Start Panel -->
<div class="panel panel-default">
<div class="panel-title">查询结果</div>
<div class="panel-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<td>用户名</td>
<td>UID</td>
<td>账户名称</td>
<td>日志</td>
<td>币种</td>
<td>金额</td>
<td>变更前</td>
<td>变更后</td>
<td width="150px">时间</td>
</tr>
</thead>
<tbody>
<s:iterator value="page.elements" status="stat">
<tr>
<td><s:property value="username" /></td>
<td><s:property value="usercode" /></td>
<td><s:if test='rolename=="GUEST"'>
<span class="right label label-warning">演示账号</span>
</s:if>
<s:if test='rolename=="MEMBER"'>
<span class="right label label-success">正式账号</span>
</s:if>
</td>
<td><s:property value="log" /></td>
<td><s:property value="wallettype" /></td>
<td><fmt:formatNumber value="${amount}" pattern="#0.00" /></td>
<td><fmt:formatNumber value="${amount_before}" pattern="#0.00" /></td>
<td><fmt:formatNumber value="${amount_after}" pattern="#0.00" /></td>
<td><s:date name="createTime" format="yyyy-MM-dd HH:mm " /></td>
</tr>
</s:iterator>
</tbody>
</table>
<%@ include file="include/page_simple.jsp"%>
<nav>
</div>
</div>
<!-- End Panel -->
</div>
</div>
</div>
<!-- END CONTAINER -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<%@ include file="include/footer.jsp"%>
</div>
<!-- End Content -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<%@ include file="include/js.jsp"%>
</body>
</html>

View File

@@ -0,0 +1,181 @@
<%@ page language="java" pageEncoding="utf-8"%>
<%@ include file="include/pagetop.jsp"%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="include/head.jsp"%>
</head>
<body>
<%@ include file="include/loading.jsp"%>
<%@ include file="include/top.jsp"%>
<%@ include file="include/menu_left.jsp"%>
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START CONTENT -->
<div class="content">
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START CONTAINER -->
<div class="container-default">
<h3>系统运行日志</h3>
<%@ include file="include/alert.jsp"%>
<!-- //////////////////////////////////////////////////////////////////////////// -->
<!-- START queryForm -->
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-title">查询条件</div>
<div class="panel-body">
<form class="form-horizontal"
action="<%=basePath%>normal/adminSysLogAction!list.action"
method="post" id="queryForm">
<input type="hidden" name="pageNo" id="pageNo"
value="${param.pageNo}">
<div class="col-md-5 col-lg-5" >
<fieldset>
<div class="control-group">
<div class="controls">
<div class="input-prepend input-group">
<span class="add-on input-group-addon"><i class="fa fa-calendar"></i></span>
<s:textfield id="date_para" name="date_para"
cssClass="form-control " placeholder="变更日期" />
</div>
</div>
</div>
</fieldset>
</div>
<div class="col-md-3 col-lg-3" >
<fieldset>
<div class="control-group">
<div class="controls">
<s:select id="category_para" cssClass="form-control " headerValue="分类" headerKey=""
name="category_para" list="category_map"
listKey="key" listValue="value" value="category_para" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-2 col-lg-2">
<fieldset>
<div class="control-group">
<div class="controls">
<s:select id="level_para" cssClass="form-control " headerValue="级别" headerKey=""
name="level_para" list="level_map"
listKey="key" listValue="value" value="level_para" />
</div>
</div>
</fieldset>
</div>
<div class="col-md-2 col-lg-2" >
<button type="submit" class="btn btn-light btn-block">查询</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- END queryForm -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<div class="row">
<div class="col-md-12">
<!-- Start Panel -->
<div class="panel panel-default">
<div class="panel-title">查询结果</div>
<div class="panel-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<td>分类</td>
<td>级别</td>
<td>日志</td>
<td width="150px">时间</td>
</tr>
</thead>
<tbody>
<s:iterator value="page.elements" status="stat">
<tr>
<sec:authorize ifAnyGranted="ROLE_ADMIN,ROLE_ROOT,ROLE_ADMINGUEST,ROLE_FINANCE,ROLE_DEBUG">
<td>
<s:property value="category_map.get(category)" />
</td>
<td><s:property value="level_map.get(level)" /></td>
</sec:authorize>
<td><s:property value="log" /></td>
<td><s:date name="createTime" format="yyyy-MM-dd HH:mm:ss" /></td>
</tr>
</s:iterator>
</tbody>
</table>
<%@ include file="include/page_simple.jsp"%>
<nav>
</div>
</div>
<!-- End Panel -->
</div>
</div>
</div>
<!-- END CONTAINER -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<%@ include file="include/footer.jsp"%>
</div>
<!-- End Content -->
<!-- //////////////////////////////////////////////////////////////////////////// -->
<%@ include file="include/js.jsp"%>
<script type="text/javascript">
$(document).ready(function() {
$('#date_para').daterangepicker({
timePicker : true, //显示时间
timePicker24Hour : true, //时间制
timePickerSeconds : true, //时间显示到秒
format : 'YYYY-MM-DD HH:mm:ss',
startDate : new Date(),
endDate : new Date(),
minDate : 1999 - 12 - 12,
maxDate : 2050 - 12 - 30,
timePicker : true,
timePickerIncrement : 1,
locale : {
applyLabel : "确认",
cancelLabel : "取消",
resetLabel : "重置",
}
}, function(start, end, label) {
console.log(start.toISOString(), end.toISOString(), label);
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="${dubbo.application.name}" />
<!-- 使用zkp注册中心暴露服务地址 -->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="${dubbo.registry.protocol}"
address="${dubbo.registry.address}" />
<dubbo:protocol host="127.0.0.1" />
<dubbo:reference id="logService"
interface="project.log.LogService" check="false" />
<dubbo:reference id="sysLogService"
interface="project.log.SysLogService" check="false" />
<dubbo:reference id="codeLogService"
interface="project.log.CodeLogService" check="false" />
</beans>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="${dubbo.application.name}" />
<!-- 使用zkp注册中心暴露服务地址 -->
<dubbo:registry protocol="${dubbo.registry.protocol}"
address="${dubbo.registry.address}" />
<dubbo:protocol port="${dubbo.application.port.root}"
host="127.0.0.1"></dubbo:protocol>
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="project.log.LogService"
ref="logService" />
<dubbo:service interface="project.log.SysLogService"
ref="sysLogService" />
<dubbo:service interface="project.log.CodeLogService"
ref="codeLogService" />
</beans>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="moneyLogService" class="project.log.internal.MoneyLogServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedDao" ref="pagedDao" />
</bean>
</beans>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="logService" class="project.log.internal.LogServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedQueryDao" ref="pagedDao" />
</bean>
<bean id="moneyLogService" class="project.log.internal.MoneyLogServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedDao" ref="pagedDao" />
</bean>
<bean id="sysLogService" class="project.log.internal.SysLogServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="saveLogServer" class="project.log.internal.SaveLogServer">
<property name="logService" ref="logService" />
<property name="sysLogService" ref="sysLogService" />
</bean>
<bean id="codeLogService" class="project.log.internal.CodeLogServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedQueryDao" ref="pagedDao" />
</bean>
</beans>

View File

@@ -0,0 +1,23 @@
admin
<action name="adminMoneyLogAction"
class="project.log.action.AdminMoneyLogAction">
<result name="list">/moneylog_list.jsp</result>
</action>
<action name="adminSysLogAction" class="project.log.action.AdminSysLogAction">
<result name="list">/systemlog_list.jsp</result>
</action>
<action name="adminLogAction" class="project.log.action.AdminLogAction">
<result name="list">/log_list.jsp</result>
</action>
<action name="adminCodeLogAction" class="project.log.action.AdminCodeLogAction">
<result name="list">/code_log_list.jsp</result>
</action>
api
<action name="moneylog"
class="project.log.action.MoneyLogAction">
</action>

View File

@@ -0,0 +1,79 @@
/*==============================================================*/
/* 系统日志 */
/*==============================================================*/
DROP TABLE IF EXISTS T_SYSLOG;
create table T_SYSLOG (
UUID VARCHAR(32) NOT NULL,
CATEGORY VARCHAR(64),
LEVEL VARCHAR(12),
LOG text,
EXTRA VARCHAR(512),
CREATE_TIME datetime,
PARTY_ID varchar(32) ,
PRIMARY KEY (UUID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
create index INDEX_SYSLOG_CREATE_TIME on T_SYSLOG (
CREATE_TIME
);
create index INDEX_SYSLOG_CATEGORY on T_SYSLOG (
CATEGORY,CREATE_TIME
);
create index INDEX_SYSLOG_LEVEL on T_SYSLOG (
LEVEL,CREATE_TIME
);
create index INDEX_SYSLOG_PARTY_ID on T_SYSLOG (
PARTY_ID,CREATE_TIME
);
DROP TABLE IF EXISTS T_LOG;
create table T_LOG (
UUID VARCHAR(32) NOT NULL,
CATEGORY VARCHAR(64),
LOG text,
EXTRA VARCHAR(512),
CREATE_TIME datetime,
PARTY_ID varchar(32) ,
LAYER int,
AMOUNT double,
PRIMARY KEY (UUID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
create index INDEX_LOG_PARTY_ID on T_LOG (
PARTY_ID,CREATE_TIME
);
create index INDEX_LOG_CATEGORY on T_LOG (
CATEGORY,PARTY_ID,CREATE_TIME
);
alter table T_LOG add STATE int;
UPDATE T_LOG SET STATE = 0;
create index INDEX_LOG_STATE on T_LOG (
STATE
);
DROP TABLE IF EXISTS T_MONEY_LOG;
create table T_MONEY_LOG (
UUID VARCHAR(32) NOT NULL,
LOG text,
EXTRA VARCHAR(512),
WALLETTYPE VARCHAR(128),
CREATE_TIME datetime,
PARTY_ID varchar(32) ,
LOCALKEY VARCHAR(64),
AMOUNT double,
AMOUNT_BEFORE double,
AMOUNT_AFTER double,
PRIMARY KEY (UUID)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
create index INDEX_MONEY_LOG_PARTY_ID on T_MONEY_LOG (
PARTY_ID,CREATE_TIME
);

View File

@@ -0,0 +1,6 @@
ALTER TABLE T_LOG ADD `USERNAME` varchar(64);
ALTER TABLE T_SYSLOG ADD `EXTRA` varchar(64);
ALTER TABLE T_MONEY_LOG ADD `CONTENT_TYPE` varchar(32);
ALTER TABLE T_MONEY_LOG ADD `CATEGORY` varchar(32);

View File

@@ -0,0 +1,14 @@
-- 用户发送验证码日志
DROP TABLE IF EXISTS T_CODE_LOG;
create table T_CODE_LOG (
UUID VARCHAR(32) NOT NULL,
LOG text,
CREATE_TIME datetime,
PARTY_ID varchar(32) ,
TARGET varchar(64) ,
USERNAME varchar(64) ,
PRIMARY KEY (UUID),
KEY `INDEX_CODE_LOG_ORDER_STATUS` (`PARTY_ID`,`CREATE_TIME`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@@ -0,0 +1,5 @@
package project.log;
public interface AbstractLog {
}

View File

@@ -0,0 +1,45 @@
package project.log;
import java.util.Date;
import kernel.web.Page;
public interface AdminLogService {
/**
*
* 资金变更日志
* @param log_para 日志 like查询
* @param wallettype 账户类型
*/
public Page pagedQueryMoneyLog(int pageNo, int pageSize, String log_para,String name_para,String loginPartyId,String rolename_para,String startTime,String endTime,String frozenState);
/**
*
* 操作日志
* @param log_para 日志 like查询
* @param wallettype 账户类型
*/
public Page pagedQueryLog(int pageNo, int pageSize, String log_para,String name_para,String category,String operator,Date createTime_begin,
Date createTime_end, String loginPartyId,String loginUsername);
/**
*
* 系统日志
* @param log_para 日志 like查询
* @param wallettype 账户类型
*/
public Page pagedQuerySysLog(int pageNo, int pageSize, String log_para,String level_para,String category_para,Date createTime_begin,
Date createTime_end);
/**
*
* 发送验证码日志
* @param log_para 日志 like查询
* @param wallettype 账户类型
*/
public Page pagedQueryCodeLog(int pageNo, int pageSize, String log_para,String name_para,String target,Date createTime_begin,
Date createTime_end, String loginPartyId,String loginUsername,String id_para);
}

View File

@@ -0,0 +1,88 @@
package project.log;
import java.io.Serializable;
import java.util.Date;
import kernel.bo.EntityObject;
public class ApiLog extends EntityObject implements AbstractLog {
/**
* Member Description
*/
private static final long serialVersionUID = 1837652077217320806L;
/**
* 日志归属
*/
private Serializable partyId;
/**
* ip
*/
private String ip;
/**
* 接口名
*/
private String api;
/**
* 日志
*/
private String log;
/**
* 扩展信息,统计分类时使用
*/
private String extra;
// 创建时间
private Date createTime;
public Serializable getPartyId() {
return partyId;
}
public String getIp() {
return ip;
}
public String getLog() {
return log;
}
public String getExtra() {
return extra;
}
public String getApi() {
return api;
}
public Date getCreateTime() {
return createTime;
}
public void setPartyId(Serializable partyId) {
this.partyId = partyId;
}
public void setIp(String ip) {
this.ip = ip;
}
public void setLog(String log) {
this.log = log;
}
public void setExtra(String extra) {
this.extra = extra;
}
public void setApi(String api) {
this.api = api;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}

View File

@@ -0,0 +1,12 @@
package project.log;
public interface ApiLogService {
public void save(ApiLog entity);
public void update(ApiLog entity);
public void delete(String id);
public ApiLog findById(String id);
}

View File

@@ -0,0 +1,82 @@
package project.log;
import java.io.Serializable;
import java.util.Date;
import kernel.bo.EntityObject;
public class CodeLog extends EntityObject implements AbstractLog{
private static final long serialVersionUID = 7008440232393696319L;
/**
* 日志归属
*/
private Serializable partyId;
/**
* 日志归属
*/
private String username;
/**
* 日志
*/
private String log;
/**
* TARGET
*/
private String target;
// 创建时间
private Date createTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Serializable getPartyId() {
return partyId;
}
public void setPartyId(Serializable partyId) {
this.partyId = partyId;
}
public String getLog() {
return log;
}
public void setLog(String log) {
this.log = log;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
}

View File

@@ -0,0 +1,17 @@
package project.log;
import java.io.Serializable;
public interface CodeLogService {
/**
* 同步保存
*/
public void saveSync(CodeLog entity);
/**
* 异步保存
*/
public void saveAsyn(CodeLog entity);
}

View File

@@ -0,0 +1,98 @@
package project.log;
import java.io.Serializable;
import java.util.Date;
import kernel.bo.EntityObject;
public class Log extends EntityObject implements AbstractLog{
/**
* Member Description
*/
private static final long serialVersionUID = 1837652077217320806L;
/**
* 日志归属
*/
private Serializable partyId;
/**
* 日志归属
*/
private String username;
// 日志类型见Constants
private String category;
/**
* 日志
*/
private String log;
/**
* 扩展信息,统计分类时使用
*/
private String extra;
private String operator;
// 创建时间
private Date createTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Serializable getPartyId() {
return partyId;
}
public void setPartyId(Serializable partyId) {
this.partyId = partyId;
}
public String getLog() {
return log;
}
public void setLog(String log) {
this.log = log;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
}

View File

@@ -0,0 +1,22 @@
package project.log;
import java.io.Serializable;
import java.util.Date;
import kernel.web.Page;
public interface LogService {
/**
* 同步保存
*/
public void saveSync(Log entity);
/**
* 异步保存
*/
public void saveAsyn(Log entity);
public Page pagedQuery(int pageNo, int pageSize, Serializable partyId, String[] category, String[] extra,
Date createTime_begin, Date createTime_end);
}

View File

@@ -0,0 +1,13 @@
package project.log;
public class MallLogRedisKeys {
// 资金冻结记录缓存
public final static String SELLER_MONEY_FREEZE = "SELLER_MONEY_FREEZE";
// 一个基于 zset 的缓存value - {商铺ID : 买家ID}, value - {买家发送IM消息的毫秒时间戳}
public final static String SELLER_IM_REPLY_NOTIFY = "seller_im_reply_notify";
// 一个基于 hash 的缓存field - {商铺ID : 买家ID}, value - {最早一条消息的ID : 买家发送IM消息的毫秒时间戳}
public final static String SELLER_IM_LAST_BUYER_MESSAGE = "seller_im_last_buyer_message";
}

View File

@@ -0,0 +1,23 @@
package project.log;
import kernel.bo.EntityObject;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MoneyFreeze extends EntityObject {
private static final long serialVersionUID = -5914896022101327097L;
private Serializable partyId;
private String operator;
private Double amount;
private String moneyLog;
private Date beginTime;
private Date endTime;
private Date createTime;
// 资金状态0-已解冻1-冻结中
private Integer status;
private String reason;
}

View File

@@ -0,0 +1,59 @@
package project.log;
import kernel.web.Page;
import java.util.List;
public interface MoneyFreezeService {
public void save(MoneyFreeze entity);
public MoneyFreeze getById(String id);
/**
* 冻结资金的完整逻辑
*
* @param sellerId
* @param freezeAmout
* @param freezeDays
* @param freezeReason
* @param operator
*/
public MoneyFreeze updateFreezeSeller(String sellerId, double freezeAmout, int freezeDays, String freezeReason, String operator);
/**
* 解冻资金的完整逻辑
*
* @param id
* @param operator
*/
public int updateUnFreezeSeller(String id, String operator);
/**
* 定时器解冻资金的完整旧逻辑
*
* @param id
* @param operator
*/
public int updateAutoUnFreezeSeller(String id, String operator);
/**
* 将冻结记录状态修改为结束冻结
*
* @param id
* @param operator
* @return
*/
public int updateSetUnFreezeState(String id, String operator);
public List<String> listPendingFreezeRecords();
public List<MoneyFreeze> listPendingFreezeRecords(int size);
public Page pagedListFreeze(String partyId, int status, int pageNum, int pageSize);
public List<MoneyFreeze> listByIds(List<String> ids);
public MoneyFreeze getLastFreezeRecord(String sellerId);
}

View File

@@ -0,0 +1,143 @@
package project.log;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import kernel.bo.EntityObject;
import project.mall.orders.model.MallOrderRebate;
public class MoneyLog extends EntityObject {
private static final long serialVersionUID = -5914896022101327097L;
// 提现时,无论什么币种,都以 USDT 标记
private String wallettype;
private String category;
private Date createTime;
private Serializable partyId;
private String createTimeStr;
private double amount = 0.0D;
// 存的是 USDT 的金额
private double amount_before = 0.0D;
// 存的是 USDT 的金额
private double amount_after = 0.0D;
private int freeze = 0 ;
private String log;
private List<MallOrderRebate> detail;
/**
* 资金日志提供的内容 :提币 充币 永续建仓 永续平仓 手续费
*/
private String content_type;
public int getFreeze() {
return freeze;
}
public void setFreeze(int freeze) {
this.freeze = freeze;
}
/**
* 充值提现备注
*/
private String remarks;
public List<MallOrderRebate> getDetail() {
return detail;
}
public void setDetail(List<MallOrderRebate> detail) {
this.detail = detail;
}
public String getWallettype() {
return this.wallettype;
}
public void setWallettype(String wallettype) {
this.wallettype = wallettype;
}
public Date getCreateTime() {
return this.createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Serializable getPartyId() {
return this.partyId;
}
public void setPartyId(Serializable partyId) {
this.partyId = partyId;
}
public double getAmount() {
return this.amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public double getAmount_before() {
return this.amount_before;
}
public void setAmount_before(double amount_before) {
this.amount_before = amount_before;
}
public double getAmount_after() {
return this.amount_after;
}
public void setAmount_after(double amount_after) {
this.amount_after = amount_after;
}
public String getLog() {
return this.log;
}
public void setLog(String log) {
this.log = log;
}
public String getCategory() {
return this.category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCreateTimeStr() {
return createTimeStr;
}
public void setCreateTimeStr(String createTimeStr) {
this.createTimeStr = createTimeStr;
}
public String getContent_type() {
return content_type;
}
public void setContent_type(String content_type) {
this.content_type = content_type;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}

View File

@@ -0,0 +1,20 @@
package project.log;
import java.util.Date;
import java.util.List;
import kernel.web.Page;
import project.mall.orders.model.MallOrderRebate;
public interface MoneyLogService {
public void save(MoneyLog paramMoneyLog);
public Page pagedQuery(int pageNo, int pageSize, String category, String content_type, String partyId, Date startTime, Date endTime);
public List<MoneyLog> findLogsByConentTypeAndDate(String type, String date);
public List<MoneyLog> findByLog(String type, String log);
List<MallOrderRebate> getOrderRebate(String orderId);
}

View File

@@ -0,0 +1,77 @@
package project.log;
import java.util.Date;
import kernel.bo.EntityObject;
/**
* 系统日志
*/
public class SysLog extends EntityObject implements AbstractLog {
private static final long serialVersionUID = -2169262629412176665L;
public static String level_error = "error";
public static String level_warn = "warn";
public static String level_info = "info";
// 日志分型
private String category;
private String log;
/**
* 特定渠道发起交易时需要的额外参数,以及部分渠道支付成功返回的额外参数。 存储json格式
*/
private String extra;
/**
* 日志级别 错误 error 信息 info 警告 warn
*/
private String level;
// 创建时间
private Date createTime;
public String getLog() {
return log;
}
public void setLog(String log) {
this.log = log;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
}

View File

@@ -0,0 +1,22 @@
package project.log;
/**
* 系统日志
*/
public interface SysLogService {
/**
* 同步保存
*/
public void saveSync(SysLog entity);
/**
* 异步保存
*/
public void saveAsyn(SysLog entity);
}

View File

@@ -0,0 +1,39 @@
package project.log.internal;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;
import project.log.AbstractLog;
public class AbstractLogQueue {
private static final Log logger = LogFactory.getLog(AbstractLogQueue.class);
private static ConcurrentLinkedQueue<AbstractLog> WORKING_EVENTS = new ConcurrentLinkedQueue<AbstractLog>();
public static void add(AbstractLog item) {
Assert.notNull(item, "The item must not be null.");
try {
WORKING_EVENTS.add(item);
} catch (Throwable e) {
logger.error("add(AbstractLog item) fail : ", e);
}
}
public static int size() {
return WORKING_EVENTS.size();
}
public static AbstractLog poll() {
AbstractLog item = null;
try {
item = WORKING_EVENTS.poll();
} catch (Throwable e) {
logger.error("AbstractLog poll() fail : ", e);
}
return item;
}
}

View File

@@ -0,0 +1,264 @@
package project.log.internal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import kernel.util.DateUtils;
import kernel.util.StringUtils;
import kernel.web.Page;
import kernel.web.PagedQueryDao;
import project.log.AdminLogService;
import project.party.recom.UserRecomService;
public class AdminLogServiceImpl implements AdminLogService {
private PagedQueryDao pagedQueryDao;
private UserRecomService userRecomService;
@Override
public Page pagedQueryMoneyLog(int pageNo, int pageSize, String log_para,String name_para,String loginPartyId,String rolename_para,String startTime,String endTime, String freezes) {
StringBuffer queryString = new StringBuffer();
queryString.append("SELECT");
queryString.append(" party.USERNAME username,party.ROLENAME rolename,party.USERCODE usercode,party_parent.USERNAME username_parent, money.FREEZE,money.REMARKS, ");
queryString.append(
" money.UUID money_id,money.LOG log,money.WALLETTYPE wallettype,money.AMOUNT_BEFORE amount_before,money.AMOUNT amount,money.AMOUNT_AFTER amount_after,money.CREATE_TIME createTime,money.WALLETTYPE wallettype ");
queryString.append(" FROM");
queryString.append(" T_MONEY_LOG money "
+ "LEFT JOIN PAT_PARTY party ON money.PARTY_ID = party.UUID "
+ " LEFT JOIN PAT_USER_RECOM user ON user.PARTY_ID = party.UUID "
+ " LEFT JOIN PAT_PARTY party_parent ON user.RECO_ID = party_parent.UUID "
+ " ");
queryString.append(" WHERE 1=1");
Map<String, Object> parameters = new HashMap<String, Object>();
if (!StringUtils.isNullOrEmpty(log_para)) {
queryString.append(" and money.LOG like :log ");
parameters.put("log", "%" + log_para + "%");
}
if (!StringUtils.isNullOrEmpty(name_para)) {
queryString.append(" and (party.USERNAME =:name OR party.USERCODE=:name ) ");
parameters.put("name", name_para);
}
if (!StringUtils.isNullOrEmpty(rolename_para)) {
queryString.append(" and party.ROLENAME =:rolename");
parameters.put("rolename", rolename_para);
}
if (!StringUtils.isNullOrEmpty(startTime)) {
queryString.append(" AND DATE(money.CREATE_TIME) >= DATE(:startTime) ");
parameters.put("startTime",DateUtils.toDate(startTime));
}
if (!StringUtils.isNullOrEmpty(endTime)) {
queryString.append(" AND DATE(money.CREATE_TIME) <= DATE(:endTime) ");
parameters.put("endTime", DateUtils.toDate(endTime));
}
if (!StringUtils.isNullOrEmpty(loginPartyId)) {
List<String> checked_list = this.userRecomService.findChildren(loginPartyId);
checked_list.add(loginPartyId);
if (checked_list.size() == 0) {
return new Page();
}
queryString.append(" and party.UUID in(:checked_list)");
parameters.put("checked_list", checked_list);
}
if (!StringUtils.isNullOrEmpty(freezes)) {
queryString.append(" and money.FREEZE =:freezes");
parameters.put("freezes", freezes);
}
queryString.append(" order by money.CREATE_TIME desc,money.UUID desc ");
Page page = pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
public Page pagedQueryLog(int pageNo, int pageSize, String log_para, String name_para, String category,
String operator, Date createTime_begin, Date createTime_end, String loginPartyId,String loginUsername) {
StringBuffer queryString = new StringBuffer();
queryString.append("SELECT");
queryString.append(" party.NAME name,party.ROLENAME rolename,party.USERCODE usercode,");
queryString.append(
" log.UUID log_id,log.LOG log,log.USERNAME username,log.OPERATOR operator,log.CATEGORY category,log.CREATE_TIME createTime");
queryString.append(" FROM");
queryString.append(" T_LOG log LEFT JOIN PAT_PARTY party ON log.USERNAME = party.USERNAME ");
queryString.append(" WHERE 1=1");
Map<String, Object> parameters = new HashMap<String, Object>();
if (!StringUtils.isNullOrEmpty(log_para)) {
queryString.append(" and log.LOG like :log ");
parameters.put("log", "%" + log_para + "%");
}
if (!StringUtils.isNullOrEmpty(name_para)) {
queryString.append(" and (party.USERNAME =:name OR party.USERCODE=:name OR log.USERNAME= :name)");
parameters.put("name", name_para);
}
if (!StringUtils.isNullOrEmpty(category)) {
queryString.append(" and log.CATEGORY = :category ");
parameters.put("category", category);
}
if (!StringUtils.isNullOrEmpty(operator)) {
queryString.append(" and log.OPERATOR = :operator ");
parameters.put("operator", operator);
}
if (!"root".equals(loginUsername)) {
queryString.append(" and log.USERNAME != 'root'");
queryString.append(" and (log.OPERATOR != 'root' OR log.OPERATOR IS NULL) ");
}
if (createTime_begin != null) {
queryString.append(" and log.CREATE_TIME >= :createTime_begin ");
parameters.put("createTime_begin", createTime_begin);
}
if (createTime_begin != null) {
queryString.append(" and log.CREATE_TIME < :createTime_end");
parameters.put("createTime_end", createTime_end);
}
if (!StringUtils.isNullOrEmpty(loginPartyId)) {
queryString.append(" and log.PARTY_ID = :loginPartyId ");
parameters.put("loginPartyId", loginPartyId);
}
queryString.append(" order by log.CREATE_TIME desc ");
Page page = pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
public Page pagedQueryCodeLog(int pageNo, int pageSize, String log_para,String name_para,String target,Date createTime_begin,
Date createTime_end, String loginPartyId,String loginUsername,String id_para) {
StringBuffer queryString = new StringBuffer();
queryString.append("SELECT");
queryString.append(" party.NAME name,");
queryString.append(
" log.UUID log_id,log.LOG log,log.USERNAME username,log.TARGET target,"
+ "log.CREATE_TIME createTime");
queryString.append(" FROM");
queryString.append(" T_CODE_LOG log LEFT JOIN PAT_PARTY party ON log.PARTY_ID = party.UUID ");
queryString.append(" WHERE 1=1");
Map<String, Object> parameters = new HashMap<String, Object>();
if (!StringUtils.isNullOrEmpty(id_para)) {
queryString.append(" and log.UUID = :id_para ");
parameters.put("id_para", id_para);
}
if (!StringUtils.isNullOrEmpty(log_para)) {
queryString.append(" and log.LOG like :log ");
parameters.put("log", "%" + log_para + "%");
}
if (!StringUtils.isNullOrEmpty(name_para)) {
queryString.append(" and (party.NAME = :name or log.USERNAME= :name)");
parameters.put("name", name_para);
}
if (!StringUtils.isNullOrEmpty(target)) {
queryString.append(" and log.TARGET like :target ");
parameters.put("target", "%" + target + "%");
}
// if (!"root".equals(loginUsername)) {
// queryString.append(" and log.USERNAME != 'root'");
// }
if (createTime_begin != null) {
queryString.append(" and log.CREATE_TIME >= :createTime_begin ");
parameters.put("createTime_begin", createTime_begin);
}
if (createTime_begin != null) {
queryString.append(" and log.CREATE_TIME < :createTime_end");
parameters.put("createTime_end", createTime_end);
}
if (!StringUtils.isNullOrEmpty(loginPartyId)) {
queryString.append(" and log.PARTY_ID = :loginPartyId ");
parameters.put("loginPartyId", loginPartyId);
}
queryString.append(" order by log.CREATE_TIME desc ");
Page page = pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
@Override
public Page pagedQuerySysLog(int pageNo, int pageSize, String log_para, String level_para, String category_para,
Date createTime_begin, Date createTime_end) {
StringBuffer queryString = new StringBuffer();
queryString.append("SELECT");
queryString.append(
" log.UUID log_id,log.LOG log,log.LEVEL level,log.CATEGORY category,log.EXTRA extra,log.CREATE_TIME createTime");
queryString.append(" FROM");
queryString.append(" T_SYSLOG log ");
queryString.append(" WHERE 1=1");
Map<String, Object> parameters = new HashMap<String, Object>();
if (!StringUtils.isNullOrEmpty(log_para)) {
queryString.append(" and log.LOG like :log ");
parameters.put("log", "%" + log_para + "%");
}
if (!StringUtils.isNullOrEmpty(level_para)) {
queryString.append(" and log.LEVEL = :level ");
parameters.put("level", level_para);
}
if (!StringUtils.isNullOrEmpty(category_para)) {
queryString.append(" and log.CATEGORY = :category ");
parameters.put("category", category_para);
}
if (createTime_begin != null) {
queryString.append(" and log.CREATE_TIME >= :createTime_begin ");
parameters.put("createTime_begin", createTime_begin);
}
if (createTime_begin != null) {
queryString.append(" and log.CREATE_TIME < :createTime_end");
parameters.put("createTime_end", createTime_end);
}
queryString.append(" order by log.CREATE_TIME desc ");
Page page = pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
public void setPagedQueryDao(PagedQueryDao pagedQueryDao) {
this.pagedQueryDao = pagedQueryDao;
}
public void setUserRecomService(UserRecomService userRecomService) {
this.userRecomService = userRecomService;
}
}

View File

@@ -0,0 +1,28 @@
package project.log.internal;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import project.log.ApiLog;
import project.log.ApiLogService;
public class ApiLogServiceImpl extends HibernateDaoSupport implements ApiLogService {
public void save(ApiLog entity) {
this.getHibernateTemplate().save(entity);
}
public void update(ApiLog entity) {
getHibernateTemplate().update(entity);
}
public void delete(String id) {
ApiLog entity = findById(id);
getHibernateTemplate().delete(entity);
}
public ApiLog findById(String id) {
return (ApiLog) getHibernateTemplate().get(ApiLog.class, id);
}
}

View File

@@ -0,0 +1,35 @@
package project.log.internal;
import java.io.Serializable;
import java.util.Date;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import kernel.web.PagedQueryDao;
import project.log.CodeLog;
import project.log.CodeLogService;
public class CodeLogServiceImpl extends HibernateDaoSupport implements CodeLogService {
private PagedQueryDao pagedQueryDao;
@Override
public void saveSync(CodeLog entity) {
entity.setCreateTime(new Date());
this.getHibernateTemplate().save(entity);
}
@Override
public void saveAsyn(CodeLog entity) {
entity.setCreateTime(new Date());
AbstractLogQueue.add(entity);
}
public void setPagedQueryDao(PagedQueryDao pagedQueryDao) {
this.pagedQueryDao = pagedQueryDao;
}
}

View File

@@ -0,0 +1,77 @@
package project.log.internal;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import kernel.web.Page;
import kernel.web.PagedQueryDao;
import project.log.Log;
import project.log.LogService;
public class LogServiceImpl extends HibernateDaoSupport implements LogService {
private PagedQueryDao pagedQueryDao;
@Override
public void saveSync(Log entity) {
entity.setCreateTime(new Date());
this.getHibernateTemplate().save(entity);
}
@Override
public void saveAsyn(Log entity) {
entity.setCreateTime(new Date());
AbstractLogQueue.add(entity);
}
public Page pagedQuery(int pageNo, int pageSize, Serializable partyId, String[] category, String[] extra,
Date createTime_begin, Date createTime_end) {
StringBuffer queryString = new StringBuffer(" FROM Log where 1 = 1 ");
Map parameters = new HashMap();
if (category != null) {
queryString.append(" and category in (:category)");
parameters.put("category", category);
}
if (extra != null) {
queryString.append(" and extra in (:extra)");
parameters.put("extra", extra);
}
if (createTime_begin != null) {
queryString.append(" and createTime >= :createTime_begin");
parameters.put("createTime_begin", createTime_begin);
}
if (createTime_end != null) {
queryString.append(" and createTime < :createTime_end");
parameters.put("createTime_end", createTime_end);
}
if (partyId != null) {
queryString.append(" and partyId = :partyId");
parameters.put("partyId", partyId);
}
queryString.append(" order by createTime desc ");
Page page = this.pagedQueryDao.pagedQueryHql(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
public void setPagedQueryDao(PagedQueryDao pagedQueryDao) {
this.pagedQueryDao = pagedQueryDao;
}
}

View File

@@ -0,0 +1,390 @@
package project.log.internal;
import kernel.util.Arith;
import kernel.web.Page;
import kernel.web.PagedQueryDao;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Property;
import org.hibernate.query.NativeQuery;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;
import project.Constants;
import project.log.*;
import project.mall.seller.SellerService;
import project.redis.RedisHandler;
import project.redis.interal.KeyValue;
import project.syspara.SysparaService;
import project.wallet.Wallet;
import project.wallet.WalletService;
import java.util.*;
public class MoneyFreezeServiceImpl extends HibernateDaoSupport implements MoneyFreezeService {
protected PagedQueryDao pagedDao;
protected WalletService walletService;
protected MoneyLogService moneyLogService;
protected SellerService sellerService;
private RedisHandler redisHandler;
@Override
public void save(MoneyFreeze entity) {
if (entity.getCreateTime() == null) {
entity.setCreateTime(new Date());
}
getHibernateTemplate().save(entity);
}
@Override
public MoneyFreeze getById(String id) {
if (id == null || id.trim().isEmpty()) {
throw new RuntimeException("未指定记录");
}
return getHibernateTemplate().get(MoneyFreeze.class, id);
}
/**
* 冻结资金的完整逻辑
*
* @param sellerId
* @param freezeAmout : 传进的值都是正值
* @param freezeDays
* @param freezeReason
* @param operator
*/
@Override
@Transactional
public MoneyFreeze updateFreezeSeller(String sellerId, double freezeAmout, int freezeDays, String freezeReason, String operator) {
Wallet wallet = this.walletService.saveWalletByPartyId(sellerId);
double amount_before = wallet.getMoney();
double moneyAfterFrozenBefore = wallet.getMoneyAfterFrozen();
if (freezeAmout == 0.0D) {
// 提交 0 意味着全部冻结
freezeAmout = amount_before;
}
if (amount_before < freezeAmout) {
throw new RuntimeException("冻结资金额度超过商家拥有资金数量");
}
if (freezeAmout < 0) {
throw new RuntimeException("错误的冻结资金数量");
}
// 更新商家资金冻结字段 状态改变后 moneyAfterFrozen为用户钱包金额
wallet.setFrozenState(1);
wallet.setMoneyAfterFrozen(Arith.sub(amount_before,freezeAmout));
wallet.setMoney(freezeAmout);
walletService.update(wallet);
this.sellerService.updateFreezeState(sellerId, 1);
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_CONTRACT);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(-freezeAmout);
moneylog.setAmount_after(Arith.sub(amount_before,freezeAmout));
moneylog.setLog("冻结商家资金");
moneylog.setPartyId(sellerId);
moneylog.setWallettype(Constants.WALLET);
moneylog.setContent_type(Constants.MONEYLOG_FREEZE_SELLER);
moneyLogService.save(moneylog);
Date now = new Date();
Date endTime = new Date(now.getTime() + 24L * freezeDays * 3600L * 1000L);
MoneyFreeze freeze = new MoneyFreeze();
freeze.setPartyId(sellerId);
freeze.setReason(freezeReason);
freeze.setStatus(1);
freeze.setAmount(freezeAmout);
freeze.setBeginTime(now);
freeze.setEndTime(endTime);
freeze.setCreateTime(now);
freeze.setMoneyLog(moneylog.getId().toString());
freeze.setOperator(operator);
this.save(freeze);
MoneyLog moneylog1 = new MoneyLog();
moneylog1.setCategory(Constants.MONEYLOG_CATEGORY_CONTRACT);
moneylog1.setFreeze(1);
moneylog1.setAmount_before(moneyAfterFrozenBefore);
moneylog1.setAmount(Arith.sub(amount_before,freezeAmout));
moneylog1.setAmount_after(wallet.getMoneyAfterFrozen());
moneylog1.setLog("冻结商家资金");
moneylog1.setPartyId(sellerId);
moneylog1.setWallettype(Constants.WALLET);
moneylog1.setContent_type(Constants.MONEYLOG_FREEZE_SELLER);
moneyLogService.save(moneylog1);
//
// // 优化定时任务的处理速度,方便轮询定时解冻的记录
// redisHandler.zadd(MallLogRedisKeys.SELLER_MONEY_FREEZE, endTime.getTime(), freeze.getId().toString());
return freeze;
}
/**
* 解冻资金的完整逻辑
*
* @param id
* @param operator
*/
@Override
@Transactional
public int updateAutoUnFreezeSeller(String id, String operator) {
MoneyFreeze freezeEntity = getById(id);
if (freezeEntity == null) {
throw new RuntimeException("不存在的冻结记录");
}
if (freezeEntity.getStatus() == 0) {
return 0;
}
int check = updateSetUnFreezeState(id, operator);
if (check == 0) {
// 防止并发情况下重复回退资金
return 0;
}
Wallet wallet = this.walletService.saveWalletByPartyId(freezeEntity.getPartyId());
double amount_before = wallet.getMoney();
double freezeAmout = freezeEntity.getAmount();
// 更新商家资金余额,余额给加回去
wallet.setMoney(Arith.roundDown(Arith.add(wallet.getMoney(),freezeAmout),2));
wallet.setFrozenState(0);
walletService.update(wallet);
this.sellerService.updateFreezeState(freezeEntity.getPartyId().toString(), 0);
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_CONTRACT);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(freezeAmout);
moneylog.setAmount_after(Arith.add(amount_before, freezeAmout));
moneylog.setLog("定时解冻商家资金");
moneylog.setPartyId(freezeEntity.getPartyId().toString());
moneylog.setWallettype(Constants.WALLET);
moneylog.setContent_type(Constants.MONEYLOG_UNFREEZE_SELLER);
moneyLogService.save(moneylog);
// 优化定时任务的处理速度
redisHandler.zrem(MallLogRedisKeys.SELLER_MONEY_FREEZE, id);
return 1;
}
/**
* 解冻资金的完整逻辑
*
* @param id
* @param operator
*/
@Override
@Transactional
public int updateUnFreezeSeller(String id, String operator) {
MoneyFreeze freezeEntity = getById(id);
Wallet wallet = this.walletService.saveWalletByPartyId(freezeEntity.getPartyId());
if (freezeEntity == null) {
throw new RuntimeException("不存在的冻结记录");
}
if (wallet.getFrozenState() != 1){
throw new RuntimeException("用户不处于冻结状态");
}
if (freezeEntity.getStatus() == 0) {
return 0;
}
int check = updateSetUnFreezeState(id, operator);
if (check == 0) {
// 防止并发情况下重复回退资金
return 0;
}
//用户被冻结后钱包余额
double amount_before = wallet.getMoneyAfterFrozen();
//被冻结金额
double money = wallet.getMoney();
//更新商家资金余额,余额给加回去 钱包冻结状态解除, moneyAfterFrozen值清零
wallet.setFrozenState(0);
wallet.setMoney(Arith.roundDown(Arith.add(wallet.getMoney(),wallet.getMoneyAfterFrozen()),2));
wallet.setMoneyAfterFrozen(0);
this.walletService.update(wallet);
this.sellerService.updateFreezeState(freezeEntity.getPartyId().toString(), 0);
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_CONTRACT);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(money);
moneylog.setAmount_after(Arith.add(amount_before, money));
moneylog.setLog("解冻商家资金");
moneylog.setPartyId(freezeEntity.getPartyId().toString());
moneylog.setWallettype(Constants.WALLET);
moneylog.setContent_type(Constants.MONEYLOG_UNFREEZE_SELLER);
moneyLogService.save(moneylog);
MoneyLog moneylog1 = new MoneyLog();
moneylog1.setCategory(Constants.MONEYLOG_CATEGORY_CONTRACT);
moneylog1.setAmount_before(amount_before);
moneylog1.setFreeze(1);
moneylog1.setAmount(-amount_before);
moneylog1.setAmount_after(Arith.sub(amount_before, amount_before));
moneylog1.setLog("解冻商家资金");
moneylog1.setPartyId(freezeEntity.getPartyId().toString());
moneylog1.setWallettype(Constants.WALLET);
moneylog1.setContent_type(Constants.MONEYLOG_UNFREEZE_SELLER);
moneyLogService.save(moneylog1);
// 优化定时任务的处理速度
redisHandler.zrem(MallLogRedisKeys.SELLER_MONEY_FREEZE, id);
return 1;
}
@Override
public int updateSetUnFreezeState(String id, String operator) {
if (id == null || id.trim().isEmpty()) {
return 0;
}
if (operator == null || operator.trim().isEmpty()) {
operator = "0";
}
Session currentSession = getHibernateTemplate().getSessionFactory().getCurrentSession();
String sql = " update T_MONEY_FREEZE set STATUS= :status, OPERATOR= :operator, END_TIME=now() where UUID= :id and STATUS=1 ";
NativeQuery query = currentSession.createSQLQuery(sql);
query.setParameter("status", 0);
query.setParameter("operator", operator);
query.setParameter("id", id);
return query.executeUpdate();
}
@Override
public Page pagedListFreeze(String partyId, int status, int pageNum, int pageSize) {
StringBuffer queryString = new StringBuffer("");
queryString.append(" FROM MoneyFreeze WHERE 1=1 ");
Map parameters = new HashMap();
if (StringUtils.isNotEmpty(partyId)) {
queryString.append(" AND partyId =:partyId ");
parameters.put("partyId", partyId);
}
if(status >= 0) {
queryString.append(" AND status = :status ");
parameters.put("status", status);
}
queryString.append(" order by createTime desc ");
Page page = this.pagedDao.pagedQueryHql(pageNum, pageSize, queryString.toString(), parameters);
return page;
}
public List<String> listPendingFreezeRecords() {
double min = 0;
double max = System.currentTimeMillis();
Set<KeyValue<String, Double>> pendingItems = redisHandler.zRange(MallLogRedisKeys.SELLER_MONEY_FREEZE, min, max);
List<String> idList = new ArrayList();
if (pendingItems == null || pendingItems.isEmpty()) {
return idList;
}
for (KeyValue<String, Double> oneItem : pendingItems) {
idList.add(oneItem.getKey());
}
return idList;
}
public List<MoneyFreeze> listPendingFreezeRecords(int size) {
StringBuffer queryString = new StringBuffer("");
queryString.append(" FROM MoneyFreeze WHERE endTime <= now() and status=1 ");
Map parameters = new HashMap();
Page page = this.pagedDao.pagedQueryHql(1, size, queryString.toString(), parameters);
return (List<MoneyFreeze>) page.getElements();
}
@Override
public List<MoneyFreeze> listByIds(List<String> ids) {
List<MoneyFreeze> list = new ArrayList();
if (ids == null || ids.isEmpty()) {
return list;
}
DetachedCriteria query = DetachedCriteria.forClass(MoneyFreeze.class);
query.add(Property.forName("id").in(ids));
List retList = getHibernateTemplate().findByCriteria(query);
if (retList == null || retList.isEmpty()) {
return list;
}
list.addAll(retList);
return list;
}
@Override
public MoneyFreeze getLastFreezeRecord(String sellerId) {
if (sellerId == null || sellerId.isEmpty()) {
return null;
}
DetachedCriteria query = DetachedCriteria.forClass(MoneyFreeze.class);
query.add(Property.forName("partyId").eq(sellerId));
query.add(Property.forName("status").eq(1));
query.addOrder(Order.desc("createTime"));
List retList = getHibernateTemplate().findByCriteria(query);
if (retList == null || retList.isEmpty()) {
return null;
}
return (MoneyFreeze)retList.get(0);
}
public void setPagedDao(PagedQueryDao pagedDao) {
this.pagedDao = pagedDao;
}
public PagedQueryDao getPagedDao() {
return pagedDao;
}
public void setWalletService(WalletService walletService) {
this.walletService = walletService;
}
public void setMoneyLogService(MoneyLogService moneyLogService) {
this.moneyLogService = moneyLogService;
}
public void setRedisHandler(RedisHandler redisHandler) {
this.redisHandler = redisHandler;
}
public void setSellerService(SellerService sellerService) {
this.sellerService = sellerService;
}
}

View File

@@ -0,0 +1,106 @@
package project.log.internal;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Property;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import kernel.web.Page;
import kernel.web.PagedQueryDao;
import project.log.MoneyLog;
import project.log.MoneyLogService;
import project.mall.orders.model.MallOrderRebate;
import project.mall.orders.model.MallOrdersPrize;
public class MoneyLogServiceImpl extends HibernateDaoSupport implements MoneyLogService {
protected PagedQueryDao pagedDao;
public void save(MoneyLog moneyLog) {
if (moneyLog.getCreateTime() == null) {
moneyLog.setCreateTime(new Date());
}
getHibernateTemplate().save(moneyLog);
}
public Page pagedQuery(int pageNo, int pageSize, String category, String content_type, String partyId, Date startTime, Date endTime) {
StringBuffer queryString = new StringBuffer("");
queryString.append(" FROM MoneyLog WHERE 1=1 AND content_type NOT IN ('changesub')");
Map parameters = new HashMap();
if (StringUtils.isNotEmpty(category)) {
queryString.append(" AND category =:category");
parameters.put("category", category);
}
if(StringUtils.isNotEmpty(content_type)){
queryString.append(" AND content_type =:content_type");
parameters.put("content_type", content_type);
}
if (StringUtils.isNotEmpty(partyId)) {
queryString.append(" AND partyId =:partyId");
parameters.put("partyId", partyId);
}
if (null != startTime){
queryString.append(" AND createTime >=:startTime");
parameters.put("startTime", startTime);
}
if (null != endTime){
queryString.append(" AND createTime <=:endTime");
parameters.put("endTime", endTime);
}
queryString.append(" order by createTime desc ");
Page page = this.pagedDao.pagedQueryHql(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
public List<MoneyLog> findLogsByConentTypeAndDate(String type, String date) {
StringBuffer queryString = new StringBuffer("");
List<Object> paras = new LinkedList<Object>();
queryString.append(" FROM MoneyLog WHERE 1=1 ");
if (StringUtils.isNotEmpty(type)) {
queryString.append(" AND content_type =?0");
paras.add(type);
}
if (StringUtils.isNotEmpty(date)) {
queryString.append(" AND DATE(createTime) =DATE(?1)");
paras.add(date);
}
List<MoneyLog> find=(List<MoneyLog>) this.getHibernateTemplate().find(queryString.toString(),paras);
return find;
}
@Override
public List<MoneyLog> findByLog(String type, String log) {
DetachedCriteria query = DetachedCriteria.forClass(MoneyLog.class);
query.add( Property.forName("content_type").eq(type) );
query.add( Property.forName("log").eq(log) );
query.addOrder(Order.desc("createTime"));
return (List<MoneyLog>) getHibernateTemplate().findByCriteria(query,0,1);
}
@Override
public List<MallOrderRebate> getOrderRebate(String orderId) {
DetachedCriteria criteria = DetachedCriteria.forClass(MallOrderRebate.class);
criteria.add(Property.forName("orderId").eq(orderId));
criteria.addOrder(Order.desc("level"));
return (List<MallOrderRebate>)this.getHibernateTemplate().findByCriteria(criteria);
}
public void setPagedDao(PagedQueryDao pagedDao) {
this.pagedDao = pagedDao;
}
public PagedQueryDao getPagedDao() {
return pagedDao;
}
}

View File

@@ -0,0 +1,62 @@
package project.log.internal;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import kernel.util.ThreadUtils;
import project.log.AbstractLog;
import project.log.LogService;
import project.log.SysLog;
import project.log.SysLogService;
public class SaveLogServer implements Runnable {
private static Log logger = LogFactory.getLog(SaveLogServer.class);
private LogService logService;
private SysLogService sysLogService;
public void run() {
while (true)
try {
int size = AbstractLogQueue.size();
/**
* 现量轮询一圈
*/
for (int i = 0; i < size; i++) {
AbstractLog log = AbstractLogQueue.poll();
if (log != null) {
if (log instanceof project.log.Log) {
logService.saveSync((project.log.Log) log);
} else if (log instanceof SysLog) {
sysLogService.saveSync((SysLog) log);
}
/**
* 1秒最多100个日志
*/
ThreadUtils.sleep(10);
}
}
} catch (Throwable e) {
logger.error("SmsServer taskExecutor.execute() fail", e);
} finally {
ThreadUtils.sleep(1000);
}
}
public void start() {
new Thread(this, "SaveLogServer").start();
if (logger.isInfoEnabled()) {
logger.info("启动SaveLogServer");
}
}
public void setLogService(LogService logService) {
this.logService = logService;
}
public void setSysLogService(SysLogService sysLogService) {
this.sysLogService = sysLogService;
}
}

View File

@@ -0,0 +1,30 @@
package project.log.internal;
import java.util.Date;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import project.log.SysLog;
import project.log.SysLogService;
public class SysLogServiceImpl extends HibernateDaoSupport implements SysLogService {
@Override
public void saveSync(SysLog entity) {
entity.setCreateTime(new Date());
this.getHibernateTemplate().save(entity);
}
@Override
public void saveAsyn(SysLog entity) {
entity.setCreateTime(new Date());
AbstractLogQueue.add(entity);
}
}

View File

@@ -0,0 +1,30 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.log.ApiLog" table="T_API_LOG">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String">
<column name="PARTY_ID" />
</property>
<property name="ip" type="java.lang.String">
<column name="IP" />
</property>
<property name="api" type="java.lang.String">
<column name="API" />
</property>
<property name="log" type="java.lang.String">
<column name="LOG" />
</property>
<property name="extra" type="java.lang.String">
<column name="EXTRA" />
</property>
<property name="createTime" type="timestamp">
<column name="CREATE_TIME" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.log.CodeLog" table="T_CODE_LOG">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String">
<column name="PARTY_ID" />
</property>
<property name="username" type="java.lang.String">
<column name="USERNAME" />
</property>
<property name="target" type="java.lang.String">
<column name="TARGET" />
</property>
<property name="log" type="java.lang.String">
<column name="LOG" />
</property>
<property name="createTime" type="timestamp">
<column name="CREATE_TIME" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.log.Log" table="T_LOG">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String">
<column name="PARTY_ID" />
</property>
<property name="username" type="java.lang.String">
<column name="USERNAME" />
</property>
<property name="operator" type="java.lang.String">
<column name="OPERATOR" />
</property>
<property name="category" type="java.lang.String">
<column name="CATEGORY" />
</property>
<property name="log" type="java.lang.String">
<column name="LOG" />
</property>
<property name="extra" type="java.lang.String">
<column name="EXTRA" />
</property>
<property name="createTime" type="timestamp">
<column name="CREATE_TIME" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,39 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.log.MoneyFreeze" table="T_MONEY_FREEZE">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String">
<column name="PARTY_ID" />
</property>
<property name="operator" type="java.lang.String">
<column name="OPERATOR" />
</property>
<property name="amount" type="double">
<column name="AMOUNT" />
</property>
<property name="moneyLog" type="java.lang.String">
<column name="MONEY_LOG" />
</property>
<property name="beginTime" type="timestamp">
<column name="BEGIN_TIME" />
</property>
<property name="endTime" type="timestamp">
<column name="END_TIME" />
</property>
<property name="createTime" type="timestamp">
<column name="CREATE_TIME" />
</property>
<property name="status" type="int">
<column name="STATUS" />
</property>
<property name="reason" type="java.lang.String">
<column name="REASON" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.log.MoneyLog" table="T_MONEY_LOG">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String">
<column name="PARTY_ID" />
</property>
<property name="log" type="java.lang.String">
<column name="LOG" />
</property>
<property name="wallettype" type="java.lang.String">
<column name="WALLETTYPE" />
</property>
<property name="category" type="java.lang.String">
<column name="CATEGORY" />
</property>
<property name="amount_before" type="java.lang.Double">
<column name="AMOUNT_BEFORE" />
</property>
<property name="amount" type="java.lang.Double">
<column name="AMOUNT" />
</property>
<property name="amount_after" type="java.lang.Double">
<column name="AMOUNT_AFTER" />
</property>
<property name="createTime" type="timestamp">
<column name="CREATE_TIME" />
</property>
<property name="content_type" type="java.lang.String">
<column name="CONTENT_TYPE" />
</property>
<property name="freeze" type="int">
<column name="FREEZE" />
</property>
<property name="remarks" type="java.lang.String">
<column name="REMARKS" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.log.SysLog" table="T_SYSLOG">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="category" type="java.lang.String">
<column name="CATEGORY" />
</property>
<property name="level" type="java.lang.String">
<column name="LEVEL" />
</property>
<property name="log" type="java.lang.String">
<column name="LOG" />
</property>
<property name="extra" type="java.lang.String">
<column name="EXTRA" />
</property>
<property name="createTime" type="timestamp">
<column name="CREATE_TIME" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,123 @@
package project.web.admin;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.providers.encoding.PasswordEncoder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import kernel.exception.BusinessException;
import kernel.util.StringUtils;
import kernel.web.PageActionSupport;
import project.Constants;
import project.log.AdminLogService;
import project.log.Log;
import project.log.LogService;
import security.SecUser;
import security.internal.SecUserService;
@RestController
public class AdminCodeLogController extends PageActionSupport {
@Autowired
private AdminLogService adminLogService;
@Autowired
private LogService logService;
@Autowired
private SecUserService secUserService;
@Autowired
private PasswordEncoder passwordEncoder;
private final String action = "normal/adminCodeLogAction!";
@RequestMapping(action + "list.action")
public ModelAndView list(HttpServletRequest request) {
this.checkAndSetPageNo(request.getParameter("pageNo"));
this.pageSize = 30;
String loginPartyId = getLoginPartyId();
String date_para = request.getParameter("date_para");
String log_para = request.getParameter("log_para");
String name_para = request.getParameter("name_para");
String target = request.getParameter("target");
List<Date> date_range = toRangeDate(date_para);
this.page = this.adminLogService.pagedQueryCodeLog(this.pageNo, pageSize, log_para, name_para, target,
date_range.get(0), date_range.get(1), loginPartyId, this.getUsername_login(),null);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("pageNo", this.pageNo);
modelAndView.addObject("pageSize", this.pageSize);
modelAndView.addObject("page", this.page);
modelAndView.addObject("message", message);
modelAndView.addObject("error", error);
modelAndView.addObject("date_para", date_para);
modelAndView.addObject("log_para", log_para);
modelAndView.addObject("name_para", name_para);
modelAndView.addObject("target", target);
modelAndView.setViewName("code_log_list");
return modelAndView;
}
@RequestMapping(action + "get_code.action")
public ModelAndView get_code(HttpServletRequest request) {
String login_safeword = request.getParameter("login_safeword");
String log_id = request.getParameter("log_id");
String error = "";
ModelAndView modelAndView = new ModelAndView();
try {
if (StringUtils.isEmptyString(login_safeword)) {
throw new BusinessException("资金密码不能为空");
}
SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login());
checkLoginSafeword(sec, this.getUsername_login(), login_safeword);
this.page = this.adminLogService.pagedQueryCodeLog(pageNo, pageSize, null, null, null,
null, null, getLoginPartyId(), this.getUsername_login(), log_id);
List<Map> list = page.getElements();
Map map = list.get(0);
Log log = new Log();
log.setCategory(Constants.LOG_CATEGORY_OPERATION);
log.setUsername("");
log.setOperator(this.getUsername_login());
log.setLog("管理员查看手机号/邮箱号["+String.valueOf(map.get("target"))+"]的验证码管理员ip["+this.getIp(getRequest())+"]");
logService.saveSync(log);
modelAndView.addObject("page", this.page);
modelAndView.addObject("message", "操作成功");
modelAndView.setViewName("code_log_get");
return modelAndView;
} catch (BusinessException e) {
modelAndView.addObject("error", e.getMessage());
modelAndView.setViewName("code_log_list");
return modelAndView;
} catch (Throwable t) {
error = ("[ERROR] " + t.getMessage());
modelAndView.addObject("error", error);
modelAndView.setViewName("code_log_list");
return modelAndView;
}
}
/**
* 验证登录人资金密码
*/
private void checkLoginSafeword(SecUser secUser,String operatorUsername,String loginSafeword) {
String sysSafeword = secUser.getSafeword();
String safeword_md5 = passwordEncoder.encodePassword(loginSafeword, operatorUsername);
if (!safeword_md5.equals(sysSafeword)) {
throw new BusinessException("登录人资金密码错误");
}
}
}

View File

@@ -0,0 +1,94 @@
package project.web.api;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import kernel.exception.BusinessException;
import kernel.util.DateUtils;
import kernel.util.StringUtils;
import kernel.web.BaseAction;
import kernel.web.Page;
import kernel.web.ResultObject;
import project.Constants;
import project.log.MoneyLog;
import project.log.MoneyLogService;
@RestController
@CrossOrigin
public class MoneyLogController extends BaseAction {
private Logger logger = LogManager.getLogger(MoneyLogController.class);
private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
@Autowired
protected MoneyLogService moneyLogService;
@RequestMapping("api/moneylog!list.action")
public Object list(HttpServletRequest request) throws IOException {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
String partyId = this.getLoginPartyId();
try {
String page_no = request.getParameter("page_no");
if (StringUtils.isNullOrEmpty(page_no)
|| !StringUtils.isInteger(page_no) || Integer.valueOf(page_no) <= 0) {
page_no = "1";
}
int pageNo = Integer.valueOf(page_no);
String category = request.getParameter("category");
String content_type = request.getParameter("content_type");
String beginTime = request.getParameter("beginTime");
String endTimeStr = request.getParameter("endTime");
Date startTime = null;
Date endTime = null;
try {
startTime = format.parse(beginTime);
endTime = format.parse(endTimeStr);
}catch (Exception exception){
}
Page pagedQuery = moneyLogService.pagedQuery(pageNo, 20, category, content_type, partyId, startTime, endTime);
for (MoneyLog log : (List<MoneyLog>) pagedQuery.getElements()) {
String contentType = log.getContent_type();
if (StringUtils.isNotEmpty(contentType) && contentType.equals(Constants.MONEYLOG_CONTNET_ORDER_INCOME)){
String logType = log.getLog();
if (StringUtils.isNotEmpty(logType)){
logType = logType.replaceAll("订单:", "");
log.setDetail(moneyLogService.getOrderRebate(logType));
}
}
log.setCreateTimeStr(DateUtils.format(log.getCreateTime(), DateUtils.DF_yyyyMMddHHmmss));
}
resultObject.setData(pagedQuery.getElements());
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Throwable t) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", t);
}
return resultObject;
}
}

27
comm/Log/struts/normal.xml Executable file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="normal" namespace="/normal" extends="root">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult" />
</result-types>
<interceptors>
<interceptor name="json"
class="org.apache.struts2.json.JSONInterceptor" />
</interceptors>
<action name="NewsAction" class="project.news.action.NewsAction">
<result name="list">/news_list.jsp</result>
<result name="details">/news_details.jsp</result>
</action>
<action name="AdminNewsAction" class="project.news.action.AdminNewsAction">
<result name="view">/news_list.jsp</result>
<result name="add">/news_add.jsp</result>
<result name="update">/news_update.jsp</result>
</action>
</package>
</struts>