Przeglądaj źródła

首页选择城市、首页按摩推荐商户、首页选中城市是否有开通商户、订单状态流转表

郭子栋 1 tydzień temu
rodzic
commit
f422f16cc4
25 zmienionych plików z 819 dodań i 2 usunięć
  1. 4 1
      nightFragrance-massage/pom.xml
  2. 39 0
      nightFragrance-massage/src/main/java/com/ylx/massage/controller/MassageRecommendController.java
  3. 128 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaTechnician.java
  4. 6 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/TAddress.java
  5. 31 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MassageRecommendDto.java
  6. 25 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MassageRecommendVo.java
  7. 54 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MerchantVo.java
  8. 8 1
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java
  9. 5 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/AreaService.java
  10. 12 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java
  11. 10 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMassageRecommendService.java
  12. 79 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/AreaServiceImpl.java
  13. 27 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java
  14. 30 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MassageRecommendServiceImpl.java
  15. 46 0
      nightFragrance-massage/src/main/java/com/ylx/order/domain/OrderStatusFlow.java
  16. 7 0
      nightFragrance-massage/src/main/java/com/ylx/order/mapper/OrderStatusFlowMapper.java
  17. 15 0
      nightFragrance-massage/src/main/java/com/ylx/order/service/OrderStatusFlowService.java
  18. 25 0
      nightFragrance-massage/src/main/java/com/ylx/order/service/OrderStatusFlowServiceImpl.java
  19. 28 0
      nightFragrance-massage/src/main/java/com/ylx/userhome/area/constants/CityCodeTypeEnum.java
  20. 73 0
      nightFragrance-massage/src/main/java/com/ylx/userhome/area/controller/CustomerCityController.java
  21. 49 0
      nightFragrance-massage/src/main/java/com/ylx/userhome/area/domain/vo/CityVo.java
  22. 76 0
      nightFragrance-massage/src/main/java/com/ylx/userhome/area/util/CityChineseUtil.java
  23. 27 0
      nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml
  24. 9 0
      nightFragrance-massage/src/main/resources/mapper/order/OrderStatusFlowMapper.xml
  25. 6 0
      pom.xml

+ 4 - 1
nightFragrance-massage/pom.xml

@@ -53,6 +53,9 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>nightFragrance-framework</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>com.github.stuxuhai</groupId>
+            <artifactId>jpinyin</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 39 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/controller/MassageRecommendController.java

@@ -0,0 +1,39 @@
+package com.ylx.massage.controller;
+
+import com.ylx.common.core.domain.R;
+import com.ylx.massage.domain.dto.MassageRecommendDto;
+import com.ylx.massage.domain.vo.MassageRecommendVo;
+import com.ylx.massage.domain.vo.MerchantVo;
+import com.ylx.massage.service.IMaTechnicianService;
+import com.ylx.massage.service.IMassageRecommendService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 类描述:按摩推荐
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/2 16:36
+ */
+@Slf4j
+@RestController
+@Api(tags = {"首页按摩推荐"})
+@RequestMapping("/home/massage")
+public class MassageRecommendController {
+
+    @Autowired
+    private IMassageRecommendService massageRecommendService;
+
+    @ApiOperation(value="首页按摩推荐", notes="首页按摩推荐")
+    @PostMapping(value = "/getMassageRecommend")
+    public R<List<MassageRecommendVo>> getMassageRecommend(@RequestBody MassageRecommendDto dto) {
+        List<MassageRecommendVo> massageRecommendVos = massageRecommendService.getMassageRecommend(dto);
+        return R.ok(massageRecommendVos);
+    }
+}

+ 128 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaTechnician.java

@@ -7,12 +7,19 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ylx.common.annotation.Excel;
 import com.ylx.common.core.domain.BaseEntity;
 
 import java.math.BigInteger;
 import java.util.Date;
 
+import java.math.BigDecimal;
+
 /**
  * 技师对象 ma_technician
  *
@@ -70,6 +77,14 @@ public class MaTechnician extends BaseEntity
     @TableField("te_address")
     private String teAddress;
 
+    /**
+     * 城市编码
+     */
+    private String teAreaCode;
+
+    /**
+     * 年龄
+     */
     /** 年龄 */
     @Excel(name = "年龄")
     @TableField("te_age")
