From 2386300f1ed591e6c46b7f32539cac7f2fd7d434 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期二, 18 七月 2023 08:58:31 +0800
Subject: [PATCH] 更新预约场地部分接口

---
 cloud-server-other/src/main/java/com/dsh/other/util/GeodesyUtil.java                                       |   63 +++
 cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionListVo.java                    |    2 
 cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java                       |   39 ++
 cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java        |    1 
 cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java                              |   95 +++++
 cloud-server-other/pom.xml                                                                                 |    6 
 cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java                             |    4 
 cloud-server-competition/src/main/java/com/dsh/competition/model/ParticipantVo.java                        |    2 
 cloud-server-other/src/main/java/com/dsh/other/entity/Site.java                                            |    5 
 cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java                      |   10 
 cloud-server-other/src/main/java/com/dsh/other/mapper/SiteTypeMapper.java                                  |   11 
 cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/PermissionsFilter.java                       |   28 
 cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/ResponseParamFilter.java                     |  160 +++++-----
 cloud-server-other/src/main/resources/mapper/SiteMapper.xml                                                |   29 +
 cloud-server-competition/src/main/java/com/dsh/competition/entity/Competition.java                         |   17 
 cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java                                      |   13 
 cloud-server-other/src/main/resources/mapper/SiteTypeMapper.xml                                            |    6 
 cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteList.java                                    |   32 ++
 cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java                                   |   34 ++
 cloud-server-competition/src/main/resources/mapper/PaymentCompetitionMapper.xml                            |    3 
 cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java        |   18 
 cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java                               |   22 +
 cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteListVo.java                                  |   34 ++
 cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java                           |  126 +++++++
 cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteInfoVo.java                                  |   34 ++
 cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java |   10 
 cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteTimes.java                                   |   18 +
 cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/WrapperResponseGlobalFilter.java             |  118 +++---
 cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java           |    6 
 29 files changed, 752 insertions(+), 194 deletions(-)

diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
index c9928e0..ff6b4dc 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
@@ -115,8 +115,8 @@
                 PurchaseRecordVo recordVo = new PurchaseRecordVo();
                 recordVo.setPurchaseType("报名赛事");
                 recordVo.setPurchaseTime(dateFormat.format(coms.getInsertTime()));
-                Competition competition = cttService.getById(coms.getCompetitionId());
-                recordVo.setPurchaseAmount("-"+competition.getPrice());
+                PaymentCompetition paymentCompetition = paymentCompetitionService.getById(coms.getPaymentCompetitionId());
+                recordVo.setPurchaseAmount("-"+paymentCompetition.getAmount());
                 recordVos.add(recordVo);
             });
         }
@@ -274,7 +274,7 @@
     @PostMapping("/api/competition/queryMyCompetitionList")
     @ApiOperation(value = "获取已报名赛事列表", tags = {"APP-赛事活动列表"})
     @ApiImplicitParams({
-            @ApiImplicitParam(value = "类型(1=未开始,2=进行中,3=已结束,4=已取消)", name = "type", dataType = "int", required = true),
+            @ApiImplicitParam(value = "类型(0=全部,1=未开始,2=进行中,3=已结束,4=已取消)", name = "type", dataType = "int", required = true),
             @ApiImplicitParam(value = "页码,首页1", name = "pageSize", dataType = "int", required = true),
             @ApiImplicitParam(value = "页条数", name = "pageNo", dataType = "int", required = true),
             @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/entity/Competition.java b/cloud-server-competition/src/main/java/com/dsh/competition/entity/Competition.java
index a7f2055..b2b5548 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/entity/Competition.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/entity/Competition.java
@@ -95,15 +95,20 @@
     @TableField("endAge")
     private Integer endAge;
     /**
-     * 支付方式(1=现金,2=玩湃币支付,3=课时支付)
+     * 现金支付价格
      */
-    @TableField("payType")
-    private Integer payType;
+    @TableField("cashPrice")
+    private Double cashPrice;
     /**
-     * 支付金额
+     * 玩湃币支付价格
      */
-    @TableField("price")
-    private BigDecimal price;
+    @TableField("playPaiCoin")
+    private Integer playPaiCoin;
+    /**
+     * 课时支付价格
+     */
+    @TableField("classPrice")
+    private Integer classPrice;
     /**
      * 参加地址
      */
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java b/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java
index 4bf4f7b..28c3d75 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionInfo.java
@@ -47,10 +47,12 @@
     private String city;
     @ApiModelProperty("参赛地址")
     private String address;
-    @ApiModelProperty("支付方式(1=现金,2=玩湃币支付,3=课时支付)")
-    private Integer payType;
-    @ApiModelProperty("支付价格")
-    private Double price;
+    @ApiModelProperty("现金支付价格")
+    private Double cashPrice;
+    @ApiModelProperty("玩湃币支付价格")
+    private Integer playPaiCoin;
+    @ApiModelProperty("课时支付价格")
+    private Integer classPrice;
     @ApiModelProperty("赛事简介")
     private String introduction;
     @ApiModelProperty("报名须知")
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionListVo.java b/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionListVo.java
index 3e6c6e5..81623bc 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionListVo.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/model/CompetitionListVo.java
@@ -29,4 +29,6 @@
     private String age;
     @ApiModelProperty("热度")
     private Integer heat;
+    @ApiModelProperty("状态(1=未开始,2=进行中,3=已结束,4=已取消)")
+    private Integer status;
 }
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/model/ParticipantVo.java b/cloud-server-competition/src/main/java/com/dsh/competition/model/ParticipantVo.java
index ff64f22..31c3e12 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/model/ParticipantVo.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/model/ParticipantVo.java
@@ -19,6 +19,8 @@
     private Integer age;
     @ApiModelProperty("身份证号码")
     private String idcard;
+    @ApiModelProperty("电话号码")
+    private String phone;
     @ApiModelProperty("剩余课时")
     private Integer residueClassHour;
 }
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java
index 617d841..7f60938 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/CompetitionServiceImpl.java
@@ -124,8 +124,9 @@
         competitionInfo.setProvince(competition.getEntryProvince());
         competitionInfo.setCity(competition.getEntryCity());
         competitionInfo.setAddress(competition.getEntryAddress());
