浏览代码

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

# Conflicts:
#	nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java
#	nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java
郭子栋 6 天之前
父节点
当前提交
e8e90714c2
共有 35 个文件被更改,包括 770 次插入124 次删除
  1. 19 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java
  2. 77 2
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeSqController.java
  3. 3 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WxController.java
  4. 15 5
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java
  5. 4 3
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaTechnician.java
  6. 26 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaProjectSaveDto.java
  7. 31 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaProjectUpdateDto.java
  8. 3 3
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaTechnicianMerchantAddDTO.java
  9. 2 2
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaTechnicianMerchantQueryDTO.java
  10. 66 6
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianAppAddVo.java
  11. 97 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianMerchantDetailVO.java
  12. 2 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaProjectMapper.java
  13. 15 3
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java
  14. 2 1
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaProjectService.java
  15. 15 4
      nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java
  16. 3 2
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaProjectServiceImpl.java
  17. 125 49
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java
  18. 7 7
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TAddressServiceImpl.java
  19. 2 2
      nightFragrance-massage/src/main/java/com/ylx/order/domain/TOrder.java
  20. 10 0
      nightFragrance-massage/src/main/java/com/ylx/project/controller/ProjectController.java
  21. 13 1
      nightFragrance-massage/src/main/java/com/ylx/project/domain/Project.java
  22. 2 2
      nightFragrance-massage/src/main/java/com/ylx/project/domain/dto/ProjectAddDTO.java
  23. 1 1
      nightFragrance-massage/src/main/java/com/ylx/project/domain/dto/ProjectSearchDTO.java
  24. 21 0
      nightFragrance-massage/src/main/java/com/ylx/project/domain/vo/ProjectBaseVo.java
  25. 2 2
      nightFragrance-massage/src/main/java/com/ylx/project/domain/vo/ProjectDetailVo.java
  26. 18 0
      nightFragrance-massage/src/main/java/com/ylx/project/enums/ProjectStatusEnum.java
  27. 2 0
      nightFragrance-massage/src/main/java/com/ylx/project/mapper/ProjectMapper.java
  28. 5 0
      nightFragrance-massage/src/main/java/com/ylx/project/service/ProjectService.java
  29. 79 5
      nightFragrance-massage/src/main/java/com/ylx/project/service/impl/ProjectServiceImpl.java
  30. 5 5
      nightFragrance-massage/src/main/java/com/ylx/userhome/area/controller/CustomerCityController.java
  31. 79 3
      nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml
  32. 10 10
      nightFragrance-massage/src/main/resources/mapper/project/ProjectMapper.xml
  33. 3 2
      nightFragrance-system/src/main/java/com/ylx/system/mapper/SysDictDataMapper.java
  34. 4 3
      nightFragrance-system/src/main/java/com/ylx/system/service/ISysDictDataService.java
  35. 2 1
      nightFragrance-system/src/main/java/com/ylx/system/service/impl/SysDictDataServiceImpl.java

+ 19 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java

@@ -9,6 +9,7 @@ import com.ylx.common.core.domain.model.LoginUser;
 import com.ylx.massage.domain.dto.MaTechnicianMerchantAddDTO;
 import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO;
 import com.ylx.massage.domain.vo.MaTechnicianAppAddVo;
+import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -126,6 +127,24 @@ public class MaTechnicianController extends BaseController {
         }
     }
 
