瀏覽代碼

商户主页商户详情接口

wangzhijun 2 周之前
父節點
當前提交
dcf5f21df1

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

@@ -15,8 +15,10 @@ 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.MerchantDetailDTO;
 import com.ylx.merchant.domain.dto.MerchantListDTO;
 import com.ylx.merchant.domain.dto.MerchantProjectDTO;
+import com.ylx.merchant.domain.vo.MerchantDetailVO;
 import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;
 import org.apache.ibatis.annotations.Param;
@@ -210,5 +212,9 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician>
     Page<MerchantListVO> getMerchantPage(Page<MerchantListVO> page, @Param("dto") MerchantListDTO dto);
 
     Page<ProjectInfoVO> getByMerchantProject(Page<ProjectInfoVO> page, @Param("dto") MerchantProjectDTO dto);
+
+    MerchantDetailVO getDetailById(Integer id);
+
+    MerchantDetailVO getDetail(@Param("dto") MerchantDetailDTO dto);
 }
 

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

@@ -25,8 +25,10 @@ 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.MerchantDetailDTO;
 import com.ylx.merchant.domain.dto.MerchantListDTO;
 import com.ylx.merchant.domain.dto.MerchantProjectDTO;
+import com.ylx.merchant.domain.vo.MerchantDetailVO;
 import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;
@@ -286,4 +288,6 @@ public interface IMaTechnicianService extends IService<MaTechnician> {
     Page<MerchantListVO> getMerchantPage(MerchantListDTO dto);
 
     Page<ProjectInfoVO> getByMerchantProject(MerchantProjectDTO dto);
+
+    MerchantDetailVO getDetail(MerchantDetailDTO dto);
 }

+ 75 - 36
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -12,6 +12,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 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.AjaxResult;
 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.DistanceUtil;
 import com.ylx.common.utils.StringUtils;
 import com.ylx.fareSetting.service.IMaProjectFareSettingService;
 import com.ylx.massage.controller.CityOperationApplicationController;
@@ -49,9 +51,12 @@ import com.ylx.massage.domain.vo.MerchantVo;
 import com.ylx.massage.mapper.ContractRecordMapper;
 import com.ylx.massage.mapper.MaProjectMapper;
 import com.ylx.massage.mapper.MaTeProjectMapper;
+import com.ylx.massage.service.TAddressService;
 import com.ylx.massage.service.TbFileService;
+import com.ylx.merchant.domain.dto.MerchantDetailDTO;
 import com.ylx.merchant.domain.dto.MerchantListDTO;
 import com.ylx.merchant.domain.dto.MerchantProjectDTO;
+import com.ylx.merchant.domain.vo.MerchantDetailVO;
 import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.order.domain.TOrder;
 import com.ylx.order.mapper.TOrderMapper;
@@ -126,9 +131,11 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
     @Autowired
     private IMaTechnicianService maTechnicianService;
     @Resource
-    private  CityOperationApplicationMapper cityOperationApplicationMapper;
+    private CityOperationApplicationMapper cityOperationApplicationMapper;
     @Resource
     private IMaProjectFareSettingService maProjectFareSettingService;
+    @Resource
+    private TAddressService addressService;
 
 
     /**
@@ -157,6 +164,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
 
     /**
      * 添加城市管理地址
+     *
      * @param req
      * @param maTechnician1
      * @param maTechnician
@@ -768,14 +776,14 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         }
 
         List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
-                                                                  .in(Project::getId, distinctProjectIds)
-                                                                  .eq(Project::getIsDelete, 0));
+                .in(Project::getId, distinctProjectIds)
+                .eq(Project::getIsDelete, 0));
         if (projects.size() != distinctProjectIds.size()) {
             throw new ServiceException("服务项目不存在或已删除");
         }
 
         Map<Integer, Project> projectMap = projects.stream()
-                                                   .collect(Collectors.toMap(project -> project.getId(), Function.identity(), (left, right) -> left));
+                .collect(Collectors.toMap(project -> project.getId(), Function.identity(), (left, right) -> left));
         Set<Integer> projectCategoryIds = new LinkedHashSet<>();
         for (Integer projectId : distinctProjectIds) {
             Project project = projectMap.get(projectId);
@@ -815,16 +823,16 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
 
     private String joinIds(Set<Integer> ids) {
         return ids.stream()
-                       .map(String::valueOf)
-                       .collect(Collectors.joining(","));
+                .map(String::valueOf)
+                .collect(Collectors.joining(","));
     }
 
     private String joinProjectTitles(Set<Integer> projectIds, Map<Integer, Project> projectMap) {
         return projectIds.stream()
-                       .map(projectMap::get)
-                       .map(Project::getTitle)
-                       .filter(StringUtils::isNotBlank)
-                       .collect(Collectors.joining(","));
+                .map(projectMap::get)
+                .map(Project::getTitle)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.joining(","));
     }
 
     /**
@@ -940,6 +948,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         merchantAuditFile.setMerchantAuditFile(merchantApplyFile);
         return merchantAuditFile;
     }
+
     /**
      * 查询商户合同记录信息
      *
@@ -947,17 +956,17 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
      * @return
      */
     @Override
