suntianwu 3 lat temu
rodzic
commit
e6a24a898e
44 zmienionych plików z 1843 dodań i 10 usunięć
  1. 8 3
      pom.xml
  2. 63 2
      src/main/java/com/iden/bms/controller/CameraController.java
  3. 55 0
      src/main/java/com/iden/bms/controller/CommunityController.java
  4. 0 2
      src/main/java/com/iden/bms/controller/CrowdController.java
  5. 141 0
      src/main/java/com/iden/bms/service/CameraService.java
  6. 109 3
      src/main/java/com/iden/bms/service/CommunityService.java
  7. 2 0
      src/main/java/com/iden/bms/service/CrowdService.java
  8. 48 0
      src/main/java/com/iden/common/entity/IdenCity.java
  9. 53 0
      src/main/java/com/iden/common/entity/IdenDistrict.java
  10. 43 0
      src/main/java/com/iden/common/entity/IdenProvince.java
  11. 58 0
      src/main/java/com/iden/common/entity/IdenSubdistrict.java
  12. 358 0
      src/main/java/com/iden/common/exceltool/AbstractExcelParser.java
  13. 24 0
      src/main/java/com/iden/common/exceltool/ColInfo.java
  14. 38 0
      src/main/java/com/iden/common/exceltool/CommonExcelParse.java
  15. 65 0
      src/main/java/com/iden/common/exceltool/DbHelper.java
  16. 283 0
      src/main/java/com/iden/common/exceltool/ExcelUtil.java
  17. 49 0
      src/main/java/com/iden/common/exceltool/ExcelVersion.java
  18. 25 0
      src/main/java/com/iden/common/exceltool/HeaderToColumn.java
  19. 22 0
      src/main/java/com/iden/common/exceltool/IExcelParser.java
  20. 71 0
      src/main/java/com/iden/common/exceltool/MultipartFileToFile.java
  21. 15 0
      src/main/java/com/iden/common/mapper/IdenCityMapper.java
  22. 15 0
      src/main/java/com/iden/common/mapper/IdenDistrictMapper.java
  23. 15 0
      src/main/java/com/iden/common/mapper/IdenProvinceMapper.java
  24. 15 0
      src/main/java/com/iden/common/mapper/IdenSubdistrictMapper.java
  25. 14 0
      src/main/java/com/iden/common/service/IdenCityService.java
  26. 14 0
      src/main/java/com/iden/common/service/IdenDistrictService.java
  27. 14 0
      src/main/java/com/iden/common/service/IdenProvinceService.java
  28. 14 0
      src/main/java/com/iden/common/service/IdenSubdistrictService.java
  29. 18 0
      src/main/java/com/iden/common/service/impl/IdenCityServiceImpl.java
  30. 18 0
      src/main/java/com/iden/common/service/impl/IdenDistrictServiceImpl.java
  31. 18 0
      src/main/java/com/iden/common/service/impl/IdenProvinceServiceImpl.java
  32. 18 0
      src/main/java/com/iden/common/service/impl/IdenSubdistrictServiceImpl.java
  33. 85 0
      src/main/java/com/iden/common/util/SpringContextHolder.java
  34. 13 0
      src/main/java/com/iden/common/vo/CameraVO.java
  35. 10 0
      src/main/java/com/iden/common/vo/CommunityVO.java
  36. 8 0
      src/main/java/com/iden/common/vo/CrowdVO.java
  37. BIN
      src/main/resources/export/DetectorRuleExportTemplate.xlsx
  38. BIN
      src/main/resources/export/IdenCameraExportTemplate.xlsx
  39. BIN
      src/main/resources/export/IdenCommunityExportTemplate.xlsx
  40. BIN
      src/main/resources/export/IdenCrowdExportTemplate.xlsx
  41. 6 0
      src/main/resources/mybatis/IdenCityMapper.xml
  42. 6 0
      src/main/resources/mybatis/IdenDistrictMapper.xml
  43. 6 0
      src/main/resources/mybatis/IdenProvinceMapper.xml
  44. 6 0
      src/main/resources/mybatis/IdenSubdistrictMapper.xml

+ 8 - 3
pom.xml

@@ -30,7 +30,7 @@
         <jasypt.version>3.0.3</jasypt.version>
         <admin.version>2.2.2</admin.version>
         <io.springfox.version>2.5.0</io.springfox.version>
-        <easyexcel.version>2.2.8</easyexcel.version>
+        <easyexcel.version>2.1.6</easyexcel.version>
         <jwt.version>0.9.0</jwt.version>
     </properties>
 
@@ -139,15 +139,20 @@
             <artifactId>hutool-all</artifactId>
             <version>5.5.6</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.9</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
-            <version>4.1.2</version>
+            <version>3.9</version>
         </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-scratchpad</artifactId>
-            <version>4.1.2</version>
+            <version>3.9</version>
         </dependency>
 
 

+ 63 - 2
src/main/java/com/iden/bms/controller/CameraController.java

@@ -20,8 +20,10 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -152,12 +154,71 @@ public class CameraController {
             return Result.error("修改失败!");
         }
     }