+    /**
+     * 查询商户详情
+     *
+     * @param id 商户ID
+     * @return R<MaTechnicianMerchantDetailVO> 商户详情
+     */
+    @ApiOperation("后台查询商户详情")
+    @PreAuthorize("@ss.hasPermi('technician:technician:query')")
+    @GetMapping("/merchant/detail/{id}")
+    public R<MaTechnicianMerchantDetailVO> merchantDetail(@PathVariable("id") Long id) {
+        try {
+            return R.ok(maTechnicianService.selectMerchantDetail(id));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
     /**
      * 修改技师
      */

+ 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;
     /**
      * 修改人
      */

+ 4 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaTechnician.java

@@ -104,12 +104,13 @@ public class MaTechnician extends BaseEntity {
     @Excel(name = "头像")
     @TableField("te_avatar")
     private String teAvatar;
+
     /**
-     * 开通服务:1-上门按摩 2-同城玩乐
+     * 开通服务类目ID
      */
-    @Excel(name = "开通服务:1-上门按摩 2-同城玩乐")
+    @Excel(name = "开通服务类目ID")
     @TableField("openService")
-    private Integer openService;
+    private String openService;
 
     /**
      * 可服务项目

+ 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;
+}

+ 3 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/MaTechnicianMerchantAddDTO.java

@@ -38,10 +38,10 @@ public class MaTechnicianMerchantAddDTO {
     private String tePhone;
 
     /**
-     * 商户开通的服务类目:1-上门按摩,2-陪玩
+     * 商户开通的服务类目ID集合。
      */
-    @ApiModelProperty("服务类目:1-上门按摩 2-陪玩")
-    private Integer openService;
+    @ApiModelProperty("服务类目ID集合")
+    private List<Integer> openService;
 
     /**
      * 商户开通的服务项目ID集合。

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

@@ -24,9 +24,9 @@ public class MaTechnicianMerchantQueryDTO {
     private String teNickName;
 
     /**
-     * 服务类目:1-上门按摩,2-同城玩乐。
+     * 服务类目ID
      */
-    @ApiModelProperty("服务类目:1-上门按摩 2-同城玩乐")
+    @ApiModelProperty("服务类目ID")
     private Integer openService;
 
     /**

+ 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;
 

+ 97 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/MaTechnicianMerchantDetailVO.java

@@ -0,0 +1,97 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 后台商户详情展示对象
+ */
+@ApiModel(value = "MaTechnicianMerchantDetailVO", description = "后台商户详情展示对象")
+@Data
+public class MaTechnicianMerchantDetailVO {
+
+    /**
+     * 商户唯一标识。
+     */
+    @ApiModelProperty("商户ID")
+    private Long merchantId;
+
+    /**
+     * 商户真实姓名。
+     */
+    @ApiModelProperty("姓名")
+    private String teName;
+
+    /**
+     * 商户在平台对外展示的昵称。
+     */
+    @ApiModelProperty("昵称")
+    private String teNickName;
+
+    /**
+     * 商户性别编码:0-女,1-男。
+     */
+    @ApiModelProperty("性别:0-女 1-男")
+    private Integer teSex;
+
+    /**
+     * 商户性别展示名称。
+     */
+    @ApiModelProperty("性别名称")
+    private String teSexName;
+
+    /**
+     * 商户联系电话。
+     */
+    @ApiModelProperty("电话")
+    private String tePhone;
+
+    /**
+     * 商户开通的服务类目ID,多个用英文逗号分隔。
+     */
+    @ApiModelProperty("服务类目ID集合,逗号分隔")
+    private String openService;
+
+    /**
+     * 商户开通的服务类目名称
+     */
+    @ApiModelProperty("商户开通的服务类目名称")
+    private String serviceCategoryName;
+
+    /**
+     * 商户开通的服务项目ID,多个用英文逗号分隔。
+     */
+    @ApiModelProperty("服务项目ID集合,逗号分隔")
+    private String projectIds;
+
+    /**
+     * 商户开通的服务项目名称,多个用斜杠分隔。
+     */
+    @ApiModelProperty("服务项目名称")
+    private String serviceProjectName;
+
+    /**
+     * 商户类型编码:0-正式商户,1-虚拟商户。
+     */
+    @ApiModelProperty("商户类型:0-正式商户 1-虚拟商户")
+    private Integer techType;
+
+    /**
+     * 商户类型展示名称。
+     */
+    @ApiModelProperty("商户类型名称")
+    private String techTypeName;
+
+    /**
+     * 首页是否推荐:0-否,1-是。
+     */
+    @ApiModelProperty("是否推荐:0-否 1-是")
+    private Integer isRecommend;
+
+    /**
+     * 首页是否推荐展示名称。
+     */
+    @ApiModelProperty("是否推荐名称")
+    private String isRecommendName;
+}

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

@@ -8,6 +8,7 @@ import com.ylx.massage.domain.MaProject;
 import com.ylx.massage.domain.dto.MassageAllMerchantsDto;
 import com.ylx.massage.domain.vo.MassageAllMerchantsVo;
 import com.ylx.massage.domain.vo.MassageProjectRecommendVo;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -16,6 +17,7 @@ import org.apache.ibatis.annotations.Param;
  * @author ylx
  * @date 2024-03-20
  */
+@Mapper
 public interface MaProjectMapper extends BaseMapper<MaProject> {
     /**
      * 查询服务项目

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

@@ -7,9 +7,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.MaTechnician;
 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;
 import org.apache.ibatis.annotations.Select;
 
 /**
@@ -18,7 +21,9 @@ import org.apache.ibatis.annotations.Select;
  * @author ylx
  * @date 2024-03-22
  */
-public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
+@Mapper
+public interface MaTechnicianMapper extends BaseMapper<MaTechnician>
+{
     /**
      * 查询技师
      *
@@ -33,7 +38,7 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
      * @param maTechnician 技师
      * @return 技师集合
      */
-    public List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician);
+     List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician);
 
     /**
      * 新增技师
@@ -66,7 +71,6 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
      * @return 结果
      */
     public int deleteMaTechnicianByIds(Long[] ids);
-
     /**
      * 后台查询商户列表
      *
@@ -77,6 +81,14 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
     Page<MaTechnicianMerchantListVO> selectMerchantList(Page<MaTechnicianMerchantListVO> page,
                                                         @Param("dto") MaTechnicianMerchantQueryDTO dto);
 
+    /**
+     * 后台查询商户详情
+     *
+     * @param id 商户ID
+     * @return 商户详情
+     */
+    MaTechnicianMerchantDetailVO selectMerchantDetailById(@Param("id") Long id);
+
     List<MerchantVo> getMerchantRecommend(@Param("dto") MassageMerchantRecommendDto dto);
 
     /**

+ 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.dto.MassageAllMerchantsDto;
@@ -18,7 +19,7 @@ import org.apache.ibatis.annotations.Param;
  * @author ylx
  * @date 2024-03-20
  */
-public interface IMaProjectService
+public interface IMaProjectService extends IService<MaProject>
 {
     /**
      * 查询服务项目

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

@@ -1,13 +1,16 @@
 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.MaTechnician;
 import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
 import com.ylx.massage.domain.dto.MaTechnicianMerchantAddDTO;
 import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO;
 import com.ylx.massage.domain.vo.MaTechnicianAppAddVo;
+import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
 import com.ylx.massage.domain.vo.MerchantVo;
 
@@ -17,8 +20,7 @@ import com.ylx.massage.domain.vo.MerchantVo;
  * @author ylx
  * @date 2024-03-22
  */
-public interface IMaTechnicianService
-{
+public interface IMaTechnicianService extends IService<MaTechnician> {
     /**
      * 查询技师
      *
@@ -46,7 +48,7 @@ public interface IMaTechnicianService
     /**
      * 后台新增商户
      *
-     * @param dto 新增商户参数
+     * @param dto       新增商户参数
      * @param loginUser 当前登录用户
      * @return 结果
      */
@@ -56,12 +58,20 @@ public interface IMaTechnicianService
      * 后台查询商户列表
      *
      * @param page 分页参数
-     * @param dto 查询条件
+     * @param dto  查询条件
      * @return 商户分页列表
      */
     public Page<MaTechnicianMerchantListVO> selectMerchantList(Page<MaTechnicianMerchantListVO> page,
                                                                MaTechnicianMerchantQueryDTO dto);
 
+    /**
+     * 后台查询商户详情
+     *
+     * @param id 商户ID
+     * @return 商户详情
+     */
+    public MaTechnicianMerchantDetailVO selectMerchantDetail(Long id);
+
     /**
      * 修改技师
      *
@@ -88,6 +98,7 @@ public interface IMaTechnicianService
 
     /**
      * 首页选中的城市是否有开通服务
+     *
      * @param areaCode
      * @return
      */

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

@@ -4,6 +4,7 @@ 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;
@@ -27,7 +28,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;
@@ -74,7 +75,7 @@ public class MaProjectServiceImpl implements IMaProjectService
     /**
      * 新增服务项目
      *
-     * @param maProject 服务项目
+     * @param
      * @return 结果
      */
     @Override

+ 125 - 49
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -3,24 +3,25 @@ package com.ylx.massage.service.impl;
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
-
-import cn.hutool.core.util.StrUtil;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.massage.domain.MaProject;
 import com.ylx.massage.domain.MaTeProject;
 import com.ylx.massage.domain.dto.MaTechnicianMerchantAddDTO;
 import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO;
 import com.ylx.massage.domain.dto.MassageMerchantRecommendDto;
 import com.ylx.massage.domain.vo.MaTechnicianAppAddVo;
+import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
 import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
 import com.ylx.massage.domain.vo.MerchantVo;
-import com.ylx.massage.mapper.MaProjectMapper;
 import com.ylx.massage.mapper.MaTeProjectMapper;
 import com.ylx.project.domain.Project;
 import com.ylx.project.mapper.ProjectMapper;
@@ -39,8 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
  * @date 2024-03-22
  */
 @Service
-public class MaTechnicianServiceImpl implements IMaTechnicianService
-{
+public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaTechnician> implements IMaTechnicianService {
     private static final int SERVICE_STATE_AVAILABLE = 1;
     private static final int POST_STATE_OFFLINE = 0;
     private static final int ENABLED = 1;
@@ -67,8 +67,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      * @return 技师
      */
     @Override
-    public MaTechnician selectMaTechnicianById(Long id)
-    {
+    public MaTechnician selectMaTechnicianById(Long id) {
         return maTechnicianMapper.selectMaTechnicianById(id);
     }
 
@@ -79,8 +78,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      * @return 技师
      */
     @Override
-    public List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician)
-    {
+    public List<MaTechnician> selectMaTechnicianList(MaTechnician maTechnician) {
         return maTechnicianMapper.selectMaTechnicianList(maTechnician);
     }
 
@@ -92,8 +90,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int insertMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo)
-    {
+    public int insertMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo) {
         MaTechnician maTechnician = new MaTechnician();
         BeanUtils.copyProperties(maTechnicianAppAddVo, maTechnician);
         int rows = maTechnicianMapper.insertMaTechnician(maTechnician);
@@ -106,14 +103,14 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
     /**
      * 后台新增商户
      *
-     * @param dto 新增商户参数
+     * @param dto       新增商户参数
      * @param loginUser 当前登录用户
      * @return 结果
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int insertMerchant(MaTechnicianMerchantAddDTO dto, LoginUser loginUser) {
-        Set<Long> projectIds = checkMerchantAddParam(dto);
+        MerchantProjectSelection selection = checkMerchantAddParam(dto);
         String userName = loginUser.getUser().getUserName();
 
         MaTechnician maTechnician = new MaTechnician();
@@ -121,15 +118,8 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
         maTechnician.setTeNickName(dto.getTeNickName().trim());
         maTechnician.setTeSex(dto.getTeSex());
         maTechnician.setTePhone(dto.getTePhone().trim());
-        maTechnician.setOpenService(dto.getOpenService());
-        dto.getProjectIds().forEach(projectId -> {
-            Project project = projectMapper.selectById(projectId);
-            if (project != null) {
-                maTechnician.setTeProject(project.getTitle() + ",");
-            }
-        });
-        //移除末尾的逗号
-        maTechnician.setTeProject(StrUtil.removeSuffix(maTechnician.getTeProject(), ","));
+        maTechnician.setOpenService(joinIds(selection.getCategoryIds()));
+        maTechnician.setTeProject(joinProjectTitles(selection.getProjectIds(), selection.getProjectMap()));
 
         maTechnician.setTechType(dto.getTechType());
         maTechnician.setIsRecommend(normalizeSwitchValue(dto.getIsRecommend(), "是否推荐"));
@@ -154,7 +144,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
         if (rows <= 0) {
             throw new ServiceException("新增商户失败");
         }
-        insertProjectRelations(maTechnician.getId(), projectIds);
+        insertProjectRelations(maTechnician.getId(), selection.getProjectIds());
         return rows;
     }
 
@@ -162,7 +152,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      * 后台查询商户列表
      *
      * @param page 分页参数
-     * @param dto 查询条件
+     * @param dto  查询条件
      * @return 商户分页列表
      */
     @Override
@@ -172,15 +162,32 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
         return maTechnicianMapper.selectMerchantList(pageParam, dto);
     }
 
+    /**
+     * 后台查询商户详情
+     *
+     * @param id 商户ID
+     * @return 商户详情
+     */
+    @Override
+    public MaTechnicianMerchantDetailVO selectMerchantDetail(Long id) {
+        if (id == null) {
+            throw new ServiceException("商户ID不能为空");
+        }
+        MaTechnicianMerchantDetailVO detail = maTechnicianMapper.selectMerchantDetailById(id);
+        if (detail == null) {
+            throw new ServiceException("商户不存在或已删除");
+        }
+        return detail;
+    }
+
     /**
      * 修改技师
      *
-     * @param  maTechnicianAppAddVo
+     * @param maTechnicianAppAddVo
      * @return 结果
      */
     @Override
-    public int updateMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo)
-    {
+    public int updateMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo) {
 
         MaTechnician maTechnician = new MaTechnician();
         BeanUtils.copyProperties(maTechnicianAppAddVo, maTechnician);
@@ -195,8 +202,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      * @return 结果
      */
     @Override
-    public int deleteMaTechnicianByIds(Long[] ids)
-    {
+    public int deleteMaTechnicianByIds(Long[] ids) {
         return maTechnicianMapper.deleteMaTechnicianByIds(ids);
     }
 
@@ -207,13 +213,13 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
      * @return 结果
      */
     @Override
-    public int deleteMaTechnicianById(Long id)
-    {
+    public int deleteMaTechnicianById(Long id) {
         return maTechnicianMapper.deleteMaTechnicianById(id);
     }
 
     /**
      * 首页选中的城市是否有开通服务
+     *
      * @param areaCode
      * @return
      */
@@ -224,6 +230,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
 
     /**
      * 首页按摩推荐
+     *
      * @param dto
      * @return
      */
@@ -232,7 +239,7 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
         return maTechnicianMapper.getMerchantRecommend(dto);
     }
 
-    private Set<Long> checkMerchantAddParam(MaTechnicianMerchantAddDTO dto) {
+    private MerchantProjectSelection checkMerchantAddParam(MaTechnicianMerchantAddDTO dto) {
         if (dto == null) {
             throw new ServiceException("商户参数不能为空");
         }
@@ -240,16 +247,12 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
         checkRequiredText(dto.getTeNickName(), "昵称", 10);
         checkRequiredText(dto.getTePhone(), "电话", 11);
         checkEnumValue(dto.getTeSex(), "性别", 0, 1);
-        //checkEnumValue(dto.getOpenService(), "服务类目", 1, 2);
-        //校验服务类名不能为空
-        if (dto.getOpenService() == null) {
-            throw new ServiceException("服务类目不能为空");
-        }
+        Set<Integer> categoryIds = checkOpenServiceIds(dto.getOpenService());
         checkEnumValue(dto.getTechType(), "商户类型", 0, 1);
         if (dto.getIsRecommend() != null) {
             checkEnumValue(dto.getIsRecommend(), "是否推荐", 0, 1);
         }
-        return checkProjectIds(dto.getProjectIds());
+        return checkProjectIds(dto.getProjectIds(), categoryIds);
     }
 
     private void checkRequiredText(String value, String fieldName, int maxLength) {
@@ -283,10 +286,12 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
 
     /**
      * 校验服务项目ID集合
-     * @param projectIds
+     *
+     * @param projectIds  服务项目ID集合
+     * @param categoryIds 服务类目ID集合
      * @return 有效服务项目ID集合
      */
-    private Set<Long> checkProjectIds(List<Long> projectIds) {
+    private MerchantProjectSelection checkProjectIds(List<Long> projectIds, Set<Integer> categoryIds) {
         if (projectIds == null || projectIds.isEmpty()) {
             throw new ServiceException("服务项目不能为空");
         }
@@ -299,17 +304,64 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
             distinctProjectIds.add(projectId);
         }
 
-        /*int validCount = 0;
+        List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
+                .in(Project::getId, distinctProjectIds)
+                .eq(Project::getIsDelete, 0));
+        if (projects.size() != distinctProjectIds.size()) {
+            throw new ServiceException("服务项目不存在或已删除");
+        }
+
+        Map<Long, Project> projectMap = projects.stream()
+                .collect(Collectors.toMap(project -> project.getId().longValue(), Function.identity(), (left, right) -> left));
+        Set<Integer> projectCategoryIds = new LinkedHashSet<>();
         for (Long projectId : distinctProjectIds) {
-            MaProject project = maProjectMapper.selectMaProjectById(projectId);
-            if (project != null && (project.getIsDelete() == null || project.getIsDelete() != 1)) {
-                validCount++;
+            Project project = projectMap.get(projectId);
+            if (project == null || project.getCategoryId() == null) {
+                throw new ServiceException("服务项目类目不能为空");
+            }
+            if (!categoryIds.contains(project.getCategoryId())) {
+                throw new ServiceException("服务项目不属于所选服务类目");
             }
+            projectCategoryIds.add(project.getCategoryId());
         }
-        if (validCount != distinctProjectIds.size()) {
-            throw new ServiceException("服务项目不存在或已删除");
-        }*/
-        return distinctProjectIds;
+        if (!projectCategoryIds.containsAll(categoryIds)) {
+            throw new ServiceException("每个服务类目至少选择一个服务项目");
+        }
+        return new MerchantProjectSelection(categoryIds, distinctProjectIds, projectMap);
+    }
+
+    /**
+     * 校验服务类目ID集合
+     *
+     * @param openService 服务类目ID集合
+     * @return 去重后的服务类目ID集合
+     */
+    private Set<Integer> checkOpenServiceIds(List<Integer> openService) {
+        if (openService == null || openService.isEmpty()) {
+            throw new ServiceException("服务类目不能为空");
+        }
+        Set<Integer> categoryIds = new LinkedHashSet<>();
+        for (Integer categoryId : openService) {
+            if (categoryId == null) {
+                throw new ServiceException("服务类目ID不能为空");
+            }
+            categoryIds.add(categoryId);
+        }
+        return categoryIds;
+    }
+
+    private String joinIds(Set<Integer> ids) {
+        return ids.stream()
+                .map(String::valueOf)
+                .collect(Collectors.joining(","));
+    }
+
+    private String joinProjectTitles(Set<Long> projectIds, Map<Long, Project> projectMap) {
+        return projectIds.stream()
+                .map(projectMap::get)
+                .map(Project::getTitle)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.joining(","));
     }
 
     /**
@@ -335,4 +387,28 @@ public class MaTechnicianServiceImpl implements IMaTechnicianService
             throw new ServiceException("新增商户服务项目失败");
         }
     }
+
+    private static class MerchantProjectSelection {
+        private final Set<Integer> categoryIds;
+        private final Set<Long> projectIds;
+        private final Map<Long, Project> projectMap;
+
+        private MerchantProjectSelection(Set<Integer> categoryIds, Set<Long> projectIds, Map<Long, Project> projectMap) {
+            this.categoryIds = categoryIds;
+            this.projectIds = projectIds;
+            this.projectMap = projectMap;
+        }
+
+        private Set<Integer> getCategoryIds() {
+            return categoryIds;
+        }
+
+        private Set<Long> getProjectIds() {
+            return projectIds;
+        }
+
+        private Map<Long, Project> getProjectMap() {
+            return projectMap;
+        }
+    }
 }

+ 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);
     }
 

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/order/domain/TOrder.java

@@ -61,8 +61,8 @@ public class TOrder extends BaseEntity {
     @ApiModelProperty("项目ID")
     private Long projectId;
 
-    @ApiModelProperty("项目类型: MASSAGE, ACCOMPANY")
-    private String projectType; // 对应数据库 enum 类型,Java 中通常用 String 接收,也可自定义枚举类
+    @ApiModelProperty("项目类型:1=按摩 2=陪玩")
+    private Integer projectType;
 
     @ApiModelProperty("项目名称")
     private String projectName;

+ 10 - 0
nightFragrance-massage/src/main/java/com/ylx/project/controller/ProjectController.java

@@ -9,6 +9,7 @@ import com.ylx.project.domain.Project;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
 import com.ylx.project.domain.dto.ProjectUpdateDTO;
+import com.ylx.project.domain.vo.ProjectBaseVo;
 import com.ylx.project.domain.vo.ProjectDetailVo;
 import com.ylx.project.domain.vo.ProjectPageVo;
 import com.ylx.project.service.ProjectService;
@@ -20,6 +21,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 @RestController
 @RequestMapping("/project")
@@ -128,4 +130,12 @@ public class ProjectController {
         }
     }
 
+    @PreAuthorize("@customerAuth.isCustomer()")
+    @ApiOperation("客户端根据服务标签获取服务项目集合数据")
+    @GetMapping("/type/{type}")
+    public R<List<ProjectBaseVo>> getProjectTabList(@PathVariable("type") Integer type) {
+        List<ProjectBaseVo> list = this.projectService.getProjectTabListByType(type);
+        return R.ok(list);
+    }
+
 }

+ 13 - 1
nightFragrance-massage/src/main/java/com/ylx/project/domain/Project.java

@@ -24,11 +24,17 @@ public class Project extends BaseEntity {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    /**
+     * 服务标签
+     */
+    @ApiModelProperty("服务标签(1:按摩 2:陪玩)")
+    private Integer type;
+
     /**
      * 服务类目ID
      */
     @ApiModelProperty("服务类目ID")
-    private Integer type;
+    private Integer categoryId;
 
     /**
      * 标题。
@@ -135,4 +141,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;
 }

+ 21 - 0
nightFragrance-massage/src/main/java/com/ylx/project/domain/vo/ProjectBaseVo.java

@@ -0,0 +1,21 @@
+package com.ylx.project.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("项目基本信息vo")
+public class ProjectBaseVo implements Serializable {
+
+    private static final long serialVersionUID = -5680743000457655672L;
+
+    @ApiModelProperty("id")
+    private String id;
+
+    @ApiModelProperty("标题")
+    private String title;
+
+}

+ 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;
 
     /**
      * 项目封面图。

+ 18 - 0
nightFragrance-massage/src/main/java/com/ylx/project/enums/ProjectStatusEnum.java

@@ -0,0 +1,18 @@
+package com.ylx.project.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum ProjectStatusEnum {
+
+    ON_SHELF(0, "上架"),
+    OFF_SHELF(1, "下架");
+
+    private final Integer code;
+    private final String info;
+
+    ProjectStatusEnum(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+}

+ 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);

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

@@ -11,9 +11,12 @@ import com.ylx.project.domain.Project;
 import com.ylx.project.domain.dto.ProjectAddDTO;
 import com.ylx.project.domain.dto.ProjectSearchDTO;
 import com.ylx.project.domain.dto.ProjectUpdateDTO;
+import com.ylx.project.domain.vo.ProjectBaseVo;
 import com.ylx.project.domain.vo.ProjectDetailVo;
 import com.ylx.project.domain.vo.ProjectPageVo;
 
+import java.util.List;
+
 public interface ProjectService extends IService<Project> {
 
     Page<ProjectPageVo> list(Page<Project> page, ProjectSearchDTO dto);
@@ -29,4 +32,6 @@ public interface ProjectService extends IService<Project> {
     IPage<ProductOptionVO> selectOptionUnionPage(Page page, OptionDTO dto);
 
     Page<ProductServiceOptionVO> selectServiceOptionsPage(Page page, ServiceOptionDTO dto);
+
+    List<ProjectBaseVo> getProjectTabListByType(Integer type);
 }

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

@@ -5,31 +5,40 @@ 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;
+import com.ylx.giftCard.domain.vo.GiftCardVO;
 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;
 import com.ylx.project.domain.dto.ProjectUpdateDTO;
+import com.ylx.project.domain.vo.ProjectBaseVo;
 import com.ylx.project.domain.vo.ProjectDetailVo;
 import com.ylx.project.domain.vo.ProjectPageVo;
+import com.ylx.project.enums.ProjectStatusEnum;
 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.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -37,6 +46,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 +62,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 +96,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 +113,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("添加项目失败");
@@ -142,6 +174,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return baseMapper.selectServiceOptionsPage(page, dto);
     }
 
+    @Override
+    public List<ProjectBaseVo> getProjectTabListByType(Integer type) {
+
+        LambdaQueryWrapper<Project> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Project::getType, type)
+                .eq(Project::getStatus, ProjectStatusEnum.ON_SHELF.getCode());
+
+        List<Project> projects = this.baseMapper.selectList(wrapper);
+
+        return BeanUtil.copyToList(projects, ProjectBaseVo.class);
+    }
+
     private ProjectPageVo convertToVo(Project entity) {
         ProjectPageVo vo = new ProjectPageVo();
         // 属性拷贝(推荐)
@@ -149,4 +193,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));
+//    }
 
     /**
      * 首页-城市列表查询

+ 79 - 3
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"    />
@@ -25,8 +33,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="techType"    column="tech_type"    />
         <result property="teIsEnable"    column="te_is_enable"    />
         <result property="auditStatus"    column="audit_status"    />
-        <result property="createUser"    column="create_user"    />
-        <result property="updateUser"    column="update_user"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
         <result property="isDelete"    column="is_delete"    />
@@ -207,6 +215,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createTime" column="create_time"/>
     </resultMap>
 
+    <resultMap type="com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO" id="MaTechnicianMerchantDetailResult">
+        <result property="merchantId" column="merchant_id"/>
+        <result property="teName" column="te_name"/>
+        <result property="teNickName" column="te_nick_name"/>
+        <result property="teSex" column="te_sex"/>
+        <result property="teSexName" column="te_sex_name"/>
+        <result property="tePhone" column="te_phone"/>
+        <result property="openService" column="openService"/>
+        <result property="serviceCategoryName" column="service_category_name"/>
+        <result property="projectIds" column="project_ids"/>
+        <result property="serviceProjectName" column="service_project_name"/>
+        <result property="techType" column="tech_type"/>
+        <result property="techTypeName" column="tech_type_name"/>
+        <result property="isRecommend" column="is_recommend"/>
+        <result property="isRecommendName" column="is_recommend_name"/>
+    </resultMap>
+
     <select id="selectMerchantList" resultMap="MaTechnicianMerchantListResult">
         SELECT
             t.id AS merchant_id,
@@ -268,7 +293,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 </if>
                 <!-- 服务类目 -->
                 <if test="dto.openService != null">
-                    AND t.openService = #{dto.openService}
+                    AND FIND_IN_SET(#{dto.openService}, t.openService)
                 </if>
                 <!-- 手机号 -->
                 <if test="dto.tePhone != null and dto.tePhone != ''">
@@ -303,6 +328,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY t.create_time DESC
     </select>
 
+    <select id="selectMerchantDetailById" resultMap="MaTechnicianMerchantDetailResult">
+        SELECT
+            t.id AS merchant_id,
+            t.te_name,
+            t.te_nick_name,
+            t.te_sex,
+            CASE t.te_sex
+                WHEN 0 THEN '女'
+                WHEN 1 THEN '男'
+                ELSE ''
+            END AS te_sex_name,
+            t.te_phone,
+            t.openService,
+            COALESCE(project_data.service_category_name, (
+                SELECT GROUP_CONCAT(DISTINCT sc.name ORDER BY sc.sort, sc.id SEPARATOR '/')
+                FROM service_category sc
+                WHERE FIND_IN_SET(sc.id, t.openService)
+                  AND sc.is_delete = 0
+            ), '') AS service_category_name,
+            project_data.project_ids,
+            COALESCE(project_data.service_project_name, t.te_project, '') AS service_project_name,
+            t.tech_type,
+            CASE t.tech_type
+                WHEN 0 THEN '正式商户'
+                WHEN 1 THEN '虚拟商户'
+                ELSE ''
+            END AS tech_type_name,
+            t.is_recommend,
+            CASE t.is_recommend
+                WHEN 1 THEN '是'
+                WHEN 0 THEN '否'
+                ELSE ''
+            END AS is_recommend_name
+        FROM ma_technician t
+        LEFT JOIN (
+            SELECT
+                mtp.te_id,
+                GROUP_CONCAT(DISTINCT p.id ORDER BY p.id SEPARATOR ',') AS project_ids,
+                GROUP_CONCAT(DISTINCT p.title ORDER BY p.id SEPARATOR '/') AS service_project_name,
+                GROUP_CONCAT(DISTINCT sc2.name ORDER BY sc2.sort, sc2.id SEPARATOR '/') AS service_category_name
+            FROM ma_te_project mtp
+            LEFT JOIN project p ON p.id = mtp.project_id AND p.is_delete = 0
+            LEFT JOIN service_category sc2 ON sc2.id = p.type AND sc2.is_delete = 0
+            GROUP BY mtp.te_id
+        ) project_data ON project_data.te_id = t.id
+        WHERE t.is_delete = 0
+          AND t.id = #{id}
+    </select>
+
      <!-- 首页按摩商户推荐列表-->
     <select id="getMerchantRecommend" resultType="com.ylx.massage.domain.vo.MerchantVo">
         SELECT
@@ -338,4 +412,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ORDER BY COALESCE(o.sales, 0) 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;