From 29ad00a7d33b070f0e8cb452aa38b78e30879af1 Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 20 Sep 2019 14:59:34 +0800 Subject: [PATCH 1/9] fix pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 89d3aee53..a226d84eb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.2.15 + 1.2.16 UTF-8 From 3a604879b7ececb42ca150dfcd7532ffd474afad Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 20 Sep 2019 15:25:49 +0800 Subject: [PATCH 2/9] fix logback name --- src/main/resources/logback_cfg.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/logback_cfg.xml b/src/main/resources/logback_cfg.xml index c43a8671c..14435fc61 100644 --- a/src/main/resources/logback_cfg.xml +++ b/src/main/resources/logback_cfg.xml @@ -20,7 +20,7 @@ - + From 340c2ae677a7b7097db5310e7a5380ce719fc742 Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 20 Sep 2019 15:26:06 +0800 Subject: [PATCH 3/9] fix logback name --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a226d84eb..e5f91585b 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.2.16 + 1.2.17 UTF-8 From e680eb1144b994a9eaa4206515d1e7f52b5103c7 Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 20 Sep 2019 15:36:16 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix=20=E9=A3=8E=E6=8E=A7=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../manage/riskbusiness/enums/RiskResultTypeEnum.java | 2 +- src/main/ui/static/analysis/risk_business.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index e5f91585b..f750c4a84 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.2.17 + 1.2.18 UTF-8 diff --git a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/enums/RiskResultTypeEnum.java b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/enums/RiskResultTypeEnum.java index b0fb36f62..0b2630a8c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/riskbusiness/enums/RiskResultTypeEnum.java +++ b/src/main/java/au/com/royalpay/payment/manage/riskbusiness/enums/RiskResultTypeEnum.java @@ -19,7 +19,7 @@ public enum RiskResultTypeEnum { "风控事件已创建", "已发送邮件,资料完善中", "资料已提交,等待审核", - "风控初审完成,已提交渠道方审核", + "风控初审完成,渠道方审核中", "材料打回", "渠道方处理结果" }; diff --git a/src/main/ui/static/analysis/risk_business.js b/src/main/ui/static/analysis/risk_business.js index 6b8fdaa79..c09ed9973 100644 --- a/src/main/ui/static/analysis/risk_business.js +++ b/src/main/ui/static/analysis/risk_business.js @@ -40,7 +40,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], "0": "未处理", "1": "已发送邮件", "2": "已提交材料,等待审核", - "3": "风控初审完成,已提交渠道方审核", + "3": "风控初审完成,渠道方审核中", "4": "材料审核不通过,已打回", "5": "已处理" }; @@ -49,7 +49,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], "0": "未处理", "1": "资料完善中", "2": "等待风控", - "3": "风控初审完成,已提交渠道方审核", + "3": "风控初审完成,渠道方审核中", "4": "材料打回", "5": "已处理" }; @@ -57,7 +57,7 @@ define(['angular', 'jquery', 'uiRouter', './monitoring/analysis-monitoring'], var resultTypeSearchMapForBD = { "1": "材料待上传", "2": "材料已提交", - "3": "风控初审完成,已提交渠道方审核", + "3": "风控初审完成,渠道方审核中", "4": "材料打回", "5": "已处理" }; From 2e7b07df719ec5868a08e7c873f0280aa7a025ac Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 25 Sep 2019 11:20:48 +0800 Subject: [PATCH 5/9] =?UTF-8?q?fix=20ip=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../com/royalpay/payment/manage/dev/web/IPController.java | 7 ++++--- src/main/ui/static/commons/services/orderService.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f750c4a84..6d0203c89 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.2.18 + 1.2.19 UTF-8 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 index ecce9b59d..7310f1fae 100644 --- 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 @@ -14,8 +14,9 @@ public class IPController { private LookupService lookupService; @GetMapping("/{ipAddr}") - public String getIpInfo(@PathVariable String ipAddr) { - String city = lookupService.getLocation(ipAddr).city; - return city; + public JSONObject getIpInfo(@PathVariable String ipAddr) { + JSONObject result = new JSONObject(); + result.put("city", lookupService.getLocation(ipAddr).city); + return result; } } diff --git a/src/main/ui/static/commons/services/orderService.js b/src/main/ui/static/commons/services/orderService.js index c500dfaf1..4fb9f3b3c 100644 --- a/src/main/ui/static/commons/services/orderService.js +++ b/src/main/ui/static/commons/services/orderService.js @@ -41,7 +41,7 @@ define(['../app'], function (app) { $scope.order = order.data; $scope.getPayLocation=function (ip) { $http.get('/dev/ip/'+ip).then(function (res) { - $scope.pay_location = res.data; + $scope.pay_location = res.data.city; }) } }]); From 996a6a3d4249b7f5652bb24e0faa70fc466eda94 Mon Sep 17 00:00:00 2001 From: yixian Date: Wed, 25 Sep 2019 17:05:05 +0800 Subject: [PATCH 6/9] hide bank details according to device --- pom.xml | 2 +- .../core/impls/RetailAppServiceImp.java | 35 ++++++------------- .../extend/GatewayOAuthRegister.java | 5 +++ .../appclient/web/RetailAppController.java | 6 ++-- 4 files changed, 20 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index e4a09fb22..5dbad6883 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ au.com.royalpay.payment payment-parent - 1.1.1 + 1.1.3 4.0.0 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 e59b57858..d8fa1e92e 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 @@ -61,16 +61,12 @@ import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import au.com.royalpay.payment.tools.permission.enums.PartnerRole; import au.com.royalpay.payment.tools.threadpool.RoyalThreadPoolExecutor; import au.com.royalpay.payment.tools.utils.*; - import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageList; - -import com.github.qcloudsms.httpclient.HTTPException; -import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; @@ -81,7 +77,6 @@ import org.joda.time.DateTime; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -91,30 +86,20 @@ import org.springframework.web.multipart.MultipartFile; import org.thymeleaf.context.Context; import org.thymeleaf.spring5.SpringTemplateEngine; -import java.awt.image.BufferedImage; +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; +import java.util.*; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import javax.annotation.Resource; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletResponse; - /** * Created by yishuqian on 28/03/2017. */ @@ -291,7 +276,7 @@ public class RetailAppServiceImp implements RetailAppService { params.put("client_id", client_id); List res = transactionAnalysisMapper.getWeekClientTransaction(params); res.forEach(r -> { - r.put("date",r.getDate("date").toString()); + r.put("date", r.getDate("date").toString()); }); res.remove(res.size() - 1); return res; @@ -1454,9 +1439,11 @@ public class RetailAppServiceImp implements RetailAppService { @Override public JSONObject bankAccountInfo(JSONObject device) { String clientType = device.getString("client_type"); - deviceSupport.findRegister(clientType); + DeviceRegister register = deviceSupport.findRegister(clientType); JSONObject bankInfo = clientManager.getBankAccountByClientId(device.getIntValue("client_id")); - bankInfo.put("account_no", "***" + StringUtils.substring(bankInfo.getString("account_no"), -4)); + if (register.hideBankDetails()) { + bankInfo.put("account_no", "***" + StringUtils.substring(bankInfo.getString("account_no"), -4)); + } return bankInfo; } @@ -2345,7 +2332,7 @@ public class RetailAppServiceImp implements RetailAppService { } @Override - public JSONObject getClientAggregateFile(JSONObject device,MultipartFile file, String userAgent) throws IOException{ + public JSONObject getClientAggregateFile(JSONObject device, MultipartFile file, String userAgent) throws IOException { String clientType = device.getString("client_type"); deviceSupport.findRegister(clientType); @@ -2384,7 +2371,7 @@ public class RetailAppServiceImp implements RetailAppService { JSONObject client = clientManager.getClientInfo(device.getIntValue("client_id")); JSONObject account = clientAccountMapper.findById(device.getString("account_id")); account.put("photo_info", photoInfo); - clientManager.commitAuthFilesToCompliance(client.getString("client_moniker"), account,"App"); + clientManager.commitAuthFilesToCompliance(client.getString("client_moniker"), account, "App"); } diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/extend/GatewayOAuthRegister.java b/src/main/java/au/com/royalpay/payment/manage/appclient/extend/GatewayOAuthRegister.java index 11002c74b..dfe200f7a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/extend/GatewayOAuthRegister.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/extend/GatewayOAuthRegister.java @@ -37,6 +37,11 @@ public class GatewayOAuthRegister implements DeviceRegister { return CLIENT_TYPE; } + @Override + public boolean hideBankDetails() { + return false; + } + @Override public JSONObject register(String encrypted, int type) { return null; 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 cf73fcc21..d06e98fbd 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 @@ -209,17 +209,17 @@ public class RetailAppController { } @GetMapping("/bank_account") - public JSONObject getBankAccountInfo(@ModelAttribute("RETAIL_DEVICE") JSONObject device) { + public JSONObject getBankAccountInfo(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device) { return retailAppService.bankAccountInfo(device); } @GetMapping("/current_rate") - public JSONObject getClientRate(@ModelAttribute("RETAIL_DEVICE") JSONObject device) { + public JSONObject getClientRate(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device) { return retailAppService.getClientCurrentRate(device); } @GetMapping("/current_rate_new") - public JSONObject getClientCurrentRateNew(@ModelAttribute("RETAIL_DEVICE") JSONObject device) { + public JSONObject getClientCurrentRateNew(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device) { return retailAppService.getClientCurrentRateNew(device); } From 876dc853842215e3929178229864884a388690c6 Mon Sep 17 00:00:00 2001 From: yixian Date: Wed, 25 Sep 2019 17:11:12 +0800 Subject: [PATCH 7/9] hide bank details according to device --- .../payment/manage/appclient/core/RetailAppService.java | 5 +---- .../manage/appclient/core/impls/RetailAppServiceImp.java | 3 --- 2 files changed, 1 insertion(+), 7 deletions(-) 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 efab02aaa..206378602 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 @@ -8,18 +8,15 @@ import au.com.royalpay.payment.manage.merchants.beans.ClientUpdateInfo; import au.com.royalpay.payment.manage.notice.beans.NoticeInfo; import au.com.royalpay.payment.manage.signin.beans.ChangePwdBean; import au.com.royalpay.payment.tools.merchants.beans.QRCodeConfig; -import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO; - import com.alibaba.fastjson.JSONObject; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletResponse; - /** * Created by yishuqian on 28/03/2017. 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 04b96cde2..c0db20b89 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 @@ -57,7 +57,6 @@ import au.com.royalpay.payment.tools.exceptions.NotFoundException; import au.com.royalpay.payment.tools.exceptions.ServerErrorException; import au.com.royalpay.payment.tools.locale.LocaleSupport; import au.com.royalpay.payment.tools.merchants.beans.QRCodeConfig; -import au.com.royalpay.payment.tools.merchants.beans.UpdateSurchargeDTO; import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import au.com.royalpay.payment.tools.permission.enums.PartnerRole; import au.com.royalpay.payment.tools.threadpool.RoyalThreadPoolExecutor; @@ -91,7 +90,6 @@ import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.lang.reflect.Array; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DateFormat; @@ -101,7 +99,6 @@ import java.util.*; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; /** * Created by yishuqian on 28/03/2017. From b7c3033f1ffb8f0e19829fe80a73557d1d9f0bf2 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 26 Sep 2019 10:41:18 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix=20cache=20=E5=AD=98=E5=85=A5null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../payment/manage/merchants/core/impls/ClientManagerImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6cd3fafbc..c3df4ad1d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.2.19 + 1.2.20 UTF-8 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 381a651b3..be3881b62 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 @@ -330,7 +330,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - @Cacheable(value = ":app_client_info:", key = "''+#clientId") + @Cacheable(value = ":app_client_info:", key = "''+#clientId", unless="#result == null") public JSONObject getClientInfo(int clientId) { return clientMapper.findClient(clientId); } From 5b40aebdc7ee3ea019513a30aa9c0e0c4c35584d Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 26 Sep 2019 18:14:51 +0800 Subject: [PATCH 9/9] =?UTF-8?q?add=20=E7=94=A8=E6=88=B7=E7=94=BB=E5=83=8F?= =?UTF-8?q?=20=E5=85=B3=E7=B3=BB=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../core/CustomersAnalysisService.java | 3 + .../impls/CustomersAnalysisServiceImp.java | 162 +++++- .../analysis/mappers/OrderAnalysisMapper.java | 15 +- .../web/CustomersAnalysisController.java | 12 + .../analysis/mappers/OrderAnalysisMapper.xml | 472 ++++++++++++------ .../manage/mappers/payment/OrderMapper.xml | 2 +- .../ui/static/analysis/customer_analysis.js | 75 ++- .../analysis/templates/customer_analysis.html | 81 ++- src/main/ui/static/commons/angular-echarts.js | 16 +- src/main/ui/static/lib/echarts/echarts.js | 2 +- 11 files changed, 664 insertions(+), 178 deletions(-) diff --git a/pom.xml b/pom.xml index c3df4ad1d..1d5743cdb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 manage - 1.2.20 + 1.2.21 UTF-8 diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/CustomersAnalysisService.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/CustomersAnalysisService.java index 38ab29857..0ecbd17c8 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/CustomersAnalysisService.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/CustomersAnalysisService.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage.analysis.core; +import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery; import com.alibaba.fastjson.JSONObject; import java.util.Date; @@ -24,5 +25,7 @@ public interface CustomersAnalysisService { void sendPartnerTransactionDaily(Date date); List getCustomersAnalysisMonthly(JSONObject params); + + JSONObject getUserEcharts(JSONObject params, JSONObject manager); } diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java index 805e0fa52..28c16d48f 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/CustomersAnalysisServiceImp.java @@ -8,29 +8,38 @@ import au.com.royalpay.payment.manage.mappers.log.WechatTemplateMsgSendLogMapper import au.com.royalpay.payment.manage.mappers.payment.OrderMapper; import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper; import au.com.royalpay.payment.manage.mappers.system.ClientMapper; +import au.com.royalpay.payment.manage.mappers.system.CustomerMapper; +import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper; import au.com.royalpay.payment.manage.merchants.core.ClientManager; +import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi; import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider; import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage; +import au.com.royalpay.payment.tools.env.PlatformEnvironment; import au.com.royalpay.payment.tools.utils.PageListUtils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.github.miemiedev.mybatis.paginator.domain.PageList; +import com.maxmind.geoip.LookupService; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * Created by yishuqian on 10/11/2016. @@ -51,6 +60,10 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { private ClientMapper clientMapper; @Resource private ClientAccountMapper clientAccountMapper; + @Resource + private CustomerMapper customerMapper; + @Resource + private ManagerCustomerRelationAlipayMapper managerCustomerRelationAlipayMapper; @Resource private WechatTemplateMsgSendLogMapper wechatTemplateMsgSendLogMapper; @@ -60,6 +73,8 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { @Resource private RetailAppService retailAppService; + @Resource + private LookupService lookupService; @Override public List getCustomersAnalysis(JSONObject params) { @@ -95,6 +110,11 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { @Override public JSONObject getCustomersRanking(JSONObject params, int page, int limit) { PageList logs = orderAnalysisMapper.listCustomersData(params, new PageBounds(page, limit, Order.formString("amount.desc"))); + if (logs.size() > 0) { + for (JSONObject log : logs) { + generatorUserProfile(log, params); + } + } JSONObject result = PageListUtils.buildPageListResult(logs); result.put("analysis", orderAnalysisMapper.listCustomersDataAnalysis(params)); result.put("openid_type", params.getIntValue("openid_type")); @@ -180,7 +200,7 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { } } try { - retailAppService.sendTransactionDailyMessage(tradeInfo,client.getIntValue("client_id")); + retailAppService.sendTransactionDailyMessage(tradeInfo, client.getIntValue("client_id")); } catch (Exception e) { logger.error(e.getMessage(), e); } @@ -224,6 +244,63 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { // // } + @Override + public JSONObject getUserEcharts(JSONObject params, JSONObject manager) { + JSONObject graph = new JSONObject(); + List nodes = new ArrayList<>(); + List links = new ArrayList<>(); + initUserInfo(nodes, params); + List clients = orderAnalysisMapper.listClientsByCustomerId(params); + JSONObject total = orderAnalysisMapper.listClientsTotalByCustomerId(params); + int id = 1; + for (JSONObject client : clients) { + BigDecimal clientInTotal = client.getBigDecimal("orders").divide(total.getBigDecimal("orders"), 5, RoundingMode.HALF_UP).multiply(new BigDecimal(300)); + BigDecimal orderInTotal = client.getBigDecimal("orders").divide(total.getBigDecimal("orders"), 5, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); + BigDecimal amountInTotal = client.getBigDecimal("total_amount").divide(total.getBigDecimal("total_amount"), 5, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); + JSONObject node = new JSONObject(); + node.put("id", id); + node.put("category", id); + node.put("name", client.getString("client_moniker")); + node.put("label", client.getString("short_name")); + node.put("value", client.getString("short_name")); + node.put("symbolSize", clientInTotal.compareTo(new BigDecimal(10))<0?10:clientInTotal.toPlainString()); + if (clientInTotal.compareTo(new BigDecimal(300)) == 0) { + node.put("symbolSize", 100); + } + node.put("ignore", true); + node.put("flag", true); + node.put("draggable", true); + nodes.add(node); + JSONObject totalAmountInfo = getClientAmountInfo(id,"x0", "交易金额", client); + totalAmountInfo.put("label", client.getString("total_amount")); + totalAmountInfo.put("value", client.getBigDecimal("total_amount").setScale(2,RoundingMode.HALF_UP)); + totalAmountInfo.put("symbolSize",amountInTotal.compareTo(new BigDecimal(10))<0?10:amountInTotal.toPlainString()); + nodes.add(totalAmountInfo); + JSONObject OrdersInfo = getClientAmountInfo(id,"x1", "订单数", client); + OrdersInfo.put("label", client.getString("orders")); + OrdersInfo.put("value", client.getString("orders")); + OrdersInfo.put("symbolSize", orderInTotal.compareTo(new BigDecimal(10))<0?10:orderInTotal.toPlainString()); + nodes.add(OrdersInfo); + JSONObject priceInfo = getClientAmountInfo(id,"x2", "客单价", client); + BigDecimal price = client.getBigDecimal("total_amount").divide(client.getBigDecimal("orders"), 2, RoundingMode.HALF_UP); + priceInfo.put("label", price.toPlainString()); + priceInfo.put("value", price.toPlainString()); + priceInfo.put("symbolSize", price.divide(new BigDecimal(50), 0, RoundingMode.DOWN).compareTo(new BigDecimal(10))<0?5:price.divide(new BigDecimal(50), 0, RoundingMode.DOWN).toPlainString()); + nodes.add(priceInfo); + id++; + } + for (JSONObject node : nodes) { + JSONObject link = new JSONObject(); + String linkId = node.getString("id"); + link.put("source", linkId); + link.put("target", linkId.indexOf("x")>0?linkId.substring(0,linkId.indexOf("x")):0); + links.add(link); + } + graph.put("nodes", nodes); + graph.put("links", links); + return graph; + } + private int setAllClientIds(JSONObject params, int clientId) { JSONArray client_ids = clientManager.getAllClientIds(clientId); if (client_ids.size() > 1) { @@ -268,6 +345,89 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService { return msg; } + private void initUserInfo(List nodes, JSONObject params) { + JSONObject userInfo = new JSONObject(); + if (params.getString("customer_id").startsWith("o")) { + userInfo = customerMapper.findCustomerByOpenId(params.getString("customer_id")); + } else { + userInfo = managerCustomerRelationAlipayMapper.findCustomerByUserId(params.getString("customer_id")); + } + JSONObject user = new JSONObject(); + user.put("id", 0); + user.put("category", 0); + if (userInfo.size() > 0) { + user.put("name", userInfo.getString("nickname")); + } else { + user.put("name", params.getString("customer_id")); + } + user.put("symbolSize", 80); + user.put("ignore", true); + user.put("flag", true); + user.put("draggable", true); + String imgUrl = StringUtils.isNotBlank(userInfo.getString("headimg")) ? userInfo.getString("headimg") : PlatformEnvironment.getEnv().concatUrl("/static/images/r_logo.svg"); + user.put("symbol", "image://" + imgUrl); + nodes.add(user); + } + + private JSONObject getClientAmountInfo(int oldId, String newId, String name, JSONObject client) { + JSONObject amountInfo = new JSONObject(); + amountInfo.put("ignore", true); + amountInfo.put("flag", true); + amountInfo.put("draggable", true); + amountInfo.put("id", String.valueOf(oldId) + newId); + amountInfo.put("name", name); + return amountInfo; + } + + private void generatorUserProfile(JSONObject customer, JSONObject params) { + List topAddress = new ArrayList<>(); + String topAmountRange = "None"; + String topTimeRange = "None"; + params.put("customer_id", customer.getString("customer_id")); + List mostUseClientsByCustomer = orderAnalysisMapper.mostUseClientsByCustomer(params); + List mostUseIndustryByCustomer = orderAnalysisMapper.mostUseIndustryByCustomer(params); + List mostUseAddressByCustomer = orderAnalysisMapper.mostUseAddressByCustomer(params); + for (JSONObject address : mostUseAddressByCustomer) { + String city = lookupService.getLocation(address.getString("customer_ip")).city; + if (topAddress.size() < 3 && !topAddress.contains(city)) { + topAddress.add(city); + } + } + JSONObject mostUseAmountByCustomer = orderAnalysisMapper.mostUseAmountByCustomer(params); + if (mostUseAmountByCustomer != null) { + int amount = mostUseAmountByCustomer.getIntValue("amount_int"); + if (amount == 0) { + topAmountRange = "0~100"; + }else { + topAmountRange = String.valueOf(amount * 100) + "~" + String.valueOf((amount + 1) * 100); + } + } + JSONObject mostUseTimesByCustomer = orderAnalysisMapper.mostUseTimesByCustomer(params); + if (mostUseTimesByCustomer != null) { + Date orderDate = mostUseTimesByCustomer.getDate("create_time"); + Date nextHourDate = DateUtils.addHours(orderDate, 1); + orderDate = DateUtils.setMinutes(orderDate, 0); + nextHourDate = DateUtils.setMinutes(nextHourDate, 0); + topTimeRange = DateFormatUtils.format(orderDate, "HH:mm") + "-" + DateFormatUtils.format(nextHourDate, "HH:mm"); + } + customer.put("top_clients", getTopInfo(mostUseClientsByCustomer, "client_moniker")); + customer.put("top_industry", getTopInfo(mostUseIndustryByCustomer, "royalpayindustry")); + customer.put("top_citys", String.join(",", topAddress)); + customer.put("amount_range", topAmountRange); + customer.put("hour_range", topTimeRange); + customer.put("price", customer.getBigDecimal("amount").divide(customer.getBigDecimal("orders"), 2, RoundingMode.HALF_UP).toPlainString()); + + + } + + private String getTopInfo(List list, String key) { + if (list != null && list.size() > 0) { + List clients = list.stream().map(e -> e.getString(key)).collect(Collectors.toList()); + return String.join(",", clients); + } + return "None"; + } + // private TemplateMessage initWxMsg(JSONObject tradeInfo,String short_name,String clientCounts, String openId, String templateId,String path,String color) { // diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.java b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.java index 6119fb777..0b3a84463 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.java @@ -22,10 +22,23 @@ public interface OrderAnalysisMapper { JSONObject analysisOrderSuccessRateDetailOfGlobal(@Param("date") Date date); - @CountRef(".countCustomersData") PageList listCustomersData(JSONObject params, PageBounds pageBounds); int countCustomersData(JSONObject params); JSONObject listCustomersDataAnalysis(JSONObject params); + + List listClientsByCustomerId(JSONObject params); + + JSONObject listClientsTotalByCustomerId(JSONObject params); + + List mostUseClientsByCustomer(JSONObject params); + + List mostUseIndustryByCustomer(JSONObject params); + + List mostUseAddressByCustomer(JSONObject params); + + JSONObject mostUseAmountByCustomer(JSONObject params); + + JSONObject mostUseTimesByCustomer(JSONObject params); } diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/web/CustomersAnalysisController.java b/src/main/java/au/com/royalpay/payment/manage/analysis/web/CustomersAnalysisController.java index 4d3528399..501db3123 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/web/CustomersAnalysisController.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/web/CustomersAnalysisController.java @@ -123,5 +123,17 @@ public class CustomersAnalysisController { return customersAnalysisService.getOrdersByOpenid(params, tradeLogQuery.getPage(), tradeLogQuery.getLimit()); } + @ManagerMapping(value = "/{customer_id}/user_echarts") + @ReadOnlyConnection + public JSONObject getUserEcharts(@PathVariable String customer_id, AnalysisBean analysisBean, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + JSONObject params = analysisBean.toParams(null); + params.put("customer_id", customer_id); + params.put("status", 5); + if (manager.getInteger("org_id") != null) { + params.put("org_id", manager.getIntValue("org_id")); + } + return customersAnalysisService.getUserEcharts(params, manager); + } + } diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.xml index ada34a2a8..0ab520bda 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/OrderAnalysisMapper.xml @@ -15,198 +15,210 @@ + + + + + + + + + + @@ -290,7 +391,50 @@ and o.org_id=#{org_id} and o.org_id in - #{org_id} + #{org_id} + + + + + + \ No newline at end of file diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/OrderMapper.xml index 87b4b3557..84e0fbc5c 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 @@ -571,7 +571,7 @@ and o.status>#{include_success_status} - and ocreate_time >= #{from} + and o.create_time >= #{from} and o.create_time < #{to} and c.org_id=#{org_id} and c.org_id in diff --git a/src/main/ui/static/analysis/customer_analysis.js b/src/main/ui/static/analysis/customer_analysis.js index a46191474..13878c95b 100644 --- a/src/main/ui/static/analysis/customer_analysis.js +++ b/src/main/ui/static/analysis/customer_analysis.js @@ -13,6 +13,57 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', ' }) }]); app.controller('customersListCtrl', ['$scope', '$http','$filter', '$uibModal', 'commonDialog', 'orderService', 'refunder', function ($scope, $http,$filter, $uibModal, commonDialog, orderService, refunder) { + $scope.one_customer = {}; + var echartsConfig = function (graph) { + var categories = []; + var c = 0; + for (var i = 0; i < $scope.graph.nodes.length; i++) { + var id = ($scope.graph.nodes[i].id).toString(); + if (id.indexOf("x") < 0) { + categories[c] = { + name: $scope.graph.nodes[i].name + }; + c++; + } + } + $scope.graph.nodes.forEach(function (node) { + node.itemStyle = null; + // Use random x, y + node.x = node.y = null; + node.draggable = true; + }); + return { + tooltip: {}, + legend: [{ + // selectedMode: 'single', + data: categories.map(function (a) { + return a.name; + }) + }], + animation: false, + series : [ + { + name: "用户关系图", + type: 'graph', + layout: 'force', + data: graph.nodes, + links: graph.links, + categories: categories, + roam: false, + label: { + show: true + }, + focusNodeAdjacency: true, + draggable: false, + symbolRotate:undefined, + force: { + repulsion: 50, + edgeLength: [300, 200] + } + } + ] + }; + }; $scope.pagination = {}; $scope.params = {}; $scope.params.openid_type = '0'; @@ -77,6 +128,8 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', ' $http.get('/analysis/customers/ranking/'+$scope.params.openid_type, {params: params}).then(function (resp) { $scope.customer_loading = false; $scope.customers = resp.data.data; + $scope.checkoutCustomer($scope.customers[0]); + $scope.generatorEcharts($scope.customers[0].customer_id); $scope.customers_type = resp.data.openid_type; $scope.pagination = resp.data.pagination; if($scope.customers.length>0){ @@ -88,6 +141,18 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', ' } }); + $scope.checkoutCustomer = function (data) { + $scope.one_customer = data; + $scope.one_customer.industry = data.top_industry.split(","); + $scope.one_customer.clients = data.top_clients.split(","); + }; + $scope.generatorEcharts = function (customer_id) { + $http.get('/analysis/customers/'+ customer_id + '/user_echarts', {params: params}).then(function (resp) { + $scope.graph = resp.data; + $scope.testobj = echartsConfig($scope.graph); + }); + }; + $http.get('/analysis/customers/ranking/'+$scope.params.openid_type+'/total', {params: params}).then(function (resp) { $scope.customers_analysis = resp.data.analysis; }); @@ -135,12 +200,12 @@ define(['angular', 'static/commons/commons', 'static/commons/angular-ueditor', ' // $scope.order_loading = true; $scope.listCustomerOrders = function (page) { $scope.order_loading = true; - var params = angular.copy($scope.order_params) || {}; - if (params.datefrom) { - params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); + var params = angular.copy($scope.params) || {}; + if (params.begin) { + params.datefrom = $filter('date')(params.begin, 'yyyyMMdd'); } - if (params.dateto) { - params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); + if (params.end) { + params.dateto = $filter('date')(params.end, 'yyyyMMdd'); } params.gateway = [0, 1]; params.page = page || $scope.orderPagination.page || 1; diff --git a/src/main/ui/static/analysis/templates/customer_analysis.html b/src/main/ui/static/analysis/templates/customer_analysis.html index 9009da9f9..23f0f3fcb 100644 --- a/src/main/ui/static/analysis/templates/customer_analysis.html +++ b/src/main/ui/static/analysis/templates/customer_analysis.html @@ -1,3 +1,22 @@ +

Customer Transaction Analysis