天天看點

我的Java開發生涯記(6)

2019.6.24著

告訴大家一個好消息 ,今天朕終于要開始些功能了,哈哈哈!!!!雖然隻是簡單的查詢,但是也是一次挑戰,幹巴爹哦嘞。

做一個報表,要求如下

1.顯示會員基本資訊

我的Java開發生涯記(6)

這個最簡單啦,在後端寫跳轉頁面的入口,把資料查出來存入request,在頁面使用${“key的值”}取出來即可展示,最終效果如下:

我的Java開發生涯記(6)

2.折線圖展示

我的Java開發生涯記(6)

折線圖是我最後一個做的,因為比較難,前台代碼也看不懂,不過做完之後發現其實也就那樣,照着套就好了,看看大佬是怎麼封裝對象的 ,我跟着一樣封裝,然後吧前台代碼複制粘貼,就實作功能了 ,不過在這期間也出現過bug,我把int類型的資料用String傳到前端了,結果前端調試有資料,但是頁面顯示就是不出資料。下次要吸取教訓。

我的Java開發生涯記(6)

3.餅狀圖展示

我的Java開發生涯記(6)

這個比較簡單,頁面上就一個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);
}
           

具體實作效果如下:

我的Java開發生涯記(6)

4.導出報表(包括會員表,訂單表,位址表等)

我的Java開發生涯記(6)

這個的話就有點複雜了,查詢代碼特多 ,我就不一一寫查詢代碼了,都用方法代替,具體邏輯展示如下:

/**
 * 報表導出
 * 根據條件導出資料
 *
 * @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

繼續閱讀