Merge remote-tracking branch 'origin/master'

master
yixian 4 years ago
commit 77e265a7f4

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<!--编码字符集-->
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java"/>
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<module name="FileLength">
<property name="max" value="1000"/>
<property name="severity" value="error"/>
</module>
<!--检查项规则配置-->
<module name="TreeWalker">
<!-- 命名检查 -->
<module name="AbbreviationAsWordInName"/>
<module name="AbstractClassName">
<property name="ignoreModifier" value="true"/>
</module>
<module name="CatchParameterName"/>
<module name="ClassTypeParameterName"/>
<module name="ConstantName"/>
<module name="InterfaceTypeParameterName">
<property name="format" value="^[a-zA-Z]$"/>
</module>
<module name="LambdaParameterName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<property name="severity" value="error"/>
</module>
<module name="MethodName">
<property name="format" value="^[a-z]([a-zA-Z0-9])*$"/>
</module>
<module name="MethodTypeParameterName">
<property name="format" value="^[a-zA-Z]$"/>
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z][_a-zA-Z0-9]+$"/>
</module>
<module name="StaticVariableName">
<property name="format" value="^[a-z](_?[a-zA-Z0-9]+)*$"/>
</module>
<module name="TypeName">
<property name="format" value="^[A-Z](_?[a-zA-Z0-9]+)*$"/>
</module>
<module name="TypeName">
<property name="format"
value="^I_[a-zA-Z0-9]*$"/>
<property name="tokens"
value="INTERFACE_DEF"/>
</module>
<!--
空格检查,该检查是为了增加代码的可读性、可维护性
-->
<module name="EmptyForInitializerPad">
<property name="option" value="nospace"/>
</module>
<module name="EmptyForIteratorPad">
<property name="option" value="space"/>
</module>
<module name="EmptyLineSeparator">
<property name="tokens" value="VARIABLE_DEF, METHOD_DEF"/>
</module>
<module name="MethodParamPad">
<property name="tokens" value="METHOD_DEF"/>
<property name="option" value="nospace"/>
<property name="allowLineBreaks" value="true"/>
</module>
<module name="NoLineWrap">
<property name="tokens" value="IMPORT"/>
</module>
<module name="NoWhitespaceAfter">
<property name="tokens" value="DOT"/>
<property name="allowLineBreaks" value="false"/>
</module>
<module name="NoWhitespaceBefore">
<property name="tokens" value="DOT"/>
<property name="allowLineBreaks" value="true"/>
</module>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="SingleSpaceSeparator"/>
<module name="TypecastParenPad">
<property name="option" value="space"/>
</module>
<module name="WhitespaceAfter">
<property name="tokens" value="COMMA, SEMI, TYPECAST, LITERAL_ELSE"/>
</module>
<module name="WhitespaceAround">
<!-- else、catch、finally、赋值符、运算符、连接符-->
<property name="tokens" value="ASSIGN, BOR, BOR_ASSIGN, EQUAL, GE, GT, LAMBDA, LAND, LE, LITERAL_CATCH, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_SYNCHRONIZED, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, SL, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN"/>
</module>
<!--
Size检查依然是解决可读性
方法体大小、文件大小等
-->
<module name="AnonInnerLength">
<property name="max" value="80"/>
<property name="severity" value="error"/>
</module>
<module name="ExecutableStatementCount"/>
<module name="MethodCount">
<property name="maxTotal" value="30"/>
<property name="severity" value="error"/>
</module>
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF"/>
<property name="max" value="80"/>
<property name="countEmpty" value="false"/>
<property name="severity" value="error"/>
</module>
<module name="OuterTypeNumber"/>
<module name="ParameterNumber"/>
<!-- NeedBraces 检查是否应该使用括号的地方没有加括号
tokens: 定义检查的类型 -->
<module name="NeedBraces">
<property name="severity" value="error"/>
</module>
<!-- if-else嵌套语句个数 最多4层 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
<property name="severity" value="error"/>
</module>
</module>
</module>

@ -0,0 +1,62 @@
#! /bin/bash
# @author:haloo#
#@func:pre-commit#
## cp ./checkstyle/pre-commit ./.git/hooks/
echo 避免NPE是程序员的基本修养
echo 开始style checking
wd=`pwd`
echo "当前工作目录:$wd"
# check-style版本号
check_style_version="checkstyle-8.38-all.jar"
check_style_xml_name="GeekCheckStyle.xml"
check_jar_path="$wd/checkstyle/$check_style_version"
check_xml_path="$wd/checkstyle/$check_style_xml_name"
## 清空temp文件
rm -f temp
is_err=0
errorCount=0
warnCount=0
## 查找add到git 缓冲区中,以.java后缀的文件
for file in `git status --porcelain | sed s/^...// | grep '\.java$'`; do
path="$wd/$file"
echo "检查文件: $path"
re=`java -jar $check_jar_path -c $check_xml_path $path >> temp`
warn=`cat temp | grep "WARN"`
if [[ $warn = *"WARN"* ]];then
echo "${warn}"
needle="WARN"
number_of_occurrences=$(grep -o "$needle" <<< "$warn" | wc -l)
((warnCount = warnCount + number_of_occurrences))
is_err=1
fi
err=`cat temp | grep "ERROR"`
if [[ $err = *"ERROR"* ]];then
echo "${err}"
needle="ERROR"
number_of_occurrences=$(grep -o "$needle" <<< "$err" | wc -l)
((errorCount = errorCount + number_of_occurrences))
is_err=1
fi
done
echo "检查完成,祝你好运"
rm -f temp
if [ $is_err -ne 0 ];then
echo "出现了 $errorCount 个error"
echo "出现了 $warnCount 个warn"
echo "请先符合style才能提交"
exit 1
fi
echo "No Bug ,It is Good!!"
exit 0

@ -0,0 +1,2 @@
cp checkstyle/pre-commit .git/hooks/
chmod +x .git/hooks/pre-commit

@ -5,11 +5,11 @@
<parent> <parent>
<groupId>au.com.royalpay.payment</groupId> <groupId>au.com.royalpay.payment</groupId>
<artifactId>payment-parent</artifactId> <artifactId>payment-parent</artifactId>
<version>2.2.25</version> <version>2.2.26</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>manage</artifactId> <artifactId>manage</artifactId>
<version>2.3.76-SNAPSHOT</version> <version>2.3.77</version>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jib-maven-plugin.version>2.4.0</jib-maven-plugin.version> <jib-maven-plugin.version>2.4.0</jib-maven-plugin.version>

@ -1,7 +1,7 @@
package au.com.royalpay.payment.manage.appclient.beans; package au.com.royalpay.payment.manage.appclient.beans;
import au.com.royalpay.payment.core.beans.OrderStatus; import au.com.royalpay.payment.core.beans.OrderStatus;
import au.com.royalpay.payment.core.beans.PayChannel; import au.com.royalpay.payment.core.beans.PayChannelSearch;
import au.com.royalpay.payment.tools.defines.TradeType; import au.com.royalpay.payment.tools.defines.TradeType;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -25,7 +25,7 @@ public class AppQueryBean {
private String[] client_ids; private String[] client_ids;
private String app_client_ids; private String app_client_ids;
private OrderStatus status = OrderStatus.ALL; private OrderStatus status = OrderStatus.ALL;
private PayChannel channel = PayChannel.ALL; private PayChannelSearch channel = PayChannelSearch.ALL;
private int[] gateway; private int[] gateway;
private int clearing_status=-1; private int clearing_status=-1;
private String gateway_app; private String gateway_app;
@ -164,11 +164,11 @@ public class AppQueryBean {
this.app_client_ids = app_client_ids; this.app_client_ids = app_client_ids;
} }
public PayChannel getChannel() { public PayChannelSearch getChannel() {
return channel; return channel;
} }
public void setChannel(PayChannel channel) { public void setChannel(PayChannelSearch channel) {
this.channel = channel; this.channel = channel;
} }

