Merge branch 'develop_risk' into develop

# Conflicts:
#	src/db/modify.sql
master
wangning 7 years ago
commit 35f66bf11a

@ -401,3 +401,68 @@ ALTER TABLE `sys_clients` ADD COLUMN `merchant_tag` varchar(100) DEFAULT '';
ALTER TABLE `sys_clients` ADD COLUMN `merchant_video_url` varchar(200) DEFAULT ''; ALTER TABLE `sys_clients` ADD COLUMN `merchant_video_url` varchar(200) DEFAULT '';
create table risk_merchant_record(
id varchar(50) not null comment 'id',
create_time datetime not null comment '创建时间',
expiry_time datetime not null comment '过期时间',
client_id int(11) not null comment '商户id',
client_moniker varchar(20) not null comment '商户code',
status varchar(5) not null comment '记录状态 0:未处理,1已处理,2处理中',
risk_types varchar(50) not null comment '触发的风控类型 "," 号分割',
risk_counts varchar(70) null comment '对应类型触发次数 "," 号分割',
primary key(id),
key(client_id) using BTREE
);
create table risk_white_list(
client_id int(11) not null comment '商户id',
client_moniker varchar(20) not null comment '商户code',
create_time datetime not null comment '创建时间',
is_valid TINYINT(1) DEFAULT 1 COMMENT '是否可用',
primary key(client_id),
key(client_id) USING BTREE,
key(client_moniker)
);
create table risk_merchant_detail_log(
id varchar(50) not null comment 'id',
record_id varchar(50) not null comment '商户风控记录id',
create_time datetime not null comment '创建时间',
client_id int(11) not null comment '商户id',
auditor varchar(30) not null comment '操作者',
auditor_id varchar(50) not null comment '操作者id',
files varchar(500) null comment '上传附件 "," 号分割',
remark varchar(100) null comment '备注',
primary key(id),
key(client_id) using BTREE,
key(record_id)
);
create table risk_transaction_log(
id varchar(50) not null comment 'id',
order_id varchar(500) not null comment '问题订单id',
record_id varchar(50) not null comment '商户风控记录id',
amount DECIMAL(10,2) not null comment '过期时间',
channel varchar(15) NULL COMMENT '订单支付通道',
client_id int(11) not null comment '商户id',
risk_types varchar(50) not null comment '触发的风控类型 ","号分割 ',
create_time datetime not null,
primary key(id),
key(order_id),
key(record_id),
key(client_id)
);
insert into `royalpay_production`.`sys_configs` ( `config_key`, `config_value`) values ( 'risk_counts', '3');
insert into `royalpay_production`.`sys_configs` ( `config_key`, `config_value`) values ( 'risk_total_amout', '5000');

@ -0,0 +1,24 @@
package au.com.royalpay.payment.manage.mappers.risk;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
/**
* Create by yixian at 2017-12-21 11:45
*/
@AutoMapper(tablename = "risk_merchant_detail_log", pkName = "id")
public interface RiskMerchantDetailLogMapper {
@AutoSql(type = SqlType.INSERT)
void save(JSONObject record);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject record);
PageList<JSONObject> query(JSONObject params, PageBounds pagination);
}

@ -0,0 +1,26 @@
package au.com.royalpay.payment.manage.mappers.risk;
import org.apache.ibatis.annotations.Param;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
/**
* Create by yixian at 2017-12-21 11:45
*/
@AutoMapper(tablename = "risk_merchant_record", pkName = "id")
public interface RiskMerchantRecordMapper {
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject record);
@AutoSql(type = SqlType.SELECT)
JSONObject findById(@Param("id") String id);
PageList<JSONObject> query(JSONObject params, PageBounds pagination);
}

@ -0,0 +1,27 @@
package au.com.royalpay.payment.manage.mappers.risk;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import com.github.miemiedev.mybatis.paginator.domain.PageList;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
/**
* Create by yixian at 2017-12-21 11:45
*/
@AutoMapper(tablename = "risk_transaction_log", pkName = "id")
public interface RiskTransactionLogMapper {
@AutoSql(type = SqlType.SELECT)
JSONObject findByOrderId(@Param("order_id") String order_id);
@AutoSql(type = SqlType.SELECT)
List<JSONObject> findByRecordId(@Param("record_id") String record_id);
PageList<JSONObject> query(JSONObject params, PageBounds pagination);
}

@ -0,0 +1,26 @@
package au.com.royalpay.payment.manage.mappers.risk;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.Param;
import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
/**
* Create by yixian at 2017-12-21 11:45
*/
@AutoMapper(tablename = "risk_white_list", pkName = "client_id")
public interface RiskWhiteListMapper {
@AutoSql(type = SqlType.SELECT)
JSONObject findByClientMoniker(@Param("client_moniker") String client_moniker);
@AutoSql(type = SqlType.INSERT)
void save(JSONObject record);
@AutoSql(type = SqlType.UPDATE)
void update(JSONObject record);
}

