Browse Source

1、优化推荐职位方法
2、优化热门职位类型逻辑
3、增加验证码登录接口参数

rayson 9 months ago
parent
commit
1190042f04

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/vo/AppMdeAuthSmsLoginReqVO.java

@@ -33,6 +33,9 @@ public class AppMdeAuthSmsLoginReqVO {
     @Pattern(regexp = "^[0-9]+$", message = "{1_100_016_016}")
     private String code;
 
+    @Schema(description = "是否自动注册,false:否,true:是")
+    private boolean autoRegister = false;
+
     // ========== 绑定社交登录时,需要传递如下参数 ==========
 
     @Schema(description = "社交平台的类型,参见 SocialTypeEnum 枚举值", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")

+ 14 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java

@@ -31,10 +31,13 @@ import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.enums.job.JobStatusEnum;
 import com.citu.module.menduner.system.enums.visits.MdeVisitsEnum;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.jdbc.object.SqlFunction;
 
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 招聘职位 Mapper
@@ -167,6 +170,8 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
         notExpireTime(query);
 
         query.inIfPresent(JobAdvertisedDO::getId, reqVO.getIds());
+        query.inIfPresent(JobAdvertisedDO::getPositionId, reqVO.getPositionIds());
+
         // 置顶
         query.orderByDesc(JobAdvertisedDO::getTop);
 
@@ -426,4 +431,13 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
                 .isNull(JobAdvertisedDO::getExpireTime)
         );
     }
+
+    /**
+     * 查询出现次数最多的职位ID,按出现次数降序排列
+     *
+     * @param topN 限制返回的结果数量
+     * @return 出现次数最多的职位ID列表,按出现次数降序排列
+     */
+    @Select("SELECT position_id FROM mde_job_advertised GROUP BY position_id ORDER BY COUNT(*) DESC LIMIT #{topN}")
+    List<Long> selectTopPositionIdsByFrequency(int topN);
 }

+ 18 - 15
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/old/MdeOldSyncService.java

