master
lujian 6 years ago
parent 91d51e4629
commit 5454ec2ac0

@ -2,6 +2,8 @@ package au.com.royalpay.payment.manage.riskbusiness.core.impl;
import au.com.royalpay.payment.core.exceptions.EmailException;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.exceptions.OrderNotExistsException;
import au.com.royalpay.payment.core.exceptions.OrderNotMatchException;
import au.com.royalpay.payment.manage.mappers.log.AppMessageLogMapper;
import au.com.royalpay.payment.manage.mappers.payment.OrderMapper;
import au.com.royalpay.payment.manage.mappers.riskbusiness.RiskEventMapper;
@ -108,7 +110,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
@Override
public JSONObject getRiskEventsByPage(JSONObject params, JSONObject manager) {
// 如果登录的角色是BD添加查询条件result_type为1或者4order_type为1或者2
// 如果登录的角色是BD添加查询条件result_type为1,2,3,4order_type为1或者2
if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) {
params.put("bd_id", manager.getString("manager_id"));
List<Integer> orderTypes = Arrays.asList(RiskOrderTypeEnum.WECHAT_ORDER.getOrderType(),
@ -116,6 +118,8 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
params.put("order_types", orderTypes);
List<Integer> resultTypes = Arrays.asList(RiskResultTypeEnum.SEND_EMAIL_TO_BD.getResultType(),
RiskResultTypeEnum.WAIT_FOR_AUDIT.getResultType(),
RiskResultTypeEnum.MATERIAL_AUDIT_PASS.getResultType(),
RiskResultTypeEnum.MATERIAL_NOT_PASS.getResultType());
params.put("result_types", resultTypes);
}
@ -178,7 +182,15 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
List<String> orderAmountList = new ArrayList<>();
for (int i = 0; i < orderIdArray.length; i++) {
JSONObject orderInfo = orderMapper.findOrderById(orderIdArray[i]);
orderAmountList.add(orderInfo.getString("total_amount"));
// 判断该笔订单是否存在,是否属于该商户
if (orderInfo == null)
throw new OrderNotExistsException();
else {
if (!clientMoniker.equals(orderInfo.getString("partner_code"))) {
throw new OrderNotMatchException();
}
orderAmountList.add(orderInfo.getString("total_amount"));
}
}
params.put("order_amounts", StringUtils.join(orderAmountList, ","));
}
@ -605,7 +617,7 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo
}
if (noticeFlag) {
String msg = LocaleSupport.localeMessage("todo.bd.order");
notices.add(new TodoNotice("riskBusiness", msg, "#/analysis/monitoring/risk_business"));
notices.add(new TodoNotice("riskBusiness", msg, "#/analysis/monitoring/risk_business_bd"));
}
}
}