@ -0,0 +1,69 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.lang3.StringUtils;
public class AddRiskDetailLog {
@JsonProperty("record_id")
private String record_id;
@JsonProperty("files")
private String files;
@JsonProperty("operation")
private String operation;
@JsonProperty("remark")
private String remark;
public JSONObject params() {
JSONObject params = new JSONObject();
params.put("record_id", this.record_id);
if (StringUtils.isNotEmpty(this.files)) {
params.put("files", this.files);
}
if (StringUtils.isNotEmpty(this.operation)) {
params.put("operation", this.operation);
}
if (StringUtils.isNotEmpty(this.remark)) {
params.put("remark", this.remark);
}
return params;
}
public String getRecord_id() {
return record_id;
}
public void setRecord_id(String record_id) {
this.record_id = record_id;
}
public String getFiles() {
return files;
}
public void setFiles(String files) {
this.files = files;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}

@ -0,0 +1,37 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
public class DealRiskRecord {
private String recordId;
private BigDecimal limitAmount;
@JsonProperty(defaultValue = "false")
private boolean disableMerchat;
public String getRecordId() {
return recordId;
}
public void setRecordId(String recordId) {
this.recordId = recordId;
}
public BigDecimal getLimitAmount() {
return limitAmount;
}
public void setLimitAmount(BigDecimal limitAmount) {
this.limitAmount = limitAmount;
}
public Boolean getDisableMerchat() {
return disableMerchat;
}
public void setDisableMerchat(Boolean disableMerchat) {
this.disableMerchat = disableMerchat;
}
}

@ -0,0 +1,70 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
public class QueryRiskDetail {
private String record_id;
private String c_end_time;
private int client_id;
private int limit = 20;
private int page;
public JSONObject toParams() {
JSONObject params = new JSONObject();
params.put("record_id", this.record_id);
params.put("client_id", this.client_id);
try {
if (c_end_time != null) {
params.put("c_end_time", DateUtils.parseDate(this.c_end_time, new String[] { "yyyy-MM-dd HH:mm:ss" }));
}
} catch (ParseException e) {
}
return params;
}
public String getRecord_id() {
return record_id;
}
public void setRecord_id(String record_id) {
this.record_id = record_id;
}
public String getC_end_time() {
return c_end_time;
}
public void setC_end_time(String c_end_time) {
this.c_end_time = c_end_time;
}
public int getClient_id() {
return client_id;
}
public void setClient_id(int client_id) {
this.client_id = client_id;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
}

@ -0,0 +1,69 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
public class QueryRiskOrder {
private String record_id;
private String c_end_time;
private int client_id;
private int limit = 20;
private int page;
public JSONObject toParams() {
JSONObject params = new JSONObject();
params.put("record_id", this.record_id);
params.put("client_id", this.client_id);
try {
if (c_end_time != null) {
params.put("c_end_time", DateUtils.parseDate(this.c_end_time, new String[] { "yyyy-MM-dd HH:mm:ss" }));
}
} catch (ParseException e) {
}
return params;
}
public String getRecord_id() {
return record_id;
}
public void setRecord_id(String record_id) {
this.record_id = record_id;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public String getC_end_time() {
return c_end_time;
}
public void setC_end_time(String c_end_time) {
this.c_end_time = c_end_time;
}
public int getClient_id() {
return client_id;
}
public void setClient_id(int client_id) {
this.client_id = client_id;
}
}

@ -0,0 +1,83 @@
package au.com.royalpay.payment.manage.risk.bean;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
public class QueryRiskRecord {
private String status;
private String client_moniker;
private String record_id;
private String c_end_time;
private int client_id;
private int limit = 20;
private int page;
public JSONObject toParams() {
JSONObject params = new JSONObject();
params.put("status", this.status);
params.put("client_moniker", this.client_moniker);
params.put("record_id", this.record_id);
params.put("client_id", this.client_id);
try {
if (c_end_time != null) {
params.put("c_end_time", DateUtils.parseDate(this.c_end_time, new String[] { "yyyy-MM-dd HH:mm:ss" }));
}
} catch (ParseException e) {
}
return params;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRecord_id() {
return record_id;
}
public void setRecord_id(String record_id) {
this.record_id = record_id;
}
public String getClient_moniker() {
return client_moniker;
}
public void setClient_moniker(String client_moniker) {
this.client_moniker = client_moniker;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public String getC_end_time() {
return c_end_time;
}
public void setC_end_time(String c_end_time) {
this.c_end_time = c_end_time;
}
}

@ -0,0 +1,37 @@
package au.com.royalpay.payment.manage.risk.core;
import au.com.royalpay.payment.manage.risk.bean.AddRiskDetailLog;
import au.com.royalpay.payment.manage.risk.bean.DealRiskRecord;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskDetail;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord;
import com.alibaba.fastjson.JSONObject;
public interface RiskMerchantService {
void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account);
void DropOrderRiskRecord(JSONObject account,String recordId);
void noopRiskRecord(JSONObject account,String recordId);
void dealRiskRecord(JSONObject account,DealRiskRecord dealRiskRecord);
void dealRiskRecordDirectly(JSONObject account,String record_id);
JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder);
JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord);
void addWhiteList(String client_moinker);
void disableWhiteList(String client_moinker);
JSONObject getRecordById(String record_id);
JSONObject getRiskDetails(QueryRiskDetail queryRiskDetail);
}

@ -0,0 +1,214 @@
package au.com.royalpay.payment.manage.risk.core.impl;
import au.com.royalpay.payment.manage.mappers.risk.RiskMerchantDetailLogMapper;
import au.com.royalpay.payment.manage.mappers.risk.RiskMerchantRecordMapper;
import au.com.royalpay.payment.manage.mappers.risk.RiskTransactionLogMapper;
import au.com.royalpay.payment.manage.mappers.risk.RiskWhiteListMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.risk.bean.AddRiskDetailLog;
import au.com.royalpay.payment.manage.risk.bean.DealRiskRecord;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskDetail;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord;
import au.com.royalpay.payment.manage.risk.core.RiskMerchantService;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.NotFoundException;
import au.com.royalpay.payment.tools.utils.PageListUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import javax.annotation.Resource;
@Service
public class RiskMerchantServiceImpl implements RiskMerchantService {
@Resource
private RiskMerchantRecordMapper riskMerchantRecordMapper;
@Resource
private RiskMerchantDetailLogMapper riskMerchantDetailLogMapper;
@Resource
private RiskTransactionLogMapper riskTransactionLogMapper;
@Resource
private RiskWhiteListMapper riskWhiteListMapper;
@Resource
private ClientManager clientManager;
@Override
@Transactional
public void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account) {
JSONObject record = riskMerchantRecordMapper.findById(addRiskDetailLog.getRecord_id());
if (record == null) {
throw new NotFoundException("Risk Record Not Found Please Check");
}
JSONObject detail = addRiskDetailLog.params();
detail.put("auditor", account.getString("display_name"));
detail.put("client_id", record.getIntValue("client_id"));
detail.put("auditor_id", account.getString("manager_id"));
detail.put("create_time", new Date());
riskMerchantDetailLogMapper.save(detail);
}
@Override
@Transactional
public void DropOrderRiskRecord(JSONObject account, String recordId) {
JSONObject riskRecord = riskMerchantRecordMapper.findById(recordId);
if (riskRecord == null) {
throw new NotFoundException("Risk Record Not Found");
}
if (riskRecord.getIntValue("status") != 0) {
throw new BadRequestException("The Record Has Been Handled");
}
JSONObject record = new JSONObject();
record.put("id", recordId);
record.put("status", "1");
riskMerchantRecordMapper.update(record);
JSONObject detail = new JSONObject();
detail.put("record_id", recordId);
detail.put("client_id", riskRecord.getIntValue("client_id"));
detail.put("auditor", account.getString("display_name"));
detail.put("auditor_id", account.getString("manager_id"));
detail.put("remark", "进行掉单处理");
detail.put("create_time", new Date());
riskMerchantDetailLogMapper.save(detail);
}
@Override
@Transactional
public void noopRiskRecord(JSONObject account, String recordId) {
JSONObject riskRecord = riskMerchantRecordMapper.findById(recordId);
if (riskRecord == null) {
throw new NotFoundException("Risk Record Not Found");
}
if (riskRecord.getIntValue("status") != 0) {
throw new BadRequestException("The Record Has Been Handled");
}
JSONObject record = new JSONObject();
record.put("id", recordId);
record.put("status", "2");
riskMerchantRecordMapper.update(record);
JSONObject detail = new JSONObject();
detail.put("record_id", recordId);
detail.put("client_id", riskRecord.getIntValue("client_id"));
detail.put("auditor", account.getString("display_name"));
detail.put("remark", "不做处理");
detail.put("create_time", new Date());
riskMerchantDetailLogMapper.save(detail);
}
@Override
@Transactional
public void dealRiskRecord(JSONObject account, DealRiskRecord dealRiskRecord) {
JSONObject record = riskMerchantRecordMapper.findById(dealRiskRecord.getRecordId());
if (record == null) {
throw new NotFoundException("Risk Record Not Found Please Check");
}
if (record.getIntValue("status") != 0) {
throw new BadRequestException("The Record Has Been Handled");
}
String remark = "";
if (dealRiskRecord.getLimitAmount() != null) {
clientManager.setMaxOrderAmount(record.getString("client_moniker"), dealRiskRecord.getLimitAmount());
remark = remark + "限额" + dealRiskRecord.getLimitAmount();
}
if (dealRiskRecord.getDisableMerchat()) {
clientManager.switchChannelPermission(account, record.getString("client_moniker"), "Wechat", false);
clientManager.switchChannelPermission(account, record.getString("client_moniker"), "Alipay", false);
remark = remark + " 关闭支付通道";
}
JSONObject detail = new JSONObject();
detail.put("record_id", dealRiskRecord.getRecordId());
detail.put("client_id", record.getIntValue("client_id"));
detail.put("auditor", account.getString("display_name"));
detail.put("remark", StringUtils.isEmpty(remark) ? null : (remark = "处理结果:" + remark));
detail.put("create_time", new Date());
riskMerchantDetailLogMapper.save(detail);
record.put("status", 2);
riskMerchantRecordMapper.update(record);
}
@Override
@Transactional
public void dealRiskRecordDirectly(JSONObject account, String record_id) {
JSONObject record = riskMerchantRecordMapper.findById(record_id);
if (record == null) {
throw new NotFoundException("Risk Record Not Found Please Check");
}
if (record.getIntValue("status") != 0) {
throw new BadRequestException("The Record Has Been Handled");
}
JSONObject detail = new JSONObject();
detail.put("record_id", record_id);
detail.put("client_id", record.getIntValue("client_id"));
detail.put("auditor", account.getString("display_name"));
detail.put("auditor_id", account.getString("manager_id"));
detail.put("remark", "结停");
detail.put("create_time", new Date());
riskMerchantDetailLogMapper.save(detail);
JSONObject recordUpdate = new JSONObject();
recordUpdate.put("id",record_id);
recordUpdate.put("status", 1);
riskMerchantRecordMapper.update(recordUpdate);
}
@Override
public JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder) {
return PageListUtils.buildPageListResult(
riskTransactionLogMapper.query(queryRiskOrder.toParams(), new PageBounds(queryRiskOrder.getPage(), queryRiskOrder.getLimit())));
}
@Override
public JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord) {
return PageListUtils.buildPageListResult(
riskMerchantRecordMapper.query(queryRiskRecord.toParams(), new PageBounds(queryRiskRecord.getPage(), queryRiskRecord.getLimit())));
}
@Override
public void addWhiteList(String client_moinker) {
JSONObject white = riskWhiteListMapper.findByClientMoniker(client_moinker);
if (white != null) {
white.put("is_valid", true);
riskWhiteListMapper.update(white);
return;
}
JSONObject client = clientManager.getClientInfoByMoniker(client_moinker);
if (client == null) {
throw new NotFoundException("Merchant Not Found Please Check");
}
JSONObject record = new JSONObject();
record.put("client_id", client.getIntValue("client_id"));
record.put("client_moniker", client.getString("client_moinker"));
record.put("create_time", new Date());
riskWhiteListMapper.save(record);
}
@Override
public void disableWhiteList(String client_moinker) {
JSONObject white = riskWhiteListMapper.findByClientMoniker(client_moinker);
if (white == null) {
throw new NotFoundException("White List Not Found Please Check");
}
white.put("is_valid", false);
riskWhiteListMapper.update(white);
}
@Override
public JSONObject getRecordById(String record_id) {
return riskMerchantRecordMapper.findById(record_id);
}
@Override
public JSONObject getRiskDetails(QueryRiskDetail queryRiskDetail) {
return PageListUtils.buildPageListResult(
riskMerchantDetailLogMapper.query(queryRiskDetail.toParams(), new PageBounds(queryRiskDetail.getPage(), queryRiskDetail.getLimit())));
}
}

@ -0,0 +1,94 @@
package au.com.royalpay.payment.manage.risk.web;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
import au.com.royalpay.payment.manage.risk.bean.AddRiskDetailLog;
import au.com.royalpay.payment.manage.risk.bean.DealRiskRecord;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskDetail;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder;
import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord;
import au.com.royalpay.payment.manage.risk.core.RiskMerchantService;
import au.com.royalpay.payment.tools.CommonConsts;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* Created by wangning on 08/12/2016.
*/
@RestController
@ManagerMapping(value = "/sys/risk")
public class RiskController {
@Resource
private RiskMerchantService riskMerchantService;
@RequestMapping(value = "/records", method = RequestMethod.GET)
public JSONObject list(QueryRiskRecord recordQuery) {
return riskMerchantService.getRiskRecords(recordQuery);
}
@RequestMapping(value = "/records/{record_id}", method = RequestMethod.GET)
public JSONObject getById(@PathVariable String record_id) {
return riskMerchantService.getRecordById(record_id);
}
@RequestMapping(value = "/records/{record_id}/dropOrder", method = RequestMethod.PUT)
public void dropOrder(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String record_id) {
riskMerchantService.DropOrderRiskRecord(manager, record_id);
}
@RequestMapping(value = "/records/{record_id}/noop", method = RequestMethod.PUT)
public void noop(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String record_id) {
riskMerchantService.noopRiskRecord(manager, record_id);
}
@RequestMapping(value = "/records/{record_id}/directly", method = RequestMethod.PUT)
public void directly(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String record_id) {
riskMerchantService.dealRiskRecordDirectly(manager, record_id);
}
@RequestMapping(value = "/records/{record_id}/deal",method = RequestMethod.PUT)
public void dealRecord(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String record_id, @RequestBody DealRiskRecord dealRiskRecord){
dealRiskRecord.setRecordId(record_id);
riskMerchantService.dealRiskRecord(manager,dealRiskRecord);
}
@RequestMapping(value = "/orders", method = RequestMethod.GET)
public JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder) {
return riskMerchantService.getRiskOrders(queryRiskOrder);
}
@RequestMapping(value = "/white/{client_moniker}", method = RequestMethod.POST)
public void addWhiteList(@PathVariable String client_moniker) {
riskMerchantService.addWhiteList(client_moniker);
}
@RequestMapping(value = "/white/{client_moniker}/disable", method = RequestMethod.PUT)
public void disableWhiteList(@PathVariable String client_moniker) {
riskMerchantService.disableWhiteList(client_moniker);
}
@RequestMapping(value = "/records/uploadFiles", method = RequestMethod.POST)
public void addRecordLog(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager,@RequestBody AddRiskDetailLog addRiskDetailLog) {
riskMerchantService.addDetailLog(addRiskDetailLog,manager);
}
@RequestMapping(value = "/details", method = RequestMethod.GET)
public JSONObject listDetails(QueryRiskDetail queryRiskDetail) {
return riskMerchantService.getRiskDetails(queryRiskDetail);
}
@RequestMapping(value = "/details/remark", method = RequestMethod.POST)
public void addDetailRemark(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager,@RequestBody AddRiskDetailLog addRiskDetailLog ) {
riskMerchantService.addDetailLog(addRiskDetailLog,manager);
}
}

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="au.com.royalpay.payment.manage.mappers.risk.RiskMerchantDetailLogMapper">
<select id="query" resultType="com.alibaba.fastjson.JSONObject">
select *
from risk_merchant_detail_log
<where>
<if test="record_id!=null">
and record_id = #{record_id}
</if>
<if test="client_id!=0">
and client_id = #{client_id}
</if>
</where>
order by create_time desc
</select>
</mapper>

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="au.com.royalpay.payment.manage.mappers.risk.RiskMerchantRecordMapper">
<select id="query" resultType="com.alibaba.fastjson.JSONObject">
SELECT *
FROM risk_merchant_record
<where>
<if test="record_id!=null">
and id = #{record_id}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="client_moniker!=null">
and client_moniker = #{client_moniker}
</if>
<if test="c_end_time!=null">
and create_time &lt; #{c_end_time}
</if>
<if test="client_id != 0">
and client_id = #{client_id}
</if>
</where>
order by create_time desc
</select>
</mapper>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="au.com.royalpay.payment.manage.mappers.risk.RiskTransactionLogMapper">
<select id="query" resultType="com.alibaba.fastjson.JSONObject">
SELECT *
FROM risk_transaction_log
<where>
<if test="record_id!=null">
and record_id = #{record_id}
</if>
<if test="client_id !=0">
and client_id = #{client_id}
</if>
<if test="c_end_time != null">
and create_time &lt; #{c_end_time}
</if>
</where>
order by create_time desc
</select>
</mapper>