+    /**
+     * 导出列表
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "导出Excel")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "type", value = "摄像头类型,1摄像机,2抓拍设备"),
+            @ApiImplicitParam(paramType = "query", name = "district", value = "所属区域"),
+            @ApiImplicitParam(paramType = "query", name = "subdistrict", value = "所属街道"),
+            @ApiImplicitParam(paramType = "query", name = "cameraId", value = "摄像头ID"),
+            @ApiImplicitParam(paramType = "query", name = "name", value = "摄像头名称")
+    })
+    @GetMapping({"/exportToExcel"})
+    @LogAnnotation(
+            type = OperateType.EXPORT,
+            moduleName = "导出摄像头列表",
+            description = "导出摄像头列表"
+    )
+    public void exportToExcel(HttpServletRequest request,@RequestHeader(name = "token", required = true) String token,
+                              @RequestParam(value = "type", required = true) String type,
+                              @RequestParam(value = "district", required = false) String district,
+                              @RequestParam(value = "subdistrict", required = false) String subdistrict,
+                              @RequestParam(value = "cameraId", required = false) Long cameraId,
+                              @RequestParam(value = "name", required = false) String name,
+                              HttpServletResponse response) {
+        try {
+            UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
+            this.cameraService.exportToExcel(type,district,subdistrict,cameraId,name,loginUser,response);
+        } catch (BDException e) {
+            log.error("导出摄像头列表出现异常",e);
+        } catch (Exception e) {
+            log.error("小区管理: 导出摄像头列表出现异常",e);
+        }
+    }
+
+    @ApiOperation(value = "导入Excel")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "type", value = "摄像头类型,1摄像机,2抓拍设备"),
+    })
+    @PostMapping(value = "/importWithExcel",  headers = "content-type=multipart/form-data")
+    public Result<Object> importWithExcel(  @RequestParam(value = "type", required = true) String type,
+                                            @RequestParam(value = "file") MultipartFile multipartFile) throws Exception {
+        try {
+            boolean flag = cameraService.importWithExcel(type,multipartFile);
+            if(flag){
+                return  Result.success("导入成功!");
+            } else {
+                return Result.error("导入失败");
+            }
+
+        } catch (BDException e) {
+            log.error("导入摄像头列表出现异常",e);
+            return Result.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("摄像头管理: 导入摄像头列表出现异常",e);
+            return Result.error("导入摄像头失败!");
+        }
+    }
 
     @GetMapping("/getCameraInfo/{id}")
     @ApiOperation(value = "摄像头详情")
     public Result<CameraVO> getCameraInfo(HttpServletRequest request, @RequestHeader("token") String token, @PathVariable("id") Long id){
-        CameraVO orderInfo = this.cameraService.getCameraById(id);
-        return  Result.success("查询成功!",orderInfo);
+        CameraVO info = this.cameraService.getCameraById(id);
+        return  Result.success("查询成功!",info);
     }
 
     @PostMapping("/deleteCamera/{id}")

+ 55 - 0
src/main/java/com/iden/bms/controller/CommunityController.java

@@ -3,6 +3,7 @@ package com.iden.bms.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.iden.bms.service.CommunityService;
 import com.iden.common.annotation.Permission;
+import com.iden.common.exceltool.MultipartFileToFile;
 import com.iden.common.exception.BDException;
 import com.iden.common.logaspect.LogAnnotation;
 import com.iden.common.logaspect.OperateType;
@@ -19,8 +20,10 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -90,6 +93,58 @@ public class CommunityController {
         }
     }
 
+    /**
+     * 导出列表
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "导出Excel")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "district", value = "所属区域"),
+            @ApiImplicitParam(paramType = "query", name = "subdistrict", value = "所属街道"),
+            @ApiImplicitParam(paramType = "query", name = "name", value = "小区名称")
+    })
+    @GetMapping({"/exportToExcel"})
+    @LogAnnotation(
+            type = OperateType.EXPORT,
+            moduleName = "导出小区列表",
+            description = "导出小区列表"
+    )
+    public void exportToExcel(HttpServletRequest request,@RequestHeader(name = "token", required = true) String token,
+                       @RequestParam(value = "district", required = false) String district,
+                       @RequestParam(value = "subdistrict", required = false) String subdistrict,
+                       @RequestParam(value = "name", required = false) String name,
+                       HttpServletResponse response) {
+        try {
+            UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
+            this.communityService.exportToExcel(district,subdistrict,name,loginUser ,response);
+        } catch (BDException e) {
+            log.error("导出小区列表出现异常",e);
+        } catch (Exception e) {
+            log.error("小区管理: 导出小区列表出现异常",e);
+        }
+    }
+
+    @ApiOperation(value = "导入Excel")
+    @PostMapping(value = "/importWithExcel",  headers = "content-type=multipart/form-data")
+    public Result<Object> importWithExcel(@RequestParam(value = "file") MultipartFile multipartFile) throws Exception {
+        try {
+            boolean flag = communityService.importWithExcel(multipartFile);
+            if(flag){
+                return  Result.success("导入成功!");
+            } else {
+                return Result.error("导入失败");
+            }
+
+        } catch (BDException e) {
+            log.error("导入小区列表出现异常",e);
+            return Result.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("小区管理: 导入小区列表出现异常",e);
+            return Result.error("导入小区失败!");
+        }
+    }
+
     @PostMapping("/addCommunity")
     @ApiOperation(value = "新增小区")
     @LogAnnotation(

+ 0 - 2
src/main/java/com/iden/bms/controller/CrowdController.java

@@ -39,8 +39,6 @@ public class CrowdController {
     @Autowired
     private CrowdService crowdService;
 
-
-
     @GetMapping("/listCrowd")
     @ApiOperation(value = "人群列表分页 ")
     @ApiImplicitParams(value = {

+ 141 - 0
src/main/java/com/iden/bms/service/CameraService.java

@@ -2,23 +2,43 @@ package com.iden.bms.service;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.iden.common.entity.IdenCamera;
+import com.iden.common.entity.IdenCommunity;
 import com.iden.common.enums.CameraTypeEnum;
 import com.iden.common.enums.ConnectStatusEnum;
+import com.iden.common.exceltool.CommonExcelParse;
+import com.iden.common.exceltool.ExcelUtil;
+import com.iden.common.exceltool.IExcelParser;
+import com.iden.common.exceltool.MultipartFileToFile;
 import com.iden.common.service.IdenCameraService;
+import com.iden.common.service.IdenCommunityService;
 import com.iden.common.util.MyBeanUtils;
 import com.iden.common.vo.CameraVO;
 import com.iden.common.vo.PageReqVO;
 import com.iden.common.vo.UserLoginedConvertVO;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -33,6 +53,8 @@ public class CameraService {
 
     @Resource
     private IdenCameraService idenCameraService;
+    @Resource
+    private IdenCommunityService idenCommunityService;
 
     public Integer countCamera(String type, String district, String subdistrict, Long communityId, String name, UserLoginedConvertVO loginUser) {
         QueryWrapper<IdenCamera> queryWrapper = new QueryWrapper<>();
@@ -68,6 +90,13 @@ public class CameraService {
                     BeanUtils.copyProperties(item,resVO);
                     resVO.setStatusName(ConnectStatusEnum.getValueToName(resVO.getCode()));
                     resVO.setTypeName(CameraTypeEnum.getValueToName(resVO.getType()));
+                    Long communityId1 = resVO.getCommunityId();
+                    if(communityId1 != null){
+                        IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId1);
+                        if(idenCommunity != null ){
+                            resVO.setCommunityName(idenCommunity.getName());
+                        }
+                    }
                     list.add(resVO);
                 });
                 results.setRecords(list);
@@ -141,4 +170,116 @@ public class CameraService {
 
     }
 
+    public void exportToExcel(String type, String district, String subdistrict, Long communityId, String name, UserLoginedConvertVO loginUser, HttpServletResponse response)  throws Exception {
+        QueryWrapper<IdenCamera> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().like(StrUtil.isNotEmpty(name),IdenCamera::getName,name)
+                .eq(StrUtil.isNotEmpty(district),IdenCamera::getDistrict,district)
+                .eq(StrUtil.isNotEmpty(subdistrict),IdenCamera::getSubdistrict,subdistrict)
+                .eq(communityId != null,IdenCamera::getCommunityId,communityId)
+                .eq(StrUtil.isNotEmpty(type),IdenCamera::getType,type)
+                .orderByAsc(IdenCamera::getCode);
+        List<IdenCamera>  list = this.idenCameraService.list(queryWrapper);
+        List<CameraVO> records = new ArrayList<>();
+        if (CollUtil.isNotEmpty(list)) {
+            list.forEach(item->{
+                CameraVO vo = new CameraVO();
+                BeanUtil.copyProperties(item, vo);
+                vo.setStatusName(ConnectStatusEnum.getValueToName(vo.getCode()));
+                vo.setTypeName(CameraTypeEnum.getValueToName(vo.getType()));
+                Long communityId1 = vo.getCommunityId();
+                if(communityId1 != null){
+                    IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId1);
+                    if(idenCommunity != null ){
+                        vo.setCommunityName(idenCommunity.getName());
+                    }
+                }
+                records.add(vo);
+            });
+        }
+
+        InputStream excelTemplateIs = null;
+        try {
+            response.reset(); // 非常重要
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+            final String fileName = URLEncoder.encode("摄像头表", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + System.currentTimeMillis() + ".xlsx");
+
+            // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
+            // {} 代表普通变量 {.} 代表是list的变量
+
+            excelTemplateIs = this.getClass().getResourceAsStream("/static/template/export/IdenCameraExportTemplate.xlsx");
+
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(excelTemplateIs).build();
+            WriteSheet writeSheet = EasyExcel.writerSheet("摄像头表").build();
+            // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
+            // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
+            // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
+            // 如果数据量大 list不是最后一行 参照另一个
+            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build();
+            excelWriter.fill(records, fillConfig, writeSheet);
+
+            excelWriter.finish();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(excelTemplateIs != null){
+                try {
+                    excelTemplateIs.close();
+                } catch (IOException ioe) {
+                    ioe.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 导入
+     * @param multipartFile
+     * @return
+     * @throws Exception
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean importWithExcel(String type,MultipartFile multipartFile) throws Exception {
+        if(StringUtils.isEmpty(type)){
+            return false;
+        }
+        final File excelFile = MultipartFileToFile.multipartFileToFile(multipartFile);
+        final Workbook workbook = ExcelUtil.chooseWorkbook(excelFile);
+        final Sheet sheet = workbook.getSheetAt(0);
+        final IExcelParser excelParser = new CommonExcelParse();
+        final List<CameraVO> listParser = excelParser.parse(sheet, new CameraVO());
+        if (CollectionUtil.isNotEmpty(listParser)) {
+            List<IdenCamera> listDb = new ArrayList<>();
+            MultipartFileToFile.delteTempFile(excelFile);
+            for(CameraVO tmpObj : listParser){
+                if(StringUtils.isEmpty(tmpObj.getCode())
+                        || StringUtils.isEmpty(tmpObj.getName())
+                        || StringUtils.isEmpty(tmpObj.getDistrict())
+                        || StringUtils.isEmpty(tmpObj.getSubdistrict())
+                        || StringUtils.isEmpty(tmpObj.getCommunityName())
+                        || StringUtils.isEmpty(tmpObj.getLatitude())
+                        || StringUtils.isEmpty(tmpObj.getLongitude())){
+                    continue;
+                }
+                final IdenCamera obj =  new IdenCamera();
+                BeanUtils.copyProperties(tmpObj,obj);
+                String communityName = tmpObj.getCommunityName();
+                QueryWrapper<IdenCommunity> queryWrapper = new QueryWrapper<>();
+                queryWrapper.lambda().eq(IdenCommunity::getName,communityName);
+                IdenCommunity idenCommunity = this.idenCommunityService.getOne(queryWrapper);
+                if(idenCommunity != null){
+                    obj.setCommunityId(idenCommunity.getId());
+                } else {
+                    continue;
+                }
+                obj.setType(type);
+                listDb.add(obj);
+            }
+            return this.idenCameraService.saveBatch(listDb);
+        }
+
+        return false;
+    }
 }

+ 109 - 3
src/main/java/com/iden/bms/service/CommunityService.java

@@ -2,25 +2,42 @@ package com.iden.bms.service;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.iden.common.entity.IdenCommunity;
 
+import com.iden.common.exceltool.CommonExcelParse;
+import com.iden.common.exceltool.IExcelParser;
+import com.iden.common.exceltool.MultipartFileToFile;
 import com.iden.common.service.IdenCommunityService;
+import com.iden.common.exceltool.ExcelUtil;
 import com.iden.common.util.MyBeanUtils;
 import com.iden.common.vo.CommunityVO;
 import com.iden.common.vo.PageReqVO;
 import com.iden.common.vo.UserLoginedConvertVO;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.*;
 
 /**
  *
@@ -69,11 +86,100 @@ public class CommunityService {
             return results;
     }
 
+    public void exportToExcel(String district, String subdistrict, String name, UserLoginedConvertVO loginUser, HttpServletResponse response)  throws Exception {
+        QueryWrapper<IdenCommunity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().like(StrUtil.isNotEmpty(name),IdenCommunity::getName,name)
+                .eq(StrUtil.isNotEmpty(district),IdenCommunity::getDistrict,district)
+                .eq(StrUtil.isNotEmpty(subdistrict),IdenCommunity::getSubdistrict,subdistrict)
+                .orderByAsc(IdenCommunity::getCode);
+        List<IdenCommunity>  list = this.idenCommunityService.list(queryWrapper);
+        List<CommunityVO> records = new ArrayList<>();
+        if (CollUtil.isNotEmpty(list)) {
+            list.forEach(item->{
+                CommunityVO vo = new CommunityVO();
+                BeanUtil.copyProperties(item, vo);
+                records.add(vo);
+            });
+        }
+
+        InputStream excelTemplateIs = null;
+        try {
+            response.reset(); // 非常重要
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+            final String fileName = URLEncoder.encode("小区表", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + System.currentTimeMillis() + ".xlsx");
+
+            // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
+            // {} 代表普通变量 {.} 代表是list的变量
+
+            excelTemplateIs = this.getClass().getResourceAsStream("/static/template/export/IdenCommunityExportTemplate.xlsx");
+
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(excelTemplateIs).build();
+            WriteSheet writeSheet = EasyExcel.writerSheet("小区表").build();
+            // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
+            // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
+            // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
+            // 如果数据量大 list不是最后一行 参照另一个
+            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build();
+            excelWriter.fill(records, fillConfig, writeSheet);
+
+            excelWriter.finish();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(excelTemplateIs != null){
+                try {
+                    excelTemplateIs.close();
+                } catch (IOException ioe) {
+                    ioe.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 导入
+     * @param multipartFile
+     * @return
+     * @throws Exception
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean importWithExcel(MultipartFile multipartFile) throws Exception {
+        final File excelFile = MultipartFileToFile.multipartFileToFile(multipartFile);
+        final Workbook workbook = ExcelUtil.chooseWorkbook(excelFile);
+        final Sheet sheet = workbook.getSheetAt(0);
+        final IExcelParser excelParser = new CommonExcelParse();
+        final List<CommunityVO> listParser = excelParser.parse(sheet, new CommunityVO());
+        if (CollectionUtil.isNotEmpty(listParser)) {
+            List<IdenCommunity> listDb = new ArrayList<>();
+            MultipartFileToFile.delteTempFile(excelFile);
+            for(CommunityVO tmpObj : listParser){
+                if(StringUtils.isEmpty(tmpObj.getCode())
+                        || StringUtils.isEmpty(tmpObj.getName())
+                        || StringUtils.isEmpty(tmpObj.getDistrict())
+                        || StringUtils.isEmpty(tmpObj.getSubdistrict())){
+                    continue;
+                }
+                final IdenCommunity obj =  new IdenCommunity();
+                BeanUtils.copyProperties(tmpObj,obj);
+                obj.setCreateTime(new Date());
+                listDb.add(obj);
+            }
+            return this.idenCommunityService.saveBatch(listDb);
+        }
+
+        return false;
+    }
+
+
     /**
      * 删除小区
      * @param id
      * @return
      */
+    @Transactional(rollbackFor = Exception.class)
     public boolean deleteById(Long id){
         return this.idenCommunityService.removeById(id);
     }

+ 2 - 0
src/main/java/com/iden/bms/service/CrowdService.java

@@ -2,7 +2,9 @@ package com.iden.bms.service;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+
 import cn.hutool.core.util.StrUtil;
+
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

+ 48 - 0
src/main/java/com/iden/common/entity/IdenCity.java

@@ -0,0 +1,48 @@
+package com.iden.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 市表(IdenCity)实体类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:40
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("iden_city")
+@ApiModel(value = "市表", description = "")
+public class IdenCity implements Serializable {
+    private static final long serialVersionUID = 661706295847431306L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("市名称")
+    @TableField("NAME")
+    private String name;
+
+
+    @ApiModelProperty("省名称")
+    @TableField("PROVINCE")
+    private String province;
+
+
+}

+ 53 - 0
src/main/java/com/iden/common/entity/IdenDistrict.java

@@ -0,0 +1,53 @@
+package com.iden.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 区域表(IdenDistrict)实体类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("iden_district")
+@ApiModel(value = "区域表", description = "")
+public class IdenDistrict implements Serializable {
+    private static final long serialVersionUID = -50659674990115962L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("区名称")
+    @TableField("NAME")
+    private String name;
+
+
+    @ApiModelProperty("市名称")
+    @TableField("CITY")
+    private String city;
+
+
+    @ApiModelProperty("省名称")
+    @TableField("PROVINCE")
+    private String province;
+
+
+}

+ 43 - 0
src/main/java/com/iden/common/entity/IdenProvince.java

@@ -0,0 +1,43 @@
+package com.iden.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 省表(IdenProvince)实体类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("iden_province")
+@ApiModel(value = "省表", description = "")
+public class IdenProvince implements Serializable {
+    private static final long serialVersionUID = -54327652128366112L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("省名称")
+    @TableField("NAME")
+    private String name;
+
+
+}

+ 58 - 0
src/main/java/com/iden/common/entity/IdenSubdistrict.java