-   public List<ContractRecord> getContractRecords(Long userId){
+    public List<ContractRecord> getContractRecords(Long userId) {
         LambdaQueryWrapper<ContractRecord> query = new LambdaQueryWrapper<>();
         query.eq(ContractRecord::getMerchantId, userId);
         List<ContractRecord> contractRecordList = contractRecordMapper.selectList(query);
-        if(contractRecordList.size() == 0) {
+        if (contractRecordList.size() == 0) {
             return new ArrayList<>();
-        }else {
+        } else {
             Set<String> seen = new HashSet<>();
             contractRecordList = contractRecordList.stream()
-                                                        .filter(record -> record.getContractName() != null && seen.add(record.getContractName()))
-                                                        .collect(Collectors.toList());
+                    .filter(record -> record.getContractName() != null && seen.add(record.getContractName()))
+                    .collect(Collectors.toList());
 
         }
 
@@ -1005,6 +1014,34 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         return this.baseMapper.getByMerchantProject(page, dto);
     }
 
+    @Override
+    public MerchantDetailVO getDetail(MerchantDetailDTO dto) {
+
+        // 1. 获取商户信息
+        MerchantDetailVO detail = this.baseMapper.getDetail(dto);
+        if (ObjectUtil.isNull(detail)) {
+            throw new ServiceException("商户不存在");
+        }
+
+        // 2. 获取商户的默认地址
+        TAddress address = this.addressService.getOne(new LambdaQueryWrapper<TAddress>()
+                .eq(TAddress::getMerchantId, dto.getMerchantId())
+                .eq(TAddress::getIsDefault, 1)
+                .eq(TAddress::getIsDelete, 0));
+        if (ObjectUtil.isNull(address)) {
+            throw new ServiceException("无法获取商户的默认地址");
+        }
+
+        // 3. 计算当前用户距离商户距离
+        String distanceStr = DistanceUtil.formatDistanceInKilometers(
+                dto.getLatitude(),dto.getLongitude(),
+                address.getLatitude(),address.getLongitude()
+        );
+        detail.setDistance(distanceStr);
+
+        return detail;
+    }
+
 
     private void extracted(MaProjectSaveDto dto) {
         LambdaQueryWrapper<Project> query = new LambdaQueryWrapper<>();
@@ -1060,8 +1097,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
                 long minutesOnline = 0;
                 if (attendance != null && attendance.getAttendanceStartTime() != null) {
                     LocalDateTime localDateTime = attendance.getAttendanceStartTime().toInstant()
-                                                          .atZone(ZoneId.systemDefault())
-                                                          .toLocalDateTime();
+                            .atZone(ZoneId.systemDefault())
+                            .toLocalDateTime();
                     //计算截止现在的时长,单位为分钟
                     minutesOnline = Duration.between(localDateTime, LocalDateTime.now()).toMinutes();
                     // 计算今日的累加在线时长
@@ -1079,8 +1116,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
                         if (!forceConfirm) {
                             // 返回特定错误码或数据结构,告诉前端弹出“我在想想/确认下线”的模态框
                             return Result.ok("平台对您的在线时间做了约定,每日在线需满足"
-                                                     + (requiredMinutes / 60) + "小时,距离您下线时间还剩余" + ((requiredMinutes / 60) - minutesOnline) + "小时"
-                                                     + "不满足在线时间将收到平台处罚,是否确认下线?");
+                                    + (requiredMinutes / 60) + "小时,距离您下线时间还剩余" + ((requiredMinutes / 60) - minutesOnline) + "小时"
+                                    + "不满足在线时间将收到平台处罚,是否确认下线?");
                         }
                         // 情况 B: 超时了,但用户已经点击了“确认下线”,允许通过
                     }
@@ -1102,8 +1139,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
                 MerchantDailyAttendance update = merchantDailyAttendanceMapper.selectOne(query);
                 if (update != null) {
                     LocalDateTime localDateTime = update.getAttendanceStartTime().toInstant()
-                                                          .atZone(ZoneId.systemDefault())
-                                                          .toLocalDateTime();
+                            .atZone(ZoneId.systemDefault())
+                            .toLocalDateTime();
                     LambdaUpdateWrapper<MerchantDailyAttendance> updateWrapper = new LambdaUpdateWrapper<>();
                     updateWrapper.eq(MerchantDailyAttendance::getId, update.getId())
                             .set(MerchantDailyAttendance::getAttendanceEndTime, DateUtils.getNowDate())
@@ -1119,12 +1156,12 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
             updateStatus(userId, TechnicianStatusEnum.ONLINE);
             // 插入今日考勤记录
             MerchantDailyAttendance merchantDailyAttendance = new MerchantDailyAttendance()
-                                                                      .setMerchantId(userId.intValue())
-                                                                      .setAttendanceDate(DateUtils.getNowDate())
-                                                                      .setMerchantName(technician.getTeName())
-                                                                      .setAttendanceStartTime(DateUtils.getNowDate())
-                                                                      .setCreateBy(technician.getTeName())
-                                                                      .setCreateTime(LocalDateTime.now());
+                    .setMerchantId(userId.intValue())
+                    .setAttendanceDate(DateUtils.getNowDate())
+                    .setMerchantName(technician.getTeName())
+                    .setAttendanceStartTime(DateUtils.getNowDate())
+                    .setCreateBy(technician.getTeName())
+                    .setCreateTime(LocalDateTime.now());
             merchantDailyAttendanceMapper.insert(merchantDailyAttendance);
         }
         return Result.ok("状态已切换成功");
@@ -1160,9 +1197,9 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         if (attendances == null || attendances.isEmpty()) return 0;
         // 计算指定日期的总分钟数
         long totalMinutes = attendances.stream()
-                                    .filter(attendance -> DateUtils.getNowDate().toString().equals(attendance.getAttendanceDate().toString()))
-                                    .mapToLong(MerchantDailyAttendance::getTotalWorkMinutes)
-                                    .sum();
+                .filter(attendance -> DateUtils.getNowDate().toString().equals(attendance.getAttendanceDate().toString()))
+                .mapToLong(MerchantDailyAttendance::getTotalWorkMinutes)
+                .sum();
         return totalMinutes;
     }
 
@@ -1352,8 +1389,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
 
         // 3.距离升序:近的排在最前面
         return dtoList.stream()
-                       .sorted(Comparator.comparing(WaitOrderDTO::getDistanceMeter))
-                       .collect(Collectors.toList());
+                .sorted(Comparator.comparing(WaitOrderDTO::getDistanceMeter))
+                .collect(Collectors.toList());
     }
 
     /**
@@ -1388,6 +1425,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         doAcceptOrder(techId, orderId);
         return OrderTipEnum.ALREADY_ACCEPT.getTip();
     }
+
     /**
      * 技师接单确认接单
      *
@@ -1396,7 +1434,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
      * @return
      */
     @Override