@ -19,6 +19,10 @@
<li ui-sref-active-eq="active" ng-if="('monitor'|withModule)&&(currentUser.org_id==null)"> <li ui-sref-active-eq="active" ng-if="('monitor'|withModule)&&(currentUser.org_id==null)">
<a ui-sref="analysis_monitoring.pre_refund"><i class="fa fa-tv"></i> <span>欠款|Pre Refund</span></a> <a ui-sref="analysis_monitoring.pre_refund"><i class="fa fa-tv"></i> <span>欠款|Pre Refund</span></a>
</li> </li>
<li ui-sref-active-eq="active">
<a ui-sref="analysis_monitoring.risk_manager"><i class="fa fa-tv"></i> <span>风控记录|Risk Records</span></a>
</li>
</ul> </ul>
</div> </div>
</div> </div>

@ -0,0 +1,243 @@
define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootSwitch', 'ngFileUpload'], function (angular) {
'use strict';
var riskType = [
{code: '1', label: 'test1'},
{code: '2', label: 'test2'},
];
var app = angular.module('RiskManagement', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ngFileUpload']);
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider.state('analysis_monitoring.risk_manager', {
url: '/risk/manage',
templateUrl: '/static/risk/templates/risk.html',
controller: 'RiskManageCtrl',
}).state('analysis_monitoring.risk_orders', {
url: '/risk/{record_id}/orders',
templateUrl: '/static/risk/templates/risk_orders.html',
controller: 'RiskOrderCtrl',
resolve:{
record:['$http','$stateParams', function ($http,$stateParams) {
return $http.get('/sys/risk/records/'+$stateParams.record_id).then(function (res) {
return res.data;
});
}]
}
}).state('analysis_monitoring.risk_history', {
url: '/risk/{record_id}/history',
templateUrl: '/static/risk/templates/risk_history.html',
controller: 'RecordHistoryCtrl',
resolve:{
record:['$http','$stateParams', function ($http,$stateParams) {
return $http.get('/sys/risk/records/'+$stateParams.record_id).then(function (res) {
return res.data;
});
}]
}
}).state('analysis_monitoring.risk_detail', {
url: '/risk/{record_id}/detail',
templateUrl: '/static/risk/templates/risk_detail.html',
controller: 'RecordDetailCtrl',
resolve:{
record:['$http','$stateParams', function ($http,$stateParams) {
return $http.get('/sys/risk/records/'+$stateParams.record_id).then(function (res) {
return res.data;
});
}]
}
});
}]);
app.controller('RiskManageCtrl', ['$scope', '$http', function ($scope, $http){
$scope.params = {};
$scope.pagination = {};
$scope.loadRecords = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/risk/records', {params: params}).then(function (resp) {
$scope.records = resp.data.data;
$scope.pagination = resp.data.pagination;
});
};
$scope.loadRecords(1);
}]);
app.controller('RiskOrderCtrl', ['$scope', '$http', 'record', function ($scope, $http,record) {
$scope.params = {record_id: record.id};
$scope.historyParams = {client_id:record.client_id};
$scope.pagination = {};
$scope.historyPagination = {};
$scope.record = record;
$scope.loadOrders = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/risk/orders',{params: params}).then(function (resp) {
$scope.orders = resp.data.data;
$scope.pagination = resp.data.pagination;
$scope.historyParams.c_end_time = $scope.orders.pop().create_time;
$scope.loadHistoryOrders(1);
});
};
$scope.loadOrders(1);
$scope.loadHistoryOrders = function (page) {
var historyParams = angular.copy($scope.historyParams);
historyParams.page = page || $scope.historyPagination.page || 1;
$http.get('/sys/risk/orders',{params: historyParams}).then(function (resp) {
$scope.historyOrders = resp.data.data;
$scope.historyPagination = resp.data.pagination;
});
};
}]);
app.controller('RecordHistoryCtrl', ['$scope', '$http','$uibModal', 'commonDialog','record', function ($scope, $http,$uibModal,commonDialog,record) {
$scope.record = record;
$scope.pagination = {};
$scope.params = {client_id:record.client_id,c_end_time:record.create_time};
$scope.listHistory = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/risk/records',{params:params}).then(function (res) {
$scope.histories = res.data.data;
$scope.pagination = res.data.pagination;
})
};
$scope.listHistory(1);
$scope.edit = function () {
$uibModal.open({
templateUrl: '/static/risk/templates/risk_edit.html',
controller: 'RiskRecordHandleCtrl',
resolve:{record_id:function () {
return record.id;
}}
}).result.then(function () {
commonDialog.alert({
title: 'Success',
type: 'success'
});
})
};
$scope.noop = function () {
commonDialog.confirm({
title: 'Confirm',
content: '确定放弃这次预警'
}).then(function () {
$http.put('/sys/risk/records/'+ record.id+'/noop', $scope.params).then(function () {
}).then(function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'Error'
});
})
})
}
}]);
app.controller('RecordDetailCtrl', ['$scope', '$http','$uibModal', 'commonDialog','record', function ($scope, $http,$uibModal,commonDialog,record) {
$scope.record = record;
$scope.pagination = {};
$scope.params = {record_id:record.id};
$scope.listDetail = function (page) {
var params = angular.copy($scope.params);
params.page = page || $scope.pagination.page || 1;
$http.get('/sys/risk/details',{params:params}).then(function (res) {
$scope.details = res.data.data;
$scope.pagination = res.data.pagination;
})
};
$scope.listDetail(1);
$scope.addRemark = function () {
$uibModal.open({
templateUrl: '/static/risk/templates/risk_remark.html',
controller: 'RiskDetailRemarkCtrl',
resolve:{record_id:function () {
return record.id;
}}
}).result.then(function () {
$scope.listDetail(1);
commonDialog.alert({
title: 'Success',
type: 'success'
});
})
}
$scope.dealDirectly = function () {
commonDialog.confirm({
title: 'Confirm',
content: '确定关结这次预警?'
}).then(function () {
$http.put('/sys/risk/records/'+ record.id+'/directly').then(function () {
commonDialog.alert({
title: 'Success',
type: 'Success'
});
$scope.listDetail(1);
$scope.record.status=1;
}).then(function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'Error'
});
})
})
}
}]);
app.controller('RiskDetailRemarkCtrl', ['$scope', '$http','record_id','commonDialog', function ($scope, $http,record_id,commonDialog) {
$scope.addRemarkParams = {record_id:record_id};
$scope.addRemark = function () {
var params = angular.copy($scope.addRemarkParams);
$http.post('/sys/risk/details/remark',params).then(function (res) {
$scope.$close();
}).then(function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'Error'
});
})
}
}]);
app.controller('RiskRecordHandleCtrl', ['$scope', '$http','record_id','commonDialog', function ($scope, $http,record_id,commonDialog) {
$scope.params= {};
$scope.handle = function () {
$http.put('/sys/risk/records/'+ record_id+'/deal', $scope.params).then(function () {
$scope.$close();
}).then(function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'Error'
});
})
}
}]);
app.filter('risk_type', function () {
return function (riskStr) {
angular.forEach(riskType,function (type) {
riskStr = riskStr.replace(type.code,type.label);
})
return riskStr;
};
});
app.filter('status_type', function () {
return function (riskStr) {
var statusResult = '';
switch (riskStr){
case('0'): statusResult = '待处理';break;
case('1'): statusResult = '已处理';break;
case('2'): statusResult = '处理中';break;
default: statusResult = '';
}
return statusResult;
};
});
return app;
});