@@ -0,0 +1,58 @@
+package com.iden.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 区域表(IdenSubdistrict)实体类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("iden_subdistrict")
+@ApiModel(value = "区域表", description = "")
+public class IdenSubdistrict implements Serializable {
+    private static final long serialVersionUID = -10316883561234562L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("街道名称")
+    @TableField("NAME")
+    private String name;
+
+
+    @ApiModelProperty("区名称")
+    @TableField("DISTRICT")
+    private String district;
+
+
+    @ApiModelProperty("市名称")
+    @TableField("CITY")
+    private String city;
+
+
+    @ApiModelProperty("省名称")
+    @TableField("PROVINCE")
+    private String province;
+
+
+}

+ 358 - 0
src/main/java/com/iden/common/exceltool/AbstractExcelParser.java

@@ -0,0 +1,358 @@
+package com.iden.common.exceltool;
+
+
+import com.iden.common.util.SpringContextHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.eval.ErrorEval;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.exceltools
+ * @ClassName: AbstractExcelParser
+ * @Description:
+ * @Author: kangjian
+ * @CreateDate: 2020/1/12 9:32
+ * @Version: 1.0
+ */
+@Slf4j
+public class AbstractExcelParser {
+
+    //起始行,默认从第一行开始
+    protected int firstRowNum = 0;
+    //定义数据总行数减去的行数
+    protected int reduceRowNum = 0;
+
+    protected Map<String, FormatType> formatColMap = new Hashtable<String, FormatType>();
+
+    public static enum FormatType {
+        ReplaceLineToDot
+    }
+
+    /**
+     * 获取Excel的列头
+     *
+     * @param sheet
+     * @return
+     */
+    protected List<String> getColumnHeader(Sheet sheet) {
+        // 定义首行
+        Row headerRow = null;
+        // 定义列数
+        int cellCount = 0;
+        // 获取sheet的首行 并且 行的列数少于4列 或者 4列中有任意一列为空值,跳过不算为表头
+        for (; firstRowNum < sheet.getLastRowNum(); firstRowNum++) {
+            headerRow = sheet.getRow(firstRowNum);
+            if (headerRow == null) {
+                continue;
+            }
+
+            // 设置列数
+            cellCount = headerRow.getLastCellNum();
+            if (cellCount < 2) {
+                continue;
+            } else {
+                if (headerRow.getCell(0) == null || headerRow.getCell(0).toString() == ""||headerRow.getCell(cellCount-1) == null || headerRow.getCell(cellCount-1).toString() == "") {
+                    continue;
+                } else {
+                    break;
+                }
+            }
+        }
+        if (headerRow == null) {
+            return null;
+        }
+        // 生成列
+        List<String> headers = new ArrayList<String>();
+        for (int hi = headerRow.getFirstCellNum(); hi < cellCount; hi++) {
+            String header = headerRow.getCell(hi).toString();
+            if (!header.equals("")) {
+                headers.add(header);
+
+            }
+        }
+        return headers;
+    }
+
+    /**
+     * 功能描述:
+     *
+     * @param sheet
+     * @return: java.util.List<java.lang.String>
+     * @exception:获取标题行,去掉标题行中的空白字符
+     * @author: cqa
+     * @date: 2019/4/15 15:50
+     */
+    protected List<String> getColumnHeaderWithoutBlank(Sheet sheet) {
+
+        // 定义首行
+        Row headerRow = null;
+        // 定义列数
+        int cellCount = 0;
+        // 获取sheet的首行 并且 行的列数少于4列 或者 4列中有任意一列为空值,跳过不算为表头
+        for (; firstRowNum < sheet.getLastRowNum(); firstRowNum++) {
+            headerRow = sheet.getRow(firstRowNum);
+            if (headerRow == null) {
+                continue;
+            }
+            // 设置列数
+            cellCount = headerRow.getLastCellNum();
+            if (cellCount < 2) {
+                continue;
+            } else {
+                if (headerRow.getCell(0) == null || headerRow.getCell(0).toString() == "") {
+                    continue;
+                } else {
+                    break;
+                }
+            }
+        }
+        if (headerRow == null) {
+            return null;
+        }
+        // 生成列
+        List<String> headers = new ArrayList<String>();
+        for (int hi = headerRow.getFirstCellNum(); hi < cellCount; hi++) {
+            String header = headerRow.getCell(hi).getStringCellValue().replaceAll("\\s+", "");
+            if (!header.equals("")) {
+                headers.add(header);
+
+            }
+        }
+        return headers;
+    }
+
+    protected String convertVal(Cell cell) {
+        String cellValue = "";
+        DataFormatter _formatter = new DataFormatter();
+        if (cell != null) {
+            switch (cell.getCellType()) {
+                case Cell.CELL_TYPE_STRING:
+                    cellValue = cell.getRichStringCellValue().getString().trim();
+                    break;
+                case Cell.CELL_TYPE_NUMERIC:
+                    double contentNumber = cell.getNumericCellValue();
+                    if (contentNumber - (int) contentNumber < Double.MIN_VALUE) { // 是否为int型
+                        cellValue = Integer.toString((int) contentNumber);
+                    } else {// 是否为double型
+                        cellValue = getnumberCell(cell);
+                    }
+                    //日期
+                    if (DateUtil.isCellDateFormatted(cell)) {
+                        Date theDate = cell.getDateCellValue();
+                        SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        cellValue = dff.format(theDate);
+                    }
+
+                    break;
+                case Cell.CELL_TYPE_BOOLEAN:
+                    cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
+                    break;
+                case Cell.CELL_TYPE_FORMULA:// 公式
+                    switch (cell.getCachedFormulaResultType()) {
+                        case Cell.CELL_TYPE_STRING:
+                            RichTextString str = cell.getRichStringCellValue();
+                            if (str != null && str.length() > 0) {
+                                return str.toString();
+                            }
+                        case Cell.CELL_TYPE_NUMERIC:
+                            CellStyle style = cell.getCellStyle();
+                            if (style == null) {
+                                return cell.getNumericCellValue() + "";// double转成String
+                            } else {
+                                return _formatter.formatRawCellContents(cell.getNumericCellValue(), style.getDataFormat(), style.getDataFormatString());
+                            }
+                        case Cell.CELL_TYPE_BOOLEAN:
+                            return cell.getBooleanCellValue() ? "true" : "false";// boolean
+                        // 转成String
+                        case Cell.CELL_TYPE_ERROR:
+                            return ErrorEval.getText(cell.getErrorCellValue());
+
+                    }
+                default:
+                    cellValue = "";
+            }
+        }
+        return cellValue;
+    }
+
+    /**
+     * 公共的导入excel方法
+     *
+     * @param sheet      文件
+     * @param obj       实体类
+     * @return
+     * @throws IOException
+     */
+    public <T> List<T> importBaseExcel(Sheet sheet, T obj){
+        List<T> result = new ArrayList<>();
+        try {
+            //缓存
+            List<ColInfo> headertocolumn = ExcelUtil.getBeanColbyOder(obj);
+            //读取文件内容
+            Workbook workbook = sheet.getWorkbook();
+//            //获取工作表
+//            Sheet sheet = workbook.getSheet(sheetname);
+            List<String> headers = this.getColumnHeader(sheet);
+            FormulaEvaluator ife = workbook.getCreationHelper()
+                    .createFormulaEvaluator();
+            // 最后一列的标号 即总的行数
+            int ri = firstRowNum + 1;
+            // 定义列数
+            int cellCount = 0;
+            cellCount = headers.size();
+            String classname = obj.getClass().getName();
+            Class<?> clazz = Class.forName(classname);
+            // 循环table赋值
+            for (; ri <= sheet.getLastRowNum() - reduceRowNum; ri++)// 循环行 (使用小于等于 <= 否则最后一行读不到)
+            {
+                Row row = sheet.getRow(ri);
+                if (row == null) {
+                    continue;
+                }
+                //可以根据该类名生成Java对象
+                T tmp = (T) clazz.newInstance();
+                Map<String, String> rowData = new Hashtable<String, String>();
+                //记录空行,如果val==""则为空行
+                //可以根据该类名生成Java对象
+                for (int rj = row.getFirstCellNum(); rj < cellCount; rj++)// 循环列
+                {
+                    Cell cell = row.getCell(rj);
+                    if (cell != null
+                            && cell.getCellStyle().toString().toUpperCase() == "FORMULA") {
+                        ife.evaluateInCell(cell);// 加一列计算,如果该列使用了公式或者D2+F2*1000-1
+                        // 这种自定义算法, 就需要取值而不是取文本
+                    }
+                    String headername = headers.get(rj).trim();
+                    //获取
+                    String column = getcolname(headertocolumn,headername);
+                    if (column != null) {
+                        String colhandlebysql=getcolsbysql(headertocolumn,column);
+                        String value = getCellValue(cell);
+                        //判断Excel导入列,如果需要sql转换
+                        if(!StringUtils.isEmpty(colhandlebysql)){
+                            value=convertValBysql(colhandlebysql,value);
+                        }
+                        ExcelUtil.setFileValue(tmp,value,column);
+                    }
+                }
+                result.add(tmp);
+            }
+        } catch (Exception e) {
+            log.error("Excel导入异常:", e);
+        }
+        return result;
+    }
+
+    /**
+     * 处理sql值转换
+     * @param colhandlebysql
+     * @param value
+     * @return
+     */
+    private String convertValBysql(String colhandlebysql, String value) {
+        DbHelper dbHelper= SpringContextHolder.getBean(DbHelper.class);
+        String result=dbHelper.selectByExceltools(colhandlebysql,value);
+        return result;
+    }
+
+    /**
+     * 特殊列需要转换的列,进行sql获取
+     * @param colInfos
+     * @param column
+     * @return
+     */
+    private String getcolsbysql(List<ColInfo> colInfos, String column) {
+        String sql="";
+        for(ColInfo colInfo:colInfos)
+        {
+            if(colInfo.getColname().equals(column))
+            {
+                sql=colInfo.getColhandlebysql();
+                break;
+            }
+        }
+
+        return sql;
+    }
+
+    /**
+     * 格式化转换Excel
+     *
+     * @param cell
+     * @return
+     */
+    private String getCellValue(Cell cell) {
+        String val = "";
+        if (cell != null) {
+            val = replaceContent(convertVal(cell));
+        }
+        return val;
+    }
+
+    /**
+     * 根据列集合返回字段名称
+     * @param colInfos
+     * @param displayname
+     * @return
+     */
+    private String getcolname(List<ColInfo> colInfos,String displayname){
+        String colname="";
+        for(ColInfo colInfo:colInfos)
+        {
+            if(colInfo.getDisplayname().equals(displayname))
+            {
+                colname=colInfo.getColname();
+                break;
+            }
+        }
+        return colname;
+    }
+
+    /**
+     * 将其它分隔符替换为半角逗号。如:、,;;
+     *
+     * @param content 要替换的内容
+     * @return
+     */
+    protected String replaceContent(String content) {
+        if (content.equals("")) {
+            return "";
+        }
+
+        content = content.trim();
+        content = content.replace("–", "-");
+        content = content.replace("-", "-");
+        content = content.replace(":", ":");
+        content = content.replace("、", ",");
+        content = content.replace(",", ",");
+        content = content.replace(", ,", ",");
+        content = content.replace(';', ',');
+        content = content.replace("\r\n", ",");
+        content = content.replace("\n", ",");
+        content = content.replace(';', ',');
+        content = content.replace("?", "");
+        content = content.replace("  ", "");
+        content = content.replace("?", "");
+        content = content.replace(" ", "");
+        content = content.endsWith(",") ? content.substring(0,
+                content.length() - 1) : content;
+        return content;
+    }
+
+    protected String getnumberCell(Cell cell) {
+        String content = (new BigDecimal(String.valueOf(cell.getNumericCellValue()))).toString();
+        if (content.toUpperCase().contains("E")) {
+            DecimalFormat df = new DecimalFormat("0");
+            content = df.format(cell.getNumericCellValue());
+        }
+        return content;
+    }
+}