-    public String confirmRestAccept(Long techId, Long orderId){
+    public String confirmRestAccept(Long techId, Long orderId) {
         LambdaUpdateWrapper<MaTechnician> update = new LambdaUpdateWrapper<>();
         update.eq(MaTechnician::getId, techId);
         update.set(MaTechnician::getPostState, TechnicianStatusEnum.ONLINE.getCode());
@@ -1404,6 +1442,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         doAcceptOrder(techId, orderId);
         return OrderTipEnum.ALREADY_ACCEPT.getTip();
     }
+
     /**
      * 技师拒绝接单
      *
@@ -1411,7 +1450,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
      * @return
      */
     @Override
-    public void refuseOrder(RefuseOrderReqDTO req){
+    public void refuseOrder(RefuseOrderReqDTO req) {
         LambdaUpdateWrapper<TOrder> update = new LambdaUpdateWrapper<>();
         update.eq(TOrder::getId, req.getOrderId());
         update.set(TOrder::getStatus, OrderStatusEnum.REFUSE.getCode());
@@ -1441,8 +1480,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
         double dLat = latRad2 - latRad1;
         double dLng = lngRad2 - lngRad1;
         double a = Math.pow(Math.sin(dLat / 2), 2)
-                           + Math.cos(latRad1) * Math.cos(latRad2)
-                                     * Math.pow(Math.sin(dLng / 2), 2);
+                + Math.cos(latRad1) * Math.cos(latRad2)
+                * Math.pow(Math.sin(dLng / 2), 2);
         double dis = 2 * 6371000 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
         return BigDecimal.valueOf(dis).setScale(2, BigDecimal.ROUND_HALF_UP);
     }

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

@@ -3,8 +3,10 @@ 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.MerchantDetailDTO;
 import com.ylx.merchant.domain.dto.MerchantListDTO;
 import com.ylx.merchant.domain.dto.MerchantProjectDTO;
+import com.ylx.merchant.domain.vo.MerchantDetailVO;
 import com.ylx.merchant.domain.vo.MerchantListVO;
 import com.ylx.project.domain.bookMerchant.vo.ProjectInfoVO;
 import io.swagger.annotations.Api;
@@ -40,5 +42,12 @@ public class ClientMerchantController {
         return R.ok(pageData);
     }
 
+    @PostMapping("/detail")
+    @ApiOperation("商户主页商户详情接口")
+    public R<MerchantDetailVO> getDetailById(@Validated @RequestBody MerchantDetailDTO dto) {
+        MerchantDetailVO vo = this.maTechnicianService.getDetail(dto);
+        return R.ok(vo);
+    }
+
 
 }

+ 27 - 0
nightFragrance-massage/src/main/java/com/ylx/merchant/domain/dto/MerchantDetailDTO.java

@@ -0,0 +1,27 @@
+package com.ylx.merchant.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+@ApiModel("客户端商户详情DTO")
+public class MerchantDetailDTO implements Serializable {
+    private static final long serialVersionUID = 7992434594441199113L;
+
+    @ApiModelProperty("商户ID")
+    @NotNull(message = "商户ID不能为空")
+    private Long merchantId;
+
+    @ApiModelProperty("用户经度")
+    @NotNull(message = "用户经度不能为空")
+    private Double longitude;
+
+    @ApiModelProperty("用户纬度")
+    @NotNull(message = "用户纬度不能为空")
+    private Double latitude;
+
+}

+ 71 - 0
nightFragrance-massage/src/main/java/com/ylx/merchant/domain/vo/MerchantDetailVO.java

@@ -0,0 +1,71 @@
+package com.ylx.merchant.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Data
+@ApiModel("客户端商户详情vo")
+public class MerchantDetailVO implements Serializable {
+    private static final long serialVersionUID = 119264984492021349L;
+
+    @ApiModelProperty("商户id")
+    private Integer id;
+
+    @ApiModelProperty(name = "商户姓名")
+    private String name;
+
+    @ApiModelProperty(name = "商户昵称")
+    private String nickName;
+
+    @ApiModelProperty("商户头像")
+    private String avatar;
+
+    @ApiModelProperty(name = "商户形象照")
+    private List<String> headshots;
+
+    @ApiModelProperty(name = "商户生活照")
+    private List<String> lifestyles;
+
+    @JsonIgnore
+    @ApiModelProperty(name = "商户形象照")
+    private String headshotStr;
+
+    @JsonIgnore
+    @ApiModelProperty(name = "商户生活照")
+    private String lifestyleStr;
+
+    @ApiModelProperty(name = "商户背景")
+    private String background;
+
+    @ApiModelProperty(name = "商户简介")
+    private String brief;
+
+    @ApiModelProperty("距离:千米")
+    private String distance;
+
+    @ApiModelProperty("商户评分")
+    private Double score;
+
+    public List<String> getHeadshots() {
+        return convertToList(this.headshotStr);
+    }
+
+    public List<String> getLifestyles() {
+        return convertToList(this.lifestyleStr);
+    }
+
+    private List<String> convertToList(String str) {
+        if (str == null || str.isEmpty()) {
+            return new ArrayList<>();
+        }
+        return Arrays.asList(str.split(","));
+    }
+
+}

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

@@ -650,5 +650,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND mp.project_is_enable = 0
         ORDER BY mp.create_time DESC
     </select>
+    <select id="getDetailById" resultType="com.ylx.merchant.domain.vo.MerchantDetailVO">
+
+    </select>
+
+    <select id="getDetail" resultType="com.ylx.merchant.domain.vo.MerchantDetailVO">
+        SELECT
+            t.id AS id,
+            t.te_name AS NAME,
+            t.te_nick_name AS nickName,
+            t.te_avatar AS avatar,
+            t.te_brief AS brief,
+            t.n_star AS score,
+            GROUP_CONCAT( CASE WHEN f.file_type = '1' THEN f.file_url END ORDER BY f.create_time ASC SEPARATOR ',' ) AS headshotStr,
+            GROUP_CONCAT( CASE WHEN f.file_type = '2' THEN f.file_url END ORDER BY f.create_time ASC SEPARATOR ',' ) AS lifestyleStr,
+            GROUP_CONCAT( CASE WHEN f.file_type = '12' THEN f.file_url END ORDER BY f.create_time ASC SEPARATOR ',' ) AS background
+        FROM
+            ma_technician t
+        LEFT JOIN merchant_apply_file f ON t.id = f.merchant_id AND f.is_delete = 0
+        WHERE
+            t.id = #{dto.merchantId}
+        AND t.is_delete = 0
+        GROUP BY
+            t.id
+    </select>
 
 </mapper>