@ -68,24 +68,27 @@
<if test="client_moniker != null">
AND re.client_moniker = #{client_moniker}
</if>
<if test="order_type != null and order_types == null">
AND re.order_type = #{order_type}
</if>
<if test="order_types != null">
<foreach collection="order_types" item="order_type" open="and re.order_type in (" close=")" separator=",">
#{order_type}
<foreach collection="order_types" item="order_type_item" open="and re.order_type in (" close=")" separator=",">
#{order_type_item}
</foreach>
</if>
<if test="result_type != null and result_types == null">
AND re.result_type = #{result_type}
<if test="order_type != null">
AND re.order_type = #{order_type}
</if>
<if test="result_types != null">
<foreach collection="result_types" item="result_type" open="AND re.result_type IN (" close=")" separator=",">
#{result_type}
<foreach collection="result_types" item="result_type_item" open="AND re.result_type IN (" close=")" separator=",">
#{result_type_item}
</foreach>
</if>
<if test="result_type != null">
AND re.result_type = #{result_type}
</if>
<if test="order_ids != null">
AND re.order_ids LIKE CONCAT('%', #{order_ids}, '%')
</if>

@ -23,10 +23,16 @@
<a ui-sref="analysis_monitoring.risk_manager"><i class="fa fa-tv"></i> <span>风控记录|Risk Records</span></a>
</li>
<li ui-sref-active-eq="active" ng-if="('riskBusiness'|withModule)">
<!-- 风控 -->
<li ui-sref-active-eq="active" ng-if="('riskBusiness'|withModule) && ('10' | withRole)">
<a ui-sref="analysis_monitoring.risk_business"><i class="fa fa-tv"></i> <span>风控业务|Risk Business</span></a>
</li>
<!-- BD -->
<li ui-sref-active-eq="active" ng-if="('riskBusiness'|withModule) && ('100' | withRole)">
<a ui-sref="analysis_monitoring.risk_business_bd"><i class="fa fa-tv"></i> <span>风控业务|Risk Business</span></a>
</li>
</ul>
</div>
</div>

@ -12,6 +12,11 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
"5": "通用号调单"
};
var orderTypesMapForBD = {
"1": "微信调单",
"2": "支付宝调单"
};
var royalpayOrderTypesMap = {
"0": "正常调单",
"1": "单纯大金额频繁刷单"
@ -40,6 +45,14 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
"5": "已处理"
};
var resultTypeSearchMapForBD = {
"1": "材料待上传",
"2": "材料已提交",
"3": "材料通过",
"4": "材料打回",
"5": "已处理"
};
var emailStatusMap = {
"0": "未发送",
"1": "已发送",
@ -66,6 +79,11 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
templateUrl: '/static/analysis/templates/risk_business.html',
cache: false,
controller: 'riskBusinessCtrl'
}).state('analysis_monitoring.risk_business_bd', {
url: '/risk_business_bd',
templateUrl: '/static/analysis/templates/risk_business_bd.html',
cache: false,
controller: 'riskBusinessCtrl'
}).state('analysis_monitoring.riskEvent_detail', {
url: '/{risk_id}/detail',
templateUrl: '/static/analysis/templates/riskEvent_detail.html',
@ -75,6 +93,15 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
return $http.get('/risk/business/events/' + $stateParams.risk_id);
}]
}
}).state('analysis_monitoring.riskEvent_detail_bd', {
url: '/{risk_id}/bd/detail',
templateUrl: '/static/analysis/templates/riskEvent_detail_bd.html',
controller: 'riskEventDetailCtrl',
resolve: {
riskEvent: ['$http', '$stateParams', function ($http, $stateParams) {
return $http.get('/risk/business/events/' + $stateParams.risk_id);
}]
}
}).state('analysis_monitoring.risk_business.new_riskEvent', {
url: '/new_riskEvent',
templateUrl: '/static/analysis/templates/new_riskEvent.html',
@ -83,11 +110,6 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
url: '/audit_material',
templateUrl: '/static/analysis/templates/audit_material.html',
controller: 'auditMaterialCtrl'
}).state('analysis_monitoring.riskEvent_detail.upload_material', {
url: '/upload_material',
templateUrl: '/static/analysis/templates/bd_upload_material.html',
cache: false,
controller: 'bdUploadMaterialCtrl'
});
}]);
@ -95,7 +117,10 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
app.controller('riskBusinessCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'commonDialog', 'industryMap',
function ($scope, $state, $http, $uibModal, $filter, commonDialog, industryMap) {
$scope.orderTypes = orderTypesMap;
$scope.resultTypes = resultTypeSearchMap;
$scope.orderTypesForBD = orderTypesMapForBD;
$scope.resultTypes = resultTypesMap;
$scope.resultSearchTypes = resultTypeSearchMap;
$scope.resultTypesForBD = resultTypeSearchMapForBD;
$scope.industries = industryMap.configs();
$scope.amountSection = amountSectionMap;
$scope.pagination = {};
@ -122,11 +147,11 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}
]);
app.controller('riskEventDetailCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'commonDialog', 'riskEvent',
function ($scope, $state, $http, $uibModal, $filter, commonDialog, riskEvent) {
app.controller('riskEventDetailCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'Upload', 'commonDialog', 'riskEvent',
function ($scope, $state, $http, $uibModal, $filter, Upload, commonDialog, riskEvent) {
$scope.orderTypes = orderTypesMap;
$scope.resultTypes = resultTypesMap;
$scope.riskEvent = riskEvent.data;
// 获取数据库中对应的渠道字段
var orderChannel = 'enable_';
@ -254,11 +279,172 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
})
})
};
// 以下为BD上传材料相关
$scope.material={};
$scope.material.update_time=$filter('date')(new Date(), 'yyyy-MM-dd HH:mm:ss');
$scope.material.risk_id = $scope.riskEvent.risk_id;
$scope.uploadFile1 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file1Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file1Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file1Progress.value = value/(files.length*2);
})
}
$scope.material.file1_url = urls;
}
};
$scope.uploadFile2 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file2Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file2Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file2Progress.value = value/(files.length*2);
})
}
$scope.material.file2_url = urls;
}
};
$scope.uploadFile3 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file3Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file3Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file3Progress.value = value/(files.length*2);
})
}
$scope.material.file3_url = urls;
}
};
$scope.uploadFile4 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file4Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file4Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file4Progress.value = value/(files.length*2);
})
}
$scope.material.file4_url = urls;
}
};
$scope.uploadFile5 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file5Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file5Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file5Progress.value = value/(files.length*2);
})
}
$scope.material.file5_url = urls;
}
};
$scope.uploadFile6 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file6Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file6Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file6Progress.value = value/(files.length*2);
})
}
$scope.material.file6_url = urls;
}
};
$scope.submit = function (form) {
var codeKey = $scope.riskEvent.submit_url.substring($scope.riskEvent.submit_url.lastIndexOf('/') + 1);
$http.post('/risk/upload/' + codeKey, $scope.material).then(function (resp) {
commonDialog.alert({
title: 'Success',
content: 'Submit successfully',
type: 'success'
});
$state.go('analysis_monitoring.risk_business_bd');
}, function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'error'
});
});
}
}
]);
app.controller('auditMaterialCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', 'commonDialog',
function ($scope, $state, $http, $uibModal, $filter, commonDialog) {
app.controller('auditMaterialCtrl', ['$scope', '$state', '$http', '$uibModal', '$filter', '$sce', 'commonDialog',
function ($scope, $state, $http, $uibModal, $filter, $sce, commonDialog) {
// 一键下载功能
$scope.downloadAsZip = function () {
@ -291,17 +477,24 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
$scope.auditMaterial = function(auditType) {
var url = '/risk/business/events';
var warningMessageHTML = '是否确定<span style="color: green; font-weight: bolder; font-size: 20px;">通过</span>该材料?';
if (auditType == 4) {
url = '/risk/business/' + $scope.riskEvent.risk_id + '/refuse'
url = '/risk/business/' + $scope.riskEvent.risk_id + '/refuse';
warningMessageHTML = '是否确定<span style="color: red; font-weight: bolder; font-size: 20px;">拒绝</span>该材料?'
}
$scope.riskEvent.result_type = auditType;
$http.put(url, $scope.riskEvent).then(function (resp) {
$state.go('^', {}, {reload: true});
}, function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'error'
commonDialog.confirm({
title: 'Warning',
contentHtml: $sce.trustAsHtml(warningMessageHTML)
}).then(function () {
$scope.riskEvent.result_type = auditType;
$http.put(url, $scope.riskEvent).then(function (resp) {
$state.go('^', {}, {reload: true});
}, function (resp) {
commonDialog.alert({
title: 'Error',
content: resp.data.message,
type: 'error'
});
});
});
}
@ -372,164 +565,6 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
}
]);
app.controller('bdUploadMaterialCtrl', ['$scope','$http','Upload','$filter',function ($scope,$http,Upload,$filter) {
$scope.clientInfo = $scope.riskEvent.clientInfo;
$scope.material={};
$scope.material.update_time=$filter('date')(new Date(), 'yyyy-MM-dd HH:mm:ss');
$scope.material.risk_id = $scope.riskEvent.risk_id;
$scope.uploadFile1 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file1Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file1Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file1Progress.value = value/(files.length*2);
})
}
$scope.material.file1_url = urls;
}
};
$scope.uploadFile2 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file2Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file2Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file2Progress.value = value/(files.length*2);
})
}
$scope.material.file2_url = urls;
}
};
$scope.uploadFile3 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file3Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file3Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file3Progress.value = value/(files.length*2);
})
}
$scope.material.file3_url = urls;
}
};
$scope.uploadFile4 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file4Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file4Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file4Progress.value = value/(files.length*2);
})
}
$scope.material.file4_url = urls;
}
};
$scope.uploadFile5 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file5Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file5Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file5Progress.value = value/(files.length*2);
})
}
$scope.material.file5_url = urls;
}
};
$scope.uploadFile6 = function (files) {
if (files && files.length) {
var urls = new Array();
var value = 0;
$scope.file6Progress = {value: 0};
for (var i = 0; i < files.length; i++) {
var file = files[i];
Upload.upload({
url: '/attachment/riskFiles',
data: {file: file}
}).then(function (resp) {
urls.push(resp.data.url);
}, function (resp) {
delete $scope.file6Progress;
alert('Upload Failed');
}, function (evt) {
value += parseInt(100 * evt.loaded / evt.total );
$scope.file6Progress.value = value/(files.length*2);
})
}
$scope.material.file6_url = urls;
}
};
$scope.submit = function (form) {
var codeKey = $scope.riskEvent.submit_url.substring($scope.riskEvent.submit_url.lastIndexOf('/') + 1);
$http.post('/risk/upload/' + codeKey, $scope.material).then(function (resp) {
// commonDialog.alert({title: 'Success', content: 'Submit successfully', type: 'success'});
alert('Submit successfully');
window.location.href="/risk_upload_success.html";
}, function (resp) {
alert('Submit failed');
// commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
});
}
}]);
// 调单类型过滤器
app.filter('orderType', function() {
return function(type) {
@ -551,7 +586,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'],
// 处理结果过滤器
app.filter('resultType', function() {
return function(type) {
return function(type, resultTypesMap) {
return resultTypesMap[type];
}
});

@ -6,19 +6,16 @@
<li ui-sref-active-eq="active">
<a ui-sref="analysis_monitoring.riskEvent_detail" ui-sref-opts="{reload:true}">Risk Detail</a>
</li>
<li ui-sref-active="active" ng-if="'10'|withRole">
<li ui-sref-active="active">
<a ui-sref=".audit_material" ui-sref-opts="{reload:true}">Audit material</a>
</li>
<li ui-sref-active="active" ng-if="('100'|withRole) && (riskEvent.result_type == 1 || riskEvent.result_type == 4)">
<a ui-sref=".upload_material" ui-sref-opts="{reload:true}">Upload Material</a>
</li>
</ul>
<div class="tab-content" ui-view>
<div class="row" ng-if="!editFlag">
<div class="col-sm-12">
<div class="nav-tabs-custom">
<div class="tab-content">
<div ng-if="'10'|withRole" class="panel panel-default">
<div class="panel panel-default">
<div class="panel-heading">
RiskEvent Basic Information
<a role="button"
@ -95,7 +92,7 @@
<label class="control-label col-sm-2">Result Type</label>
<div class="col-sm-10">
<p class="form-control-static">
{{riskEvent.result_type | resultType}}
{{riskEvent.result_type | resultType:resultTypes}}
</p>
</div>
</div>
@ -203,6 +200,15 @@
</button>
</div>
</div>
<div class="form-group" ng-if="riskEvent.channel_result != null">
<label class="control-label col-sm-2">Channel Handle Result</label>
<div class="col-sm-10">
<p class="form-control-static">
{{riskEvent.channel_result}}
</p>
</div>
</div>
</div>
</div>
</div>
@ -252,25 +258,16 @@
</div>
</div>
<div ng-if="'10'|withRole">
<a role="button"
ng-if="riskEvent.result_type <= 1 && riskEvent.order_type < 4"
class="btn btn-info"
ng-click="resendUploadEmail()">Send Email {{riskEvent.result_type == 1 ? 'again' : ''}}
</a>
<a role="button"
ng-if="riskEvent.order_type == 4 && riskEvent.result_type == 0"
class="btn btn-info"
ng-click="resendUploadEmail()">Send Warning Email
</a>
</div>
<a role="button"
ng-if="riskEvent.result_type <= 1 && riskEvent.order_type < 4"
class="btn btn-info"
ng-click="resendUploadEmail()">Send Email {{riskEvent.result_type == 1 ? 'again' : ''}}
</a>
<a role="button"
ng-if="('100'|withRole) && (riskEvent.result_type == 1 || riskEvent.result_type == 4)"
ng-if="riskEvent.order_type == 4 && riskEvent.result_type == 0"
class="btn btn-info"
ui-sref=".upload_material">
Upload Material
ng-click="resendUploadEmail()">Send Warning Email
</a>
<a role="button"
@ -447,7 +444,7 @@
<div class="form-group">
<label class="control-label col-sm-2"
for="channel-result-input">渠道处理结果
for="channel-result-input">Channel Handle Result
</label>
<div class="col-sm-8">
<input class="form-control"

@ -0,0 +1,256 @@
<div class="content">
<div class="row">
<div class="col-sm-12">
<!-- 调单信息 -->
<div class="box">
<div class="box-header">
<h3 class="box-title" style="display: inherit">
Orders Information
</h3>
</div>
<div class="box-body table-responsive">
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>Order ID</th>
<th>Amount</th>
<th>Input Amount</th>
<th>AUD Amount</th>
<th>Exchange Rate</th>
<th>Status</th>
<th>Create Time</th>
<th>Gateway</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="trade in tradeLogs"
ng-class="{warning:trade.clearing_status==2}">
<td>{{trade.order_id}}</td>
<td>{{trade.total_amount | currency: trade.currency}}</td>
<td ng-bind="trade.display_amount | currency: trade.currency"></td>
<td ng-bind="trade.clearing_amount | currency: 'AUD'"></td>
<td>
<span ng-if="(trade.channel != 'hf') && (trade.channel != 'Rpay')"
ng-bind="trade.exchange_rate">
</span>
<span ng-if="(trade.channel == 'hf') || (trade.channel == 'Rpay')"> - </span>
</td>
<td ng-bind="trade.status"></td>
<td ng-bind="trade.create_time"></td>
<td ng-bind="trade.gateway"></td>
</tr>
</tbody>
</table>
</div>
</div>
<a role="button"
ui-sref="analysis_monitoring.risk_business_bd"
class="btn btn-info">返回
</a>
</div>
</div>
</div>
<div class="register-box-body register-box-bg box">
<p class="text-info login-box-msg">{{clientInfo.short_name}}</p>
<form novalidate name="uploadForm">
<div class="panel-body">
<div class="form-horizontal">
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
1、物流公司发货单据照片
要求:每笔交易对应的物流单必须提供,且单据必须清晰可见<br>
Photos of logistics companies goods-delivery documents
Requirement: The logistics order record corresponding to each transaction must be provided,
and details of records should be clearly visible.
</p>
<p ng-if="riskEvent.order_type==3">
1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;<br>
Please explain the relative payment scenario/business activities,
for example, online store, QR code payment, payment at the store, etc;
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile1($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file1Progress.value" type="success" animate="true" ng-if="file1Progress.value" max="100"
>{{file1Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in material.file1_url" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
2、用户购买虚拟物品需要提供聊天记录、订单信息、发货凭证截图、
虚拟物品最终消费场景(例如何种游戏、软件)、提供消费场景网址/下载链接
要求:每笔交易对应的截图必须清晰可见<br>
Users need to provide chat records, order information, screenshots of delivery documents,
final consumption scenarios of virtual goods (such as games, software);
provide consumer scene URL / download link.
Requirement: The screenshot corresponding to each transaction must be clearly visible.
</p>
<p ng-if="riskEvent.order_type==3">
2.提供相应购物清单,订单小票(请提供与被查交易订单号相匹配的交易时间及金额的发票);<br>
Provide related shopping lists, invoices.
(Please provide the invoices, amount of which matches that of the abnormal transaction);
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile2($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file2Progress.value" type="success" animate="true" ng-if="file2Progress.value" max="100"
>{{file2Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in material.file2_url" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
3、购物小票/发票存根照片
照片应清晰,必须显示商户名称、商户地址、购物时间、物品名称
购物金额等<br>
Photos of shopping receipts/ invoice stubs
Requirement: The photos should be clear and must show Merchant name,
Business address, Transaction time, Product information, Quantity purchased, etc.
</p>
<p ng-if="riskEvent.order_type==3">
3.提供相应的发货证明,报关单(若有消费者在国内购买,请提供物流单据或报关单);<br>
Relative proof of delivery, customs declaration
(If the consumer purchased from China, please provide shipping receipt or customs declaration);
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile3($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file3Progress.value" type="success" animate="true" ng-if="file3Progress.value" max="100"
>{{file3Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in material.file3_url" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
4、显示商户门牌号码和店头名称的照片
要求:清晰可见,至少一张<br>
Photos of Merchant Street number & Merchant name
Requirement: At least one visible photo
</p>
<p ng-if="riskEvent.order_type==3">
4.提供您的门店照片(门店照及店铺内的照片各一张, 一张可以看到商户名的门头照,一张可以看到相关商品或服务的店内照片);<br>
Photos of the store ( one of each front-store and in-store);
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile4($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file4Progress.value" type="success" animate="true" ng-if="file4Progress.value" max="100"
>{{file4Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in material.file4_url" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p ng-if="riskEvent.order_type==1">
5、显示商户营业场景所场内部情况如店内商品陈列、收银台等的照片
要求:照片清晰,且能清楚显示商户实际售卖物品或服务,至少三张<br>
Photos of internal environment of merchant business
(such as in-store merchandise display, checkout counter, etc.)
Requirements: The photos (at least three)
showing merchant activities including actual selling-goods or services obviously
</p>
<p ng-if="riskEvent.order_type==3">
5.其他可以还原交易背景的资料,如和消费者的聊天记录等,来佐证被查单号交易的真实性;<br>
Other materials that can verify the payment scenario, for example,
chatting history, to prove the truth of the transactions;
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile5($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file5Progress.value" type="success" animate="true" ng-if="file5Progress.value" max="100"
>{{file5Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in material.file5_url" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12 text-left">
<p>6、其他图片<br>
Other pictures
</p>
</div>
<div class="col-sm-12">
<div class="col-xs-12">
<button class="btn btn-primary" type="button"
ngf-select="uploadFile6($files)" ngf-multiple="true">
<i class="fa fa-upload"></i> Upload
</button>
</div>
&nbsp;&nbsp;<br>
<div class="col-xs-12">
<uib-progressbar value="file6Progress.value" type="success" animate="true" ng-if="file6Progress.value" max="100"
>{{file6Progress.value}}%</uib-progressbar>
<img class="col-xs-3 logo-width" ng-repeat="url in material.file6_url" ng-src="{{url}}">
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Description</label>
<div class="col-sm-10">
<textarea class="form-control" required
ng-model="material.description" placeholder="No more than 500"
name="description"
maxlength="500"></textarea>
</div>
</div>
</div>
</div>
</form>
<div style="text-align: center">
<a role="button" style="margin-bottom: 25px;" class="btn btn-success btn-sm ng-scope" ng-disabled="!(material.description)"
ng-click="submit(uploadForm)">Submit</a>
</div>
</div>

@ -4,47 +4,8 @@
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<!--
<div class="form-inline">
<div class="form-horizontal">
<div class="form-group">
<label class="control-label"
for="partner-code-search">Partner Code
</label>
<input type="text"
class="form-control"
id="partner-code-search"
ng-model="params.clientMoniker">
</div>
<div class="form-group">
<label class="control-label"
for="order-type-input">Order Type
</label>
<select class="form-control"
name="order_type"
ng-model="params.orderType"
id="order-type-input"
ng-options="key as value for (key, value) in orderTypes">
<option value="">ALL</option>
</select>
</div>
<div class="form-group">
<label class="control-label"
for="order-ids-input">Order IDs
</label>
<input class="form-control"
ng-model="params.orderIds"
type="text"
name="order_ids"
id="order-ids-input">
</div>
</div>
-->
<div class="form-horizontal" ng-if="'10'|withRole">
<!--Partner Code-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
@ -67,6 +28,7 @@
<input type="text"
class="form-control"
id="sub-merchant-id-search"
placeholder="子商户号"
ng-model="params.subMerchantId">
</div>
</div>
@ -97,6 +59,7 @@
ng-model="params.orderIds"
type="text"
name="order_ids"
placeholder="多个订单请用逗号分隔"
id="order-ids-input">
</div>
</div>
@ -207,29 +170,36 @@
<table class="table table-striped">
<thead>
<tr>
<th>Partner Code</th>
<th>Partner</th>
<th>Order Type</th>
<th ng-if="'10'|withRole">Result Type</th>
<th>Result Type</th>
<th>Sub Merchant ID</th>
<th ng-if="'10'|withRole">Email Status</th>
<th ng-if="'10'|withRole">Risk Manager</th>
<th ng-if="'10'|withRole">Description</th>
<th ng-if="'10'|withRole">Create Time</th>
<th>Email Status</th>
<th>Description</th>
<th>Channel Result</th>
<th>Risk Manager</th>
<th>Create Time</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="riskEvent in riskEvents">
<td ng-bind="riskEvent.client_moniker"></td>
<td>
<a role="button" ui-sref="partners.detail({clientMoniker: riskEvent.client_moniker})">
{{riskEvent.short_name}}({{riskEvent.client_moniker}})
</a>
</td>
<td ng-bind="riskEvent.order_type | orderType"></td>
<td ng-if="'10'|withRole">
{{riskEvent.result_type | resultType}}
<td>
{{riskEvent.result_type | resultType:resultSearchTypes}}
</td>
<td ng-bind="riskEvent.sub_merchant_id"></td>
<td ng-if="'10'|withRole" ng-bind="riskEvent.email_status | emailStatus"></td>
<td ng-if="'10'|withRole" ng-bind="riskEvent.fillin_person"></td>
<td ng-if="'10'|withRole" ng-bind="riskEvent.description | limitTo:20"></td>
<td ng-if="'10'|withRole" ng-bind="riskEvent.create_time"></td>
<td ng-bind="riskEvent.email_status | emailStatus"></td>
<td ng-bind="riskEvent.description | limitTo:20"></td>
<td ng-bind="riskEvent.channel_result"></td>
<td ng-bind="riskEvent.fillin_person"></td>
<td ng-bind="riskEvent.create_time"></td>
<td>
<a class="text-primary"
role="button"

@ -0,0 +1,181 @@
<div class="content" ui-view>
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<div class="form-horizontal">
<!--Partner Code-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="partner-code-search">Partner Code
</label>
<div class="col-xs-6">
<input type="text"
class="form-control"
id="partner-code-search"
ng-model="params.clientMoniker">
</div>
</div>
<!--Sub Merchant ID-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="sub-merchant-id-search">Sub Merchant ID
</label>
<div class="col-xs-6">
<input type="text"
class="form-control"
id="sub-merchant-id-search"
placeholder="子商户号"
ng-model="params.subMerchantId">
</div>
</div>
<!--Order Type-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="order-type-input">Order Type
</label>
<div class="col-xs-6">
<select class="form-control"
name="order_type"
ng-model="params.orderType"
id="order-type-input"
ng-options="key as value for (key, value) in orderTypesForBD">
<option value="">ALL</option>
</select>
</div>
</div>
<!--Order IDs-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="order-ids-input">Order IDs
</label>
<div class="col-xs-6">
<input class="form-control"
ng-model="params.orderIds"
type="text"
name="order_ids"
placeholder="多个订单请用逗号分隔"
id="order-ids-input">
</div>
</div>
<!--Result Type-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="order-type-input">Result Type
</label>
<div class="col-xs-6">
<select class="form-control"
name="result_type"
ng-model="params.resultType"
id="result-type-input"
ng-options="key as value for (key, value) in resultTypesForBD">
<option value="">ALL</option>
</select>
</div>
</div>
<!--Industry-->
<div class="form-group col-sm-6">
<label class="control-label col-xs-4 col-sm-4"
for="industry-select">Industry</label>
<div class="col-xs-6">
<select ng-model="params.industry"
id="industry-select"
class="form-control"
ng-options="industry.value as industry.label for industry in industries">
<option value="">ALL</option>
</select>
</div>
</div>
<div class="col-xs-12">
<button class="btn btn-primary"
type="button"
ng-click="loadRiskEvents(1)">
<i class="fa fa-search"></i>Search
</button>
</div>
</div>
</div>
</div>
<div class="box">
<div class="box-header">
<h3 class="box-title">RiskEvent List</h3>
</div>
<div class="box-body no-padding table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Partner</th>
<th>Order Type</th>
<th>Result Type</th>
<th>Sub Merchant ID</th>
<th>Description</th>
<th>Channel Result</th>
<th>Risk Manager</th>
<th>Create Time</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="riskEvent in riskEvents">
<td>
<a role="button" ui-sref="partners.detail({clientMoniker: riskEvent.client_moniker})">
{{riskEvent.short_name}}({{riskEvent.client_moniker}})
</a>
</td>
<td ng-bind="riskEvent.order_type | orderType"></td>
<td ng-class="{'text-orange': (riskEvent.result_type == 1), 'text-green': (riskEvent.result_type == 3), 'text-red': (riskEvent.result_type == 4)}">
{{riskEvent.result_type | resultType:resultTypesForBD}}
</td>
<td ng-bind="riskEvent.sub_merchant_id"></td>
<td ng-bind="riskEvent.description | limitTo:20"></td>
<td ng-bind="riskEvent.channel_result"></td>
<td ng-bind="riskEvent.fillin_person"></td>
<td ng-bind="riskEvent.create_time"></td>
<td>
<a class="text-primary"
role="button"
title="Detail"
ui-sref="analysis_monitoring.riskEvent_detail_bd({risk_id:riskEvent.risk_id})">
<i class="fa fa-search"></i> Detail
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer"
ng-if="riskEvents.length">
<uib-pagination class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
items-per-page="pagination.limit"
max-size="10"
ng-change="loadRiskEvents()"
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;">
</uib-pagination>
<div class="row">
<div class="col-xs-12">
Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Loading…
Cancel
Save