From 2e44dd421413bdb107e1e0e896ac4ed2bd684494 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Mon, 23 Apr 2018 14:19:02 +0800 Subject: [PATCH 01/56] =?UTF-8?q?=E5=95=86=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0store=5Fphoto=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../merchants/beans/ClientRegisterInfo.java | 10 +++ .../static/payment/partner/partner-manage.js | 74 +++++++++++++++++-- .../partner/templates/add_partner.html | 45 ++++++++--- .../partner/templates/partner_detail.html | 21 ++++-- .../partner/templates/partner_edit.html | 34 +++++++-- 5 files changed, 152 insertions(+), 32 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java index be305c8fc..f5725e2ca 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java @@ -35,6 +35,8 @@ public class ClientRegisterInfo { private String alipayIndustry; @JSONField(name = "company_photo") private String companyPhoto; + @JSONField(name = "store_photo") + private String storePhoto; @JSONField(name = "company_website") private String companyWebsite; @JSONField(name = "company_phone") @@ -145,6 +147,14 @@ public class ClientRegisterInfo { this.companyPhoto = companyPhoto; } + public String getStorePhoto() { + return storePhoto; + } + + public void setStorePhoto(String storePhoto) { + this.storePhoto = storePhoto; + } + public String getCompanyWebsite() { return companyWebsite; } diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 549a40736..c6456d83c 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -385,6 +385,17 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter alert("Logo is necessary!"); return; } + if($scope.partner.partner_type == 'photo'){ + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary'); + return; + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary'); + return; + } + } + if ($scope.partner.referrer_id) { $scope.referrers.forEach(function (e) { if ($scope.partner.referrer_id == e.org_id) { @@ -423,18 +434,36 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.uploadShopPhoto = function (file) { if (file != null) { - $scope.photoProgress = {value: 0}; + $scope.shopPhotoProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.photoProgress; + delete $scope.shopPhotoProgress; $scope.partner.company_photo = resp.data.url; }, function (resp) { - delete $scope.photoProgress; + delete $scope.shopPhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + }; + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + $scope.storePhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.storePhotoProgress; + $scope.partner.store_photo = resp.data.url; + }, function (resp) { + delete $scope.storePhotoProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.photoProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); }) } }; @@ -895,6 +924,17 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter alert('suburb can not contain two and more continuous space characters'); return; } + if($scope.partner.partner_type == 'photo'){ + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary'); + return; + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary'); + return; + } + } + if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { if ($scope.partner.acn.length != 9) { alert('Acn is not valid'); @@ -954,18 +994,36 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.uploadShopPhoto = function (file) { if (file != null) { - $scope.photoProgress = {value: 0}; + $scope.shopPhotoProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.photoProgress; + delete $scope.shopPhotoProgress; $scope.partner.company_photo = resp.data.url; }, function (resp) { - delete $scope.photoProgress; + delete $scope.shopPhotoProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.photoProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + }; + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + $scope.storePhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.storePhotoProgress; + $scope.partner.store_photo = resp.data.url; + }, function (resp) { + delete $scope.storePhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); }) } }; diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 9dbb2a3fd..f6b5aba16 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -1,3 +1,9 @@ +

New Partner

diff --git a/src/main/ui/static/payment/merchantid/merchant_id_manager.js b/src/main/ui/static/payment/merchantid/merchant_id_manager.js new file mode 100644 index 000000000..5ea83d503 --- /dev/null +++ b/src/main/ui/static/payment/merchantid/merchant_id_manager.js @@ -0,0 +1,125 @@ +define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootSwitch', 'ngFileUpload', 'uiSelect'], function (angular) { + 'use strict'; + var app = angular.module('merchantIdManage', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ngFileUpload', 'ui.select']); + app.config(['$stateProvider', function ($stateProvider) { + $stateProvider.state('merchant_id_manage', { + url: '/merchant_id/manage', + templateUrl: '/static/payment/merchantid/templates/merchant_id_manage.html', + controller: 'merchantIdManageCtrl', + data: {label: '商户号列表'} + }) + }]); + app.controller('merchantIdManageCtrl', ['$scope', '$state', '$http', '$uibModal', 'commonDialog', function ($scope, $state, $http,$uibModal,commonDialog) { + $scope.pagination = {}; + $scope.params = {}; + + $scope.loadClient = function () { + $http.get('/sys/merchant_id').then(function (resp) { + $scope.clientsMap = resp.data + }); + }; + $scope.loadClient(); + $scope.loadNotTradeClient = function () { + $http.get('/sys/merchant_id/trade').then(function (resp) { + $scope.notTradeClientsMap = resp.data.merchant_id_map; + $scope.refresh_time = resp.data.refresh_time + }); + }; + $scope.loadNotTradeClient(); + + $scope.loadTempSubMerchantId = function () { + var params = angular.copy($scope.params); + if(!params.sub_merchant_id){ + delete params.sub_merchant_id; + } + $http.get('/sys/merchant_id/common_sub_merchant_id',{params: params}).then(function (resp) { + $scope.subMerchantIdList= resp.data; + }); + }; + $scope.loadTempSubMerchantId(); + $scope.showClient = function (sub_merchant_id) { + $uibModal.open({ + templateUrl: '/static/payment/merchantid/templates/client_sub_merchant_id.html', + controller: 'showClientsCtrl', + resolve: { + clients: ['$http', function ($http) { + return $http.get('/sys/merchant_id/'+sub_merchant_id); + }] + }, + size: 'sm' + }) + }; + + $scope.showNotTradeClient = function (sub_merchant_id) { + $uibModal.open({ + templateUrl: '/static/payment/merchantid/templates/client_sub_merchant_id.html', + controller: 'showNotTradeClientsCtrl', + resolve: { + clients: ['$http', function ($http) { + return $http.get('/sys/merchant_id/not_trade/'+sub_merchant_id); + }] + }, + size: 'sm' + }) + }; + $scope.refresh = function () { + $http.post('/sys/merchant_id/refresh').then(function (resp) { + $scope.loadNotTradeClient(); + }); + }; + + $scope.save = function () { + $uibModal.open({ + templateUrl: '/static/payment/merchantid/templates/new_common_sub_merchant_id.html', + controller: 'newCommonSubMerchantIdCtrl' + }).result.then(function () { + $scope.loadTempSubMerchantId() + }) + } + $scope.disable = function (sub_merchant_id) { + $http.put('/sys/merchant_id/common_sub_merchant_id/'+sub_merchant_id).then(function (resp) { + commonDialog.alert({title: 'Success', content: 'Success', type: 'success'}); + $scope.loadTempSubMerchantId(); + },function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }); + } + + + }]); + + app.controller('showClientsCtrl', ['$scope', '$http','clients', function ($scope, $http,clients) { + $scope.clients = clients.data; + }]); + app.controller('showNotTradeClientsCtrl', ['$scope', '$http','clients', function ($scope, $http,clients) { + $scope.clients = clients.data; + }]); + app.controller('newCommonSubMerchantIdCtrl', ['$scope', '$http','commonDialog','$state', function ($scope, $http,commonDialog,$state) { + $scope.params = {}; + $scope.saveSubMerchantId = function () { + var params = angular.copy($scope.params); + $http.post('/sys/merchant_id/common_sub_merchant_id/'+params.sub_merchant_id).then(function () { + $scope.$close(); + commonDialog.alert({title: 'Success', content: '保存成功', type: 'success'}); + },function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }); + }; + }]); + + app.filter('choose_merchant_id', function () { + return function (value) { + switch (value + '') { + case '1307485301': + return '1307485301(Tunnel Show1)'; + case '1431999902': + return '1431999902(Tunnel Show2)'; + case '1487387142': + return '1487387142(NAP)'; + case '': + return '' + } + } + }); + return app; +}); \ No newline at end of file diff --git a/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html b/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html new file mode 100644 index 000000000..cb03f3f6e --- /dev/null +++ b/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html @@ -0,0 +1,11 @@ + + diff --git a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html new file mode 100644 index 000000000..c09f8a6ed --- /dev/null +++ b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html @@ -0,0 +1,114 @@ + +
+
+

Merchant Id Manage