+ 24 - 0
src/main/java/com/iden/common/exceltool/ColInfo.java

@@ -0,0 +1,24 @@
+package com.iden.common.exceltool;
+
+import lombok.Data;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.exceltools
+ * @ClassName: ColInfo
+ * @Description:
+ * @Author: kangjian
+ * @CreateDate: 2020/1/13 15:19
+ * @Version: 1.0
+ */
+@Data
+public class ColInfo {
+    //对应列信息
+    private String colname;
+    //Excel中文列信息
+    private String displayname;
+    //导出Excel列的顺序
+    private int index;
+    //待翻译的字段
+    private String colhandlebysql;
+}

+ 38 - 0
src/main/java/com/iden/common/exceltool/CommonExcelParse.java

@@ -0,0 +1,38 @@
+package com.iden.common.exceltool;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
+import org.apache.poi.ss.usermodel.Sheet;
+
+import javax.sql.DataSource;
+import java.util.List;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.exceltools
+ * @ClassName: AbstractExcelParser
+ * @Description:
+ * @Author: kangjian
+ * @CreateDate: 2020/1/12 9:32
+ * @Version: 1.0
+ */
+@Slf4j
+public class CommonExcelParse extends AbstractExcelParser implements IExcelParser<T> {
+    @Override
+    public <T> List<T> parse(Sheet sheet, DataSource ds, T obj) {
+        List<T> result= null;
+        try {
+            result = super.importBaseExcel(sheet,obj);
+        } catch (Exception e) {
+            log.error("",e);
+        }
+        return result;
+    }
+
+    @Override
+    public <T> List<T> parse(Sheet sheet, T obj) {
+        List<T> result=this.parse(sheet,null,obj);
+        return result;
+    }
+}

+ 65 - 0
src/main/java/com/iden/common/exceltool/DbHelper.java

@@ -0,0 +1,65 @@
+package com.iden.common.exceltool;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.common.core.exceltools
+ * @ClassName: DbHelper
+ * @Description: 添加注解sql方法,为了简化方法,故暂时使用JDBC的方式
+ * @Author: kangjian
+ * @CreateDate: 2020/2/26 19:57
+ * @Version: 1.0
+ */
+@Service
+@Slf4j
+public class DbHelper {
+
+    @Autowired
+    private DataSource dataSource;
+
+    public String selectByExceltools(String colsql,String value){
+        Connection conn = null;
+        PreparedStatement stmt = null;
+        ResultSet rs = null;
+        String oldValue;
+        try {
+            conn = dataSource.getConnection();
+            stmt = conn.prepareStatement(colsql);
+            stmt.setString(1, value);
+            rs = stmt.executeQuery();
+            if (!rs.next()) {
+                //没有此类型数据,需要初始化
+                return value;
+            }
+            oldValue = rs.getString(1);
+        }catch (SQLException e) {
+            oldValue=value;
+            log.error("",e);
+        } finally {
+            closeQuietly(rs);
+            closeQuietly(stmt);
+            closeQuietly(conn);
+        }
+        return oldValue;
+    }
+
+    private static void closeQuietly(AutoCloseable closeable) {
+        if (null != closeable) {
+            try {
+                closeable.close();
+            } catch (Throwable e) {
+                //Ignore
+            }
+        }
+    }
+
+}

+ 283 - 0
src/main/java/com/iden/common/exceltool/ExcelUtil.java