@@ -170,6 +185,119 @@ public class MaTechnician extends BaseEntity
     @Excel(name = "是否删除(0否1是)")
     private Long isDelete;
 
+    /**
+     * 评分
+     * 用户对技师的评分,通常为1-5分
+     */
+    @ApiModelProperty("评分")
+    private Integer nStar;
+
+    /**
+     * 已服务数量
+     * 技师累计完成的订单总数
+     */
+    @TableField("n_num")
+    @ApiModelProperty("已服务订单数量")
+    private Integer nNum;
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setTeName(String teName) {
+        this.teName = teName;
+    }
+
+    public String getTeName() {
+        return teName;
+    }
+
+    public void setTeSex(Long teSex) {
+        this.teSex = teSex;
+    }
+
+    public Long getTeSex() {
+        return teSex;
+    }
+
+    public void setTePhone(String tePhone) {
+        this.tePhone = tePhone;
+    }
+
+    public String getTePhone() {
+        return tePhone;
+    }
+
+    public void setTeAddress(String teAddress) {
+        this.teAddress = teAddress;
+    }
+
+    public String getTeAddress() {
+        return teAddress;
+    }
+
+    public void setTeAge(Long teAge) {
+        this.teAge = teAge;
+    }
+
+    public Long getTeAge() {
+        return teAge;
+    }
+
+    public void setTeAvatar(String teAvatar) {
+        this.teAvatar = teAvatar;
+    }
+
+    public String getTeAvatar() {
+        return teAvatar;
+    }
+
+    public void setLifePhotos(String lifePhotos) {
+        this.lifePhotos = lifePhotos;
+    }
+
+    public String getLifePhotos() {
+        return lifePhotos;
+    }
+
+    public void setTeBrief(String teBrief) {
+        this.teBrief = teBrief;
+    }
+
+    public String getTeBrief() {
+        return teBrief;
+    }
+
+    public void setServiceState(Long serviceState) {
+        this.serviceState = serviceState;
+    }
+
+    public Long getServiceState() {
+        return serviceState;
+    }
+
+    public void setPostState(Long postState) {
+        this.postState = postState;
+    }
+
+    public Long getPostState() {
+        return postState;
+    }
+
+    public void setTeIsEnable(Long teIsEnable) {
+        this.teIsEnable = teIsEnable;
+    }
+
+    public Long getTeIsEnable() {
+        return teIsEnable;
+    }
+
+    public void setCreateUser(Long createUser) {
+        this.createUser = createUser;
+    }
 
 
 }

+ 6 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TAddress.java

@@ -26,6 +26,12 @@ public class TAddress extends Model<TAddress> {
     @ApiModelProperty("主键")
     private String id;
 
+    /**
+     * 商户id
+     */
+    @ApiModelProperty("商户id")
+    private Long merchantId;
+
     /**
      * 用户openId
      */

+ 31 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MassageRecommendDto.java

@@ -0,0 +1,31 @@
+package com.ylx.massage.domain.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类描述:按摩推荐dto
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/2 16:41
+ */
+@Data
+public class MassageRecommendDto {
+    /**
+     * 经度
+     * 用户当前位置的经度坐标
+     */
+    @ApiModelProperty("用户经度")
+    private BigDecimal longitude;
+
+    /**
+     * 纬度
+     * 用户当前位置的纬度坐标
+     */
+    @ApiModelProperty("用户纬度")
+    private BigDecimal latitude;
+}

+ 25 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MassageRecommendVo.java

@@ -0,0 +1,25 @@
+package com.ylx.massage.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 类描述:首页按摩推荐vo
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/2 15:38
+ */
+@Data
+public class MassageRecommendVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 推荐商户列表:评分前五
+     */
+    private List<MerchantVo> merchantVoList;
+
+    //todo 推荐项目列表
+}

+ 54 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MerchantVo.java

@@ -0,0 +1,54 @@
+package com.ylx.massage.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ylx.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 类描述:商户vo
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/2 15:41
+ */
+@Data
+public class MerchantVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ApiModelProperty("商户id")
+    private Long merchantId;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("商户名")
+    private String teName;
+    /**
+     * 评分
+     */
+    @ApiModelProperty("评分")
+    private Integer nStar;
+    /**
+     * 已服务数量
+     */
+    @ApiModelProperty("已服务订单数量")
+    private Integer nNum;
+
+    @ApiModelProperty("技师距离(公里)")
+    private BigDecimal distance ;
+
+    /**
+     * 商户开通技能时设置的最低价格
+     */
+    //todo 需要查商户技能开通表
+    @ApiModelProperty("最低价格")
+    private BigDecimal price;
+
+}