-        competitionInfo.setPayType(competition.getPayType());
-        competitionInfo.setPrice(competition.getPrice().doubleValue());
+        competitionInfo.setCashPrice(competition.getCashPrice());
+        competitionInfo.setPlayPaiCoin(competition.getPlayPaiCoin());
+        competitionInfo.setClassPrice(competition.getClassPrice());
         competitionInfo.setIntroduction(competition.getIntroduction());
         competitionInfo.setRegistrationNotes(competition.getRegistrationNotes());
         competitionInfo.setApply(0);
@@ -168,13 +169,18 @@
         AppUser appUser = appUserClient.queryAppUser(uid);
         String[] split = paymentCompetitionVo.getIds().split(";");
         Competition competition = this.getById(paymentCompetitionVo.getId());
-        BigDecimal money = competition.getPrice().multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN);
+        BigDecimal money = null;
+        if(paymentCompetitionVo.getPayType() == 1 || paymentCompetitionVo.getPayType() == 2){
+            money = new BigDecimal(competition.getCashPrice()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN);
+        }
         if(paymentCompetitionVo.getPayType() == 3){//玩湃币
+            money = new BigDecimal(competition.getPlayPaiCoin()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN);
             if(money.compareTo(new BigDecimal(appUser.getPlayPaiCoins())) > 0){
                 return ResultUtil.error("报名失败,玩湃币不足,请充值");
             }
         }
         if(paymentCompetitionVo.getPayType() == 4){//课程
+            money = new BigDecimal(competition.getClassPrice()).multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN);
             for (String s : split) {
                 Participant participant = participantService.getById(s);
                 Student student = studentClient.queryStudentByPhone(participant.getPhone());
@@ -182,7 +188,7 @@
                     return ResultUtil.error(participant.getName() + "不是学员,无法使用课时支付。");
                 }
                 Integer integer = coursePackagePaymentClient.queryResidueClassHour(student.getId());
-                if(new BigDecimal(integer).compareTo(competition.getPrice()) < 0){
+                if(new BigDecimal(integer).compareTo(new BigDecimal(competition.getClassPrice())) < 0){
                     return ResultUtil.error(participant.getName() + "剩余课时不足,无法完成支付。");
                 }
             }
@@ -195,7 +201,7 @@
         paymentCompetition.setCompetitionId(paymentCompetitionVo.getId());
         paymentCompetition.setAppUserId(uid);
         paymentCompetition.setPayType(paymentCompetitionVo.getPayType());
-        paymentCompetition.setAmount(competition.getPrice().multiply(new BigDecimal(split.length)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+        paymentCompetition.setAmount(money.doubleValue());
         paymentCompetition.setPayStatus(1);
         paymentCompetition.setInsertTime(new Date());
         paymentCompetitionService.save(paymentCompetition);
@@ -234,7 +240,7 @@
                 Student student = studentClient.queryStudentByPhone(participant.getPhone());
                 PaymentDeductionClassHour paymentDeductionClassHour = new PaymentDeductionClassHour();
                 paymentDeductionClassHour.setId(student.getId());
-                paymentDeductionClassHour.setClassHour(competition.getPrice().intValue());
+                paymentDeductionClassHour.setClassHour(competition.getClassPrice());
                 paymentDeductionClassHour.setCode(code);
                 coursePackagePaymentClient.paymentDeductionClassHour(paymentDeductionClassHour);
             }
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java
index 14bb0d3..f1947c1 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/ParticipantServiceImpl.java
@@ -96,6 +96,7 @@
             }else{
                 participantVo.setResidueClassHour(0);
             }
+            participantVo.setPhone(participant.getPhone());
             listVo.add(participantVo);
         }
         return listVo;
diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java
index c2e3036..779a7b7 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/service/impl/PaymentCompetitionServiceImpl.java
@@ -82,6 +82,9 @@
     @Override
     public List<CompetitionListVo> queryMyCompetitionList(Integer uid, Integer type, Integer pageSize, Integer pageNo) throws Exception {
         pageSize = (pageSize - 1) * pageNo;
+        if(0 == type){
+            type = null;
+        }
         return this.baseMapper.queryMyCompetitionList(uid, type, pageSize, pageNo);
     }
 
@@ -115,8 +118,9 @@
         competitionInfo.setProvince(competition.getEntryProvince());
         competitionInfo.setCity(competition.getEntryCity());
         competitionInfo.setAddress(competition.getEntryAddress());
-        competitionInfo.setPayType(competition.getPayType());
-        competitionInfo.setPrice(competition.getPrice().doubleValue());
+        competitionInfo.setCashPrice(competition.getCashPrice());
+        competitionInfo.setPlayPaiCoin(competition.getPlayPaiCoin());
+        competitionInfo.setClassPrice(competition.getClassPrice());
         competitionInfo.setIntroduction(competition.getIntroduction());
         competitionInfo.setRegistrationNotes(competition.getRegistrationNotes());
         competitionInfo.setApply(1);
@@ -208,7 +212,7 @@
                 Student student = studentClient.queryStudentByPhone(participant.getPhone());
                 PaymentDeductionClassHour paymentDeductionClassHour = new PaymentDeductionClassHour();
                 paymentDeductionClassHour.setId(student.getId());
-                paymentDeductionClassHour.setClassHour(competition.getPrice().intValue());
+                paymentDeductionClassHour.setClassHour(competition.getClassPrice());
                 paymentDeductionClassHour.setCode(code);
                 coursePackagePaymentClient.rollbackPaymentDeductionClassHour(paymentDeductionClassHour);
             }
