Your Name 7 kuukautta sitten
vanhempi
sitoutus
52ff96bc1f

+ 9 - 0
src/main/java/com/sqx/modules/app/controller/app/AppUserController.java

@@ -1,5 +1,6 @@
 package com.sqx.modules.app.controller.app;
 
+import com.baomidou.mybatisplus.extension.api.R;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sqx.common.utils.DateUtils;
 import com.sqx.common.utils.Result;
@@ -54,4 +55,12 @@ public class AppUserController {
     public Result userData(@RequestAttribute("userId") Long userId){
         return Result.success().put("data", userService.userData(userId));
     }
+
+    @Login
+    @GetMapping("userYesterdayData")
+    @ApiOperation("用户昨日数据")
+    public Result userYesterdayData(@RequestAttribute("userId")Long userId){
+        return Result.success().put("data",userService.userYesterdayData(userId));
+    }
+
 }

+ 2 - 0
src/main/java/com/sqx/modules/app/service/UserService.java

@@ -223,4 +223,6 @@ public interface UserService extends IService<UserEntity> {
     Result saveUser(UserEntity userEntity);
 
     Result updateUserType(UpdateUserTypeForm updateUserTypeForm);
+
+    HashMap<String,Object> userYesterdayData(Long userId);
 }

+ 90 - 3
src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java

@@ -59,7 +59,9 @@ import com.sqx.modules.message.service.MessageService;
 import com.sqx.modules.myCollection.entity.MyCollection;
 import com.sqx.modules.myCollection.service.MyCollectionService;
 import com.sqx.modules.resumes.entity.Company;
+import com.sqx.modules.resumes.entity.PostPush;
 import com.sqx.modules.resumes.service.CompanyService;
+import com.sqx.modules.resumes.service.PostPushService;
 import com.sqx.modules.sendRecord.entity.SendRecord;
 import com.sqx.modules.sendRecord.service.SendRecordService;
 import com.sqx.modules.utils.HttpClientUtil;
@@ -78,9 +80,12 @@ import weixin.popular.util.JsonUtil;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 用户
@@ -128,6 +133,8 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
     private ChatContentService chatContentService;
     @Autowired
     private InterviewRecordService interviewRecordService;
+    @Autowired
+    private PostPushService postPushService;
 
     @Override
     public UserEntity queryByPhone(String phone) {
@@ -1154,23 +1161,26 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
         QueryWrapper<MyCollection> queryWrapper =new QueryWrapper<MyCollection>().eq("user_id",userId);
         QueryWrapper<SendRecord> queryWrapper1 =new QueryWrapper<>();
         QueryWrapper<InterviewRecord>queryWrapper2 =new QueryWrapper<>();
-        //个人
+        QueryWrapper<ChatConversation> queryWrapper3 =new QueryWrapper<>();
+
         if (userEntity.getUserType() == 1) {
             wrapper.eq("browse_type", 1);
             queryWrapper.eq("type",1);
             queryWrapper1.eq("user_id",userId);
             queryWrapper2.eq("interviewer_id",userId);
+            queryWrapper3.eq("use_id",userId);
             //企业
         } else {
             wrapper.eq("browse_type", 2);
             queryWrapper.eq("type",2);
             queryWrapper1.eq("company_user_id",userId);
             queryWrapper2.eq("user_id",userId);
+            queryWrapper3.eq("focused_user_id",userId);
         }
         int browseCount = userBrowseService.count(wrapper);
         int collectionCount = collectionService.count(queryWrapper);
         int deliveryCount = sendRecordService.count(queryWrapper1);
-        int chatCount = chatConversationService.count(new QueryWrapper<ChatConversation>().eq("user_id",userId));
+        int chatCount = chatConversationService.count();
         int interviewCount = interviewRecordService.count(queryWrapper2);
         //浏览记录
         map.put("browseCount", browseCount);
@@ -1478,4 +1488,81 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
         return Result.success();
     }
 