+ 8 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java

@@ -1,7 +1,12 @@
 package com.ylx.massage.mapper;
 
 import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ylx.massage.domain.MaTechnician;
+import com.ylx.massage.domain.dto.MassageRecommendDto;
+import com.ylx.massage.domain.vo.MerchantVo;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 技师Mapper接口
@@ -9,7 +14,7 @@ import com.ylx.massage.domain.MaTechnician;
  * @author ylx
  * @date 2024-03-22
  */
-public interface MaTechnicianMapper
+public interface MaTechnicianMapper extends BaseMapper<MaTechnician>
 {
     /**
      * 查询技师
@@ -58,4 +63,6 @@ public interface MaTechnicianMapper
      * @return 结果
      */
     public int deleteMaTechnicianByIds(Long[] ids);
+
+    List<MerchantVo> getMerchantRecommend(@Param("dto") MassageRecommendDto dto);
 }

+ 5 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/AreaService.java

@@ -5,6 +5,7 @@ import com.ylx.massage.domain.Area;
 import com.ylx.massage.domain.dto.CoordinateDTO;
 import com.ylx.massage.domain.vo.AreaTreeNode;
 import com.ylx.massage.domain.vo.CityInfoVo;
+import com.ylx.userhome.area.domain.vo.CityVo;
 
 import java.util.List;
 
@@ -19,5 +20,9 @@ public interface AreaService extends IService<Area> {
     List<AreaTreeNode> getAreaTree();
 
     CityInfoVo getCityInfoByCoordinates(CoordinateDTO dto);
+
+    List<CityVo> getHomeList ();
+
+    List<CityVo> getCityName(String name);
 }
 

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

@@ -2,7 +2,10 @@ package com.ylx.massage.service;
 
 import java.util.List;
 import com.ylx.massage.domain.MaTechnician;
+import com.ylx.massage.domain.dto.MassageRecommendDto;
 import com.ylx.massage.domain.vo.MaTechnicianAppAddVo;
+import com.ylx.massage.domain.vo.MassageRecommendVo;
+import com.ylx.massage.domain.vo.MerchantVo;
 
 /**
  * 技师Service接口
@@ -59,4 +62,13 @@ public interface IMaTechnicianService
      * @return 结果
      */
     public int deleteMaTechnicianById(Long id);
+
+    /**
+     * 首页选中的城市是否有开通服务
+     * @param areaCode
+     * @return
+     */
+    Boolean isHasMerchantCity(String areaCode);
+
+    List<MerchantVo> getMerchantRecommend(MassageRecommendDto dto);
 }

+ 10 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMassageRecommendService.java

@@ -0,0 +1,10 @@
+package com.ylx.massage.service;
+
+import com.ylx.massage.domain.dto.MassageRecommendDto;
+import com.ylx.massage.domain.vo.MassageRecommendVo;
+
+import java.util.List;
+
+public interface IMassageRecommendService {
+    List<MassageRecommendVo> getMassageRecommend(MassageRecommendDto dto);
+}

+ 79 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/AreaServiceImpl.java

@@ -16,10 +16,16 @@ import com.ylx.massage.domain.dto.CoordinateDTO;
 import com.ylx.massage.domain.vo.*;
 import com.ylx.massage.mapper.AreaMapper;
 import com.ylx.massage.service.AreaService;
+import com.ylx.userhome.area.constants.CityCodeTypeEnum;
+import com.ylx.userhome.area.domain.vo.CityVo;
+import com.ylx.userhome.area.util.CityChineseUtil;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -38,6 +44,10 @@ public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements Ar
     private static final String ERROR_MSG_CITY_NOT_FOUND = "城市数据不存在";
     private static final int MAX_QUERY_RESULTS = 1;
 
+    private static final List<String> PROVINCE_CODE_LIST = Arrays.asList("110100", "120100", "310100", "500100");
+
+    private final static String CITY_TYPE = "市辖区";
+
     /**
      * 一次性查询所有区域,内存构建树形结构
      */
