diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java index 8f4ab97b4..9a47c34f4 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.java @@ -38,6 +38,10 @@ public interface TransactionMapper { @AdvanceSelect(addonWhereClause = "refund_id is null and system_generate=0 and transaction_type = 'Credit'") JSONObject findIncomeByOrderId(@Param("order_id") String orderId); + @AutoSql(type = SqlType.SELECT) + @AdvanceSelect(addonWhereClause = "transaction_type = 'Credit'") + JSONObject findByOrderId(@Param("order_id") String orderId); + @AutoSql(type = SqlType.SELECT) @AdvanceSelect(addonWhereClause = "refund_id is null and system_generate=1") JSONObject findSystemIncomeByOrderId(@Param("order_id") String orderId); diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.java index 200a00356..3cfed3757 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.java @@ -28,6 +28,10 @@ public interface RiskEventMapper { PageList listRisksByPage(JSONObject params, PageBounds pageBounds); + List analysisByIndustry(JSONObject params); + + List analysisByAmount(JSONObject params); + @AutoSql(type = SqlType.SELECT) JSONObject findById(@Param("risk_id") String riskId); diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskOrdersMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskOrdersMapper.java new file mode 100644 index 000000000..ddf743854 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskOrdersMapper.java @@ -0,0 +1,16 @@ +package au.com.royalpay.payment.manage.mappers.riskbusiness; + +import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper; +import cn.yixblog.support.mybatis.autosql.annotations.AutoSql; +import cn.yixblog.support.mybatis.autosql.annotations.SqlType; +import com.alibaba.fastjson.JSONObject; +import org.apache.ibatis.annotations.Param; + +@AutoMapper(tablename = "risk_orders", pkName = "risk_order_id") +public interface RiskOrdersMapper { + @AutoSql(type= SqlType.INSERT) + void save(JSONObject params); + + @AutoSql(type = SqlType.DELETE) + void clearOrders(@Param("risk_id") String riskId); +} diff --git a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/bean/RiskEventQuery.java b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/bean/RiskEventQuery.java index 29b3bb14f..53d5e7246 100644 --- a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/bean/RiskEventQuery.java +++ b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/bean/RiskEventQuery.java @@ -38,9 +38,17 @@ public class RiskEventQuery { // 收到调单邮件日期 private String receiveEmailDate; + private String receiveEmailDateBegin; + + private String receiveEmailDateEnd; + // 邮件回复截止日期 private String replyEmailDate; + private String replyEmailDateBegin; + + private String replyEmailDateEnd; + private Integer page = 1; // 金额区间 @@ -135,6 +143,38 @@ public class RiskEventQuery { this.replyEmailDate = replyEmailDate; } + public String getReceiveEmailDateBegin() { + return receiveEmailDateBegin; + } + + public void setReceiveEmailDateBegin(String receiveEmailDateBegin) { + this.receiveEmailDateBegin = receiveEmailDateBegin; + } + + public String getReceiveEmailDateEnd() { + return receiveEmailDateEnd; + } + + public void setReceiveEmailDateEnd(String receiveEmailDateEnd) { + this.receiveEmailDateEnd = receiveEmailDateEnd; + } + + public String getReplyEmailDateBegin() { + return replyEmailDateBegin; + } + + public void setReplyEmailDateBegin(String replyEmailDateBegin) { + this.replyEmailDateBegin = replyEmailDateBegin; + } + + public String getReplyEmailDateEnd() { + return replyEmailDateEnd; + } + + public void setReplyEmailDateEnd(String replyEmailDateEnd) { + this.replyEmailDateEnd = replyEmailDateEnd; + } + public Integer getPage() { return page; } @@ -184,6 +224,22 @@ public class RiskEventQuery { params.put("reply_email_date", replyEmailDate); } + if (receiveEmailDateBegin != null) { + params.put("receive_email_date_begin", receiveEmailDateBegin); + } + + if (receiveEmailDateEnd != null) { + params.put("receive_email_date_end", receiveEmailDateEnd); + } + + if (replyEmailDateBegin != null) { + params.put("reply_email_date_begin", replyEmailDateBegin); + } + + if (replyEmailDateEnd != null) { + params.put("reply_email_date_end", replyEmailDateEnd); + } + if (page != null && page > 0) { params.put("page", page); } diff --git a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/RiskBusinessService.java b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/RiskBusinessService.java index abb23270c..74a62881f 100644 --- a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/RiskBusinessService.java +++ b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/RiskBusinessService.java @@ -27,6 +27,20 @@ public interface RiskBusinessService { */ JSONObject getRiskEventsByPage(JSONObject params, JSONObject manager); + /** + * 风险事件按行业分析 + * @param params + * @return + */ + List analysisByIndustry(JSONObject params, JSONObject manager); + + /** + * 风险事件列表按金额分析 + * @param params + * @return + */ + List analysisByAmount(JSONObject params, JSONObject manager); + /** * 风险事件详情 * @param riskId @@ -115,4 +129,6 @@ public interface RiskBusinessService { JSONObject riskEventMaterialPass(JSONObject params, JSONObject manager); JSONObject updateIsSendClient(String riskId); + + void completeOrderAmount(); } diff --git a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java index 177ad51f0..e7b9798fc 100644 --- a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/core/impl/RiskBusinessServiceImpl.java @@ -10,6 +10,7 @@ import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskEventMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskFileMapper; import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskMaterialMapper; +import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskOrdersMapper; import au.com.royalpay.payment.manage.mappers.system.ClientDeviceTokenMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.ClientBDMapper; @@ -107,6 +108,8 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo @Resource private RiskFileMapper riskFileMapper; @Resource + private RiskOrdersMapper riskOrdersMapper; + @Resource private ClientDeviceTokenMapper clientDeviceTokenMapper; @Resource private AppMessageLogMapper appMessageLogMapper; @@ -179,6 +182,49 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo return PageListUtils.buildPageListResult(riskEvents); } + @Override + public List analysisByIndustry(JSONObject params, JSONObject manager) { + List industryAnalysis = riskEventMapper.analysisByIndustry(params); + for(JSONObject industry:industryAnalysis){ + if(StringUtils.isBlank(industry.getString("industry"))){ + industry.put("industry","未知行业"); + } + } + return industryAnalysis; + } + + private List industryArray(){ + List industryArray = new ArrayList<>(); + industryArray.add("鞋包服饰"); + industryArray.add("机票行业"); + industryArray.add("软件服务"); + industryArray.add("旅游票务"); + industryArray.add("国际租车"); + industryArray.add("医疗服务(出国)"); + industryArray.add("医疗服务(不出国)"); + industryArray.add("留学教育(网络教育)"); + industryArray.add("留学教育(一年及以下)"); + industryArray.add("其它货物贸易行业"); + industryArray.add("文具/办公用品"); + industryArray.add("综合商城"); + industryArray.add("酒店行业"); + industryArray.add("教育行业"); + industryArray.add("国际物流"); + industryArray.add("数码电器"); + industryArray.add("母婴"); + industryArray.add("化妆品"); + industryArray.add("食品"); + industryArray.add("留学教育(一年以上)"); + industryArray.add("其它服务行业"); + industryArray.add("未知行业"); + return industryArray; + } + + @Override + public List analysisByAmount(JSONObject params, JSONObject manager) { + return riskEventMapper.analysisByAmount(params); + } + @Override public JSONObject getRiskEventDetail(String riskId) { @@ -266,7 +312,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo // 将订单order_id存入数据库方便后面快速查询 JSONObject orderInfo = transactionList.get(0); realOrderIdList.add(orderInfo.getString("order_id")); - orderAmountList.add(orderInfo.getString("transaction_amount")); + orderAmountList.add(orderInfo.getString("clearing_amount")); } params.put("order_amounts", StringUtils.join(orderAmountList, ",")); params.put("real_order_ids", StringUtils.join(realOrderIdList, ",")); @@ -278,6 +324,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo public void addRiskEvent(JSONObject params, JSONObject manager) { params = getEvent(params); riskEventMapper.save(params); + setRiskOrders(params); params = riskEventMapper.findAll(params).get(0); riskProcessLogService.addRiskProcessLog(params.getString("risk_id"), params.getString("fillin_id"), @@ -287,10 +334,27 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo RiskResultTypeEnum.NOT_HANDLED.getResultType()); } + private void setRiskOrders(JSONObject params){ + if(StringUtils.isNotBlank(params.getString("order_ids"))){ + String riskId = params.getString("risk_id"); + String orderIds = params.getString("real_order_ids"); + for(String orderId : orderIds.split(",")){ + JSONObject order = transactionMapper.findByOrderId(orderId); + JSONObject riskOrder = new JSONObject(); + riskOrder.put("risk_id",riskId); + riskOrder.put("order_id",orderId); + riskOrder.put("clearing_amount",order.getString("clearing_amount")); + riskOrdersMapper.save(riskOrder); + } + } + } + @Override public void updateRiskEvent(JSONObject params) { params = getEvent(params); riskEventMapper.update(params); + riskOrdersMapper.clearOrders(params.getString("risk_id")); + setRiskOrders(params); } @Override @@ -930,4 +994,23 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo event = riskEventMapper.findById(riskId); return event; } + + @Override + public void completeOrderAmount() { + List riskEventList = getRiskEvents(null); + for(JSONObject riskEvent:riskEventList){ + if(riskEvent.getIntValue("order_type")==4 || StringUtils.isBlank(riskEvent.getString("real_order_ids"))){ + continue; + } + String[] order_ids=riskEvent.getString("real_order_ids").split(","); + for(String orderId : order_ids){ + JSONObject transaction = transactionMapper.findByOrderId(orderId); + JSONObject riskOrder = new JSONObject(); + riskOrder.put("risk_id",riskEvent.getString("risk_id")); + riskOrder.put("order_id",transaction.getString("order_id")); + riskOrder.put("clearing_amount",transaction.getString("clearing_amount")); + riskOrdersMapper.save(riskOrder); + } + } + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/web/RiskBusinessController.java b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/web/RiskBusinessController.java index a0159e385..b589de9fb 100644 --- a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/web/RiskBusinessController.java +++ b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/web/RiskBusinessController.java @@ -46,6 +46,18 @@ public class RiskBusinessController { return riskBusinessService.getRiskEventsByPage(params, manager); } + @GetMapping(value = "events/analysis/industry") + public List analysisByIndustry(RiskEventQuery riskEventQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + JSONObject params = riskEventQuery.toJSON(); + return riskBusinessService.analysisByIndustry(params, manager); + } + + @GetMapping(value = "events/analysis/amount") + public List analysisByAmount(RiskEventQuery riskEventQuery, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + JSONObject params = riskEventQuery.toJSON(); + return riskBusinessService.analysisByAmount(params, manager); + } + @GetMapping(value = "events/{risk_id}") public JSONObject getRiskEventDetail(@PathVariable("risk_id") String riskId, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { @@ -160,5 +172,11 @@ public class RiskBusinessController { public JSONObject updateRiskEventIsSendClient(@RequestParam("risk_id") String riskId) { return riskBusinessService.updateIsSendClient(riskId); } + + @GetMapping(value = "/complete/event/order_amount") + public String completeOrderAmount() { + riskBusinessService.completeOrderAmount(); + return "SUCCESS"; + } } diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.xml index 663a6004a..e188bec19 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/riskbusiness/RiskEventMapper.xml @@ -33,26 +33,11 @@ LEFT JOIN sys_clients sc ON re.client_moniker = sc.client_moniker - RIGHT JOIN( - SELECT distinct re.risk_id - FROM - risk_event re, - risk_event_help reh - - reh.risk_event_help_id < (LENGTH(re.order_amounts) - LENGTH(REPLACE(re.order_amounts, ',' , ''))) + 1 - - AND cast(SUBSTRING_INDEX(SUBSTRING_INDEX(order_amounts,',',reh.risk_event_help_id + 1),',',-1) as signed) >= #{start_amount} - - - - AND cast(SUBSTRING_INDEX(SUBSTRING_INDEX(order_amounts,',',reh.risk_event_help_id + 1),',',-1) as signed) <= #{end_amount} - - - - ) temp - on re.risk_id = temp.risk_id + RIGHT JOIN + (SELECT DISTINCT(risk_id) FROM risk_orders + WHERE #{start_amount} <= clearing_amount AND #{end_amount} > clearing_amount) ro + ON re.risk_id = ro.risk_id - INNER JOIN( SELECT DISTINCT client_id @@ -184,24 +169,10 @@ LEFT JOIN sys_clients sc ON re.client_moniker = sc.client_moniker - RIGHT JOIN( - SELECT distinct re.risk_id - FROM - risk_event re, - risk_event_help reh - - reh.risk_event_help_id < (LENGTH(re.order_amounts) - LENGTH(REPLACE(re.order_amounts, ',' , ''))) + 1 - - AND cast(SUBSTRING_INDEX(SUBSTRING_INDEX(order_amounts,',',reh.risk_event_help_id + 1),',',-1) as signed) >= #{start_amount} - - - - AND cast(SUBSTRING_INDEX(SUBSTRING_INDEX(order_amounts,',',reh.risk_event_help_id + 1),',',-1) as signed) <= #{end_amount} - - - - ) temp - on re.risk_id = temp.risk_id + RIGHT JOIN + (SELECT DISTINCT(risk_id) FROM risk_orders + WHERE #{start_amount} <= clearing_amount AND #{end_amount} > clearing_amount) ro + ON re.risk_id = ro.risk_id @@ -270,7 +241,89 @@ GROUP BY sc.industry - + diff --git a/src/main/ui/static/analysis/risk_business.js b/src/main/ui/static/analysis/risk_business.js index e05f95423..bfeeba04d 100644 --- a/src/main/ui/static/analysis/risk_business.js +++ b/src/main/ui/static/analysis/risk_business.js @@ -166,6 +166,10 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], $scope.riskEventsByIndustry = resp.data; $scope.risk_industry_chart = chartParser.parse(industryAmount(industries),$scope.riskEventsByIndustry); }); + $http.get('/risk/business/events/analysis/amount', {params: params}).then(function (resp) { + $scope.riskEventsByAmount = resp.data; + $scope.risk_amount_chart = chartParser.parse(intervalsAmount(),$scope.riskEventsByAmount); + }); }; @@ -187,7 +191,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], basic: { name: '风控事件单量', type: 'pie', radius: '80%', - center: ['50%', '60%'], + center: ['50%', '58%'], label:{ //饼图图形上的文本标签 normal:{ show:true, @@ -212,6 +216,50 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], } }; + var intervalsAmount = function () { + return { + chart: { + tooltip: { + trigger: 'item', + formatter: "{a}
{b} : {c}" + }, + // color: colors, + legend: { + orient: 'vertical', + left: 'right', + data: [ '0-500','500-1000','1000-1500','1500-2000','2000-2500','2500-3000','3000-3500','3500-4000','4000-4500','4500-5000','5000-5500','5500-6000', + '6000-6500','6500-7000','7000-7500','7500-8000','8000-8500','8500-9000','>9000'] + } + }, + series: [{ + basic: { + name: '风控事件单量', type: 'pie', + radius: '80%', + center: ['50%', '58%'], + label:{ //饼图图形上的文本标签 + normal:{ + show:true, + position:'outer', //标签的位置 + textStyle : { + fontWeight : 300 , + fontSize : 16 //文字的字体大小 + }, + formatter:'{d}%' + } + }, + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + }, + column: {key: 'amount', name: 'intervals'} + }] + } + }; + $scope.loadRiskEvents(1); } ]); diff --git a/src/main/ui/static/analysis/templates/risk_business.html b/src/main/ui/static/analysis/templates/risk_business.html index 6f21c1e85..8c06c882d 100644 --- a/src/main/ui/static/analysis/templates/risk_business.html +++ b/src/main/ui/static/analysis/templates/risk_business.html @@ -303,12 +303,12 @@

行业占比

+ ng-class="{nodata:risk_industry_chart.nodata}">

金额分布

-
+