開源熱門springboot項目-bootdo集成mongodb,包括增刪改、分頁、分組計算、求平均值等聚合查詢等

前言:由於最近做的一個物聯網項目,需要通過傳感器等進行監控,而傳感器的的數據是通過mqtt進行上報的。傳感器數量多且狀態有改變就會發布數據提供訂閱,因此數據量也較大,用傳統的關係型數據庫存儲數據不實際,而且業務中不存在大量複雜的事務邏輯操作,可以避開事務機制(回滾)。綜合考慮,使用mongodb進行傳感器數據的存儲。

1.導入maven包:

<!--mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

2.新建DO實體類:

import com.xuxueli.poi.excel.annotation.ExcelField;
import com.xuxueli.poi.excel.annotation.ExcelSheet;
import lombok.Data;
import org.apache.poi.hssf.util.HSSFColor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;

/**
 * @author  huangquanguang
 * @date  2020/2/21 10:22
 * @description
 * 精密空調實體類
 */
@Document(collection = "air_condition")
@Data
@ExcelSheet(name = "精密空調", headColor = HSSFColor.HSSFColorPredefined.LIGHT_GREEN)
public class AirConditionDO implements Serializable {
    //pid供mongodb內部使用
    @Id
    private String id;
    //設備id
    private String deviceId;
    //設備類型
    private Integer typeId;
    //上報數據
    private String payload;
    //主題名稱
    private String topic;
    //信號類型id
    private String signalId;
    //區域
    @ExcelField(name = "區域",width = 80)
    private String areaName;
    //區域具體位置
    private String areaDetail;
    //信號類型名稱
    @ExcelField(name = "監控項",width = 160)
    private String signalName;
    //監控值
    @ExcelField(name = "監控值",width = 80)
    private Double signalValue;
    //創建時間
    @ExcelField(name = "採集時間",width = 160)
    private String createTime;
    //位置標識
    private String areaMark;

    public AirConditionDO() {
    }


    public AirConditionDO(String deviceId, String createTime, String payload,String topic,
                          Integer typeId,String signalId,String signalName,Double signalValue,
                          String areaName,String areaDetail,String areaMark) {
        this.deviceId = deviceId;
        this.createTime = createTime;
        this.payload = payload;
        this.topic = topic;
        this.typeId = typeId;
        this.signalId = signalId;
        this.signalName = signalName;
        this.signalValue = signalValue;
        this.areaName = areaName;
        this.areaDetail = areaDetail;
        this.areaMark = areaMark;
    }


    @Override
    public String toString() {
        return "AirCondition [id=" + id + ", deviceId=" + deviceId + "+ topic="+topic+", createTime=" + createTime + ", payload=" + payload + "]";
    }

}

3.業務邏輯處理類

AirConditionService:
import com.cecjx.common.utils.PageUtils;
import com.cecjx.common.utils.Query;
import com.cecjx.rotaryring.domain.AirConditionDO;

import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;


public interface AirConditionService {

    PageUtils getPageList(Map<String, Object> params) throws ParseException;

    Map realTempHum(Integer areaType);

    List<Map> getTempByDate(Integer areaType, String date,Integer reportType);

    List<Map> getHumByDate(Integer areaType, String date,Integer reportType);

    List<AirConditionDO> listAll(Map<String, Object> params);
}
AirConditionServiceImpl(這裏的業務處理包括了分頁、分組統計、求平均值、聚合查詢等的例子):
import com.alibaba.fastjson.JSON;
import com.cecjx.common.config.Constant;
import com.cecjx.common.utils.PageUtils;
import com.cecjx.common.utils.RedisUtil;
import com.cecjx.device.domain.WarnLogDO;
import com.cecjx.monitor.warn.domain.WarnParamDO;
import com.cecjx.rotaryring.dao.AirConditionDao;
import com.cecjx.rotaryring.domain.AirConditionDO;
import com.cecjx.rotaryring.service.AirConditionService;
import com.github.pagehelper.util.StringUtil;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.*;

/**
 * 精密空調邏輯處理
 *
 * @author huangquanguang
 * @create 2019/12/24 15:47
 */
@Service("airConditionServiceImpl")
public class AirConditionServiceImpl implements AirConditionService {
    @Autowired
    private MongoTemplate mongoTemplate;
    private AirConditionDao airConditionDao;

    @Autowired
    public AirConditionServiceImpl(AirConditionDao airConditionDao) {
        this.airConditionDao = airConditionDao;
    }