@@ -155,4 +165,73 @@ public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements Ar
 
         return new CityInfoVo(area.getName(), area.getCode());
     }
+
+    /**
+     * 用户首页地区查询
+     * @return
+     */
+    @Override
+    public List<CityVo> getHomeList() {
+        LambdaQueryWrapper<Area> citySql = new LambdaQueryWrapper<>();
+        citySql.eq(Area::getLevel, 2);
+        List<Area> homeListDB = list(citySql);
+        homeListDB.stream()
+                .forEach(city -> {
+                    if (PROVINCE_CODE_LIST.contains(city.getCode())) {
+                        String cityName = CityCodeTypeEnum.getCityCodeType(city.getCode());
+                        city.setName(cityName);
+                    }
+                });
+        List<CityVo> cityList = cityConvert(homeListDB);
+        cityList = cityList.stream()
+                .filter(cityDTO -> ObjectUtils.isNotEmpty(cityDTO.getCityList()) && !cityDTO.getCityList().isEmpty())
+                .collect(Collectors.toList());
+        return cityList;
+    }
+
+    @Override
+    public List<CityVo> getCityName(String name) {
+        LambdaQueryWrapper<Area> citySql = new LambdaQueryWrapper<>();
+        citySql.like(Area::getName, name);
+        List<Area> homeList = list(citySql);
+        List<CityVo> cityList = cityConvert(homeList);
+        cityList = cityList.stream()
+                .filter(cityVO -> ObjectUtils.isNotEmpty(cityVO.getCityList()) && !cityVO.getCityList().isEmpty())
+                .collect(Collectors.toList());
+        return cityList;
+    }
+
+    private List<CityVo> cityConvert(List<Area> homeListDB) {
+        List<Area> homeList = homeListDB.stream()
+                .filter(city -> !CITY_TYPE.equals(city.getName()))
+                .collect(Collectors.toList());
+        Map<String, Area> cityMap = homeList.stream().collect(Collectors.toMap(Area::getName, Area -> Area, (existing, replacement) -> existing));
+//        }
+        //获取所有城市名称
+        List<String> cityList = cityMap.keySet().stream().collect(Collectors.toList());
+
+        List<CityVo> cityVoList = new ArrayList<>();
+        try {
+            //按照首字母进行城市分组
+            Map<String, List<String>> pinyingMap = CityChineseUtil.getCodeGroup(cityList);
+            //将分组对象转化成前端所需格式类型
+            pinyingMap.forEach((pinying, mapCityList) -> {
+                CityVo cityVo = new CityVo();
+                cityVo.setLetter(pinying);
+                List<CityVo.City> cityNewList = new ArrayList<>();
+                mapCityList.stream()
+                        .forEach(city -> {
+                            CityVo.City cityNew = new CityVo.City();
+                            BeanUtils.copyProperties(cityMap.get(city), cityNew);
+                            cityNewList.add(cityNew);
+                        });
+                cityVo.setCityList(cityNewList);
+                cityVoList.add(cityVo);
+            });
+        } catch (Exception e) {
+            log.error("首页城市列表拼音转换接口报错!");
+            throw new RuntimeException(e);
+        }
+        return cityVoList;
+    }
 }

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

@@ -1,7 +1,12 @@
 package com.ylx.massage.service.impl;
 
 import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ylx.massage.domain.dto.MassageRecommendDto;
 import com.ylx.massage.domain.vo.MaTechnicianAppAddVo;
+import com.ylx.massage.domain.vo.MassageRecommendVo;
+import com.ylx.massage.domain.vo.MerchantVo;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -116,4 +121,26 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
     {
         return maTechnicianMapper.deleteMaTechnicianById(id);
     }
+
+    /**
+     * 首页选中的城市是否有开通服务
+     * @param areaCode
+     * @return
+     */
+    @Override
+    public Boolean isHasMerchantCity(String areaCode) {
+        LambdaQueryWrapper<MaTechnician> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(MaTechnician::getTeAreaCode, areaCode);
+        return maTechnicianMapper.selectCount(queryWrapper) > 0;
+    }
+
+    /**
+     * 首页按摩推荐
+     * @param dto
+     * @return
+     */
+    @Override
+    public List<MerchantVo> getMerchantRecommend(MassageRecommendDto dto) {
+        return maTechnicianMapper.getMerchantRecommend(dto);
+    }
 }