@ -1,11 +1,8 @@
package au.com.royalpay.payment.manage.dev.core.impl; package au.com.royalpay.payment.manage.dev.core.impl;
import au.com.royalpay.payment.channels.rpay.runtime.RpayApi;
import au.com.royalpay.payment.manage.dev.core.ManualService; import au.com.royalpay.payment.manage.dev.core.ManualService;
import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper; import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientRateMapper; import au.com.royalpay.payment.manage.mappers.system.ClientRateMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientModifySupport;
import au.com.royalpay.payment.manage.task.PostponeClientTask; import au.com.royalpay.payment.manage.task.PostponeClientTask;
import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler; import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -37,12 +34,6 @@ public class ManualServiceimpl implements ManualService {
private ClientAccountMapper clientAccountMapper; private ClientAccountMapper clientAccountMapper;
@Resource @Resource
private SynchronizedScheduler synchronizedScheduler; private SynchronizedScheduler synchronizedScheduler;
@Resource
private ClientModifySupport clientModifySupport;
@Resource
private RpayApi rpayApi;
@Resource
private ClientMapper clientMapper;
@Override @Override
public void clientPostpone() { public void clientPostpone() {

@ -1,7 +1,7 @@
package au.com.royalpay.payment.manage.tradelog.beans; package au.com.royalpay.payment.manage.tradelog.beans;
import au.com.royalpay.payment.core.beans.OrderStatus; import au.com.royalpay.payment.core.beans.OrderStatus;
import au.com.royalpay.payment.core.beans.PayChannel; import au.com.royalpay.payment.core.beans.PayChannelSearch;
import au.com.royalpay.payment.tools.defines.TradeType; import au.com.royalpay.payment.tools.defines.TradeType;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -29,7 +29,7 @@ public class TradeLogQuery {
private int[] gateway; private int[] gateway;
private String source = "ALL" ; private String source = "ALL" ;
private OrderStatus status = OrderStatus.PAID; private OrderStatus status = OrderStatus.PAID;
private PayChannel channel = PayChannel.ALL; private PayChannelSearch channel = PayChannelSearch.ALL;
private String[] client_ids; private String[] client_ids;
private String dev_id; private String dev_id;
private int clearing_status; private int clearing_status;
@ -225,11 +225,11 @@ public class TradeLogQuery {
return trans_type; return trans_type;
} }
public PayChannel getChannel() { public PayChannelSearch getChannel() {
return channel; return channel;
} }
public void setChannel(PayChannel channel) { public void setChannel(PayChannelSearch channel) {
this.channel = channel; this.channel = channel;
} }

@ -1,20 +1,20 @@
spring: spring:
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
host: 192.168.0.84:3306 host: 192.168.0.92:3306
master: master:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://${spring.datasource.host}/${spring.datasource.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false jdbc-url: jdbc:mysql://${spring.datasource.host}/${spring.datasource.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
password: ${spring.datasource.pwd} password: ${spring.datasource.pwd}
username: ${spring.datasource.user} username: ${spring.datasource.user}
pwd: rpayplus pwd: SuTUUxyvzS0cLETi6Rzm
schema-name: royalpay schema-name: royalpay
slave: slave:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://${spring.datasource.host}/${spring.datasource.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false jdbc-url: jdbc:mysql://${spring.datasource.host}/${spring.datasource.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
password: ${spring.datasource.pwd} password: ${spring.datasource.pwd}
username: ${spring.datasource.user} username: ${spring.datasource.user}
user: root user: rpaydev
redis: redis:
database: 9 database: 9
host: 192.168.0.84 host: 192.168.0.84

@ -18,8 +18,6 @@ jetty:
multipart: multipart:
max-file-size: 10Mb max-file-size: 10Mb
app: app:
active:
channels: Wechat,Alipay,AlipayOnline,Gmo,UnionPay,AlipayPlus
crossapp: crossapp:
enable: true enable: true
agreetemplate: agreetemplate:

@ -2,57 +2,63 @@
* Created by yixian on 2017-05-03. * Created by yixian on 2017-05-03.
*/ */
define(['angular', 'decimal', 'uiRouter', './report/analysis-report'], function (angular, Decimal) { define(['angular', 'decimal', 'uiRouter', './report/analysis-report'], function (angular, Decimal) {
'use strict'; 'use strict'
var app = angular.module('settleReportApp', ['ui.router']); var app = angular.module('settleReportApp', ['ui.router'])
app.config(['$stateProvider', function ($stateProvider) { app.config([
'$stateProvider',
function ($stateProvider) {
$stateProvider.state('analysis_report.settle_report', { $stateProvider.state('analysis_report.settle_report', {
url: '/settle_report', url: '/settle_report',
templateUrl: '/static/analysis/templates/settle_report.html', templateUrl: '/static/analysis/templates/settle_report.html',
controller: 'settleFinancialReportCtrl' controller: 'settleFinancialReportCtrl',
}) })
}]); },
app.controller('settleFinancialReportCtrl', ['$scope', '$http', '$filter', function ($scope, $http, $filter) { ])
$scope.params = {year: new Date().getFullYear()}; app.controller('settleFinancialReportCtrl', [
$scope.availableYears = [new Date().getFullYear() - 1, new Date().getFullYear()]; '$scope',
$scope.initMonth = function (year) { '$http',
$scope.params.year = year; '$filter',
$scope.months = []; function ($scope, $http, $filter) {
$scope.params = { year: new Date() }
$scope.initMonth = function () {
const year = $scope.params.year.getFullYear()
$scope.months = []
for (var i = 1; i < 13; i++) { for (var i = 1; i < 13; i++) {
var mon = '00' + i; var mon = '00' + i
mon = mon.substr(mon.length - 2, 2); mon = mon.substr(mon.length - 2, 2)
$scope.months.push(year + '-' + mon); $scope.months.push(year + '-' + mon)
} }
}; }
$scope.initMonth(new Date().getFullYear()); $scope.initMonth()
$scope.hasReport = function (mon) { $scope.hasReport = function (mon) {
var start = '2017-02';//todo modify in different country var end = $filter('date')(new Date(), 'yyyy-MM')
var end = $filter('date')(new Date(), 'yyyy-MM'); return end >= mon
return start <= mon && end >= mon }
};
$scope.loadReport = function (mon) { $scope.loadReport = function (mon) {
var monItems = mon.split('-'); var monItems = mon.split('-')
var year = monItems[0]; var year = monItems[0]
var month = monItems[1]; var month = monItems[1]
var monStr = year + month; var monStr = year + month
$http.get('/sys/financial/settlement/month_reports/' + monStr).then(function (resp) { $http.get('/sys/financial/settlement/month_reports/' + monStr).then(function (resp) {
$scope.report = { $scope.report = {
month: monStr, month: monStr,
settlements: resp.data settlements: resp.data,
}; }
$scope.analysis = { $scope.analysis = {
gross_amount: 0, gross_amount: 0,
wechat_settlement: 0, wechat_settlement: 0,
net_amount: 0, net_amount: 0,
royalpay_charge: 0 royalpay_charge: 0,
}; }
angular.forEach($scope.report.settlements, function (settle) { angular.forEach($scope.report.settlements, function (settle) {
$scope.analysis.gross_amount = Decimal.add(settle.gross_amount, $scope.analysis.gross_amount).toFixed(2); $scope.analysis.gross_amount = Decimal.add(settle.gross_amount, $scope.analysis.gross_amount).toFixed(2)
$scope.analysis.wechat_settlement = Decimal.add(settle.wechat_settlement, $scope.analysis.wechat_settlement).toFixed(2); $scope.analysis.wechat_settlement = Decimal.add(settle.wechat_settlement, $scope.analysis.wechat_settlement).toFixed(2)
$scope.analysis.net_amount = Decimal.add(settle.net_amount, $scope.analysis.net_amount).toFixed(2); $scope.analysis.net_amount = Decimal.add(settle.net_amount, $scope.analysis.net_amount).toFixed(2)
$scope.analysis.royalpay_charge = Decimal.add(settle.royalpay_charge, $scope.analysis.royalpay_charge).toFixed(2); $scope.analysis.royalpay_charge = Decimal.add(settle.royalpay_charge, $scope.analysis.royalpay_charge).toFixed(2)
}); })
})
}
},
])
return app
}) })
};
}]);
return app;
});

@ -17,13 +17,16 @@
</ul> </ul>
</div>--> </div>-->
<div ng-repeat="year in availableYears" style="display: inline"> <!-- <div ng-repeat="year in availableYears" style="display: inline">
<button class="btn btn-info" <button class="btn btn-info"
ng-click="initMonth(year)" ng-click="initMonth(year)"
ng-bind="year" ng-bind="year"
ng-class="{'active':year == params.year}" ng-class="{'active':year == params.year}"
></button> ></button>
</div> </div> -->
<button class="btn btn-info" ng-bind="params.year.getFullYear()" ng-click="ctrl.viewyear=true"></button>
<input type="text" class="hidden" uib-datepicker-popup="yyyy" ng-model="params.year" is-open="ctrl.viewyear"
datepicker-options="{minMode: 'year'}" ng-change="initMonth()" placeholder="Select Year">
</div> </div>
<div class="box-body"> <div class="box-body">
<div class="row"> <div class="row">
@ -40,7 +43,8 @@
<div class="box-header"> <div class="box-header">
<span ng-bind="report.month"></span> <span ng-bind="report.month"></span>
<span ng-bind="report.analysis.gross_amount"></span> <span ng-bind="report.analysis.gross_amount"></span>
<a role="button" class="btn btn-primary pull-right" ng-href="/sys/financial/settlement/month_reports/{{report.month}}/xls"> <a role="button" class="btn btn-primary pull-right"
ng-href="/sys/financial/settlement/month_reports/{{report.month}}/xls">
<i class="fa fa-file-excel-o"></i> Export Excel <i class="fa fa-file-excel-o"></i> Export Excel
</a> </a>
</div> </div>

@ -2,326 +2,419 @@
* Created by yixian on 2017-02-08. * Created by yixian on 2017-02-08.
*/ */
define(['angular', '../../analysis/bd/analysis-bd'], function (angular) { define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
'use strict'; 'use strict'
var app = angular.module('bdprize', ['ui.router']); var app = angular.module('bdprize', ['ui.router'])
app.config(['$stateProvider', function ($stateProvider) { app.config([
$stateProvider.state('analysis_bd.bd_prizes', { '$stateProvider',
function ($stateProvider) {
$stateProvider
.state('analysis_bd.bd_prizes', {
url: '/bd_prizes', url: '/bd_prizes',
templateUrl: '/static/config/bdprize/templates/bd_prize_root.html', templateUrl: '/static/config/bdprize/templates/bd_prize_root.html',
controller: 'bdPrizeRootCtrl' controller: 'bdPrizeRootCtrl',
}).state('analysis_bd.bd_prizes.month_report', { })
.state('analysis_bd.bd_prizes.month_report', {
url: '/{month}', url: '/{month}',
templateUrl: '/static/config/bdprize/templates/bd_prize_month_report.html', templateUrl: '/static/config/bdprize/templates/bd_prize_month_report.html',
controller: 'bdPrizeMonthReportCtrl', controller: 'bdPrizeMonthReportCtrl',
resolve: { resolve: {
report: ['$http', '$stateParams', function ($http, $stateParams) { report: [
return $http.get('/sys/bd_prize/records/' + $stateParams.month); '$http',
}] '$stateParams',
} function ($http, $stateParams) {
}).state('analysis_bd.bd_prizes.month_report.detail', { return $http.get('/sys/bd_prize/records/' + $stateParams.month)
},
],
},
})
.state('analysis_bd.bd_prizes.month_report.detail', {
url: '/bd_user/{bdId}', url: '/bd_user/{bdId}',
templateUrl: '/static/config/bdprize/templates/bd_prize_detail.html', templateUrl: '/static/config/bdprize/templates/bd_prize_detail.html',
controller: 'bdPrizeDetailCtrl', controller: 'bdPrizeDetailCtrl',
resolve: { resolve: {
detail: ['$http', '$stateParams', function ($http, $stateParams) { detail: [
return $http.get('/sys/bd_prize/records/' + $stateParams.month + '/bd_users/' + $stateParams.bdId); '$http',
}] '$stateParams',
} function ($http, $stateParams) {
}).state('analysis_bd.bd_prizes.bd_detail', { return $http.get('/sys/bd_prize/records/' + $stateParams.month + '/bd_users/' + $stateParams.bdId)
},
],
},
})
.state('analysis_bd.bd_prizes.bd_detail', {
url: '/{month}/my_report', url: '/{month}/my_report',
templateUrl: '/static/config/bdprize/templates/bd_prize_detail.html', templateUrl: '/static/config/bdprize/templates/bd_prize_detail.html',
controller: 'bdPrizeDetailCtrl', controller: 'bdPrizeDetailCtrl',
resolve: { resolve: {
detail: ['$http', '$stateParams', function ($http, $stateParams) { detail: [
'$http',
'$stateParams',
function ($http, $stateParams) {
return $http.get('/sys/bd_prize/records/' + $stateParams.month + '/bd_user_detail') return $http.get('/sys/bd_prize/records/' + $stateParams.month + '/bd_user_detail')
}] },
} ],
},
}) })
}]); },
])
app.controller('bdPrizeRootCtrl', ['$scope', '$http', '$uibModal', 'commonDialog','$filter', function ($scope, $http, $uibModal, commonDialog,$filter) { app.controller('bdPrizeRootCtrl', [
$scope.params = {year: new Date().getFullYear()}; '$scope',
$scope.generate = {}; '$http',
$scope.availableYears = [new Date().getFullYear() - 1, new Date().getFullYear()]; '$uibModal',
$scope.kpiRanges = [{value: 1, label: '0-50%'}, {value: 2, label: '50%~80%'}, {value: 3, label: '80%~100%'}, 'commonDialog',
{value: 4, label: '100%-120%'}, {value: 5, label: '>=120%'}]; '$filter',
$scope.initMonth = function (year) { function ($scope, $http, $uibModal, commonDialog, $filter) {
$scope.params.year = year; $scope.params = { year: new Date() }
$scope.months = []; $scope.generate = {}
$scope.kpiRanges = [
{ value: 1, label: '0-50%' },
{ value: 2, label: '50%~80%' },
{ value: 3, label: '80%~100%' },
{ value: 4, label: '100%-120%' },
{ value: 5, label: '>=120%' },
]
$scope.initMonth = function () {
const year = $scope.params.year.getFullYear()
$scope.months = []
for (var i = 1; i < 13; i++) { for (var i = 1; i < 13; i++) {
var mon = '00' + i; var mon = '00' + i
mon = mon.substr(mon.length - 2, 2); mon = mon.substr(mon.length - 2, 2)
$scope.months.push(year + '-' + mon); $scope.months.push(year + '-' + mon)
}
} }
};
$scope.hasReport = function (mon) { $scope.hasReport = function (mon) {
if ($scope.reportMonths != null) { if ($scope.reportMonths != null) {
var have = false; var have = false
angular.forEach($scope.reportMonths, function (month) { angular.forEach($scope.reportMonths, function (month) {
if (mon == month.month) { if (mon == month.month) {
have = true; have = true
} }
}); })
return have; return have
} else { } else {
return false; return false
} }
}; }
$scope.getYearReports = function (year) { $scope.getYearReports = function () {
$scope.initMonth(year); const year = $scope.params.year.getFullYear()
$scope.initMonth()
$http.get('/sys/bd_prize/records', { params: { year: year } }).then(function (resp) { $http.get('/sys/bd_prize/records', { params: { year: year } }).then(function (resp) {
$scope.reportMonths = resp.data.data; $scope.reportMonths = resp.data.data
}) })
}; }
$scope.getYearReports(new Date().getFullYear()); $scope.getYearReports()
$scope.generateReport = function () { $scope.generateReport = function () {
if (!$scope.generate.month) { if (!$scope.generate.month) {
commonDialog.alert({ commonDialog.alert({
type: 'error', title: 'Error', content: 'Select a month first!' type: 'error',
}); title: 'Error',
return; content: 'Select a month first!',
})
return
} }
commonDialog.confirm({ commonDialog
.confirm({
title: 'Warning', title: 'Warning',
content: 'This operation will clear the result of last month generated before. Are you sure?' content: 'This operation will clear the result of last month generated before. Are you sure?',
}).then(function () { })
$scope.generate.status = {}; .then(function () {
var params = {month: $filter('date')($scope.generate.month, 'yyyy-MM')}; $scope.generate.status = {}
$http.post('/sys/bd_prize/generate_record/'+params.month, null, {timeout: 60000}).then(function (resp) { var params = { month: $filter('date')($scope.generate.month, 'yyyy-MM') }
$scope.generate.status = null; $http.post('/sys/bd_prize/generate_record/' + params.month, null, { timeout: 60000 }).then(
commonDialog.alert({title: 'Success', content: 'Generate Finished', type: 'success'}); function (resp) {
$scope.getYearReports($scope.params.year); $scope.generate.status = null
}, function (resp) { commonDialog.alert({ title: 'Success', content: 'Generate Finished', type: 'success' })
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); $scope.getYearReports()
$scope.generate.status = null; },
}) function (resp) {
}) commonDialog.alert({ title: 'Error', content: resp.data.message, type: 'error' })
}; $scope.generate.status = null
}
)
})
}
$scope.loadRateConfigs = function () { $scope.loadRateConfigs = function () {
$http.get('/sys/bd_prize/config/rates').then(function (resp) { $http.get('/sys/bd_prize/config/rates').then(function (resp) {
$scope.bd_rate_configs = resp.data; $scope.bd_rate_configs = resp.data
$scope.kpi_ranges = []; $scope.kpi_ranges = []
var kpiStart = []; var kpiStart = []
angular.forEach($scope.bd_rate_configs, function (cfg) { angular.forEach($scope.bd_rate_configs, function (cfg) {
if (kpiStart.indexOf(cfg.kpi_range) < 0) { if (kpiStart.indexOf(cfg.kpi_range) < 0) {
kpiStart.push(cfg.kpi_range); kpiStart.push(cfg.kpi_range)
$scope.kpi_ranges.push(cfg); $scope.kpi_ranges.push(cfg)
} }
}) })
}) })
}; }
$scope.loadRateConfigs(); $scope.loadRateConfigs()
$scope.editRateConfig = function () { $scope.editRateConfig = function () {
$uibModal.open({ $uibModal
backdrop: 'static', keyboard: false, .open({
backdrop: 'static',
keyboard: false,
templateUrl: '/static/config/bdprize/templates/rate_config_dialog.html', templateUrl: '/static/config/bdprize/templates/rate_config_dialog.html',
controller: 'bdRateConfigCtrl', controller: 'bdRateConfigCtrl',
resolve: { resolve: {
rates: function () { rates: function () {
return angular.copy($scope.bd_rate_configs); return angular.copy($scope.bd_rate_configs)
} },
} },
}).result.then(function () { })
$scope.loadRateConfigs(); .result.then(function () {
$scope.loadRateConfigs()
}) })
}; }
$scope.editBDLevels = function () { $scope.editBDLevels = function () {
$uibModal.open({ $uibModal.open({
backdrop: 'static', keyboard: false, backdrop: 'static',
keyboard: false,
templateUrl: '/static/config/bdprize/templates/bd_level_config_dialog.html', templateUrl: '/static/config/bdprize/templates/bd_level_config_dialog.html',
size: 'lg', size: 'lg',
controller: 'bdLevelConfigCtrl' controller: 'bdLevelConfigCtrl',
}) })
}; }
$scope.editCommissionConfig = function (monModal) { $scope.editCommissionConfig = function (monModal) {
$uibModal.open({ $uibModal.open({
backdrop: 'static', keyboard: false, backdrop: 'static',
keyboard: false,
templateUrl: '/static/config/bdprize/templates/bd_commission_config_dialog.html', templateUrl: '/static/config/bdprize/templates/bd_commission_config_dialog.html',
controller: 'bdCommissionConfigCtrl', controller: 'bdCommissionConfigCtrl',
size: 'lg', size: 'lg',
resolve: { resolve: {
monModal: function () { monModal: function () {
return angular.copy(monModal); return angular.copy(monModal)
} },
} },
}) })
}; }
$scope.exportCommission = function (monModal) { $scope.exportCommission = function (monModal) {
location.href = '/sys/bd_prize/commission/export/' + monModal; location.href = '/sys/bd_prize/commission/export/' + monModal
}; }
$scope.loadPersonalCommission = function () { $scope.loadPersonalCommission = function () {
if (($scope.currentUser.role & parseInt('100', 2)) > 0 && $scope.currentUser.org_id === 1) { if (($scope.currentUser.role & parseInt('100', 2)) > 0 && $scope.currentUser.org_id === 1) {
$http.get('/sys/bd_prize/commission/personal/bd_user').then(function (resp) { $http.get('/sys/bd_prize/commission/personal/bd_user').then(function (resp) {
$scope.personalCommission = resp.data; $scope.personalCommission = resp.data
}) })
} }
}
}; $scope.loadPersonalCommission()
$scope.loadPersonalCommission(); },
}]); ])
app.controller('bdRateConfigCtrl', ['$scope', '$http', 'rates', function ($scope, $http, rates) { app.controller('bdRateConfigCtrl', [
$scope.bdLevels = [{value: 1, label: 'Junior'}, {value: 2, label: 'Intermediate'}, {value: 3, label: 'Senior'}]; '$scope',
$scope.months = [{value: 1, label: '1-3 Months'}, {value: 2, label: '4-6 Months'}, { '$http',
'rates',
function ($scope, $http, rates) {
$scope.bdLevels = [
{ value: 1, label: 'Junior' },
{ value: 2, label: 'Intermediate' },
{ value: 3, label: 'Senior' },
]
$scope.months = [
{ value: 1, label: '1-3 Months' },
{ value: 2, label: '4-6 Months' },
{
value: 3, value: 3,
label: '>=7 Months' label: '>=7 Months',
}]; },
$scope.kpiRanges = [{value: 1, label: '0-50%'}, {value: 2, label: '50%~80%'}, {value: 3, label: '80%~100%'}, ]
{value: 4, label: '100%-120%'}, {value: 5, label: '>=120%'}]; $scope.kpiRanges = [
$scope.clientRate = [{value: 0.6, label: '0.6-0.79'}, {value: 0.8, label: '0.8-2.0'}]; { value: 1, label: '0-50%' },
$scope.filter = {bd_level: 1,rate_from:0.6}; { value: 2, label: '50%~80%' },
$scope.rates = rates; { value: 3, label: '80%~100%' },
{ value: 4, label: '100%-120%' },
{ value: 5, label: '>=120%' },
]
$scope.clientRate = [
{ value: 0.6, label: '0.6-0.79' },
{ value: 0.8, label: '0.8-2.0' },
]
$scope.filter = { bd_level: 1, rate_from: 0.6 }
$scope.rates = rates
$scope.submitRates = function () { $scope.submitRates = function () {
var validation = null; var validation = null
$scope.errmsg = null; $scope.errmsg = null
angular.forEach($scope.rates, function (rate) { angular.forEach($scope.rates, function (rate) {
if (isNaN(rate.prize_rate)) { if (isNaN(rate.prize_rate)) {
validation = {months: rate.time_range, bd_level: rate.bd_level}; validation = { months: rate.time_range, bd_level: rate.bd_level }
$scope.errmsg = 'Rate Value is NaN'; $scope.errmsg = 'Rate Value is NaN'
} }
if (rate.prize_rate > 1) { if (rate.prize_rate > 1) {
validation = {months: rate.time_range, bd_level: rate.bd_level}; validation = { months: rate.time_range, bd_level: rate.bd_level }
$scope.errmsg = 'Rate value shall no more than 1%'; $scope.errmsg = 'Rate value shall no more than 1%'
} }
if (rate.prize_rate < 0) { if (rate.prize_rate < 0) {
validation = {months: rate.time_range, bd_level: rate.bd_level}; validation = { months: rate.time_range, bd_level: rate.bd_level }
$scope.errmsg = 'Rate value shall be a positive value'; $scope.errmsg = 'Rate value shall be a positive value'
} }
});
if (!validation) {
$http.put('/sys/bd_prize/config/rates', $scope.rates).then(function () {
$scope.$close();
}, function (resp) {
$scope.errmsg = resp.data.message;
}) })
} if (!validation) {
} $http.put('/sys/bd_prize/config/rates', $scope.rates).then(
}]); function () {
app.controller('bdLevelConfigCtrl', ['$scope', '$http', function ($scope, $http) { $scope.$close()
$scope.bdtypes = [{id: 1, label: 'BD Manager(Sydney)'}, {id: 2, label: 'KA Manager(Sydney)'},{id: 6, label: 'BD Manager(Melbourne)'}, {id: 7, label: 'KA Manager(Melbourne)'}]; },
function (resp) {
$scope.errmsg = resp.data.message
}
)
}
}
},
])
app.controller('bdLevelConfigCtrl', [
'$scope',
'$http',
function ($scope, $http) {
$scope.bdtypes = [
{ id: 1, label: 'BD Manager(Sydney)' },
{ id: 2, label: 'KA Manager(Sydney)' },
{ id: 6, label: 'BD Manager(Melbourne)' },
{ id: 7, label: 'KA Manager(Melbourne)' },
]
$scope.getBDGroups = function () { $scope.getBDGroups = function () {
$http.get('/sys/manager_accounts/roles/bd_leader').then(function (resp) { $http.get('/sys/manager_accounts/roles/bd_leader').then(function (resp) {
$scope.bdgroups = resp.data; $scope.bdgroups = resp.data
$scope.getBDLevels(); $scope.getBDLevels()
}) })
}; }
$scope.getBDGroups(); $scope.getBDGroups()
$scope.getBDLevels = function () { $scope.getBDLevels = function () {
$http.get('/sys/bd_prize/config/bd_levels').then(function (resp) { $http.get('/sys/bd_prize/config/bd_levels').then(function (resp) {
$scope.bds = resp.data; $scope.bds = resp.data
}) })
}; }
$scope.bdLevels = [{value: 1, label: 'Junior'}, {value: 2, label: 'Intermediate'}, {value: 3, label: 'Senior'}]; $scope.bdLevels = [
{ value: 1, label: 'Junior' },
{ value: 2, label: 'Intermediate' },
{ value: 3, label: 'Senior' },
]
$scope.updateBDLevel = function (bdInfo) { $scope.updateBDLevel = function (bdInfo) {
$http.put('/sys/bd_prize/config/bd_levels/' + bdInfo.manager_id, bdInfo).then(function () { $http.put('/sys/bd_prize/config/bd_levels/' + bdInfo.manager_id, bdInfo).then(
$scope.getBDGroups(); function () {
}, function (resp) { $scope.getBDGroups()
$scope.errmsg = resp.data.message; },
}) function (resp) {
}; $scope.errmsg = resp.data.message
}]); }
app.controller('bdCommissionConfigCtrl', ['$scope', '$state', '$http', '$filter', 'monModal', function ($scope, $state, $http, $filter, monModal) { )
$scope.monModal = monModal; }
$scope.params = {year: new Date().getFullYear()}; },
$scope.bdtypes = [{id: 1, label: 'BD Manager(Sydney)'}, {id: 2, label: 'KA Manager(Sydney)'}, {id: 6, label: 'BD Manager(Melbourne)'}, {id: 7, label: 'KA Manager(Melbourne)'}];//, {id: 3, label: 'Sydney GM'},{id: 4, label: 'COO'},{id: 5, label: 'NJ Department'}]; ])
app.controller('bdCommissionConfigCtrl', [
'$scope',
'$state',
'$http',
'$filter',
'monModal',
function ($scope, $state, $http, $filter, monModal) {
$scope.monModal = monModal
$scope.params = { year: new Date().getFullYear() }
$scope.bdtypes = [
{ id: 1, label: 'BD Manager(Sydney)' },
{ id: 2, label: 'KA Manager(Sydney)' },
{ id: 6, label: 'BD Manager(Melbourne)' },
{ id: 7, label: 'KA Manager(Melbourne)' },
] //, {id: 3, label: 'Sydney GM'},{id: 4, label: 'COO'},{id: 5, label: 'NJ Department'}];
// $scope.bdmon; // $scope.bdmon;
// $scope.newSwitch; // $scope.newSwitch;
$scope.initMonth = function (year) { $scope.initMonth = function (year) {
$scope.params.year = year; $scope.params.year = year
$scope.months = []; $scope.months = []
for (var i = 1; i < 13; i++) { for (var i = 1; i < 13; i++) {
var mon = '00' + i; var mon = '00' + i
mon = mon.substr(mon.length - 2, 2); mon = mon.substr(mon.length - 2, 2)
$scope.months.push(year + '-' + mon); $scope.months.push(year + '-' + mon)
}
} }
}; $scope.initMonth(new Date().getFullYear())
$scope.initMonth(new Date().getFullYear());
$scope.hasReport = function (mon) { $scope.hasReport = function (mon) {
var start = '2017-01';//todo change for different country var start = '2017-01' //todo change for different country
var end = $filter('date')(new Date(), 'yyyy-MM'); var end = $filter('date')(new Date(), 'yyyy-MM')
return start <= mon && end >= mon return start <= mon && end >= mon
}; }
$scope.getBDLevels = function () { $scope.getBDLevels = function () {
$http.get('/sys/bd_prize/config/bd_levels').then(function (resp) { $http.get('/sys/bd_prize/config/bd_levels').then(function (resp) {
$scope.bds = resp.data; $scope.bds = resp.data
}) })
}; }
$scope.getBDLevels(); $scope.getBDLevels()
$scope.chooseLastConfig = function (mon) { $scope.chooseLastConfig = function (mon) {
let year = new Date(mon).getFullYear(); let year = new Date(mon).getFullYear()
let month = new Date(mon).getMonth(); let month = new Date(mon).getMonth()
if (month == 0) { if (month == 0) {
year--; year--
month = year + '-12'; month = year + '-12'
} else if (month <= 9) { } else if (month <= 9) {
month = year + '-0' + month; month = year + '-0' + month
} else { } else {
month = year + '-' + month; month = year + '-' + month
} }
$http.get('/sys/bd_prize/commission/le_ma/' + month).then(function (resp) { $http.get('/sys/bd_prize/commission/le_ma/' + month).then(function (resp) {
$scope.bdlm = []; $scope.bdlm = []
angular.forEach(resp.data, function (e) { angular.forEach(resp.data, function (e) {
var bdC = {}; var bdC = {}
bdC.commission_start_amount = e.commission_start_amount; bdC.commission_start_amount = e.commission_start_amount
bdC.commission_end_amount = e.commission_end_amount; bdC.commission_end_amount = e.commission_end_amount
bdC.bd_commission_rate = e.bd_commission_rate; bdC.bd_commission_rate = e.bd_commission_rate
bdC.bd_type = e.bd_type; bdC.bd_type = e.bd_type
$scope.bdlm.push(bdC); $scope.bdlm.push(bdC)
}); })
$scope.listConfig = true; $scope.listConfig = true
}) })
}; }
$scope.listCurrentMonBDCommission = function (mon) { $scope.listCurrentMonBDCommission = function (mon) {
$http.get('/sys/bd_prize/commission/le_ma/' + mon).then(function (resp) { $http.get('/sys/bd_prize/commission/le_ma/' + mon).then(function (resp) {
$scope.bdlm = resp.data; $scope.bdlm = resp.data
$scope.bdmon = mon; $scope.bdmon = mon
$scope.listConfig = true; $scope.listConfig = true
}) })
}; }
$scope.listCurrentMonBDCommission($scope.monModal); $scope.listCurrentMonBDCommission($scope.monModal)
$scope.deleteCommission = function (config) { $scope.deleteCommission = function (config) {
$http.delete('sys/bd_prize/commission/delete/' + config) $http.delete('sys/bd_prize/commission/delete/' + config)
$scope.listCurrentMonBDCommission($scope.monModal); $scope.listCurrentMonBDCommission($scope.monModal)
$state.reload(); $state.reload()
} }
$scope.submitCommmissionConfig = function (mon, bdlm) { $scope.submitCommmissionConfig = function (mon, bdlm) {
$scope.check = true; $scope.check = true
angular.forEach(bdlm, function (data, index) { angular.forEach(bdlm, function (data, index) {
$scope.errmsg = null; $scope.errmsg = null
if (!data.bd_type) { if (!data.bd_type) {
$scope.errmsg = "BD Type not be null"; $scope.errmsg = 'BD Type not be null'
$scope.check = false; $scope.check = false
return; return
} }
if (!data.bd_commission_rate) { if (!data.bd_commission_rate) {
$scope.errmsg = "BD Rate not be null"; $scope.errmsg = 'BD Rate not be null'
$scope.check = false; $scope.check = false
return; return
} }
if (data.bd_commission_rate) { if (data.bd_commission_rate) {
if (data.bd_commission_rate > 10) { if (data.bd_commission_rate > 10) {
$scope.errmsg = "BD Rate is too big"; $scope.errmsg = 'BD Rate is too big'
$scope.check = false; $scope.check = false
return; return
} }
} }
if (!data.commission_start_amount && data.commission_start_amount != 0) { if (!data.commission_start_amount && data.commission_start_amount != 0) {
$scope.errmsg = "Commission Amount not be null"; $scope.errmsg = 'Commission Amount not be null'
$scope.check = false; $scope.check = false
return; return
} }
if (data.commission_end_amount || data.commission_end_amount == 0) { if (data.commission_end_amount || data.commission_end_amount == 0) {
if (data.commission_start_amount >= data.commission_end_amount) { if (data.commission_start_amount >= data.commission_end_amount) {
$scope.errmsg = "Commission Start Amount should less than End Amount"; $scope.errmsg = 'Commission Start Amount should less than End Amount'
$scope.check = false; $scope.check = false
return; return
} }
} }
}); })
if ($scope.check) { if ($scope.check) {
$http.post('/sys/bd_prize/commission/le_ma/update/' + mon, bdlm).then(function (resp) { $http.post('/sys/bd_prize/commission/le_ma/update/' + mon, bdlm).then(function (resp) {
$scope.$close(); $scope.$close()
// $scope.bdlm = null; // $scope.bdlm = null;
// $scope.bdmon; // $scope.bdmon;
// $scope.listConfig = false; // $scope.listConfig = false;
@ -330,99 +423,111 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) {
} }
} }
$scope.submitBdCommmissionConfig = function (mon, bds) { $scope.submitBdCommmissionConfig = function (mon, bds) {
$scope.check = true; $scope.check = true
$scope.errmsg = null; $scope.errmsg = null
angular.forEach(bds, function (data, index) { angular.forEach(bds, function (data, index) {
if (data.get_prize) { if (data.get_prize) {
if (!data.kpi_amount) { if (!data.kpi_amount) {
$scope.errmsg = "BD kpi Amount not be null"; $scope.errmsg = 'BD kpi Amount not be null'
$scope.check = false; $scope.check = false
return; return
} }
} }
}); })
if ($scope.check) { if ($scope.check) {
$http.post('/sys/bd_prize/commission/kpi/update/' + mon, bds).then(function (resp) { $http.post('/sys/bd_prize/commission/kpi/update/' + mon, bds).then(function (resp) {
$scope.$close(); $scope.$close()
}) })
} }
} }
}]); },
app.controller('bdPrizeMonthReportCtrl', ['$scope', '$http', 'report', function ($scope, $http, report) { ])
$scope.report = report.data; app.controller('bdPrizeMonthReportCtrl', [
}]); '$scope',
app.controller('bdPrizeDetailCtrl', ['$scope', 'detail', function ($scope, detail) { '$http',
$scope.detail = detail.data; 'report',
}]); function ($scope, $http, report) {
$scope.report = report.data
},
])
app.controller('bdPrizeDetailCtrl', [
'$scope',
'detail',
function ($scope, detail) {
$scope.detail = detail.data
},
])
app.filter('financialBdLevel', function () { app.filter('financialBdLevel', function () {
return function (level) { return function (level) {
switch (level) { switch (level) {
case 0: case 0:
return 'Leader'; return 'Leader'
case 1: case 1:
return 'Junior'; return 'Junior'
case 2: case 2:
return 'Intermediate'; return 'Intermediate'
case 3: case 3:
return 'Senior'; return 'Senior'
default: default:
return 'Unknown'; return 'Unknown'
} }
} }
}); })
app.filter('financialClientSource', function () { app.filter('financialClientSource', function () {
return function (source) { return function (source) {
switch (source) { switch (source) {
case 1: case 1:
return 'BD'; return 'BD'
case 2: case 2:
return 'Apply'; return 'Apply'
case 3: case 3:
return 'Distribute'; return 'Distribute'
default: default:
return 'Unknown'; return 'Unknown'
} }
} }
}); })
app.filter('prizeLogsFilter', [function () { app.filter('prizeLogsFilter', [
function () {
return function (arr, filterObj) { return function (arr, filterObj) {
if (arr == null || filterObj == null) { if (arr == null || filterObj == null) {
return arr; return arr
} }
return arr.filter(function (item) { return arr.filter(function (item) {
return item.prize_type == filterObj return item.prize_type == filterObj
}) })
} }
}]); },
])
app.filter('channel_image', function () { app.filter('channel_image', function () {
return function (channel) { return function (channel) {
switch (channel) { switch (channel) {
case 'Alipay': case 'Alipay':
return '/static/images/alipay_sign_lg.png'; return '/static/images/alipay_sign_lg.png'
case 'AlipayOnline': case 'AlipayOnline':
return '/static/images/alipay_online.png'; return '/static/images/alipay_online.png'
case 'System': case 'System':
return '/static/images/royalpay_sign.png'; return '/static/images/royalpay_sign.png'
case 'Bestpay': case 'Bestpay':
return '/static/images/bestpay_sign_lg.png'; return '/static/images/bestpay_sign_lg.png'
case 'Wechat': case 'Wechat':
return '/static/images/wechatpay_sign_lg.png'; return '/static/images/wechatpay_sign_lg.png'
case 'jd': case 'jd':
return '/static/images/jd_sign_lg.png'; return '/static/images/jd_sign_lg.png'
case 'hf': case 'hf':
return '/static/images/hf_sign_lg.png'; return '/static/images/hf_sign_lg.png'
case 'Rpay': case 'Rpay':
return '/static/images/rpayplus_sign_lg.png'; return '/static/images/rpayplus_sign_lg.png'
case 'Yeepay': case 'Yeepay':
return '/static/images/yeepay_sign_lg.png'; return '/static/images/yeepay_sign_lg.png'
case 'LakalaPay': case 'LakalaPay':
return '/static/images/lakalapay_sign_lg.png'; return '/static/images/lakalapay_sign_lg.png'
case 'rpaypmt_card': case 'rpaypmt_card':
return '/static/images/card_payment_sign_lg.png'; return '/static/images/card_payment_sign_lg.png'
case 'rpaypmt_dd': case 'rpaypmt_dd':
return '/static/images/direct_debit_sign_lg.png'; return '/static/images/direct_debit_sign_lg.png'
} }
} }
}); })
return app; return app
}); })

@ -20,8 +20,10 @@
<!--<button class="btn btn-primary" ng-click="generateReport()" ng-disabled="!generate.month">--> <!--<button class="btn btn-primary" ng-click="generateReport()" ng-disabled="!generate.month">-->
<!--Generate Report--> <!--Generate Report-->
<!--</button>--> <!--</button>-->
<button class="btn btn-primary" ng-click="editRateConfig()"><i class="fa fa-cog"></i> Edit Rate Config</button> <button class="btn btn-primary" ng-click="editRateConfig()"><i class="fa fa-cog"></i> Edit
<button class="btn btn-primary" ng-click="editBDLevels()"><i class="fa fa-user"></i> Edit BD Level</button> Rate Config</button>
<button class="btn btn-primary" ng-click="editBDLevels()"><i class="fa fa-user"></i> Edit BD
Level</button>
<loadingbar ng-if="generate.status"></loadingbar> <loadingbar ng-if="generate.status"></loadingbar>
</div> </div>
</div> </div>
@ -39,24 +41,23 @@
<li ng-repeat="year in availableYears" role="menuitem"><a role="button" ng-click="getYearReports(year)" ng-bind="year"></a></li> <li ng-repeat="year in availableYears" role="menuitem"><a role="button" ng-click="getYearReports(year)" ng-bind="year"></a></li>
</ul> </ul>
</div>--> </div>-->
<div ng-repeat="year in availableYears" style="display: inline"> <button class="btn btn-info" ng-bind="params.year.getFullYear()" ng-click="ctrl.viewyear=true"></button>
<button class="btn btn-info" <input type="text" class="hidden" uib-datepicker-popup="yyyy" ng-model="params.year"
ng-click="getYearReports(year)" is-open="ctrl.viewyear" datepicker-options="{minMode: 'year'}" ng-change="getYearReports()"
ng-bind="year" placeholder="Select Year">
ng-class="{'active':year == params.year}"
></button>
</div>
</div> </div>
<div class="box-body"> <div class="box-body">
<div class="row"> <div class="row">
<div class="col-xs-2" style="text-align: center" ng-repeat="mon in months"> <div class="col-xs-2" style="text-align: center" ng-repeat="mon in months">
<a ng-if="hasReport(mon) && (('10000000000000'|withRole)||('1000'|withRole))"> <a ng-if="hasReport(mon) && (('10000000000000'|withRole)||('1000'|withRole))">
<h2 ROLE="button" class="text-success" ui-sref=".month_report({month:mon})" ng-bind="mon.substring(5,7)"></h2> <h2 ROLE="button" class="text-success" ui-sref=".month_report({month:mon})"
ng-bind="mon.substring(5,7)"></h2>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)"></span> <span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)"></span>
<span class="fa fa-download btn" ng-click="exportCommission(mon)"></span> <span class="fa fa-download btn" ng-click="exportCommission(mon)"></span>
</a> </a>
<a ng-if="hasReport(mon) && ('100'|withRole) && (!('1000'|withRole))"> <a ng-if="hasReport(mon) && ('100'|withRole) && (!('1000'|withRole))">
<h2 ROLE="button" class="text-success" ui-sref=".bd_detail({month:mon})" ng-bind="mon.substring(5,7)"></h2> <h2 ROLE="button" class="text-success" ui-sref=".bd_detail({month:mon})"
ng-bind="mon.substring(5,7)"></h2>
<span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)"></span> <span class="fa fa-edit btn" ng-click="editCommissionConfig(mon)"></span>
<span class="fa fa-download btn" ng-click="exportCommission(mon)"></span> <span class="fa fa-download btn" ng-click="exportCommission(mon)"></span>
</a> </a>
@ -105,7 +106,8 @@
<a ui-sref=".bd_detail({month:commission.month})" ng-if="commission.prize_type==0"> <a ui-sref=".bd_detail({month:commission.month})" ng-if="commission.prize_type==0">
<i class="fa fa-search"></i> <i class="fa fa-search"></i>
</a> </a>
<a ng-href="/sys/bd_prize/commission/export/{{commission.month}}/bd_users" ng-if="commission.prize_type==0"> <a ng-href="/sys/bd_prize/commission/export/{{commission.month}}/bd_users"
ng-if="commission.prize_type==0">
<i class="fa fa-download"></i> <i class="fa fa-download"></i>
</a> </a>
</td> </td>
@ -143,9 +145,11 @@
<td ng-bind="'#'+($index+1)"></td> <td ng-bind="'#'+($index+1)"></td>
<td ng-bind="(kpiRanges|filter:{value:range.kpi_range})[0].label"></td> <td ng-bind="(kpiRanges|filter:{value:range.kpi_range})[0].label"></td>
<td ng-repeat-start="level in [1,2,3] track by $index" <td ng-repeat-start="level in [1,2,3] track by $index"
ng-bind="(bd_rate_configs|filter:{kpi_range:range.kpi_range,bd_level:level,rate_from:0.6})[0].prize_rate+'%'"></td> ng-bind="(bd_rate_configs|filter:{kpi_range:range.kpi_range,bd_level:level,rate_from:0.6})[0].prize_rate+'%'">
</td>
<td ng-repeat-end <td ng-repeat-end
ng-bind="(bd_rate_configs|filter:{kpi_range:range.kpi_range,bd_level:level,rate_from:0.8})[0].prize_rate+'%'"></td> ng-bind="(bd_rate_configs|filter:{kpi_range:range.kpi_range,bd_level:level,rate_from:0.8})[0].prize_rate+'%'">
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -155,11 +159,13 @@
<li>按月度发放</li> <li>按月度发放</li>
<li>每月发放总提成额度的60%剩余40%按照“年度考评分数比例”于每年年底即12 月25 日圣诞前发放</li> <li>每月发放总提成额度的60%剩余40%按照“年度考评分数比例”于每年年底即12 月25 日圣诞前发放</li>
<li>提前离职者40%提成不予发放</li> <li>提前离职者40%提成不予发放</li>
<li>年度考评根据销管中心每月考评表打分制进行统计按照考评分数对应比例发放40%的占比部分扣下部分如果第二年考评超出一定评分110%可以补发同样如果年度考评分数超过100 分按照同比例发放</li> <li>年度考评根据销管中心每月考评表打分制进行统计按照考评分数对应比例发放40%的占比部分扣下部分如果第二年考评超出一定评分110%可以补发同样如果年度考评分数超过100 分按照同比例发放
</li>
<li>商户开通后连续 1 个月未产生流水的,上交主管,由主管重新分配</li> <li>商户开通后连续 1 个月未产生流水的,上交主管,由主管重新分配</li>
<li>连续 2 个月不产生流水的商户,由销管部统一收回,重新分配</li> <li>连续 2 个月不产生流水的商户,由销管部统一收回,重新分配</li>
<li>分配后的商户流水客户专员只能占一半</li> <li>分配后的商户流水客户专员只能占一半</li>
<li>离职及调岗人员商户统一上交销管中心,由销管中心 leader 及跨境事业部总监相互协商及相互监督,按照公平公正的原则, 做出分配方案,并由总监确认后统一分配。调岗人员移交的商户,在移交后 1 个月内移交人员和接收人员平分该商家产生的提成,移交人员需配合接收人员做好商户对接和短期内的商户维护; <li>离职及调岗人员商户统一上交销管中心,由销管中心 leader 及跨境事业部总监相互协商及相互监督,按照公平公正的原则, 做出分配方案,并由总监确认后统一分配。调岗人员移交的商户,在移交后 1
个月内移交人员和接收人员平分该商家产生的提成,移交人员需配合接收人员做好商户对接和短期内的商户维护;
离职人员交接的商户提成,接收人员享受一半的提成,另一半作为跨境客服专员福利会基金</li> 离职人员交接的商户提成,接收人员享受一半的提成,另一半作为跨境客服专员福利会基金</li>
<li>被客户投诉情况严重者,此商户由销管中心无条件收回重新分配</li> <li>被客户投诉情况严重者,此商户由销管中心无条件收回重新分配</li>
<li>活动执行未传达到位且出现舞弊、徇私、懒惰等行为的,商户上交由销管中心统一分配</li> <li>活动执行未传达到位且出现舞弊、徇私、懒惰等行为的,商户上交由销管中心统一分配</li>

@ -1,204 +1,253 @@
/** /**
* Created by yixian on 2017-03-08. * Created by yixian on 2017-03-08.
*/ */
var commissionTypeMap = [{ var commissionTypeMap = [
"label": 1, {
"value": "渠道计算法" label: 1,
value: '渠道计算法',
}, },
{ {
"label": 2, label: 2,
"value": "总交易额比例" value: '总交易额比例',
}, },
{ {
"label": 3, label: 3,
"value": "收益比例" value: '收益比例',
} },
]; ]
define(['angular', '../../analysis/org/analysis-org'], function (angular) { define(['angular', '../../analysis/org/analysis-org'], function (angular) {
'use strict'; 'use strict'
var app = angular.module('orgcommission', ['ui.router']); var app = angular.module('orgcommission', ['ui.router'])
app.config(['$stateProvider', function ($stateProvider) { app.config([
$stateProvider.state('analysis_org.commission', { '$stateProvider',
function ($stateProvider) {
$stateProvider
.state('analysis_org.commission', {
url: '/org_commissions', url: '/org_commissions',
templateUrl: '/static/config/orgcommission/templates/org_commission_root.html', templateUrl: '/static/config/orgcommission/templates/org_commission_root.html',
controller: 'orgCommissionRootCtrl' controller: 'orgCommissionRootCtrl',
}).state('analysis_org.commission.month', { })
.state('analysis_org.commission.month', {
url: '/commissionorg/months/{monthStr}', url: '/commissionorg/months/{monthStr}',
templateUrl: '/static/config/orgcommission/templates/org_commission_month_root.html', templateUrl: '/static/config/orgcommission/templates/org_commission_month_root.html',
controller: 'commissionMonthRootCtrl' controller: 'commissionMonthRootCtrl',
}).state('analysis_org.info', { })
.state('analysis_org.info', {
url: '/commissionorg/info', url: '/commissionorg/info',
templateUrl: '/static/config/orgcommission/templates/org_commission_info.html', templateUrl: '/static/config/orgcommission/templates/org_commission_info.html',
controller: 'commissionMonthRootCtrl' controller: 'commissionMonthRootCtrl',
}).state('analysis_org.commission.month.org', { })
.state('analysis_org.commission.month.org', {
url: '/org', url: '/org',
templateUrl: '/static/config/orgcommission/templates/org_commission_month.html', templateUrl: '/static/config/orgcommission/templates/org_commission_month.html',
controller: 'orgCommissionMonthViewCtrl', controller: 'orgCommissionMonthViewCtrl',
resolve: { resolve: {
monthData: ['$http', '$stateParams', function ($http, $stateParams) { monthData: [
return $http.get('/sys/citypartner_prizes/months/' + $stateParams.monthStr); '$http',
}] '$stateParams',
} function ($http, $stateParams) {
}).state('analysis_org.commission.month.referrer', { return $http.get('/sys/citypartner_prizes/months/' + $stateParams.monthStr)
},
],
},
})
.state('analysis_org.commission.month.referrer', {
url: '/referrer', url: '/referrer',
templateUrl: '/static/config/referrercommission/templates/referrer_commission_month.html', templateUrl: '/static/config/referrercommission/templates/referrer_commission_month.html',
controller: 'referrerCommissionMonthViewCtrl', controller: 'referrerCommissionMonthViewCtrl',
resolve: { resolve: {
monthData: ['$http', '$stateParams', function ($http, $stateParams) { monthData: [
return $http.get('/sys/citypartner_prizes/referrer/months/' + $stateParams.monthStr); '$http',
}] '$stateParams',
} function ($http, $stateParams) {
}).state('analysis_org.commission.month.org.orgdetail', { return $http.get('/sys/citypartner_prizes/referrer/months/' + $stateParams.monthStr)
},
],
},
})
.state('analysis_org.commission.month.org.orgdetail', {
url: '/citypartners/{orgId}', url: '/citypartners/{orgId}',
templateUrl: '/static/config/orgcommission/templates/org_commission_detail.html', templateUrl: '/static/config/orgcommission/templates/org_commission_detail.html',
controller: 'orgCommissionOrgDetailCtrl', controller: 'orgCommissionOrgDetailCtrl',
resolve: { resolve: {
detail: ['$http', '$stateParams', function ($http, $stateParams) { detail: [
return $http.get('/sys/citypartner_prizes/months/' + $stateParams.monthStr + '/orgs/' + $stateParams.orgId); '$http',
}] '$stateParams',
} function ($http, $stateParams) {
}).state('analysis_org.commission.month.referrer.referrerdetail', { return $http.get('/sys/citypartner_prizes/months/' + $stateParams.monthStr + '/orgs/' + $stateParams.orgId)
},
],
},
})
.state('analysis_org.commission.month.referrer.referrerdetail', {
url: '/referrer_commissions/{orgId}', url: '/referrer_commissions/{orgId}',
templateUrl: '/static/config/referrercommission/templates/referrer_commission_detail.html', templateUrl: '/static/config/referrercommission/templates/referrer_commission_detail.html',
controller: 'referrerCommissionOrgDetailCtrl', controller: 'referrerCommissionOrgDetailCtrl',
resolve: { resolve: {
detail: ['$http', '$stateParams', function ($http, $stateParams) { detail: [
return $http.get('/sys/citypartner_prizes/referrer/months/' + $stateParams.monthStr + '/orgs/' + $stateParams.orgId); '$http',
}] '$stateParams',
} function ($http, $stateParams) {
return $http.get('/sys/citypartner_prizes/referrer/months/' + $stateParams.monthStr + '/orgs/' + $stateParams.orgId)
},
],
},
}) })
}]); },
app.controller('commissionMonthRootCtrl', ['$scope', '$state', function ($scope, $state) { ])
app.controller('commissionMonthRootCtrl', [
'$scope',
'$state',
function ($scope, $state) {
if ($state.is('analysis_org.commission.month')) { if ($state.is('analysis_org.commission.month')) {
$state.go('.org'); $state.go('.org')
} }
}]); },
app.controller('orgCommissionRootCtrl', ['$scope', '$http', '$filter', '$state', 'commonDialog', ])
app.controller('orgCommissionRootCtrl', [
'$scope',
'$http',
'$filter',
'$state',
'commonDialog',
function ($scope, $http, $filter, $state, commonDialog) { function ($scope, $http, $filter, $state, commonDialog) {
$scope.generate = {}; $scope.generate = {}
$scope.generateOrgCommission = function () { $scope.generateOrgCommission = function () {
$scope.generate.status = {}; $scope.generate.status = {}
if (!$scope.generate.month) { if (!$scope.generate.month) {
commonDialog.alert({ commonDialog.alert({
type: 'error', title: 'Error', content: 'Select a month first!' type: 'error',
}); title: 'Error',
return; content: 'Select a month first!',
})
return
} }
commonDialog.confirm({ commonDialog
.confirm({
title: 'Confirm', title: 'Confirm',
content: 'This operation will clear the data generated before, Are you sure?' content: 'This operation will clear the data generated before, Are you sure?',
}).then(function () { })
var params = {month: $filter('date')($scope.generate.month, 'yyyy-MM')}; .then(function () {
$http.post('/sys/citypartner_prizes/generate', params).then(function () { var params = { month: $filter('date')($scope.generate.month, 'yyyy-MM') }
$http.post('/sys/citypartner_prizes/generate', params).then(
function () {
$state.go('.org.month', { monthStr: params.month }) $state.go('.org.month', { monthStr: params.month })
$scope.generate.status = null; $scope.generate.status = null
}, function (resp) { },
commonDialog.alert({type: 'error', title: 'Error', content: resp.data.message}); function (resp) {
}) commonDialog.alert({ type: 'error', title: 'Error', content: resp.data.message })
}) }
}; )
$scope.availableYears = [new Date().getFullYear()]; })
//当前年至2017年年份 }
for (var i = 1; i < new Date().getFullYear()-2017+1; i++) { $scope.params = { year: new Date() }
$scope.availableYears.push(new Date().getFullYear() - i); $scope.loadAvailableMonths = function () {
} const year = $scope.params.year.getFullYear()
$scope.params = {}; $http.get('/sys/citypartner_prizes/months', { params: { year: year } }).then(function (resp) {
$scope.months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; $scope.availableMonths = resp.data
$scope.loadAvailableMonths = function (year) { })
$scope.params.year = year; }
$http.get('/sys/citypartner_prizes/months', {params: {year: $scope.params.year}}).then(function (resp) {
$scope.availableMonths = resp.data;
});
};
$scope.loadAvailableMonths(new Date().getFullYear()); $scope.loadAvailableMonths()
$scope.months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
$scope.hasReport = function (mon) { $scope.hasReport = function (mon) {
var has = false; var has = false
angular.forEach($scope.availableMonths, function (m) { angular.forEach($scope.availableMonths, function (m) {
if (mon == m.month) { if (mon == m.month) {
has = true; has = true
}
})
return has
} }
});
return has;
};
$scope.gotoMonth = function (mon) { $scope.gotoMonth = function (mon) {
if (mon) { if (mon) {
$scope.params.month = mon; $scope.params.month = mon
} }
var monthStr = $scope.params.year + '-' + $scope.params.month; var monthStr = $scope.params.year.getFullYear() + '-' + $scope.params.month
$state.go('analysis_org.commission.month', { monthStr: monthStr }) $state.go('analysis_org.commission.month', { monthStr: monthStr })
}; }
},
])
}]); app.controller('orgCommissionMonthViewCtrl', [
app.controller('orgCommissionMonthViewCtrl', ['$scope', 'monthData','$http', function ($scope, monthData,$http) { '$scope',
$scope.monthData = monthData.data; 'monthData',
$scope.ctrl = {}; '$http',
$scope.commissionTypeMap = commissionTypeMap; function ($scope, monthData, $http) {
$scope.seniors = {}; $scope.monthData = monthData.data
$scope.ctrl = {}
$scope.commissionTypeMap = commissionTypeMap
$scope.seniors = {}
$scope.active = function (log) { $scope.active = function (log) {
$http.get('/sys/citypartner_prizes/senior/' + log.org_id + '/details?monthStr=' + $scope.monthData.monthstr).then(function (resp) { $http.get('/sys/citypartner_prizes/senior/' + log.org_id + '/details?monthStr=' + $scope.monthData.monthstr).then(function (resp) {
$scope.seniors = resp.data; $scope.seniors = resp.data
if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.org_id == log.org_id) { if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.org_id == log.org_id) {
$scope.ctrl.activeLog=null; $scope.ctrl.activeLog = null
return; return
} }
$scope.ctrl.activeLog=log; $scope.ctrl.activeLog = log
}) })
} }
}]); },
app.controller('orgCommissionOrgDetailCtrl', ['$scope', 'detail', function ($scope, detail) { ])
$scope.detail = detail.data; app.controller('orgCommissionOrgDetailCtrl', [
$scope.ctrl = {}; '$scope',
'detail',
function ($scope, detail) {
$scope.detail = detail.data
$scope.ctrl = {}
$scope.active = function (log) { $scope.active = function (log) {
if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.client_moniker == log.client_moniker) { if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.client_moniker == log.client_moniker) {
$scope.ctrl.activeLog=null; $scope.ctrl.activeLog = null
return; return
} }
$scope.ctrl.activeLog=log; $scope.ctrl.activeLog = log
} }
}]); },
])
app.controller('referrerCommissionMonthViewCtrl', ['$scope', 'monthData', function ($scope, monthData) { app.controller('referrerCommissionMonthViewCtrl', [
$scope.monthData = monthData.data; '$scope',
$scope.ctrl = {}; 'monthData',
function ($scope, monthData) {
$scope.monthData = monthData.data
$scope.ctrl = {}
$scope.active = function (log) { $scope.active = function (log) {
if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.org_id == log.org_id) { if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.org_id == log.org_id) {
$scope.ctrl.activeLog=null; $scope.ctrl.activeLog = null
return; return
} }
$scope.ctrl.activeLog=log; $scope.ctrl.activeLog = log
} }
}]); },
])
app.controller('referrerCommissionOrgDetailCtrl', ['$scope', 'detail', function ($scope, detail) { app.controller('referrerCommissionOrgDetailCtrl', [
$scope.detail = detail.data; '$scope',
$scope.ctrl = {}; 'detail',
function ($scope, detail) {
$scope.detail = detail.data
$scope.ctrl = {}
$scope.active = function (log) { $scope.active = function (log) {
if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.client_moniker == log.client_moniker) { if ($scope.ctrl.activeLog && $scope.ctrl.activeLog.client_moniker == log.client_moniker) {
$scope.ctrl.activeLog=null; $scope.ctrl.activeLog = null
return; return
} }
$scope.ctrl.activeLog=log; $scope.ctrl.activeLog = log
} }
}]); },
])
app.filter('commission_type_filter', function () { app.filter('commission_type_filter', function () {
return function (sectorValue) { return function (sectorValue) {
var sectorLabel = ''; var sectorLabel = ''
angular.forEach(commissionTypeMap, function (sector) { angular.forEach(commissionTypeMap, function (sector) {
if (sector.label == sectorValue) { if (sector.label == sectorValue) {
sectorLabel = sector.value; sectorLabel = sector.value
} }
}); })
return sectorLabel; return sectorLabel
} }
}); })
return app;
}); return app
})

@ -11,8 +11,8 @@
<div class="form-inline"> <div class="form-inline">
<div class="form-group"> <div class="form-group">
<input type="text" class="form-control" uib-datepicker-popup="yyyy-MM" ng-model="generate.month" <input type="text" class="form-control" uib-datepicker-popup="yyyy-MM" ng-model="generate.month"
is-open="ctrl.genmonth" datepicker-options="{minMode: 'month'}" is-open="ctrl.genmonth" datepicker-options="{minMode: 'month'}" ng-click="ctrl.genmonth=true"
ng-click="ctrl.genmonth=true" placeholder="Select Month"/> placeholder="Select Month" />
</div> </div>
<button class="btn btn-primary" ng-click="generateOrgCommission()" ng-disabled="!generate.month"> <button class="btn btn-primary" ng-click="generateOrgCommission()" ng-disabled="!generate.month">
Generate Generate
@ -28,18 +28,15 @@
placeholder="Select Year"> placeholder="Select Year">
<span ng-bind="params.year.getFullYear()" ng-click="ctrl.viewyear=true"></span>--> <span ng-bind="params.year.getFullYear()" ng-click="ctrl.viewyear=true"></span>-->
<div ng-repeat="year in availableYears" style="display: inline"> <button class="btn btn-info" ng-bind="params.year.getFullYear()" ng-click="ctrl.viewyear=true"></button>
<button class="btn btn-info" <input type="text" class="hidden" uib-datepicker-popup="yyyy" ng-model="params.year" is-open="ctrl.viewyear"
ng-click="loadAvailableMonths(year)" datepicker-options="{minMode: 'year'}" ng-change="loadAvailableMonths()" placeholder="Select Year">
ng-bind="year"
ng-class="{'active':year == params.year}"
></button>
</div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-3 col-sm-6 col-xs-12" ng-repeat="mon in availableMonths"> <div class="col-md-3 col-sm-6 col-xs-12" ng-repeat="mon in availableMonths">
<div class="info-box"> <div class="info-box">
<div class="info-box-icon bg-aqua" ng-bind="mon.month" ng-click="gotoMonth(mon.month)" role="button"> <div class="info-box-icon bg-aqua" ng-bind="mon.month" ng-click="gotoMonth(mon.month)"
role="button">
</div> </div>
<div class="info-box-content"> <div class="info-box-content">
<!--<div class="info-box-text text-bold text-red" ng-bind="r.charge_date"></div>--> <!--<div class="info-box-text text-bold text-red" ng-bind="r.charge_date"></div>-->

@ -2,239 +2,241 @@
* Created by Tayl0r on 2017/5/24. * Created by Tayl0r on 2017/5/24.
*/ */
define(['angular', 'decimal', 'uiRouter', 'angularEcharts', '../../analysis/report/analysis-report'], function (angular, Decimal) { define(['angular', 'decimal', 'uiRouter', 'angularEcharts', '../../analysis/report/analysis-report'], function (angular, Decimal) {
'use strict'; 'use strict'
var app = angular.module('platformRevenue', ['ui.router']); var app = angular.module('platformRevenue', ['ui.router'])
app.config(['$stateProvider', function ($stateProvider) { app.config([
$stateProvider.state('analysis_report.platformrevenue', { '$stateProvider',
function ($stateProvider) {
$stateProvider
.state('analysis_report.platformrevenue', {
url: '/platformrevenue', url: '/platformrevenue',
templateUrl: '/static/config/platformrevenue/templates/platform_revenue_root.html', templateUrl: '/static/config/platformrevenue/templates/platform_revenue_root.html',
controller: 'platformRevenueRootCtrl' controller: 'platformRevenueRootCtrl',
}).state('analysis_report.platformsettle', { })
.state('analysis_report.platformsettle', {
url: '/platformsettle', url: '/platformsettle',
templateUrl: '/static/config/platformrevenue/templates/platform_settle_logs.html', templateUrl: '/static/config/platformrevenue/templates/platform_settle_logs.html',
controller: 'platformSettleLogCtrl', controller: 'platformSettleLogCtrl',
})
}); },
}]); ])
app.controller('platformSettleLogCtrl', ['$scope', '$http', '$state','$filter','Upload','commonDialog', function ($scope, $http, $state,$filter,Upload, commonDialog) { app.controller('platformSettleLogCtrl', [
'$scope',
$scope.wechatPagination = {}; '$http',
'$state',
'$filter',
'Upload',
'commonDialog',
function ($scope, $http, $state, $filter, Upload, commonDialog) {
$scope.wechatPagination = {}
$scope.loadWechatLogs = function (page) { $scope.loadWechatLogs = function (page) {
var params = $scope.queryParams || {}; var params = $scope.queryParams || {}
params.page = page || $scope.wechatPagination.page || 1; params.page = page || $scope.wechatPagination.page || 1
params.limit = 20; params.limit = 20
params.channel = 'Wechat'; params.channel = 'Wechat'
$http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) { $http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) {
$scope.wechatLogs = resp.data.data; $scope.wechatLogs = resp.data.data
$scope.wechatPagination = resp.data.pagination; $scope.wechatPagination = resp.data.pagination
}); })
}; }
$scope.loadWechatLogs(1); $scope.loadWechatLogs(1)
$scope.aliPagination = {}; $scope.aliPagination = {}
$scope.loadAliLogs = function (page) { $scope.loadAliLogs = function (page) {
var params = $scope.queryParams || {}; var params = $scope.queryParams || {}
params.page = page || $scope.aliPagination.page || 1; params.page = page || $scope.aliPagination.page || 1
params.limit = 20; params.limit = 20
params.channel = 'Alipay'; params.channel = 'Alipay'
$http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) { $http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) {
$scope.aliLogs = resp.data.data; $scope.aliLogs = resp.data.data
$scope.aliPagination = resp.data.pagination; $scope.aliPagination = resp.data.pagination
}); })
} }
$scope.loadAliLogs(1); $scope.loadAliLogs(1)
$scope.aliOnlinePagination = {}; $scope.aliOnlinePagination = {}
$scope.loadAliOnlineLogs = function (page) { $scope.loadAliOnlineLogs = function (page) {
var params = $scope.queryParams || {}; var params = $scope.queryParams || {}
params.page = page || $scope.aliOnlinePagination.page || 1; params.page = page || $scope.aliOnlinePagination.page || 1
params.limit = 20; params.limit = 20
params.channel = 'AlipayOnline'; params.channel = 'AlipayOnline'
$http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) { $http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) {
$scope.aliOnlineLogs = resp.data.data; $scope.aliOnlineLogs = resp.data.data
$scope.aliOnlinePagination = resp.data.pagination; $scope.aliOnlinePagination = resp.data.pagination
}); })
} }
$scope.loadAliOnlineLogs(1); $scope.loadAliOnlineLogs(1)
$scope.loadBestpayLog = function () { $scope.loadBestpayLog = function () {
$http.get('/platform/analysis/settle/Bestpay').then(function (resp) { $http.get('/platform/analysis/settle/Bestpay').then(function (resp) {
$scope.bestpayLogs = resp.data; $scope.bestpayLogs = resp.data
}); })
} }
$scope.loadBestpayLog(); $scope.loadBestpayLog()
$scope.verifySettleLog = function (log) { $scope.verifySettleLog = function (log) {
$http.get('/platform/analysis/settle/verify',{params:log}).then(function () { $http.get('/platform/analysis/settle/verify', { params: log }).then(
$scope.loadAliLogs(1); function () {
$scope.loadAliOnlineLogs(1); $scope.loadAliLogs(1)
$scope.loadWechatLogs(1); $scope.loadAliOnlineLogs(1)
$scope.loadWechatLogs(1)
commonDialog.alert({ commonDialog.alert({
title: 'Success', title: 'Success',
content: '校验结果已经重新生成,请查看!', content: '校验结果已经重新生成,请查看!',
type: 'success' type: 'success',
}) })
},function (resp) { },
function (resp) {
commonDialog.alert({ commonDialog.alert({
title: 'Error', title: 'Error',
content: resp.data.message, content: resp.data.message,
type: 'error' type: 'error',
}) })
}); }
)
} }
$scope.generateSettleLogs = function () { $scope.generateSettleLogs = function () {
$http.get('/platform/analysis/generate/settle/log').then(function () { $http.get('/platform/analysis/generate/settle/log').then(function () {
$scope.loadWechatLogs(1); $scope.loadWechatLogs(1)
$scope.loadAliLogs(1); $scope.loadAliLogs(1)
$state.reload(); $state.reload()
}); })
$state.reload(); $state.reload()
} }
$scope.hfParam = {}
$scope.hfPagination = {}
$scope.hfParam={};
$scope.hfPagination = {};
$scope.loadhfLogs = function (page) { $scope.loadhfLogs = function (page) {
var params = $scope.queryParams || {}; var params = $scope.queryParams || {}
params.page = page || $scope.hfPagination.page || 1; params.page = page || $scope.hfPagination.page || 1
params.limit = 20; params.limit = 20
params.channel = 'hf'; params.channel = 'hf'
$http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) { $http.get('/platform/analysis/settle/log', { params: params }).then(function (resp) {
$scope.hfLogs = resp.data.data; $scope.hfLogs = resp.data.data
$scope.hfPagination = resp.data.pagination; $scope.hfPagination = resp.data.pagination
}); })
}; }
$scope.loadhfLogs(1); $scope.loadhfLogs(1)
$scope.uploadhfSettleFile = function (file) { $scope.uploadhfSettleFile = function (file) {
if (file != null) { if (file != null) {
Upload.upload({ Upload.upload({
url: '/attachment/secret_files', url: '/attachment/secret_files',
data: {file: file} data: { file: file },
}).then(function (resp) { }).then(
$scope.hfParam.fileId = resp.data.fileid; function (resp) {
$scope.hfParam.fileId = resp.data.fileid
commonDialog.alert({ title: 'Upload Success', content: '', type: 'success' }) commonDialog.alert({ title: 'Upload Success', content: '', type: 'success' })
}, function (resp) { },
}, function (evt) { function (resp) {},
}) function (evt) {}
)
}
} }
};
$scope.dohfSettle = function () { $scope.dohfSettle = function () {
var param = angular.copy($scope.hfParam); var param = angular.copy($scope.hfParam)
if (!param.start) { if (!param.start) {
alert("请先选择开始时间"); alert('请先选择开始时间')
} }
if (!param.end) { if (!param.end) {
alert("请先选择结束时间"); alert('请先选择结束时间')
} }
if (!param.fileId) { if (!param.fileId) {
alert("请先上传汇付清算文件"); alert('请先上传汇付清算文件')
} }
param.start = $filter('date')(param.start, "yyyy-MM-dd"); param.start = $filter('date')(param.start, 'yyyy-MM-dd')
param.end = $filter('date')(param.end, "yyyy-MM-dd"); param.end = $filter('date')(param.end, 'yyyy-MM-dd')
$http.put('/platform/analysis/generate/hf/settle',param).then(function (resp) {
});
$http.put('/platform/analysis/generate/hf/settle', param).then(function (resp) {})
} }
},
}]); ])
app.controller('platformRevenueRootCtrl', ['$scope', '$http', '$filter', 'chartParser', function ($scope, $http, $filter, chartParser) { app.controller('platformRevenueRootCtrl', [
$scope.params = {year: new Date().getFullYear()}; '$scope',
$scope.availableYears = []; '$http',
var years = new Date().getFullYear() - 2016; '$filter',
for( var i = years ; i>=0 ; i-- ){ 'chartParser',
$scope.availableYears.push(new Date().getFullYear() - i) ; function ($scope, $http, $filter, chartParser) {
} $scope.params = { year: new Date() }
$scope.initMonth = function (year) {
$scope.months = [];
for (var i = 1; i < 13; i++) {
var mon = '00' + i;
mon = mon.substr(mon.length - 2, 2);
$scope.months.push(year + '-' + mon);
}
};
$scope.initMonth($scope.params.year);
$scope.hasReport = function (mon) { $scope.hasReport = function (mon) {
var start = '2017-01'; var start = '2017-01'
var end = $filter('date')(new Date(), 'yyyy-MM'); var end = $filter('date')(new Date(), 'yyyy-MM')
return start <= mon && end >= mon return start <= mon && end >= mon
}; }
$scope.loadYearReport = function (year) { $scope.loadYearReport = function () {
$scope.params.year = year; const year = $scope.params.year.getFullYear()
$http.get('/analysis/platform/revenue/year_reports/' + year).then(function (resp) { $http.get('/analysis/platform/revenue/year_reports/' + year).then(function (resp) {
$scope.report = resp.data; $scope.report = resp.data
loadChargeAnalysis(year); loadChargeAnalysis(year)
$scope.analysis = { $scope.analysis = {
analysis_year: year, analysis_year: year,
partner_commission: 0, partner_commission: 0,
bd_commission: 0, bd_commission: 0,
royalpay_surcharge: 0 royalpay_surcharge: 0,
}; }
angular.forEach($scope.report, function (report) { angular.forEach($scope.report, function (report) {
$scope.analysis.partner_commission = Decimal.add(report.partner_charge, $scope.analysis.partner_commission).toFixed(2); $scope.analysis.partner_commission = Decimal.add(report.partner_charge, $scope.analysis.partner_commission).toFixed(2)
$scope.analysis.bd_commission = Decimal.add(report.bd_charge, $scope.analysis.bd_commission).toFixed(2); $scope.analysis.bd_commission = Decimal.add(report.bd_charge, $scope.analysis.bd_commission).toFixed(2)
$scope.analysis.royalpay_surcharge = Decimal.add(report.royalpay_charge, $scope.analysis.royalpay_surcharge).toFixed(2); $scope.analysis.royalpay_surcharge = Decimal.add(report.royalpay_charge, $scope.analysis.royalpay_surcharge).toFixed(2)
});
}) })
}; })
}
$scope.loadYearReport()
function loadChargeAnalysis(year) { function loadChargeAnalysis(year) {
var analysisConfig = { var analysisConfig = {
chart: { chart: {
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效 axisPointer: {
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow' // 坐标轴指示器,坐标轴触发有效
type: 'shadow', // 默认为直线,可选为:'line' | 'shadow'
}, },
formatter: '{b}:AUD {c}' formatter: '{b}:AUD {c}',
}, },
legend: { legend: {
data: ['BD Commission', 'Partner Commission', 'RoyalPay SurCharge'] data: ['BD Commission', 'Partner Commission', 'RoyalPay SurCharge'],
}, },
grid: { grid: {
left: '3%', left: '3%',
right: '4%', right: '4%',
bottom: '3%', bottom: '3%',
containLabel: true containLabel: true,
}, },
yAxis: [ yAxis: [
{ {
type: 'value' type: 'value',
} },
] ],
}, },
xAxis: { xAxis: {
basic: { type: 'category' }, basic: { type: 'category' },
key: 'charge_date' key: 'charge_date',
}, },
series: [ series: [
{ {
basic: { name: 'BD Commission', type: 'bar' }, basic: { name: 'BD Commission', type: 'bar' },
column: {key: 'bd_charge'} column: { key: 'bd_charge' },
}, },
{ {
basic: { basic: {
name: 'Partner Commission', name: 'Partner Commission',
type: 'bar' type: 'bar',
}, },
column: {key: 'partner_charge'} column: { key: 'partner_charge' },
}, },
{ {
basic: { name: 'RoyalPay SurCharge', type: 'bar', stack: 'RoyalPaySurcharge' }, basic: { name: 'RoyalPay SurCharge', type: 'bar', stack: 'RoyalPaySurcharge' },
column: {key: 'royalpay_charge'} column: { key: 'royalpay_charge' },
},
],
} }
]
};
$http.get('/analysis/platform/revenue/year_reports/' + year).then(function (resp) { $http.get('/analysis/platform/revenue/year_reports/' + year).then(function (resp) {
$scope.chargeAnalysis = chartParser.parse(analysisConfig, resp.data); $scope.chargeAnalysis = chartParser.parse(analysisConfig, resp.data)
}) })
} }
},
$scope.loadYearReport(new Date().getFullYear()); ])
}]); return app
return app; })
});

@ -25,13 +25,11 @@
</ul> </ul>
</div>--> </div>-->
<div ng-repeat="year in availableYears" style="display: inline"> <button class="btn btn-info" ng-bind="params.year.getFullYear()"
<button class="btn btn-info" ng-click="ctrl.viewyear=true"></button>
ng-click="loadYearReport(year)" <input type="text" class="hidden" uib-datepicker-popup="yyyy" ng-model="params.year"
ng-bind="year" is-open="ctrl.viewyear" datepicker-options="{minMode: 'year'}" ng-change="loadYearReport()"
ng-class="{'active':year == params.year}" placeholder="Select Year">
></button>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -59,11 +57,12 @@
<span ng-bind="r.bd_charge|currency:'$'" class="text-green"></span> <span ng-bind="r.bd_charge|currency:'$'" class="text-green"></span>
</div> </div>
<div class="info-box-number-right"> <div class="info-box-number-right">
<i class="fa fa-angle-double-down" aria-hidden="true" title="show detail" <i class="fa fa-angle-double-down" aria-hidden="true" title="show detail" uib-popover="
uib-popover="
Wechat:{{r.channels.Wechat}} &#10 &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp Wechat:{{r.channels.Wechat}} &#10 &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
Alipay:{{r.channels.Alipay}} &#10 Alipay:{{r.channels.Alipay}} &#10
Bestpay:{{r.channels.Bestpay}}" popover-title="RoyalPay SurCharge Detail" popover-placement="bottom" popover-data-html="true"></i><span class="text-bold">RoyalPay SurCharge:</span> Bestpay:{{r.channels.Bestpay}}" popover-title="RoyalPay SurCharge Detail"
popover-placement="bottom" popover-data-html="true"></i><span class="text-bold">RoyalPay
SurCharge:</span>
<span ng-bind="r.royalpay_charge|currency:'$'" class="text-green"></span> <span ng-bind="r.royalpay_charge|currency:'$'" class="text-green"></span>
</div> </div>

@ -43,10 +43,10 @@
<label class="control-label col-sm-3" for="merchant_storename_input">* Merchant Short Name</label> <label class="control-label col-sm-3" for="merchant_storename_input">* Merchant Short Name</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.short_name" <input class="form-control" ng-model="subMerchantInfo.short_name"
type="text" name="merchant_storename" id="merchant_storename_input" required maxlength="50"> type="text" name="merchant_storename" id="merchant_storename_input" required maxlength="20">
<div ng-messages="subForm.merchant_storename.$error" ng-if="subForm.merchant_storename.$dirty"> <div ng-messages="subForm.merchant_storename.$error" ng-if="subForm.merchant_storename.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p> <p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 50</p> <p class="small text-danger" ng-message="maxlength">Length is more than 20</p>
</div> </div>
</div> </div>
</div> </div>
@ -92,7 +92,7 @@
<label class="control-label col-sm-3" for="website_input">* Website</label> <label class="control-label col-sm-3" for="website_input">* Website</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.company_website" <input class="form-control" ng-model="subMerchantInfo.company_website"
type="url" name="company_website" id="website_input" required maxlength="128"> type="url" name="company_website" id="website_input" required maxlength="100">
<p class="small " >( Not required when business type is Offline scenario)</p> <p class="small " >( Not required when business type is Offline scenario)</p>
<div ng-messages="subForm.company_website.$error" ng-if="subForm.company_website.$dirty"> <div ng-messages="subForm.company_website.$error" ng-if="subForm.company_website.$dirty">
@ -122,10 +122,12 @@
ng-class="{'has-error':subForm.office_phone.$invalid && subForm.office_phone.$dirty}"> ng-class="{'has-error':subForm.office_phone.$invalid && subForm.office_phone.$dirty}">
<label class="control-label col-sm-3" for="office_phone_input">* Office Phone</label> <label class="control-label col-sm-3" for="office_phone_input">* Office Phone</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.company_phone" <input class="form-control" ng-model="subMerchantInfo.company_phone" maxlength="20"
type="tel" name="office_phone" id="office_phone_input" required> type="tel" name="office_phone" id="office_phone_input" required>
<div ng-messages="subForm.office_phone.$error" ng-if="subForm.office_phone.$dirty"> <div ng-messages="subForm.office_phone.$error" ng-if="subForm.office_phone.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p> <p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 20</p>
</div> </div>
</div> </div>
@ -162,10 +164,10 @@
<label class="control-label col-sm-3" for="contact_email_input">* Contact Email</label> <label class="control-label col-sm-3" for="contact_email_input">* Contact Email</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.contact_email" <input class="form-control" ng-model="subMerchantInfo.contact_email"
type="text" name="contact_email" id="contact_email_input" required maxlength="128"> type="text" name="contact_email" id="contact_email_input" required maxlength="50">
<div ng-messages="subForm.contact_email.$error" ng-if="subForm.contact_email.$dirty"> <div ng-messages="subForm.contact_email.$error" ng-if="subForm.contact_email.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p> <p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 128</p> <p class="small text-danger" ng-message="maxlength">Length is more than 50</p>
</div> </div>
</div> </div>
</div> </div>

@ -94,7 +94,7 @@
<label class="control-label col-sm-3" for="website_input">* Website</label> <label class="control-label col-sm-3" for="website_input">* Website</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.company_website" <input class="form-control" ng-model="subMerchantInfo.company_website"
type="url" name="website" id="website_input" required maxlength="128"> type="url" name="website" id="website_input" required maxlength="100">
<p class="small " >(Not required when business type is Offline scenario)</p> <p class="small " >(Not required when business type is Offline scenario)</p>
<div ng-messages="subForm.company_website.$error" ng-if="subForm.company_website.$dirty"> <div ng-messages="subForm.company_website.$error" ng-if="subForm.company_website.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p> <p class="small text-danger" ng-message="required">Required Field</p>
@ -162,10 +162,10 @@
<label class="control-label col-sm-3" for="contact_email_input">* Contact Email</label> <label class="control-label col-sm-3" for="contact_email_input">* Contact Email</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="subMerchantInfo.contact_email" <input class="form-control" ng-model="subMerchantInfo.contact_email"
type="text" name="contact_email" id="contact_email_input" required maxlength="128"> type="text" name="contact_email" id="contact_email_input" required maxlength="50">
<div ng-messages="subForm.contact_email.$error" ng-if="subForm.contact_email.$dirty"> <div ng-messages="subForm.contact_email.$error" ng-if="subForm.contact_email.$dirty">
<p class="small text-danger" ng-message="required">Required Field</p> <p class="small text-danger" ng-message="required">Required Field</p>
<p class="small text-danger" ng-message="maxlength">Length is more than 128</p> <p class="small text-danger" ng-message="maxlength">Length is more than 50</p>
</div> </div>
</div> </div>
</div> </div>

@ -1,23 +1,11 @@
package au.com.royalpay.payment.manage.process.custom; package au.com.royalpay.payment.manage.process.custom;
import au.com.royalpay.payment.channels.alipay.runtime.impls.AlipayCustomDeclaringTaskProcessor;
//import au.com.royalpay.payment.core.mappers.PmtCustomReportsDetailMapper;
//import au.com.royalpay.payment.core.mappers.PmtCustomReportsMapper;
import au.com.royalpay.payment.core.mappers.PmtOrderMapper;
import au.com.royalpay.payment.manage.mappers.custom.CustomReportDetailsMapper;
import au.com.royalpay.payment.manage.mappers.custom.CustomReportsMapper;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
/** /**
* Create by yixian at 2018-08-14 20:28 * Create by yixian at 2018-08-14 20:28
*/ */

@ -68,7 +68,7 @@ server {
} }
location ~ ^/api/v1.0/((jd)|(customs)|(alipay)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(wechat_jsapi_gateway)|(h5_payment)|(gateway)|(hf_gateway)|(jd_gateway)|(micropay)|(retail_qrcode)|(jsapi_gateway)|(share_code)|(payment))/ { location ~ ^/api/v1.0/((alipay_connect)|(customs)|(alipay)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(wechat_jsapi_gateway)|(h5_payment)|(gateway)|(hf_gateway)|(jd_gateway)|(micropay)|(retail_qrcode)|(jsapi_gateway)|(share_code)|(payment))/ {
proxy_pass http://rppaycenter; proxy_pass http://rppaycenter;
proxy_http_version 1.1; proxy_http_version 1.1;

Loading…
Cancel
Save