2019.6.24著
告訴大家一個好消息 ,今天朕終于要開始些功能了,哈哈哈!!!!雖然隻是簡單的查詢,但是也是一次挑戰,幹巴爹哦嘞。
做一個報表,要求如下
1.顯示會員基本資訊
這個最簡單啦,在後端寫跳轉頁面的入口,把資料查出來存入request,在頁面使用${“key的值”}取出來即可展示,最終效果如下:
2.折線圖展示
折線圖是我最後一個做的,因為比較難,前台代碼也看不懂,不過做完之後發現其實也就那樣,照着套就好了,看看大佬是怎麼封裝對象的 ,我跟着一樣封裝,然後吧前台代碼複制粘貼,就實作功能了 ,不過在這期間也出現過bug,我把int類型的資料用String傳到前端了,結果前端調試有資料,但是頁面顯示就是不出資料。下次要吸取教訓。
3.餅狀圖展示
這個比較簡單,頁面上就一個div,然後坐在jq裡面傳入固定的json就可以了,具體後端代碼如下:
/**
* 向頁面發送餅狀圖json資料
* @param request
* @return
*/
@ResponseBody
@RequestMapping(value = {"/loadContentStat"}, method = {RequestMethod.GET})
public String loadContentStat(HttpServletRequest request) {
//C端使用者總數
RetDTO customerType0 = customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_ORDINARY);
int customerCCount = JSON.parseObject(customerType0.getRetData(), Integer.class);
//非C端使用者總數
int noCustomerCCount = JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_ENTERPRISE).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_STAFF).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_SERVICE).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_ENGINEER).getRetData(), Integer.class)
+ JSON.parseObject(customerWebApi.getCustomerType(CustomerDTO.CUSTOMER_CUSTOMERTYPE_WHOLESALER).getRetData(), Integer.class);
Map<String, Object> returnMap = new HashMap<String, Object>();
List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();
List<String> categoryNameList = new ArrayList<String>();
categoryNameList.add("C端使用者總數");
categoryNameList.add("非C端使用者總數");
List<Integer> cList = new ArrayList();
cList.add(customerCCount);
cList.add(noCustomerCCount);
for (int i = 0; i < cList.size(); i++) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name",categoryNameList.get(i));
paramMap.put("value",cList.get(i));
listData.add(paramMap);
}
returnMap.put("listData", listData);
returnMap.put("categoryNameList", categoryNameList);
return JSON.toJSONString(returnMap, SerializerFeature.WriteMapNullValue);
}
具體實作效果如下:
4.導出報表(包括會員表,訂單表,位址表等)
這個的話就有點複雜了,查詢代碼特多 ,我就不一一寫查詢代碼了,都用方法代替,具體邏輯展示如下:
/**
* 報表導出
* 根據條件導出資料
*
* @param response
* @param request
* @return
*/
@ResponseBody
@RequestMapping(value = {"/exportsByCondition"}, method = {RequestMethod.GET}, produces = {"text/html;charset=UTF-8"})
public String exportsByCondition(HttpServletResponse response, HttpServletRequest request) {
//擷取開始時間
String startDate = request.getParameter("startDate");
//擷取結束時間
String endDate = request.getParameter("endDate");
//1.擷取EXCEL表頭
String[] headers = {"登陸賬号", "會員昵稱", "會員類型", "手機号碼", "郵箱", "注冊時間", "最後登陸時間", "支付總金額", "支付次數", "加入分銷員日期", "預設收貨人", "預設收貨手機号", "預設收貨位址", "分公司編碼", "分公司名稱", "辦事處編碼", "辦事處名稱"};
//2.擷取導出需要的資料
List<Map<String, String>> dataset = new ArrayList<Map<String, String>>();
RetDTO loginLogData = this.loginLogData(startDate, endDate);
List<CustomerLoginLogDTO> dataList = JSON.parseArray(loginLogData.getRetData(), CustomerLoginLogDTO.class);
System.out.println("------------------查詢時間内的登陸數:"+dataList.size()+"-------------------");
//去重複
Set set = new HashSet();
//組裝查詢條件
for (CustomerLoginLogDTO customerLoginLogDTO : dataList) {
//使用set去重判斷
if (set.add(customerLoginLogDTO.getCustomerUuid())) {
//組裝查詢條件
Map<String, String> map = new HashMap<String, String>();
String customerUuid = customerLoginLogDTO.getCustomerUuid();
//根據會員id查詢customer表
RetDTO customerRetDTO = customerWebApi.getByUuid(customerUuid);
CustomerDTO customerDTO = null;
if (RetDTO.SUCCESS.equals(customerRetDTO.getRetStatus()) && StringUtils.isNotEmpty(customerRetDTO.getRetData())) {
customerDTO = JSON.parseObject(customerRetDTO.getRetData(), CustomerDTO.class);
if (customerDTO != null) {
map.put("key0", customerDTO.getCustomerNo());//登陸賬号customerNo
map.put("key1", customerDTO.getCustomerName());//會員昵稱customerName
map.put("key2", customerDTO.getCustomerType());//會員類型customerType
map.put("key3", customerDTO.getMobile());//手機号碼mobile
map.put("key4", customerDTO.getEmail());//郵箱email
map.put("key5", customerDTO.getCreateTime());//注冊時間createTime
map.put("key6", customerDTO.getLastLoginTime());//最後登陸時間lastLoginTime
} else {
map.put("key0", "");//登陸賬号customerNo
map.put("key1", "");//會員昵稱customerName
map.put("key2", "");//會員類型customerType
map.put("key3", "");//手機号碼mobile
map.put("key4", "");//郵箱email
map.put("key5", "");//注冊時間createTime
map.put("key6", "");//最後登陸時間lastLoginTime
}
}
//根據會員id查詢order_main表
RetDTO orderMainListDto = this.getOrderMainByTimeData(startDate, endDate, customerUuid);
List<OrderMainDTO> orderMainList = JSON.parseArray(orderMainListDto.getRetData(), OrderMainDTO.class);
if (orderMainList != null && orderMainList.size() > 0) {
double payTotalMoney = 0.00;
int payNumber = 0;
for (OrderMainDTO orderMainDTO : orderMainList) {
payTotalMoney += orderMainDTO.getPayPrice();
payNumber++;
map.put("key7", payTotalMoney + "");//支付總金額payTotalMoney
map.put("key8", payNumber + "");//支付次數payNumber
}
} else {
map.put("key7", "");//支付總金額payTotalMoney
map.put("key8", "");//支付次數payNumber
}
if (customerDTO != null) {
map.put("key9", customerDTO.getExtendApplyTime());//joinDistributorTime加入分銷員日期
} else {
map.put("key9", "");//joinDistributorTime加入分銷員日期
}
//根據會員id查詢customer_address表
RetDTO customerAddressRetDTO = customerAddressWebApi.getDefaultDeliveryAddress(customerUuid);
CustomerAddressDTO customerAddressDTO = JSON.parseObject(customerAddressRetDTO.getRetData(), CustomerAddressDTO.class);
if (customerAddressDTO != null) {
map.put("key10", customerAddressDTO.getConsignee());//預設收貨人consignee
map.put("key11", customerAddressDTO.getTelephone());//預設手機号telephone
map.put("key12", customerAddressDTO.getAddress());//預設收貨位址address
} else {
map.put("key10", "");//預設收貨人consignee
map.put("key11", "");//預設手機号telephone
map.put("key12", "");//預設收貨位址address
}
//根據分公司編碼和辦事處編碼查詢
if (customerDTO != null) {
if (CustomerDTO.CUSTOMER_CUSTOMERTYPE_SERVICE.equals(customerDTO.getCustomerType()) || CustomerDTO.CUSTOMER_CUSTOMERTYPE_ENGINEER.equals(customerDTO.getCustomerType())) {
RetDTO companyDto = partCompany4OthersApi.getByCode(customerDTO.getCompanyCode());
PartCompanyDTO company = JSON.parseObject(companyDto.getRetData(), PartCompanyDTO.class);
if (company != null && company != null) {
map.put("key13", company.getCompanyCode());//分公司編碼companyNo,編碼在會員表就有
map.put("key14", company.getCompanyName());//分公司名稱companyName
} else {
map.put("key13", "");//分公司編碼companyNo,編碼在會員表就有
map.put("key14", "");//分公司名稱companyName
}
RetDTO orgDto = organization4OthersApi.getbyCode(customerDTO.getAgencyCode());
OrganizationDTO org = JSON.parseObject(orgDto.getRetData(), OrganizationDTO.class);
if (org != null) {
map.put("key15", org.getOfficeCode());//辦事處編碼orgNo,編碼在會員表就有
map.put("key16", org.getOrgName());//辦事處名稱orgName
} else {
map.put("key15", "");//辦事處編碼orgNo,編碼在會員表就有
map.put("key16", "");//辦事處名稱orgName
}
} else {
map.put("key13", "");//分公司編碼companyNo,編碼在會員表就有
map.put("key14", "");//分公司名稱companyName
map.put("key15", "");//辦事處編碼orgNo,編碼在會員表就有
map.put("key16", "");//辦事處名稱orgName
}
} else {
map.put("key13", "");//分公司編碼companyNo,編碼在會員表就有
map.put("key14", "");//分公司名稱companyName
map.put("key15", "");//辦事處編碼orgNo,編碼在會員表就有
map.put("key16", "");//辦事處名稱orgName
}
dataset.add(map);//根據時間查詢出來的資料
}
}
if (dataset != null && dataset.size() > 0) {
ExcelUtil.exportsDataByMap(dataset, response, "會員資訊表", headers);
}
System.out.println("------------------導出報表會員資訊條數:" + dataset.size() + "-----------------------------");
//3.導出資料
return "true";
}
表格到處就有點煩了,資料一多,就出問題 ,當我設定隻要一千條的時候,他就很快。目前還不知道是什麼原因,如果哪位大佬能看出來,希望能交流交流。
經驗之談:
1.在寫代碼時,一定要記得修改過後及時編譯。如果在方法外寫了代碼,這是必須重新開機項目才能生效
2.list集合的去重方式
//方法一:使用java8新特性stream進行List去重
List newList = list.stream().distinct().collect(Collectors.toList());
//方法二:雙重for循環去重
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if(i!=j&&list.get(i)==list.get(j)) {
list.remove(list.get(j));
}
}
}
//方法三:set集合判斷去重,不打亂順序
Set set1 = new HashSet();
List newList1 = new ArrayList();
for (Integer integer : list) {
if(set1.add(integer)) {
newList1.add(integer);
}
}
//方法四:周遊後判斷賦給另一個list集合
List newList2 = new ArrayList();
for (Integer integer : list) {
if(!newList2.contains(integer)){
newList2.add(integer);
}
}
//方法五:set和list轉換去重
Set set2 = new HashSet();
List newList3 = new ArrayList();
set2.addAll(list);
newList3.addAll(set2);
總結:站在巨人的肩膀就能決定你初始的高度有多高,抄别人的代碼不是醜事,最重要的是你做完了之後要會了解别人是怎麼做的,然後吸收總結,把它變成自己的知識,這樣你就成長了。整整一個星期才把這四個功能做完,第一次做是有點菜,代碼寫得也不漂亮,相信下次寫我肯定能做好。
落款人:熊熊。2019.7.1