+ 30 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MassageRecommendServiceImpl.java

@@ -0,0 +1,30 @@
+package com.ylx.massage.service.impl;
+
+import com.ylx.massage.domain.dto.MassageRecommendDto;
+import com.ylx.massage.domain.vo.MassageRecommendVo;
+import com.ylx.massage.domain.vo.MerchantVo;
+import com.ylx.massage.service.IMaTechnicianService;
+import com.ylx.massage.service.IMassageRecommendService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 类描述:用户首页按摩推荐
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/3 9:30
+ */
+@Service("massageRecommendService")
+public class MassageRecommendServiceImpl implements IMassageRecommendService {
+    @Autowired
+    private IMaTechnicianService iMaTechnicianService;
+    @Override
+    public List<MassageRecommendVo> getMassageRecommend(MassageRecommendDto dto) {
+        //按摩商户推荐
+        List<MerchantVo> merchantVoList = iMaTechnicianService.getMerchantRecommend(dto);
+
+    }
+}

+ 46 - 0
nightFragrance-massage/src/main/java/com/ylx/order/domain/OrderStatusFlow.java

@@ -0,0 +1,46 @@
+package com.ylx.order.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ylx.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 类描述:订单状态流转表
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/3 10:30
+ */
+@Data
+@TableName(value = "t_order_status_flow", autoResultMap = true)
+@ApiModel(value = "OrderStatusFlow", description = "订单状态流转表")
+public class OrderStatusFlow extends BaseEntity implements Serializable  {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty("主键")
+    private Long id;
+    /*
+     * 订单号
+     */
+    @TableField("order_no")
+    @ApiModelProperty("订单号")
+    private String orderNo;
+    /**
+     * 流转状态
+     */
+    @TableField("status")
+    @ApiModelProperty("同步订单表状态")
+    private Integer status;
+
+
+}

+ 7 - 0
nightFragrance-massage/src/main/java/com/ylx/order/mapper/OrderStatusFlowMapper.java

@@ -0,0 +1,7 @@
+package com.ylx.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ylx.order.domain.OrderStatusFlow;
+
+public interface OrderStatusFlowMapper extends BaseMapper<OrderStatusFlow> {
+}

+ 15 - 0
nightFragrance-massage/src/main/java/com/ylx/order/service/OrderStatusFlowService.java

@@ -0,0 +1,15 @@
+package com.ylx.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ylx.order.domain.OrderStatusFlow;
+
+public interface OrderStatusFlowService extends IService<OrderStatusFlow> {
+
+    /**
+     * 记录订单状态流转
+     * @param orderNo
+     * @param status
+     * @return
+     */
+    public void recordFlow(String orderNo, Integer status);
+}

+ 25 - 0
nightFragrance-massage/src/main/java/com/ylx/order/service/OrderStatusFlowServiceImpl.java

@@ -0,0 +1,25 @@
+package com.ylx.order.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.order.domain.OrderStatusFlow;
+import com.ylx.order.mapper.OrderStatusFlowMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * 类描述:
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/3 10:51
+ */
+@Service("orderStatusFlowService")
+public class OrderStatusFlowServiceImpl extends ServiceImpl<OrderStatusFlowMapper, OrderStatusFlow> implements OrderStatusFlowService {
+
+    @Override
+    public void recordFlow(String orderNo, Integer status) {
+        OrderStatusFlow orderStatusFlow = new OrderStatusFlow();
+        orderStatusFlow.setOrderNo(orderNo);
+        orderStatusFlow.setStatus(status);
+        this.save(orderStatusFlow);
+    }
+}

+ 28 - 0
nightFragrance-massage/src/main/java/com/ylx/userhome/area/constants/CityCodeTypeEnum.java

@@ -0,0 +1,28 @@
+package com.ylx.userhome.area.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 平台订单状态
+ */
+@AllArgsConstructor
+@Getter
+public enum CityCodeTypeEnum {
+    TYPE_110100("110100","北京市"),
+    TYPE_120100("120100","天津市"),
+    TYPE_310100("310100","上海市"),
+    TYPE_500100("500100","重庆市");
+
+    private final String code;
+    private final String name;
+
+    public static String getCityCodeType(String code) {
+        for (CityCodeTypeEnum roleConstants : CityCodeTypeEnum.values()) {
+            if (roleConstants.getCode().equals(code)) {
+                return roleConstants.name;
+            }
+        }
+        return null;
+    }
+}