@@ -0,0 +1,283 @@
+package com.iden.common.exceltool;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.util.exceltools
+ * @ClassName: ExcelUtil
+ * @Description:
+ * @Author: kangjian
+ * @CreateDate: 2020/1/12 9:21
+ * @Version: 1.0
+ */
+@Slf4j
+public class ExcelUtil {
+    /**
+     * 根据文件选择excel版本
+     * @return
+     * @throws Exception
+     */
+    public static Workbook chooseWorkbook(File file) throws Exception{
+        Workbook workbook=null;
+        if (!file.exists()) {
+            return null;
+        }
+        try {
+            if (file.getName().toLowerCase().endsWith(ExcelVersion.XLS.getFileSuffix())) {
+                workbook= new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(file)));
+            } else if (file.getName().toLowerCase().endsWith(ExcelVersion.XLSX.getFileSuffix())) {
+                workbook= new XSSFWorkbook(new FileInputStream(file));
+            }
+        }catch (Exception e)
+        {
+            log.error("",e);
+        }
+        return workbook;
+    }
+
+
+    /**
+     * 根据选择生成Excel版本类型
+     * @return
+     * @throws Exception
+     */
+    public static Workbook createWorkbook(ExcelVersion excelVersion){
+        Workbook workbook=null;
+        try {
+            if (excelVersion.equals(ExcelVersion.XLS)) {
+                workbook= new HSSFWorkbook();
+            } else if (excelVersion.equals(ExcelVersion.XLSX)) {
+                workbook= new XSSFWorkbook();
+            }
+        }catch (Exception e)
+        {
+            log.error("",e);
+        }
+        return workbook;
+    }
+
+    /**
+     * 缓存bean中,预定义Excel列头和bean中属性的关系,并进行排序
+     * @param obj
+     * @param <T>
+     * @return
+     */
+    public static <T> List<ColInfo> getBeanColbyOder(T obj) throws IllegalAccessException {
+        Class clazz = obj.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+        List<ColInfo> list=new ArrayList<>();
+        for (Field f : fields) {
+            ColInfo colInfo=new ColInfo();
+            f.setAccessible(true);
+            //判断是否有FieldToDbColumn注解没有则舍弃
+            HeaderToColumn anno = f.getAnnotation(HeaderToColumn.class);
+            //存储bean中配置excel表头信息
+            if(anno!=null&&anno.header()!=null)
+            {
+                colInfo.setColname(f.getName());
+                colInfo.setDisplayname(anno.header().trim());
+                colInfo.setIndex(anno.index());
+                colInfo.setColhandlebysql(anno.colhandlebysql());
+                list.add(colInfo);
+            }
+        }
+
+        Collections.sort(list, new Comparator<ColInfo>() {
+            @Override
+            public int compare(ColInfo o1, ColInfo o2) {
+                int result=1;
+                if(o1.getIndex()>=o2.getIndex())
+                {
+                    result=0;
+                }
+                return result;
+            }
+        });
+
+        return list;
+    }
+
+    /**
+     * 缓存bean中,预定义Excel列头和bean中属性的关系
+     * @param obj
+     * @param <T>
+     * @return
+     */
+    public static <T> Map<String, String> getBeanColumntoHeader(T obj) throws IllegalAccessException {
+        Class clazz = obj.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+        Map<String,String> beantocolumn=new HashMap<>();
+        for (Field f : fields) {
+            f.setAccessible(true);
+            //判断是否有FieldToDbColumn注解没有则舍弃
+            HeaderToColumn anno = f.getAnnotation(HeaderToColumn.class);
+            //存储bean中配置excel表头信息
+            if(anno!=null&&anno.header()!=null)
+            {
+                beantocolumn.put(f.getName(),anno.header().trim());
+            }
+        }
+        return beantocolumn;
+    }
+
+    /**
+     * 根据类的泛型和bean的属性类型,动态赋值
+     * @param tmp
+     * @param value
+     * @param column
+     * @param <T>
+     * @throws NoSuchFieldException
+     * @throws IllegalAccessException
+     */
+    public static  <T> void setFileValue(T tmp,String value,String column) throws NoSuchFieldException, IllegalAccessException {
+        Field name = tmp.getClass().getDeclaredField(column);
+        name.setAccessible(true);
+        String type=name.getGenericType().toString();
+        log.info("type={}",type);
+        switch (type) {
+            case "char":
+            case "java.lang.Character":
+            case "class java.lang.String":
+                name.set(tmp, value);
+                break;
+            case "int":
+            case "class java.lang.Integer":
+                name.set(tmp, Integer.valueOf(value));
+                break;
+            case "float":
+                name.set(tmp, Float.valueOf(value));
+                break;
+            case "double":
+                name.set(tmp, Double.valueOf(value));
+                break;
+            case "class java.lang.Double":
+                name.set(tmp, Double.valueOf(value));
+                break;
+            case "class java.lang.Float":
+                name.set(tmp, Float.valueOf(value));
+                break;
+            case "class java.lang.Long":
+                name.set(tmp, Long.valueOf(value));
+                break;
+            case "class java.lang.Short":
+                name.set(tmp, Short.valueOf(value));
+                break;
+            case "class java.math.BigDecimal":
+                if (value==""){
+                    name.set(tmp, new BigDecimal("0.0"));
+                    break;
+                }else {
+                    name.set(tmp, Double.valueOf(value));
+                    break;}
+            case "class java.time.LocalDateTime":
+                if (value==""){
+                    name.set(tmp, LocalDateTime.now());
+                    break;
+                }else {
+                LocalDateTime stringToLocalDateTime =
+                        LocalDateTime.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                name.set(tmp, stringToLocalDateTime);
+                break;}
+            case "class java.time.LocalDate":
+                LocalDate stringToLocalDate =
+                        LocalDate.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                name.set(tmp, stringToLocalDate);
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * 根据类的泛型和bean的属性类型,动态赋值
+     * @param t
+     * @param value
+     * @param column
+     * @param <T>
+     * @throws NoSuchFieldException
+     * @throws IllegalAccessException
+     */
+    public static  <T> void setCellValue(T t, Cell cell, Object value, String column) throws NoSuchFieldException, IllegalAccessException {
+
+        Object obj=null;
+        Field name = t.getClass().getDeclaredField(column);
+        name.setAccessible(true);
+        String type=name.getGenericType().toString();
+        log.info("type={}",type);
+        switch (type) {
+            case "char":
+            case "java.lang.Character":
+            case "class java.lang.String":
+                cell.setCellValue((String) value);
+                break;
+            case "int":
+            case "class java.lang.Integer":
+            case "class java.lang.Long":
+                cell.setCellValue((Integer) value);
+                break;
+            case "float":
+                cell.setCellValue((Double) value);
+                break;
+            case "double":
+                cell.setCellValue((Double) value);
+                break;
+            case "class java.lang.Double":
+                cell.setCellValue((Double) value);
+                break;
+            case "class java.lang.Float":
+                cell.setCellValue((Double) value);
+                break;
+            case "class java.lang.Short":
+                cell.setCellValue((Double) value);
+                break;
+            case "class java.math.BigDecimal":
+                cell.setCellValue((Double) value);
+                break;
+            default:
+                break;
+        }
+    }
+
+    public static CellStyle getHeaderCellStyle(Workbook wb){
+        CellStyle headerStyle = wb.createCellStyle();
+  //      headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+  //      headerStyle.setFillPattern(IndexedColors.AUTOMATIC.index);
+        headerStyle.setFillForegroundColor(IndexedColors.AQUA.index);
+        headerStyle.setFillBackgroundColor(IndexedColors.GREEN.index);
+        Font headerFont = wb.createFont();
+        headerFont.setFontHeightInPoints((short) 14);
+ //       headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+        headerFont.setFontName("黑体");
+        headerStyle.setFont(headerFont);
+        return headerStyle;
+    }
+
+    public static CellStyle getCellStyle(Workbook wb){
+        CellStyle headerStyle = wb.createCellStyle();
+    //    headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+        // 设置边框颜色
+        headerStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.index);
+        headerStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.index);
+        Font headerFont = wb.createFont();
+        headerFont.setFontHeightInPoints((short) 14);
+//        headerFont.setBoldweight(HSSFFont.COLOR_NORMAL);
+        headerFont.setFontName("黑体");
+        headerStyle.setFont(headerFont);
+        return headerStyle;
+    }
+
+}

