diff --git a/src/db/modify.sql b/src/db/modify.sql index 7b6db68ce..f37a998db 100644 --- a/src/db/modify.sql +++ b/src/db/modify.sql @@ -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 ''; + + +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'); + + diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java new file mode 100644 index 000000000..4c0db3b16 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java @@ -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 query(JSONObject params, PageBounds pagination); + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.java new file mode 100644 index 000000000..0aa2f7465 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.java @@ -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 query(JSONObject params, PageBounds pagination); + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java new file mode 100644 index 000000000..c3b4cbc41 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java @@ -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 findByRecordId(@Param("record_id") String record_id); + + PageList query(JSONObject params, PageBounds pagination); +} diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskWhiteListMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskWhiteListMapper.java new file mode 100644 index 000000000..20b8a13bb --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskWhiteListMapper.java @@ -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); + + +} \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java new file mode 100644 index 000000000..2f787efd4 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java @@ -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; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/bean/DealRiskRecord.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/DealRiskRecord.java new file mode 100644 index 000000000..a1976e3f6 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/DealRiskRecord.java @@ -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; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskDetail.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskDetail.java new file mode 100644 index 000000000..1e4c07d57 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskDetail.java @@ -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; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskOrder.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskOrder.java new file mode 100644 index 000000000..96a9ecfab --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskOrder.java @@ -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; + } +} \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskRecord.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskRecord.java new file mode 100644 index 000000000..a1de31509 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskRecord.java @@ -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; + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java b/src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java new file mode 100644 index 000000000..a8a2109af --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java @@ -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); + + + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/core/impl/RiskMerchantServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/risk/core/impl/RiskMerchantServiceImpl.java new file mode 100644 index 000000000..d62762e94 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/core/impl/RiskMerchantServiceImpl.java @@ -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()))); + + } +} diff --git a/src/main/java/au/com/royalpay/payment/manage/risk/web/RiskController.java b/src/main/java/au/com/royalpay/payment/manage/risk/web/RiskController.java new file mode 100644 index 000000000..9fd4be497 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/web/RiskController.java @@ -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); + } + +} diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.xml new file mode 100644 index 000000000..282f8690c --- /dev/null +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml new file mode 100644 index 000000000..2d8749648 --- /dev/null +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.xml new file mode 100644 index 000000000..b413d7bbd --- /dev/null +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html b/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html index 84efe7cf9..c4dabdde7 100644 --- a/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html +++ b/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html @@ -19,6 +19,10 @@
  • 欠款|Pre Refund
  • +
  • + 风控记录|Risk Records +
  • + diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js new file mode 100644 index 000000000..3b78fdeb6 --- /dev/null +++ b/src/main/ui/static/risk/risk.js @@ -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; +}); \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk.html b/src/main/ui/static/risk/templates/risk.html new file mode 100644 index 000000000..ff55c8552 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk.html @@ -0,0 +1,58 @@ +
    +
    +

    Risk Manager

    + +
    +
    +
    +
    Records
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Client MonikerCreate TimeWaring TimeStatusRisk TypesRisk CountsOperation
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_time}}{{record.status|status_type}}{{record.risk_types|risk_type}}{{record.risk_counts}} + + + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_detail.html b/src/main/ui/static/risk/templates/risk_detail.html new file mode 100644 index 000000000..52d28fd32 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -0,0 +1,63 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Risk Details
    +
    + + +
    +
    + + + + + + + + + + + + + + + +
    Create Timeauditorremark
    {{record.create_time}}{{record.auditor}}{{record.remark}}
    + +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_edit.html b/src/main/ui/static/risk/templates/risk_edit.html new file mode 100644 index 000000000..a1fa06c5d --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_edit.html @@ -0,0 +1,32 @@ +
    +

    Add Remark

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/main/ui/static/risk/templates/risk_history.html b/src/main/ui/static/risk/templates/risk_history.html new file mode 100644 index 000000000..2959e53f9 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_history.html @@ -0,0 +1,69 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Client MonikerCreate TimeWaring TimeRisk TypesStatusRisk Counts
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_time}}{{record.status}}{{record.risk_types|risk_type}}{{record.risk_counts}}
    + +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_orders.html b/src/main/ui/static/risk/templates/risk_orders.html new file mode 100644 index 000000000..3e07bb71f --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_orders.html @@ -0,0 +1,105 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Reference Orders
    +
    + + + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelCreate TimeRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.create_time}}{{order.risk_types|risk_type}}
    +
    + +
    + +
    +
    Waring Orders History
    +
    + + + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelCreate TimeRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.create_time}}{{order.risk_types|risk_type}}
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_remark.html b/src/main/ui/static/risk/templates/risk_remark.html new file mode 100644 index 000000000..8a994ca79 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_remark.html @@ -0,0 +1,25 @@ +
    +

    Phone Top Up

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +