diff --git a/src/db/modify.sql b/src/db/modify.sql
index 982cf73fe..f37a998db 100644
--- a/src/db/modify.sql
+++ b/src/db/modify.sql
@@ -360,4 +360,109 @@ ADD COLUMN `surcharge_cashback` decimal(10,4) default 0 after `royalpay_surcharg
-ALTER TABLE sys_clients ADD store_photo VARCHAR(200) NULL;
\ No newline at end of file
+ALTER TABLE sys_clients ADD store_photo VARCHAR(200) NULL;
+
+CREATE TABLE `log_client_sub_merchant_id` (
+ `id` varchar(50) NOT NULL,
+ `sub_merchant_id_before` varchar(30) DEFAULT NULL COMMENT '修改之前的sub_merchant_id',
+ `sub_merchant_id_after` varchar(30) NOT NULL COMMENT '修改之后的sub_merchant_id',
+ `operator` varchar(30) NOT NULL COMMENT '操作人',
+ `create_time` datetime NOT NULL COMMENT '创建时间',
+ `client_id` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) 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;
+
+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 '';
+
+
+
+
+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');
+
+
diff --git a/src/document/cn/apis.js b/src/document/cn/apis.js
index 75071a8f7..590c94fd1 100644
--- a/src/document/cn/apis.js
+++ b/src/document/cn/apis.js
@@ -756,13 +756,13 @@
*
*/
/**
- * @api {PUT} /api/v1.0/alipay/partners/{partner_code}/app_orders/{order_id} 创建支付宝SDK订单
- * @apiName AlipaySDK
+ * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} 创建SDK订单
+ * @apiName SDK
* @apiDescription
- * 用于移动端APP调用支付宝SDK支付,调用API创建订单,得到支付宝SDK调用参数,将参数传递给SDK拉起支付宝支付,并由支付宝客户端直接返回支付结果。
+ * 用于移动端APP调用微信SDK支付,调用API创建订单,得到微信SDK调用参数,将参数传递给SDK拉起微信支付,并由微信客户端直接返回支付结果。
* 强烈建议获得支付结果后再调用RoyalPay订单查询API确认完成支付后再进行后续流程,避免因超时自动撤单导致资金损失
- *
- * 关于客户端和支付宝整合的更多信息: 支付宝SDK文档
+ *
+ * 关于客户端和支付宝整合的更多信息: 支付宝SDK文档
* SDK for Android
* SDK for iOS
*
@@ -776,10 +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} channel 支付渠道,必填,大小写敏感
* @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=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/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/apis.js b/src/document/en/apis.js
index df673fc43..1f2ce5882 100644
--- a/src/document/en/apis.js
+++ b/src/document/en/apis.js
@@ -769,13 +769,14 @@
* @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
+ * @api {PUT} /api/v1.0/gateway/partners/{partner_code}/app_orders/{order_id} Create SDK Order
+ * @apiName SDK
* @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
+ * 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
@@ -789,10 +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} 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
- * @apiParam (JSON) {String} version client app version, optional
+ * @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/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.
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 000000000..c1150ef4f
Binary files /dev/null and b/src/document/tpl/img/sdk_wechat_api_payment_cn.png differ
diff --git a/src/document/tpl/img/sdk_wechat_api_payment_en.png b/src/document/tpl/img/sdk_wechat_api_payment_en.png
new file mode 100644
index 000000000..375240491
Binary files /dev/null and b/src/document/tpl/img/sdk_wechat_api_payment_en.png differ
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/mappers/ClientAnalysisMapper.java b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/ClientAnalysisMapper.java
index 3ffc50578..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
@@ -6,6 +6,7 @@ import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
+import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -32,4 +33,6 @@ public interface ClientAnalysisMapper {
List listPartnersTradeAmount(JSONObject params, PageBounds pageBounds);
List countClientsTypes(JSONObject params);
+
+ List notTradeSubMerchantId();
}
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/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..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,6 +26,7 @@ public class AppQueryBean {
private OrderStatus status = OrderStatus.ALL;
private PayChannel channel = PayChannel.ALL;
private int[] gateway;
+ private int clearing_status=-1;
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/RetailAppService.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java
index e7c902375..a47819a0d 100644
--- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java
+++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java
@@ -13,6 +13,7 @@ import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
+import java.util.Map;
/**
@@ -130,4 +131,6 @@ public interface RetailAppService {
JSONObject getInvoiceData(JSONObject device, AppQueryBean appQueryBean) throws Exception;
void getInvoiceFile(JSONObject device, AppQueryBean appQueryBean, HttpServletResponse httpResponse) throws Exception;
+
+ Map channelAndDayOfAnalysis(int client_id, String clearingDetailId, String channel, JSONObject device);
}
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 16de3b3a1..6d0225b73 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
@@ -10,6 +10,7 @@ import au.com.royalpay.payment.manage.appclient.core.RetailAppService;
import au.com.royalpay.payment.manage.cashback.core.CashbackService;
import au.com.royalpay.payment.manage.customers.core.CouponValidateService;
import au.com.royalpay.payment.manage.fund.core.impls.XPlanFundConfigServiceImpl;
+import au.com.royalpay.payment.manage.management.clearing.core.CleanService;
import au.com.royalpay.payment.manage.mappers.log.AppMessageLogMapper;
import au.com.royalpay.payment.manage.mappers.log.ClearingDetailAnalysisMapper;
import au.com.royalpay.payment.manage.mappers.log.ClearingDetailMapper;
@@ -152,8 +153,9 @@ public class RetailAppServiceImp implements RetailAppService {
@Resource
private LogSettleMailMapper logSettleMailMapper;
@Resource
+ private CleanService cleanService;
+ @Resource
private ClientConfigService clientConfigService;
-
private Map senderMap = new HashMap<>();
@Resource
@@ -285,7 +287,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());
@@ -296,6 +299,13 @@ public class RetailAppServiceImp implements RetailAppService {
tradeLogService.exportTransFlow(tradeLogQuery,device,httpResponse);
}
+ @Override
+ public Map channelAndDayOfAnalysis(int client_id, String clearingDetailId, String channel, JSONObject device) {
+ String clientType = device.getString("client_type");
+ deviceSupport.findRegister(clientType);
+ return cleanService.channelAndDayOfAnalysis(client_id, clearingDetailId,channel,device.getJSONObject("client"));
+ }
+
@Override
public void updateClient(JSONObject device, AppClientBean appClientBean) {
String clientType = device.getString("client_type");
diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java
index 68dd52b8f..e88beb389 100644
--- a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java
+++ b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java
@@ -15,7 +15,6 @@ import au.com.royalpay.payment.manage.settlement.core.ManualSettleSupport;
import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean;
import au.com.royalpay.payment.manage.signin.core.SignInStatusManager;
import au.com.royalpay.payment.manage.system.core.ClientContractService;
-import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.device.advise.AppClientController;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
@@ -23,31 +22,22 @@ import au.com.royalpay.payment.tools.exceptions.ForbiddenException;
import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.merchants.beans.QRCodeConfig;
import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO;
-
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
-
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.validation.Errors;
-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.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-
import static au.com.royalpay.payment.tools.CommonConsts.RETAIL_DEVICE;
/**
@@ -137,6 +127,15 @@ public class RetailAppController {
return retailAppService.getTransactionLogsByClearingDetailId(device, clearing_detail_id, timezone);
}
+ @RequestMapping("/{client_id}/settlement_logs/{clearingDetailId}/analysis/{channel}")
+ public Map channelAndDayOfAnalysis(@PathVariable int client_id, @PathVariable String clearingDetailId,
+ @PathVariable String channel,@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device) {
+ if ("all".equals(channel)){
+ channel = "null";
+ }
+ return retailAppService.channelAndDayOfAnalysis(client_id, clearingDetailId,channel,device);
+ }
+
/* 消息模块begin */
@RequestMapping(value = "/notice", method = RequestMethod.GET)
public JSONObject listNotices(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, @RequestParam Map params) {
diff --git a/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java
index 4c0d74786..14791c35d 100644
--- a/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java
+++ b/src/main/java/au/com/royalpay/payment/manage/apps/core/impls/CustomerImpressionServiceImpl.java
@@ -178,7 +178,7 @@ public class CustomerImpressionServiceImpl implements CustomerImpressionService
clientCustomersMapper.updateAfterPaymentFinish(clientCustomerInfo);
}
} finally {
- locker.unlock(customer_id);
+ locker.unlock(CUSTOMER_IMPRESSION_PREFIX+customer_id);
}
} catch (Exception e) {
logger.debug("Reduce Customer Impression Error Redis Value =" + redisValue, e);
diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/web/IPController.java b/src/main/java/au/com/royalpay/payment/manage/dev/web/IPController.java
new file mode 100644
index 000000000..fb3c75895
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/dev/web/IPController.java
@@ -0,0 +1,24 @@
+package au.com.royalpay.payment.manage.dev.web;
+
+import com.alibaba.fastjson.JSONObject;
+import com.maxmind.geoip.LookupService;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping(value = "/dev/ip")
+
+public class IPController {
+ @Resource
+ private LookupService lookupService;
+
+ @RequestMapping(value = "/{ipAddr}", method = RequestMethod.GET)
+ public String getIpInfo(@PathVariable String ipAddr) {
+ String city = lookupService.getLocation(ipAddr).city;
+ return city;
+ }
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java b/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java
index 909d067e0..d0d88930c 100644
--- a/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java
+++ b/src/main/java/au/com/royalpay/payment/manage/dev/web/TestController.java
@@ -5,7 +5,6 @@ import au.com.royalpay.payment.channels.bestpay.runtime.BestPayClient;
import au.com.royalpay.payment.channels.jd.runtime.JDClient;
import au.com.royalpay.payment.channels.wechat.runtime.WxPayClient;
import au.com.royalpay.payment.core.PaymentApi;
-import au.com.royalpay.payment.core.PaymentChannelApi;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.exceptions.OrderNotExistsException;
import au.com.royalpay.payment.manage.analysis.core.PlatformClearService;
@@ -20,19 +19,21 @@ import au.com.royalpay.payment.manage.mappers.payment.RefundMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientBankAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.permission.manager.ManagerMapping;
-import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.manage.tradelog.core.TradeLogService;
import au.com.royalpay.payment.tools.CommonConsts;
import au.com.royalpay.payment.tools.defines.TradeType;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.http.HttpUtils;
import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider;
+import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.PdfUtils;
import au.com.royalpay.payment.tools.utils.TimeZoneUtils;
import au.com.royalpay.payment.tools.utils.XmlFormatUtils;
+
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
+
import org.apache.commons.lang3.time.DateFormatUtils;
import org.dom4j.Element;
import org.slf4j.Logger;
@@ -42,12 +43,14 @@ import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.util.Assert;
import org.springframework.validation.Errors;
-import org.springframework.web.bind.annotation.*;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
-import javax.annotation.Resource;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@@ -56,6 +59,11 @@ import java.net.URISyntaxException;
import java.util.Date;
import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
/**
* Created by yixian on 2016-07-06.
*/
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientSubMerchantIdMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientSubMerchantIdMapper.java
new file mode 100644
index 000000000..d351576f0
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/client/ClientSubMerchantIdMapper.java
@@ -0,0 +1,25 @@
+package au.com.royalpay.payment.manage.mappers.client;
+
+import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
+import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
+import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
+import com.alibaba.fastjson.JSONObject;
+import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@AutoMapper(tablename = "cli_sub_merchant_id", pkName = "sub_merchant_id")
+public interface ClientSubMerchantIdMapper {
+ @AutoSql(type = SqlType.SELECT)
+ List listSubMerchantId(PageBounds pageBounds);
+
+ @AutoSql(type = SqlType.INSERT)
+ void save(JSONObject subMerchantId);
+
+ @AutoSql(type = SqlType.UPDATE)
+ void update(JSONObject subMerchantId);
+
+ @AutoSql(type = SqlType.DELETE)
+ void delete(@Param("sub_merchant_id") String sub_merchant_id);
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/log/LogClientSubMerchantIdMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/log/LogClientSubMerchantIdMapper.java
new file mode 100644
index 000000000..9bb01369e
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/log/LogClientSubMerchantIdMapper.java
@@ -0,0 +1,19 @@
+package au.com.royalpay.payment.manage.mappers.log;
+
+import cn.yixblog.support.mybatis.autosql.annotations.AutoMapper;
+import cn.yixblog.support.mybatis.autosql.annotations.AutoSql;
+import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@AutoMapper(tablename = "log_client_sub_merchant_id", pkName = "id")
+public interface LogClientSubMerchantIdMapper {
+
+ @AutoSql(type = SqlType.INSERT)
+ void save(JSONObject log);
+
+ @AutoSql(type = SqlType.SELECT)
+ List listLogsByClientId(@Param("client_id") int client_id);
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/payment/CommonSubMerchantIdMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/CommonSubMerchantIdMapper.java
new file mode 100644
index 000000000..0e98c9127
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/payment/CommonSubMerchantIdMapper.java
@@ -0,0 +1,32 @@
+package au.com.royalpay.payment.manage.mappers.payment;
+
+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;
+import cn.yixblog.support.mybatis.autosql.annotations.SqlType;
+
+import java.util.List;
+
+/**
+ * Create by yixian at 2017-12-05 23:13
+ */
+@AutoMapper(tablename = "pmt_sub_merchant_id", pkName = "sub_merchant_id")
+public interface CommonSubMerchantIdMapper {
+ @AutoSql(type = SqlType.SELECT)
+ List list(@Param("is_valid") boolean is_valid, @Param("sub_merchant_id") String sub_merchant_id,PageBounds pageBounds);
+
+ @AutoSql(type = SqlType.INSERT)
+ void save(JSONObject record);
+
+ @AutoSql(type = SqlType.UPDATE)
+ void update(JSONObject record);
+
+ @AutoSql(type = SqlType.SELECT)
+ JSONObject find(@Param("sub_merchant_id")String sub_merchant_id);
+
+}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java
new file mode 100644
index 000000000..4c0db3b16
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantDetailLogMapper.java
@@ -0,0 +1,24 @@
+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;
+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 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
new file mode 100644
index 000000000..0aa2f7465
--- /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 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;
+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);
+
+ @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/mappers/risk/RiskTransactionLogMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java
new file mode 100644
index 000000000..c3b4cbc41
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.java
@@ -0,0 +1,27 @@
+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;
+
+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);
+
+ PageList query(JSONObject params, PageBounds pagination);
+}
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/mappers/system/ClientMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMapper.java
index 1e57a5460..7e5f17df0 100644
--- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMapper.java
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMapper.java
@@ -70,4 +70,8 @@ public interface ClientMapper {
List listCityClientIds(@Param("city") String city, @Param("date") Date date);
List listClientByCleanDays(@Param("clean_days") int clean_days);
+
+ List listSubMerchantId();
+
+ List listBySubMerchantId(@Param("sub_merchant_id") String sub_merchant_id);
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java
index 6d6bfd943..b9e5ed634 100644
--- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java
+++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java
@@ -48,4 +48,7 @@ public interface ClientRateMapper {
JSONObject latestChannelCleanDays(@Param("rate_name")String rate_name, @Param("client_id")int client_id);
+ JSONObject latestExpiryConfig(@Param("client_id")int client_id,@Param("rate_name") String rate_name);
+
+
}
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
new file mode 100644
index 000000000..ec5912ba7
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/MerchantIdManageService.java
@@ -0,0 +1,23 @@
+package au.com.royalpay.payment.manage.merchantid.core;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by yuan on 2018/4/24.
+ */
+public interface MerchantIdManageService {
+ Map> listSubMerchantId(JSONObject manager);
+
+ void generateClientsSunMerchantId();
+
+ JSONObject listNotTradeSubMerchantId(JSONObject manager);
+
+ List showClientMoniker(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
new file mode 100644
index 000000000..c1fe7f0f1
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/core/impl/MerchantIdManageServiceImpl.java
@@ -0,0 +1,133 @@
+package au.com.royalpay.payment.manage.merchantid.core.impl;
+
+import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig;
+import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi;
+import au.com.royalpay.payment.manage.analysis.mappers.ClientAnalysisMapper;
+import au.com.royalpay.payment.manage.mappers.client.ClientSubMerchantIdMapper;
+import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper;
+import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
+import au.com.royalpay.payment.manage.merchantid.core.MerchantIdManageService;
+import au.com.royalpay.payment.tools.env.PlatformEnvironment;
+import au.com.royalpay.payment.tools.env.SysConfigManager;
+import au.com.royalpay.payment.tools.exceptions.BadRequestException;
+import com.alibaba.fastjson.JSONObject;
+import com.github.miemiedev.mybatis.paginator.domain.Order;
+import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Created by yuan on 2018/4/24.
+ */
+@Service
+public class MerchantIdManageServiceImpl implements MerchantIdManageService {
+ @Autowired
+ private ClientMapper clientMapper;
+
+ @Autowired
+ private SysConfigManager sysConfigManager;
+
+ @Autowired
+ private ClientAnalysisMapper clientAnalysisMapper;
+
+ @Autowired
+ private ClientSubMerchantIdMapper clientSubMerchantIdMapper;
+
+ @Resource
+ private CommonSubMerchantIdMapper commonSubMerchantIdMapper;
+
+ @Resource
+ private MpPaymentApi mpPaymentApi;
+
+
+ @Override
+ public Map> listSubMerchantId(JSONObject manager) {
+ List clients = clientMapper.listSubMerchantId();
+ return getClientMap(clients);
+ }
+ @Override
+ public JSONObject listNotTradeSubMerchantId(JSONObject manager) {
+ List clients = clientSubMerchantIdMapper.listSubMerchantId(new PageBounds(Order.formString("create_time.desc")));
+ Map> merchantIdMap = clients.stream().filter(t->t.containsKey("merchant_id")).filter(t->t.containsKey("sub_merchant_id")).collect(Collectors.groupingBy(t->t.getString("merchant_id")));
+ JSONObject returnJason = new JSONObject();
+ returnJason.put("merchant_id_map",merchantIdMap);
+ returnJason.put("refresh_time",clients.size()>0?clients.get(0).getDate("create_time"):"");
+ return returnJason;
+ }
+ @Override
+ public void generateClientsSunMerchantId() {
+ String tempSubMerchantIds = sysConfigManager.getSysConfig().getString("temp_sub_mch_id");
+ List clients = clientAnalysisMapper.notTradeSubMerchantId();
+ List clientSubMerchantId = clientSubMerchantIdMapper.listSubMerchantId(new PageBounds(Order.formString("create_time.desc")));
+ Map subMerchantIdMapFromDB = new HashMap<>();
+ for (JSONObject id : clientSubMerchantId) {
+ subMerchantIdMapFromDB.put(id.getString("sub_merchant_id"), id);
+ }
+ for (JSONObject client: clients) {
+ String subMerchantId = client.getString("sub_merchant_id");
+ if (subMerchantId != null && tempSubMerchantIds != null && tempSubMerchantIds.contains(subMerchantId)) {
+ client.put("temp_sub_merchant", true);
+ }
+ String id = client.getString("sub_merchant_id");
+ client.put("create_time",new Date());
+ if (subMerchantIdMapFromDB.containsKey(id)) {
+ subMerchantIdMapFromDB.remove(id);
+ clientSubMerchantIdMapper.update(client);
+ } else {
+ clientSubMerchantIdMapper.save(client);
+ }
+ }
+ for (String id : subMerchantIdMapFromDB.keySet()) {
+ clientSubMerchantIdMapper.delete(id);
+ }
+ }
+
+ @Override
+ public List showClientMoniker(JSONObject manager,String sub_merchant_id) {
+ return clientMapper.listBySubMerchantId(sub_merchant_id);
+ }
+
+ @Override
+ public void save(JSONObject record) {
+ JSONObject sub_merchant_id = commonSubMerchantIdMapper.find(record.getString("sub_merchant_id"));
+ if(sub_merchant_id!=null){
+ throw new BadRequestException("当前商户号已经添加,请重新输入");
+ }
+ WeChatPayConfig.Merchant availableMerchant = mpPaymentApi.determineMerchant(record.getString("sub_merchant_id"));
+ if(availableMerchant == null){
+ throw new BadRequestException("未检索到对应的商户号,请验证子商户号是否正确");
+ }
+ record.put("merchant_id",availableMerchant.getMerchantId());
+ commonSubMerchantIdMapper.save(record);
+
+ }
+
+ @Override
+ public void disable(String sub_merchant_id) {
+ 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);
+ }
+
+ private Map> getClientMap(List clients){
+ String tempSubMerchantIds = sysConfigManager.getSysConfig().getString("temp_sub_mch_id");
+ for (JSONObject client: clients) {
+ String subMerchantId = client.getString("sub_merchant_id");
+ if (subMerchantId != null && tempSubMerchantIds != null && tempSubMerchantIds.contains(subMerchantId)) {
+ client.put("temp_sub_merchant", true);
+ }
+ }
+ Map> clientsMap = clients.stream().filter(t->t.containsKey("merchant_id")).filter(t->t.containsKey("sub_merchant_id")).collect(Collectors.groupingBy(t->t.getString("merchant_id")));
+ return clientsMap;
+ }
+}
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
new file mode 100644
index 000000000..ea706e83b
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/merchantid/web/MerchantIdManageController.java
@@ -0,0 +1,75 @@
+package au.com.royalpay.payment.manage.merchantid.web;
+
+import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper;
+import au.com.royalpay.payment.manage.merchantid.core.MerchantIdManageService;
+
+import au.com.royalpay.payment.manage.permission.manager.RequireManager;
+import au.com.royalpay.payment.tools.CommonConsts;
+import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
+import com.alibaba.fastjson.JSONObject;
+import com.github.miemiedev.mybatis.paginator.domain.Order;
+import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/sys/merchant_id")
+public class MerchantIdManageController {
+
+ @Resource
+ private MerchantIdManageService merchantIdManageService;
+
+ @Resource
+ private CommonSubMerchantIdMapper commonSubMerchantIdMapper;
+
+ @RequestMapping(method = RequestMethod.GET)
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public Map> listSubMerchantId(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
+ return merchantIdManageService.listSubMerchantId(manager);
+ }
+
+ @RequestMapping(method = RequestMethod.GET,value = "/trade")
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public JSONObject listNotTradeSubMerchantId(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
+ return merchantIdManageService.listNotTradeSubMerchantId(manager);
+ }
+
+ @RequestMapping(method = RequestMethod.POST,value = "/refresh")
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public void refreshClientsByTraded(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
+ merchantIdManageService.generateClientsSunMerchantId();
+ }
+
+ @RequestMapping(method = RequestMethod.GET,value = "/{sub_merchant_id}")
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public List showClientMoniker(@PathVariable() String sub_merchant_id,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
+ return merchantIdManageService.showClientMoniker(manager,sub_merchant_id);
+ }
+
+
+ @RequestMapping(value = "/common_sub_merchant_id", method = RequestMethod.GET)
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public List listCommonSubMerchantId(@RequestParam(required = false) String sub_merchant_id, @RequestParam(defaultValue = "true") boolean is_valid) {
+ return commonSubMerchantIdMapper.list(is_valid,sub_merchant_id,new PageBounds(Order.formString("create_time.desc")));
+ }
+
+ @RequestMapping(value = "/common_sub_merchant_id/{sub_merchant_id}", method = RequestMethod.POST)
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public void addCommonSubMerchantId(@PathVariable String sub_merchant_id,@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
+ JSONObject record = new JSONObject();
+ record.put("sub_merchant_id",sub_merchant_id);
+ record.put("operator",manager.getString("display_name"));
+ record.put("create_time",new Date());
+ merchantIdManageService.save(record);
+ }
+
+ @RequestMapping(value = "/common_sub_merchant_id/{sub_merchant_id}", method = RequestMethod.PUT)
+ @RequireManager(role = {ManagerRole.OPERATOR})
+ public void disableCommonSubMerchantId(@PathVariable String sub_merchant_id) {
+ merchantIdManageService.disable(sub_merchant_id);
+ }
+}
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..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
@@ -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")
@@ -67,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){
@@ -145,6 +152,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;
}
@@ -320,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/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java
index a2f2f2329..965d42a1b 100644
--- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java
+++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java
@@ -286,4 +286,6 @@ public interface ClientManager {
void clearCacheSubMerchantIdApplices(String clientMoniker);
JSONObject getCheckClientInfo(int client_id,String account_id, String channel);
+
+ List getClientSubMerchantIdLogs(String clientMoniker,JSONObject manager);
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java
index b3c54867a..3826fde4a 100644
--- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java
+++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java
@@ -14,6 +14,7 @@ import au.com.royalpay.payment.manage.appclient.beans.AppClientBean;
import au.com.royalpay.payment.manage.device.core.DeviceManager;
import au.com.royalpay.payment.manage.mappers.financial.FinancialBDConfigMapper;
import au.com.royalpay.payment.manage.mappers.log.ClientsOperationLogMapper;
+import au.com.royalpay.payment.manage.mappers.log.LogClientSubMerchantIdMapper;
import au.com.royalpay.payment.manage.mappers.log.LogSettleMailMapper;
import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper;
import au.com.royalpay.payment.manage.mappers.redpack.ActClientInvitationCodeMapper;
@@ -254,6 +255,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
private MessageSource messageSource;
@Resource
private ClientsOperationLogMapper clientsOperationLogMapper;
+ @Resource
+ private LogClientSubMerchantIdMapper logClientSubMerchantIdMapper;
+
@Resource
private ClientInfoCacheSupport clientInfoCacheSupport;
@Resource
@@ -310,6 +314,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
client.put("show_all_permission", true);
int role = manager != null ? manager.getIntValue("role") : 0;
if (manager != null) {
+ if(ManagerRole.OPERATOR.hasRole(role)){
+ List log = logClientSubMerchantIdMapper.listLogsByClientId(client.getInteger("client_id"));
+ client.put("sub_merchant_id_log", log.size()>0?true:false);
+ }
if (ManagerRole.BD_USER.hasRole(role)) {
int checkBDPermission = clientBDMapper.checkBDPermission(client.getIntValue("client_id"), manager.getString("manager_id"));
client.put("show_all_permission", checkBDPermission > 0);
@@ -610,18 +618,39 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
JSONObject update = new JSONObject();
int clientId = client.getIntValue("client_id");
String originSubMerchantId = client.getString("sub_merchant_id");
+ update.put("client_id", clientId);
String subMerchantId = subMerchantInfo.getString("sub_merchant_id");
WeChatPayConfig.Merchant availableMerchant = mpPaymentApi.determineMerchant(subMerchantId);
- clientModifySupport.processClientModify(
- new MerchantIdModify(manager, clientMoniker, subMerchantId, availableMerchant == null ? null : availableMerchant.getMerchantId()));
+ update.put("merchant_id", availableMerchant == null ? null : availableMerchant.getMerchantId());
+ update.put("sub_merchant_id", subMerchantId);
+ try{
+ recordSubMerchantLog(client,subMerchantInfo,manager);
+ }catch(Exception e){
+ logger.error("记录log_client_sub_merchant_id失败",e);
+ }
+ clientMapper.update(update);
List children = clientMapper.listChildClients(clientId);
for (JSONObject child : children) {
if (Objects.equals(child.getString("sub_merchant_id"), originSubMerchantId)) {
update.put("client_id", child.getIntValue("client_id"));
- clientModifySupport.processClientModify(
- new MerchantIdModify(manager, clientMoniker, subMerchantId, availableMerchant == null ? null : availableMerchant.getMerchantId()));
+ try{
+ recordSubMerchantLog(child,subMerchantInfo,manager);
+ }catch(Exception e){
+ logger.error("记录log_client_sub_merchant_id失败",e);
+ }
+ clientMapper.update(update);
}
}
+ clientInfoCacheSupport.clearClientCache(clientId);
+ }
+ private void recordSubMerchantLog(JSONObject client,JSONObject subMerchantInfo,JSONObject manager){
+ JSONObject log = new JSONObject();
+ log.put("sub_merchant_id_after",subMerchantInfo.getString("sub_merchant_id"));
+ log.put("operator",manager.getString("display_name"));
+ log.put("create_time",new Date());
+ log.put("client_id",client.getIntValue("client_id"));
+ log.put("sub_merchant_id_before",client.getString("sub_merchant_id"));
+ logClientSubMerchantIdMapper.save(log);
}
@Override
@@ -3280,4 +3309,14 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
return sourceStr;
}
+
+ @Override
+ public List getClientSubMerchantIdLogs(String clientMoniker, JSONObject manager) {
+ JSONObject client = getClientInfoByMoniker(clientMoniker);
+ if (client == null) {
+ throw new InvalidShortIdException();
+ }
+ checkOrgPermission(manager, client);
+ return logClientSubMerchantIdMapper.listLogsByClientId(client.getInteger("client_id"));
+ }
}
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 4cc801418..8d84b469d 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
@@ -230,6 +230,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})
+ 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"));
@@ -523,4 +528,9 @@ public class PartnerManageController {
return clientManager.listMerchantIds(clientMoniker,manager);
}
+ @ManagerMapping(value = "/{clientMoniker}/get_sub_merchant_id_logs",method = RequestMethod.GET,role = {ManagerRole.OPERATOR})
+ public List getClientSubMerchantIdLogs(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
+ return clientManager.getClientSubMerchantIdLogs(clientMoniker,manager);
+ }
+
}
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..2f787efd4
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/AddRiskDetailLog.java
@@ -0,0 +1,69 @@
+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;
+
+ @JsonProperty("files")
+ private String files;
+
+ @JsonProperty("operation")
+ private String operation;
+
+ @JsonProperty("remark")
+ private String remark;
+
+ public JSONObject params() {
+ JSONObject params = new JSONObject();
+ 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;
+ }
+
+ public void setRecord_id(String record_id) {
+ this.record_id = record_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;
+ }
+
+ 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/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/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/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..e43902673
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/risk/bean/QueryRiskRecord.java
@@ -0,0 +1,91 @@
+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;
+ }
+
+ public int getClient_id() {
+ return client_id;
+ }
+
+ public void setClient_id(int client_id) {
+ this.client_id = client_id;
+ }
+}
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..a8a2109af
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/risk/core/RiskMerchantService.java
@@ -0,0 +1,37 @@
+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;
+
+import com.alibaba.fastjson.JSONObject;
+
+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);
+
+ void dealRiskRecordDirectly(JSONObject account,String record_id);
+
+ JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder);
+
+ JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord);
+
+ void addWhiteList(String client_moinker);
+
+ void disableWhiteList(String client_moinker);
+
+ 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
new file mode 100644
index 000000000..bceee32d1
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/risk/core/impl/RiskMerchantServiceImpl.java
@@ -0,0 +1,216 @@
+package au.com.royalpay.payment.manage.risk.core.impl;
+
+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;
+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 javax.annotation.Resource;
+
+@Service
+public class RiskMerchantServiceImpl implements RiskMerchantService {
+
+ @Resource
+ private RiskMerchantRecordMapper riskMerchantRecordMapper;
+ @Resource
+ private RiskMerchantDetailLogMapper riskMerchantDetailLogMapper;
+ @Resource
+ private RiskTransactionLogMapper riskTransactionLogMapper;
+ @Resource
+ private RiskWhiteListMapper riskWhiteListMapper;
+ @Resource
+ private ClientManager clientManager;
+
+ @Override
+ @Transactional
+ public void addDetailLog(AddRiskDetailLog addRiskDetailLog, JSONObject account) {
+ 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);
+ riskMerchantRecordMapper.update(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", "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("remark", "进行掉单处理");
+ detail.put("create_time", new Date());
+ riskMerchantDetailLogMapper.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", "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("remark", "不做处理");
+ detail.put("create_time", new Date());
+ riskMerchantDetailLogMapper.save(detail);
+ }
+
+ @Override
+ @Transactional
+ 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 (record.getIntValue("status") != 0) {
+ throw new BadRequestException("The Record Has Been Handled");
+ }
+ String remark = "";
+ if (dealRiskRecord.getLimitAmount() != null) {
+ clientManager.setMaxOrderAmount(record.getString("client_moniker"), 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);
+ 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("remark", StringUtils.isEmpty(remark) ? null : (remark = "处理结果:" + remark));
+ detail.put("create_time", new Date());
+ riskMerchantDetailLogMapper.save(detail);
+ record.put("status", 2);
+ riskMerchantRecordMapper.update(record);
+ }
+
+ @Override
+ @Transactional
+ 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("remark", "结停");
+ detail.put("create_time", new Date());
+ riskMerchantDetailLogMapper.save(detail);
+ JSONObject recordUpdate = new JSONObject();
+ recordUpdate.put("id",record_id);
+ recordUpdate.put("status", 1);
+ riskMerchantRecordMapper.update(recordUpdate);
+ }
+
+ @Override
+ public JSONObject getRiskOrders(QueryRiskOrder queryRiskOrder) {
+ return PageListUtils.buildPageListResult(
+ riskTransactionLogMapper.query(queryRiskOrder.toParams(), new PageBounds(queryRiskOrder.getPage(), queryRiskOrder.getLimit())));
+
+ }
+
+ @Override
+ public JSONObject getRiskRecords(QueryRiskRecord queryRiskRecord) {
+ return PageListUtils.buildPageListResult(
+ riskMerchantRecordMapper.query(queryRiskRecord.toParams(), new PageBounds(queryRiskRecord.getPage(), queryRiskRecord.getLimit())));
+ }
+
+ @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);
+ }
+
+ @Override
+ 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
new file mode 100644
index 000000000..7c8441fdc
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/risk/web/RiskController.java
@@ -0,0 +1,94 @@
+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;
+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 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 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);
+ }
+
+ @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}/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);
+ riskMerchantService.dealRiskRecord(manager,dealRiskRecord);
+ }
+
+ @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);
+ }
+
+ @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);
+ }
+
+ @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/java/au/com/royalpay/payment/manage/task/PostponeClientTask.java b/src/main/java/au/com/royalpay/payment/manage/task/PostponeClientTask.java
index 98d6fa4de..8648c3ce6 100644
--- a/src/main/java/au/com/royalpay/payment/manage/task/PostponeClientTask.java
+++ b/src/main/java/au/com/royalpay/payment/manage/task/PostponeClientTask.java
@@ -15,6 +15,7 @@ import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
@@ -29,7 +30,7 @@ import javax.annotation.Resource;
* Created by wangning on 2018/1/2.
*/
@Component
-//@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
+@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
public class PostponeClientTask {
Logger logger = LoggerFactory.getLogger(PostponeClientTask.class);
@@ -44,7 +45,7 @@ public class PostponeClientTask {
@Resource
private ManagerMapper managerMapper;
- // @Scheduled(cron = "0 30 8 * * ?")
+ @Scheduled(cron = "0 30 8 * * ?")
public void checkGreenChannel() {
Date now = new Date();
Date tomorrow = DateUtils.addDays(now, 1);
@@ -60,8 +61,9 @@ public class PostponeClientTask {
expiryClients.put(p.getInteger("client_id"), p);
});
expiryClients.values().forEach(p -> {
- List adminAccounts = clientAccountMapper.listAdminAccounts(p.getIntValue("client_id"));
- List clientRates = clientRateMapper.maxChannelExpiryTime(p.getIntValue("client_id"), null);
+ int client_id = p.getIntValue("client_id");
+ List adminAccounts = clientAccountMapper.listAdminAccounts(client_id);
+ List clientRates = clientRateMapper.maxChannelExpiryTime(client_id, null);
JSONObject wechatRate = clientRateMapper.latestChannelCleanDays("Wechat", p.getIntValue("client_id"));
int cleanDays = 1;
if (wechatRate.getInteger("clean_days") != null) {
@@ -71,16 +73,17 @@ public class PostponeClientTask {
}
int finalCleanDays = cleanDays;
clientRates.forEach(o -> {
- o.remove("client_rate_id");
- o.put("active_time", tomorrow);
- o.put("manager_id", 0);
- o.put("expiry_time", yearTomorrow);
- o.put("create_time", now);
- o.put("update_time", now);
- o.put("clean_days", finalCleanDays);
- o.put("manager_name", "System");
- o.put("remark", "费率到期系统自动延期1年");
- clientRateMapper.saveRate(o);
+ JSONObject record = clientRateMapper.latestExpiryConfig(client_id,o.getString("rate_name"));
+ record.remove("client_rate_id");
+ record.put("active_time", now);
+ record.put("manager_id", 0);
+ record.put("expiry_time", yearTomorrow);
+ record.put("create_time", now);
+ record.put("update_time", now);
+ record.put("clean_days", finalCleanDays);
+ record.put("manager_name", "System");
+ record.put("remark", "费率到期系统自动延期1年");
+ clientRateMapper.saveRate(record);
});
adminAccounts.forEach(o -> {
diff --git a/src/main/java/au/com/royalpay/payment/manage/task/SubMerchantIdTaskManager.java b/src/main/java/au/com/royalpay/payment/manage/task/SubMerchantIdTaskManager.java
new file mode 100644
index 000000000..ef2d50b53
--- /dev/null
+++ b/src/main/java/au/com/royalpay/payment/manage/task/SubMerchantIdTaskManager.java
@@ -0,0 +1,19 @@
+package au.com.royalpay.payment.manage.task;
+
+import au.com.royalpay.payment.manage.merchantid.core.MerchantIdManageService;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@ConditionalOnProperty(value = "app.run-tasks", havingValue = "true")
+public class SubMerchantIdTaskManager {
+ @Resource
+ private MerchantIdManageService merchantIdManageService;
+ @Scheduled(cron = "0 0 4 * * ?")
+ public void analysisDashboard(){
+ merchantIdManageService.generateClientsSunMerchantId();
+ }
+}
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 99601e10b..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
@@ -134,4 +134,18 @@
GROUP BY c.royalpayindustry order by partner_counts desc
+
+ 4 AND o.confirm_time 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/resources/au/com/royalpay/payment/manage/mappers/payment/CommonSubMerchantIdMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/CommonSubMerchantIdMapper.xml
new file mode 100644
index 000000000..5d053be8f
--- /dev/null
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/CommonSubMerchantIdMapper.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ select * from pmt_sub_merchant_id
+ where is_valid = #{is_valid}
+
+ and sub_merchant_id = #{sub_merchant_id}
+
+
+
\ No newline at end of file
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}
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 @@
+
+
+
+
+ select *
+ from risk_merchant_detail_log
+
+
+ and record_id = #{record_id}
+
+
+ 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/RiskMerchantRecordMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml
new file mode 100644
index 000000000..2d8749648
--- /dev/null
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskMerchantRecordMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ SELECT *
+ FROM risk_merchant_record
+
+
+ and id = #{record_id}
+
+
+ and status = #{status}
+
+
+ and client_moniker = #{client_moniker}
+
+
+ and create_time < #{c_end_time}
+
+
+ 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
new file mode 100644
index 000000000..b413d7bbd
--- /dev/null
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/risk/RiskTransactionLogMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ SELECT *
+ FROM risk_transaction_log
+
+
+ and record_id = #{record_id}
+
+
+ and client_id = #{client_id}
+
+
+ and create_time < #{c_end_time}
+
+
+ order by create_time desc
+
+
\ No newline at end of file
diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml
index 5aafa1264..fa3ff9ba8 100644
--- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml
@@ -289,4 +289,25 @@
inner join sys_client_config cc
WHERE c.is_valid = 1 and cc.clean_days = #{clean_days}
+
+
+ SELECT
+ COUNT(DISTINCT c.client_id) client_count,
+ c.sub_merchant_id,
+ c.merchant_id
+ FROM sys_clients c
+ WHERE (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1 AND c.sub_merchant_id IS NOT NULL
+ AND c.merchant_id IS NOT NULL
+ GROUP BY c.sub_merchant_id
+
+
+
+ SELECT
+ c.client_moniker,
+ c.sub_merchant_id,
+ c.merchant_id
+ FROM sys_clients c
+ WHERE (c.approve_result = 1 OR c.approve_result= 2) AND c.is_valid = 1 AND c.sub_merchant_id IS NOT NULL
+ AND c.merchant_id IS NOT NULL AND c.sub_merchant_id = #{sub_merchant_id}
+
\ No newline at end of file
diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml
index 74a00de0c..8407cb6c3 100644
--- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml
+++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml
@@ -139,4 +139,12 @@
order by cr.expiry_time desc
limit 1
+
+
+ SELECT * FROM
+ sys_client_rates
+ WHERE client_id = #{client_id} and rate_name =#{rate_name}
+ order by expiry_time desc
+ limit 1
+
\ No newline at end of file
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
diff --git a/src/main/ui/manage.html b/src/main/ui/manage.html
index d8751f45c..3ff5ae275 100644
--- a/src/main/ui/manage.html
+++ b/src/main/ui/manage.html
@@ -234,6 +234,7 @@ margin-bottom: 10%;"/>
商户管理|Partner Manage
+
@@ -393,6 +394,11 @@ margin-bottom: 10%;"/>
+
+
+ 商户号管理
+
+
组织管理|Organizations
diff --git a/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html b/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html
index 84efe7cf9..c4dabdde7 100644
--- a/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html
+++ b/src/main/ui/static/analysis/monitoring/templates/analysis_monitoring.html
@@ -19,6 +19,10 @@
欠款|Pre Refund
+
+ 风控记录|Risk Records
+
+
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/commons/services/orderService.js b/src/main/ui/static/commons/services/orderService.js
index b6fb25d7e..1c628772a 100644
--- a/src/main/ui/static/commons/services/orderService.js
+++ b/src/main/ui/static/commons/services/orderService.js
@@ -36,8 +36,13 @@ define(['../app'], function (app) {
}
}
}]);
- app.controller('orderDetailDialogCtrl', ['$scope', 'order', function ($scope, order) {
+ app.controller('orderDetailDialogCtrl', ['$scope', 'order','$http', function ($scope, order,$http) {
$scope.order = order.data;
+ $scope.getPayLocation=function (ip) {
+ $http.get('/dev/ip/'+ip).then(function (res) {
+ $scope.pay_location = res.data;
+ })
+ }
}]);
app.controller('orderDetailEditCtrl', ['$scope', '$http', 'commonDialog', 'order', function ($scope, $http, commonDialog,order) {
$scope.order = order.data;
diff --git a/src/main/ui/static/commons/templates/order_detail.html b/src/main/ui/static/commons/templates/order_detail.html
index ae0bd21de..f0e33415e 100644
--- a/src/main/ui/static/commons/templates/order_detail.html
+++ b/src/main/ui/static/commons/templates/order_detail.html
@@ -75,7 +75,9 @@
@@ -128,6 +130,12 @@
+
Create Time
diff --git a/src/main/ui/static/config/devtools/devtools.js b/src/main/ui/static/config/devtools/devtools.js
index d636bc2a7..c410bba37 100644
--- a/src/main/ui/static/config/devtools/devtools.js
+++ b/src/main/ui/static/config/devtools/devtools.js
@@ -51,7 +51,7 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
url: '/phone_top_up',
templateUrl: '/static/config/devtools/templates/phone_top_up.html',
controller: 'phonetopupCtrl'
- });
+ })
}]);
app.controller('devManualRefundCtrl', ['$scope', '$http', 'commonDialog', function ($scope, $http, commonDialog) {
$scope.sendRefund = function () {
@@ -302,5 +302,6 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
})
}
}]);
+
return app;
});
\ No newline at end of file
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;
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..87dbcbe51
--- /dev/null
+++ b/src/main/ui/static/payment/merchantid/merchant_id_manager.js
@@ -0,0 +1,115 @@
+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.isCollapsed = true;
+
+ $scope.loadClient = function () {
+ $scope.client_loading = true;
+ $http.get('/sys/merchant_id').then(function (resp) {
+ $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.disable_button = false;
+ });
+ };
+ $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.refresh = function () {
+ $scope.disable_button = true;
+ $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('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..e2460c5dc
--- /dev/null
+++ b/src/main/ui/static/payment/merchantid/templates/client_sub_merchant_id.html
@@ -0,0 +1,26 @@
+
+
+
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..0654d3fef
--- /dev/null
+++ b/src/main/ui/static/payment/merchantid/templates/merchant_id_manage.html
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上次刷新时间: {{refresh_time}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Merchant Id
+ Sub Merchant Id
+ Operator
+ Create Time
+ Operation
+
+
+
+
+
+
+ {{client.sub_merchant_id}}
+
+
+
+
+
+ Disable
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/ui/static/payment/merchantid/templates/new_common_sub_merchant_id.html b/src/main/ui/static/payment/merchantid/templates/new_common_sub_merchant_id.html
new file mode 100644
index 000000000..3e432fffe
--- /dev/null
+++ b/src/main/ui/static/payment/merchantid/templates/new_common_sub_merchant_id.html
@@ -0,0 +1,24 @@
+
+
diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js
index 549a40736..138388d1f 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) {
@@ -393,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();
@@ -423,18 +438,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);
})
}
};
@@ -444,14 +477,18 @@ 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");
}
}
}]);
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;
@@ -895,6 +932,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');
@@ -908,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({
@@ -927,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) {
@@ -954,18 +1006,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);
})
}
};
@@ -982,16 +1052,10 @@ 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'
- });
}
}
}]);
- app.controller('partnerPaymentInfoCtrl', ['$scope', '$http', '$state', 'commonDialog', function ($scope, $http, $state, commonDialog) {
+ app.controller('partnerPaymentInfoCtrl', ['$scope', '$http', '$state', 'commonDialog','$uibModal', function ($scope, $http, $state, commonDialog,$uibModal) {
$scope.loadPartnerPaymentInfo = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) {
$scope.paymentInfo = resp.data;
@@ -1010,6 +1074,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.reloadQRCode();
$scope.loadPartnerPaymentInfo();
+ $scope.showSubMerchantLogs = function () {
+ $uibModal.open({
+ templateUrl: '/static/payment/partner/templates/client_sub_merchant_id_log.html',
+ controller: 'clientSubMerchantIdLogCtrl',
+ size: 'lg',
+ resolve: {
+ logs: ['$http', function ($http) {
+ return $http.get('/sys/partners/'+$scope.partner.client_moniker+'/get_sub_merchant_id_logs');
+ }]
+ }
+ }).result.then(function () {
+ $scope.loadSubClients();
+ });
+ };
+
$scope.saveMaxOrderAmount = function (limit) {
if (limit != null && isNaN(limit)) {
commonDialog.alert({title: 'Error', content: 'Your input is not a number!', type: 'error'});
@@ -1123,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;
@@ -1308,6 +1405,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
};
}]);
+ app.controller('clientSubMerchantIdLogCtrl', ['$scope', '$http', 'logs', function ($scope, $http, logs) {
+ $scope.logs = logs.data;
+ }]);
app.controller('partnerSubCtrl', ['$scope', '$http', '$uibModal', function ($scope, $http, $uibModal) {
$scope.newSubClient = function () {
$uibModal.open({
@@ -1395,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) {
@@ -1723,6 +1827,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();
@@ -1751,18 +1873,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);
})
}
};
@@ -1771,12 +1911,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 9dbb2a3fd..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,3 +1,9 @@
+
-
+
@@ -210,6 +216,8 @@
a photo of shop is
required while an online store shall choose
companyWebsite
+
+ 只要有可能产生线下交易(商户静态码、POS),就必须上传照片,否则支付宝会禁止交易
Required
@@ -219,19 +227,32 @@
+
+
Alipay Information (Optional)
+
+
+
Contact Information
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 @@