    /**
     * @author huangquanguang
     * @date 2020/3/19 16:36
     * @description 查詢精密空調歷史數據
     * 
     */
    @Override
    public PageUtils getPageList(Map<String, Object> params) throws ParseException {
        //mp分頁 start | --分頁插件--自動識別DB
        int pageSize = Integer.parseInt((String) params.getOrDefault("pageSize", 10));
        int pageNumber = Integer.parseInt((String) params.getOrDefault("pageNumber", 1));
        String sort = (String) params.get("sort");
        String areaName = (String) params.get("areaName");
        String signalName = (String) params.get("signalName");
        String[] signalIds = new String[]{Constant.SIGNAL_AIR_TEMP, Constant.SIGNAL_AIR_HUM};
        if (!StringUtil.isEmpty(signalName) && signalName.equals("溫度")) {
            signalIds = new String[]{Constant.SIGNAL_AIR_TEMP};
        } else if (!StringUtil.isEmpty(signalName) && signalName.equals("溼度")) {
            signalIds = new String[]{Constant.SIGNAL_AIR_HUM};
        }
        //監控範圍
        Double signalValueMin = null;
        Double signalValueMax = null;
        if ("" != params.get("signalValueMin") && params.get("signalValueMin") != null) {
            signalValueMin = Double.parseDouble(params.get("signalValueMin").toString());
        }
        if ("" != params.get("signalValueMax") && params.get("signalValueMax") != null) {
            signalValueMax = Double.parseDouble(params.get("signalValueMax").toString());
        }
        //時間範圍
        String startTime = (String) params.get("startTime");
        String endTime = (String) params.get("endTime");
        //默認的排序是ASC升序
        PageRequest pr = PageRequest.of(pageNumber - 1, pageSize, Direction.ASC, "id");
        if ("desc".equals(sort)) {
            pr = PageRequest.of(pageNumber - 1, pageSize, Direction.DESC, "id");
        }
        Page<AirConditionDO> pictureDOPage = airConditionDao.findByColumnContaining(signalIds, signalValueMin, signalValueMax, startTime, endTime, areaName, pr);
        return new PageUtils(pictureDOPage.getContent(), pictureDOPage.getTotalElements());
    }

    /**
     * @author huangquanguang
     * @date 2020/3/18 9:30
     * @description 根據區域(一辦、二辦)查詢實時的溫度、溼度
     */
    @Override
    public Map realTempHum(Integer areaType) {
        Map map = new HashMap();
        String areaName = null;
        if (areaType == 1) {
            areaName = "一辦";
        } else {
            areaName = "二辦";
        }

        //迴風溫度信號id
        String signalId = Constant.SIGNAL_AIR_TEMP;
        Double temp = getResultByMongodb(areaName, signalId);

        //迴風溼度信號id
        String signalHumId = Constant.SIGNAL_AIR_HUM;
        Double hum = getResultByMongodb(areaName, signalHumId);
        map.put("temp", temp);
        map.put("hum", hum);

        //實時的溫度溼度與系統設置的預警參數作比較,返回提示
        //預警參數緩存查詢
        String tempWarn = "0";
        String humWarn = "0";
        RedisUtil redisUtil = new RedisUtil();
        List<WarnParamDO> warnParamDOS = JSON.parseArray(redisUtil.getObject("warnParams").toString(), WarnParamDO.class);
        if (warnParamDOS != null && warnParamDOS.size() > 0) {
            for(WarnParamDO warnParamDO : warnParamDOS){
                Double cracMinTemp = Double.parseDouble(warnParamDO.getCracMinTemp());
                Double cracMaxTemp = Double.parseDouble(warnParamDO.getCracMaxTemp());
                if (temp > cracMaxTemp || temp<cracMinTemp) {
                    tempWarn = "1";
                }
                Double cracMinHum = Double.parseDouble(warnParamDO.getCracMinHumidity());
                Double cracMaxHum = Double.parseDouble(warnParamDO.getCracMaxHumidity());
                if (hum > cracMaxHum || hum<cracMinHum) {
                    humWarn = "1";
                }
            }
        }
        map.put("tempWarn", tempWarn);
        map.put("humWarn", humWarn);
        return map;
    }

    /**
     * @author huangquanguang
     * @date 2020/3/18 15:16
     * @description 查詢某個區域某天或某月或某年的溫度變化
     */
    @Override
    public List<Map> getTempByDate(Integer areaType, String date, Integer reportType) {
        //迴風溫度信號id
        String signalId = Constant.SIGNAL_AIR_TEMP;
        List<Map> list = getAvgGroupList(areaType, date, signalId, reportType);
        return list;
    }


    /**
     * @author huangquanguang
     * @date 2020/3/18 15:16
     * @description 查詢某個區域某天或某月或某年的溼度變化
     */
    @Override
    public List<Map> getHumByDate(Integer areaType, String date, Integer reportType) {
        //迴風溼度信號id
        String signalId = Constant.SIGNAL_AIR_HUM;
        List<Map> list = getAvgGroupList(areaType, date, signalId, reportType);
        return list;
    }

    /**
     * @author huangquanguang
     * @date 2020/3/26 16:11
     * @description 導出符合查詢條件的空調數據
     */
    @Override
    public List<AirConditionDO> listAll(Map<String, Object> params) {
        // 列表查詢
        String signalName = (String) params.get("signalName");
        String areaName = (String) params.get("areaName");
        String[] signalIds = new String[]{Constant.SIGNAL_AIR_TEMP, Constant.SIGNAL_AIR_HUM};
        if (!StringUtil.isEmpty(signalName) && signalName.equals("溫度")) {
            signalIds = new String[]{Constant.SIGNAL_AIR_TEMP};
        } else if (!StringUtil.isEmpty(signalName) && signalName.equals("溼度")) {
            signalIds = new String[]{Constant.SIGNAL_AIR_HUM};
        }
        //監控範圍
        Double signalValueMin = null;
        Double signalValueMax = null;
        if ("" != params.get("signalValueMin") && params.get("signalValueMin") != null) {
            signalValueMin = Double.parseDouble(params.get("signalValueMin").toString());
        }
        if ("" != params.get("signalValueMax") && params.get("signalValueMax") != null) {
            signalValueMax = Double.parseDouble(params.get("signalValueMax").toString());
        }
        //時間範圍
        String startTime = (String) params.get("startTime");
        String endTime = (String) params.get("endTime");
        return airConditionDao.findByColumnContaining(signalIds, signalValueMin, signalValueMax, startTime, endTime, areaName, new Sort(Sort.Direction.DESC, "id"));
    }

    /**
     * @author huangquanguang
     * @date 2020/3/19 10:56
     * @description 計算某一天各個時段的溫度溼度平均值,根據不同的報表類型拼接統計語句
     */
    private List<Map> getAvgGroupList(Integer areaType, String date, String signalId, Integer reportType) {
        List<Map> listResult = new ArrayList<>();
        String areaName = null;
        if (areaType == 1) {
            areaName = "一辦";
        } else {
            areaName = "二辦";
        }
        MongoCollection collection = mongoTemplate.getCollection("air_condition");//air_condition爲表
        String matchStr = "{\"$match\":{\"areaName\":\"" + areaName + "\",\"signalId\":\"" + signalId + "\"}}";
        String projectStr = "";
        String matchDayStr = "";
        //日報表
        if (reportType == 0) {
            projectStr = "{\"$project\":{\"_id\":0,\"payload\":1,\"signalValue\":1,\"deviceId\":1,\"day\":{\"$substr\":[\"$createTime\",0,10]},\"hour\":{\"$substr\":[\"$createTime\",11,2]}}}";
            matchDayStr = "{\"$match\":{\"day\":\"" + date + "\"}}";
        }
        //月報表
        if (reportType == 1) {
            date = date.substring(0, 7);
            projectStr = "{\"$project\":{\"_id\":0,\"payload\":1,\"signalValue\":1,\"deviceId\":1,\"day\":{\"$substr\":[\"$createTime\",0,7]},\"hour\":{\"$substr\":[\"$createTime\",8,2]}}}";
            matchDayStr = "{\"$match\":{\"day\":\"" + date + "\"}}";
        }
        //年報表
        if (reportType == 2) {
            date = date.substring(0, 4);
            projectStr = "{\"$project\":{\"_id\":0,\"payload\":1,\"signalValue\":1,\"deviceId\":1,\"day\":{\"$substr\":[\"$createTime\",0,4]},\"hour\":{\"$substr\":[\"$createTime\",5,2]}}}";
            matchDayStr = "{\"$match\":{\"day\":\"" + date + "\"}}";
        }
        String unwindStr = "{\"$unwind\":\"$payload\"}";
        String groupStr = "{\"$group\":{\"_id\":{\"hour\":\"$hour\"},\"_count\":{\"$avg\":\"$signalValue\"}}}";
        String proStr = "{\"$project\":{\"hour\":\"$_id.hour\",\"_count\":1,\"_id\":0}},";
        String orderStr = "{\"$sort\":{\"hour\":1}}";
        DBObject match = BasicDBObject.parse(matchStr);
        DBObject project = BasicDBObject.parse(projectStr);
        DBObject matchDay = BasicDBObject.parse(matchDayStr);
        DBObject unwind = BasicDBObject.parse(unwindStr);
        DBObject group = BasicDBObject.parse(groupStr);
        DBObject pro = BasicDBObject.parse(proStr);
        DBObject order = BasicDBObject.parse(orderStr);
        LinkedList<DBObject> list = new LinkedList<>();
        list.add(match);
        list.add(project);
        list.add(matchDay);
        list.add(unwind);
        list.add(group);
        list.add(pro);
        list.add(order);
        AggregateIterable resultSet = collection.aggregate(list);
        MongoCursor<Document> cursor = resultSet.iterator();
        while (cursor.hasNext()) {
            Document document = cursor.next();
            String hour = document.getString("hour");
            Double value = document.getDouble("_count");
            DecimalFormat df = new DecimalFormat("#.00");
            if (value != null) {
                value = Double.parseDouble(df.format(value));
            }
            Map<String, Object> map = new HashMap();
            map.put("hour", hour);
            map.put("value", value);
            listResult.add(map);
        }
        return listResult;
    }

    /**
     * @author huangquanguang
     * @date 2020/3/18 11:41
     * @description 執行語句查找mongodb
     */
    private Double getResultByMongodb(String areaName, String signalId) {
        Double result = 0.0;
        MongoCollection collection = mongoTemplate.getCollection("air_condition");
        String matchStr = "{\"$match\":{\"areaName\":\"" + areaName + "\",\"signalId\":\"" + signalId + "\"}}";
        String orderStr = "{\"$sort\":{\"createTime\":-1}}";
        String limitStr = "{\"$limit\":1}";
        DBObject match = BasicDBObject.parse(matchStr);
        DBObject order = BasicDBObject.parse(orderStr);
        DBObject limit = BasicDBObject.parse(limitStr);
        LinkedList<DBObject> list = new LinkedList<>();
        list.add(match);
        list.add(order);
        list.add(limit);
        AggregateIterable resultSet = collection.aggregate(list);
        MongoCursor<Document> cursor = resultSet.iterator();
        while (cursor.hasNext()) {
            Document document = cursor.next();
            if (null != document) {
                result = document.getDouble("signalValue");
            }
        }
        return result;
    }
}

4.Dao層,繼承了MongoRepository(這裏的重點是對參數爲空時的處理)

package com.cecjx.rotaryring.dao;

import com.cecjx.rotaryring.domain.AirConditionDO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.List;

public interface AirConditionDao extends MongoRepository<AirConditionDO, String> {

    @Query(value = "{" +
            "    'signalId':{$in: ?#{ [0] } },\n" +
            "    'signalValue': ?#{ ([1] == null) or ([2] == null) ? '{$exists:true}' :  {$gte:[1], $lte:[2]} },\n" +
            "    'createTime': ?#{ ([3] == '') or ([4] == '') ? '{$exists:true}' :  {$gte:[3], $lte:[4]} }, \n" +
            "    'areaName': ?#{ ([5] == '') ? '{$exists:true}' :  {$regex:[5]} }\n" +
            "}")
    Page<AirConditionDO> findByColumnContaining(String[] signalIds, Double signalValueMin, Double signalValueMax, String startTime, String endTime, String areaName, Pageable pageable);

    @Query(value = "{" +
            "    'signalId':{$in: ?#{ [0] } },\n" +
            "    'signalValue': ?#{ ([1] == null) or ([2] == null) ? '{$exists:true}' :  {$gte:[1], $lte:[2]} },\n" +
            "    'createTime': ?#{ ([3] == '') or ([4] == '') ? '{$exists:true}' :  {$gte:[3], $lte:[4]} }, \n" +
            "    'areaName': ?#{ ([5] == '') ? '{$exists:true}' :  {$regex:[5]} }\n" +
            "}")
    List<AirConditionDO> findByColumnContaining(String[] signalIds, Double signalValueMin, Double signalValueMax, String startTime, String endTime, String areaName, Sort sort);
}

5.controller控制器測試:

