diff --git a/docs/databases/table_create.sql b/docs/databases/table_create.sql new file mode 100644 index 0000000..60660d1 --- /dev/null +++ b/docs/databases/table_create.sql @@ -0,0 +1,22 @@ +DROP TABLE IF EXISTS `store_info`; +CREATE TABLE `store_info` ( + `id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT 'ID,唯一编号', + `sid` VARCHAR(64) NOT NULL COMMENT 'sid', + `createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间', + `remarks` VARCHAR(255) NULL DEFAULT NULL COMMENT '备注信息', + + `serNumber` int(11) DEFAULT 1 COMMENT '序号', + `code` VARCHAR(100) NULL DEFAULT NULL COMMENT '门店编号', + `county` VARCHAR(100) NULL DEFAULT NULL COMMENT '行政区划', + `name` VARCHAR(100) NULL DEFAULT NULL COMMENT '店铺名称', + `businessLicenseName` VARCHAR(100) NULL DEFAULT NULL COMMENT '营业执照名称', + `businessLicensePerson` VARCHAR(100) NULL DEFAULT NULL COMMENT '营业执照负责人', + `storeManager` VARCHAR(100) NULL DEFAULT NULL COMMENT '店长', + `address` VARCHAR(100) NULL DEFAULT NULL COMMENT '地址', + `area` double(12,2) NULL DEFAULT NULL COMMENT '营业面积', + `lng` VARCHAR(100) NULL DEFAULT NULL COMMENT '经度', + `lat` VARCHAR(100) NULL DEFAULT NULL COMMENT '纬度', + `dueDiligence` VARCHAR(100) NULL DEFAULT NULL COMMENT '是否尽调', + + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB COMMENT='便利店基础信息情况表'; \ No newline at end of file diff --git a/docs/xuqiu/datatemplate.xlsx b/docs/xuqiu/datatemplate.xlsx new file mode 100644 index 0000000..176c7cb Binary files /dev/null and b/docs/xuqiu/datatemplate.xlsx differ diff --git a/docs/xuqiu/便利店门店基础信息表(4)(1).xlsx b/docs/xuqiu/便利店门店基础信息表(4)(1).xlsx new file mode 100644 index 0000000..f9a671e Binary files /dev/null and b/docs/xuqiu/便利店门店基础信息表(4)(1).xlsx differ diff --git a/docs/xuqiu/便利店门店基础信息表(data).xlsx b/docs/xuqiu/便利店门店基础信息表(data).xlsx new file mode 100644 index 0000000..cb42957 Binary files /dev/null and b/docs/xuqiu/便利店门店基础信息表(data).xlsx differ diff --git a/docs/xuqiu/功能.txt b/docs/xuqiu/功能.txt index 66343d3..93e6033 100644 --- a/docs/xuqiu/功能.txt +++ b/docs/xuqiu/功能.txt @@ -1,3 +1,15 @@ 1。实现门店信息数据的导入功能,将Excel中数据导入系统数据库(目前门店信息包括:名称 地址 经纬度 店铺面积 是否尽调) 2。从系统数据查询、过滤数据,提供给页面地图 3。地图展示和标注,根据不同状态展示不同颜色,鼠标移动到标注上显示门店名称,点击标注展示门店详细信息。 + + +http://jianguan.yyundong.com/map365 + + +本周一侯晓龙说的按董行要求做一个在地图上展示36524门店分布的页面, +可以进行查询过滤, +是否尽调按不同样式展示 , +点击门店可展示门店信息。 +数据是可以通过Excel文件导入。 + +目前以上要求已经实现,访问http://jianguan.yyundong.com/map365 \ No newline at end of file diff --git a/docs/xuqiu/导入数据模板.xlsx b/docs/xuqiu/导入数据模板.xlsx new file mode 100644 index 0000000..fd0e4dc Binary files /dev/null and b/docs/xuqiu/导入数据模板.xlsx differ diff --git a/pom.xml b/pom.xml index 8262692..ed460f6 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,17 @@ junit-platform-launcher test + + org.projectlombok + lombok + 1.18.24 + true + + + com.alibaba + easyexcel + 3.2.1 + diff --git a/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfo.java b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfo.java index aa503a7..19bf186 100644 --- a/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfo.java +++ b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfo.java @@ -1,9 +1,55 @@ package com.yxt.supervise.gd36524.biz.store; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import com.yxt.common.core.domain.EntityWithId; +import lombok.Data; +import java.util.Date; +import java.util.List; + +@Data @TableName("store_info") public class StoreInfo extends EntityWithId { - + + + private String sid = IdUtil.fastSimpleUUID(); // sid + @JsonFormat( + pattern = "yyyy-MM-dd HH:mm:ss", + timezone = "GMT+8" + ) + private Date createTime = new Date(); // 记录创建时间 + private String remarks; // 备注说明 + + @ExcelProperty(index = 0) + private int serNumber = 1; // 序号 + @ExcelProperty(index = 1) + private String code; // 门店编号', + @ExcelProperty(index = 2) + private String county; // 行政区划', + @ExcelProperty(index = 3) + private String name; // 店铺名称', + @ExcelProperty(index = 4) + private String businessLicenseName; // 营业执照名称', + @ExcelProperty(index = 5) + private String businessLicensePerson; // 营业执照负责人', + @ExcelProperty(index = 6) + private String storeManager; // 店长', + @ExcelProperty(index = 7) + private String address; // 地址', + @ExcelProperty(index = 8) + private double area; // 店铺面积', + @ExcelProperty(index = 9) + private String lng; // 经度', + @ExcelProperty(index = 10) + private String lat; // 纬度', + @ExcelProperty(index = 11) + private String dueDiligence; // 是否尽调', + + public List getLnglat() { + return CollUtil.newArrayList(lng, lat); + } } diff --git a/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoMapper.java b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoMapper.java new file mode 100644 index 0000000..d752b72 --- /dev/null +++ b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoMapper.java @@ -0,0 +1,12 @@ +package com.yxt.supervise.gd36524.biz.store; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StoreInfoMapper extends BaseMapper { + + @Delete("delete from store_info where 1=1") + void clearData(); +} diff --git a/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoRest.java b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoRest.java new file mode 100644 index 0000000..c1af52f --- /dev/null +++ b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoRest.java @@ -0,0 +1,30 @@ +package com.yxt.supervise.gd36524.biz.store; + +import com.yxt.common.core.result.ResultBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@RestController("com.yxt.supervise.gd36524.biz.store.StoreInfoRest") +@RequestMapping("/store") +public class StoreInfoRest { + + @Autowired + private StoreInfoService storeInfoService; + + @PostMapping("/list") + public ResultBean> list(@RequestBody StoreQuery query) { + ResultBean rb = ResultBean.fireFail(); + List vo = storeInfoService.listQuery(query); + return rb.success().setData(vo); + } + + @PostMapping("/uploadData") + public ResultBean uploadData(@RequestParam("file") MultipartFile file) { + ResultBean rb = ResultBean.fireFail(); + UploadVo vo = storeInfoService.uploadAndResetData(file); + return rb.success().setData(vo); + } +} diff --git a/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoService.java b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoService.java new file mode 100644 index 0000000..2ee6891 --- /dev/null +++ b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreInfoService.java @@ -0,0 +1,105 @@ +package com.yxt.supervise.gd36524.biz.store; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; +import com.alibaba.excel.read.listener.ReadListener; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Service +public class StoreInfoService extends ServiceImpl { + + private static final Logger L = LoggerFactory.getLogger(StoreInfoService.class); + + public UploadVo uploadAndResetData(MultipartFile file) { + + UploadVo vo = new UploadVo(); + vo.setStarTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + vo.setFileName(file.getOriginalFilename()); + + long millis = System.currentTimeMillis(); + try { + ExcelReaderBuilder read = EasyExcel.read(file.getInputStream(), StoreInfo.class, createReadListener(vo)); + read.sheet().headRowNumber(2).doRead(); + } catch (IOException e) { + e.printStackTrace(); + L.error("导入门店信息数据出错:{}", e.getMessage()); + vo.setErrInfo("导入门店信息数据出错:" + e.getMessage()); + } + + long l = System.currentTimeMillis() - millis; + vo.setUseTime("" + (l / 1000) + " 秒"); + return vo; + } + + private ReadListener createReadListener(UploadVo vo) { + + return new ReadListener() { + + private int all = 0, x = 0, y = 0, z = 0; + private List toInsertList = new ArrayList<>(); + + @Override + public void invoke(StoreInfo obj, AnalysisContext analysisContext) { + all++; + toInsertList.add(obj); + if ("是".equals(obj.getDueDiligence())) { + x++; + } else if ("否".equals(obj.getDueDiligence())) { + y++; + } else { + z++; + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + if (toInsertList != null && !toInsertList.isEmpty()) { + StoreInfoService.this.clearData(); + StoreInfoService.this.saveBatch(toInsertList); + } + + vo.setNumberAll("" + all); + vo.setNumberTure("" + x); + vo.setNumberFalse("" + y); + vo.setNumberOther("" + z); + } + }; + } + + public void clearData() { + baseMapper.clearData(); + } + + public List listQuery(StoreQuery query) { + QueryWrapper qw = new QueryWrapper<>(); + if (StringUtils.isNotBlank(query.getName())) { + qw.like("name", query.getName()); + } + if (StringUtils.isNotBlank(query.getJindiao()) && !"全部".equals(query.getJindiao())) { + qw.eq("dueDiligence", query.getJindiao()); + } + if (StringUtils.isNoneBlank(query.getAreaStar())) { + qw.ge("area", query.getAreaStar()); + } + if (StringUtils.isNoneBlank(query.getAreaEnd())) { + qw.le("area", query.getAreaEnd()); + } + qw.orderByAsc("serNumber"); + List storeInfos = baseMapper.selectList(qw); + return storeInfos; + } +} diff --git a/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreQuery.java b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreQuery.java new file mode 100644 index 0000000..e404419 --- /dev/null +++ b/src/main/java/com/yxt/supervise/gd36524/biz/store/StoreQuery.java @@ -0,0 +1,13 @@ +package com.yxt.supervise.gd36524.biz.store; + +import com.yxt.common.core.query.Query; +import lombok.Data; + +@Data +public class StoreQuery implements Query { + + private String name;//门店名称 + private String jindiao;//是否尽调 + private String areaStar;//面积始 + private String areaEnd;//面积终 +} diff --git a/src/main/java/com/yxt/supervise/gd36524/biz/store/UploadVo.java b/src/main/java/com/yxt/supervise/gd36524/biz/store/UploadVo.java new file mode 100644 index 0000000..10ad689 --- /dev/null +++ b/src/main/java/com/yxt/supervise/gd36524/biz/store/UploadVo.java @@ -0,0 +1,16 @@ +package com.yxt.supervise.gd36524.biz.store; + +import lombok.Data; + +@Data +public class UploadVo { + + private String fileName; + private String starTime; + private String useTime; + private String numberAll; + private String numberTure; + private String numberFalse; + private String numberOther; + private String errInfo; +} diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml index 8da73a9..c6cb2ae 100644 --- a/src/main/resources/application-pro.yml +++ b/src/main/resources/application-pro.yml @@ -1,9 +1,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/yxt_supervise_gd36524?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 + url: jdbc:mysql://127.0.0.1:3306/yxt_supervise_gd36524?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true username: root - password: root + password: 1LAiGz$t1*Iw cloud: nacos: discovery: @@ -20,9 +20,10 @@ spring: password: 123456 port: 6379 timeout: 0 # 连接超时时间(毫秒) + image: upload: - path: D:\supervise\upload\ + path: D:/webapps/supervise/static/upload/ url: - prefix: http://127.0.0.1/api/upload/ + prefix: http://122.14.222.186:7003/upload/ diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 1656166..c6cb2ae 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -21,7 +21,6 @@ spring: port: 6379 timeout: 0 # 连接超时时间(毫秒) - image: upload: path: D:/webapps/supervise/static/upload/ diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index eeba737..1bb525c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,9 +2,9 @@ spring: application: name: supervise-gd36524 profiles: - active: devv +# active: devv # active: test -# active: pro + active: pro messages: # 国际化资源文件路径 basename: i18n/messages @@ -19,7 +19,7 @@ spring: enabled: true server: - port: 7103 + port: 7104 max-http-header-size: 102400 undertow: max-http-post-size: -1