Pārlūkot izejas kodu

客户端同城搭子搜索页面

wangzhijun 2 dienas atpakaļ
vecāks
revīzija
8c6d2f05d9

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java

@@ -15,6 +15,8 @@ import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.domain.vo.MerchantVo;
+import com.ylx.merchant.domain.dto.MerchantListDTO;
+import com.ylx.merchant.domain.vo.MerchantListVO;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 import org.apache.ibatis.annotations.Select;
@@ -202,5 +204,7 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician>
      * @return
      */
     List<HotCompanionMerchantVO> getHotCompanionMerchantList(@Param("dto") CompanionRecommendDTO dto);
+
+    Page<MerchantListVO> getMerchantPage(Page<MerchantListVO> page, @Param("dto") MerchantListDTO dto);
 }
 

+ 3 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java

@@ -25,6 +25,8 @@ import com.ylx.massage.domain.vo.MaTechnicianCertificateVO;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
 import com.ylx.massage.domain.vo.MerchantVo;
+import com.ylx.merchant.domain.dto.MerchantListDTO;
+import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.project.domain.Project;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -279,4 +281,5 @@ public interface IMaTechnicianService extends IService<MaTechnician> {
      */
     List<ContractRecord> getContractRecords(Long userId);
 
+    Page<MerchantListVO> getMerchantPage(MerchantListDTO dto);
 }

+ 38 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -11,6 +11,7 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -23,6 +24,7 @@ import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.DateUtils;
 import com.ylx.common.utils.StringUtils;
+import com.ylx.fareSetting.service.IMaProjectFareSettingService;
 import com.ylx.massage.controller.CityOperationApplicationController;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.*;
@@ -48,6 +50,8 @@ import com.ylx.massage.mapper.ContractRecordMapper;
 import com.ylx.massage.mapper.MaProjectMapper;
 import com.ylx.massage.mapper.MaTeProjectMapper;
 import com.ylx.massage.service.TbFileService;
+import com.ylx.merchant.domain.dto.MerchantListDTO;
+import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.order.domain.TOrder;
 import com.ylx.order.mapper.TOrderMapper;
 import com.ylx.project.domain.Project;
@@ -121,6 +125,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
     private IMaTechnicianService maTechnicianService;
     @Resource
     private  CityOperationApplicationMapper cityOperationApplicationMapper;