@ -0,0 +1,58 @@
<div ui-view>
<section class="content-header">
<h1>Risk Manager</h1>
<ol class="breadcrumb">
<li><i class="fa fa-gift"></i> Risk</li>
<li class="active">Risk Manager</li>
</ol>
</section>
<section class="content">
<div class="box box-default">
<div class="box-header">Records</div>
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Client Moniker</th>
<th>Create Time</th>
<th>Waring Time</th>
<th>Status</th>
<th>Risk Types</th>
<th>Risk Counts</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="record in records">
<td>{{record.client_moniker}}</td>
<td>{{record.create_time}}</td>
<td>{{record.expiry_time}}</td>
<td>{{record.status|status_type}}</td>
<td>{{record.risk_types|risk_type}}</td>
<td>{{record.risk_counts}}</td>
<td>
<a class="text-primary" role="button" title="Detail" ui-sref="analysis_monitoring.risk_orders({'record_id':record.id})">
<i class="fa fa-search" ></i>
</a>
</td>
</tr>
</tbody>
</table>
<div class="modal-footer">
<uib-pagination ng-if="records.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadRecords()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
</div>
</section>
</div>

@ -0,0 +1,63 @@
<div ui-view>
<section class="content-header">
<h1>Risk Manager</h1>
<ol class="breadcrumb">
<li><i class="fa fa-gift"></i> Risk</li>
<li class="fa fa-gift">Risk Manager</li>
<li class="active">Risk Detail</li>
</ol>
</section>
<section class="content">
<ul class="nav nav-tabs">
<li ui-sref-active-eq="active">
<a ui-sref="analysis_monitoring.risk_orders({'record_id':record.id})">Risk Orders</a>
</li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.risk_history({'record_id':record.id})">Risk history</a>
</li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.risk_detail({'record_id':record.id})">Risk Detail</a>
</li>
</ul>
<div class="box box-default">
<div class="box-header">Risk Details</div>
<div class="box-header" ng-if="record.status==0" style="text-align: right;">
<button type="button" class="btn btn-info" ng-click="addRemark()">Add Remark</button>
<button type="button" class="btn btn-info" ng-click="dealDirectly()">Close record</button>
</div>
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Create Time</th>
<th>auditor</th>
<th>remark</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="record in details">
<td>{{record.create_time}}</td>
<td>{{record.auditor}}</td>
<td>{{record.remark}}</td>
</tr>
</tbody>
</table>
<div class="modal-footer">
<uib-pagination ng-if="details.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="listDetail()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
</div>
</section>
</div>