import com.cecjx.common.utils.MyExcelExportUtil;
import com.cecjx.common.utils.PageUtils;
import com.cecjx.common.utils.R;
import com.cecjx.common.utils.StringUtils;
import com.cecjx.rotaryring.domain.AirConditionDO;
import com.cecjx.rotaryring.domain.TempHumDO;
import com.cecjx.rotaryring.service.AirConditionService;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author huangquanguang
 * @date 2020/2/21 10:19
 * @description 精密空調控制器
 */
@Controller
@RequestMapping(value = "/rotary/airCondition")
public class AirConditionController {
    @Autowired
    private AirConditionService airConditionService;


    /**
     * 獲取所有精密空調集合的數據
     */
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    @ResponseBody
    public PageUtils getPageList(@RequestParam Map<String, Object> params) throws ParseException {
        return airConditionService.getPageList(params);
    }

    /**
     * 精密空調可視化
     */
    @RequestMapping(value = "/index")
    @RequiresPermissions("rotary:air:realtime")
    public String index() {
        return "rotaryring/aircondition/realtime";
    }

    /**
     * 精密空調可視化
     */
    @RequestMapping(value = "/indexVue")
    @RequiresPermissions("rotary:air:realtime")
    public String indexVue() {
        return "rotaryring/aircondition/realtimeVue";
    }

    /**
     * 精密空調歷史數據
     */
    @RequestMapping(value = "/history")
    @RequiresPermissions("rotary:air:history")
    public String history() {
        return "rotaryring/aircondition/history";
    }

    /**
     * 精密空調告警數據
     */
    @RequestMapping(value = "/warn")
    @RequiresPermissions("rotary:air:warn")
    public String warn() {
        return "rotaryring/aircondition/warnLog";
    }

    /**
     * 日報表
     */
    @RequestMapping(value = "/dayReport")
    @RequiresPermissions("rotary:air:dayReport")
    public String dayReport(Model model) {
        model.addAttribute("reportType", 0);
        return "rotaryring/aircondition/report";
    }

    /**
     * 月報表
     */
    @RequestMapping(value = "/monthReport")
    @RequiresPermissions("rotary:air:monthReport")
    public String monthReport(Model model) {
        model.addAttribute("reportType", 1);
        return "rotaryring/aircondition/report";
    }

    /**
     * 年報表
     */
    @RequestMapping(value = "/yearReport")
    @RequiresPermissions("rotary:air:yearReport")
    public String yearReport(Model model) {
        model.addAttribute("reportType", 2);
        return "rotaryring/aircondition/report";
    }

    /**
     * 查詢某個區域的實時溫度溼度
     *
     * @param areaType
     * @return
     */
    @RequestMapping(value = "/realTempHum", method = RequestMethod.GET)
    @ResponseBody
    public R realTempHum(Integer areaType) {
        Map map = airConditionService.realTempHum(areaType);
        return R.ok().put("data", map);
    }

    /**
     * 查詢某個區域某天的溫度變化
     */
    @RequestMapping(value = "/getTempByDate", method = RequestMethod.GET)
    @ResponseBody
    public R getTempByDate(Integer areaType, String date, Integer reportType) {
        List<Map> list = airConditionService.getTempByDate(areaType, date, reportType);
        return R.ok().put("data", list);
    }

    /**
     * 查詢某個區域某天的溼度變化
     */
    @RequestMapping(value = "/getHumByDate", method = RequestMethod.GET)
    @ResponseBody
    public R getHumByDate(Integer areaType, String date, Integer reportType) {
        List<Map> list = airConditionService.getHumByDate(areaType, date, reportType);
        return R.ok().put("data", list);
    }