+ 73 - 0
nightFragrance-massage/src/main/java/com/ylx/userhome/area/controller/CustomerCityController.java

@@ -0,0 +1,73 @@
+package com.ylx.userhome.area.controller;
+
+import com.ylx.common.core.domain.R;
+import com.ylx.massage.service.AreaService;
+import com.ylx.massage.service.IMaTechnicianService;
+import com.ylx.userhome.area.domain.vo.CityVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 类描述:用户首页选择地区
+ *
+ * @author Administrator
+ * @version 1.0
+ * @date 2026/6/2 9:33
+ */
+@Slf4j
+@RestController
+@Api(tags = {"用户首页选择地区"})
+@RequestMapping("/customer/city")
+public class CustomerCityController {
+    @Resource(name = "areaService")
+    private AreaService areaService;
+
+    @Autowired
+    private IMaTechnicianService iMaTechnicianService;
+    /**
+     * 首页-城市列表
+     *
+     * @return
+     */
+    @ApiOperation(value="首页-城市列表", notes="首页-城市列表")
+    @PostMapping(value = "/getCityList")
+    public R<List<CityVo>> getCityList() {
+        try {
+            List<CityVo> list = areaService.getHomeList();
+            return R.ok(list);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return R.fail("接口异常请重试!");
+        }
+    }
+
+    @ApiOperation(value="首页选中的城市是否有开通服务", notes="首页选中的城市是否有开通服务;true表示该城市有开通服务")
+    @GetMapping(value = "/isHasMerchantCity")
+    public R<Boolean> isHasMerchantCity(@RequestParam("areaCode") String areaCode) {
+            return R.ok(iMaTechnicianService.isHasMerchantCity(areaCode));
+    }
+
+    /**
+     * 首页-城市列表查询
+     *
+     * @param name
+     * @return Result
+     */
+    @ApiOperation(value="首页-城市列表查询", notes="首页-城市列表查询")
+    @PostMapping(value = "/getCityByName")
+    public R<List<CityVo>> getCityByName(@RequestParam(value = "name",required = false) String name) {
+        try {
+            List<CityVo> list = areaService.getCityName(name);
+            return R.ok(list);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return R.fail("接口异常请重试!");
+        }
+    }
+}

+ 49 - 0
nightFragrance-massage/src/main/java/com/ylx/userhome/area/domain/vo/CityVo.java

@@ -0,0 +1,49 @@
+package com.ylx.userhome.area.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用户首页查询地区返回vo
+ */
+@Data
+public class CityVo implements Serializable {
+
+    private static final long serialVersionUID = -7916708029160827482L;
+
+
+    /**
+     * 首字母
+     */
+    private String letter;
+    /**
+     * 城市集合
+     */
+    private List<City> cityList;
+
+    @Data
+    public static class City {
+        /**
+         * 区域主键
+         */
+        @ApiModelProperty(value = "区域ID")
+        private String code;
+        /**
+         * 区域名称
+         */
+        @ApiModelProperty(value = "区域名称")
+        private String name;
+
+        public City(String code, String name) {
+            this.code = code;
+            this.name = name;
+        }
+
+        public City() {
+
+        }
+    }
+}

+ 76 - 0
nightFragrance-massage/src/main/java/com/ylx/userhome/area/util/CityChineseUtil.java

