新增首页接口

This commit is contained in:
2025-07-08 23:25:44 +08:00
parent 73dfaef9c7
commit cdec58b0e7
14 changed files with 539 additions and 3 deletions

View File

@ -30,6 +30,6 @@ public class Application {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
Environment environment = context.getBean(Environment.class);
System.out.println("启动成功后端服务API地址http://" + ComputerInfo.getIpAddr() + ":"
+ environment.getProperty("server.port") + "/doc.html");
+ environment.getProperty("server.port") + "/swagger-ui.html");
}
}

View File

@ -0,0 +1,37 @@
package com.sczx.store.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sczx.store.dto.CompanyStoreDTO;
import com.sczx.store.dto.req.StoreDistanceReq;
import com.sczx.store.service.StoreService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 门店 前端控制器
* </p>
*
* @author zhangli
* @since 2025-07-08 21:16:36
*/
@Api(value = "门店用户端接口", tags = "用户端接口")
@RestController
@RequestMapping("/client")
public class StoreClientController {
@Autowired
private StoreService storeService;
@ApiOperation(value = "根据经纬度查询门店信息")
@PostMapping("/listStoresByBBoxWithDistance")
ResponseEntity<IPage<CompanyStoreDTO>> listStoresByBBoxWithDistance(@RequestParam("pageNo") Integer pageNo, @RequestParam("size") Integer size, @RequestBody StoreDistanceReq storeDistanceReq){
return ResponseEntity.ok(storeService.listStoresByBBoxWithDistance(storeDistanceReq, pageNo, size));
}
}

View File

@ -0,0 +1,21 @@
package com.sczx.store.controller;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 门店 前端控制器
* </p>
*
* @author zhangli
* @since 2025-07-08 21:16:36
*/
@Api(value = "门店管理端接口", produces = "管理端接口")
@RestController
@RequestMapping("/client")
public class StoreManageController {
}

View File

@ -0,0 +1,58 @@
package com.sczx.store.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "CompanyStoreDTO对象", description = "门店信息")
public class CompanyStoreDTO {
@ApiModelProperty("主键id")
private Integer id;
@ApiModelProperty("门店名称")
private String name;
@ApiModelProperty("联系人")
private String contactPerson;
@ApiModelProperty("手机号码")
private String phone;
@ApiModelProperty("联系人2")
private String contactPerson2;
@ApiModelProperty("手机号码2")
private String phone2;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("门店logo")
private String image;
@ApiModelProperty("纬度")
private Double latitude;
@ApiModelProperty("经度")
private Double longitude;
@ApiModelProperty("标签 1.可租车 2.可换电 3.二手车多个用号隔开例如1,2,3")
private String label;
@ApiModelProperty("运营公司id")
private Integer operatingCompanyId;
@ApiModelProperty("运营性质 1.直营 0.合作")
private Boolean operatingNature;
@ApiModelProperty("简介")
private String introduction;
@ApiModelProperty("门店编号")
private String storeNumber;
}

View File

@ -0,0 +1,23 @@
package com.sczx.store.dto.req;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(value = "StoreDistanceReq对象", description = "地图上查询门店信息请求")
@Data
public class StoreDistanceReq {
@ApiModelProperty(value = "最大纬度")
private Double minLat;
@ApiModelProperty(value = "最小纬度")
private Double maxLat;
@ApiModelProperty(value = "最大经度")
private Double minLng;
@ApiModelProperty(value = "最小经度")
private Double maxLng;
@ApiModelProperty(value = "当前位置纬度")
private Double currentLat;
@ApiModelProperty(value = "当前位置经度")
private Double currentLng;
}

View File

@ -0,0 +1,47 @@
package com.sczx.store.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 应用模块名称<p>
* <p>
* 代码描述<p>
* <p>
* Copyright: Copyright (C) 2021 CD Finance Management Co., Ltd. All rights reserved. <p>
* <p>
* Company: 中和农信项目管理有限公司<p>
*
* @author zhonghui
* @since 2021/9/13 2:46 PM
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理自定义的业务异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseEntity bizExceptionHandler(HttpServletRequest req, Exception e) {
log.error("服务器异常!原因是:{}",e.getMessage(), e);
return ResponseEntity.noContent().build();
}
}

View File

@ -0,0 +1,23 @@
package com.sczx.store.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sczx.store.dto.CompanyStoreDTO;
import com.sczx.store.dto.req.StoreDistanceReq;
import com.sczx.store.po.CompanyStorePO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 门店 Mapper 接口
* </p>
*
* @author zhangli
* @since 2025-07-08 21:16:36
*/
public interface CompanyStoreMapper extends BaseMapper<CompanyStorePO> {
IPage<CompanyStoreDTO> listStoresByBBoxWithDistance(Page<CompanyStoreDTO> page, @Param("storeDistanceReq") StoreDistanceReq storeDistanceReq);
}

