Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java
#	nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java
#	nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java
jinshihui 6 giorni fa
parent
commit
a2258f96f3
24 ha cambiato i file con 388 aggiunte e 88 eliminazioni
  1. 77 2
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeSqController.java
  2. 3 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WxController.java
  3. 15 5
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java
  4. 26 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaProjectSaveDto.java
  5. 31 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaProjectUpdateDto.java
  6. 66 6
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianAppAddVo.java
  7. 2 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaProjectMapper.java
  8. 6 3
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java
  9. 2 1
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaProjectService.java
  10. 6 2
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java
  11. 7 7
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TAddressServiceImpl.java
  12. 14 2
      nightFragrance-massage/src/main/java/com/ylx/project/domain/Project.java
  13. 2 2
      nightFragrance-massage/src/main/java/com/ylx/project/domain/dto/ProjectAddDTO.java
  14. 1 1
      nightFragrance-massage/src/main/java/com/ylx/project/domain/dto/ProjectSearchDTO.java
  15. 2 2
      nightFragrance-massage/src/main/java/com/ylx/project/domain/vo/ProjectDetailVo.java
  16. 2 0
      nightFragrance-massage/src/main/java/com/ylx/project/mapper/ProjectMapper.java
  17. 63 5
      nightFragrance-massage/src/main/java/com/ylx/project/service/impl/ProjectServiceImpl.java
  18. 5 5
      nightFragrance-massage/src/main/java/com/ylx/userhome/area/controller/CustomerCityController.java
  19. 29 29
      nightFragrance-massage/src/main/resources/mapper/massage/MaProjectMapper.xml
  20. 10 0
      nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml
  21. 10 10
      nightFragrance-massage/src/main/resources/mapper/project/ProjectMapper.xml
  22. 3 2
      nightFragrance-system/src/main/java/com/ylx/system/mapper/SysDictDataMapper.java
  23. 4 3
      nightFragrance-system/src/main/java/com/ylx/system/service/ISysDictDataService.java
  24. 2 1
      nightFragrance-system/src/main/java/com/ylx/system/service/impl/SysDictDataServiceImpl.java

+ 77 - 2
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeSqController.java

@@ -1,5 +1,9 @@
 package com.ylx.web.controller.massage;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ylx.common.annotation.Log;
@@ -14,8 +18,10 @@ import com.ylx.framework.manager.AsyncManager;
 import com.ylx.framework.manager.factory.AsyncFactory;
 import com.ylx.framework.web.service.WxTokenService;
 import com.ylx.massage.domain.CouponReceive;
+import com.ylx.massage.domain.MaTechnician;
 import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.service.CouponReceiveService;
+import com.ylx.massage.service.IMaTechnicianService;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.massage.utils.WeChatUtil;
 import io.swagger.annotations.Api;