@@ -0,0 +1,76 @@
+package com.ylx.userhome.area.util;
+
+import com.github.stuxuhai.jpinyin.PinyinException;
+import com.github.stuxuhai.jpinyin.PinyinFormat;
+import com.github.stuxuhai.jpinyin.PinyinHelper;
+
+import java.text.Collator;
+import java.util.*;
+
+/**
+ * @Description
+ * @Author lgx
+ * @Time 2023/4/17
+ */
+public class CityChineseUtil {
+
+    /**
+     * 获取姓名全拼和首字母
+     * PinyinFormat:WITH_TONE_MARK(声调模式),WITH_TONE_NUMBER(数字代表声调模式),WITHOUT_TONE(无声调模式)
+     * @param  chinese 汉语名称
+     * @return fullPinyin : 全拼   simplePinyin : 首字母  groupPinyin:微信用户组第一个字母
+     * @throws PinyinException
+     */
+    public static Map<String, String> changeChinesePinyin(String chinese) throws Exception {
+        Map<String, String> pinyin = new HashMap<String, String>();
+
+        //将中文转化成拼音(全拼)
+        String fullPinyin = PinyinHelper.convertToPinyinString(chinese,"", PinyinFormat.WITHOUT_TONE);
+        //将中文转化为简拼模式(各汉字第一个字母组成)
+        String simplePinyin = PinyinHelper.getShortPinyin(chinese);
+        //首字母
+        String firstPinyin = String.valueOf(simplePinyin.charAt(0));
+
+        pinyin.put("fullPinyin", fullPinyin);
+        pinyin.put("simplePinyin", simplePinyin.toUpperCase());
+        pinyin.put("groupPinyin", firstPinyin.toUpperCase());
+        return pinyin;
+    }
+    /**
+     * 按拼音首字母分组
+     * @param list
+     * @return
+     */
+    public static Map<String, List<String>> getCodeGroup(List<String> list) throws Exception{
+        Comparator<Object> com = Collator.getInstance(Locale.CHINA);
+        //按字母排序
+        Collections.sort(list, com);
+        //输出26个字母
+        Map<String, List<String>> map = new TreeMap<String, List<String>>();
+        for(int i=1;i<=26;i++){
+            String word = String. valueOf((char) (96 + i)). toUpperCase();
+            //循环找出首字母一样的数据
+            List<String> letter = new ArrayList<String>();
+            for (String str : list) {
+                String code = changeChinesePinyin(str).get("groupPinyin");
+                if(word.equals(code)) {
+                    letter.add(str);
+                }
+            }
+            map.put(word, letter);
+        }
+        return map;
+    }
+
+//        String str = "长沙市";
+//        //设置声调表示格式
+//        System.out.println(PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITH_TONE_MARK)); // nǐ,hǎo,shì,jiè
+//        //数字表示声调
+//        System.out.println(PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITH_TONE_NUMBER)); // ni3,hao3,shi4,jie4
+//        //无声调
+//        System.out.println( PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITHOUT_TONE)); // ni,hao,shi,jie
+//        //获取拼音首字母
+//        System.out.println(PinyinHelper.getShortPinyin(str)); // nhsj
+//        //判断是否多音字
+//        System.out.println(PinyinHelper.hasMultiPinyin('啊'));//true
+}

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

@@ -126,4 +126,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+     <!-- todo p.price最低-->
+    <select id="getMerchantRecommend" resultType="com.ylx.massage.domain.vo.MerchantVo">
+        SELECT
+        t.id AS merchantId,
+        t.te_name AS teName,
+        t.n_star AS nStar,
+        t.n_num AS nNum,
+        ST_Distance_Sphere(
+        POINT(a.longitude, a.latitude),
+        POINT(#{dto.longitude}, #{dto.latitude})
+        ) / 1000 AS distance
+        FROM ma_technician t
+        LEFT JOIN t_address a ON t.id = a.merchant_id
+        LEFT JOIN(
+            SELECT p.user_id AS user_id ,
+                   p.project_current_price AS  price
+            FROM ma_project p
+        ) p ON t.id = p.user_d
+
+        WHERE
+        t.is_delete = 0
+        and a.user_type = 2
+        and a.type = 1
+        and a.is_delete = 0
+        ORDER BY t.n_num DESC
+        LIMIT 5
+    </select>
 </mapper>

+ 9 - 0
nightFragrance-massage/src/main/resources/mapper/order/OrderStatusFlowMapper.xml

@@ -0,0 +1,9 @@
+<?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.ylx.order.mapper.OrderStatusFlowMapper">
+
+
+
+</mapper>

+ 6 - 0
pom.xml

@@ -30,6 +30,7 @@
         <poi.version>4.1.2</poi.version>
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
+        <jpinyin.version>1.1.8</jpinyin.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -162,6 +163,11 @@
                 <artifactId>nightFragrance-common</artifactId>
                 <version>${ruoyi.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.github.stuxuhai</groupId>
+                <artifactId>jpinyin</artifactId>
+                <version>${jpinyin.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>