+ 49 - 0
src/main/java/com/iden/common/exceltool/ExcelVersion.java

@@ -0,0 +1,49 @@
+package com.iden.common.exceltool;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.exceltools
+ * @ClassName: ExcelVersion
+ * @Description:
+ * @Author: kangjian
+ * @CreateDate: 2020/1/13 9:13
+ * @Version: 1.0
+ */
+@AllArgsConstructor
+@Getter
+public enum ExcelVersion {
+    /**
+     *03版本
+     */
+    XLS("2003", ".xls"),
+    /**
+     *03版本
+     */
+    XLSX("2007", ".xlsx"),
+    /**
+     *未知版本
+     */
+    UNKNOWN("unknown","未知");
+
+
+    private String version;
+    private String fileSuffix;
+
+    /**
+     * 根据Key得到枚举的Value
+     * Lambda表达式,比较判断(JDK 1.8)
+     *
+     * @param key
+     * @return
+     */
+    public static ExcelVersion getEnumType(String key) {
+        return Arrays.asList(ExcelVersion.values()).stream()
+                .filter(excelVersion -> excelVersion.getVersion().equals(key))
+                .findFirst().orElse(ExcelVersion.UNKNOWN);
+    }
+}

+ 25 - 0
src/main/java/com/iden/common/exceltool/HeaderToColumn.java

@@ -0,0 +1,25 @@
+package com.iden.common.exceltool;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.exceltools
+ * @ClassName: HeaderToColumn
+ * @Description:
+ * @Author: kangjian
+ * @CreateDate: 2020/1/12 9:59
+ * @Version: 1.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface HeaderToColumn {
+    String header() default "";
+    boolean handle() default false;
+    String colhandlebysql() default "";
+    int index() default 0;
+    String value() default "";
+}

+ 22 - 0
src/main/java/com/iden/common/exceltool/IExcelParser.java

@@ -0,0 +1,22 @@
+package com.iden.common.exceltool;
+
+import org.apache.poi.ss.usermodel.Sheet;
+
+import javax.sql.DataSource;
+import java.util.List;
+
+/**
+ * @ProjectName: zdkj
+ * @Package: com.zdkj.subway.st.util.exceltools
+ * @ClassName: IExcelParser
+ * @Description: 该接口为模板数据向标准数据管理中中间表数据导入是做数据转换的统一接口,针对不同
+ * 的模板数据实现不同的实现类, 接口提供一个抽象的方法
+ *  * {@link IExcelParser parse来解析不同业务文件的数据格式。
+ * @Author: kangjian
+ * @CreateDate: 2020/1/12 9:12
+ * @Version: 1.0
+ */
+public interface IExcelParser<T> {
+    public <T> List<T> parse(Sheet sheet, DataSource ds, T obj);
+    public <T> List<T> parse(Sheet sheet, T obj);
+}

+ 71 - 0
src/main/java/com/iden/common/exceltool/MultipartFileToFile.java

@@ -0,0 +1,71 @@
+package com.iden.common.exceltool;/**
+ * @author 陈博
+ * @date 2020/1/13 0013 17:03
+ */
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * @program: zdkj
+ *
+ * @description:
+ *
+ * @author: chen
+ *
+ * @create: 2020-01-13 17:03
+ **/
+public class MultipartFileToFile {
+    /**
+     * MultipartFile 转 File
+     *
+     * @param file
+     * @throws Exception
+     */
+    public static File multipartFileToFile(MultipartFile file) throws Exception {
+
+        File toFile = null;
+        if (file.equals("") || file.getSize() <= 0) {
+            file = null;
+        } else {
+            InputStream ins = null;
+            ins = file.getInputStream();
+            toFile = new File(file.getOriginalFilename());
+            inputStreamToFile(ins, toFile);
+            ins.close();
+        }
+        return toFile;
+    }
+
+    //获取流文件
+    private static void inputStreamToFile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 删除本地临时文件
+     * @param file
+     */
+    public static void delteTempFile(File file) {
+        if (file != null) {
+            File del = new File(file.toURI());
+            del.delete();
+        }
+    }
+
+}

+ 15 - 0
src/main/java/com/iden/common/mapper/IdenCityMapper.java

@@ -0,0 +1,15 @@
+package com.iden.common.mapper;
+
+import com.iden.common.entity.IdenCity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 市表(IdenCity)表数据库访问层
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:40
+ */
+public interface IdenCityMapper extends BaseMapper<IdenCity> {
+
+}

+ 15 - 0
src/main/java/com/iden/common/mapper/IdenDistrictMapper.java

@@ -0,0 +1,15 @@
+package com.iden.common.mapper;
+
+import com.iden.common.entity.IdenDistrict;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 区域表(IdenDistrict)表数据库访问层
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+public interface IdenDistrictMapper extends BaseMapper<IdenDistrict> {
+
+}

+ 15 - 0
src/main/java/com/iden/common/mapper/IdenProvinceMapper.java

@@ -0,0 +1,15 @@
+package com.iden.common.mapper;
+
+import com.iden.common.entity.IdenProvince;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 省表(IdenProvince)表数据库访问层
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+public interface IdenProvinceMapper extends BaseMapper<IdenProvince> {
+
+}

+ 15 - 0
src/main/java/com/iden/common/mapper/IdenSubdistrictMapper.java

@@ -0,0 +1,15 @@
+package com.iden.common.mapper;
+
+import com.iden.common.entity.IdenSubdistrict;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 区域表(IdenSubdistrict)表数据库访问层
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+public interface IdenSubdistrictMapper extends BaseMapper<IdenSubdistrict> {
+
+}

+ 14 - 0
src/main/java/com/iden/common/service/IdenCityService.java

@@ -0,0 +1,14 @@
+package com.iden.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.iden.common.entity.IdenCity;
+
+/**
+ * 市表(IdenCity)表服务接口
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:40
+ */
+public interface IdenCityService extends IService<IdenCity> {
+
+}

+ 14 - 0
src/main/java/com/iden/common/service/IdenDistrictService.java

@@ -0,0 +1,14 @@
+package com.iden.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.iden.common.entity.IdenDistrict;
+
+/**
+ * 区域表(IdenDistrict)表服务接口
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+public interface IdenDistrictService extends IService<IdenDistrict> {
+
+}

+ 14 - 0
src/main/java/com/iden/common/service/IdenProvinceService.java

@@ -0,0 +1,14 @@
+package com.iden.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.iden.common.entity.IdenProvince;
+
+/**
+ * 省表(IdenProvince)表服务接口
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+public interface IdenProvinceService extends IService<IdenProvince> {
+
+}

+ 14 - 0
src/main/java/com/iden/common/service/IdenSubdistrictService.java

@@ -0,0 +1,14 @@
+package com.iden.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.iden.common.entity.IdenSubdistrict;
+
+/**
+ * 区域表(IdenSubdistrict)表服务接口
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+public interface IdenSubdistrictService extends IService<IdenSubdistrict> {
+
+}

+ 18 - 0
src/main/java/com/iden/common/service/impl/IdenCityServiceImpl.java

@@ -0,0 +1,18 @@
+package com.iden.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iden.common.mapper.IdenCityMapper;
+import com.iden.common.entity.IdenCity;
+import com.iden.common.service.IdenCityService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 市表(IdenCity)表服务实现类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:40
+ */
+@Service
+public class IdenCityServiceImpl extends ServiceImpl<IdenCityMapper, IdenCity> implements IdenCityService {
+
+}

+ 18 - 0
src/main/java/com/iden/common/service/impl/IdenDistrictServiceImpl.java

@@ -0,0 +1,18 @@
+package com.iden.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iden.common.mapper.IdenDistrictMapper;
+import com.iden.common.entity.IdenDistrict;
+import com.iden.common.service.IdenDistrictService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 区域表(IdenDistrict)表服务实现类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+@Service
+public class IdenDistrictServiceImpl extends ServiceImpl<IdenDistrictMapper, IdenDistrict> implements IdenDistrictService {
+
+}