+    @Resource
+    private IMaProjectFareSettingService maProjectFareSettingService;
 
 
     /**
@@ -957,7 +963,39 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
 
     }
 
+    @Override
+    public Page<MerchantListVO> getMerchantPage(MerchantListDTO dto) {
+
+        // 1. 执行分页查询 (不带免车费过滤)
+        Page<MerchantListVO> page = new Page<>(dto.getCurrent(), dto.getSize());
+        page = this.baseMapper.getMerchantPage(page, dto);
+        List<MerchantListVO> records = page.getRecords();
+        if (CollUtil.isEmpty(records)) {
+            return page;
+        }
+
+        // 2. 如果用户勾选了“免车费”,则在内存中进行精准过滤
+        if (Boolean.TRUE.equals(dto.getFreeCarFee())) {
+            boolean isDay = this.maProjectFareSettingService.isDayTimePeriod(LocalDateTime.now());
+
+            // 3. 过滤列表
+            Iterator<MerchantListVO> iterator = records.iterator();
+            while (iterator.hasNext()) {
+                MerchantListVO vo = iterator.next();
+                double currentDistance = vo.getDistance(); // 数据库算出的距离(km)
 
+                // 获取该商户的有效免费里程
+                BigDecimal freeKm = this.maProjectFareSettingService.getMerchantFreeKm(vo.getId(), dto.getProjectId(),isDay);
+
+                // 核心判断:如果没配置(为0) 或者 距离超过了免费里程,则剔除
+                if (freeKm == null || freeKm.doubleValue() <= 0 || currentDistance > freeKm.doubleValue()) {
+                    iterator.remove();
+                }
+            }
+        }
+
+        return page;
+    }
 
 
     private void extracted(MaProjectSaveDto dto) {

+ 36 - 0
nightFragrance-massage/src/main/java/com/ylx/merchant/controller/ClientMerchantController.java

@@ -0,0 +1,36 @@
+package com.ylx.merchant.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.core.domain.R;
+import com.ylx.massage.service.IMaTechnicianService;
+import com.ylx.merchant.domain.dto.MerchantListDTO;
+import com.ylx.merchant.domain.vo.MerchantListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/client/merchant")
+@Api(tags = {"用户端商户"})
+@Slf4j
+public class ClientMerchantController {
+
+    @Resource
+    private IMaTechnicianService maTechnicianService;
+
+    @PostMapping("/page")
+    @ApiOperation("同城搭子分页查询接口")
+    public R<Page<MerchantListVO>> getMerchantPage(@Validated @RequestBody MerchantListDTO dto) {
+        Page<MerchantListVO> pageData = maTechnicianService.getMerchantPage(dto);
+        return R.ok(pageData);
+    }
+
+
+}

+ 41 - 0
nightFragrance-massage/src/main/java/com/ylx/merchant/domain/dto/MerchantListDTO.java

@@ -0,0 +1,41 @@
+package com.ylx.merchant.domain.dto;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.massage.domain.MaTechnician;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel("同城搭子分页查询DTO")
+public class MerchantListDTO extends Page<MaTechnician> implements Serializable {
+    private static final long serialVersionUID = -7015224259717934375L;
+
+    @ApiModelProperty("项目ID")
+    private Long projectId;
+
+    @ApiModelProperty("城市编码")
+    private String cityCode;
+
+    @ApiModelProperty("免车费:0=否,1=是")
+    private Boolean freeCarFee;
+
+    @ApiModelProperty("极速达:0=否,1=是")
+    private Boolean fastArrival;
+
+    @ApiModelProperty("新人上线:0=否,1=是")
+    private Boolean newMerchant;
+
+    @ApiModelProperty("用户经度")
+    @NotNull(message = "用户经度不能为空")
+    private Double longitude;
+
+    @ApiModelProperty("用户纬度")
+    @NotNull(message = "用户纬度不能为空")
+    private Double latitude;
+
+}

+ 36 - 0
nightFragrance-massage/src/main/java/com/ylx/merchant/domain/vo/MerchantListVO.java

@@ -0,0 +1,36 @@
+package com.ylx.merchant.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel("同城搭子vo")
+public class MerchantListVO implements Serializable {
+    private static final long serialVersionUID = 6026187868884160213L;
+
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("商户名称")
+    private String name;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("价格")
+    private BigDecimal price;
+
+    @ApiModelProperty("距离")
+    private Double distance;
+
+    @ApiModelProperty("评分")
+    private Double score;
+
+    @ApiModelProperty("已服务单量")
+    private Integer serviceCount;
+
+}

+ 62 - 0
nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml

@@ -568,4 +568,66 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             LIMIT 5
     </select>
 
+    <select id="getMerchantPage" resultType="com.ylx.merchant.domain.vo.MerchantListVO">
+        SELECT
+            t.id,
+            t.te_name AS name,
+            t.te_avatar AS avatar,
+            MIN(p.project_current_price) AS price,
+            SUM(p.project_users_num) AS service_count,
+            <!-- 1. 计算距离 (单位:米),MySQL 8.0 专用函数 -->
+            ST_Distance_Sphere(
+            POINT(ANY_VALUE(ta.longitude), ANY_VALUE(ta.latitude)),
+            POINT(#{dto.longitude}, #{dto.latitude})
+            ) / 1000 AS distance,
+
+            <!-- 2. 评分处理:如果为null或0,默认为5.0 -->
+            GREATEST(IFNULL(t.n_star, 0), 4.5) AS score
+
+        FROM ma_technician t
+        <!-- 关联项目表以获取价格和分类信息 -->
+        LEFT JOIN ma_project p ON t.id = p.merchant_id AND p.audit_status = 1 AND p.is_delete = 0
+        LEFT JOIN t_address ta ON t.id = ta.merchant_id AND ta.user_type = 2 AND ta.is_default = 1 AND ta.is_delete = 0
+
+        <where>
+            <!-- 基础状态过滤 -->
+            AND t.audit_status = 1
+            AND t.merchant_status = 0
+            AND t.is_delete = 0
+            AND p.project_is_enable = 0
+
+            <!-- Tab分类筛选 -->
+            <if test="dto.projectId != null">
+                AND p.id = #{dto.projectId}
+            </if>
+
+            <!-- 筛选:极速达 (距离 <= 5km) -->
+            <if test="dto.fastArrival != null and dto.fastArrival == true">
+                AND ST_Distance_Sphere(
+                POINT(ta.longitude, ta.latitude),
+                POINT(#{dto.longitude}, #{dto.latitude})
+                ) &lt;= 5000
+            </if>
+
+            <!-- 筛选:新人上线 (上次接单时间 > 30天前) -->
+            <if test="dto.newMerchant != null and dto.newMerchant == true">
+                AND NOT EXISTS (
+                SELECT 1 FROM t_order o
+                WHERE o.merchant_id = t.id
+                AND o.is_delete = 0
+                AND o.completed_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)
+                )
+            </if>
+
+            <!-- 筛选:开通城市-->
+            <if test="dto.cityCode != null and dto.cityCode != ''">
+                AND t.te_area_code LIKE CONCAT(#{dto.cityCode}, '%')
+            </if>
+        </where>
+
+        GROUP BY t.id
+        <!-- 排序逻辑 -->
+        ORDER BY distance ASC
+    </select>
+
 </mapper>