diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/beans/AnalysisBean.java b/src/main/java/au/com/royalpay/payment/manage/analysis/beans/AnalysisBean.java index f8b4251b7..1c90ca15d 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/beans/AnalysisBean.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/beans/AnalysisBean.java @@ -35,6 +35,7 @@ public class AnalysisBean { private String client_moniker; private String amount_from; private String amount_to; + private String bd_name; public JSONObject toParams(String timezone) { JSONObject params = new JSONObject(); if (timezone != null) { @@ -78,6 +79,9 @@ public class AnalysisBean { if(channel!=null){ params.put("channel",channel); } + if(bd_name!=null){ + params.put("bd_name",bd_name); + } if (client_moniker!=null){ params.put("client_moniker", client_moniker); } @@ -217,4 +221,12 @@ public class AnalysisBean { public void setClient_moniker(String client_moniker) { this.client_moniker = client_moniker; } + + public String getBd_name() { + return bd_name; + } + + public void setBd_name(String bd_name) { + this.bd_name = bd_name; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/BDAnalysisService.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/BDAnalysisService.java index e5067b457..ae814453e 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/BDAnalysisService.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/BDAnalysisService.java @@ -19,6 +19,10 @@ public interface BDAnalysisService { void exportSalesExcel(AnalysisBean analysisBean, HttpServletResponse httpResponse, JSONObject manager) throws IOException; + void exportPartnerExcelByBd(AnalysisBean analysisBean, HttpServletResponse httpResponse,JSONObject manager) throws IOException; + + void exportPartnerExcelByData(AnalysisBean analysisBean, HttpServletResponse httpResponse,JSONObject manager) throws IOException; + /** * 开通商户按bd统计 * diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/BDAnalysisServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/BDAnalysisServiceImpl.java index dbaa47917..119a02304 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/BDAnalysisServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/BDAnalysisServiceImpl.java @@ -4,9 +4,12 @@ import au.com.royalpay.payment.manage.analysis.beans.AnalysisBean; import au.com.royalpay.payment.manage.analysis.core.BDAnalysisService; import au.com.royalpay.payment.manage.analysis.mappers.BDAnalysisMapper; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.springframework.stereotype.Service; @@ -15,6 +18,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; /** @@ -29,7 +33,20 @@ public class BDAnalysisServiceImpl implements BDAnalysisService { @Override public List getSalesAnalysis(JSONObject jsonObject) { - return bdAnalysisMapper.getBDSaleList(jsonObject); + return listSalesAnalysis(jsonObject); + } + + private List listSalesAnalysis(JSONObject jsonObject){ + List listCountApproved = bdAnalysisMapper.countApproved(jsonObject); + List bdSaleList = bdAnalysisMapper.getBDSaleList(jsonObject); + for(JSONObject countApproved : listCountApproved){ + for(JSONObject saleList : bdSaleList){ + if(countApproved.getIntValue("bd_id") == saleList.getIntValue("bd_id")){ + saleList.put("num",countApproved.getString("num")); + } + } + } + return bdSaleList; } @Override @@ -39,7 +56,37 @@ public class BDAnalysisServiceImpl implements BDAnalysisService { @Override public List getSalesPartnersReportByBD(JSONObject jsonObject) { - return bdAnalysisMapper.getBDSalePartnerReport(jsonObject); + List bdAnalysis = bdAnalysisMapper.getBDSalePartnerReport(jsonObject); + List result = new ArrayList<>(); + String keys_1[] = {"1","2","3","4","5","6","7","8","9"}; + String key_2[] = {"10","11","12"}; + result = getPartnerTypes(keys_1,result,1,5,bdAnalysis); + return getPartnerTypes(key_2,result,2,6,bdAnalysis); + } + + private List getPartnerTypes(String keys[],List result,int short_length,int long_length,List bdAnalysis){ + for(String key : keys){ + int countValue = 0; + int countTotal = 0; + JSONObject object = new JSONObject(); + JSONArray list = new JSONArray(); + for(JSONObject type : bdAnalysis){ + if(type.getString("royalpayindustry") != null && type.getString("royalpayindustry").startsWith(key) && (type.getString("royalpayindustry").length()==short_length || type.getString("royalpayindustry").length()==long_length)){ + countValue += type.getIntValue("partner_counts"); + countTotal += type.getIntValue("total"); + list.add(type); + } + } + if(countValue == 0){ + continue; + } + object.put("count_value",countValue); + object.put("count_total",countTotal); + object.put("mccCode",key); + object.put("children",list); + result.add(object); + } + return result; } @Override @@ -97,6 +144,84 @@ public class BDAnalysisServiceImpl implements BDAnalysisService { return bdAnalysisMapper.countApproved(params); } + @Override + public void exportPartnerExcelByBd(AnalysisBean analysisBean, HttpServletResponse httpResponse, JSONObject manager) throws IOException { + OutputStream ous = null; + try{ + JSONObject parmerters = analysisBean.toParams(null); + List listPartnerByBd = bdAnalysisMapper.getBDSalePartnerList(parmerters); + httpResponse.setContentType("application/octet-stream;"); + httpResponse.addHeader("Content-Disposition", "attachment; filename=" + "Merchant_list--" +parmerters.getString("bd_name") + analysisBean.getBegin() + "~" + analysisBean.getEnd() + ".xls"); + ous = httpResponse.getOutputStream(); + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFFont font = wb.createFont(); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + font.setFontHeightInPoints((short) 15); + CellStyle analysisStyle = wb.createCellStyle(); + analysisStyle.setFont(font); + Sheet sheet = wb.createSheet("Merchant list" ); + sheet.createFreezePane(1, 2); + sheet.setDefaultColumnWidth((short) 25); + int rowNum = 0; + Row row = sheet.createRow(rowNum); + String[] title = {"Short Name", "Client Moniker", "AUD Amount"}; + for (int i = 0; i < title.length; i++) { + row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]); + } + for(JSONObject partner : listPartnerByBd){ + row = sheet.createRow(++rowNum); + row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("short_name")); + row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("client_moniker")); + row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(partner.getString("total")); + } + wb.write(ous); + ous.flush(); + }catch (IOException e){ + } finally { + IOUtils.closeQuietly(ous); + } + + } + + @Override + public void exportPartnerExcelByData(AnalysisBean analysisBean, HttpServletResponse httpResponse, JSONObject manager) throws IOException { + OutputStream ous = null; + try{ + JSONObject parmerters = analysisBean.toParams(null); + List listPartnerByData = listSalesAnalysis(parmerters); + httpResponse.setContentType("application/octet-stream;"); + httpResponse.addHeader("Content-Disposition", "attachment; filename=" + "Merchant_sale" + analysisBean.getBegin() + "~" + analysisBean.getEnd() + ".xls"); + ous = httpResponse.getOutputStream(); + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFFont font = wb.createFont(); + font.setBoldweight(Font.BOLDWEIGHT_BOLD); + font.setFontHeightInPoints((short) 15); + CellStyle analysisStyle = wb.createCellStyle(); + analysisStyle.setFont(font); + Sheet sheet = wb.createSheet("Merchant Sale List" ); + sheet.createFreezePane(1, 2); + sheet.setDefaultColumnWidth((short) 25); + int rowNum = 0; + Row row = sheet.createRow(rowNum); + String[] title = {"BD Name", "AUD Amount", "Refund Fee","New Merchants"}; + for (int i = 0; i < title.length; i++) { + row.createCell(i, Cell.CELL_TYPE_STRING).setCellValue(title[i]); + } + for(JSONObject dataSale : listPartnerByData){ + row = sheet.createRow(++rowNum); + row.createCell(0, Cell.CELL_TYPE_STRING).setCellValue(dataSale.getString("bd_name")); + row.createCell(1, Cell.CELL_TYPE_STRING).setCellValue(dataSale.getString("total")); + row.createCell(2, Cell.CELL_TYPE_STRING).setCellValue(dataSale.getString("refund_fee")); + row.createCell(3, Cell.CELL_TYPE_STRING).setCellValue(dataSale.getString("num") == null? "0" : dataSale.getString("num")); + } + wb.write(ous); + ous.flush(); + }catch (IOException e){ + } finally { + IOUtils.closeQuietly(ous); + } + } + private void exportExcel(HSSFWorkbook workbook,String title,List monthTotalSale) { // 声明一个工作薄 // 生成一个表格 diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/web/BDSaleAnalysisController.java b/src/main/java/au/com/royalpay/payment/manage/analysis/web/BDSaleAnalysisController.java index d50deff10..03e2e0944 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/web/BDSaleAnalysisController.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/web/BDSaleAnalysisController.java @@ -51,4 +51,14 @@ public class BDSaleAnalysisController { return bdAnalysisService.getSalesPartnersReportByBD(analysis.toParams(null)); } + @ManagerMapping("/sales/partners/excel_bd") + public void exportPartnerExcelByBd(AnalysisBean analysis, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse) throws Exception { + bdAnalysisService.exportPartnerExcelByBd(analysis,httpResponse,manager); + } + + @ManagerMapping("/sales/partners/excel_data") + public void exportPartnerExcelByData(AnalysisBean analysis, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse) throws Exception { + bdAnalysisService.exportPartnerExcelByData(analysis,httpResponse,manager); + } + } diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/BDAnalysisMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/BDAnalysisMapper.xml index 6cded9c11..696d064cc 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/BDAnalysisMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/BDAnalysisMapper.xml @@ -149,7 +149,7 @@ order by num desc diff --git a/src/main/ui/static/analysis/bd-sale-volume.js b/src/main/ui/static/analysis/bd-sale-volume.js index 7e6eafac1..5230d2821 100644 --- a/src/main/ui/static/analysis/bd-sale-volume.js +++ b/src/main/ui/static/analysis/bd-sale-volume.js @@ -12,6 +12,7 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b }]); app.controller('bdSaleAnalysisCtrl', ['$scope', '$http', '$filter', '$timeout', 'commonDialog', 'chartParser','industryMap', function ($scope, $http, $filter, $timeout, commonDialog, chartParser,industryMap) { + $scope.showItems = true; $scope.params = {}; $scope.today = new Date(); $scope.chooseToday = function () { @@ -151,9 +152,33 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b } }) }; - + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data; + }) + }; + $scope.loadRoyalpayindustry(); + var getType = function (industryCode) { + var industryLabel = ''; + angular.forEach($scope.royalpayindustry, function (industry) { + if (industry.mccCode == industryCode) { + industryLabel = industry.label; + }else { + angular.forEach(industry.children, function (children){ + if (children.mccCode == industryCode) { + industryLabel = children.label; + } + }) + } + }); + if (!industryLabel) { + industryLabel = industryCode; + } + return industryLabel; + }; $scope.loadPartnersChart = function (bd_id, bd_name) { $scope.chooseBdName = bd_name; + $scope.bd_id = bd_id var params = angular.copy($scope.params); if (params.begin) { params.begin = $filter('date')(params.begin, 'yyyyMMdd'); @@ -188,7 +213,7 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b } }); - var getType = function (industryCode) { + /* var getType = function (industryCode) { var industryLabel = ''; angular.forEach(industryMap.configs(), function (industry) { if (industry.value == industryCode) { @@ -199,21 +224,22 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b industryLabel = industryCode; } return industryLabel; - }; + };*/ $http.get('/analysis/bd/sales/partners/report', {params: params}).then(function (resp) { $scope.legends = []; for (var i = 0; i < resp.data.length; i++) { - $scope.legends[i] = resp.data[i].partner_type; - var partner_type = getType(resp.data[i].industry); + /* $scope.legends[i] = resp.data[i].partner_type;*/ + var partner_type = getType(resp.data[i].mccCode); resp.data[i].partner_type = partner_type; - $scope.legends[i] = partner_type; + /* $scope.legends[i] = partner_type;*/ } $scope.PartnerTypes = angular.copy(resp.data); - var legend = $scope.legends; - $scope.partners_type_chart = chartParser.parse(partnerTypesConfig(), $scope.PartnerTypes); + /* var legend = $scope.legends;*/ + childrenType(0); + $scope.partners_type_chart = partnerTypesConfig($scope.PartnerTypes,$scope.children); $scope.partnersAnalysischart = chartParser.parse(analysisPartner(), $scope.PartnerTypes); - function partnerTypesConfig() { + /*function partnerTypesConfig() { return { chart: { tooltip: { @@ -237,7 +263,7 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b column: {key: 'partner_counts', name: 'partner_type'} }] } - }; + };*/ function analysisPartner() { return { @@ -279,7 +305,7 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b } , column: { - key: 'total', name: 'total', color: function (idx) { + key: 'count_total', name: 'total', color: function (idx) { return colors[idx % colors.length] } } @@ -292,6 +318,103 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b }); }; + var partnerTypesConfig = function (innerData,outerData) { + outerData = outerData||[]; + var innerSeriesTemplate = { + name: '商户类别', + type: 'pie', + radius: outerData.length==0?'80%':'40%', + center: ['50%', '40%'], + selectedMode: 'single', + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + }, + normal : { + label : { + position : 'inner' + }, + labelLine : { + show : false + } + } + }, + data:[] + }; + angular.forEach(innerData,function (item) { + innerSeriesTemplate.data.push({ + name:item.partner_type, + value:item.count_value, + selected:$scope.partners_type.partner_type===item.partner_type + }) + }); + var outerSeriesTemplate = { + name: '商户类别', type: 'pie', + radius : ['50%', '63%'], + center: ['50%', '40%'], + label: { + normal: { + formatter: '{b} : {c} ({d}%)' + } + }, + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + }, + data:[] + }; + angular.forEach(outerData,function (item) { + outerSeriesTemplate.data.push({ + name:item.children_partner_type, + value:item.partner_counts}) + }); + var series = [innerSeriesTemplate]; + if(outerData.length){ + series.push(outerSeriesTemplate) + } + return { + tooltip: { + trigger: 'item', + formatter: "{a}
{b} : {c} ({d}%)" + }, + color: colors, + /* legend: { + orient: 'horizontal', + /!*y: '450px', + left: 'right',*!/ + x: 'center', + y: 'bottom', + data: $scope.legends + },*/ + series: series + } + }; + $scope.partner_type_chart = function (chart) { + chart.on('click', function (params) { + childrenType(params.dataIndex); + $scope.partners_type_chart = partnerTypesConfig($scope.PartnerTypes,$scope.children); + try { + $scope.$digest(); + }catch (err){} + }); + }; + var childrenType = function (index) { + $scope.partners_type = $scope.PartnerTypes[index]; + $scope.children = $scope.partners_type.children; + for (var i = 0; i < $scope.children.length; i++) { + $scope.legends[i] = $scope.children.children_partner_type; + var children_partner_type= getType($scope.children[i].royalpayindustry); + $scope.children[i].children_partner_type = children_partner_type; + } + $scope.PartnerTypes[index].children = $scope.children; + /*$scope.type_count = $scope.PartnerTypes[index].count_value;*/ + } + $scope.exportMonthSale = function () { var params = angular.copy($scope.params); if (params.begin_month) { @@ -314,6 +437,36 @@ define(['angular', 'uiBootstrap', 'uiRouter', 'angularEcharts', './bd/analysis-b return url; } + $scope.exportExcelByBdOrDate = function (type) { + if (type=='data'){ + url = '/analysis/bd/sales/partners/excel_data'; + } + if (type=='bd'){ + var url = '/analysis/bd/sales/partners/excel_bd'; + } + var params = angular.copy($scope.params); + if (params.begin) { + params.begin = $filter('date')(params.begin, 'yyyyMMdd'); + } else { + params.begin = $filter('date')('2016-01-01', 'yyyyMMdd'); + } + if (params.end) { + params.end = $filter('date')(params.end, 'yyyyMMdd'); + } else { + params.end = $filter('date')(new Date(), 'yyyyMMdd'); + } + var connectSymbol = '?'; + url += connectSymbol + 'begin=' + params.begin + '&' + 'end=' + params.end; + if (type=='bd') { + url += '&'+'bd_id=' + $scope.bd_id + '&'+ 'bd_name=' + $scope.chooseBdName; + } + if (params.org_id) { + url += '&' + 'org_id=' + params.org_id; + } + return url; + } + + }]); return app; diff --git a/src/main/ui/static/analysis/templates/bd_sale_analysis.html b/src/main/ui/static/analysis/templates/bd_sale_analysis.html index 09a1b4b4f..a071dd659 100644 --- a/src/main/ui/static/analysis/templates/bd_sale_analysis.html +++ b/src/main/ui/static/analysis/templates/bd_sale_analysis.html @@ -98,7 +98,7 @@ -
+
@@ -130,16 +130,26 @@

BD Sales

+ + Export + +
-
+

BD销售数据统计

-
+
+

BD销售数据统计

@@ -147,6 +157,7 @@ + @@ -157,6 +168,10 @@ ng-click="loadPartnersChart(sale.bd_id,sale.bd_name)"> +
BD AUD Amount Refund FeeNew Merchants
+ + 0 +
@@ -166,17 +181,24 @@

{{chooseBdName}} 商户类别分布

-

{{chooseBdName}} 商户类别交易量分布

-
-
+

{{chooseBdName}} 商户销售排行

@@ -223,4 +245,5 @@
-
\ No newline at end of file +
+
\ No newline at end of file diff --git a/src/main/ui/static/images/christmas.png b/src/main/ui/static/images/christmas.png new file mode 100644 index 000000000..54a5581e6 Binary files /dev/null and b/src/main/ui/static/images/christmas.png differ