+ 18 - 0
src/main/java/com/iden/common/service/impl/IdenProvinceServiceImpl.java

@@ -0,0 +1,18 @@
+package com.iden.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iden.common.mapper.IdenProvinceMapper;
+import com.iden.common.entity.IdenProvince;
+import com.iden.common.service.IdenProvinceService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 省表(IdenProvince)表服务实现类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+@Service
+public class IdenProvinceServiceImpl extends ServiceImpl<IdenProvinceMapper, IdenProvince> implements IdenProvinceService {
+
+}

+ 18 - 0
src/main/java/com/iden/common/service/impl/IdenSubdistrictServiceImpl.java

@@ -0,0 +1,18 @@
+package com.iden.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iden.common.mapper.IdenSubdistrictMapper;
+import com.iden.common.entity.IdenSubdistrict;
+import com.iden.common.service.IdenSubdistrictService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 区域表(IdenSubdistrict)表服务实现类
+ *
+ * @author makejava
+ * @since 2021-12-30 19:06:41
+ */
+@Service
+public class IdenSubdistrictServiceImpl extends ServiceImpl<IdenSubdistrictMapper, IdenSubdistrict> implements IdenSubdistrictService {
+
+}

+ 85 - 0
src/main/java/com/iden/common/util/SpringContextHolder.java

@@ -0,0 +1,85 @@
+ 
+
+package com.iden.common.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author cui_com
+ * @date 2018/6/27
+ * Spring 工具类
+ */
+@Slf4j
+@Service
+@Lazy(false)
+public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
+
+	private static ApplicationContext applicationContext = null;
+
+	/**
+	 * 取得存储在静态变量中的ApplicationContext.
+	 */
+	public static ApplicationContext getApplicationContext() {
+		return applicationContext;
+	}
+
+	/**
+	 * 实现ApplicationContextAware接口, 注入Context到静态变量中.
+	 */
+	@Override
+	public void setApplicationContext(ApplicationContext applicationContext) {
+		SpringContextHolder.applicationContext = applicationContext;
+	}
+
+	/**
+	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T getBean(String name) {
+		return (T) applicationContext.getBean(name);
+	}
+
+	/**
+	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
+	 */
+	public static <T> T getBean(Class<T> requiredType) {
+		return applicationContext.getBean(requiredType);
+	}
+
+	/**
+	 * 清除SpringContextHolder中的ApplicationContext为Null.
+	 */
+	public static void clearHolder() {
+		if (log.isDebugEnabled()) {
+			log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
+		}
+		applicationContext = null;
+	}
+
+	/**
+	 * 发布事件
+	 *
+	 * @param event
+	 */
+	public static void publishEvent(ApplicationEvent event) {
+		if (applicationContext == null) {
+			return;
+		}
+		applicationContext.publishEvent(event);
+	}
+
+	/**
+	 * 实现DisposableBean接口, 在Context关闭时清理静态变量.
+	 */
+	@Override
+	public void destroy() {
+		SpringContextHolder.clearHolder();
+	}
+
+}

+ 13 - 0
src/main/java/com/iden/common/vo/CameraVO.java

@@ -2,6 +2,7 @@ package com.iden.common.vo;
 
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.iden.common.exceltool.HeaderToColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -25,38 +26,49 @@ public class CameraVO implements Serializable {
 
 
     @ApiModelProperty("设备编号")
+    @HeaderToColumn(header = "设备编号")
     private String code;
 
 
     @ApiModelProperty("设备名称")
+    @HeaderToColumn(header = "设备名称")
     private String name;
 
 
     @ApiModelProperty("IP地址")
+    @HeaderToColumn(header = "IP地址")
     private String ip;
 
 
     @ApiModelProperty("所属区域")
+    @HeaderToColumn(header = "所属区域")
     private String district;
 
 
     @ApiModelProperty("所属街道")
+    @HeaderToColumn(header = "所属街道")
     private String subdistrict;
 
 
     @ApiModelProperty("所属小区id")
     private Long communityId;
 
+    @ApiModelProperty("所属小区")
+    @HeaderToColumn(header = "所属小区")
+    private String communityName;
 
     @ApiModelProperty("位置")
+    @HeaderToColumn(header = "位置")
     private String place;
 
 
     @ApiModelProperty("经度")
+    @HeaderToColumn(header = "经度")
     private Double longitude;
 
 
     @ApiModelProperty("纬度")
+    @HeaderToColumn(header = "纬度")
     private Double latitude;
 
 
@@ -74,6 +86,7 @@ public class CameraVO implements Serializable {
     private String typeName;
 
     @ApiModelProperty("备注")
+    @HeaderToColumn(header = "备注")
     private String remark;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

+ 10 - 0
src/main/java/com/iden/common/vo/CommunityVO.java

@@ -3,6 +3,7 @@ package com.iden.common.vo;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.iden.common.exceltool.HeaderToColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -31,10 +32,12 @@ public class CommunityVO implements Serializable {
 
 
     @ApiModelProperty("小区编号")
+    @HeaderToColumn(header = "小区编号")
     private String code;
 
 
     @ApiModelProperty("小区名称")
+    @HeaderToColumn(header = "小区名称")
     private String name;
 
 
@@ -47,30 +50,37 @@ public class CommunityVO implements Serializable {
 
 
     @ApiModelProperty("所属区域")
+    @HeaderToColumn(header = "所属区域")
     private String district;
 
 
     @ApiModelProperty("所属街道")
+    @HeaderToColumn(header = "所属街道")
     private String subdistrict;
 
 
     @ApiModelProperty("经度")
+    @HeaderToColumn(header = "经度")
     private Double longitude;
 
 
     @ApiModelProperty("纬度")
+    @HeaderToColumn(header = "纬度")
     private Double latitude;
 
 
     @ApiModelProperty("负责民警")
+    @HeaderToColumn(header = "负责民警")
     private String policeman;
 
 
     @ApiModelProperty("电话")
+    @HeaderToColumn(header = "电话")
     private String phone;
 
 
     @ApiModelProperty("备注")
+    @HeaderToColumn(header = "备注")
     private String remark;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

+ 8 - 0
src/main/java/com/iden/common/vo/CrowdVO.java

@@ -44,16 +44,24 @@ public class CrowdVO implements Serializable {
     @ApiModelProperty("更新周期,1每天,2每月")
     private String updateCycle;
 
+    @ApiModelProperty("更新周期名,1每天,2每月")
+    private String updateCycleName;
+
 
     @ApiModelProperty("备注")
     private String remark;
 
 
+    @ApiModelProperty("数据日期")
+    private String dataDate;
+
     @ApiModelProperty("数据日期开始")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
     private Date dataDateBegin;
 
 
     @ApiModelProperty("数据日期结束")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
     private Date dataDateEnd;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

BIN
src/main/resources/export/DetectorRuleExportTemplate.xlsx


BIN
src/main/resources/export/IdenCameraExportTemplate.xlsx


BIN
src/main/resources/export/IdenCommunityExportTemplate.xlsx


BIN
src/main/resources/export/IdenCrowdExportTemplate.xlsx


+ 6 - 0
src/main/resources/mybatis/IdenCityMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.iden.common.mapper.IdenCityMapper">
+
+
+</mapper>

+ 6 - 0
src/main/resources/mybatis/IdenDistrictMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.iden.common.mapper.IdenDistrictMapper">
+
+
+</mapper>

+ 6 - 0
src/main/resources/mybatis/IdenProvinceMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.iden.common.mapper.IdenProvinceMapper">
+
+
+</mapper>

+ 6 - 0
src/main/resources/mybatis/IdenSubdistrictMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.iden.common.mapper.IdenSubdistrictMapper">
+
+
+</mapper>