View File

@ -0,0 +1,177 @@
package com.sczx.store.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 门店
* </p>
*
* @author zhangli
* @since 2025-07-08 21:16:36
*/
@Getter
@Setter
@TableName("zc_company_store")
@ApiModel(value = "CompanyStorePO对象", description = "门店")
public class CompanyStorePO implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("门店名称")
private String name;
@ApiModelProperty("联系人")
private String contactPerson;
@ApiModelProperty("手机号码")
private String phone;
@ApiModelProperty("联系人2")
private String contactPerson2;
@ApiModelProperty("手机号码2")
private String phone2;
@ApiModelProperty("省份")
private String provinceId;
@ApiModelProperty("省份")
private String provinceName;
@ApiModelProperty("城市")
private String cityId;
@ApiModelProperty("城市")
private String cityName;
@ApiModelProperty("区县")
private String areaId;
@ApiModelProperty("城市")
private String areaName;
@ApiModelProperty("省市区")
private String address;
@ApiModelProperty("详细地址")
private String detailedAddress;
@ApiModelProperty("门店logo")
private String image;
@ApiModelProperty("纬度")
private Double latitude;
@ApiModelProperty("经度")
private Double longitude;
@ApiModelProperty("合同签订日期")
private String contractDate;
@ApiModelProperty("每日营业开关时间")
private String dayTime;
@ApiModelProperty("每日营业开始时间")
private String startTime;
@ApiModelProperty("每日营业结束时间")
private String endTime;
@ApiModelProperty("是否显示")
private Boolean isShow;
@ApiModelProperty("是否删除")
private Boolean isDel;
@ApiModelProperty("租车订单分成比例")
private BigDecimal zucheRatio;
@ApiModelProperty("租电订单分成比例")
private BigDecimal zudianRatio;
@ApiModelProperty("以租代售分成比例")
private BigDecimal daishouRatio;
@ApiModelProperty("标签 1.可租车 2.可换电 3.二手车多个用号隔开例如1,2,3")
private String label;
@ApiModelProperty("运营公司id")
private Integer operatingCompanyId;
@ApiModelProperty("运营性质 1.直营 0.合作")
private Boolean operatingNature;
@ApiModelProperty("简介")
private String introduction;
@ApiModelProperty("对公账号")
private String bankAccount;
@ApiModelProperty("门店编号")
private String storeNumber;
@ApiModelProperty("营业执照")
private String businessLicenseImg;
@ApiModelProperty("审核状态 0.未审核 1.审核通过 2.审核未通过")
private Boolean auditStatus;
@ApiModelProperty("审核时间")
private LocalDateTime auditTime;
@ApiModelProperty("审核人id")
private Integer auditorId;
@ApiModelProperty("所属用户id")
private Integer userId;
@ApiModelProperty("是否允许回收退租天数 0.不允许 1.允许")
private Boolean isReturnAllowed;
@ApiModelProperty("企业套餐保证金")
private BigDecimal mealDepositPrice;
@ApiModelProperty("企业充值订单数限制")
private Integer orderNumLimit;
@ApiModelProperty("创建人")
private String createBy;
@ApiModelProperty("添加时间")
private LocalDateTime createTime;
@ApiModelProperty("修改人")
private String updateBy;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
private String delFlag;
private String status;
private String extend1;
private String extend2;
private String extend3;
private String extend4;
private String extend5;
}

View File

@ -0,0 +1,22 @@
package com.sczx.store.repository;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sczx.store.dto.CompanyStoreDTO;
import com.sczx.store.dto.req.StoreDistanceReq;
import com.sczx.store.po.CompanyStorePO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 门店 服务类
* </p>
*
* @author zhangli
* @since 2025-07-08 21:16:36
*/
public interface CompanyStoreRepo extends IService<CompanyStorePO> {
IPage<CompanyStoreDTO> listStoresByBBoxWithDistance(StoreDistanceReq storeDistanceReq,Integer pageNo, Integer size);
}

View File