-}
+    @Override
+
+
+        /**
+         * 获取指定用户的今日招聘数据
+         * @param userId 用户ID(企业用户,对应user_type=2)
+         * @return 包含各指标今日数据及较昨日变化的Map
+         */
+        public HashMap<String, Object> userYesterdayData(Long userId) {
+            HashMap<String, Object> resultMap = new HashMap<>();
+
+            // 1. 定义时间范围:今日00:00:00至23:59:59
+            LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+            LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+
+            // 2. 定义昨日时间范围:昨日00:00:00至23:59:59(用于计算较昨日变化)
+            LocalDateTime yesterdayStart = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.MIN);
+            LocalDateTime yesterdayEnd = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.MAX);
+
+
+
+            // 4. 统计各指标今日数据及昨日数据
+            // 4.1 我看过(当前企业查看的求职者数量)
+            int todayISaw = userBrowseService.count(new QueryWrapper<UserBrowse>().eq("user_id",userId).eq("browse_type",2).between("update_time",todayStart,todayEnd));
+            int yesterdayISaw = userBrowseService.count(new QueryWrapper<UserBrowse>().eq("user_id",userId).eq("browse_type",2).between("update_time",yesterdayStart,yesterdayEnd));
+            resultMap.put("iSaw", todayISaw);
+            resultMap.put("tyIsaw",todayISaw-yesterdayISaw);
+
+            // 4.2 看过我(求职者查看当前企业的数量)
+        List<Object> postIdObjs = postPushService.listObjs(
+                new QueryWrapper<PostPush>()
+                        .eq("user_id", userId) // 筛选“我发布的岗位”
+                        .select("post_push_id")); // 只查岗位ID);
+                 if (postIdObjs == null || postIdObjs.isEmpty()) {
+                    resultMap.put("sawMe",0);
+                    resultMap.put("tySawMe",0);
+                }
+        List<Long> myPostIds = postIdObjs.stream()
+                .map(obj -> Long.valueOf(obj.toString()))
+                .collect(Collectors.toList());
+            int todaySawMe = userBrowseService.count(new QueryWrapper<UserBrowse>().in("post_push_id",myPostIds).between("update_time",todayStart,todayEnd));
+            int yesterdaySawMe = userBrowseService.count(new QueryWrapper<UserBrowse>().in("post_push_id",myPostIds).between("update_time",yesterdayStart,yesterdayEnd));
+            resultMap.put("sawMe",todaySawMe);
+            resultMap.put("tySawMe",todaySawMe-yesterdaySawMe);
+
+            // 4.3 我沟通(企业主动发起的沟通数量)
+            int todayICommunicated =chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).eq("type",2).between("create_time",todayStart,todayEnd));
+            int yesterdayICommunicated = chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).eq("type",2).between("create_time",yesterdayStart,yesterdayEnd));
+            resultMap.put("iCommunicated",todayICommunicated);
+            resultMap.put("tyICommunicated",todayICommunicated-yesterdayICommunicated);
+            // 4.4 求职者沟通(求职者主动发起的沟通数量)
+            int todayCandidateCommunicated =chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).eq("type",1).between("create_time",todayStart,todayEnd));
+            int yesterdayCandidateCommunicated = chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).eq("type",1).between("create_time",yesterdayStart,yesterdayEnd));
+            resultMap.put("candidateCommunicated", todayCandidateCommunicated);
+            resultMap.put("tyCandidateCommunicated",todayCandidateCommunicated-yesterdayCandidateCommunicated);
+
+            // 4.5 收获简历(企业收到的简历数量,对应is_send_resumes=1)
+            int todayReceivedResumes = chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).eq("is_send_resumes",1).between("update_time",todayStart,todayEnd));
+            int yesterdayReceivedResumes =chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).eq("is_send_resumes",1).between("update_time",yesterdayStart,yesterdayEnd));
+            resultMap.put("receivedResumes", todayReceivedResumes);
+            resultMap.put("tyReceivedResumes",todayReceivedResumes-yesterdayReceivedResumes);
+
+            // 4.6 交换电话微信(电话/微信交换成功数量,对应is_send_phone=1或is_send_wx=1)
+            int todayExchangedContact = chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).and(qw -> qw.eq("is_send_phone", 1).or().eq("is_send_wx", 1)) .between("update_time",todayStart,todayEnd));
+            int yesterdayExchangedContact = chatConversationService.count(new QueryWrapper<ChatConversation>().eq("focused_user_id",userId).and(qw -> qw.eq("is_send_phone", 1).or().eq("is_send_wx", 1)) .between("update_time",todayStart,todayEnd));
+            resultMap.put("exchangedContact", todayExchangedContact);
+            resultMap.put("tyExchangeContact",todayExchangedContact-yesterdayExchangedContact);
+
+            // 4.7 接受面试(求职者接受面试的数量,需结合status字段定义)
+            int todayAcceptedInterview = interviewRecordService.count(new QueryWrapper<InterviewRecord>().eq("user_id",userId).eq("status",2).between("create_time",todayStart,todayEnd));
+            int yesterdayAcceptedInterview = interviewRecordService.count(new QueryWrapper<InterviewRecord>().eq("user_id",userId).eq("status",2).between("create_time",yesterdayStart,yesterdayEnd));
+            resultMap.put("acceptedInterview", todayAcceptedInterview);
+            resultMap.put("tyAcceptedInterview",todayAcceptedInterview-yesterdayAcceptedInterview);
+
+
+            return resultMap;
+        }
+    }

+ 13 - 7
src/main/java/com/sqx/modules/firstLogin/control/UserFirstRegistController.java

@@ -86,7 +86,7 @@ public class UserFirstRegistController {
         return Result.success().put("data",resumesDto);
     }
     @Login
