package project.web.admin.impl.report; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletResponse; import org.apache.commons.collections.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import kernel.util.Arith; import kernel.util.DateUtils; import kernel.util.StringUtils; import kernel.web.Page; import kernel.web.PagedQueryDao; import project.Constants; import project.party.recom.UserRecomService; import project.web.admin.service.report.AdminAllStatisticsService; public class AdminAllStatisticsServiceImpl implements AdminAllStatisticsService { private PagedQueryDao pagedQueryDao; private UserRecomService userRecomService; private NamedParameterJdbcOperations namedParameterJdbcTemplate; public Page pagedQuery(int pageNo, int pageSize,String startTime,String endTime,String loginPartyId) { Map parameters = new HashMap(); StringBuffer queryString = new StringBuffer("SELECT "); queryString.append("DATE_FORMAT(ud.CREATE_TIME,\"%Y-%m-%d\") AS date, ");//日期 queryString.append("SUM(ud.RECHARGE_DAPP) AS recharge_dapp,SUM(ud.RECHARGE) AS recharge,SUM(ud.RECHARGE_USDT) AS recharge_usdt,SUM(ud.RECHARGE_USDC) AS recharge_usdc,SUM(ud.RECHARGE_ETH) AS recharge_eth,SUM(ud.RECHARGE_BTC) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + "SUM(ud.WITHDRAW_DAPP) AS withdraw_dapp,SUM(ud.WITHDRAW) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + "SUM(ud.RECHARGE_WITHDRAWAL_FEE) AS recharge_withdrawal_fee,SUM(ud.GIFT_MONEY) AS gift_money,SUM(ud.RECHARGE)-SUM(ud.WITHDRAW) AS balance_amount,IFNULL((recharge_usdt-withdraw),0) as difference,");//充提 queryString.append("SUM(ud.AMOUNT) AS amount,SUM(ud.FEE) AS fee,SUM(ud.ORDER_INCOME) AS order_income, ");//永续 queryString.append("SUM(ud.FINANCE_AMOUNT) AS finance_amount,SUM(ud.FINANCE_INCOME) AS finance_income, ");//理财 queryString.append("SUM(ud.EXCHANGE_AMOUNT) AS exchange_amount,SUM(ud.EXCHANGE_FEE) AS exchange_fee,SUM(ud.EXCHANGE_INCOME) AS exchange_income,SUM(ud.COIN_INCOME) AS coin_income, ");//币币 queryString.append("SUM(ud.FURTURES_AMOUNT) AS furtures_amount,SUM(ud.FURTURES_FEE) AS furtures_fee,SUM(ud.FURTURES_INCOME) AS furtures_income, ");//交割 queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income ");//币币杠杆 queryString.append("FROM T_USERDATA ud "); queryString.append("WHERE 1=1 "); queryString.append("AND ud.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); if (!StringUtils.isNullOrEmpty(loginPartyId)) { List children = this.userRecomService.findChildren(loginPartyId); if (children.size() == 0) { return new Page(); } queryString.append(" and ud.PARTY_ID in (:children) "); parameters.put("children", children); } if (!StringUtils.isNullOrEmpty(startTime)) { queryString.append("AND DATE(ud.CREATE_TIME) >= DATE('" + startTime + " 00:00:00') "); } if (!StringUtils.isNullOrEmpty(endTime)) { queryString.append("AND DATE(ud.CREATE_TIME) <= DATE('" + endTime + " 23:59:59') "); } queryString.append("GROUP BY DATE(ud.CREATE_TIME) "); queryString.append("ORDER BY DATE(ud.CREATE_TIME) DESC "); Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters); compute(page.getElements(),false); return page; } public Map daySumData(String loginPartyId,String day){ Map parameters = new HashMap(); StringBuffer queryString = new StringBuffer("SELECT "); queryString.append("IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_USDC),0) AS recharge_usdc,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + "IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.RECHARGE_USDT)-SUM(ud.WITHDRAW),0) AS balance_amount, ");//充提 queryString.append("IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, ");//永续 queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, ");//理财 queryString.append("IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income, ");//币币 queryString.append("IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income ");//币币杠杆 queryString.append("FROM T_USERDATA ud "); queryString.append("WHERE 1=1 "); queryString.append("AND ud.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); if (!StringUtils.isNullOrEmpty(loginPartyId)) { List children = this.userRecomService.findChildren(loginPartyId); if (children.size() == 0) { return new HashMap(); } queryString.append(" and ud.PARTY_ID in (:children) "); parameters.put("children", children); } if (!StringUtils.isNullOrEmpty(day)) { queryString.append("AND DATE(ud.CREATE_TIME) = DATE(:day) "); parameters.put("day", DateUtils.toDate(day)); } List> queryForList = this.namedParameterJdbcTemplate.queryForList( queryString.toString(), parameters); compute(queryForList,false); return queryForList.get(0); } /** * 计算 统计时 * @param datas * @param isSum */ private void compute(List> datas,boolean isSum) { if(CollectionUtils.isEmpty(datas)) return; Double totle_income=0d; Double totle_fee = 0d; Double business_profit = 0d;//交易盈亏 Double fin_miner_amount = 0d;//理财 矿机 交易额 Double fin_miner_income = 0d;//理财 矿机 收益 for(Map data:datas) { totle_income=0d; totle_fee = 0d; business_profit = 0d; fin_miner_amount = 0d; fin_miner_income = 0d; if(null != data.get("order_income")) data.put("order_income", Arith.sub(0, new Double(data.get("order_income").toString())));//订单收益负数 if(null != data.get("finance_income")) data.put("finance_income", Arith.sub(0, new Double(data.get("finance_income").toString())));//理财收益负数 if(null != data.get("exchange_income")) // data.put("exchange_income", Arith.sub(0, new Double(data.get("exchange_income").toString())));//币币收益负数 data.put("exchange_income",0);//币币收益负数 if(null != data.get("furtures_income")) data.put("furtures_income", Arith.sub(0, new Double(data.get("furtures_income").toString())));//交割收益负数 if (null != data.get("miner_income")) data.put("miner_income", Arith.sub(0, new Double(data.get("miner_income").toString())));// 矿机收益负数 if (null != data.get("exchange_lever_order_income")) data.put("exchange_lever_order_income", Arith.sub(0, new Double(data.get("exchange_lever_order_income").toString())));// 币币收益负数 if(!dataExistNull(data)) continue; totle_income = Arith.add(totle_income,new Double(data.get("recharge_withdrawal_fee").toString())); totle_income = Arith.add(totle_income,new Double(data.get("order_income").toString())); totle_income = Arith.add(totle_income,new Double(data.get("fee").toString())); totle_income = Arith.add(totle_income,new Double(data.get("finance_income").toString())); totle_income = Arith.add(totle_income,new Double(data.get("exchange_fee").toString())); totle_income = Arith.add(totle_income,new Double(0)); // totle_income = Arith.add(totle_income,new Double(data.get("exchange_income").toString())); totle_income = Arith.add(totle_income,new Double(data.get("furtures_fee").toString())); totle_income = Arith.add(totle_income,new Double(data.get("furtures_income").toString())); totle_income = Arith.add(totle_income,new Double(data.get("miner_income").toString())); totle_income = Arith.add(totle_income,new Double(data.get("exchange_lever_order_income").toString())); data.put("totle_income", totle_income); totle_fee = Arith.add(totle_fee, new Double(data.get("recharge_withdrawal_fee").toString())); totle_fee = Arith.add(totle_fee, new Double(data.get("fee").toString())); totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_fee").toString())); totle_fee = Arith.add(totle_fee, new Double(data.get("furtures_fee").toString())); totle_fee = Arith.add(totle_fee, new Double(data.get("exchange_lever_fee").toString())); data.put("totle_fee", totle_fee); business_profit = Arith.add(business_profit, new Double(data.get("order_income").toString())); business_profit = Arith.add(business_profit, new Double(data.get("exchange_income").toString())); business_profit = Arith.add(business_profit, new Double(data.get("furtures_income").toString())); business_profit = Arith.add(business_profit, new Double(data.get("exchange_lever_order_income").toString())); data.put("business_profit", business_profit); fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("finance_amount").toString())); fin_miner_amount = Arith.add(fin_miner_amount, new Double(data.get("miner_amount").toString())); data.put("fin_miner_amount", fin_miner_amount); fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("finance_income").toString())); fin_miner_income = Arith.add(fin_miner_income, new Double(data.get("miner_income").toString())); data.put("fin_miner_income", fin_miner_income); data.put("recharge_btc", new BigDecimal(data.get("recharge_btc").toString()).setScale(8, RoundingMode.FLOOR).toPlainString());//订单收益负数 } } /** * 统计的数据存在空时,不统计总额 * @param data * @return */ private boolean dataExistNull(Map data) { if(null == data.get("recharge_withdrawal_fee")) return false; if(null == data.get("order_income")) return false; if(null == data.get("fee")) return false; if(null == data.get("finance_income")) return false; if(null == data.get("exchange_fee")) return false; if(null == data.get("exchange_income")) return false; if(null == data.get("furtures_fee")) return false; if(null == data.get("furtures_income")) return false; return true; } public Map sumDatas(String startTime,String endTime,String loginPartyId){ Map parameters = new HashMap(); StringBuffer queryString = new StringBuffer("SELECT "); queryString.append("IFNULL(SUM(ud.RECHARGE_DAPP),0) AS recharge_dapp,IFNULL(SUM(ud.RECHARGE),0) AS recharge,IFNULL(SUM(ud.RECHARGE_USDT),0) AS recharge_usdt,IFNULL(SUM(ud.RECHARGE_USDC),0) AS recharge_usdc,IFNULL(SUM(ud.RECHARGE_ETH),0) AS recharge_eth,IFNULL(SUM(ud.RECHARGE_BTC),0) AS recharge_btc,IFNULL(SUM(ud.RECHARGE_HT),0) AS recharge_ht,IFNULL(SUM(ud.RECHARGE_LTC),0) AS recharge_ltc," + "IFNULL(SUM(ud.WITHDRAW_DAPP),0) AS withdraw_dapp,IFNULL(SUM(ud.WITHDRAW),0) AS withdraw,IFNULL(SUM(ud.WITHDRAW_ETH),0) AS withdraw_eth,IFNULL(SUM(ud.WITHDRAW_BTC),0) AS withdraw_btc," + "IFNULL(SUM(ud.RECHARGE_WITHDRAWAL_FEE),0) AS recharge_withdrawal_fee,IFNULL(SUM(ud.GIFT_MONEY),0) AS gift_money,IFNULL(SUM(ud.RECHARGE)-SUM(ud.WITHDRAW),0) AS balance_amount, IFNULL((recharge_usdt-withdraw),0) as difference,");//充提 queryString.append("IFNULL(SUM(ud.AMOUNT),0) AS amount,IFNULL(SUM(ud.FEE),0) AS fee,IFNULL(SUM(ud.ORDER_INCOME),0) AS order_income, ");//永续 queryString.append("IFNULL(SUM(ud.FINANCE_AMOUNT),0) AS finance_amount,IFNULL(SUM(ud.FINANCE_INCOME),0) AS finance_income, ");//理财 queryString.append("IFNULL(SUM(ud.EXCHANGE_AMOUNT),0) AS exchange_amount,IFNULL(SUM(ud.EXCHANGE_FEE),0) AS exchange_fee,IFNULL(SUM(ud.EXCHANGE_INCOME),0) AS exchange_income,IFNULL(SUM(ud.COIN_INCOME),0) AS coin_income, ");//币币 queryString.append("IFNULL(SUM(ud.FURTURES_AMOUNT),0) AS furtures_amount,IFNULL(SUM(ud.FURTURES_FEE),0) AS furtures_fee,IFNULL(SUM(ud.FURTURES_INCOME),0) AS furtures_income, ");//交割 queryString.append("IFNULL(SUM(ud.MINER_AMOUNT),0) AS miner_amount,IFNULL(SUM(ud.MINER_INCOME),0) AS miner_income, ");//矿机 queryString.append("IFNULL(SUM(ud.THIRD_RECHARGE_AMOUNT),0) AS third_recharge_amount, ");//三方充值 queryString.append("IFNULL(SUM(ud.EXCHANGE_LEVER_AMOUNT),0) AS exchange_lever_amount,IFNULL(SUM(ud.EXCHANGE_LEVER_FEE),0) AS exchange_lever_fee,IFNULL(SUM(ud.EXCHANGE_LEVER_ORDER_INCOME),0) AS exchange_lever_order_income ");//币币杠杆 queryString.append("FROM T_USERDATA ud "); queryString.append("WHERE 1=1 "); queryString.append("AND ud.ROLENAME ='"+Constants.SECURITY_ROLE_MEMBER+"' "); if (!StringUtils.isNullOrEmpty(loginPartyId)) { List children = this.userRecomService.findChildren(loginPartyId); if (children.size() == 0) { return new HashMap(); } queryString.append(" and ud.PARTY_ID in (:children) "); parameters.put("children", children); } if (!StringUtils.isNullOrEmpty(startTime)) { queryString.append("AND DATE(ud.CREATE_TIME) >= DATE('" + startTime + " 00:00:00') "); } if (!StringUtils.isNullOrEmpty(endTime)) { queryString.append("AND DATE(ud.CREATE_TIME) <= DATE('" + endTime + " 23:59:59') "); } queryString.append("ORDER BY DATE(ud.CREATE_TIME) DESC "); List> queryForList = this.namedParameterJdbcTemplate.queryForList( queryString.toString(), parameters); compute(queryForList,true); return queryForList.get(0); } public String loadExportData(HttpServletResponse response, int pageSize,String startTime,String endTime,String loginPartyId) throws IOException { //生成数据信息 int sheetNum = 0; // 生成表头 Integer i = 0; // 在内存中保持100行,超过100行将被刷新到磁盘 SXSSFWorkbook wb = new SXSSFWorkbook(100); Sheet sheet = wb.createSheet(); // 表,一个表包含多个行 Drawing patriarch = sheet.createDrawingPatriarch(); CellStyle style = wb.createCellStyle(); Row row = null;// 行,一行包括多个单元格 Cell cell = null;// 单元格 Page page = null; int pageNo =1; Map headMap = new LinkedHashMap(); headMap.put("日期", new Integer[] {1,1}); headMap.put("充提", new Integer[] {0,9}); headMap.put("永续合约", new Integer[] {0,2}); headMap.put("理财收益", new Integer[] {1,1}); headMap.put("币币", new Integer[] {0,2}); headMap.put("交割合约", new Integer[] {0,2}); headMap.put("收益", new Integer[] {1,1}); createMergedHead(wb, sheet,headMap,i++); return ""; } private void createMergedHead(SXSSFWorkbook wb,Sheet sheet,Map headMap,int i) { Font font = wb.createFont(); font.setFontHeightInPoints((short) 10); font.setFontName("Courier New"); CellStyle style = wb.createCellStyle(); style.setFont(font); style.setWrapText(true); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); Row row = sheet.createRow(i); int rowPosition = 0;//行坐标 int cellPosition = 0;//列坐标 for(Entry entry:headMap.entrySet()) { Cell cell = row.createCell(cellPosition); cell.setCellStyle(style); cell.setCellValue(entry.getKey()); CellRangeAddress region = new CellRangeAddress(rowPosition, rowPosition+entry.getValue()[0], cellPosition, cellPosition+entry.getValue()[1]-1); sheet.addMergedRegion(region); cellPosition+=entry.getValue()[1]; } } public List dataBachHandel(List> list){ List result = new ArrayList(); int i = 0; for(Map data:list) { i = 0; Object[] objs = new Object[18]; objs[i++] = data.get("date"); objs[i++] = data.get("recharge_usdt"); objs[i++] = data.get("recharge_eth"); objs[i++] = data.get("recharge_btc"); objs[i++] = data.get("recharge"); objs[i++] = data.get("gift_money"); objs[i++] = data.get("withdraw"); objs[i++] = data.get("recharge_withdrawal_fee");//TODO double recharge_usdt = 0D; double withdraw = 0D; if (null != data.get("recharge_usdt")) { recharge_usdt = Double.parseDouble(data.get("recharge_usdt").toString()); } if (null != data.get("withdraw")) { withdraw = Double.parseDouble(data.get("withdraw").toString()); } objs[i++] = Arith.sub(recharge_usdt, withdraw); objs[i++] = data.get("balance_amount"); // objs[i++] = data.get("amount"); objs[i++] = data.get("fee"); objs[i++] = data.get("order_income"); // objs[i++] = data.get("finance_amount"); objs[i++] = data.get("finance_income"); // objs[i++] = data.get("exchange_amount"); objs[i++] = data.get("exchange_fee"); // objs[i++] = data.get("exchange_income"); objs[i++] = 0; // objs[i++] = data.get("furtures_amount"); objs[i++] = data.get("furtures_fee"); objs[i++] = data.get("furtures_income"); objs[i++] = data.get("totle_income"); result.add(objs); } return result; } public PagedQueryDao getPagedQueryDao() { return pagedQueryDao; } public void setPagedQueryDao(PagedQueryDao pagedQueryDao) { this.pagedQueryDao = pagedQueryDao; } public NamedParameterJdbcOperations getNamedParameterJdbcTemplate() { return namedParameterJdbcTemplate; } public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } public void setUserRecomService(UserRecomService userRecomService) { this.userRecomService = userRecomService; } }