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 + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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 @@ + + + + + \ 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} + + + + \ 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 + + \ 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 @@
    -

    +

    + {{order.customer_ip}}  查询地区 : {{pay_location}} +

    @@ -128,6 +130,12 @@

    +
    + +
    +

    +
    +
    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 @@ + +
    +
    +

    Merchant Id Manage

    + +
    + +
    +
    +
    + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    Merchant IdSub Merchant IdOperatorCreate TimeOperation
    + {{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 @@ +
    +

    New Common Sub Merchant ID

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    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 @@ +

    New Partner

    - +
    @@ -210,6 +216,8 @@ a photo of shop is required while an online store shall choose companyWebsite

    +

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

    Required @@ -219,19 +227,32 @@

    -
    -
    - +
    +
    1:  + +
    + + +
    +
    +
    2:  + +
    + +
    - - -
    +
    +
    +
    Alipay Information  (Optional)
    +
    +
    +
    + +
    + +

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

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

    eg:https://www.baidu.com

    +
    +
    +
    +
    +
    +
    Contact Information
    diff --git a/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html b/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html index 64d9f7be1..9976059e9 100644 --- a/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html +++ b/src/main/ui/static/payment/partner/templates/add_sub_partner_dialog.html @@ -1,3 +1,9 @@ + @@ -169,6 +175,8 @@

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

    +

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

    Required Field

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

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

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

    eg:https://www.baidu.com

    +
    +
    +
    +
    +
    +
    Contact Information
    diff --git a/src/main/ui/static/payment/partner/templates/client_partner_detail.html b/src/main/ui/static/payment/partner/templates/client_partner_detail.html index c2105a1f0..cd34f8e31 100644 --- a/src/main/ui/static/payment/partner/templates/client_partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/client_partner_detail.html @@ -115,7 +115,7 @@
    + href="https://{{partner.company_website}}" >
    diff --git a/src/main/ui/static/payment/partner/templates/client_sub_merchant_id_log.html b/src/main/ui/static/payment/partner/templates/client_sub_merchant_id_log.html new file mode 100644 index 000000000..287bb7742 --- /dev/null +++ b/src/main/ui/static/payment/partner/templates/client_sub_merchant_id_log.html @@ -0,0 +1,41 @@ +
    +

    Sub Merchant Id Logs

    + +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    Sub Merchant Id BeforeSub Merchant Id AfterOperatorCreate Time
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 855d0ed8b..7b9717ead 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -28,6 +28,10 @@ width: 95%; float: left; } + .img-size{ + height: 100px; + margin-left: 20px; + }

    @@ -304,7 +308,7 @@
    - +
    @@ -336,11 +340,18 @@
    - -
    -
    +
    1:  + +
    + +
    2:  +
    + +
    @@ -350,7 +361,7 @@
    + href="{{partner.company_website}}">
    @@ -441,6 +452,42 @@
    + +
    +
    Alipay Information  (Optional)
    +
    +
    +
    + +
    +

    +
    +
    +
    + +
    +

    +
    +
    +
    + +
    +

    +
    +
    +
    + +
    +

    +
    +
    +
    +
    +
    Partner Contact Information
    @@ -650,8 +697,10 @@
    -

    +

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

    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index 84f292df1..ace8a6272 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -1,3 +1,9 @@ +

    - +
    @@ -160,6 +166,8 @@

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

    +

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

    Required Field

    @@ -169,16 +177,28 @@
    -
    -
    +
    +
    1:  +
    + + +
    +
    +
    2:  +
    - - + +
    +
    +
    Alipay Information   (Optional)
    +
    +
    +
    + +
    + +

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

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

    eg:https://www.baidu.com

    +
    +
    +
    +
    +
    +
    Contact Information
    @@ -294,6 +353,7 @@
    +
    Address Information
    diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 8f9872ac4..7e792cbc9 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -12,6 +12,16 @@   Merchant ID:{{paymentInfo.merchant_id | choose_merchant_id}} +    + + + + history + + +

    +
    + +
    + +
    +
    diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index eeb71a0a7..087583ce7 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -212,13 +212,13 @@ Input Amount - + ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) - + ( {{analysis.pre_cny_display_amount | currency:'pre authorization '}} )
    @@ -277,7 +277,7 @@ - + Currency Input Amount Total Amount - Clearing Amount Surcharge Rate Surcharge Amount Tax Amount @@ -202,7 +201,6 @@ - @@ -225,7 +223,7 @@ Transaction Time Currency Total Amount - Clearing Amount + Settle Amount Remark @@ -235,7 +233,7 @@ - + diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html index 6ef1fde69..dfc9bcbb4 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html @@ -232,13 +232,13 @@ Input Amount - + ( {{analysis.pre_display_amount | currency:'pre authorization '}} ) - + ( {{analysis.pre_cny_display_amount | currency:'pre authorization '}} )
    diff --git a/src/main/ui/static/phpdemo.zip b/src/main/ui/static/phpdemo.zip index bac6014f9..779335b19 100644 Binary files a/src/main/ui/static/phpdemo.zip and b/src/main/ui/static/phpdemo.zip differ diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js new file mode 100644 index 000000000..6dd4e4e2a --- /dev/null +++ b/src/main/ui/static/risk/risk.js @@ -0,0 +1,243 @@ +define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootSwitch', 'ngFileUpload'], function (angular) { + 'use strict'; + + var riskType = [ + {code: '1', label: 'test1'}, + {code: '2', label: 'test2'}, + ]; + + var app = angular.module('RiskManagement', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ngFileUpload']); + app.config(['$stateProvider', function ($stateProvider) { + $stateProvider.state('analysis_monitoring.risk_manager', { + url: '/risk/manage', + templateUrl: '/static/risk/templates/risk.html', + controller: 'RiskManageCtrl', + }).state('analysis_monitoring.risk_orders', { + url: '/risk/{record_id}/orders', + templateUrl: '/static/risk/templates/risk_orders.html', + controller: 'RiskOrderCtrl', + resolve:{ + record:['$http','$stateParams', function ($http,$stateParams) { + return $http.get('/sys/risk/records/'+$stateParams.record_id).then(function (res) { + return res.data; + }); + }] + } + }).state('analysis_monitoring.risk_history', { + url: '/risk/{record_id}/history', + templateUrl: '/static/risk/templates/risk_history.html', + controller: 'RecordHistoryCtrl', + resolve:{ + record:['$http','$stateParams', function ($http,$stateParams) { + return $http.get('/sys/risk/records/'+$stateParams.record_id).then(function (res) { + return res.data; + }); + }] + } + }).state('analysis_monitoring.risk_detail', { + url: '/risk/{record_id}/detail', + templateUrl: '/static/risk/templates/risk_detail.html', + controller: 'RecordDetailCtrl', + resolve:{ + record:['$http','$stateParams', function ($http,$stateParams) { + return $http.get('/sys/risk/records/'+$stateParams.record_id).then(function (res) { + return res.data; + }); + }] + } + }); + }]); + app.controller('RiskManageCtrl', ['$scope', '$http', function ($scope, $http){ + $scope.params = {}; + $scope.pagination = {}; + $scope.loadRecords = function (page) { + var params = angular.copy($scope.params); + params.page = page || $scope.pagination.page || 1; + $http.get('/sys/risk/records', {params: params}).then(function (resp) { + $scope.records = resp.data.data; + $scope.pagination = resp.data.pagination; + }); + }; + $scope.loadRecords(1); + }]); + + app.controller('RiskOrderCtrl', ['$scope', '$http', 'record', function ($scope, $http,record) { + $scope.params = {record_id: record.id}; + $scope.historyParams = {client_id:record.client_id}; + $scope.pagination = {}; + $scope.historyPagination = {}; + $scope.record = record; + $scope.loadOrders = function (page) { + var params = angular.copy($scope.params); + params.page = page || $scope.pagination.page || 1; + $http.get('/sys/risk/orders',{params: params}).then(function (resp) { + $scope.referenceOrders = resp.data.data; + $scope.pagination = resp.data.pagination; + $scope.historyParams.c_end_time = $scope.orders.pop().create_time; + $scope.loadHistoryOrders(1); + }); + }; + $scope.loadOrders(1); + + $scope.loadHistoryOrders = function (page) { + var historyParams = angular.copy($scope.historyParams); + historyParams.page = page || $scope.historyPagination.page || 1; + $http.get('/sys/risk/orders',{params: historyParams}).then(function (resp) { + $scope.historyOrders = resp.data.data; + $scope.historyPagination = resp.data.pagination; + }); + }; + }]); + + app.controller('RecordHistoryCtrl', ['$scope', '$http','$uibModal', 'commonDialog','record', function ($scope, $http,$uibModal,commonDialog,record) { + $scope.record = record; + $scope.pagination = {}; + $scope.params = {client_id:record.client_id,c_end_time:record.create_time}; + $scope.listHistory = function (page) { + var params = angular.copy($scope.params); + params.page = page || $scope.pagination.page || 1; + $http.get('/sys/risk/records',{params:params}).then(function (res) { + $scope.histories = res.data.data; + $scope.pagination = res.data.pagination; + }) + }; + $scope.listHistory(1); + $scope.edit = function () { + $uibModal.open({ + templateUrl: '/static/risk/templates/risk_edit.html', + controller: 'RiskRecordHandleCtrl', + resolve:{record_id:function () { + return record.id; + }} + }).result.then(function () { + commonDialog.alert({ + title: 'Success', + type: 'success' + }); + }) + }; + + + $scope.noop = function () { + commonDialog.confirm({ + title: 'Confirm', + content: '确定放弃这次预警' + }).then(function () { + $http.put('/sys/risk/records/'+ record.id+'/noop', $scope.params).then(function () { + }).then(function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'Error' + }); + }) + }) + } + }]); + + app.controller('RecordDetailCtrl', ['$scope', '$http','$uibModal', 'commonDialog','record', function ($scope, $http,$uibModal,commonDialog,record) { + $scope.record = record; + $scope.pagination = {}; + $scope.params = {record_id:record.id}; + $scope.listDetail = function (page) { + var params = angular.copy($scope.params); + params.page = page || $scope.pagination.page || 1; + $http.get('/sys/risk/details',{params:params}).then(function (res) { + $scope.details = res.data.data; + $scope.pagination = res.data.pagination; + }) + }; + $scope.listDetail(1); + $scope.addRemark = function () { + $uibModal.open({ + templateUrl: '/static/risk/templates/risk_remark.html', + controller: 'RiskDetailRemarkCtrl', + resolve:{record_id:function () { + return record.id; + }} + }).result.then(function () { + $scope.listDetail(1); + commonDialog.alert({ + title: 'Success', + type: 'success' + }); + }) + } + + $scope.dealDirectly = function () { + commonDialog.confirm({ + title: 'Confirm', + content: '确定关结这次预警?' + }).then(function () { + $http.put('/sys/risk/records/'+ record.id+'/directly').then(function () { + commonDialog.alert({ + title: 'Success', + type: 'Success' + }); + $scope.listDetail(1); + $scope.record.status=1; + }).then(function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'Error' + }); + }) + }) + } + }]); + + app.controller('RiskDetailRemarkCtrl', ['$scope', '$http','record_id','commonDialog', function ($scope, $http,record_id,commonDialog) { + $scope.addRemarkParams = {record_id:record_id}; + $scope.addRemark = function () { + var params = angular.copy($scope.addRemarkParams); + $http.post('/sys/risk/details/remark',params).then(function (res) { + $scope.$close(); + }).then(function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'Error' + }); + }) + } + }]); + + app.controller('RiskRecordHandleCtrl', ['$scope', '$http','record_id','commonDialog', function ($scope, $http,record_id,commonDialog) { + $scope.params= {}; + $scope.handle = function () { + $http.put('/sys/risk/records/'+ record_id+'/deal', $scope.params).then(function () { + $scope.$close(); + }).then(function (resp) { + commonDialog.alert({ + title: 'Error', + content: resp.data.message, + type: 'Error' + }); + }) + } + + }]); + app.filter('risk_type', function () { + return function (riskStr) { + angular.forEach(riskType,function (type) { + riskStr = riskStr.replace(type.code,type.label); + }) + return riskStr; + }; + }); + app.filter('status_type', function () { + return function (riskStr) { + var statusResult = ''; + switch (riskStr){ + case('0'): statusResult = '待处理';break; + case('1'): statusResult = '已处理';break; + case('2'): statusResult = '处理中';break; + default: statusResult = ''; + } + return statusResult; + }; + }); + + return app; +}); \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk.html b/src/main/ui/static/risk/templates/risk.html new file mode 100644 index 000000000..ff55c8552 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk.html @@ -0,0 +1,58 @@ +
    +
    +

    Risk Manager

    + +
    +
    +
    +
    Records
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Client MonikerCreate TimeWaring TimeStatusRisk TypesRisk CountsOperation
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_time}}{{record.status|status_type}}{{record.risk_types|risk_type}}{{record.risk_counts}} + + + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_detail.html b/src/main/ui/static/risk/templates/risk_detail.html new file mode 100644 index 000000000..e17f614dc --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_detail.html @@ -0,0 +1,63 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Handling Details
    +
    + + +
    +
    + + + + + + + + + + + + + + + +
    Handle TimeOperatorDetail
    {{record.create_time}}{{record.auditor}}{{record.remark}}
    + +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_edit.html b/src/main/ui/static/risk/templates/risk_edit.html new file mode 100644 index 000000000..a1fa06c5d --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_edit.html @@ -0,0 +1,32 @@ +
    +

    Add Remark

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/main/ui/static/risk/templates/risk_history.html b/src/main/ui/static/risk/templates/risk_history.html new file mode 100644 index 000000000..baa2e7916 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_history.html @@ -0,0 +1,69 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Client MonikerCreate TimeWaring TimeRisk TypesStatusRisk Counts
    {{record.client_moniker}}{{record.create_time}}{{record.expiry_time}}{{record.status}}{{record.risk_types|risk_type}}{{record.risk_counts}}
    + +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_orders.html b/src/main/ui/static/risk/templates/risk_orders.html new file mode 100644 index 000000000..53fa12822 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_orders.html @@ -0,0 +1,105 @@ +
    +
    +

    Risk Manager

    + +
    +
    + +
    +
    Reference Orders
    +
    + + + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelCreate TimeRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.create_time}}{{order.risk_types|risk_type}}
    +
    + +
    + +
    +
    Waring Orders History
    +
    + + + + + + + + + + + + + + + + + + + +
    Order IdAmountChannelCreate TimeRisk Types
    {{order.order_id}}{{order.amount}}{{order.channel}}{{order.create_time}}{{order.risk_types|risk_type}}
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/src/main/ui/static/risk/templates/risk_remark.html b/src/main/ui/static/risk/templates/risk_remark.html new file mode 100644 index 000000000..e7de83584 --- /dev/null +++ b/src/main/ui/static/risk/templates/risk_remark.html @@ -0,0 +1,25 @@ +
    +

    Handle Detail

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/test/java/au/com/royalpay/payment/manage/task/FillExcelTask.java b/src/test/java/au/com/royalpay/payment/manage/task/FillExcelTask.java new file mode 100644 index 000000000..600c8b225 --- /dev/null +++ b/src/test/java/au/com/royalpay/payment/manage/task/FillExcelTask.java @@ -0,0 +1,83 @@ +package au.com.royalpay.payment.manage.task; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.io.FileUtils; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.ss.usermodel.*; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Create by yixian at 2018-05-01 17:15 + */ +public class FillExcelTask { + + private File rpayCat = new File("C:\\Users\\yixian\\develop\\royalpayv2\\manage\\src\\main\\ui\\static\\data\\royalpayindustry.json"); + private File wxCat = new File("C:\\Users\\yixian\\develop\\royalpayv2\\manage\\src\\main\\resources\\wx_industry.json"); + + private Map royalCatMap; + private Map wxCatMap; + private File excel = new File("C:\\Users\\yixian\\Documents\\bd_merchants.xlsx"); + + @Before + public void initCategory() throws IOException { + String rpayCatStr = FileUtils.readFileToString(rpayCat, "utf-8"); + JSONArray rpayCatJson = JSON.parseArray(rpayCatStr); + List flatCollect = rpayCatJson.stream().map(item -> (JSONObject) item) + .flatMap(item -> loadChildren(item).stream()).collect(Collectors.toList()); + royalCatMap = rpayCatJson.stream().map(item -> (JSONObject) item) + .flatMap(item -> loadChildren(item).stream()) + .collect(Collectors.toMap(item -> item.getString("mccCode"), item -> item.getString("label"), (a, b) -> a)); + + String wxCatStr = FileUtils.readFileToString(wxCat, "utf-8"); + JSONObject wxCatJson = JSON.parseObject(wxCatStr); + wxCatMap = wxCatJson.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> (String) entry.getValue())); + + } + + private List loadChildren(JSONObject entity) { + if (entity.containsKey("children") && !entity.getJSONArray("children").isEmpty()) { + List arr = new ArrayList<>(Arrays.asList(entity)); + arr.addAll(entity.getJSONArray("children").stream().map(item -> (JSONObject) item).flatMap(item -> loadChildren(item).stream()).collect(Collectors.toList())); + return arr; + } + return Collections.singletonList(entity); + } + + @Test + public void replaceCat() throws IOException, InvalidFormatException { + Workbook wb = WorkbookFactory.create(excel); + Sheet sheet = wb.getSheetAt(0); + for (int rn = 1; rn <= sheet.getLastRowNum(); rn++) { + Row row = sheet.getRow(rn); + Cell wxCatCell = row.getCell(2); + Cell rpCatCell = row.getCell(3); + fillCateLabel(wxCatCell, wxCatMap); + fillCateLabel(rpCatCell, royalCatMap); + } + wb.write(new FileOutputStream("C:\\Users\\yixian\\Documents\\bd_merchants_final.xlsx")); + } + + private void fillCateLabel(Cell rpCatCell, Map royalCatMap) { + if (rpCatCell == null) { + return; + } + if (rpCatCell.getCellType() == Cell.CELL_TYPE_NUMERIC) { + String typeNum = (int) rpCatCell.getNumericCellValue() + ""; + if (royalCatMap.get(typeNum) != null) { + rpCatCell.setCellType(Cell.CELL_TYPE_STRING); + rpCatCell.setCellValue(royalCatMap.get(typeNum)); + } + } + } +}