@ -0,0 +1,32 @@
<section class="content-header">
<h1>Add Remark</h1>
</section>
<div class="content">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<form role="form" style="margin:0px auto;width: 50%">
<div class="form-group">
<label>Limit Amount</label>
<input ng-model="params.limitAmount" name="code" class="form-control" type="text"/>
</div>
<div class="form-group">
<label>
<input type="checkbox" ng-model="params.disableMerchat" class="ng-pristine ng-untouched ng-valid">
Disable Merchant
</label>
</div>
<div class="form-group">
<button class="btn btn-primary btn-block" ng-click="handle()">commit</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,69 @@
<div ui-view>
<section class="content-header">
<h1>Risk Manager</h1>
<ol class="breadcrumb">
<li><i class="fa fa-gift"></i> Risk</li>
<li class="fa fa-gift">Risk Manager</li>
<li class="active">Risk records</li>
</ol>
</section>
<section class="content">
<ul class="nav nav-tabs">
<ul class="nav nav-tabs">
<li ui-sref-active-eq="active">
<a ui-sref="analysis_monitoring.risk_orders({'record_id':record.id})">Risk Orders</a>
</li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.risk_history({'record_id':record.id})">Risk history</a>
</li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.risk_detail({'record_id':record.id})">Risk Detail</a>
</li>
</ul>
</ul>
<div class="box box-default">
<!--
<div class="box-header">Latest Record</div>
-->
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Client Moniker</th>
<th>Create Time</th>
<th>Waring Time</th>
<th>Risk Types</th>
<th>Status</th>
<th>Risk Counts</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="record in histories">
<td>{{record.client_moniker}}</td>
<td>{{record.create_time}}</td>
<td>{{record.expiry_time}}</td>
<td>{{record.status}}</td>
<td>{{record.risk_types|risk_type}}</td>
<td>{{record.risk_counts}}</td>
</tr>
</tbody>
</table>
<div class="modal-footer">
<uib-pagination ng-if="histories.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="listHistory()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
</div>
</section>
</div>