@ -0,0 +1,33 @@
package com.sczx.store.repository.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sczx.store.dto.CompanyStoreDTO;
import com.sczx.store.dto.req.StoreDistanceReq;
import com.sczx.store.po.CompanyStorePO;
import com.sczx.store.mapper.CompanyStoreMapper;
import com.sczx.store.repository.CompanyStoreRepo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
* <p>
* 门店 服务实现类
* </p>
*
* @author zhangli
* @since 2025-07-08 21:16:36
*/
@Service
public class CompanyStoreRepoImpl extends ServiceImpl<CompanyStoreMapper, CompanyStorePO> implements CompanyStoreRepo {
@Override
public IPage<CompanyStoreDTO> listStoresByBBoxWithDistance(StoreDistanceReq storeDistanceReq, Integer pageNo, Integer size) {
Page<CompanyStoreDTO> page = new Page<>(pageNo, size);
return this.getBaseMapper().listStoresByBBoxWithDistance(page, storeDistanceReq);
}
}

View File

@ -0,0 +1,16 @@
package com.sczx.store.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sczx.store.dto.CompanyStoreDTO;
import com.sczx.store.dto.req.StoreDistanceReq;
public interface StoreService {
/**
* 根据经纬度获取门店信息
*
* @param storeDistanceReq
* @return
*/
IPage<CompanyStoreDTO> listStoresByBBoxWithDistance(StoreDistanceReq storeDistanceReq, Integer pageNo, Integer size);
}

View File

@ -0,0 +1,23 @@
package com.sczx.store.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sczx.store.dto.CompanyStoreDTO;
import com.sczx.store.dto.req.StoreDistanceReq;
import com.sczx.store.repository.CompanyStoreRepo;
import com.sczx.store.service.StoreService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service
public class StoreServiceImpl implements StoreService {
@Autowired
private CompanyStoreRepo companyStoreRepo;
@Override
public IPage<CompanyStoreDTO> listStoresByBBoxWithDistance(StoreDistanceReq storeDistanceReq, Integer pageNo, Integer size) {
return companyStoreRepo.listStoresByBBoxWithDistance(storeDistanceReq,pageNo,size);
}
}

View File

@ -0,0 +1,56 @@
<?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.sczx.store.mapper.CompanyStoreMapper">
<select id="listStoresByBBoxWithDistance" resultType="com.sczx.store.dto.CompanyStoreDTO">
SELECT
t.id,
t.name,
t.contact_person,
t.phone,
t.contact_person2,
t.phone2,
t.province_id,
t.province_name,
t.city_id,
t.city_name,
t.area_id,
t.area_name,
t.address,
t.detailed_address,
t.image,
t.latitude,
t.longitude,
(6371 * 1000 * 2 * ATAN2(
SQRT(
SIN(RADIANS(t.latitude - #{storeDistanceReq.currentLat}) / 2) *
SIN(RADIANS(t.latitude - #{storeDistanceReq.currentLat}) / 2) +
COS(RADIANS(#{storeDistanceReq.currentLat})) *
COS(RADIANS(t.latitude)) *
SIN(RADIANS(t.longitude - #{storeDistanceReq.currentLng}) / 2) *
SIN(RADIANS(t.longitude - #{storeDistanceReq.currentLng}) / 2)
),
SQRT(
1 - (
SIN(RADIANS(t.latitude - #{storeDistanceReq.currentLat}) / 2) *
SIN(RADIANS(t.latitude - #{storeDistanceReq.currentLat}) / 2) +
COS(RADIANS(#{storeDistanceReq.currentLat})) *
COS(RADIANS(t.latitude)) *
SIN(RADIANS(t.longitude - #{storeDistanceReq.currentLng}) / 2) *
SIN(RADIANS(t.longitude - #{storeDistanceReq.currentLng}) / 2)
)
)
)) AS distance
FROM
zc_company_store t
<where>
t.is_del = 0
and t.is_show = 1
and t.latitude between #{storeDistanceReq.minLat} and #{storeDistanceReq.maxLat}
and t.longitude between #{storeDistanceReq.minLng} and #{storeDistanceReq.maxLng}
</where>
order by distance asc
</select>
</mapper>

View File

@ -25,8 +25,8 @@ public class CodeGenerator {
.dateType(DateType.TIME_PACK).commentDate("yyyy-MM-dd HH:mm:ss")
.fileOverride())
// 包配置
.packageConfig(builder -> builder.parent(parentPackage).entity("po.base").service("repository.base").serviceImpl("repository.impl.base").xml("")
.mapper("mapper.base").pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper/base")))
.packageConfig(builder -> builder.parent(parentPackage).entity("po").service("repository").serviceImpl("repository.impl").xml("")
.mapper("mapper").pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper")))
// 策略配置
.strategyConfig((scanner, builder) -> builder.addInclude(scanner.apply("请输入表名:"))