+ +
+ +
+
+
+ + + + + +
+
+
+ + 上次刷新时间:{{refresh_time}} +    + + + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
Merchant IdSub Merchant IdOperatorCreate TimeOperation
+ {{client.sub_merchant_id}} + + + Disable +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/main/ui/static/config/devtools/templates/new_common_sub_merchant_id.html b/src/main/ui/static/payment/merchantid/templates/new_common_sub_merchant_id.html similarity index 100% rename from src/main/ui/static/config/devtools/templates/new_common_sub_merchant_id.html rename to src/main/ui/static/payment/merchantid/templates/new_common_sub_merchant_id.html From 03477c83f023095c3155944e639070d0bcd6d2fb Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Thu, 26 Apr 2018 16:35:49 +0800 Subject: [PATCH 14/56] fix~ --- .../ui/static/payment/tradelog/templates/balance_report.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index eeb71a0a7..8ad21e1a6 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -277,7 +277,7 @@ - + Date: Thu, 26 Apr 2018 16:43:43 +0800 Subject: [PATCH 15/56] fix~ --- src/main/ui/manage.html | 10 +++++----- .../merchantid/templates/merchant_id_manage.html | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/ui/manage.html b/src/main/ui/manage.html index 03e51ab7c..3ff5ae275 100644 --- a/src/main/ui/manage.html +++ b/src/main/ui/manage.html @@ -235,11 +235,6 @@ margin-bottom: 10%;"/> -
  • - - 商户号管理 - -
  • @@ -399,6 +394,11 @@ margin-bottom: 10%;"/>
  • +
  • + + 商户号管理 + +
  • 组织管理|Organizations diff --git a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html index c09f8a6ed..182febf89 100644 --- a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html +++ b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html @@ -21,11 +21,11 @@
    -
    +
    -
    {{key|choose_merchant_id}} - {{client.sub_merchant_id}}  Date: Thu, 26 Apr 2018 17:35:26 +0800 Subject: [PATCH 16/56] fix~ --- .../manage/merchantid/core/impl/MerchantIdManageServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java index e21e043bb..e8c4d2c9b 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java @@ -120,6 +120,7 @@ public class MerchantIdManageServiceImpl implements MerchantIdManageService { JSONObject record = new JSONObject(); record.put("sub_merchant_id",sub_merchant_id); record.put("is_valid",false); + record.put("update_time",new Date()); commonSubMerchantIdMapper.update(record); } From 6fae98440a77c9d85ebae3853ff6f636785d6224 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Thu, 26 Apr 2018 18:52:29 +0800 Subject: [PATCH 17/56] fix~ --- .../payment/merchantid/merchant_id_manager.js | 9 ++++++-- .../templates/merchant_id_manage.html | 21 +++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/ui/static/payment/merchantid/merchant_id_manager.js b/src/main/ui/static/payment/merchantid/merchant_id_manager.js index 5ea83d503..af5d7935f 100644 --- a/src/main/ui/static/payment/merchantid/merchant_id_manager.js +++ b/src/main/ui/static/payment/merchantid/merchant_id_manager.js @@ -12,17 +12,21 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS app.controller('merchantIdManageCtrl', ['$scope', '$state', '$http', '$uibModal', 'commonDialog', function ($scope, $state, $http,$uibModal,commonDialog) { $scope.pagination = {}; $scope.params = {}; + $scope.isCollapsed = true; $scope.loadClient = function () { + $scope.client_loading = true; $http.get('/sys/merchant_id').then(function (resp) { - $scope.clientsMap = resp.data + $scope.clientsMap = resp.data; + $scope.client_loading = false; }); }; $scope.loadClient(); $scope.loadNotTradeClient = function () { $http.get('/sys/merchant_id/trade').then(function (resp) { $scope.notTradeClientsMap = resp.data.merchant_id_map; - $scope.refresh_time = resp.data.refresh_time + $scope.refresh_time = resp.data.refresh_time; + $scope.disable_button = false; }); }; $scope.loadNotTradeClient(); @@ -63,6 +67,7 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }) }; $scope.refresh = function () { + $scope.disable_button = true; $http.post('/sys/merchant_id/refresh').then(function (resp) { $scope.loadNotTradeClient(); }); diff --git a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html index 182febf89..fe2c3c998 100644 --- a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html +++ b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html @@ -2,6 +2,10 @@ .cursor { cursor: pointer; } + .div-display{ + display: none; + } +
    @@ -19,15 +23,27 @@
    +
    +
    From f1c2894897932b232496c84b69528a8060e60dd1 Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Thu, 26 Apr 2018 18:54:15 +0800 Subject: [PATCH 18/56] fix --- src/db/modify.sql | 25 ++++++++++++++++++- .../manage/appclient/beans/AppQueryBean.java | 12 +++++++++ .../core/impls/RetailAppServiceImp.java | 3 ++- .../manage/mappers/payment/OrderMapper.xml | 4 ++- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/db/modify.sql b/src/db/modify.sql index 8b4a19fcf..6aa30dce1 100644 --- a/src/db/modify.sql +++ b/src/db/modify.sql @@ -370,4 +370,27 @@ CREATE TABLE `log_client_sub_merchant_id` ( `create_time` datetime NOT NULL COMMENT '创建时间', `client_id` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `pmt_sub_merchant_id` ( + `sub_merchant_id` varchar(30) NOT NULL, + `merchant_id` varchar(30) NOT NULL, + `is_valid` tinyint(1) DEFAULT 1, + `operator` varchar(30) DEFAULT '', + `create_time` datetime DEFAULT NULL, + `update_time` datetime DEFAULT NULL, + PRIMARY KEY (`sub_merchant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + +alter table sys_clients add column common_sub_merchant_id tinyint(1) default 0 comment '是否使用通用子商户号'; + + +CREATE TABLE `cli_sub_merchant_id` ( + `sub_merchant_id` varchar(30) NOT NULL, + `merchant_id` varchar(30) DEFAULT NULL, + `client_count` int(8) DEFAULT NULL, + `temp_sub_merchant` tinyint(1) DEFAULT 0, + `create_time` datetime DEFAULT NULL, + PRIMARY KEY (`sub_merchant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java b/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java index 2514700bb..03e0ec9cb 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java @@ -26,6 +26,7 @@ public class AppQueryBean { private OrderStatus status = OrderStatus.ALL; private PayChannel channel = PayChannel.ALL; private int[] gateway; + private int clearing_status; private String gateway_app; private int page = 1; private int limit = 20; @@ -86,6 +87,9 @@ public class AppQueryBean { if (app_client_ids != null && !app_client_ids.isEmpty()) { params.put("client_ids", app_client_ids.split(",")); } + if (clearing_status != -1) { + params.put("clearing_status", clearing_status); + } return params; } @@ -169,4 +173,12 @@ public class AppQueryBean { public void setChannel(PayChannel channel) { this.channel = channel; } + + public int getClearing_status() { + return clearing_status; + } + + public void setClearing_status(int clearing_status) { + this.clearing_status = clearing_status; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index 65552ea80..c9d3fe984 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -284,7 +284,8 @@ public class RetailAppServiceImp implements RetailAppService { String clientType = device.getString("client_type"); deviceSupport.findRegister(clientType); int client_id = device.getIntValue("client_id") ; - //JSONObject client = clientManager.getClientInfo(client_id); + JSONObject client = clientManager.getClientInfo(client_id); + device.put("client_moniker",client.getString("client_moniker")); TradeLogQuery tradeLogQuery = new TradeLogQuery(); tradeLogQuery.setDatefrom(appQueryBean.getBegin()); tradeLogQuery.setDateto(appQueryBean.getEnd()); diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml index d538acf9d..d2ffdcf7b 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml @@ -658,7 +658,8 @@ t.transaction_id, t.exchange_rate, t.clearing_status, - t.settle_amount + t.settle_amount, + t.clearing_status = 2 pre_auth from pmt_orders o left join pmt_transactions t on t.order_id=o.order_id and t.channel!='Settlement' and t.system_generate=0 @@ -687,6 +688,7 @@ o.channel=#{chan} + and t.clearing_status=#{clearing_status} From 9b6b36685a064c493d2fcffc38ab506ecb29e44c Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Thu, 26 Apr 2018 19:16:53 +0800 Subject: [PATCH 19/56] add risk interface --- .../risk/RiskMerchantDetalLogMapper.java | 20 +++ .../risk/RiskMerchantRecordMapper.java | 26 ++++ .../risk/RiskTransactionLogMapper.java | 24 +++ .../mappers/risk/RiskWhiteListMapper.java | 26 ++++ .../manage/risk/bean/AddRiskDetailLog.java | 55 +++++++ .../manage/risk/bean/DealRiskRecord.java | 37 +++++ .../manage/risk/bean/QueryRIskRecord.java | 41 +++++ .../manage/risk/core/RiskMerchantService.java | 31 ++++ .../core/impl/RiskMerchantServiceImpl.java | 146 ++++++++++++++++++ .../manage/risk/web/RiskController.java | 74 +++++++++ .../mappers/risk/RiskMerchantRecordMapper.xml | 19 +++ 11 files changed, 499 insertions(+) create mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskWhiteListMapper.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/DealRiskRecord.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRIskRecord.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/core/impl/RiskMerchantServiceImpl.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/web/RiskController.java create mode 100644 src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java new file mode 100644 index 000000000..b421b0d89 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java @@ -0,0 +1,20 @@ +package au.com.royalpay.payment.manage.mappers.risk; + +import com.alibaba.fastjson.JSONObject; + +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 RiskMerchantDetalLogMapper { + @AutoSql(type = SqlType.INSERT) + void save(JSONObject record); + + @AutoSql(type = SqlType.UPDATE) + void update(JSONObject record); + +} 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..998a95695 --- /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 java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.alibaba.fastjson.JSONObject; + +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); + + List query(JSONObject params); + + @AutoSql(type = SqlType.SELECT) + JSONObject findById(@Param("id") String id); + +} 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..17f2aa4d2 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java @@ -0,0 +1,24 @@ +package au.com.royalpay.payment.manage.mappers.risk; + +import com.alibaba.fastjson.JSONObject; + +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); + +} 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..8b4f44e4a --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java @@ -0,0 +1,55 @@ +package au.com.royalpay.payment.manage.risk.bean; + +import com.alibaba.fastjson.JSONObject; + +public class AddRiskDetailLog { + + private String record_id; + + private int client_id; + + private String files; + + private String operation; + + public JSONObject params(){ + JSONObject params = new JSONObject(); + params.put("record_id",this.record_id); + params.put("client_id",this.client_id); + params.put("files",this.files); + params.put("operation",this.operation); + return params; + + } + public String getRecord_id() { + return record_id; + } + + public void setRecord_id(String record_id) { + this.record_id = record_id; + } + + public int getClient_id() { + return client_id; + } + + public void setClient_id(int client_id) { + this.client_id = client_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; + } +} 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/QueryRIskRecord.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRIskRecord.java new file mode 100644 index 000000000..2ec955f23 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRIskRecord.java @@ -0,0 +1,41 @@ +package au.com.royalpay.payment.manage.risk.bean; + +import com.alibaba.fastjson.JSONObject; + +public class QueryRIskRecord { + + private String status; + private String client_moniker; + private String record_id; + + 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); + 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; + } +} 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..d6af1b689 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java @@ -0,0 +1,31 @@ +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.QueryRIskRecord; + +import com.alibaba.fastjson.JSONObject; + +import java.util.List; + +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); + + List getRiskOrders(String recordId); + + List getRiskRecords(QueryRIskRecord queryRIskRecord); + + void addWhiteList(String client_moinker); + + void disableWhiteList(String client_moinker); + + + +} 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..631562e43 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/core/impl/RiskMerchantServiceImpl.java @@ -0,0 +1,146 @@ +package au.com.royalpay.payment.manage.risk.core.impl; + +import au.com.royalpay.payment.manage.mappers.risk.RiskMerchantDetalLogMapper; +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.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 com.alibaba.fastjson.JSONObject; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +import javax.annotation.Resource; + +@Service +public class RiskMerchantServiceImpl implements RiskMerchantService { + + @Resource + private RiskMerchantRecordMapper riskMerchantRecordMapper; + @Resource + private RiskMerchantDetalLogMapper riskMerchantDetalLogMapper; + @Resource + private RiskTransactionLogMapper riskTransactionLogMapper; + @Resource + private RiskWhiteListMapper riskWhiteListMapper; + @Resource + private ClientManager clientManager; + + @Override + public void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account) { + JSONObject record = addRiskDetailLog.params(); + record.put("auditor",account.getString("display_name")); + record.put("create_time",new Date()); + riskMerchantDetalLogMapper.save(record); + } + + @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", "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("operation", "进行掉单处理"); + detail.put("create_time", new Date()); + riskMerchantDetalLogMapper.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", "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("operation", "不做处理"); + detail.put("create_time", new Date()); + riskMerchantDetalLogMapper.save(detail); + } + + @Override + 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(dealRiskRecord.getLimitAmount()!=null){ + clientManager.setMaxOrderAmount(record.getString("client_moniker"),dealRiskRecord.getLimitAmount()); + } + if(dealRiskRecord.getDisableMerchat()){ + clientManager.switchChannelPermission(account, record.getString("client_moniker"), "Wechat", false); + clientManager.switchChannelPermission(account, record.getString("client_moniker"), "Alipay", false); + } + } + + @Override + public List getRiskOrders(String recordId) { + return riskTransactionLogMapper.findByRecordId(recordId); + } + + @Override + public List getRiskRecords(QueryRIskRecord queryRIskRecord) { + return riskMerchantRecordMapper.query(queryRIskRecord.toParams()); + } + + @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); + } +} 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..016dc1fc7 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/risk/web/RiskController.java @@ -0,0 +1,74 @@ +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.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 java.util.List; + +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 List list(QueryRIskRecord recordQuery) { + return riskMerchantService.getRiskRecords(recordQuery); + } + + @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}/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/{record_id}", method = RequestMethod.GET) + public List getRiskOrders(@PathVariable String record_id) { + return riskMerchantService.getRiskOrders(record_id); + } + + @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); + } + +} 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..bd4fd0f27 --- /dev/null +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file From 86e1b7b03c348facfa76024168a2172f587b993f Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Thu, 26 Apr 2018 19:37:01 +0800 Subject: [PATCH 20/56] fix --- .../royalpay/payment/manage/appclient/beans/AppQueryBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java b/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java index 03e0ec9cb..74fe9b474 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppQueryBean.java @@ -26,7 +26,7 @@ public class AppQueryBean { private OrderStatus status = OrderStatus.ALL; private PayChannel channel = PayChannel.ALL; private int[] gateway; - private int clearing_status; + private int clearing_status=-1; private String gateway_app; private int page = 1; private int limit = 20; From fc65cfea0ee0ddcfca18385489d2917e02b5fd65 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Thu, 26 Apr 2018 19:50:57 +0800 Subject: [PATCH 21/56] fix~ --- .../mappers/ClientAnalysisMapper.java | 2 -- .../core/MerchantIdManageService.java | 2 -- .../impl/MerchantIdManageServiceImpl.java | 5 --- .../web/MerchantIdManageController.java | 5 --- .../analysis/mappers/ClientAnalysisMapper.xml | 17 +--------- .../payment/merchantid/merchant_id_manager.js | 15 --------- .../templates/merchant_id_manage.html | 31 +++++++++++++++++-- 7 files changed, 29 insertions(+), 48 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java index b95c323d8..a84810107 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java @@ -35,6 +35,4 @@ public interface ClientAnalysisMapper { List countClientsTypes(JSONObject params); List notTradeSubMerchantId(); - - List listNotTradeClients(@Param("sub_merchant_id") String sub_merchant_id); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchantid/core/MerchantIdManageService.java b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/MerchantIdManageService.java index 81a3b6bf9..ec5912ba7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchantid/core/MerchantIdManageService.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/MerchantIdManageService.java @@ -17,8 +17,6 @@ public interface MerchantIdManageService { List showClientMoniker(JSONObject manager,String sub_merchant_id); - List showNotTradeClientMoniker(JSONObject manager,String sub_merchant_id); - void save(JSONObject record); void disable(String sub_merchant_id); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java index e8c4d2c9b..c1fe7f0f1 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java @@ -95,11 +95,6 @@ public class MerchantIdManageServiceImpl implements MerchantIdManageService { return clientMapper.listBySubMerchantId(sub_merchant_id); } - @Override - public List showNotTradeClientMoniker(JSONObject manager, String sub_merchant_id) { - return clientAnalysisMapper.listNotTradeClients(sub_merchant_id); - } - @Override public void save(JSONObject record) { JSONObject sub_merchant_id = commonSubMerchantIdMapper.find(record.getString("sub_merchant_id")); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchantid/web/MerchantIdManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchantid/web/MerchantIdManageController.java index c09090f21..ea706e83b 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchantid/web/MerchantIdManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/web/MerchantIdManageController.java @@ -50,11 +50,6 @@ public class MerchantIdManageController { return merchantIdManageService.showClientMoniker(manager,sub_merchant_id); } - @RequestMapping(method = RequestMethod.GET,value = "/not_trade/{sub_merchant_id}") - @RequireManager(role = {ManagerRole.OPERATOR}) - public List showNotTradeClientMoniker(@PathVariable() String sub_merchant_id,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { - return merchantIdManageService.showNotTradeClientMoniker(manager,sub_merchant_id); - } @RequestMapping(value = "/common_sub_merchant_id", method = RequestMethod.GET) @RequireManager(role = {ManagerRole.OPERATOR}) diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml index 966c238fb..007950b60 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.xml @@ -142,25 +142,10 @@ FROM sys_clients c WHERE c.sub_merchant_id not in (SELECT p.sub_merchant_id FROM sys_clients p INNER JOIN pmt_orders o ON o.client_id = p.client_id AND o.status >4 AND o.confirm_time IS NOT NULL - WHERE datediff(now(), o.create_time) <= 30 AND p.sub_merchant_id is not null GROUP BY p.sub_merchant_id) AND c.sub_merchant_id IS not null AND c.merchant_id IS NOT NULL + WHERE datediff(now(), o.create_time) <= 25 AND p.sub_merchant_id is not null GROUP BY p.sub_merchant_id) AND c.sub_merchant_id IS not null AND c.merchant_id IS NOT NULL AND (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1 ]]> GROUP by c.sub_merchant_id - - \ No newline at end of file diff --git a/src/main/ui/static/payment/merchantid/merchant_id_manager.js b/src/main/ui/static/payment/merchantid/merchant_id_manager.js index af5d7935f..87dbcbe51 100644 --- a/src/main/ui/static/payment/merchantid/merchant_id_manager.js +++ b/src/main/ui/static/payment/merchantid/merchant_id_manager.js @@ -54,18 +54,6 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }) }; - $scope.showNotTradeClient = function (sub_merchant_id) { - $uibModal.open({ - templateUrl: '/static/payment/merchantid/templates/client_sub_merchant_id.html', - controller: 'showNotTradeClientsCtrl', - resolve: { - clients: ['$http', function ($http) { - return $http.get('/sys/merchant_id/not_trade/'+sub_merchant_id); - }] - }, - size: 'sm' - }) - }; $scope.refresh = function () { $scope.disable_button = true; $http.post('/sys/merchant_id/refresh').then(function (resp) { @@ -96,9 +84,6 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS app.controller('showClientsCtrl', ['$scope', '$http','clients', function ($scope, $http,clients) { $scope.clients = clients.data; }]); - app.controller('showNotTradeClientsCtrl', ['$scope', '$http','clients', function ($scope, $http,clients) { - $scope.clients = clients.data; - }]); app.controller('newCommonSubMerchantIdCtrl', ['$scope', '$http','commonDialog','$state', function ($scope, $http,commonDialog,$state) { $scope.params = {}; $scope.saveSubMerchantId = function () { diff --git a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html index fe2c3c998..6863a3ff5 100644 --- a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html +++ b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html @@ -6,6 +6,22 @@ display: none; } + .i-rotate_90{ + animation:rotate_90 1s forwards; + -webkit-animation:rotate_90 1s forwards; /* Safari and Chrome */ + } + + @keyframes rotate_90 + { + from {transform:rotate(0deg);} + to {transform:rotate(90deg);} + } + + @-webkit-keyframes rotate_90 /* Safari and Chrome */ + { + from {-webkit-transform:rotate(0deg);} + to {-webkit-transform:rotate(90deg);} + }
    @@ -29,7 +45,7 @@ - +
    @@ -74,10 +90,19 @@ ng-repeat="(key,clients) in notTradeClientsMap"> {{key|choose_merchant_id}} + 更多 + ng--click="showClient(client.sub_merchant_id)" ng-if="$index<60"> + {{client.sub_merchant_id}}  + + + {{client.sub_merchant_id}}  From 84c08eae1bedd382dbb7c92daf3df0ccfbdb84c5 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Fri, 27 Apr 2018 09:38:30 +0800 Subject: [PATCH 22/56] fix html --- .../payment/merchantid/templates/merchant_id_manage.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html index 6863a3ff5..0654d3fef 100644 --- a/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html +++ b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html @@ -45,7 +45,7 @@
    diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js new file mode 100644 index 000000000..ebdf4ac39 --- /dev/null +++ b/src/main/ui/static/risk/risk.js @@ -0,0 +1,102 @@ +define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootSwitch', 'ngFileUpload'], function (angular) { + 'use strict'; + 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_detail', { + url: '/detail', + templateUrl: '/static/risk/templates/risk_detail.html', + controller: 'RiskDetailCtrl', + params : { + param:null + } + }).state('vipcustomers.detail', { + url: '/{vip_code}/detail', + templateUrl: '/static/payment/vipcustomer/templates/vipcustomer_detail.html', + controller: 'vipCustomerDetailCtrl', + }).state('vipcustomers.edit', { + url: '/{vip_code}/edit', + templateUrl: '/static/payment/vipcustomer/templates/vipcustomer_edit.html', + controller: 'vipCustomerEditCtrl', + resolve: { + vipcustomer: ['$http', '$stateParams', function ($http, $stateParams) { + return $http.get('/partner/vip/' + $stateParams.vip_code); + }] + } + }) + }]); + app.controller('RiskManageCtrl', ['$scope', '$http','$state', function ($scope, $http,$state){ + $scope.params = {}; + $scope.loadRecords = function () { + var params = angular.copy($scope.params); + $http.get('/sys/risk/records', {params: params}).then(function (resp) { + $scope.records = resp.data; + }); + }; + $scope.loadRecords(1); + $scope.jumpDetail = function (record_id,client_moniker) { + var param = {}; + param.client_moniker = client_moniker; + param.record_id = record_id; + $state.go('analysis_monitoring.risk_detail',{param:param}); + } + }]); + app.controller('RiskDetailCtrl', ['$scope', '$http', '$stateParams','Upload', 'commonDialog', function ($scope, $http,$stateParams, Upload, commonDialog) { + $scope.params = {}; + $scope.loadOrders = function () { + + $http.get('/sys/risk/orders/' + $stateParams.param.record_id).then(function (resp) { + $scope.orders = resp.data; + }); + }; + $scope.loadOrders(1); + + $scope.edit = function () { + + } + }]); + app.controller('vipCustomerDetailCtrl', ['$scope', '$http','$filter','$state', '$uibModal', 'commonDialog', 'vipcustomer', function ($scope, $http,$filter, $state, $uibModal, commonDialog, vipcustomer) { + $scope.vipcustomer = vipcustomer.data; + $scope.params = {vip_customer_id:$scope.vipcustomer.vip_customer_id}; + $scope.loadVipOrders = function () { + var params = angular.copy($scope.params); + $http.get('/partner/vip/payment/orders', {params: params}).then(function (resp) { + $scope.vip_orders = resp.data.data; + $scope.pagination = resp.data.pagination; + }); + }; + $scope.loadVipOrders(); + + }]); + app.controller('vipCustomerEditCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', 'vipcustomer', + function ($scope, $http, $state, Upload, commonDialog, vipcustomer) { + $scope.vipcustomer = vipcustomer.data; + $scope.updateVipCustomer = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true; + } + }); + return; + } + $http.put('/partner/vip/' + $scope.vipcustomer.vip_code, $scope.vipcustomer).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Update vip customer information successfully', + type: 'success' + }); + $scope.loadVipCustomers(); + $state.go('^.detail', {vip_code: $scope.vipcustomer.vip_code}, {reload: true}); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) + }); + }; + + }]); + + 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..9c760cf3a --- /dev/null +++ b/src/main/ui/static/risk/templates/risk.html @@ -0,0 +1,42 @@ +
    +
    +

    Risk Manager

    + +
    +
    +
    +
    Records
    +
    + + + + + + + + + + + + + + + + + + + + + +
    Client MonikerCreate TimeExpiy TimeRisk TypesRisk CountsOperation
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_date}}{{record.risk_types}}{{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..3297b35d6 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -0,0 +1,40 @@ +
    +
    +

    Risk Record

    + +
    +
    +
    +
    Records Reference
    +
    + + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.risk_types}} + + + +
    +
    +
    +
    +
    \ No newline at end of file From c72c0936d8b11dfa03ff73de065f91cc3311c588 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Fri, 27 Apr 2018 12:12:33 +0800 Subject: [PATCH 24/56] add doc --- src/document/cn/apis.js | 38 +++++++++++++++++ src/document/en/apis.js | 39 ++++++++++++++++++ .../tpl/img/sdk_wechat_api_payment_cn.png | Bin 0 -> 57859 bytes .../tpl/img/sdk_wechat_api_payment_en.png | Bin 0 -> 60257 bytes 4 files changed, 77 insertions(+) create mode 100644 src/document/tpl/img/sdk_wechat_api_payment_cn.png create mode 100644 src/document/tpl/img/sdk_wechat_api_payment_en.png diff --git a/src/document/cn/apis.js b/src/document/cn/apis.js index 75071a8f7..f0e0dbcc7 100644 --- a/src/document/cn/apis.js +++ b/src/document/cn/apis.js @@ -795,6 +795,44 @@ * @apiError (ERROR_CODE) ORDER_PAID 订单已支付 * */ +/** + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} 创建微信SDK订单 + * @apiName WechatSDK + * @apiDescription + * 用于移动端APP调用微信SDK支付,调用API创建订单,得到微信SDK调用参数,将参数传递给SDK拉起微信支付,并由微信客户端直接返回支付结果。 + * 强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程,避免因超时自动撤单导致资金损失
    + *
    + * + * @apiVersion 1.0.0 + * @apiGroup SDKPayment + * @apiHeader Accept application/json + * @apiHeader Content-Type application/json + * @apiParam (PathVariable) {String} partner_code 必填,商户编码,由4位大写字母或数字构成 + * @apiParam (PathVariable) {String} order_id 必填,商户支付订单号,要求同一商户唯一 + * @apiUse Sign + * @apiParam (JSON) {String} description 必填,订单标题(最大长度128字符,超出自动截取) + * @apiParam (JSON) {int} price 必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 + * @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码 + * @apiParam (JSON) {String} notify_url 支付通知url,详见支付通知api,不填则不会推送支付通知 + * @apiParam (JSON) {String} operator 操作人员标识 + * @apiParam (JSON) {String=android,iphone,ipad} system 客户端操作系统类型,可选参数 + * @apiParam (JSON) {String} version 客户端版本号,可选参数 + * @apiParam (JSON) {String} appid 微信 appid + * + * @apiSuccess {String} return_code 执行结果 + * @apiSuccess {String} result_code SUCCESS表示创建订单成功,EXISTS表示订单已存在 + * @apiSuccess {String} partner_code 商户编码 + * @apiSuccess {String} full_name 商户注册全名 + * @apiSuccess {String} partner_name 商户名称 + * @apiSuccess {String} order_id RoyalPay订单ID,同时也是微信订单ID,最终支付成功的订单ID可能不同 + * @apiSuccess {String} partner_order_id 商户订单ID + * @apiSuccess {String} sdk_params 调用SDK的参数字符串 + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 + * @apiError (ERROR_CODE) ORDER_PAID 订单已支付 + * + */ function apis() { } \ No newline at end of file diff --git a/src/document/en/apis.js b/src/document/en/apis.js index df673fc43..86f8737d8 100644 --- a/src/document/en/apis.js +++ b/src/document/en/apis.js @@ -808,6 +808,45 @@ * @apiError (ERROR_CODE) ORDER_PAID Order has already been paid * */ + + +/** + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} Create Wechat SDK Order + * @apiName WechatSDK + * @apiDescription + * Used for mobile Apps calling Wechat payment with Wechat SDK. Call this api to create order and get param string for SDK calling. Call SDK api with the param to start payment and get payment result from Wechat app + * It is strongly advised to request RoyalPay order query Api to confirm that the order has been paid in order to cancelling order by system at the same time.
    + *
    + * @apiVersion 1.0.0 + * @apiGroup SDKPayment + * @apiHeader Accept application/json + * @apiHeader Content-Type application/json + * @apiParam (PathVariable) {String} partner_code Required, Partner code + * @apiParam (PathVariable) {String} order_id Required, Partner order id + * @apiUse Sign + * @apiParam (JSON) {String} description Required, Order description + * @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency. + * @apiParam (JSON) {String=AUD,CNY} currency=AUD Currency + * @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds + * @apiParam (JSON) {String} operator Note for the operator who created this order. + * @apiParam (JSON) {String=android,iphone,ipad} system os type of client app, optional + * @apiParam (JSON) {String} version client app version, optional + * @apiParam (JSON) {String} appid wechat appid + * + * @apiSuccess {String} return_code Execution result + * @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed. + * @apiSuccess {String} partner_code Partner code + * @apiSuccess {String} full_name Partner's full company name when registered + * @apiSuccess {String} partner_name Partner's name + * @apiSuccess {String} order_id Order id in RoyalPay, which is also WeChat order id. The final order id which is paid may be different from this one + * @apiSuccess {String} partner_order_id Partner order id + * @apiSuccess {String} sdk_params param string for calling SDK + * + * @apiUse GlobalError + * @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner + * @apiError (ERROR_CODE) ORDER_PAID Order has already been paid + * + */ function apis() { } diff --git a/src/document/tpl/img/sdk_wechat_api_payment_cn.png b/src/document/tpl/img/sdk_wechat_api_payment_cn.png new file mode 100644 index 0000000000000000000000000000000000000000..c1150ef4ffe79bd7b8e53b9db35805f78c8d1057 GIT binary patch literal 57859 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 L^;5aBX9NESvR7Ou literal 0 HcmV?d00001 From b87ea5e7277e770fa11baa48b65e6a213e5e013f Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Fri, 27 Apr 2018 13:55:53 +0800 Subject: [PATCH 25/56] fix html --- .../ui/static/payment/partner/templates/partner_detail.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index f03543d32..d90ff38b0 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -661,8 +661,10 @@
    -

    +

    + {{partner.alipayindustry|partner_alipay_industry}} +    ({{partner.alipayindustry}}) +

    From 97220886c53d9e41b3836075637459903b5607a7 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Fri, 27 Apr 2018 14:03:52 +0800 Subject: [PATCH 26/56] tmp --- src/main/ui/static/risk/templates/risk.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/ui/static/risk/templates/risk.html b/src/main/ui/static/risk/templates/risk.html index 9c760cf3a..6bdbbc444 100644 --- a/src/main/ui/static/risk/templates/risk.html +++ b/src/main/ui/static/risk/templates/risk.html @@ -15,17 +15,17 @@ Client Moniker Create Time - Expiy Time + Expiry Time Risk Types Risk Counts - Operation + Operationr {{record.client_moniker}} {{record.create_time}} - {{record.expiry_date}} + {{record.expiry_time}} {{record.risk_types}} {{record.risk_counts}} From bf8f4750ea3ca967fe9d8293b434214495dbc7f2 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Fri, 27 Apr 2018 14:05:09 +0800 Subject: [PATCH 27/56] fix --- .../payment/manage/mappers/system/ClientsContractMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientsContractMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientsContractMapper.xml index a477aa8f3..5f52e7f36 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientsContractMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientsContractMapper.xml @@ -13,7 +13,7 @@ left join sys_accounts a on a.account_id = cc.sign_account_id - cc.create_time = #{client_moniker} + c.client_moniker = #{client_moniker} order by create_time desc From da91e3cbb1191f5d0632f8e8d3dec6b31a1f04d2 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Fri, 27 Apr 2018 14:15:12 +0800 Subject: [PATCH 28/56] fix html --- .../static/analysis/templates/settlement_transactions.html | 4 ---- .../tradelog/templates/partner_settlement_dialog.html | 6 ++---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/ui/static/analysis/templates/settlement_transactions.html b/src/main/ui/static/analysis/templates/settlement_transactions.html index ec096566e..1cd046fa2 100644 --- a/src/main/ui/static/analysis/templates/settlement_transactions.html +++ b/src/main/ui/static/analysis/templates/settlement_transactions.html @@ -243,7 +243,6 @@ Currency Input Amount Total Amount - Clearing Amount Surcharge Rate Surcharge Amount Settle Amount @@ -260,7 +259,6 @@ - @@ -281,7 +279,6 @@ Transaction Time Currency Total Amount - Clearing Amount Surcharge Rate Surcharge Amount Settle Amount @@ -297,7 +294,6 @@ - diff --git a/src/main/ui/static/payment/tradelog/templates/partner_settlement_dialog.html b/src/main/ui/static/payment/tradelog/templates/partner_settlement_dialog.html index 65513aaa8..aae9797c6 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_settlement_dialog.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_settlement_dialog.html @@ -185,7 +185,6 @@ Currency Input Amount Total Amount - Clearing Amount Surcharge Rate Surcharge Amount Tax Amount @@ -202,7 +201,6 @@ - @@ -225,7 +223,7 @@ Transaction Time Currency Total Amount - Clearing Amount + Settle Amount Remark @@ -235,7 +233,7 @@ - + From 78688d7330dfdad99e8cb3b2074e8ebe28f8b881 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Fri, 27 Apr 2018 14:38:56 +0800 Subject: [PATCH 29/56] tmp --- src/main/ui/static/risk/risk.js | 3 ++- src/main/ui/static/risk/templates/risk.html | 2 +- src/main/ui/static/risk/templates/risk_detail.html | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index ebdf4ac39..4b5e918ce 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -44,7 +44,8 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS $state.go('analysis_monitoring.risk_detail',{param:param}); } }]); - app.controller('RiskDetailCtrl', ['$scope', '$http', '$stateParams','Upload', 'commonDialog', function ($scope, $http,$stateParams, Upload, commonDialog) { + app.controller('RiskDetailCtrl', ['$scope', '$http', '$stateParams','$uibModal', function ($scope, $http,$stateParams,$uibModal) { + $scope.client_moniker = $stateParams.param.client_moniker; $scope.params = {}; $scope.loadOrders = function () { diff --git a/src/main/ui/static/risk/templates/risk.html b/src/main/ui/static/risk/templates/risk.html index 6bdbbc444..01c25d054 100644 --- a/src/main/ui/static/risk/templates/risk.html +++ b/src/main/ui/static/risk/templates/risk.html @@ -18,7 +18,7 @@ Expiry Time Risk Types Risk Counts - Operationr + Operation diff --git a/src/main/ui/static/risk/templates/risk_detail.html b/src/main/ui/static/risk/templates/risk_detail.html index 3297b35d6..07b092be1 100644 --- a/src/main/ui/static/risk/templates/risk_detail.html +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -1,6 +1,6 @@
    -

    Risk Record

    +

    Risk Manager

    -
    Records Reference
    +
    Records Orders(Partner Code:{{client_moniker}})
    @@ -27,8 +27,8 @@ From a0c6ff984d091359c275716a32df86e372e89d67 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Fri, 27 Apr 2018 14:39:34 +0800 Subject: [PATCH 30/56] fixbug --- .../static/payment/partner/templates/client_partner_detail.html | 2 +- .../ui/static/payment/partner/templates/partner_detail.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/client_partner_detail.html b/src/main/ui/static/payment/partner/templates/client_partner_detail.html index c2105a1f0..cd34f8e31 100644 --- a/src/main/ui/static/payment/partner/templates/client_partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/client_partner_detail.html @@ -115,7 +115,7 @@
    + href="https://{{partner.company_website}}" >
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index f03543d32..e4e3b8042 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -361,7 +361,7 @@
    + href="https://{{partner.company_website}}">
    From 51fdf932c1600bcf6d93e8537eeb50a87b874311 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Fri, 27 Apr 2018 14:59:36 +0800 Subject: [PATCH 31/56] tmp --- src/main/ui/static/risk/risk.js | 63 +++---- src/main/ui/static/risk/templates/risk.html | 3 + .../ui/static/risk/templates/risk_deit.html | 170 ++++++++++++++++++ .../ui/static/risk/templates/risk_detail.html | 5 - 4 files changed, 195 insertions(+), 46 deletions(-) create mode 100644 src/main/ui/static/risk/templates/risk_deit.html diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index 4b5e918ce..c81b3d92c 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -37,6 +37,25 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }); }; $scope.loadRecords(1); + $scope.edit = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/partner_new_rate.html', + controller: 'RiskRecordEditCtrl', + resolve: { + rate: function () { + return {rate_name: name, clean_days: 3}; + }, + sys_common_rate: function () { + return $http.get('/sys/partners/sys_rates'); + }, + clientMoniker: function () { + return $scope.partner.client_moniker; + } + } + }).result.then(function () { + $scope.getRates(); + }); + }; $scope.jumpDetail = function (record_id,client_moniker) { var param = {}; param.client_moniker = client_moniker; @@ -55,49 +74,11 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }; $scope.loadOrders(1); - $scope.edit = function () { - - } }]); - app.controller('vipCustomerDetailCtrl', ['$scope', '$http','$filter','$state', '$uibModal', 'commonDialog', 'vipcustomer', function ($scope, $http,$filter, $state, $uibModal, commonDialog, vipcustomer) { - $scope.vipcustomer = vipcustomer.data; - $scope.params = {vip_customer_id:$scope.vipcustomer.vip_customer_id}; - $scope.loadVipOrders = function () { - var params = angular.copy($scope.params); - $http.get('/partner/vip/payment/orders', {params: params}).then(function (resp) { - $scope.vip_orders = resp.data.data; - $scope.pagination = resp.data.pagination; - }); - }; - $scope.loadVipOrders(); - + + app.controller('RiskRecordEditCtrl', ['$scope', '$http', function ($scope, $http) { + }]); - app.controller('vipCustomerEditCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', 'vipcustomer', - function ($scope, $http, $state, Upload, commonDialog, vipcustomer) { - $scope.vipcustomer = vipcustomer.data; - $scope.updateVipCustomer = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - $http.put('/partner/vip/' + $scope.vipcustomer.vip_code, $scope.vipcustomer).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Update vip customer information successfully', - type: 'success' - }); - $scope.loadVipCustomers(); - $state.go('^.detail', {vip_code: $scope.vipcustomer.vip_code}, {reload: true}); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) - }); - }; - - }]); 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 index 01c25d054..f8cf7dfce 100644 --- a/src/main/ui/static/risk/templates/risk.html +++ b/src/main/ui/static/risk/templates/risk.html @@ -32,6 +32,9 @@ + + + diff --git a/src/main/ui/static/risk/templates/risk_deit.html b/src/main/ui/static/risk/templates/risk_deit.html new file mode 100644 index 000000000..1692b6e20 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_deit.html @@ -0,0 +1,170 @@ + + + \ 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 index 07b092be1..89b79572b 100644 --- a/src/main/ui/static/risk/templates/risk_detail.html +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -26,11 +26,6 @@
    -
    {{order.channel}} {{order.risk_types}} - - + +
    {{order.amount}} {{order.channel}} {{order.risk_types}} - - - -
    From 49ac845d230ff94e55ae9c23b6fd22cfd052c5d6 Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Fri, 27 Apr 2018 15:42:13 +0800 Subject: [PATCH 32/56] fix --- src/main/ui/static/payment/partner/partner-manage.js | 6 ++++++ .../ui/static/payment/partner/templates/partner_detail.html | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index ef81697a4..463947197 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -481,6 +481,12 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter app.controller('partnerDetailCtrl', ['$scope', '$http', '$state', '$uibModal', '$rootScope', 'Upload', 'commonDialog', 'partner', function ($scope, $http, $state, $uibModal, $rootScope, Upload, commonDialog, partner) { $scope.init = {wechat_compliance: false, local_merchant: false}; $scope.partner = partner.data; + var website = partner.data.company_website; + if (website!=null){ + if (website.indexOf('http')!=0){ + $scope.partner.company_website= 'http://'+angular.copy(website); + } + } $scope.showDBUsers = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bd_user').then(function (resp) { $scope.partner.client_bds = resp.data; diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index eab9823cd..b2b4c93fc 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -361,7 +361,7 @@
    + href="{{partner.company_website}}">
    From bacde16feaa1fe3595f1df9f6239245ae058bac0 Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Fri, 27 Apr 2018 17:28:32 +0800 Subject: [PATCH 33/56] fix --- .../ui/static/payment/partner/templates/partner_detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index b2b4c93fc..502fe7ab5 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -308,7 +308,7 @@
    - +
    From ae88cf1a102f461557f74a5a5408357ffc633f5d Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Fri, 27 Apr 2018 18:03:24 +0800 Subject: [PATCH 34/56] fix --- .../manage/analysis/core/DashboardService.java | 3 +++ .../core/impls/DashboardServiceImpl.java | 16 +++++++++++++--- .../analysis/web/DashboardController.java | 7 +++++++ src/main/ui/static/dashboard/dashboard.js | 17 +++++++++++++++-- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/DashboardService.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/DashboardService.java index 3b7510566..7dfd56520 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/DashboardService.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/DashboardService.java @@ -11,6 +11,9 @@ import java.util.List; */ public interface DashboardService { JSONObject getCommonAnalysis1(JSONObject params); + + JSONObject getCommonAnalysis3(JSONObject params); + JSONObject getCommonAnalysis2(JSONObject params); // JSONObject getCommonAnalysis(JSONObject params); diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java index 9b64ef9ec..c7a51b3ca 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java @@ -65,9 +65,9 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT @Override public JSONObject getCommonAnalysis1(JSONObject params) { JSONObject res = transactionAnalysisMapper.getClientTransaction(params); - res.put("new_partners", clientAnalysisMapper.countNewClients(params)); - res.put("total_partners", clientAnalysisMapper.countClients(params)); - res.put("traded_partners", clientAnalysisMapper.countTradedPartners(params)); +// res.put("new_partners", clientAnalysisMapper.countNewClients(params)); +// res.put("total_partners", clientAnalysisMapper.countClients(params)); +// res.put("traded_partners", clientAnalysisMapper.countTradedPartners(params)); // List topOrders = transactionAnalysisMapper.getTopOrders(params, new PageBounds(1, 1, Order.formString("aud_fee.desc"))); // if (!topOrders.isEmpty()) { // res.put("top_amount_order", topOrders.get(0)); @@ -77,6 +77,16 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT // res.put("old_customers", transactionAnalysisMapper.countOldCustomers(params)); return res; } + + @Override + public JSONObject getCommonAnalysis3(JSONObject params) { + JSONObject res = new JSONObject(); + res.put("new_partners", clientAnalysisMapper.countNewClients(params)); + res.put("total_partners", clientAnalysisMapper.countClients(params)); + res.put("traded_partners", clientAnalysisMapper.countTradedPartners(params)); + return res; + } + @Override public JSONObject getCommonAnalysis2(JSONObject params) { JSONObject res = new JSONObject(); diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/web/DashboardController.java b/src/main/java/au/com/royalpay/payment/manage/analysis/web/DashboardController.java index 575d8e6f3..0b6ed61a1 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/web/DashboardController.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/web/DashboardController.java @@ -36,6 +36,13 @@ public class DashboardController { return dashboardService.getCommonAnalysis1(params); } + @ManagerMapping("/common_analysis_3") + public JSONObject commonAnalysis3(AnalysisBean analysis, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + JSONObject params = analysis.toParams(null); + orgManager.checkOrg(manager,params); + return dashboardService.getCommonAnalysis3(params); + } + @ManagerMapping("/common_analysis_2") public JSONObject commonAnalysis2(AnalysisBean analysis, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { JSONObject params = analysis.toParams(null); diff --git a/src/main/ui/static/dashboard/dashboard.js b/src/main/ui/static/dashboard/dashboard.js index bc1a13938..088b02048 100644 --- a/src/main/ui/static/dashboard/dashboard.js +++ b/src/main/ui/static/dashboard/dashboard.js @@ -124,11 +124,23 @@ define(['angular', 'uiRouter', 'uiBootstrap', 'angularEcharts'], function (angul function loadAnalysis() { $http.get('/dashboard/system/common_analysis_1', {params: $scope.currentScale.params()}).then(function (resp) { + // $scope.analysis.new_partners = resp.data.new_partners; + // $scope.analysis.total_partners = resp.data.total_partners; + // $scope.analysis.traded_partners = resp.data.traded_partners; + $scope.analysis.trade_amount = resp.data.trade_amount; + $scope.analysis.trade_count = resp.data.trade_count; + + // $scope.analysis.top_amount_order = resp.data.top_amount_order; + // $scope.analysis.trade_count = resp.data.trade_count; + // $scope.analysis.total_customers = resp.data.total_customers; + // $scope.analysis.new_customers = resp.data.total_customers-resp.data.old_customers; + // $scope.analysis.old_customers = resp.data.old_customers; + }); + + $http.get('/dashboard/system/common_analysis_3', {params: $scope.currentScale.params()}).then(function (resp) { $scope.analysis.new_partners = resp.data.new_partners; $scope.analysis.total_partners = resp.data.total_partners; $scope.analysis.traded_partners = resp.data.traded_partners; - $scope.analysis.trade_amount = resp.data.trade_amount; - $scope.analysis.trade_count = resp.data.trade_count; // $scope.analysis.top_amount_order = resp.data.top_amount_order; // $scope.analysis.trade_count = resp.data.trade_count; @@ -136,6 +148,7 @@ define(['angular', 'uiRouter', 'uiBootstrap', 'angularEcharts'], function (angul // $scope.analysis.new_customers = resp.data.total_customers-resp.data.old_customers; // $scope.analysis.old_customers = resp.data.old_customers; }); + $http.get('/dashboard/system/common_analysis_2', {params: $scope.currentScale.params()}).then(function (resp) { // $scope.analysis.new_partners = resp.data.new_partners; // $scope.analysis.total_partners = resp.data.total_partners; From 3c79262ccda05d63a677ef7a0d4382ee995b4cb5 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Fri, 27 Apr 2018 18:11:11 +0800 Subject: [PATCH 35/56] fix html --- src/db/modify.sql | 7 +++ .../merchants/beans/ClientRegisterInfo.java | 37 ++++++++++++++++ .../templates/client_sub_merchant_id.html | 25 ++++++++--- .../partner/templates/add_partner.html | 36 ++++++++++++++++ .../partner/templates/partner_detail.html | 36 ++++++++++++++++ .../partner/templates/partner_edit.html | 43 +++++++++++++++++++ 6 files changed, 179 insertions(+), 5 deletions(-) diff --git a/src/db/modify.sql b/src/db/modify.sql index 6aa30dce1..7b6db68ce 100644 --- a/src/db/modify.sql +++ b/src/db/modify.sql @@ -394,3 +394,10 @@ CREATE TABLE `cli_sub_merchant_id` ( `create_time` datetime DEFAULT NULL, PRIMARY KEY (`sub_merchant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +ALTER TABLE `sys_clients` ADD COLUMN `business_hours` varchar(100) DEFAULT ''; +ALTER TABLE `sys_clients` ADD COLUMN `merchant_introduction` varchar(500) DEFAULT ''; +ALTER TABLE `sys_clients` ADD COLUMN `merchant_tag` varchar(100) DEFAULT ''; +ALTER TABLE `sys_clients` ADD COLUMN `merchant_video_url` varchar(200) DEFAULT ''; + + diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java index f5725e2ca..eb65168f7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java @@ -69,6 +69,11 @@ public class ClientRegisterInfo { private String client_apply_id; + private String business_hours; + private String merchant_introduction; + private String merchant_tag; + private String merchant_video_url; + public JSONObject insertObject() { JSONObject res = (JSONObject) JSON.toJSON(this); if (client_apply_id==null){ @@ -330,4 +335,36 @@ public class ClientRegisterInfo { public void setRoyalpayindustry(String royalpayindustry) { this.royalpayindustry = royalpayindustry; } + + public String getBusiness_hours() { + return business_hours; + } + + public void setBusiness_hours(String business_hours) { + this.business_hours = business_hours; + } + + public String getMerchant_introduction() { + return merchant_introduction; + } + + public void setMerchant_introduction(String merchant_introduction) { + this.merchant_introduction = merchant_introduction; + } + + public String getMerchant_tag() { + return merchant_tag; + } + + public void setMerchant_tag(String merchant_tag) { + this.merchant_tag = merchant_tag; + } + + public String getMerchant_video_url() { + return merchant_video_url; + } + + public void setMerchant_video_url(String merchant_video_url) { + this.merchant_video_url = merchant_video_url; + } } diff --git a/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html b/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html index cb03f3f6e..e2460c5dc 100644 --- a/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html +++ b/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html @@ -1,11 +1,26 @@ - +
    +
    Alipay Information
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    Contact Information
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 502fe7ab5..03d509c9d 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -452,6 +452,42 @@
    + +
    +
    Alipay Information
    +
    +
    +
    + +
    +

    +
    +
    +
    + +
    +

    +
    +
    +
    + +
    +

    +
    +
    +
    + +
    +

    +
    +
    +
    +
    +
    Partner Contact Information
    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index a7ddd8ed8..caeaf1af6 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -263,6 +263,48 @@
    +
    +
    Alipay Information
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    Contact Information
    @@ -314,6 +356,7 @@
    +
    Address Information
    From 4b8ba85930538d20e136830f5ba3817c32d40675 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Fri, 27 Apr 2018 18:27:52 +0800 Subject: [PATCH 36/56] fix html --- .../ui/static/payment/tradelog/templates/balance_report.html | 4 ++-- .../static/payment/tradelog/templates/partner_trade_logs.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index 8ad21e1a6..087583ce7 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -212,13 +212,13 @@ Input Amount - + ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) - + ( {{analysis.pre_cny_display_amount | currency:'pre authorization '}} )
    diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html index 6ef1fde69..dfc9bcbb4 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html @@ -232,13 +232,13 @@ Input Amount - + ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) - + ( {{analysis.pre_cny_display_amount | currency:'pre authorization '}} )
    From 07f2474892c30a48b3b2cfc16f997449f4f8596f Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Fri, 27 Apr 2018 18:33:26 +0800 Subject: [PATCH 37/56] fix --- .../ui/static/payment/partner/templates/partner_detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 03d509c9d..73034fb12 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -308,7 +308,7 @@
    - +
    From 159a565889964eb954b91785f5300687f1215a50 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Fri, 27 Apr 2018 18:42:34 +0800 Subject: [PATCH 38/56] fix html --- .../payment/partner/templates/add_partner.html | 8 ++++---- .../payment/partner/templates/partner_detail.html | 8 ++++---- .../payment/partner/templates/partner_edit.html | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 9d859a856..5a93b9183 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -384,16 +384,16 @@
    + Merchant Tag
    - +
    + Merchant Introduction
    - +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 03d509c9d..45b3f9f87 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -466,16 +466,16 @@
    + Merchant Tag
    -

    +

    + Merchant Introduction
    -

    +

    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index caeaf1af6..cb9a74b5c 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -277,19 +277,19 @@
    + Merchant Tag
    - +
    + Merchant Introduction
    - +
    From 33db182dfbb8f20a35b7c772d6fd5f832ee6d410 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Sat, 28 Apr 2018 09:06:45 +0800 Subject: [PATCH 39/56] tmp --- .../risk/RiskMerchantRecordMapper.java | 6 +- .../risk/RiskTransactionLogMapper.java | 3 + .../manage/risk/bean/QueryRIskRecord.java | 41 ---- .../manage/risk/bean/QueryRiskOrder.java | 69 +++++++ .../manage/risk/bean/QueryRiskRecord.java | 83 ++++++++ .../manage/risk/core/RiskMerchantService.java | 11 +- .../core/impl/RiskMerchantServiceImpl.java | 56 ++++-- .../manage/risk/web/RiskController.java | 19 +- .../mappers/risk/RiskMerchantRecordMapper.xml | 6 + .../mappers/risk/RiskTransactionLogMapper.xml | 19 ++ src/main/ui/static/risk/risk.js | 181 +++++++++++++----- src/main/ui/static/risk/templates/risk.html | 25 ++- .../ui/static/risk/templates/risk_deit.html | 170 ---------------- .../ui/static/risk/templates/risk_detail.html | 35 ---- .../ui/static/risk/templates/risk_edit.html | 31 +++ .../static/risk/templates/risk_history.html | 115 +++++++++++ .../ui/static/risk/templates/risk_orders.html | 96 ++++++++++ 17 files changed, 632 insertions(+), 334 deletions(-) delete mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRIskRecord.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskOrder.java create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskRecord.java create mode 100644 src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.xml delete mode 100644 src/main/ui/static/risk/templates/risk_deit.html delete mode 100644 src/main/ui/static/risk/templates/risk_detail.html create mode 100644 src/main/ui/static/risk/templates/risk_edit.html create mode 100644 src/main/ui/static/risk/templates/risk_history.html create mode 100644 src/main/ui/static/risk/templates/risk_orders.html 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 index 998a95695..1c14b9b0a 100644 --- 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 @@ -1,10 +1,10 @@ package au.com.royalpay.payment.manage.mappers.risk; -import java.util.List; - 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; @@ -18,7 +18,7 @@ public interface RiskMerchantRecordMapper { @AutoSql(type = SqlType.UPDATE) void update(JSONObject record); - List query(JSONObject params); + PageList query(JSONObject params, PageBounds pagination); @AutoSql(type = SqlType.SELECT) JSONObject findById(@Param("id") String id); 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 index 17f2aa4d2..c3b4cbc41 100644 --- 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 @@ -1,6 +1,8 @@ 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; @@ -21,4 +23,5 @@ public interface RiskTransactionLogMapper { @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/risk/bean/QueryRIskRecord.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRIskRecord.java deleted file mode 100644 index 2ec955f23..000000000 --- a/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRIskRecord.java +++ /dev/null @@ -1,41 +0,0 @@ -package au.com.royalpay.payment.manage.risk.bean; - -import com.alibaba.fastjson.JSONObject; - -public class QueryRIskRecord { - - private String status; - private String client_moniker; - private String record_id; - - 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); - 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; - } -} 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 index d6af1b689..415dca96b 100644 --- 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 @@ -2,12 +2,11 @@ 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.QueryRIskRecord; +import au.com.royalpay.payment.manage.risk.bean.QueryRiskOrder; +import au.com.royalpay.payment.manage.risk.bean.QueryRiskRecord; import com.alibaba.fastjson.JSONObject; -import java.util.List; - public interface RiskMerchantService { void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account); @@ -18,14 +17,16 @@ public interface RiskMerchantService { void dealRiskRecord(JSONObject account,DealRiskRecord dealRiskRecord); - List getRiskOrders(String recordId); + JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder); - List getRiskRecords(QueryRIskRecord queryRIskRecord); + JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord); void addWhiteList(String client_moinker); void disableWhiteList(String client_moinker); + JSONObject getRecordById(String record_id); + } 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 index 631562e43..0c541847b 100644 --- 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 @@ -7,18 +7,21 @@ 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.QueryRIskRecord; +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 java.util.List; import javax.annotation.Resource; @@ -39,8 +42,8 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { @Override public void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account) { JSONObject record = addRiskDetailLog.params(); - record.put("auditor",account.getString("display_name")); - record.put("create_time",new Date()); + record.put("auditor", account.getString("display_name")); + record.put("create_time", new Date()); riskMerchantDetalLogMapper.save(record); } @@ -79,7 +82,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { } JSONObject record = new JSONObject(); record.put("id", recordId); - record.put("status", "1"); + record.put("status", "2"); riskMerchantRecordMapper.update(record); JSONObject detail = new JSONObject(); detail.put("record_id", recordId); @@ -91,28 +94,48 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { } @Override - public void dealRiskRecord(JSONObject account,DealRiskRecord dealRiskRecord) { + @Transactional + public void dealRiskRecord(JSONObject account, DealRiskRecord dealRiskRecord) { JSONObject record = riskMerchantRecordMapper.findById(dealRiskRecord.getRecordId()); - if(record==null){ + if (record == null) { throw new NotFoundException("Risk Record Not Found Please Check"); } - if(dealRiskRecord.getLimitAmount()!=null){ - clientManager.setMaxOrderAmount(record.getString("client_moniker"),dealRiskRecord.getLimitAmount()); + if (record.getIntValue("status") != 0) { + throw new BadRequestException("The Record Has Been Handled"); + } + String operation = ""; + if (dealRiskRecord.getLimitAmount() != null) { + clientManager.setMaxOrderAmount(record.getString("client_moniker"), dealRiskRecord.getLimitAmount()); + operation = operation + "限额" + dealRiskRecord.getLimitAmount(); + } - if(dealRiskRecord.getDisableMerchat()){ + if (dealRiskRecord.getDisableMerchat()) { clientManager.switchChannelPermission(account, record.getString("client_moniker"), "Wechat", false); clientManager.switchChannelPermission(account, record.getString("client_moniker"), "Alipay", false); + operation = operation + " 关闭支付通道"; } + 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("operation", StringUtils.isEmpty(operation) ? null : (operation = "处理结果:" + operation)); + detail.put("create_time", new Date()); + riskMerchantDetalLogMapper.save(detail); + record.put("status", 1); + riskMerchantRecordMapper.update(record); } @Override - public List getRiskOrders(String recordId) { - return riskTransactionLogMapper.findByRecordId(recordId); + public JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder) { + return PageListUtils.buildPageListResult( + riskTransactionLogMapper.query(queryRiskOrder.toParams(), new PageBounds(queryRiskOrder.getPage(), queryRiskOrder.getLimit()))); + } @Override - public List getRiskRecords(QueryRIskRecord queryRIskRecord) { - return riskMerchantRecordMapper.query(queryRIskRecord.toParams()); + public JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord) { + return PageListUtils.buildPageListResult( + riskMerchantRecordMapper.query(queryRiskRecord.toParams(), new PageBounds(queryRiskRecord.getPage(), queryRiskRecord.getLimit()))); } @Override @@ -143,4 +166,9 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { white.put("is_valid", false); riskWhiteListMapper.update(white); } + + @Override + public JSONObject getRecordById(String record_id) { + return riskMerchantRecordMapper.findById(record_id); + } } 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 index 016dc1fc7..b857c3090 100644 --- 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 @@ -3,7 +3,8 @@ 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.QueryRIskRecord; +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; @@ -16,8 +17,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - import javax.annotation.Resource; /** @@ -31,10 +30,15 @@ public class RiskController { private RiskMerchantService riskMerchantService; @RequestMapping(value = "/records", method = RequestMethod.GET) - public List list(QueryRIskRecord recordQuery) { + 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); @@ -51,11 +55,12 @@ public class RiskController { riskMerchantService.dealRiskRecord(manager,dealRiskRecord); } - @RequestMapping(value = "/orders/{record_id}", method = RequestMethod.GET) - public List getRiskOrders(@PathVariable String record_id) { - return riskMerchantService.getRiskOrders(record_id); + @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); 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 index bd4fd0f27..67dceb727 100644 --- 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 @@ -14,6 +14,12 @@ and client_moniker = #{client_moniker} + + and create_time < #{c_end_time} + + + and client_id = #{client_id} + \ 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..d7f0bf1eb --- /dev/null +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index c81b3d92c..961565a57 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -1,84 +1,159 @@ 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_detail', { - url: '/detail', - templateUrl: '/static/risk/templates/risk_detail.html', - controller: 'RiskDetailCtrl', - params : { - param:null + }).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('vipcustomers.detail', { - url: '/{vip_code}/detail', - templateUrl: '/static/payment/vipcustomer/templates/vipcustomer_detail.html', - controller: 'vipCustomerDetailCtrl', - }).state('vipcustomers.edit', { - url: '/{vip_code}/edit', - templateUrl: '/static/payment/vipcustomer/templates/vipcustomer_edit.html', - controller: 'vipCustomerEditCtrl', - resolve: { - vipcustomer: ['$http', '$stateParams', function ($http, $stateParams) { - return $http.get('/partner/vip/' + $stateParams.vip_code); + }).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; + }); }] } - }) + }); }]); - app.controller('RiskManageCtrl', ['$scope', '$http','$state', function ($scope, $http,$state){ + app.controller('RiskManageCtrl', ['$scope', '$http', function ($scope, $http){ $scope.params = {}; - $scope.loadRecords = function () { + $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; + $scope.records = resp.data.data; + $scope.pagination = resp.data.pagination; }); }; $scope.loadRecords(1); - $scope.edit = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/partner_new_rate.html', - controller: 'RiskRecordEditCtrl', - resolve: { - rate: function () { - return {rate_name: name, clean_days: 3}; - }, - sys_common_rate: function () { - return $http.get('/sys/partners/sys_rates'); - }, - clientMoniker: function () { - return $scope.partner.client_moniker; - } - } - }).result.then(function () { - $scope.getRates(); - }); - }; - $scope.jumpDetail = function (record_id,client_moniker) { - var param = {}; - param.client_moniker = client_moniker; - param.record_id = record_id; - $state.go('analysis_monitoring.risk_detail',{param:param}); - } }]); - app.controller('RiskDetailCtrl', ['$scope', '$http', '$stateParams','$uibModal', function ($scope, $http,$stateParams,$uibModal) { - $scope.client_moniker = $stateParams.param.client_moniker; - $scope.params = {}; - $scope.loadOrders = function () { - $http.get('/sys/risk/orders/' + $stateParams.param.record_id).then(function (resp) { - $scope.orders = resp.data; + 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('RiskRecordEditCtrl', ['$scope', '$http', function ($scope, $http) { + 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 (typeString) { + var sArr = typeString.split(","); + var result = ""; + angular.forEach(sArr, function (s) { + angular.forEach(riskType,function (type) { + if (type==s){ + result+=type; + result+=","; + } + }) + }); + result = result.substr(0,result.length-2); + return result; + }); 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 index f8cf7dfce..7253a7a99 100644 --- a/src/main/ui/static/risk/templates/risk.html +++ b/src/main/ui/static/risk/templates/risk.html @@ -15,8 +15,9 @@ Client Moniker Create Time - Expiry Time + Waring Time Risk Types + Status Risk Counts Operation @@ -26,19 +27,31 @@ {{record.client_moniker}} {{record.create_time}} {{record.expiry_time}} - {{record.risk_types}} + {{record.status}} + {{record.risk_types|risk_type}} {{record.risk_counts}} - + - - - +
    diff --git a/src/main/ui/static/risk/templates/risk_deit.html b/src/main/ui/static/risk/templates/risk_deit.html deleted file mode 100644 index 1692b6e20..000000000 --- a/src/main/ui/static/risk/templates/risk_deit.html +++ /dev/null @@ -1,170 +0,0 @@ - - - \ 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 deleted file mode 100644 index 89b79572b..000000000 --- a/src/main/ui/static/risk/templates/risk_detail.html +++ /dev/null @@ -1,35 +0,0 @@ -
    -
    -

    Risk Manager

    - -
    -
    -
    -
    Records Orders(Partner Code:{{client_moniker}})
    -
    - - - - - - - - - - - - - - - - - -
    Order IdAmountChannelRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.risk_types}}
    -
    -
    -
    -
    \ 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..14e2ce8c2 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_edit.html @@ -0,0 +1,31 @@ +
    +

    Phone Top Up

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    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..87a2f2468 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_history.html @@ -0,0 +1,115 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Record History
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Client MonikerCreate TimeWaring TimeRisk TypesStatusRisk CountsOperation
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_time}}{{record.status}}{{record.risk_types|risk_type}}{{record.risk_counts}} + + + + + + + +
    + +
    +
    + + +
    +
    Latest Record
    +
    + + + + + + + + + + + + + + + + + + + + + +
    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..e4399d1d2 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_orders.html @@ -0,0 +1,96 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Reference Orders
    +
    + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.risk_types|risk_type}}
    +
    + +
    + +
    +
    Waring Orders History
    +
    + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.risk_types|risk_type}}
    +
    + +
    + +
    +
    \ No newline at end of file From 6866c263ed8dc904e2adf27330919788326b8f4d Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Sat, 28 Apr 2018 10:55:41 +0800 Subject: [PATCH 40/56] =?UTF-8?q?=E5=A2=9E=E5=8A=A0common=5Fsub=5Fmerchant?= =?UTF-8?q?=5Fid=20switch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/PartnerManageController.java | 5 +++++ .../static/payment/partner/partner-manage.js | 20 ++++++++++++++++++- .../templates/partner_payment_info.html | 6 ++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index e76212056..82e279ffd 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -233,6 +233,11 @@ public class PartnerManageController { clientManager.refusePartner(clientMoniker, manager, refuse.getString("refuse_remark")); } + @ManagerMapping(value = "/{clientMoniker}/common_sub_merchant_id", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) + public void switchCommonSubMerchantId(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.switchPermission(manager, clientMoniker, "common_sub_merchant_id", pass.getBooleanValue("allow")); + } + @ManagerMapping(value = "/{clientMoniker}/channels/{channel}/permission", method = RequestMethod.PUT, role = {ManagerRole.SERVANT, ManagerRole.DEVELOPER}) public void switchChannelPermission(@PathVariable String clientMoniker, @PathVariable String channel, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.switchChannelPermission(manager, clientMoniker, channel, pass.getBooleanValue("allow")); diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 463947197..75ab6ce26 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -1202,7 +1202,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }) }; - $scope.init = {jsapi: false, gateway: false, offline: false, refund: false, channel: {}}; + $scope.init = {jsapi: false, gateway: false, offline: false, refund: false,common_sub_merchant_id:false, channel: {}}; + $scope.switchCommonSubMerchantId = function () { + if (!$scope.paymentInfo) { + return; + } + if (!$scope.init.common_sub_merchant_id) { + $scope.init.common_sub_merchant_id = true; + return; + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/common_sub_merchant_id', {allow: $scope.paymentInfo.common_sub_merchant_id}).then(function () { + $scope.loadPartnerPaymentInfo(); + }, function (resp) { + commonDialog.alert({ + title: 'Failed to change common_sub_merchant_id permission status', + content: resp.data.message, + type: 'error' + }) + }) + }; $scope.toggleChannel = function (channel) { if (!channel) { return; diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 876fb5e54..773472220 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -39,6 +39,12 @@
    +
    + +
    + +
    +
    From 76d9b65b73d292329560b54f743babc7aa4806e1 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Sat, 28 Apr 2018 11:01:57 +0800 Subject: [PATCH 41/56] fix html --- .../payment/manage/merchants/web/PartnerManageController.java | 2 +- .../static/payment/partner/templates/partner_payment_info.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 82e279ffd..37764d970 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -233,7 +233,7 @@ public class PartnerManageController { clientManager.refusePartner(clientMoniker, manager, refuse.getString("refuse_remark")); } - @ManagerMapping(value = "/{clientMoniker}/common_sub_merchant_id", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) + @ManagerMapping(value = "/{clientMoniker}/common_sub_merchant_id", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR}) public void switchCommonSubMerchantId(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.switchPermission(manager, clientMoniker, "common_sub_merchant_id", pass.getBooleanValue("allow")); } diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 773472220..7e792cbc9 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -39,7 +39,7 @@
    -
    +
    From 47df91b1c5a323c91df8d34476b2a28a6c692948 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Sat, 28 Apr 2018 15:04:32 +0800 Subject: [PATCH 42/56] add manage web --- ....java => RiskMerchantDetailLogMapper.java} | 6 +- .../risk/RiskMerchantRecordMapper.java | 4 +- .../manage/risk/bean/AddRiskDetailLog.java | 44 ++++--- .../manage/risk/bean/QueryRiskDetail.java | 70 +++++++++++ .../manage/risk/core/RiskMerchantService.java | 5 + .../core/impl/RiskMerchantServiceImpl.java | 66 ++++++++-- .../manage/risk/web/RiskController.java | 17 ++- .../risk/RiskMerchantDetailLogMapper.xml | 17 +++ .../mappers/risk/RiskMerchantRecordMapper.xml | 1 + .../mappers/risk/RiskTransactionLogMapper.xml | 1 + src/main/ui/static/risk/risk.js | 114 +++++++++++++++--- src/main/ui/static/risk/templates/risk.html | 6 +- .../ui/static/risk/templates/risk_detail.html | 63 ++++++++++ .../ui/static/risk/templates/risk_edit.html | 1 + .../static/risk/templates/risk_history.html | 72 ++--------- .../ui/static/risk/templates/risk_orders.html | 21 +++- .../ui/static/risk/templates/risk_remark.html | 25 ++++ 17 files changed, 420 insertions(+), 113 deletions(-) rename src/main/java/au/com/royalpay/payment/manage/mappers/risk/{RiskMerchantDetalLogMapper.java => RiskMerchantDetailLogMapper.java} (68%) create mode 100644 src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskDetail.java create mode 100644 src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.xml create mode 100644 src/main/ui/static/risk/templates/risk_detail.html create mode 100644 src/main/ui/static/risk/templates/risk_remark.html diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java similarity index 68% rename from src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java rename to src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java index b421b0d89..4c0db3b16 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetalLogMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java @@ -1,6 +1,8 @@ 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; @@ -10,11 +12,13 @@ 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 RiskMerchantDetalLogMapper { +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 index 1c14b9b0a..0aa2f7465 100644 --- 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 @@ -18,9 +18,9 @@ public interface RiskMerchantRecordMapper { @AutoSql(type = SqlType.UPDATE) void update(JSONObject record); - PageList query(JSONObject params, PageBounds pagination); - @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/risk/bean/AddRiskDetailLog.java b/src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java index 8b4f44e4a..2f787efd4 100644 --- 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 @@ -1,26 +1,40 @@ 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; - private int client_id; - + @JsonProperty("files") private String files; + @JsonProperty("operation") private String operation; - public JSONObject params(){ + @JsonProperty("remark") + private String remark; + + public JSONObject params() { JSONObject params = new JSONObject(); - params.put("record_id",this.record_id); - params.put("client_id",this.client_id); - params.put("files",this.files); - params.put("operation",this.operation); + 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; } @@ -29,14 +43,6 @@ public class AddRiskDetailLog { this.record_id = record_id; } - public int getClient_id() { - return client_id; - } - - public void setClient_id(int client_id) { - this.client_id = client_id; - } - public String getFiles() { return files; } @@ -52,4 +58,12 @@ public class AddRiskDetailLog { 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/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/core/RiskMerchantService.java b/src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java index 415dca96b..a8a2109af 100644 --- 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 @@ -2,6 +2,7 @@ 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; @@ -17,6 +18,8 @@ public interface RiskMerchantService { void dealRiskRecord(JSONObject account,DealRiskRecord dealRiskRecord); + void dealRiskRecordDirectly(JSONObject account,String record_id); + JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder); JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord); @@ -27,6 +30,8 @@ public interface RiskMerchantService { 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 index 0c541847b..2243b8368 100644 --- 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 @@ -1,12 +1,13 @@ package au.com.royalpay.payment.manage.risk.core.impl; -import au.com.royalpay.payment.manage.mappers.risk.RiskMerchantDetalLogMapper; +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; @@ -31,7 +32,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { @Resource private RiskMerchantRecordMapper riskMerchantRecordMapper; @Resource - private RiskMerchantDetalLogMapper riskMerchantDetalLogMapper; + private RiskMerchantDetailLogMapper riskMerchantDetailLogMapper; @Resource private RiskTransactionLogMapper riskTransactionLogMapper; @Resource @@ -40,11 +41,23 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { private ClientManager clientManager; @Override + @Transactional public void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account) { - JSONObject record = addRiskDetailLog.params(); - record.put("auditor", account.getString("display_name")); - record.put("create_time", new Date()); - riskMerchantDetalLogMapper.save(record); + 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); + record.put("status", 2); + JSONObject recordUpdate = new JSONObject(); + recordUpdate.put("record_id", record.getString("record_id")); + recordUpdate.put("status", 2); + riskMerchantRecordMapper.update(recordUpdate); } @Override @@ -59,15 +72,16 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { } JSONObject record = new JSONObject(); record.put("id", recordId); - record.put("status", "2"); + 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("operation", "进行掉单处理"); detail.put("create_time", new Date()); - riskMerchantDetalLogMapper.save(detail); + riskMerchantDetailLogMapper.save(detail); } @Override @@ -90,7 +104,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { detail.put("auditor", account.getString("display_name")); detail.put("operation", "不做处理"); detail.put("create_time", new Date()); - riskMerchantDetalLogMapper.save(detail); + riskMerchantDetailLogMapper.save(detail); } @Override @@ -120,8 +134,31 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { detail.put("auditor", account.getString("display_name")); detail.put("operation", StringUtils.isEmpty(operation) ? null : (operation = "处理结果:" + operation)); detail.put("create_time", new Date()); - riskMerchantDetalLogMapper.save(detail); - record.put("status", 1); + riskMerchantDetailLogMapper.save(detail); + record.put("status", 2); + riskMerchantRecordMapper.update(record); + } + + @Override + 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("operation", "关结"); + detail.put("create_time", new Date()); + riskMerchantDetailLogMapper.save(detail); + JSONObject recordUpdate = new JSONObject(); + recordUpdate.put("record_id",record_id); + recordUpdate.put("status", 1); riskMerchantRecordMapper.update(record); } @@ -171,4 +208,11 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { 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 index b857c3090..9fd4be497 100644 --- 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 @@ -3,6 +3,7 @@ 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; @@ -49,6 +50,11 @@ public class RiskController { 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); @@ -60,7 +66,6 @@ public class RiskController { return riskMerchantService.getRiskOrders(queryRiskOrder); } - @RequestMapping(value = "/white/{client_moniker}", method = RequestMethod.POST) public void addWhiteList(@PathVariable String client_moniker) { riskMerchantService.addWhiteList(client_moniker); @@ -76,4 +81,14 @@ public class RiskController { 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 index 67dceb727..2d8749648 100644 --- 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 @@ -21,5 +21,6 @@ and client_id = #{client_id} + order by create_time desc \ 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 index d7f0bf1eb..b413d7bbd 100644 --- 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 @@ -15,5 +15,6 @@ and create_time < #{c_end_time} + order by create_time desc \ No newline at end of file diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index 961565a57..c033d960e 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -2,8 +2,8 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS 'use strict'; var riskType = [ - {code: 1, label: 'test1'}, - {code: 2, label: 'test2'}, + {code: '1', label: 'test1'}, + {code: '2', label: 'test2'}, ]; var app = angular.module('RiskManagement', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ngFileUpload']); @@ -34,6 +34,17 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }); }] } + }).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){ @@ -68,7 +79,6 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }; $scope.loadOrders(1); - $scope.loadHistoryOrders = function (page) { var historyParams = angular.copy($scope.historyParams); historyParams.page = page || $scope.historyPagination.page || 1; @@ -125,6 +135,74 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS } }]); + 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 () { + 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); + }).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 () { @@ -140,20 +218,26 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS } }]); - - app.filter('risk_type', function (typeString) { - var sArr = typeString.split(","); - var result = ""; - angular.forEach(sArr, function (s) { + app.filter('risk_type', function () { + return function (riskStr) { angular.forEach(riskType,function (type) { - if (type==s){ - result+=type; - result+=","; - } + riskStr = riskStr.replace(type.code,type.label); }) - }); - result = result.substr(0,result.length-2); - return result; + 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 index 7253a7a99..f5cd1f7da 100644 --- a/src/main/ui/static/risk/templates/risk.html +++ b/src/main/ui/static/risk/templates/risk.html @@ -14,10 +14,10 @@ Client Moniker - Create Time + Create Timer Waring Time - Risk Types Status + Risk Types Risk Counts Operation @@ -27,7 +27,7 @@ {{record.client_moniker}} {{record.create_time}} {{record.expiry_time}} - {{record.status}} + {{record.status|status_type}} {{record.risk_types|risk_type}} {{record.risk_counts}} 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..03e8d87f5 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -0,0 +1,63 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Risk Details
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    Create Timeauditoroperationremark
    {{record.create_time}}{{record.auditor}}{{record.operation}}{{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 index 14e2ce8c2..c6d99e4c3 100644 --- a/src/main/ui/static/risk/templates/risk_edit.html +++ b/src/main/ui/static/risk/templates/risk_edit.html @@ -19,6 +19,7 @@ Disable Merchant
    +
    diff --git a/src/main/ui/static/risk/templates/risk_history.html b/src/main/ui/static/risk/templates/risk_history.html index 87a2f2468..2959e53f9 100644 --- a/src/main/ui/static/risk/templates/risk_history.html +++ b/src/main/ui/static/risk/templates/risk_history.html @@ -9,68 +9,22 @@
    -
    Record History
    -
    - - - - - - - - - - - - - - - - - - - - - - - -
    Client MonikerCreate TimeWaring TimeRisk TypesStatusRisk CountsOperation
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_time}}{{record.status}}{{record.risk_types|risk_type}}{{record.risk_counts}} - - - - - - - -
    - -
    -
    - - -
    +
    diff --git a/src/main/ui/static/risk/templates/risk_orders.html b/src/main/ui/static/risk/templates/risk_orders.html index e4399d1d2..3e07bb71f 100644 --- a/src/main/ui/static/risk/templates/risk_orders.html +++ b/src/main/ui/static/risk/templates/risk_orders.html @@ -9,12 +9,17 @@
    Reference Orders
    @@ -25,6 +30,7 @@
    + @@ -33,6 +39,7 @@ + @@ -63,6 +70,7 @@ + @@ -71,6 +79,7 @@ + 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

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    From 942acf08babb5f7ed9ffe540da4a5838cffe3e6a Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Sat, 28 Apr 2018 16:50:21 +0800 Subject: [PATCH 43/56] update --- .../manage/risk/core/impl/RiskMerchantServiceImpl.java | 10 +++------- src/main/ui/static/risk/risk.js | 4 ++-- src/main/ui/static/risk/templates/risk_detail.html | 6 ++++-- src/main/ui/static/risk/templates/risk_edit.html | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) 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 index 2243b8368..8d99a5afe 100644 --- 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 @@ -53,11 +53,6 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { detail.put("auditor_id", account.getString("manager_id")); detail.put("create_time", new Date()); riskMerchantDetailLogMapper.save(detail); - record.put("status", 2); - JSONObject recordUpdate = new JSONObject(); - recordUpdate.put("record_id", record.getString("record_id")); - recordUpdate.put("status", 2); - riskMerchantRecordMapper.update(recordUpdate); } @Override @@ -140,6 +135,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { } @Override + @Transactional public void dealRiskRecordDirectly(JSONObject account, String record_id) { JSONObject record = riskMerchantRecordMapper.findById(record_id); if (record == null) { @@ -157,9 +153,9 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { detail.put("create_time", new Date()); riskMerchantDetailLogMapper.save(detail); JSONObject recordUpdate = new JSONObject(); - recordUpdate.put("record_id",record_id); + recordUpdate.put("id",record_id); recordUpdate.put("status", 1); - riskMerchantRecordMapper.update(record); + riskMerchantRecordMapper.update(recordUpdate); } @Override diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index c033d960e..3b78fdeb6 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -148,8 +148,6 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }) }; $scope.listDetail(1); - - $scope.addRemark = function () { $uibModal.open({ templateUrl: '/static/risk/templates/risk_remark.html', @@ -158,6 +156,7 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS return record.id; }} }).result.then(function () { + $scope.listDetail(1); commonDialog.alert({ title: 'Success', type: 'success' @@ -176,6 +175,7 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS type: 'Success' }); $scope.listDetail(1); + $scope.record.status=1; }).then(function (resp) { commonDialog.alert({ title: 'Error', diff --git a/src/main/ui/static/risk/templates/risk_detail.html b/src/main/ui/static/risk/templates/risk_detail.html index 03e8d87f5..08ebab206 100644 --- a/src/main/ui/static/risk/templates/risk_detail.html +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -21,8 +21,10 @@
    Risk Details
    -
    -
    +
    + + +
    Order Id Amount ChannelCreate Time Risk Types
    {{order.order_id}} {{order.amount}} {{order.channel}}{{order.create_time}} {{order.risk_types|risk_type}}
    Order Id Amount ChannelCreate Time Risk Types
    {{order.order_id}} {{order.amount}} {{order.channel}}{{order.create_time}} {{order.risk_types|risk_type}}
    diff --git a/src/main/ui/static/risk/templates/risk_edit.html b/src/main/ui/static/risk/templates/risk_edit.html index c6d99e4c3..a1fa06c5d 100644 --- a/src/main/ui/static/risk/templates/risk_edit.html +++ b/src/main/ui/static/risk/templates/risk_edit.html @@ -1,5 +1,5 @@
    -

    Phone Top Up

    +

    Add Remark

    From b71cfdaa5c89eadd2f19a9f01406a98262b01475 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Sat, 28 Apr 2018 17:15:41 +0800 Subject: [PATCH 44/56] update --- .../risk/core/impl/RiskMerchantServiceImpl.java | 14 +++++++------- src/main/ui/static/risk/templates/risk.html | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) 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 index 8d99a5afe..d62762e94 100644 --- 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 @@ -74,7 +74,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { 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("operation", "进行掉单处理"); + detail.put("remark", "进行掉单处理"); detail.put("create_time", new Date()); riskMerchantDetailLogMapper.save(detail); } @@ -97,7 +97,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { detail.put("record_id", recordId); detail.put("client_id", riskRecord.getIntValue("client_id")); detail.put("auditor", account.getString("display_name")); - detail.put("operation", "不做处理"); + detail.put("remark", "不做处理"); detail.put("create_time", new Date()); riskMerchantDetailLogMapper.save(detail); } @@ -112,22 +112,22 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { if (record.getIntValue("status") != 0) { throw new BadRequestException("The Record Has Been Handled"); } - String operation = ""; + String remark = ""; if (dealRiskRecord.getLimitAmount() != null) { clientManager.setMaxOrderAmount(record.getString("client_moniker"), dealRiskRecord.getLimitAmount()); - operation = operation + "限额" + 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); - operation = operation + " 关闭支付通道"; + 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("operation", StringUtils.isEmpty(operation) ? null : (operation = "处理结果:" + operation)); + detail.put("remark", StringUtils.isEmpty(remark) ? null : (remark = "处理结果:" + remark)); detail.put("create_time", new Date()); riskMerchantDetailLogMapper.save(detail); record.put("status", 2); @@ -149,7 +149,7 @@ public class RiskMerchantServiceImpl implements RiskMerchantService { 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("operation", "关结"); + detail.put("remark", "结停"); detail.put("create_time", new Date()); riskMerchantDetailLogMapper.save(detail); JSONObject recordUpdate = new JSONObject(); diff --git a/src/main/ui/static/risk/templates/risk.html b/src/main/ui/static/risk/templates/risk.html index f5cd1f7da..ff55c8552 100644 --- a/src/main/ui/static/risk/templates/risk.html +++ b/src/main/ui/static/risk/templates/risk.html @@ -14,7 +14,7 @@
    - r + From f4ee21ae6a87f05b6a2966580df32bc6365445c1 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Sat, 28 Apr 2018 17:21:16 +0800 Subject: [PATCH 45/56] update --- src/main/ui/static/risk/templates/risk_detail.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/ui/static/risk/templates/risk_detail.html b/src/main/ui/static/risk/templates/risk_detail.html index 08ebab206..52d28fd32 100644 --- a/src/main/ui/static/risk/templates/risk_detail.html +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -31,7 +31,6 @@ - @@ -39,7 +38,6 @@ - From ff80fbe56d4a16fcdd336b7ca2694e7441806949 Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Mon, 30 Apr 2018 10:54:53 +0800 Subject: [PATCH 46/56] fix --- .../partner/templates/add_partner.html | 8 ++++--- .../partner/templates/partner_edit.html | 22 ++++++++----------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 5a93b9183..65c491856 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -380,25 +380,27 @@ Business Hours
    +

    + eg:Monday-Friday 09:00-20:00,Saturday-Sunday 10:00-22:00

    + Merchant Tag(Chinese)
    + Merchant Introduction(Chinese)
    + Video Introduction
    (youtube link)
    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index cb9a74b5c..65dd50894 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -271,34 +271,30 @@
    - + +

    + eg:Monday-Friday 09:00-20:00,Saturday-Sunday 10:00-22:00

    + Merchant Tag(Chinese)
    - +
    + Merchant Introduction(Chinese)
    - +
    + Video Introduction
    (youtube link)
    - +
    From bca940a8c554cec6390765a0066bc5fc934d5313 Mon Sep 17 00:00:00 2001 From: yixian Date: Tue, 1 May 2018 22:52:58 +0800 Subject: [PATCH 47/56] document update, php demo update --- src/document/cn/apis.js | 54 ++---------- src/document/en/apis.js | 54 ++---------- src/main/ui/static/phpdemo.zip | Bin 40970 -> 49285 bytes .../payment/manage/task/FillExcelTask.java | 83 ++++++++++++++++++ 4 files changed, 101 insertions(+), 90 deletions(-) create mode 100644 src/test/java/au/com/royalpay/payment/manage/task/FillExcelTask.java diff --git a/src/document/cn/apis.js b/src/document/cn/apis.js index f0e0dbcc7..de43ef974 100644 --- a/src/document/cn/apis.js +++ b/src/document/cn/apis.js @@ -756,52 +756,15 @@ * */ /** - * @api {PUT} /api/v1.0/alipay/partners/{partner_code}/app_orders/{order_id} 创建支付宝SDK订单 - * @apiName AlipaySDK - * @apiDescription - * 用于移动端APP调用支付宝SDK支付,调用API创建订单,得到支付宝SDK调用参数,将参数传递给SDK拉起支付宝支付,并由支付宝客户端直接返回支付结果。 - * 强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程,避免因超时自动撤单导致资金损失
    - *
    - * 关于客户端和支付宝整合的更多信息: 支付宝SDK文档
    - * SDK for Android
    - * SDK for iOS - * - * @apiVersion 1.0.0 - * @apiGroup SDKPayment - * @apiHeader Accept application/json - * @apiHeader Content-Type application/json - * @apiParam (PathVariable) {String} partner_code 必填,商户编码,由4位大写字母或数字构成 - * @apiParam (PathVariable) {String} order_id 必填,商户支付订单号,要求同一商户唯一 - * @apiUse Sign - * @apiParam (JSON) {String} description 必填,订单标题(最大长度128字符,超出自动截取) - * @apiParam (JSON) {int} price 必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 - * @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码 - * @apiParam (JSON) {String} notify_url 支付通知url,详见支付通知api,不填则不会推送支付通知 - * @apiParam (JSON) {String} operator 操作人员标识 - * @apiParam (JSON) {String=android,iphone,ipad} system 客户端操作系统类型,可选参数 - * @apiParam (JSON) {String} version 客户端版本号,可选参数 - * - * @apiSuccess {String} return_code 执行结果 - * @apiSuccess {String} result_code SUCCESS表示创建订单成功,EXISTS表示订单已存在 - * @apiSuccess {String} partner_code 商户编码 - * @apiSuccess {String} full_name 商户注册全名 - * @apiSuccess {String} partner_name 商户名称 - * @apiSuccess {String} order_id RoyalPay订单ID,同时也是微信订单ID,最终支付成功的订单ID可能不同 - * @apiSuccess {String} partner_order_id 商户订单ID - * @apiSuccess {String} sdk_params 调用SDK的参数字符串 - * - * @apiUse GlobalError - * @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配 - * @apiError (ERROR_CODE) ORDER_PAID 订单已支付 - * - */ -/** - * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} 创建微信SDK订单 - * @apiName WechatSDK + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} 创建SDK订单 + * @apiName SDK * @apiDescription * 用于移动端APP调用微信SDK支付,调用API创建订单,得到微信SDK调用参数,将参数传递给SDK拉起微信支付,并由微信客户端直接返回支付结果。 * 强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程,避免因超时自动撤单导致资金损失
    *
    + * 关于客户端和支付宝整合的更多信息: 支付宝SDK文档
    + * SDK for Android
    + * SDK for iOS * * @apiVersion 1.0.0 * @apiGroup SDKPayment @@ -813,11 +776,12 @@ * @apiParam (JSON) {String} description 必填,订单标题(最大长度128字符,超出自动截取) * @apiParam (JSON) {int} price 必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 * @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码 + * @apiParam (JSON) {String=Alipay,Wechat} 支付渠道,必填,大小写敏感 * @apiParam (JSON) {String} notify_url 支付通知url,详见支付通知api,不填则不会推送支付通知 * @apiParam (JSON) {String} operator 操作人员标识 - * @apiParam (JSON) {String=android,iphone,ipad} system 客户端操作系统类型,可选参数 - * @apiParam (JSON) {String} version 客户端版本号,可选参数 - * @apiParam (JSON) {String} appid 微信 appid + * @apiParam (JSON) {String=android,iphone,ipad} system 客户端操作系统类型,支付宝通道可选,微信不需要 + * @apiParam (JSON) {String} version 客户端版本号,支付宝通道可选,微信不需要 + * @apiParam (JSON) {String} appid 微信 appid,微信通道要求必填 * * @apiSuccess {String} return_code 执行结果 * @apiSuccess {String} result_code SUCCESS表示创建订单成功,EXISTS表示订单已存在 diff --git a/src/document/en/apis.js b/src/document/en/apis.js index 86f8737d8..716e20dfe 100644 --- a/src/document/en/apis.js +++ b/src/document/en/apis.js @@ -769,54 +769,17 @@ * @apiError (ERROR_CODE) ORDER_PAID Order has already been paid * */ -/** - * @api {PUT} /api/v1.0/alipay/partners/{partner_code}/app_orders/{order_id} 创建支付宝SDK订单 - * @apiName AlipaySDK - * @apiDescription - * Used for mobile Apps calling Alipay payment with Alipay SDK. Call this api to create order and get param string for SDK calling. Call SDK api with the param to start payment and get payment result from Alipay app - * It is strongly advised to request RoyalPay order query Api to confirm that the order has been paid in order to cancelling order by system at the same time.
    - *
    - * More information for integration with Alipay: Alipay SDK Document
    - * SDK for Android
    - * SDK for iOS - * @apiVersion 1.0.0 - * @apiGroup SDKPayment - * @apiHeader Accept application/json - * @apiHeader Content-Type application/json - * @apiParam (PathVariable) {String} partner_code Required, Partner code - * @apiParam (PathVariable) {String} order_id Required, Partner order id - * @apiUse Sign - * @apiParam (JSON) {String} description Required, Order description - * @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency. - * @apiParam (JSON) {String=AUD,CNY} currency=AUD Currency - * @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds - * @apiParam (JSON) {String} operator Note for the operator who created this order. - * @apiParam (JSON) {String=android,iphone,ipad} system os type of client app, optional - * @apiParam (JSON) {String} version client app version, optional - * - * @apiSuccess {String} return_code Execution result - * @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed. - * @apiSuccess {String} partner_code Partner code - * @apiSuccess {String} full_name Partner's full company name when registered - * @apiSuccess {String} partner_name Partner's name - * @apiSuccess {String} order_id Order id in RoyalPay, which is also WeChat order id. The final order id which is paid may be different from this one - * @apiSuccess {String} partner_order_id Partner order id - * @apiSuccess {String} sdk_params param string for calling SDK - * - * @apiUse GlobalError - * @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner - * @apiError (ERROR_CODE) ORDER_PAID Order has already been paid - * - */ - /** - * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} Create Wechat SDK Order - * @apiName WechatSDK + * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} Create SDK Order + * @apiName SDK * @apiDescription * Used for mobile Apps calling Wechat payment with Wechat SDK. Call this api to create order and get param string for SDK calling. Call SDK api with the param to start payment and get payment result from Wechat app * It is strongly advised to request RoyalPay order query Api to confirm that the order has been paid in order to cancelling order by system at the same time.
    *
    + * More information for integration with Alipay: Alipay SDK Document
    + * SDK for Android
    + * SDK for iOS * @apiVersion 1.0.0 * @apiGroup SDKPayment * @apiHeader Accept application/json @@ -827,11 +790,12 @@ * @apiParam (JSON) {String} description Required, Order description * @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency. * @apiParam (JSON) {String=AUD,CNY} currency=AUD Currency + * @apiParam (JSON) {String=Alipay,Wechat} payment channel, required, case sensitive * @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds * @apiParam (JSON) {String} operator Note for the operator who created this order. - * @apiParam (JSON) {String=android,iphone,ipad} system os type of client app, optional - * @apiParam (JSON) {String} version client app version, optional - * @apiParam (JSON) {String} appid wechat appid + * @apiParam (JSON) {String=android,iphone,ipad} system os type of client app, optional for Alipay, not required for Wechat + * @apiParam (JSON) {String} version client app version, optional for Alipay, not required for Wechat + * @apiParam (JSON) {String} appid wechat appid, required for Wechat, not required for Alipay * * @apiSuccess {String} return_code Execution result * @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed. diff --git a/src/main/ui/static/phpdemo.zip b/src/main/ui/static/phpdemo.zip index bac6014f9d8bf06bb8a82bfb872f453baa693109..779335b1922ea27a016a963095fd70a6daa6ce42 100644 GIT binary patch delta 27809 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

    CcL8#=x&kwuh1flI$(I(XUU|4VCmE|g< zVtZ*GwprYJ+RUzbRS?>4Dx83?=B2Pa}IG}X%h4l)yjtI@mM5`FsFrU)9Tg}BZ z*0#AC75d3D*cYgr$Ck06d7+lTJJg5#i9Ag}I_81Od2IeR%_~P6n#5mQpQpt8)R}>K zpmH9Y)k^ca(9D?ds{4H?q|A4Z_O zLBc~hCVbj}o#auy?*e8jZHdY~vKc7A^hV5lis^HTxnIQb18h*5ZJxeDv#Ye=H*C;D z&7JdzFZD4hH1{rIub?zfXg>IXNjXMJ=I=7Gw2Y#cYutIGwR?a&5K z_l@vC8}Fs z%?lsNAABEz(meC<2AbDc2E2}8mjKSIX0#ghuSHh@ZZ9a|k?}3?_~7Sm*< royalCatMap; + private Map wxCatMap; + private File excel = new File("C:\\Users\\yixian\\Documents\\bd_merchants.xlsx"); + + @Before + public void initCategory() throws IOException { + String rpayCatStr = FileUtils.readFileToString(rpayCat, "utf-8"); + JSONArray rpayCatJson = JSON.parseArray(rpayCatStr); + List flatCollect = rpayCatJson.stream().map(item -> (JSONObject) item) + .flatMap(item -> loadChildren(item).stream()).collect(Collectors.toList()); + royalCatMap = rpayCatJson.stream().map(item -> (JSONObject) item) + .flatMap(item -> loadChildren(item).stream()) + .collect(Collectors.toMap(item -> item.getString("mccCode"), item -> item.getString("label"), (a, b) -> a)); + + String wxCatStr = FileUtils.readFileToString(wxCat, "utf-8"); + JSONObject wxCatJson = JSON.parseObject(wxCatStr); + wxCatMap = wxCatJson.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> (String) entry.getValue())); + + } + + private List loadChildren(JSONObject entity) { + if (entity.containsKey("children") && !entity.getJSONArray("children").isEmpty()) { + List arr = new ArrayList<>(Arrays.asList(entity)); + arr.addAll(entity.getJSONArray("children").stream().map(item -> (JSONObject) item).flatMap(item -> loadChildren(item).stream()).collect(Collectors.toList())); + return arr; + } + return Collections.singletonList(entity); + } + + @Test + public void replaceCat() throws IOException, InvalidFormatException { + Workbook wb = WorkbookFactory.create(excel); + Sheet sheet = wb.getSheetAt(0); + for (int rn = 1; rn <= sheet.getLastRowNum(); rn++) { + Row row = sheet.getRow(rn); + Cell wxCatCell = row.getCell(2); + Cell rpCatCell = row.getCell(3); + fillCateLabel(wxCatCell, wxCatMap); + fillCateLabel(rpCatCell, royalCatMap); + } + wb.write(new FileOutputStream("C:\\Users\\yixian\\Documents\\bd_merchants_final.xlsx")); + } + + private void fillCateLabel(Cell rpCatCell, Map royalCatMap) { + if (rpCatCell == null) { + return; + } + if (rpCatCell.getCellType() == Cell.CELL_TYPE_NUMERIC) { + String typeNum = (int) rpCatCell.getNumericCellValue() + ""; + if (royalCatMap.get(typeNum) != null) { + rpCatCell.setCellType(Cell.CELL_TYPE_STRING); + rpCatCell.setCellValue(royalCatMap.get(typeNum)); + } + } + } +} From 22c6e0aa5a32e6fa19fa89bd7fea203c5de61c3e Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Wed, 2 May 2018 09:42:30 +0800 Subject: [PATCH 48/56] fix html~ --- src/main/ui/static/payment/partner/templates/add_partner.html | 3 ++- src/main/ui/static/payment/partner/templates/partner_edit.html | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 65c491856..f337b44c2 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -402,7 +402,8 @@

    - + +

    eg:https://www.baidu.com

    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index 65dd50894..b429c17a6 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -294,7 +294,8 @@
    - + +

    eg:https://www.baidu.com

    From f4d5bdabafe674d27f4e7a2e3261829589fd9af3 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Wed, 2 May 2018 10:57:26 +0800 Subject: [PATCH 49/56] fix html~ --- .../static/payment/partner/partner-manage.js | 68 ++++++++++++----- .../partner/templates/add_partner.html | 8 +- .../templates/add_sub_partner_dialog.html | 74 +++++++++++++++++-- .../partner/templates/partner_detail.html | 4 +- .../partner/templates/partner_edit.html | 8 +- 5 files changed, 126 insertions(+), 36 deletions(-) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 75ab6ce26..8c26cd629 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -404,6 +404,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }) } + if(!window.frames['merchant_detail'].merchant_location){ + alert("Please Locate Merchant's Location"); + return; + } $http.post('/sys/partners', $scope.partner).then(function (resp) { commonDialog.alert({title: 'Success', content: 'Register new partner successfully', type: 'success'}); $scope.updateMerchantLocation(); @@ -473,8 +477,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter if (params) { $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { }); - } else { - alert("Please Locate Merchant's Location"); } } }]); @@ -954,11 +956,14 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }) } - $scope.updateMerchantLocation(); var content = ''; if (!origin_referrer_id && $scope.partner.referrer_id) { content = 'Update partner info successfully,But You Had add new Referrer,Please Change the BD Commission Proportion!'; } + if(!window.frames['merchant_detail'].merchant_location){ + alert("Please Locate Merchant Location!"); + return; + } $http.put('/sys/partners/' + $scope.partner.client_moniker, $scope.partner).then(function () { if (content != '') { commonDialog.alert({ @@ -973,6 +978,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter type: 'success' }); } + $scope.updateMerchantLocation(); $scope.loadPartners(); $state.go('^.detail', {clientMoniker: $scope.partner.client_moniker}, {reload: true}); }, function (resp) { @@ -1046,12 +1052,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter if (params) { $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { }); - } else { - commonDialog.alert({ - title: 'Warning', - content: 'Please Locate Merchant Location', - type: 'error' - }); } } }]); @@ -1823,6 +1823,24 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter return; } } + if (!$scope.partner.logo_url) { + alert("Logo is necessary!"); + return; + } + if($scope.partner.partner_type == 'photo'){ + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary'); + return; + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary'); + return; + } + } + if(!window.frames['merchant_detail'].merchant_location){ + alert("Please Locate Merchant Location!"); + return; + } $http.post('/sys/partners/' + clientMoniker + '/sub_clients', $scope.partner).then(function () { $scope.updateMerchantLocation(); $scope.$close(); @@ -1851,18 +1869,36 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.uploadShopPhoto = function (file) { if (file != null) { - $scope.photoProgress = {value: 0}; + $scope.shopPhotoProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.photoProgress; + delete $scope.shopPhotoProgress; $scope.partner.company_photo = resp.data.url; }, function (resp) { - delete $scope.photoProgress; + delete $scope.shopPhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + }; + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + $scope.storePhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.storePhotoProgress; + $scope.partner.store_photo = resp.data.url; + }, function (resp) { + delete $scope.storePhotoProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.photoProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); }) } }; @@ -1871,12 +1907,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter if (params) { $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { }); - } else { - commonDialog.alert({ - title: 'Warning', - content: 'Please Locate Merchant Location', - type: 'error' - }); } } }]); diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index f337b44c2..df9fa4b0f 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -1,6 +1,6 @@ @@ -237,7 +237,7 @@ - +
    2:  @@ -249,7 +249,7 @@
    - +
    @@ -372,7 +372,7 @@
    -
    Alipay Information
    +
    Alipay Information  (Optional)
    diff --git a/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html b/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html index 64d9f7be1..9976059e9 100644 --- a/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html +++ b/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html @@ -1,3 +1,9 @@ + @@ -169,6 +175,8 @@

    If the partner is a offline shop then a photo of shop is required while an online store shall choose companyWebsite

    +

    + 只要有可能产生线下交易(商户静态码、POS),就必须上传照片,否则支付宝会禁止交易

    Required Field

    @@ -177,16 +185,29 @@
    -
    -
    +
    +
    1:  + +
    + + +
    +
    +
    2: 
    - - + +
    +
    +
    Alipay Information  (Optional)
    +
    +
    +
    + +
    + +

    + eg:Monday-Friday 09:00-20:00,Saturday-Sunday 10:00-22:00

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

    eg:https://www.baidu.com

    +
    +
    +
    +
    +
    +
    Contact Information
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 0fd091ad1..7b9717ead 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -308,7 +308,7 @@
    - +
    @@ -454,7 +454,7 @@
    -
    Alipay Information
    +
    Alipay Information  (Optional)
    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index b429c17a6..ace8a6272 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -1,6 +1,6 @@ @@ -186,7 +186,7 @@
    - +
    2:  @@ -198,7 +198,7 @@
    - +
    -
    Alipay Information
    +
    Alipay Information   (Optional)
    From ee3e71e5c5d8636be7225e4b4c55c2ced9398364 Mon Sep 17 00:00:00 2001 From: yuan <1551130722@qq.com> Date: Wed, 2 May 2018 13:58:11 +0800 Subject: [PATCH 50/56] fix html~ --- src/main/ui/static/payment/partner/partner-manage.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 8c26cd629..138388d1f 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -1495,6 +1495,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; $scope.getRates(); $scope.saveBankAccount = function () { + if(isNaN($scope.bankaccount.account_no)){ + alert("Account No应输入数字!"); + return; + }; $http.put('/sys/partners/' + $scope.partner.client_moniker + '/bank_account', $scope.bankaccount).then(function () { $scope.getBankAccount(); }, function (resp) { From e11fa1efd5ae0c346fade1cb9da29508295ea238 Mon Sep 17 00:00:00 2001 From: yixian Date: Wed, 2 May 2018 15:39:23 +0800 Subject: [PATCH 51/56] rpay channel edit --- src/document/cn/overview.md | 4 ++-- src/document/en/overview.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/document/cn/overview.md b/src/document/cn/overview.md index 210dfdbab..0b63621c3 100644 --- a/src/document/cn/overview.md +++ b/src/document/cn/overview.md @@ -32,8 +32,8 @@ ## 支付宝渠道区分 支付宝根据调用接口不同分为线上和线下两个渠道,两个渠道分别使用不同的汇率和手续费费率,为避免混淆在此区分: -+ 线上渠道:包含H5 Mobile、Web支付以及APP SDK三种支付方式 -+ 线下渠道:包含JSAPI、QR Code、Retail Pay 3种支付方式 ++ 线上渠道:包含H5 Mobile、Web支付、APP SDK、JSAPI、QR Code 5种支付方式 ++ 线下渠道:Retail Pay 支付方式 相似接口区别 - JSAPI和H5 Mobile:JSAPI只能在支付宝客户端内访问的页面调起支付,H5可以在移动设备任意浏览器或App的WebView调起支付 diff --git a/src/document/en/overview.md b/src/document/en/overview.md index 1aadf8293..287ebaae2 100644 --- a/src/document/en/overview.md +++ b/src/document/en/overview.md @@ -37,8 +37,8 @@ System error message supports Simplified Chinese and English. The system by defa ## Alipay Channels According to different Api used, Alipay channel was distributed to Retail channel and Online channel. Two channels has different exchange rate and surcharge rate. -+ Online Channel: Including H5 Mobile, Online Payment and APP SDK -+ Retail Channel: Including JSAPI, QR Code Api, Retail Pay ++ Online Channel: Including H5 Mobile, Online Payment, APP SDK, JSAPI and QR Code Api ++ Retail Channel: Including Retail Pay Difference - JSAPI and H5 Mobile: JSAPI can only be called in the web page opened in Alipay Client. H5 Mobile can call the payment panel in any browser or webview in App in the mobile device. From 393b2cea906ea4891758ff9de761a4859dd125ef Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Wed, 2 May 2018 15:42:12 +0800 Subject: [PATCH 52/56] update --- src/db/modify.sql | 67 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/db/modify.sql b/src/db/modify.sql index 8b4a19fcf..f61633f2e 100644 --- a/src/db/modify.sql +++ b/src/db/modify.sql @@ -370,4 +370,69 @@ CREATE TABLE `log_client_sub_merchant_id` ( `create_time` datetime NOT NULL COMMENT '创建时间', `client_id` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + + + +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'); \ No newline at end of file From b7b1d49454b44619b337cb856bf7fdfd19229d6a Mon Sep 17 00:00:00 2001 From: "eason.qian" Date: Wed, 2 May 2018 18:20:39 +0800 Subject: [PATCH 53/56] fix --- src/document/cn/apis.js | 2 +- src/document/en/apis.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/document/cn/apis.js b/src/document/cn/apis.js index de43ef974..590c94fd1 100644 --- a/src/document/cn/apis.js +++ b/src/document/cn/apis.js @@ -776,7 +776,7 @@ * @apiParam (JSON) {String} description 必填,订单标题(最大长度128字符,超出自动截取) * @apiParam (JSON) {int} price 必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 * @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码 - * @apiParam (JSON) {String=Alipay,Wechat} 支付渠道,必填,大小写敏感 + * @apiParam (JSON) {String=Alipay,Wechat} channel 支付渠道,必填,大小写敏感 * @apiParam (JSON) {String} notify_url 支付通知url,详见支付通知api,不填则不会推送支付通知 * @apiParam (JSON) {String} operator 操作人员标识 * @apiParam (JSON) {String=android,iphone,ipad} system 客户端操作系统类型,支付宝通道可选,微信不需要 diff --git a/src/document/en/apis.js b/src/document/en/apis.js index 716e20dfe..1f2ce5882 100644 --- a/src/document/en/apis.js +++ b/src/document/en/apis.js @@ -790,7 +790,7 @@ * @apiParam (JSON) {String} description Required, Order description * @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency. * @apiParam (JSON) {String=AUD,CNY} currency=AUD Currency - * @apiParam (JSON) {String=Alipay,Wechat} payment channel, required, case sensitive + * @apiParam (JSON) {String=Alipay,Wechat} channel payment channel, required, case sensitive * @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds * @apiParam (JSON) {String} operator Note for the operator who created this order. * @apiParam (JSON) {String=android,iphone,ipad} system os type of client app, optional for Alipay, not required for Wechat From dc4c955395035399c6547bb617bdce0c99528009 Mon Sep 17 00:00:00 2001 From: wangning <164851225@qq.com> Date: Wed, 2 May 2018 19:11:57 +0800 Subject: [PATCH 54/56] fix bug --- .../payment/manage/risk/bean/QueryRiskRecord.java | 8 ++++++++ src/main/ui/static/risk/risk.js | 2 +- src/main/ui/static/risk/templates/risk_orders.html | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) 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 index a1de31509..e43902673 100644 --- 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 @@ -80,4 +80,12 @@ public class QueryRiskRecord { 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; + } } diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index 3b78fdeb6..6dd4e4e2a 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -71,7 +71,7 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS 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.referenceOrders = resp.data.data; $scope.pagination = resp.data.pagination; $scope.historyParams.c_end_time = $scope.orders.pop().create_time; $scope.loadHistoryOrders(1); diff --git a/src/main/ui/static/risk/templates/risk_orders.html b/src/main/ui/static/risk/templates/risk_orders.html index 3e07bb71f..47f9b2fce 100644 --- a/src/main/ui/static/risk/templates/risk_orders.html +++ b/src/main/ui/static/risk/templates/risk_orders.html @@ -35,7 +35,7 @@
    - + @@ -46,7 +46,7 @@
    Client MonikerCreate TimeCreate Time Waring Time Status Risk Types
    Create Time auditoroperation remark
    {{record.create_time}} {{record.auditor}}{{record.operation}} {{record.remark}}
    {{order.order_id}} {{order.amount}} {{order.channel}}
    @@ -16,22 +16,22 @@ Risk history
  • - Risk Detail + Handling Detail
  • -
    Risk Details
    +
    Handling Details
    - - + +
    - - - + + + diff --git a/src/main/ui/static/risk/templates/risk_history.html b/src/main/ui/static/risk/templates/risk_history.html index 2959e53f9..baa2e7916 100644 --- a/src/main/ui/static/risk/templates/risk_history.html +++ b/src/main/ui/static/risk/templates/risk_history.html @@ -17,7 +17,7 @@ Risk history
  • - Risk Detail + Handling Detail
  • diff --git a/src/main/ui/static/risk/templates/risk_orders.html b/src/main/ui/static/risk/templates/risk_orders.html index 47f9b2fce..53fa12822 100644 --- a/src/main/ui/static/risk/templates/risk_orders.html +++ b/src/main/ui/static/risk/templates/risk_orders.html @@ -17,7 +17,7 @@ Risk history
  • - Risk Detail + Handling Detail
  • diff --git a/src/main/ui/static/risk/templates/risk_remark.html b/src/main/ui/static/risk/templates/risk_remark.html index 8a994ca79..e7de83584 100644 --- a/src/main/ui/static/risk/templates/risk_remark.html +++ b/src/main/ui/static/risk/templates/risk_remark.html @@ -1,5 +1,5 @@
    -

    Phone Top Up

    +

    Handle Detail

    @@ -10,7 +10,7 @@
    - +
    Create TimeauditorremarkHandle TimeOperatorDetail