@@ -63,8 +69,10 @@ public class WeSqController extends BaseController {
 
     @Autowired
     public RedisTemplate redisTemplate;
-
-
+    @Autowired
+    private IMaTechnicianService maTechnicianService;
+    @Autowired
+    private WxMaService wxMaService;
     /**
      * 通过微信code获取token和userInfo
      *
@@ -132,4 +140,71 @@ public class WeSqController extends BaseController {
         }
     }
 
+    /**
+     * 通过微信code获取token和userInfo
+     *
+     * @param code 微信授权码
+     * @return R<WxLoginUser> 访问令牌
+     */
+    @GetMapping("/getTechnicianToken")
+    @ResponseBody
+    //@Log(title = "公众号网页登录", businessType = BusinessType.OTHER)
+    public R<WxLoginUser> getTechnicianToken(@RequestParam String code) {
+        // 发送get请求获取 AccessToken
+        try {
+            Map<?, ?> result = weChatUtil.getAccessToken(code);
+           log.info("result的值:{}", result);
+            String accessToken = result.get(ACCESS_TOKEN).toString();
+            log.info("accessToken的值:{}", accessToken);
+            String refreshToken = result.get(REFRESH_TOKEN).toString();
+            String openid = result.get(OPEN_ID).toString();
+//
+//            // 如果用户是第一次进行微信公众号授权
+//            // 进行这一步时用户应点击了同意授权按钮
+            String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid);
+//            // 解析JSON数据
+           JSONObject jsonObject = new JSONObject(userInfoJsom);
+            //log.info("公众号网页登录:{}", jsonObject);
+            String nickName = jsonObject.get("nickname").toString();
+            String avatarUrl = jsonObject.get("headimgurl").toString();
+            String phoneNumber = jsonObject.get("phoneNumber").toString();
+
+            // 将用户信息保存到数据库中
+            LambdaQueryWrapper<MaTechnician> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            objectLambdaQueryWrapper.eq(MaTechnician::getCOpenid, openid);
+            MaTechnician user = maTechnicianService.getOne(objectLambdaQueryWrapper);
+            if (user == null || StringUtils.isEmpty(user.getTeNickName())) {
+                if (user == null) {
+                    user = new MaTechnician();
+                    user.setCOpenid(openid);
+                    user.setTeNickName(nickName);
+                    user.setTeAvatar(avatarUrl);
+                    user.setTePhone(phoneNumber);
+                    user.setOpenService(-1);
+                    maTechnicianService.save(user);
+                    //异步 添加新人优惠卷
+                    //                threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
+                }
+            }
+            WxLoginUser wxUser = new WxLoginUser();
+            BeanUtils.copyProperties(user, wxUser);
+            // 生成并返回令牌
+            String token = wxTokenService.createToken(wxUser);
+            log.info("token的值:{}", token);
+            if (token == null || token.isEmpty()) {
+                return R.fail("生成令牌失败");
+            }
+            //给我把token的值保存到redis中
+            redisTemplate.opsForValue().set(wxUser.getCOpenid(), token, 180, TimeUnit.MINUTES);
+            wxUser.setToken(token);
+            // 返回用户信息
+            // 记录登录信息
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(wxUser.getCOpenid(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+            return R.ok(wxUser);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
 }

+ 3 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WxController.java

@@ -47,6 +47,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -265,11 +266,13 @@ public class WxController extends BaseController {
             objectLambdaQueryWrapper.eq(TWxUser::getcOpenid, openid);
             TWxUser user = wxUserService.getOne(objectLambdaQueryWrapper);
             if (user == null) {
+                BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
                 user = new TWxUser();
                 user.setcOpenid(openid);
                 user.setcNickName(nickName);
                 user.setcIcon(avatarUrl);
                 user.setcPhone(phoneNumber);
+                user.setCPassword(encoder.encode("123456")) ;
                 wxUserService.save(user);
                 //异步 添加新人优惠卷
                 TWxUser finalUser = user;

+ 15 - 5
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java

@@ -4,9 +4,9 @@ import java.math.BigDecimal;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
 import com.ylx.common.annotation.Excel;
 import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
 
 /**
  * 服务项目对象 ma_project
@@ -49,7 +49,7 @@ public class MaProject extends BaseEntity {
      */
     @Excel(name = "项目时长(分)")
     @ApiModelProperty("项目时长(分)")
-    private Long projectDuration;
+    private Integer projectDuration;
 
     /**
      * 项目选择人数
@@ -112,13 +112,20 @@ public class MaProject extends BaseEntity {
     @Excel(name = "项目详情图")
     @ApiModelProperty("项目详情图")
     private String projectDetailImage;
-
+    /** 开通理由 */
+    @Excel(name = "开通理由")
+    @ApiModelProperty("开通理由")
+    private String   applyReason;
+    /** 开通理由 */
+    @Excel(name = "驳回原因")
+    @ApiModelProperty("驳回原因")
+    private String   reason;
     /**
      * 是否启用(0否1是)
      */
     @Excel(name = "是否启用(0否1是)")
     @ApiModelProperty("是否启用(0否1是)")
-    private Long projectIsEnable;
+    private Integer projectIsEnable;
     /**
      * 商户ID
      */
@@ -137,7 +144,10 @@ public class MaProject extends BaseEntity {
     @Excel(name = "创建人")
     @ApiModelProperty("创建人")
     private Long createUser;
-
+    /** 申请时间 */
+    @Excel(name = "申请时间")
+    @ApiModelProperty("申请时间")
+    private Data applyTime;
     /**
      * 修改人
      */

+ 26 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaProjectSaveDto.java

@@ -0,0 +1,26 @@
+package com.ylx.massage.domain.dto;
+
+import com.ylx.point.enums.TaskLimitTimesEnum;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MaProjectSaveDto {
+    /**
+     * 商户id
+     */
+    private String userId;
+    /**
+     * 商户手机号
+     */
+    private String merchantPhone;
+    /**
+     * 项目id列表
+     */
+    private List<String> projectIdList;
+    /**
+     * 申请理由
+     */
+    private String applyReason;
+}

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

@@ -0,0 +1,31 @@
+package com.ylx.massage.domain.dto;
+
+import com.ylx.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class MaProjectUpdateDto {
+
+    /**
+     * 项目id列表
+     */
+    private String projectId;
+    /**
+     * 申请理由
+     */
+    private String applyReason;
+    /**
+     * 是否下架
+     */
+    private Boolean isPass;
+    /**
+     * 是否删除
+     */
+    private Boolean isDelete;
+    /** 我的售价 */
+    private BigDecimal projectCurrentPrice;
+}

+ 66 - 6
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianAppAddVo.java

@@ -1,10 +1,14 @@
 package com.ylx.massage.domain.vo;
 
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.ylx.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Date;
 
 /**
  * 技师对象 ma_technician
@@ -19,31 +23,39 @@ public class MaTechnicianAppAddVo
 
     /** id */
     @ApiModelProperty("id")
-    private Long id;
+    private String id;
 
     /** 姓名 */
     @ApiModelProperty("姓名")
     private String teName;
+    /** 昵称 */
+    @Excel(name = "昵称")
+    private String teNickName;
+    /** 密码 */
+    @Excel(name = "密码")
+    private String tePassword;
 
     /** 性别(0女1男) */
     @Excel(name = "性别(0女1男)")
     @ApiModelProperty("性别(0女1男)")
     private Long teSex;
-
+    /** 开通服务:1-上门按摩 2-同城玩乐 */
+    @Excel(name = "开通服务:1-上门按摩 2-同城玩乐")
+    private BigInteger openService;
     /** 电话 */
     @Excel(name = "电话")
     @ApiModelProperty("电话")
     private String tePhone;
 
-    /** 地址 */
-    @Excel(name = "地址")
-    @ApiModelProperty("地址")
+    /** 合作意向城市 */
+    @Excel(name = "合作意向城市")
+    @ApiModelProperty("合作意向城市")
     private String teAddress;
 
     /** 年龄 */
     @Excel(name = "年龄")
     @ApiModelProperty("年龄")
-    private Long teAge;
+    private BigInteger teAge;
 
     /** 头像 */
     @Excel(name = "头像")
@@ -60,6 +72,54 @@ public class MaTechnicianAppAddVo
     @ApiModelProperty("简介")
     private String teBrief;
 
+    /** 形象照 */
+    @Excel(name = "形象照")
+    @ApiModelProperty("形象照")
+    private String avatar;
+
+    /** 身份证 */
+    @Excel(name = "身份证")
+    @ApiModelProperty("身份证")
+    private String idCard;
+    /** 宣传视频 */
+    @Excel(name = "宣传视频")
+    @ApiModelProperty("宣传视频")
+    private String  promoVideo;
+    /** 健康证 */
+    @Excel(name = "健康证")
+    @ApiModelProperty("健康证")
+    private String healthCertificate;
+
+    /** 从业资格证 */
+    @Excel(name = "从业资格证")
+    @ApiModelProperty("从业资格证")
+    private String qualificationCertificate;
+
+    /** 无犯罪证明 */
+    @Excel(name = "无犯罪证明")
+    @ApiModelProperty("无犯罪证明")
+    private String noCrimeRecord;
+
+    /** 承诺书 */
+    @Excel(name = "承诺书")
+    @ApiModelProperty("承诺书")
+    private String commitmentPdf;
+    /** 承诺录音 */
+    @Excel(name = "承诺录音")
+    @ApiModelProperty("承诺录音")
+    private String commitmentAudio;
+    /** 承诺录像 */
+    @Excel(name = "承诺录像")
+    @ApiModelProperty("承诺录像")
+    private String commitmentVideo;
+    /** 审核状态:0-待审核,1-待审核,2-审核通过,3-审核驳回*/
+    @Excel(name = "审核状态:0-待入驻,1-待审核,2-审核通过,3-审核驳回")
+    @ApiModelProperty("审核状态:0-待入驻,1-待审核,2-审核通过,3-审核驳回")
+    private int auditStatus;
+    /** 审批时间 */
+    @Excel(name = "审批时间")
+    @ApiModelProperty("审批时间")
+    private Date approveTime;
     @ApiModelProperty("项目id集合")
     private ArrayList<Long> projectIds;
 

+ 2 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaProjectMapper.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -14,6 +15,7 @@ import org.apache.ibatis.annotations.Param;
  * @author ylx
  * @date 2024-03-20
  */
+@Mapper
 public interface MaProjectMapper extends BaseMapper<MaProject> {
     /**
      * 查询服务项目

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

@@ -9,8 +9,10 @@ import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO;
 import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
 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 org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
 
 /**
  * 技师Mapper接口
@@ -18,7 +20,9 @@ import org.apache.ibatis.annotations.Param;
  * @author ylx
  * @date 2024-03-22
  */
-public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
+@Mapper
+public interface MaTechnicianMapper extends BaseMapper<MaTechnician>
+{
     /**
      * 查询技师
      *
@@ -33,7 +37,7 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
      * @param maTechnician 技师
      * @return 技师集合
      */
-    public List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician);
+     List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician);
 
     /**
      * 新增技师
@@ -66,7 +70,6 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
      * @return 结果
      */
     public int deleteMaTechnicianByIds(Long[] ids);
-
     /**
      * 后台查询商户列表
      *

+ 2 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaProjectService.java

@@ -3,6 +3,7 @@ package com.ylx.massage.service;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.vo.MaProjectListVo;
@@ -15,7 +16,7 @@ import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
  * @author ylx
  * @date 2024-03-20
  */
-public interface IMaProjectService
+public interface IMaProjectService extends IService<MaProject>
 {
     /**
      * 查询服务项目

+ 6 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java

@@ -4,13 +4,17 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.common.utils.DateUtils;
 import com.ylx.common.utils.bean.BeanUtils;
+import com.ylx.massage.domain.MaTechnician;
 import com.ylx.massage.domain.vo.MaProjectListVo;
 import com.ylx.massage.domain.vo.MaProjectSaveVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
 import com.ylx.massage.mapper.MaProjectMapper;
+import com.ylx.massage.mapper.MaTechnicianMapper;
+import com.ylx.massage.service.IMaTechnicianService;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.stereotype.Service;
 import com.ylx.massage.domain.MaProject;
@@ -25,7 +29,7 @@ import javax.annotation.Resource;
  * @date 2024-03-20
  */
 @Service
-public class MaProjectServiceImpl implements IMaProjectService
+public class MaProjectServiceImpl extends ServiceImpl<MaProjectMapper, MaProject> implements IMaProjectService
 {
     @Resource
     private MaProjectMapper maProjectMapper;
@@ -72,7 +76,7 @@ public class MaProjectServiceImpl implements IMaProjectService
     /**
      * 新增服务项目
      *
-     * @param maProject 服务项目
+     * @param
      * @return 结果
      */
     @Override

+ 7 - 7
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TAddressServiceImpl.java

@@ -60,9 +60,9 @@ public class TAddressServiceImpl extends ServiceImpl<TAddressMapper, TAddress> i
      @Override
     @Transactional(rollbackFor = Exception.class)
     public Object insertVirtualAddress(TAddress tAddress) {
-        if (StringUtils.isBlank(tAddress.getOpenid())) {
-            throw new RuntimeException("openid不能为空");
-        }
+//        if (StringUtils.isBlank(tAddress.getOpenid())) {
+//            throw new RuntimeException("openid不能为空");
+//        }
         //检查用户类型是否为空
         if (Objects.isNull(tAddress.getUserType())) {
             throw new RuntimeException("用户类型不能为空");
@@ -80,10 +80,10 @@ public class TAddressServiceImpl extends ServiceImpl<TAddressMapper, TAddress> i
          if (Objects.isNull(tAddress.getType())) {
              throw new RuntimeException("地址类型不能为空");
          }
-         //检查地址类型是否为1或2
-         if (tAddress.getType() != 2) {
-             throw new RuntimeException("地址类型错误,地址类型只能为2");
-         }
+//         //检查地址类型是否为1或2
+//         if (tAddress.getType() != 2) {
+//             throw new RuntimeException("地址类型错误,地址类型只能为2");
+//         }
         return this.save(tAddress);
     }
 

+ 14 - 2
nightFragrance-massage/src/main/java/com/ylx/project/domain/Project.java

@@ -22,13 +22,19 @@ public class Project extends BaseEntity {
      */
     @ApiModelProperty("id")
     @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
+    private Long id;
+
+    /**
+     * 服务标签
+     */
+    @ApiModelProperty("服务标签(1:按摩 2:陪玩)")
+    private Integer type;
 
     /**
      * 服务类目ID
      */
     @ApiModelProperty("服务类目ID")
-    private Integer type;
+    private Long categoryId;
 
     /**
      * 标题。
@@ -129,4 +135,10 @@ public class Project extends BaseEntity {
     @ApiModelProperty("项目详情 富文本")
     private String detail;
 
+    /**
+     * 项目亮点。
+     */
+    @ApiModelProperty("项目亮点")
+    private String highlight;
+
 }

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/project/domain/dto/ProjectAddDTO.java

@@ -19,9 +19,9 @@ public class ProjectAddDTO implements Serializable {
     @NotBlank(message = "项目标题不能为空")
     private String title;
 
-    @ApiModelProperty("项目分类")
+    @ApiModelProperty("服务类目ID")
     @NotNull(message = "服务类目ID不能为空")
-    private Integer type;
+    private Long categoryId;
 
     @ApiModelProperty("封面图")
     @NotBlank(message = "项目封面图不能为空")

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/project/domain/dto/ProjectSearchDTO.java

@@ -27,5 +27,5 @@ public class ProjectSearchDTO implements Serializable {
      * 类目ID
      */
     @ApiModelProperty("类目ID")
-    private Integer type;
+    private Long categoryId;
 }

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/project/domain/vo/ProjectDetailVo.java

@@ -33,13 +33,13 @@ public class ProjectDetailVo implements Serializable {
      * 项目分类ID。
      */
     @ApiModelProperty("项目分类ID")
-    private Integer type;
+    private Long categoryId;
 
     /**
      * 项目分类名称。
      */
     @ApiModelProperty("项目分类名称")
-    private String typeName;
+    private String categoryName;
 
     /**
      * 项目封面图。

+ 2 - 0
nightFragrance-massage/src/main/java/com/ylx/project/mapper/ProjectMapper.java

@@ -9,8 +9,10 @@ import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.vo.ProjectDetailVo;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import java.util.Date;
+@Mapper
 public interface ProjectMapper extends BaseMapper<Project> {
 
     Page<ProductOptionVO> selectOptionUnionPage(Page<ProductOptionVO> page, @Param("dto") OptionDTO dto);

+ 63 - 5
nightFragrance-massage/src/main/java/com/ylx/project/service/impl/ProjectServiceImpl.java

@@ -5,9 +5,11 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.common.core.domain.entity.SysDictData;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.DateUtils;
 import com.ylx.common.utils.SecurityUtils;
@@ -15,8 +17,6 @@ import com.ylx.massage.domain.dto.OptionDTO;
 import com.ylx.massage.domain.dto.ServiceOptionDTO;
 import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.ProductServiceOptionVO;
-import com.ylx.point.domain.PointActivity;
-import com.ylx.point.domain.vo.PointActivityPageVo;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
@@ -25,11 +25,16 @@ import com.ylx.project.domain.vo.ProjectDetailVo;
 import com.ylx.project.domain.vo.ProjectPageVo;
 import com.ylx.project.mapper.ProjectMapper;
 import com.ylx.project.service.ProjectService;
+import com.ylx.servicecategory.domain.ServiceCategory;
+import com.ylx.servicecategory.service.ServiceCategoryService;
+import com.ylx.system.service.ISysDictDataService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -37,6 +42,11 @@ import java.util.stream.Collectors;
 @Service
 public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements ProjectService {
 
+    @Resource
+    private ServiceCategoryService serviceCategoryService;
+    @Resource
+    private ISysDictDataService sysDictDataService;
+
     @Override
     public Page<ProjectPageVo> list(Page<Project> page, ProjectSearchDTO dto) {
         LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
@@ -48,9 +58,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         if (ObjectUtil.isNotEmpty(dto.getStatus())) {
             queryWrapper.eq(Project::getStatus, dto.getStatus());
         }
-        // 类目ID
-        if (ObjectUtil.isNotEmpty(dto.getType())) {
-            queryWrapper.eq(Project::getType, dto.getType());
+        // 服务类目ID
+        if (ObjectUtil.isNotEmpty(dto.getCategoryId())) {
+            queryWrapper.eq(Project::getCategoryId, dto.getCategoryId());
         }
         queryWrapper.orderByDesc(Project::getCreateTime).orderByDesc(Project::getSortOrder);
         Page<ProjectPageVo> pageData = new Page<>();
@@ -82,6 +92,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         entity.setUpdateBy(SecurityUtils.getUsername());
         entity.setUpdateTime(DateUtils.getNowDate());
 
+        // 根据项目亮点ID集合获取项目亮点
+        String highlightNames = this.buildHighlightNames(dto.getHighlightIds());
+        if(StrUtil.isNotEmpty(highlightNames)){
+            entity.setHighlight(highlightNames);
+        }
+
         boolean updateResult = this.updateById(entity);
         if (!updateResult) {
             throw new ServiceException("更新项目失败");
@@ -93,11 +109,23 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public void add(ProjectAddDTO dto) {
 
         Project entity = new Project();
+
+        ServiceCategory serviceCategoryDetail = this.serviceCategoryService.getServiceCategoryDetail(dto.getCategoryId());
+        if (ObjectUtil.isNull(serviceCategoryDetail)) {
+            throw new ServiceException("服务类目不存在");
+        }
         BeanUtil.copyProperties(dto, entity);
 
+        entity.setType(serviceCategoryDetail.getServiceTag());
         entity.setCreateBy(SecurityUtils.getUsername());
         entity.setCreateTime(DateUtils.getNowDate());
 
+        // 根据项目亮点ID集合获取项目亮点
+        String highlightNames = this.buildHighlightNames(dto.getHighlightIds());
+        if(StrUtil.isNotEmpty(highlightNames)){
+            entity.setHighlight(highlightNames);
+        }
+
         boolean saveResult = this.save(entity);
         if (!saveResult) {
             throw new ServiceException("添加项目失败");
@@ -149,4 +177,34 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return vo;
     }
 
+
+    /**
+     * 根据亮点ID集合构建高亮名称字符串
+     *
+     * @param highlightIds 逗号分隔的ID字符串或单个ID
+     * @return 拼接好的名称字符串,如 "技术领先,市场广阔"
+     */
+    private String buildHighlightNames(String highlightIds) {
+        // 1. 基础校验:如果ID为空,直接返回空字符串,避免后续查库
+        if (StringUtils.isBlank(highlightIds)) {
+            return "";
+        }
+
+        // 2. 解析ID列表 (兼容逗号分隔的情况)
+        List<String> idList = Arrays.asList(highlightIds.split(","));
+
+        // 3. 批量查询字典表
+        List<SysDictData> dictList = this.sysDictDataService.list(
+                new QueryWrapper<SysDictData>()
+                        .in("dict_code", idList)
+                        .select("dict_label") // 【性能优化】只查询需要的字段,减少IO开销
+        );
+
+        // 4. 提取名称并拼接
+        return dictList.stream()
+                .map(SysDictData::getDictLabel)
+                .filter(StringUtils::isNotBlank) // 过滤掉可能为空的标签
+                .collect(Collectors.joining(","));
+    }
+
 }

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

@@ -47,11 +47,11 @@ public class CustomerCityController {
         }
     }
 
-    @ApiOperation(value="首页选中的城市是否有开通服务", notes="首页选中的城市是否有开通服务;true表示该城市有开通服务")
-    @GetMapping(value = "/isHasMerchantCity")
-    public R<Boolean> isHasMerchantCity(@RequestParam("areaCode") String areaCode) {
-            return R.ok(iMaTechnicianService.isHasMerchantCity(areaCode));
-    }
+//    @ApiOperation(value="首页选中的城市是否有开通服务", notes="首页选中的城市是否有开通服务;true表示该城市有开通服务")
+//    @GetMapping(value = "/isHasMerchantCity")
+//    public R<Boolean> isHasMerchantCity(@RequestParam("areaCode") String areaCode) {
+//            return R.ok(iMaTechnicianService.isHasMerchantCity(areaCode));
+//    }
 
     /**
      * 首页-城市列表查询

+ 29 - 29
nightFragrance-massage/src/main/resources/mapper/massage/MaProjectMapper.xml

@@ -120,20 +120,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
     <!-- 推荐项目-->
     <select id="getMassageProjectRecommend" resultType="com.ylx.massage.domain.vo.MassageProjectRecommendVo">
+        WITH distinct_project AS (
+            SELECT
+                project_id,
+                MIN(project_name)   AS project_name,      -- 去重,取任意一个名称
+                MIN(project_duration) AS project_duration -- 去重,取任意一个工期
+            FROM ma_project
+            WHERE is_delete = 0
+              AND audit_status = 1
+            GROUP BY project_id
+        )
         SELECT
-            p.project_name AS projectName,
-            p.project_duration AS projectDuration,
-            t.avg_current_price AS avgCurrentPrice,
-            j.highlight AS highlight,
-            o.sales AS sales
-        FROM (
-                 SELECT MIN(id) AS id
-                 FROM ma_project
-                 WHERE is_delete = 0 AND audit_status = 1
-                 GROUP BY project_id
-             ) AS keep
-                 INNER JOIN ma_project p ON keep.id = p.id
-                 LEFT JOIN project j ON p.project_id = j.id
+            d.project_id                AS projectId,
+            d.project_name              AS projectName,
+            d.project_duration          AS projectDuration,
+            o.sales                     AS sales,
+            t.avg_current_price         AS avgCurrentPrice,
+            j.highlight                 AS highlight
+        FROM distinct_project d
+                 LEFT JOIN project j ON d.project_id = j.id
                  LEFT JOIN (
             SELECT
                 t.project_id,
@@ -141,21 +146,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             FROM ma_project t
             WHERE t.is_delete = 0
             GROUP BY t.project_id
-        ) t ON p.project_id = t.project_id
-        LEFT JOIN
-             (
-                 SELECT
-                     o.project_id AS project_id,
-                     COUNT(*) AS sales
-                 FROM
-                     t_order o
-                 WHERE o.is_delete = 0
-                   AND o.n_status = 7
-                   AND o.project_type = 1
-                 GROUP BY o.project_id
-             ) o
-             ON p.project_id = o.project_id
-        WHERE p.is_delete = 0
-        and p.audit_status = 1
+        ) t ON d.project_id = t.project_id
+                 LEFT JOIN (
+            SELECT
+                o.project_id,
+                COUNT(*) AS sales
+            FROM t_order o
+            WHERE o.is_delete = 0
+              AND o.status = 6
+              AND o.project_type = 1
+            GROUP BY o.project_id
+        ) o ON d.project_id = o.project_id;
     </select>
 </mapper>

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

@@ -18,6 +18,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="lifePhotos"    column="life_photos"    />
         <result property="avatar"    column="avatar"    />
         <result property="teBrief"    column="te_brief"    />
+        <result property="avatar"    column="avatar"    />
+        <result property="idCard"    column="id_card"    />
+        <result property="healthCertificate"    column="health_certificate"    />
+        <result property="qualificationCertificate"    column="qualification_certificate"    />
+        <result property="noCrimeRecord"    column="no_crime_record"    />
+        <result property="commitmentPdf"    column="commitment_pdf"    />
+        <result property="commitmentAudio"    column="commitment_audio"    />
+        <result property="commitmentVideo"    column="commitment_video"    />
         <result property="serviceState"    column="service_state"    />
         <result property="nStatus2"    column="n_status2"    />
         <result property="merchantStatus"    column="merchant_status"    />
@@ -402,4 +410,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY t.n_num DESC
         LIMIT 5
     </select>
+
+
 </mapper>

+ 10 - 10
nightFragrance-massage/src/main/resources/mapper/project/ProjectMapper.xml

@@ -28,12 +28,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <!-- 第二部分:项目商品 -->
         SELECT
         id,
-        c_title as title,
+        title as title,
         0 as productType
         FROM project
         WHERE is_delete = 0
         <if test="dto.title != null and dto.title != ''">
-            AND c_title LIKE CONCAT('%', #{dto.title}, '%')
+            AND title LIKE CONCAT('%', #{dto.title}, '%')
         </if>
         ) as temp_table
     </select>
@@ -53,8 +53,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap id="ProjectDetailVoMap" type="com.ylx.project.domain.vo.ProjectDetailVo">
         <id column="id" property="id"/>
         <result column="title" property="title"/>
-        <result column="type" property="type"/>
-        <result column="type_name" property="typeName"/>
+        <result column="category_id" property="categoryId"/>
+        <result column="category_name" property="categoryName"/>
         <result column="cover" property="cover"/>
         <result column="price" property="price"/>
         <result column="price_min" property="priceMin"/>
@@ -76,8 +76,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT
             p.id,
             p.title AS title,
-            p.type,
-            sc.name AS type_name,
+            p.category_id,
+            sc.name AS category_name,
             p.cover AS cover,
             p.price AS price,
             p.price_min,
@@ -94,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             p.create_time,
             p.update_time
         FROM project p
-        LEFT JOIN service_category sc ON sc.id = p.type AND sc.is_delete = 0
+        LEFT JOIN service_category sc ON sc.id = p.category_id AND sc.is_delete = 0
         WHERE p.id = #{id}
           AND p.is_delete = 0
     </select>
@@ -102,9 +102,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectServiceOptionsPage" resultMap="ServiceOptionsVOMap">
         SELECT
         p.id AS id,
-        ANY_VALUE(p.c_title) AS title,
+        ANY_VALUE(p.title) AS title,
         CASE WHEN p.type = '1' THEN 0 ELSE 0 END AS productType,
-        ANY_VALUE(p.d_price) AS price,
+        ANY_VALUE(p.price) AS price,
         '广誉源' AS merchantName,
         '10000' AS merchantId,
         ANY_VALUE(
@@ -146,7 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND p.type = 1
         </if>
         <if test="dto.title != null and dto.title != ''">
-            AND p.c_title LIKE CONCAT('%', #{dto.title}, '%')
+            AND p.title LIKE CONCAT('%', #{dto.title}, '%')
         </if>
         <if test="dto.ids != null and dto.ids.size() > 0">
             AND p.id IN

+ 3 - 2
nightFragrance-system/src/main/java/com/ylx/system/mapper/SysDictDataMapper.java

@@ -1,6 +1,8 @@
 package com.ylx.system.mapper;
 
 import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import com.ylx.common.core.domain.entity.SysDictData;
 
@@ -9,8 +11,7 @@ import com.ylx.common.core.domain.entity.SysDictData;
  *
  * @author ylx
  */
-public interface SysDictDataMapper
-{
+public interface SysDictDataMapper extends BaseMapper<SysDictData> {
     /**
      * 根据条件分页查询字典数据
      *

+ 4 - 3
nightFragrance-system/src/main/java/com/ylx/system/service/ISysDictDataService.java

@@ -1,6 +1,8 @@
 package com.ylx.system.service;
 
 import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.entity.SysDictData;
 
 /**
@@ -8,8 +10,7 @@ import com.ylx.common.core.domain.entity.SysDictData;
  *
  * @author ylx
  */
-public interface ISysDictDataService
-{
+public interface ISysDictDataService extends IService<SysDictData> {
     /**
      * 根据条件分页查询字典数据
      *
@@ -21,7 +22,7 @@ public interface ISysDictDataService
     /**
      * 根据字典类型和字典键值查询字典数据信息
      *
-     * @param dictType 字典类型
+     * @param dictType  字典类型
      * @param dictValue 字典键值
      * @return 字典标签
      */

+ 2 - 1
nightFragrance-system/src/main/java/com/ylx/system/service/impl/SysDictDataServiceImpl.java

@@ -2,6 +2,7 @@ package com.ylx.system.service.impl;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ylx.common.core.domain.entity.SysDictData;
@@ -15,7 +16,7 @@ import com.ylx.system.service.ISysDictDataService;
  * @author ylx
  */
 @Service
-public class SysDictDataServiceImpl implements ISysDictDataService {
+public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService {
     @Autowired
     private SysDictDataMapper dictDataMapper;