From 5454ec2ac0c015d2de21697696105baced56be71 Mon Sep 17 00:00:00 2001 From: lujian Date: Wed, 31 Oct 2018 09:44:59 +0800 Subject: [PATCH] [fix] --- .../core/impl/RiskBusinessServiceImpl.java | 18 +- .../mappers/riskbusiness/RiskEventMapper.xml | 21 +- .../templates/analysis_monitoring.html | 8 +- src/main/ui/static/analysis/risk_business.js | 393 ++++++++++-------- .../analysis/templates/riskEvent_detail.html | 43 +- .../templates/riskEvent_detail_bd.html | 256 ++++++++++++ .../analysis/templates/risk_business.html | 76 +--- .../analysis/templates/risk_business_bd.html | 181 ++++++++ 8 files changed, 728 insertions(+), 268 deletions(-) create mode 100644 src/main/ui/static/analysis/templates/riskEvent_detail_bd.html create mode 100644 src/main/ui/static/analysis/templates/risk_business_bd.html 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 50105af90..c6755c2fb 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 @@ -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或者4,order_type为1或者2 + // 如果登录的角色是BD,添加查询条件result_type为1,2,3,4,order_type为1或者2 if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { params.put("bd_id", manager.getString("manager_id")); List orderTypes = Arrays.asList(RiskOrderTypeEnum.WECHAT_ORDER.getOrderType(), @@ -116,6 +118,8 @@ public class RiskBusinessServiceImpl implements RiskBusinessService, ManagerTodo params.put("order_types", orderTypes); List 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 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")); } } } 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 575f2e469..5f85a94da 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 @@ -68,24 +68,27 @@ AND re.client_moniker = #{client_moniker} - - AND re.order_type = #{order_type} - + - - #{order_type} + + #{order_type_item} - - AND re.result_type = #{result_type} + + AND re.order_type = #{order_type} + - - #{result_type} + + #{result_type_item} + + AND re.result_type = #{result_type} + + AND re.order_ids LIKE CONCAT('%', #{order_ids}, '%') 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 c170892ee..bc3a18f9d 100644 --- a/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html +++ b/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html @@ -23,10 +23,16 @@ 风控记录|Risk Records -
  • + +
  • 风控业务|Risk Business
  • + +
  • + 风控业务|Risk Business +
  • + diff --git a/src/main/ui/static/analysis/risk_business.js b/src/main/ui/static/analysis/risk_business.js index c1924b7f6..b3f5435d5 100644 --- a/src/main/ui/static/analysis/risk_business.js +++ b/src/main/ui/static/analysis/risk_business.js @@ -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 = '是否确定通过该材料?'; if (auditType == 4) { - url = '/risk/business/' + $scope.riskEvent.risk_id + '/refuse' + url = '/risk/business/' + $scope.riskEvent.risk_id + '/refuse'; + warningMessageHTML = '是否确定拒绝该材料?' } - $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]; } }); diff --git a/src/main/ui/static/analysis/templates/riskEvent_detail.html b/src/main/ui/static/analysis/templates/riskEvent_detail.html index 7e191973b..6245c3e35 100644 --- a/src/main/ui/static/analysis/templates/riskEvent_detail.html +++ b/src/main/ui/static/analysis/templates/riskEvent_detail.html @@ -6,19 +6,16 @@
  • Risk Detail
  • -
  • +
  • Audit material
  • -
  • - Upload Material -
  • - + Send Email {{riskEvent.result_type == 1 ? 'again' : ''}} + - Upload Material + ng-click="resendUploadEmail()">Send Warning Email +
    + +
    +
    +
    +
    +
    +

    + 1、物流公司发货单据照片 + 要求:每笔交易对应的物流单必须提供,且单据必须清晰可见
    + 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. +

    +

    + 1.请解释相应的消费场景/业务模式,例如网站商城,扫码支付, 消费者到店支付等;
    + Please explain the relative payment scenario/business activities, + for example, online store, QR code payment, payment at the store, etc; +

    +
    +
    +
    + +
    +   
    +
    + {{file1Progress.value}}% + +
    +
    +
    +
    +
    +

    + 2、用户购买虚拟物品需要提供聊天记录、订单信息、发货凭证截图、 + 虚拟物品最终消费场景(例如何种游戏、软件)、提供消费场景网址/下载链接 + 要求:每笔交易对应的截图必须清晰可见
    + 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. +

    +

    + 2.提供相应购物清单,订单小票(请提供与被查交易订单号相匹配的交易时间及金额的发票);
    + Provide related shopping lists, invoices. + (Please provide the invoices, amount of which matches that of the abnormal transaction); +

    +
    +
    +
    + +
    +   
    +
    + {{file2Progress.value}}% + +
    +
    + +
    +
    +
    +

    + 3、购物小票/发票存根照片 + 照片应清晰,必须显示商户名称、商户地址、购物时间、物品名称 + 购物金额等
    + 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. +

    +

    + 3.提供相应的发货证明,报关单(若有消费者在国内购买,请提供物流单据或报关单);
    + Relative proof of delivery, customs declaration + (If the consumer purchased from China, please provide shipping receipt or customs declaration); +

    +
    +
    +
    + +
    +   
    +
    + {{file3Progress.value}}% + +
    +
    +
    +
    +
    +

    + 4、显示商户门牌号码和店头名称的照片 + 要求:清晰可见,至少一张
    + Photos of Merchant Street number & Merchant name + Requirement: At least one visible photo +

    +

    + 4.提供您的门店照片(门店照及店铺内的照片各一张, 一张可以看到商户名的门头照,一张可以看到相关商品或服务的店内照片);
    + Photos of the store ( one of each front-store and in-store); +

    +
    +
    +
    + +
    +   
    +
    + {{file4Progress.value}}% + +
    +
    + +
    +
    +
    +

    + 5、显示商户营业场景所场内部情况(如店内商品陈列、收银台等)的照片 + 要求:照片清晰,且能清楚显示商户实际售卖物品或服务,至少三张
    + 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 +

    +

    + 5.其他可以还原交易背景的资料,如和消费者的聊天记录等,来佐证被查单号交易的真实性;
    + Other materials that can verify the payment scenario, for example, + chatting history, to prove the truth of the transactions; +

    +
    +
    +
    + +
    +   
    +
    + {{file5Progress.value}}% + +
    +
    + +
    +
    +
    +

    6、其他图片
    + Other pictures +

    +
    +
    +
    + +
    +   
    +
    + {{file6Progress.value}}% + +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    +
    + +
    + Submit +
    + +
    diff --git a/src/main/ui/static/analysis/templates/risk_business.html b/src/main/ui/static/analysis/templates/risk_business.html index 53e1629ca..27351ff86 100644 --- a/src/main/ui/static/analysis/templates/risk_business.html +++ b/src/main/ui/static/analysis/templates/risk_business.html @@ -4,47 +4,8 @@