    /**
     * @author huangquanguang
     * @date 2020/3/26 16:03
     * @description 精密空調數據Excel導出
     */
    @RequestMapping(value = "/exportExcel")
    public void exportExcel(@RequestParam Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String filename = "精密空調數據" + format.format(new Date().getTime()) + ".xls";
        response.setContentType("application/ms-excel;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(), "iso-8859-1"));
        OutputStream out = response.getOutputStream();
        try {
            List<AirConditionDO> airConditionDOS = airConditionService.listAll(params);
            if (null != airConditionDOS && airConditionDOS.size() > 0) {
                //監控項文字處理
                for(AirConditionDO airConditionDO : airConditionDOS){
                    String signalName = airConditionDO.getSignalName();
                    if(!StringUtils.isEmpty(signalName)&&signalName.contains("溫度")){
                        airConditionDO.setSignalName("溫度");
                    }
                    else{
                        airConditionDO.setSignalName("溼度");
                    }
                }
                //超過excel的限度導出報錯處理
                if (airConditionDOS.size() <= 60000) {
                    MyExcelExportUtil.exportToFile(airConditionDOS, out);
                } else {
                    List<List<AirConditionDO>> result = MyExcelExportUtil.splitList(airConditionDOS, 60000);
                    List<List<?>> lists = new ArrayList<>();
                    if (result != null && result.size() > 0) {
                        for (int i = 0; i < result.size(); i++) {
                            lists.add(result.get(i));
                        }
                        MyExcelExportUtil.exportToFileSheets(false, lists, out);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.close();
        }
    }

}

6.項目需求僅對mongodb進行查詢,如果需要新增及修改,可以參考下面代碼,是一個完整的增刪改查例子:

import com.cecjx.common.utils.PageUtils;
import com.cecjx.manage.demo.dao.PictureDao;
import com.cecjx.manage.demo.domain.PictureDO;
import com.cecjx.manage.demo.service.PictureService;
import com.github.pagehelper.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * mongodb邏輯處理
 *
 * @author huangquanguang
 * @create 2019/12/24 15:47
 */
@Service("mongodbServiceImpl")
public class PictureServiceImpl implements PictureService {

    private PictureDao pictureRepository;

    @Autowired
    public PictureServiceImpl(PictureDao pictureRepository) {
        this.pictureRepository = pictureRepository;
    }

    public List<PictureDO> getPicList(int current, int rowCount, String sortid) {
        PageRequest pr;
        if ("asc".equals(sortid))
            pr = new PageRequest(--current, rowCount, Direction.ASC, "id");
        else if ("desc".equals(sortid))
            pr = new PageRequest(--current, rowCount, Direction.DESC, "id");
        else
            pr = new PageRequest(--current, rowCount);
        Page<PictureDO> page = pictureRepository.findAll(pr);
        return page.getContent();
    }

    public Optional<PictureDO> getPictureById(String id) {
        Optional<PictureDO> pic = pictureRepository.findById(id);
        return pic;
    }

    public int getPictureNum() {
        return (int) pictureRepository.count();
    }

    public void deletePicture(String id) {
        Optional<PictureDO> pic = pictureRepository.findById(id);
        PictureDO pictureDO = pic.get();
        pictureRepository.delete(pictureDO);
    }

    public void SaveOrUpdatePicture(PictureDO p) {
        pictureRepository.save(p);
    }

    public List<PictureDO> getSearchResult(int current, int rowCount, String sortid, String search) {
        PageRequest pr;
        if ("asc".equals(sortid))
            pr = new PageRequest(--current, rowCount, Direction.ASC, "id");
        else if ("desc".equals(sortid))
            pr = new PageRequest(--current, rowCount, Direction.DESC, "id");
        else
            pr = new PageRequest(--current, rowCount);
        Page<PictureDO> page = pictureRepository.findByFilenameContaining(search, pr);
        return page.getContent();
    }

    public int getSearchResultTotal(String search) {
        List<PictureDO> list = pictureRepository.findByFilenameContaining(search);
        return list.size();
    }

    @Override
    public PageUtils getPicPageList(Map<String, Object> params) {
        // 列表查詢
//		Query query = new Query(params);
        // mp 分頁 start | --分頁插件--自動識別DB
        int page = Integer.parseInt((String) params.get("page"));
        int pageSize = Integer.parseInt((String) params.getOrDefault("pageSize", 10));
        String sort = (String) params.get("sort");
        String search = (String) params.get("search");
        PageRequest pr;
        if ("asc".equals(sort))
            pr = new PageRequest(--page, pageSize, Direction.ASC, "id");
        else if ("desc".equals(sort))
            pr = new PageRequest(--page, pageSize, Direction.DESC, "id");
        else
            pr = new PageRequest(--page, pageSize);
        if (StringUtil.isEmpty(search)) {
            Page<PictureDO> pictureDOPage = pictureRepository.findAll(pr);
            List<PictureDO> pictureDOS = pictureDOPage.getContent();
            return new PageUtils(pictureDOS, getPictureNum());
        } else {
            Page<PictureDO> pictureDOPage = pictureRepository.findByFilenameContaining(search, pr);
            List<PictureDO> pictureDOS = pictureDOPage.getContent();
            return new PageUtils(pictureDOS, getSearchResultTotal(search));
        }
    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章