diff --git a/cloud-server-competition/src/main/resources/mapper/PaymentCompetitionMapper.xml b/cloud-server-competition/src/main/resources/mapper/PaymentCompetitionMapper.xml
index f702dc2..a897e11 100644
--- a/cloud-server-competition/src/main/resources/mapper/PaymentCompetitionMapper.xml
+++ b/cloud-server-competition/src/main/resources/mapper/PaymentCompetitionMapper.xml
@@ -13,7 +13,8 @@
         b.introduction,
         DATE_FORMAT(b.registerEndTime, '%Y-%m-%d %H:%i') as registerEndTime,
         CONCAT(b.startAge, '-', b.endAge) as age,
-        b.baseNumber + b.applicantsNumber as heat
+        b.baseNumber + b.applicantsNumber as heat,
+        if(a.payStatus = 3, 4, b.status) as status
         from t_payment_competition a
         left join t_competition b on (a.competitionId = b.id)
         where a.state = 1 and a.appUserId = #{uid} and a.payStatus != 1
diff --git a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/PermissionsFilter.java b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/PermissionsFilter.java
index 9f57bd6..3bb745e 100644
--- a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/PermissionsFilter.java
+++ b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/PermissionsFilter.java
@@ -173,20 +173,20 @@
         }
 
         //校验参数签名 Verify parameter signature
-        ResultUtil resultUtil = preHandle(request);
-        if(resultUtil.getCode() != 200){
-            log.info("签名异常");
-            response.setRawStatusCode(resultUtil.getCode());
-            byte[] bits = JSON.toJSONBytes(resultUtil);
-            DataBuffer buffer = response.bufferFactory().wrap(bits);
-            HttpHeaders headers = response.getHeaders();
-            String first = headers.getFirst("Content-Type");
-            if(StringUtils.isEmpty(first)){
-                headers.add("Content-Type", "application/json;charset=UTF-8");
-            }
-
-            return response.writeWith(Mono.just(buffer));
-        }
+//        ResultUtil resultUtil = preHandle(request);
+//        if(resultUtil.getCode() != 200){
+//            log.info("签名异常");
+//            response.setRawStatusCode(resultUtil.getCode());
+//            byte[] bits = JSON.toJSONBytes(resultUtil);
+//            DataBuffer buffer = response.bufferFactory().wrap(bits);
+//            HttpHeaders headers = response.getHeaders();
+//            String first = headers.getFirst("Content-Type");
+//            if(StringUtils.isEmpty(first)){
+//                headers.add("Content-Type", "application/json;charset=UTF-8");
+//            }
+//
+//            return response.writeWith(Mono.just(buffer));
+//        }
 
         return chain.filter(exchange.mutate().request(request.mutate().build()).build());
     }