-    @GetMapping
+    @GetMapping("getResumes")
     @ApiOperation("获取简历详情")
     public Result getResumesByResumesId(@RequestAttribute("userId")Long userId, Long resumesId){
         ResumesDto resumesDto =new ResumesDto();
@@ -100,12 +100,18 @@ public class UserFirstRegistController {
         resumesDto.setWorkExpList(workExpService.selectWorkExp(Integer.valueOf(userId1)));
         resumesDto.setSkills(skillService.selectSkill(Integer.valueOf(userId1)));
         resumesDto.setWorkExpTimes(workExpService.getWorkTime(Long.valueOf(userId1)));
-        UserBrowse userBrowse =new UserBrowse();
-        userBrowse.setUserId(userId);
-        userBrowse.setResumesId(resumesId);
-        userBrowse.setBrowseType(2);
-        userBrowse.setUpdateTime(LocalDateTime.now());
-        userBrowseService.save(userBrowse);
+        UserBrowse userBrowseOld = userBrowseService.getOne(new QueryWrapper<UserBrowse>().eq("user_id",userId).eq("resumes_id",resumesId));
+        if (userBrowseOld != null){
+            userBrowseOld.setUpdateTime(LocalDateTime.now());
+            userBrowseService.updateById(userBrowseOld);
+        }else {
+            UserBrowse userBrowse = new UserBrowse();
+            userBrowse.setUserId(userId);
+            userBrowse.setResumesId(resumesId);
+            userBrowse.setBrowseType(2);
+            userBrowse.setUpdateTime(LocalDateTime.now());
+            userBrowseService.save(userBrowse);
+        }
         return Result.success().put("data",resumesDto);
     }
     @Login

+ 1 - 0
src/main/java/com/sqx/modules/resumes/dao/PostPushDao.java

@@ -11,6 +11,7 @@ import com.sqx.modules.resumes.vo.LetterCity;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**

+ 2 - 1
src/main/java/com/sqx/modules/resumes/entity/ResumesListDto.java

@@ -13,7 +13,7 @@ public class ResumesListDto {
         // 工作经历信息
         private String workType;
         private String companyName;
-        private String skills;// 最后工作结束时间
+        private String intentIndustry;// 最后工作结束时间
         private String lastWorkStartTime;
         private String lastWorkEndTime;
         private String workContent;
@@ -31,5 +31,6 @@ public class ResumesListDto {
         private String resumesEducation;  // 简历学历信息
         private String resumesWorkExperience;  // 简历工作经历信息
         private Long resumesId;
+        private Integer  isRecommend;
     }
 

+ 1 - 0
src/main/java/com/sqx/modules/resumes/service/PostPushService.java

@@ -8,6 +8,7 @@ import com.sqx.modules.resumes.entity.PostPush;
 import com.sqx.modules.resumes.vo.CityVo;
 import com.sqx.modules.resumes.vo.LetterCity;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 public interface PostPushService extends IService<PostPush> {

+ 7 - 5
src/main/resources/mapper/resumes/ResumesDao.xml

@@ -76,7 +76,7 @@
         u.age AS userAge,
         last_work.type AS workType,
         last_work.company_name AS companyName,
-        last_work.skills AS skills,
+        intent.intentIndustry as intentIndustry,
         last_work.start_time As lastWorkStartTime,
         last_work.end_time AS lastWorkEndTime,
         last_work.work_content AS workContent,
@@ -89,7 +89,8 @@
         resumes.status AS resumesStatus,
         resumes.resumes_education AS resumesEducation,
         resumes.resumes_work_experience AS resumesWorkExperience,
-        resumes.resumes_id AS resumesId
+        resumes.resumes_id AS resumesId,
+        resumes.is_recommend AS isRecommend
         FROM
         tb_user u
         INNER JOIN resumes
@@ -119,6 +120,7 @@
         user_id,
         GROUP_CONCAT(DISTINCT rule_classify_name SEPARATOR ',') AS all_expected_positions,
         GROUP_CONCAT(DISTINCT citys SEPARATOR ',') AS all_expected_cities,
+        GROUP_CONCAT(DISTINCT industry SEPARATOR',') AS intentIndustry,
         MIN(min_salary) AS min_salary,
         MAX(max_salary) AS max_salary
         FROM intention
@@ -126,9 +128,9 @@
         GROUP BY user_id
         ) intent ON u.user_id = intent.user_id
     <where>
-<!--        <if test="resumesDto.expectedCity!=null or resumesDto.city==''">-->
-<!--            AND FIND_IN_SET(#{resumesDto.expectedCity}, expectedCity) > 0-->
-<!--        </if>-->
+        <if test="resumesListDto.expectedCity!=null or resumesListDto.city==''">
+            AND FIND_IN_SET(#{resumesListDto.expectedCity}, expectedCity)
+        </if>
         <if test="resumesListDto.resumesId !=null or resumesListDto.resumesId==''">
              resumes.resumes_id = #{resumesListDto.resumesId}
         </if>