@ -0,0 +1,105 @@
<div ui-view>
<section class="content-header">
<h1>Risk Manager</h1>
<ol class="breadcrumb">
<li><i class="fa fa-gift"></i> Risk</li>
<li class="fa fa-gift">Risk Manager</li>
<li class="active">Risk records</li>
</ol>
</section>
<section class="content">
<ul class="nav nav-tabs">
<ul class="nav nav-tabs">
<li ui-sref-active-eq="active">
<a ui-sref="analysis_monitoring.risk_orders({'record_id':record.id})">Risk Orders</a>
</li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.risk_history({'record_id':record.id})">Risk history</a>
</li>
<li ui-sref-active="active">
<a ui-sref="analysis_monitoring.risk_detail({'record_id':record.id})">Risk Detail</a>
</li>
</ul>
</ul>
<div class="box box-default">
<div class="box-header">Reference Orders</div>
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Order Id</th>
<th>Amount</th>
<th>Channel</th>
<th>Create Time</th>
<th>Risk Types</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="order in orders">
<td>{{order.order_id}}</td>
<td>{{order.amount}}</td>
<td>{{order.channel}}</td>
<td>{{order.create_time}}</td>
<td>{{order.risk_types|risk_type}}</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
<uib-pagination ng-if="orders.length"
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadOrders()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
<div class="box box-default">
<div class="box-header">Waring Orders History</div>
<div class="box-body table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>Order Id</th>
<th>Amount</th>
<th>Channel</th>
<th>Create Time</th>
<th>Risk Types</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="order in historyOrders">
<td>{{order.order_id}}</td>
<td>{{order.amount}}</td>
<td>{{order.channel}}</td>
<td>{{order.create_time}}</td>
<td>{{order.risk_types|risk_type}}</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
<uib-pagination ng-if="historyOrders.length"
class="pagination"
total-items="historyPagination.totalCount"
boundary-links="true"
ng-model="historyPagination.page"
items-per-page="historyPagination.limit"
max-size="10"
ng-change="loadHistorysOrders()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
</div>
</div>
</section>
</div>

@ -0,0 +1,25 @@
<section class="content-header">
<h1>Phone Top Up</h1>
</section>
<div class="content">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<form role="form" style="margin:0px auto;width: 50%">
<div class="form-group">
<label>remark</label>
<input ng-model="addRemarkParams.remark" name="code" class="form-control" type="text"/>
</div>
<div class="form-group">
<button class="btn btn-primary btn-block" ng-click="addRemark()">commit</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
Loading…
Cancel
Save