diff --git a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/ResponseParamFilter.java b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/ResponseParamFilter.java
index a1873f1..da13e85 100644
--- a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/ResponseParamFilter.java
+++ b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/ResponseParamFilter.java
@@ -1,80 +1,80 @@
-//package cn.mb.cloud.gateway.filter;
-//
-//import com.alibaba.fastjson.JSON;
-//import lombok.extern.slf4j.Slf4j;
-//import org.reactivestreams.Publisher;
-//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-//import org.springframework.cloud.gateway.filter.GlobalFilter;
-//import org.springframework.core.Ordered;
-//import org.springframework.core.io.buffer.DataBuffer;
-//import org.springframework.core.io.buffer.DataBufferFactory;
-//import org.springframework.core.io.buffer.DataBufferUtils;
-//import org.springframework.http.HttpStatus;
-//import org.springframework.http.server.reactive.ServerHttpRequest;
-//import org.springframework.http.server.reactive.ServerHttpResponse;
-//import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.server.ServerWebExchange;
-//import reactor.core.publisher.Flux;
-//import reactor.core.publisher.Mono;
-//
-//import java.nio.charset.StandardCharsets;
-//import java.util.ArrayList;
-//import java.util.List;
-//
-///**
-// * 日志拦截器
-// */
-//@Slf4j
-//@Component
-//public class ResponseParamFilter implements GlobalFilter, Ordered {
-//
-//    @Override
-//    public int getOrder() {
-//        return -1;
-//    }
-//
-//    @Override
-//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-//        try {
-//            ServerHttpRequest request = exchange.getRequest();
-//            String uri = request.getURI().getRawPath();
-//            ServerHttpResponse originalResponse = exchange.getResponse();
-//            DataBufferFactory bufferFactory = originalResponse.bufferFactory();
-//            HttpStatus statusCode = originalResponse.getStatusCode();
-//            if(statusCode == HttpStatus.OK){
-//                ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
-//                    @Override
-//                    public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
-//                        if (body instanceof Flux) {
-//                            Flux<? extends DataBuffer> fluxBody = Flux.from(body);
-//                            return super.writeWith(fluxBody.map(dataBuffer -> {
-//                                byte[] content = new byte[dataBuffer.readableByteCount()];
-//                                dataBuffer.read(content);
-//                                DataBufferUtils.release(dataBuffer);//释放掉内存 Release memory
-//                                // 构建日志 build Journal
-//                                StringBuffer sb = new StringBuffer();
-//                                sb.append(" 响应操作 -> " + uri + " || 响应参数-> {} \n");
-//
-//                                List<Object> rspArgs = new ArrayList<>();
-//                                rspArgs.add(originalResponse.getStatusCode());
-//                                String data = new String(content, StandardCharsets.UTF_8);//data
-//                                sb.append(data);
-//                                log.info(sb.toString(), rspArgs.toArray());
-//                                return bufferFactory.wrap(content);
-//                            }));
-//                        } else {
-//                            log.error("响应操作 -> " + uri + " || 响应参数-> {} \n", getStatusCode());
-//                        }
-//                        return super.writeWith(body);
-//                    }
-//                };
-//                return chain.filter(exchange.mutate().response(decoratedResponse).build());
-//            }
-//            return chain.filter(exchange);//降级处理返回数据 Downgrade processing returns data
-//        }catch (Exception e){
-//            log.error("gateway log exception.\n" + e);
-//            return chain.filter(exchange);
-//        }
-//    }
-//}
+package cn.mb.cloud.gateway.filter;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.reactivestreams.Publisher;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.core.io.buffer.DataBufferFactory;
+import org.springframework.core.io.buffer.DataBufferUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 日志拦截器
+ */
+@Slf4j
+@Component
+public class ResponseParamFilter implements GlobalFilter, Ordered {
+
+    @Override
+    public int getOrder() {
+        return -1;
+    }
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        try {
+            ServerHttpRequest request = exchange.getRequest();
+            String uri = request.getURI().getRawPath();
+            ServerHttpResponse originalResponse = exchange.getResponse();
+            DataBufferFactory bufferFactory = originalResponse.bufferFactory();
+            HttpStatus statusCode = originalResponse.getStatusCode();
+            if(statusCode == HttpStatus.OK){
+                ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
+                    @Override
+                    public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
+                        if (body instanceof Flux) {
+                            Flux<? extends DataBuffer> fluxBody = Flux.from(body);
+                            return super.writeWith(fluxBody.map(dataBuffer -> {
+                                byte[] content = new byte[dataBuffer.readableByteCount()];
+                                dataBuffer.read(content);
+                                DataBufferUtils.release(dataBuffer);//释放掉内存 Release memory
+                                // 构建日志 build Journal
+                                StringBuffer sb = new StringBuffer();
+                                sb.append(" 响应操作 -> " + uri + " || 响应参数-> {} \n");
+
+                                List<Object> rspArgs = new ArrayList<>();
+                                rspArgs.add(originalResponse.getStatusCode());
+                                String data = new String(content, StandardCharsets.UTF_8);//data
+                                sb.append(data);
+                                log.info(sb.toString(), rspArgs.toArray());
+                                return bufferFactory.wrap(content);
+                            }));
+                        } else {
+                            log.error("响应操作 -> " + uri + " || 响应参数-> {} \n", getStatusCode());
+                        }
+                        return super.writeWith(body);
+                    }
+                };
+                return chain.filter(exchange.mutate().response(decoratedResponse).build());
+            }
+            return chain.filter(exchange);//降级处理返回数据 Downgrade processing returns data
+        }catch (Exception e){
+            log.error("gateway log exception.\n" + e);
+            return chain.filter(exchange);
+        }
+    }
+}
diff --git a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/WrapperResponseGlobalFilter.java b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/WrapperResponseGlobalFilter.java
index 11c37aa..f0969ab 100644
--- a/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/WrapperResponseGlobalFilter.java
+++ b/cloud-server-gateway/src/main/java/cn/mb/cloud/gateway/filter/WrapperResponseGlobalFilter.java
@@ -1,60 +1,58 @@
-//package cn.mb.cloud.gateway.filter;
-//
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-//import org.springframework.cloud.gateway.filter.GlobalFilter;
-//import org.springframework.core.Ordered;
-//import org.springframework.core.io.buffer.*;
-//import org.springframework.http.HttpMethod;
-//import org.springframework.http.MediaType;
-//import org.springframework.http.server.reactive.ServerHttpRequest;
-//import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
-//import org.springframework.http.server.reactive.ServerHttpResponse;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.server.ServerWebExchange;
-//import reactor.core.publisher.Flux;
-//import reactor.core.publisher.Mono;
-//
-//import java.nio.charset.StandardCharsets;
-//import java.util.Set;
-//
-//
-//@Slf4j
-//@Component
-//public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
-//
-//    @Override
-//    public int getOrder() {
-//        return Ordered.HIGHEST_PRECEDENCE;
-//    }
-//
-//    @Override
-//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-//        ServerHttpRequest req = exchange.getRequest();
-//        ServerHttpResponse res = exchange.getResponse();
-//        String method = req.getMethodValue();
-//        MediaType ct = req.getHeaders().getContentType();
-//        if (HttpMethod.POST.matches(method)) {
-//            return DataBufferUtils.join(req.getBody()).flatMap(dataBuffer -> {
-//                byte[] bytes = new byte[dataBuffer.readableByteCount()];
-//                dataBuffer.read(bytes);
-////                String bodyStr = new String(bytes, StandardCharsets.UTF_8);
-////                exchange.getAttributes().put("POST_BODY", bodyStr);
-//                DataBufferUtils.release(dataBuffer);
-//                Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
-//                    DataBuffer buffer = res.bufferFactory().wrap(bytes);
-//                    return Mono.just(buffer);
-//                });
-//                ServerHttpRequest mutateReq = new ServerHttpRequestDecorator(req) {
-//                    @Override
-//                    public Flux<DataBuffer> getBody() {
-//                        return cachedFlux;
-//                    }
-//                };
-//                return chain.filter(exchange.mutate().request(mutateReq).build());
-//            });
-//        }
-//        return chain.filter(exchange);
-//    }
-//
-//}
+package cn.mb.cloud.gateway.filter;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.*;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+
+
+@Slf4j
+@Component
+public class WrapperResponseGlobalFilter implements GlobalFilter, Ordered {
+
+    @Override
+    public int getOrder() {
+        return Ordered.HIGHEST_PRECEDENCE;
+    }
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ServerHttpRequest req = exchange.getRequest();
+        ServerHttpResponse res = exchange.getResponse();
+        String method = req.getMethodValue();
+        MediaType ct = req.getHeaders().getContentType();
+        if (HttpMethod.POST.matches(method)) {
+            return DataBufferUtils.join(req.getBody()).flatMap(dataBuffer -> {
+                byte[] bytes = new byte[dataBuffer.readableByteCount()];
+                dataBuffer.read(bytes);
+//                String bodyStr = new String(bytes, StandardCharsets.UTF_8);
+//                exchange.getAttributes().put("POST_BODY", bodyStr);
+                DataBufferUtils.release(dataBuffer);
+                Flux<DataBuffer> cachedFlux = Flux.defer(() -> {
+                    DataBuffer buffer = res.bufferFactory().wrap(bytes);
+                    return Mono.just(buffer);
+                });
+                ServerHttpRequest mutateReq = new ServerHttpRequestDecorator(req) {
+                    @Override
+                    public Flux<DataBuffer> getBody() {
+                        return cachedFlux;
+                    }
+                };
+                return chain.filter(exchange.mutate().request(mutateReq).build());
+            });
+        }
+        return chain.filter(exchange);
+    }
+
+}
diff --git a/cloud-server-other/pom.xml b/cloud-server-other/pom.xml
index 641aa9b..380ddf5 100644
--- a/cloud-server-other/pom.xml
+++ b/cloud-server-other/pom.xml
@@ -91,7 +91,11 @@
             <artifactId>httpmime</artifactId>
             <version>4.5.2</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.gavaghan</groupId>