@@ -229,20 +229,20 @@ public class MdeOldSyncService {
 
         List<OldMdePosition> oldMdePositionList = oldPositionMapper.selectList(OldMdePosition::getDelFlag, 0);
 
-        Long top = 8L;
-        PositionDO topPosition = positionMapper.selectOne(PositionDO::getNameEn, "old");
-        if (null == topPosition) {
-            setCommon(topPosition);
-            positionMapper.insert(PositionDO.builder()
-                    .id(top)
-                    .parentId(0L)
-                    .nameCn("old")
-                    .nameEn("old")
-                    .level(1)
-                    .sort(0)
-                    .build());
-
-        }
+//        Long top = 8L;
+//        PositionDO topPosition = positionMapper.selectOne(PositionDO::getNameEn, "old");
+//        if (null == topPosition) {
+//            setCommon(topPosition);
+//            positionMapper.insert(PositionDO.builder()
+//                    .id(top)
+//                    .parentId(0L)
+//                    .nameCn("old")
+//                    .nameEn("old")
+//                    .level(1)
+//                    .sort(0)
+//                    .build());
+//
+//        }
         Long leader = 9L;
         oldDepartmentList.stream().forEach(
                 oldMdeDepartment -> {
@@ -257,9 +257,12 @@ public class MdeOldSyncService {
                     if (null != positionDO) {
                         return;
                     }
+                    if("领导".equals(oldMdeDepartment.getDepdNameCn())) {
+                        oldMdeDepartment.setDepdNameCn("高层");
+                    }
                     PositionDO insertionDO = PositionDO.builder()
                             .id(0 == oldMdeDepartment.getDepdId() ? leader : Long.valueOf(oldMdeDepartment.getDepdId()))
-                            .parentId(top)
+                            .parentId(0L)
                             .nameCn(oldMdeDepartment.getDepdNameCn())
                             .nameEn(oldMdeDepartment.getDepdNameEn())
                             .level(2)

+ 14 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java

@@ -174,14 +174,22 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     public AppMdeAuthLoginRespVO smsLogin(AppMdeAuthSmsLoginReqVO reqVO) {
         // 校验验证码
         String userIp = getClientIP();
-        smsCodeApi.useSmsCode(MdeAuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MENDUNER_LOGIN.getScene(), userIp).setMobile(reqVO.getPhone())).getCheckedData();
+        smsCodeApi.useSmsCode(MdeAuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MENDUNER_LOGIN.getScene(), userIp)
+                .setMobile(reqVO.getPhone())).getCheckedData();
+
 
         // 获得获得注册用户
-        //  MdeUserDO user = userService.createUserIfAbsent(reqVO.getPhone(), userIp, getTerminal().toString());
-        MdeUserDO user = userService.getUserByPhone(reqVO.getPhone());
-        if (null == user) {
-            createLoginLog(null, reqVO.getPhone(), LoginLogTypeEnum.LOGIN_MOBILE, LoginResultEnum.BAD_CREDENTIALS);
-            throw exception(MDE_USER_MOBILE_NOT_EXISTS);
+        MdeUserDO user = null;
+        if (!reqVO.isAutoRegister()) {
+            user = userService.getUserByPhone(reqVO.getPhone());
+            if (null == user) {
+                createLoginLog(null, reqVO.getPhone(), LoginLogTypeEnum.LOGIN_MOBILE, LoginResultEnum.BAD_CREDENTIALS);
+                throw exception(MDE_USER_MOBILE_NOT_EXISTS);
+            }
+        } else {
+            // 自动注册
+            user = userService.createUserIfAbsent(reqVO.getPhone(), userIp, getTerminal().toString());
+            Assert.notNull(user, "获取用户失败,结果为空");
         }
         // 如果 socialType 非空,说明需要绑定社交用户
         String openid = null;

+ 4 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java

@@ -206,8 +206,11 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
                     .build()
             ).getCheckedData();
             pageReqVO.setIds(ids);
+        }else {
+            // 取最多发布职位的职位类型id
+            pageReqVO.setPositionIds(mapper.selectTopPositionIdsByFrequency(pageParam.getPageSize()));
         }
-        return mapper.selectPage(pageReqVO);
+        return mapper.selectPage2(pageReqVO);
 
 
     }

+ 49 - 46
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
-import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.position.vo.AppPositionChildrenRespVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.position.vo.AppPositionClickReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.position.vo.AppPositionListReqVO;
@@ -12,9 +11,9 @@ import com.citu.module.menduner.system.controller.app.jobhunt.position.vo.AppPos
 import com.citu.module.menduner.system.controller.base.position.PositionListReqVO;
 import com.citu.module.menduner.system.controller.base.position.PositionPageReqVO;
 import com.citu.module.menduner.system.controller.base.position.PositionSaveReqVO;
-import com.citu.module.menduner.system.controller.base.visits.MdeVisitsListReqVO;
 import com.citu.module.menduner.system.convert.PositionConvert;
 import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
+import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import com.citu.module.menduner.system.dal.mysql.position.PositionMapper;
 import com.citu.module.menduner.system.dal.redis.RedisKeyConstants;
 import com.citu.module.menduner.system.enums.visits.MdeVisitsEnum;
@@ -31,7 +30,6 @@ import org.springframework.web.client.RestTemplate;
 import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.collection.CollectionUtils.convertSet;
@@ -56,6 +54,9 @@ public class PositionServiceImpl implements PositionService {
     @Resource
     private MdeVisitsService visitsService;
 
+    @Resource
+    private JobAdvertisedMapper jobAdvertisedMapper;
+
     @Resource
     private RestTemplate restTemplate;
 
@@ -227,7 +228,7 @@ public class PositionServiceImpl implements PositionService {
             positionMapper.insert(obj);
 
             // 递归处理子分类
-            parseAndSavePosition(position,jobList, obj.getId(), obj.getLevel() + 1);
+            parseAndSavePosition(position, jobList, obj.getId(), obj.getLevel() + 1);
 
         }
 
@@ -254,7 +255,7 @@ public class PositionServiceImpl implements PositionService {
             positionMapper.insert(childObj); // 假设insertReturnId方法返回新插入记录的ID
 
             // 继续递归处理更深层次的子分类
-            parseAndSavePosition(child,jobList, childObj.getId(), level + 1);
+            parseAndSavePosition(child, jobList, childObj.getId(), level + 1);
         }
 
     }
@@ -323,47 +324,49 @@ public class PositionServiceImpl implements PositionService {
 
     @Override
     public List<AppPositionSimpleRespVO> getHotPosition() {
-        Long userId = LoginUserContext.getUserId2();
-        Map<Long, Integer> idMap = visitsService.getBizIdVisitsTop10List(
-                MdeVisitsListReqVO.builder()
-                        .type(MdeVisitsEnum.POSITION_CLICK.getType())
-                        .userId(userId)
-                        .build()
-        );
-
-        // 推荐数据的数量
-        int num = 10;
-        // 职位的层级深度
-        Integer level = 3;
-
-        // 该用户(包括访客)没有埋点
-        if (idMap.isEmpty() || idMap.size() < 1) {
-            // 随机十条,深度为{level}的数据
-            return PositionConvert.INSTANCE.convertList2(positionMapper.getRandomTenByLevel(level));
-
-        }
-        List<Long> ids = new ArrayList<>(idMap.keySet());
-
-        // 埋点数据不够
-        if (ids.size() < num) {
-            // 随机十条,深度为{level}的数据
-            List<PositionDO> positionDOList1 = positionMapper.getRandomTenByLevel(level);
-            // 找出埋点的职位数据
-            List<PositionDO> positionDOList2 = positionMapper.selectListByIdList(ids);
-            // 合并数据
-            List<PositionDO> mergedList = Stream.concat(
-                    // positionDOList2 数据
-                    positionDOList2.stream(),
-                    // positionDOList1 取前 (positionDOList1.size()-ids.size())条数据
-                    positionDOList1.stream()
-                            .limit(positionDOList1.size() - ids.size()).collect(Collectors.toList()).stream()
-            ).collect(Collectors.toList());
-            return retHotPosition(mergedList, idMap);
-        }
-
-        // 该用户(包括访客)有埋点数据的情况
-        List<PositionDO> positionDOList = positionMapper.selectListByIdList(ids);
-        return retHotPosition(positionDOList, idMap);
+//        Long userId = LoginUserContext.getUserId2();
+//        Map<Long, Integer> idMap = visitsService.getBizIdVisitsTop10List(
+//                MdeVisitsListReqVO.builder()
+//                        .type(MdeVisitsEnum.POSITION_CLICK.getType())
+//                        .userId(userId)
+//                        .build()
+//        );
+//
+//        // 推荐数据的数量
+//        int num = 10;
+//        // 职位的层级深度
+//        Integer level = 3;
+//
+//        // 该用户(包括访客)没有埋点
+//        if (idMap.isEmpty() || idMap.size() < 1) {
+//            // 随机十条,深度为{level}的数据
+//            return PositionConvert.INSTANCE.convertList2(positionMapper.getRandomTenByLevel(level));
+//
+//        }
+//        List<Long> ids = new ArrayList<>(idMap.keySet());
+//
+//        // 埋点数据不够
+//        if (ids.size() < num) {
+//            // 随机十条,深度为{level}的数据
+//            List<PositionDO> positionDOList1 = positionMapper.getRandomTenByLevel(level);
+//            // 找出埋点的职位数据
+//            List<PositionDO> positionDOList2 = positionMapper.selectListByIdList(ids);
+//            // 合并数据
+//            List<PositionDO> mergedList = Stream.concat(
+//                    // positionDOList2 数据
+//                    positionDOList2.stream(),
+//                    // positionDOList1 取前 (positionDOList1.size()-ids.size())条数据
+//                    positionDOList1.stream()
+//                            .limit(positionDOList1.size() - ids.size()).collect(Collectors.toList()).stream()
+//            ).collect(Collectors.toList());
+//            return retHotPosition(mergedList, idMap);
+//        }
+//
+//        // 该用户(包括访客)有埋点数据的情况
+//        List<PositionDO> positionDOList = positionMapper.selectListByIdList(ids);
+//        return retHotPosition(positionDOList, idMap);
+        List<Long> ids = jobAdvertisedMapper.selectTopPositionIdsByFrequency(10);
+        return PositionConvert.INSTANCE.convertList2(positionMapper.selectListByIdList(ids));
     }
 
     private List<AppPositionSimpleRespVO> retHotPosition(List<PositionDO> positionDOList, Map<Long, Integer> idMap) {