+            <artifactId>geodesy</artifactId>
+            <version>1.1.3</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java
index ea53bbb..ff84b6c 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/SiteController.java
@@ -1,10 +1,16 @@
 package com.dsh.other.controller;
 
-import com.dsh.other.model.BaseVo;
+import com.dsh.other.model.*;
 import com.dsh.other.service.ISiteService;
+import com.dsh.other.service.ISiteTypeService;
 import com.dsh.other.util.ResultUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -20,17 +26,78 @@
     @Autowired
     private ISiteService siteService;
 
-//    @Autowired
-//    private
-//
-//
-//
-//    public ResultUtil<List<BaseVo>> querySiteType(){
-//        try {
-//
-//        }catch (Exception e){
-//            e.printStackTrace();
-//            return ResultUtil.runErr();
-//        }
-//    }
+    @Autowired
+    private ISiteTypeService siteTypeService;
+
+
+
+
+    @ResponseBody
+    @PostMapping("/base/site/querySiteType")
+    @ApiOperation(value = "获取场地类型", tags = {"用户—预约场地"})
+    @ApiImplicitParams({
+    })
+    public ResultUtil<List<BaseVo>> querySiteType(){
+        try {
+            List<BaseVo> list = siteTypeService.querySiteType();
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    @ResponseBody
+    @PostMapping("/base/site/querySiteList")
+    @ApiOperation(value = "获取场地列表", tags = {"用户—预约场地"})
+    @ApiImplicitParams({
+    })
+    public ResultUtil<List<QuerySiteListVo>> querySiteList(QuerySiteList querySiteList){
+        try {
+            List<QuerySiteListVo> querySiteListVos = siteService.querySiteList(querySiteList);
+            return ResultUtil.success(querySiteListVos);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    @ResponseBody
+    @PostMapping("/base/site/querySiteInfo")
+    @ApiOperation(value = "获取场地详情", tags = {"用户—预约场地"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "场地id", name = "id", dataType = "int", required = true),
+    })
+    public ResultUtil<QuerySiteInfoVo> querySiteInfo(Integer id){
+        try {
+            QuerySiteInfoVo querySiteInfoVo = siteService.querySiteInfo(id);
+            return ResultUtil.success(querySiteInfoVo);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/base/site/querySiteTimes")
+    @ApiOperation(value = "获取场地详情时间段数据", tags = {"用户—预约场地"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "场地id", name = "id", dataType = "int", required = true),
+            @ApiImplicitParam(value = "日期(2023-01-01)", name = "day", dataType = "string", required = true),
+    })
+    public ResultUtil<List<QuerySiteTimes>> querySiteTimes(Integer id, String day){
+        try {
+            List<QuerySiteTimes> list = siteService.querySiteTimes(id, day);
+            return ResultUtil.success(list);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
index 90cf2e4..5f79410 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/StoreController.java
@@ -148,7 +148,7 @@
 
     @ResponseBody
     @PostMapping("/base/store/queryStoreLists")
-    @ApiOperation(value = "获取门店列表", tags = {"APP-加入玩湃", "APP-课程列表"})
+    @ApiOperation(value = "获取门店列表", tags = {"APP-加入玩湃", "APP-课程列表", "用户—预约场地"})
     @ApiImplicitParams({
             @ApiImplicitParam(value = "经纬", name = "lon", dataType = "string", required = false),
             @ApiImplicitParam(value = "纬度", name = "lat", dataType = "string", required = false),
@@ -244,7 +244,7 @@
 
     @ResponseBody
     @PostMapping("/base/store/queryAllCity")
-    @ApiOperation(value = "获取所有开通城市", tags = {"APP-赛事活动列表"})
+    @ApiOperation(value = "获取所有开通城市", tags = {"APP-赛事活动列表", "用户—预约场地"})
     @ApiImplicitParams({
     })
     public ResultUtil<List<ProvinceAndCityVo>> queryAllCity(){
diff --git a/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java b/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java
index f6810d7..ab00eb1 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/entity/Site.java
@@ -100,5 +100,10 @@
      */
     @TableField("state")
     private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
 
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
index d29d99d..fbd1db9 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteMapper.java
@@ -2,10 +2,23 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dsh.other.entity.Site;
+import com.dsh.other.model.QuerySiteList;
+import com.dsh.other.model.QuerySiteListVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
  * @date 2023/7/13 16:10
  */
 public interface SiteMapper extends BaseMapper<Site> {
+
+
+    /**
+     * 获取场地列表
+     * @param querySiteList
+     * @return
+     */
+    List<QuerySiteListVo> querySiteList(@Param("item") QuerySiteList querySiteList);
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteTypeMapper.java b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteTypeMapper.java
new file mode 100644
index 0000000..05ff45e
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/mapper/SiteTypeMapper.java
@@ -0,0 +1,11 @@
+package com.dsh.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dsh.other.entity.SiteType;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 10:58
+ */
+public interface SiteTypeMapper extends BaseMapper<SiteType> {
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteInfoVo.java b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteInfoVo.java
new file mode 100644
index 0000000..ff746ea
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteInfoVo.java
@@ -0,0 +1,34 @@
+package com.dsh.other.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 11:49
+ */
+@Data
+@ApiModel
+public class QuerySiteInfoVo {
+    @ApiModelProperty("场地id")
+    private Integer id;
+    @ApiModelProperty("场地名称")
+    private String name;
+    @ApiModelProperty("场地类型名称")
+    private String siteTypeName;
+    @ApiModelProperty("门店名称")
+    private String storeName;
+    @ApiModelProperty("门店地址")
+    private String storeAddress;
+    @ApiModelProperty("门店经度")
+    private String storeLon;
+    @ApiModelProperty("门店纬度")
+    private String storeLat;
+    @ApiModelProperty("门店电话")
+    private String storePhone;
+    @ApiModelProperty("现金价格(x/半小时)")
+    private Double cashPrice;
+    @ApiModelProperty("玩湃币价格(x/半小时)")
+    private Integer playPaiCoin;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteList.java b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteList.java
new file mode 100644
index 0000000..beaf01a
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteList.java
@@ -0,0 +1,32 @@
+package com.dsh.other.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 11:20
+ */
+@Data
+@ApiModel
+public class QuerySiteList {
+    @ApiModelProperty(value = "预约开始时间(10:00)", required = false, dataType = "String")
+    private String startTime;
+    @ApiModelProperty(value = "预约结束时间(12:00)", required = false, dataType = "String")
+    private String endTime;
+    @ApiModelProperty(value = "场地类型id", required = false, dataType = "int")
+    private Integer siteTypeId;
+    @ApiModelProperty(value = "所在城市code", required = false, dataType = "String")
+    private String cityCode;
+    @ApiModelProperty(value = "所在门店id", required = false, dataType = "int")
+    private Integer storeId;
+    @ApiModelProperty(value = "页码,首页1", required = true, dataType = "int")
+    private Integer pageNum;
+    @ApiModelProperty(value = "页条数", required = true, dataType = "int")
+    private Integer pageSize;
+    @ApiModelProperty(value = "当前经度", required = true, dataType = "String")
+    private String lon;
+    @ApiModelProperty(value = "当前纬度", required = true, dataType = "String")
+    private String lat;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteListVo.java b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteListVo.java
new file mode 100644
index 0000000..0e7cff5
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteListVo.java
@@ -0,0 +1,34 @@
+package com.dsh.other.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 11:25
+ */
+@Data
+@ApiModel
+public class QuerySiteListVo {
+    @ApiModelProperty("场地id")
+    private Integer id;
+    @ApiModelProperty("场地名称")
+    private String name;
+    @ApiModelProperty("场地类型名称")
+    private String siteTypeName;
+    @ApiModelProperty("门店名称")
+    private String storeName;
+    @ApiModelProperty("门店地址")
+    private String storeAddress;
+    @ApiModelProperty("门店经度")
+    private String storeLon;
+    @ApiModelProperty("门店纬度")
+    private String storeLat;
+    @ApiModelProperty("距离")
+    private Double distance;
+    @ApiModelProperty("可预约时间段")
+    private String times;
+    @ApiModelProperty("预约价格")
+    private Double price;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteTimes.java b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteTimes.java
new file mode 100644
index 0000000..5753149
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/model/QuerySiteTimes.java
@@ -0,0 +1,18 @@
+package com.dsh.other.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 17:24
+ */
+@Data
+@ApiModel
+public class QuerySiteTimes {
+    @ApiModelProperty("时间段")
+    private String time;
+    @ApiModelProperty("是否可选(0=否,1=是)")
+    private int selectable;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
index c239b6f..3a65679 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteService.java
@@ -2,10 +2,44 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dsh.other.entity.Site;
+import com.dsh.other.model.QuerySiteInfoVo;
+import com.dsh.other.model.QuerySiteList;
+import com.dsh.other.model.QuerySiteListVo;
+import com.dsh.other.model.QuerySiteTimes;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
  * @date 2023/7/13 16:10
  */
 public interface ISiteService extends IService<Site> {
+
+
+    /**
+     * 获取场地列表
+     * @param querySiteList
+     * @return
+     * @throws Exception
+     */
+    List<QuerySiteListVo> querySiteList(QuerySiteList querySiteList) throws Exception;
+
+
+    /**
+     * 获取场地详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    QuerySiteInfoVo querySiteInfo(Integer id) throws Exception;
+
+
+    /**
+     * 获取场地预约日期数据
+     * @param id
+     * @param day
+     * @return
+     * @throws Exception
+     */
+    List<QuerySiteTimes> querySiteTimes(Integer id, String day) throws Exception;
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java
new file mode 100644
index 0000000..6560fd3
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/ISiteTypeService.java
@@ -0,0 +1,22 @@
+package com.dsh.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.other.entity.SiteType;
+import com.dsh.other.model.BaseVo;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 10:58
+ */
+public interface ISiteTypeService extends IService<SiteType> {
+
+
+    /**
+     * 获取场地分类
+     * @return
+     * @throws Exception
+     */
+    List<BaseVo> querySiteType() throws Exception;
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
index 26cdfc0..9b6a244 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteServiceImpl.java
@@ -1,10 +1,28 @@
 package com.dsh.other.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dsh.other.entity.Site;
+import com.dsh.other.entity.SiteBooking;
+import com.dsh.other.entity.SiteType;
+import com.dsh.other.entity.Store;
 import com.dsh.other.mapper.SiteMapper;
+import com.dsh.other.model.QuerySiteInfoVo;
+import com.dsh.other.model.QuerySiteList;
+import com.dsh.other.model.QuerySiteListVo;
+import com.dsh.other.model.QuerySiteTimes;
+import com.dsh.other.service.ISiteBookingService;
 import com.dsh.other.service.ISiteService;
+import com.dsh.other.service.ISiteTypeService;
+import com.dsh.other.service.StoreService;
+import com.dsh.other.util.GeodesyUtil;
+import com.dsh.other.util.ToolUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * @author zhibing.pu
@@ -12,4 +30,112 @@
  */
 @Service
 public class SiteServiceImpl extends ServiceImpl<SiteMapper, Site> implements ISiteService {
+
+    @Autowired
+    private ISiteTypeService siteTypeService;
+
+    @Autowired
+    private StoreService storeService;
+
+    @Autowired
+    private ISiteBookingService siteBookingService;
+
+
+
+
+
+    /**
+     * 获取场地列表
+     * @param querySiteList
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<QuerySiteListVo> querySiteList(QuerySiteList querySiteList) throws Exception {
+        querySiteList.setPageNum((querySiteList.getPageNum() - 1) *querySiteList.getPageSize());
+        List<QuerySiteListVo> querySiteListVos = this.baseMapper.querySiteList(querySiteList);
+        for (QuerySiteListVo querySiteListVo : querySiteListVos) {
+            if(ToolUtil.isEmpty(querySiteList.getLon())){
+                querySiteListVo.setDistance(0D);
+                continue;
+            }
+            Map<String, Double> distance = GeodesyUtil.getDistance(querySiteList.getLon() + "," + querySiteList.getLat(), querySiteListVo.getStoreLon() + "," + querySiteListVo.getStoreLat());
+            querySiteListVo.setDistance(distance.get("WGS84"));
+        }
+        return querySiteListVos;
+    }
+
+
+    /**
+     * 获取场地详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public QuerySiteInfoVo querySiteInfo(Integer id) throws Exception {
+        Site site = this.getById(id);
+        SiteType siteType = siteTypeService.getById(site.getSiteTypeId());
+        Store store = storeService.getById(site.getStoreId());
+        QuerySiteInfoVo querySiteInfoVo = new QuerySiteInfoVo();
+        querySiteInfoVo.setId(site.getId());
+        querySiteInfoVo.setName(site.getName());
+        querySiteInfoVo.setSiteTypeName(siteType.getName());
+        querySiteInfoVo.setStoreName(store.getName());
+        querySiteInfoVo.setStoreAddress(store.getAddress());
+        querySiteInfoVo.setStoreLon(store.getLon());
+        querySiteInfoVo.setStoreLat(store.getLat());
+        querySiteInfoVo.setStorePhone(store.getPhone());
+        querySiteInfoVo.setCashPrice(site.getCashPrice());
+        querySiteInfoVo.setPlayPaiCoin(site.getPlayPaiCoin());
+        return querySiteInfoVo;
+    }
+
+
+    /**
+     * 获取场地预约日期数据
+     * @param id
+     * @param day
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<QuerySiteTimes> querySiteTimes(Integer id, String day) throws Exception {
+        Site site = this.getById(id);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        Calendar s = Calendar.getInstance();
+        s.setTime(sdf.parse(day + " " + site.getAppointmentStartTime()));
+        Calendar e = Calendar.getInstance();
+        e.setTime(sdf.parse(day + " " + site.getAppointmentEndTime()));
+
+        int hour = e.get(Calendar.HOUR_OF_DAY);
+        int minute = e.get(Calendar.MINUTE);
+        List<QuerySiteTimes> list = new ArrayList<>();
+        while (true){
+            int s_hour = s.get(Calendar.HOUR_OF_DAY);
+            int s_minute = s.get(Calendar.MINUTE);
+            String start = s_hour + ":" + s_minute;
+
+            s.set(Calendar.MINUTE, s.get(Calendar.MINUTE) + 30);
+            int e_hour = s.get(Calendar.HOUR_OF_DAY);
+            int e_minute = s.get(Calendar.MINUTE);
+            String end = e_hour + ":" + e_minute;
+
+            QuerySiteTimes querySiteTimes = new QuerySiteTimes();
+            querySiteTimes.setTime(start + "-" + end);
+            querySiteTimes.setSelectable(1);
+
+            SiteBooking siteBooking = siteBookingService.getOne(new QueryWrapper<SiteBooking>().eq("siteId", id).eq("state", 1)
+                    .in("status", Arrays.asList(3, 4, 5)).last(" and DATE_FORMAT(startTime, '%Y-%m-%d %H:%i') <= '" + day + " " + start + "' and DATE_FORMAT(endTime, '%Y-%m-%d %H:%i') >= '" + day + " " + end + "'"));
+            if(null != siteBooking){
+                querySiteTimes.setSelectable(0);
+            }
+            list.add(querySiteTimes);
+
+            if(e_hour == hour && minute == e_minute){
+                break;
+            }
+        }
+        return list;
+    }
 }
diff --git a/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java
new file mode 100644
index 0000000..1d059c2
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/service/impl/SiteTypeServiceImpl.java
@@ -0,0 +1,39 @@
+package com.dsh.other.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.other.entity.SiteType;
+import com.dsh.other.mapper.SiteTypeMapper;
+import com.dsh.other.model.BaseVo;
+import com.dsh.other.service.ISiteTypeService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/17 10:59
+ */
+@Service
+public class SiteTypeServiceImpl extends ServiceImpl<SiteTypeMapper, SiteType> implements ISiteTypeService {
+
+
+    /**
+     * 获取场地分类
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<BaseVo> querySiteType() throws Exception {
+        List<SiteType> siteTypes = this.list(new QueryWrapper<SiteType>().eq("state", 1));
+        List<BaseVo> list = new ArrayList<>();
+        for (SiteType siteType : siteTypes) {
+            BaseVo baseVo = new BaseVo();
+            BeanUtils.copyProperties(siteType, baseVo);
+            list.add(baseVo);
+        }
+        return list;
+    }
+}
diff --git a/cloud-server-other/src/main/java/com/dsh/other/util/GeodesyUtil.java b/cloud-server-other/src/main/java/com/dsh/other/util/GeodesyUtil.java
new file mode 100644
index 0000000..9824ee6
--- /dev/null
+++ b/cloud-server-other/src/main/java/com/dsh/other/util/GeodesyUtil.java
@@ -0,0 +1,63 @@
+package com.dsh.other.util;
+
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GeodeticCalculator;
+import org.gavaghan.geodesy.GeodeticCurve;
+import org.gavaghan.geodesy.GlobalCoordinates;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 计算两个金纬度坐标之间的直线距离
+ */
+public class GeodesyUtil {
+
+
+    /**
+     * 获取直线距离
+     * @param fromLonLat
+     * @param toLonLat
+     * @return
+     */
+    public static Map<String, Double> getDistance(String fromLonLat, String toLonLat){
+        String[] from = fromLonLat.split(",");
+        String[] to = toLonLat.split(",");
+        GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
+        GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0]));
+        double Sphere = getDistanceMeter(source, target, Ellipsoid.Sphere);
+        double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84);
+        double GRS80 = getDistanceMeter(source, target, Ellipsoid.GRS80);
+        double GRS67 = getDistanceMeter(source, target, Ellipsoid.GRS67);
+        double ANS = getDistanceMeter(source, target, Ellipsoid.ANS);
+        double WGS72 = getDistanceMeter(source, target, Ellipsoid.WGS72);
+        double Clarke1858 = getDistanceMeter(source, target, Ellipsoid.Clarke1858);
+        double Clarke1880 = getDistanceMeter(source, target, Ellipsoid.Clarke1880);
+//        System.out.println("Sphere坐标系计算结果:"+Sphere + "米");
+//        System.out.println("WGS84坐标系计算结果:"+WGS84 + "米");
+//        System.out.println("GRS80坐标系计算结果:"+GRS80 + "米");
+//        System.out.println("GRS67坐标系计算结果:"+GRS67 + "米");
+//        System.out.println("ANS坐标系计算结果:"+ANS + "米");
+//        System.out.println("WGS72坐标系计算结果:"+WGS72 + "米");
+//        System.out.println("Clarke1858坐标系计算结果:"+Clarke1858 + "米");
+//        System.out.println("Clarke1880坐标系计算结果:"+Clarke1880 + "米");
+        Map<String, Double> map = new HashMap<>();
+        map.put("Sphere", Sphere);
+        map.put("WGS84", WGS84);
+        map.put("GRS80", GRS80);
+        map.put("GRS67", GRS67);
+        map.put("ANS", ANS);
+        map.put("WGS72", WGS72);
+        map.put("Clarke1858", Clarke1858);
+        map.put("Clarke1880", Clarke1880);
+        return map;
+    }
+
+
+    private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
+        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
+        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
+        return geoCurve.getEllipsoidalDistance();
+    }
+
+}
diff --git a/cloud-server-other/src/main/resources/mapper/SiteMapper.xml b/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
index ef50ff2..cf93290 100644
--- a/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
+++ b/cloud-server-other/src/main/resources/mapper/SiteMapper.xml
@@ -3,4 +3,33 @@
 <mapper namespace="com.dsh.other.mapper.SiteMapper">
 
 
+    <select id="querySiteList" resultType="com.dsh.other.model.QuerySiteListVo">
+        select
+        a.id,
+        a.`name`,
+        c.`name` as siteTypeName,
+        b.`name` as storeName,
+        b.address as storeAddress,
+        b.lon as storeLon,
+        b.lat as storeLat,
+        CONCAT(a.appointmentStartTime, '-', a.appointmentEndTime) as times,
+        a.cashPrice as price
+        from t_site a
+        left join t_store b on (a.storeId = b.id)
+        left join t_site_type c on (a.siteTypeId = c.id)
+        where a.state = 1
+        <if test="null != item.startTime and '' != item.startTime and null != item.endTime and '' != item.endTime">
+            and CONCAT(DATE_FORMAT(now, '%Y-%m-%d', ' ', a.appointmentStartTime)) &lt;=  CONCAT(DATE_FORMAT(now, '%Y-%m-%d', ' ', #{item.startTime})) and CONCAT(DATE_FORMAT(now, '%Y-%m-%d', ' ', a.appointmentEndTime)) &gt;=  CONCAT(DATE_FORMAT(now, '%Y-%m-%d', ' ', #{item.endTime}))
+        </if>
+        <if test="null != item.siteTypeId">
+            and a.siteTypeId = #{item.siteTypeId}
+        </if>
+        <if test="null != item.cityCode">
+            and b.cityCode = #{item.cityCode}
+        </if>
+        <if test="null != item.storeId">
+            and a.storeId = #{item.storeId}
+        </if>
+        order by a.insertTime desc limit #{item.pageNum}, #{item.pageSize}
+    </select>
 </mapper>
diff --git a/cloud-server-other/src/main/resources/mapper/SiteTypeMapper.xml b/cloud-server-other/src/main/resources/mapper/SiteTypeMapper.xml
new file mode 100644
index 0000000..49048bf
--- /dev/null
+++ b/cloud-server-other/src/main/resources/mapper/SiteTypeMapper.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.dsh.other.mapper.SiteTypeMapper">
+
+
+</mapper>

--
Gitblit v1.7.1