Merge branch 'main' of ssh://124.243.245.42:2222/zkr/shz-backend

This commit is contained in:
2026-07-30 11:10:12 +08:00
29 changed files with 839 additions and 29 deletions

View File

@@ -240,6 +240,7 @@ public class AppJobController extends BaseController
String errorMsg = "描述中包含敏感词:" + String.join("", sensitiveWords);
return AjaxResult.error(errorMsg, sensitiveWords);
}
job.setDataSource("1");//系统自录
jobService.publishJob(job);
return success();
}

View File

@@ -0,0 +1,82 @@
package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.policy.PolicyConsultRecord;
import com.ruoyi.cms.domain.policy.PolicyConsultReplyDTO;
import com.ruoyi.cms.domain.policy.PolicyConsultSatisfactionDTO;
import com.ruoyi.cms.domain.policy.PolicyConsultSubmitDTO;
import com.ruoyi.cms.service.policy.IPolicyConsultRecordService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/app/policyConsultRecord")
@Api(tags = "移动端接口:政策咨询记录")
public class AppPolicyConsultRecordController extends BaseController {
@Autowired
private IPolicyConsultRecordService policyConsultRecordService;
/**
* 保存用户提交留言咨询
*/
@ApiOperation("用户提交留言咨询")
@PostMapping("/submit")
public AjaxResult save(@RequestBody PolicyConsultSubmitDTO policyConsultSubmitDTO){
log.info("用户提交留言咨询...小程序端");
if(!SiteSecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(SiteSecurityUtils.getUserId() == null){
return AjaxResult.error("获取用户ID失败!");
}
policyConsultSubmitDTO.setUserId(SiteSecurityUtils.getUserId());
return toAjax(policyConsultRecordService.insert(policyConsultSubmitDTO));
}
/**
* 用户查看【自己】的留言咨询记录(留言板只能看自己)
*/
@ApiOperation("用户查看【自己】的留言咨询记录(留言板只能看自己)")
@GetMapping("/my/list/{policyId}")
public TableDataInfo getMyConsult(@ApiParam("政策ID") @PathVariable Long policyId){
startPage();
if(SiteSecurityUtils.getUserId() == null){
throw new RuntimeException("用户ID不能为空");
}
Long userId = SiteSecurityUtils.getUserId();
List<PolicyConsultRecord> list = policyConsultRecordService.getUserOwnConsultList(policyId,userId);
return getDataTable(list);
}
/**
* 用户对咨询进行满意度评价
*/
@ApiOperation("用户对咨询进行满意度评价")
@PostMapping("/satisfaction")
public AjaxResult satisfaction(@RequestBody PolicyConsultSatisfactionDTO dto){
if(!SiteSecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(SiteSecurityUtils.getUserId() == null){
return AjaxResult.error("获取用户ID失败!");
}
dto.setUserId(SiteSecurityUtils.getUserId());
return toAjax(policyConsultRecordService.submitSatisfaction(dto));
}
}

View File

@@ -147,6 +147,7 @@ public class CmsJobController extends BaseController
return AjaxResult.error(errorMsg, sensitiveWords);
}
job.setJobStatus("0");
job.setDataSource("1");//系统自录
// 无敏感词,执行插入
return toAjax(jobService.insertJob(job));
}

View File

@@ -0,0 +1,101 @@
package com.ruoyi.cms.controller.cms;
import com.ruoyi.cms.domain.policy.*;
import com.ruoyi.cms.service.policy.IPolicyConsultRecordService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/cms/policyConsultRecord")
@Api(tags = "CMS政策咨询记录管理")
public class CmsPolicyConsultRecordController extends BaseController {
@Autowired
private IPolicyConsultRecordService policyConsultRecordService;
private static final Logger log = LoggerFactory.getLogger(CmsPolicyConsultRecordController.class);
/**
* 保存用户提交留言咨询
*/
@ApiOperation("用户提交留言咨询")
@PostMapping("/submit")
public AjaxResult save(@RequestBody PolicyConsultSubmitDTO policyConsultSubmitDTO){
log.info("用户提交留言咨询...pc端");
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(SecurityUtils.getAppuserId() == null){
return AjaxResult.error("获取用户ID失败!");
}
policyConsultSubmitDTO.setUserId(SecurityUtils.getAppuserId());
return toAjax(policyConsultRecordService.insert(policyConsultSubmitDTO));
}
/**
* 用户查看【自己】的留言咨询记录(留言板只能看自己)
*/
@ApiOperation("用户查看【自己】的留言咨询记录(留言板只能看自己)")
@GetMapping("/my/list/{policyId}")
public TableDataInfo getMyConsult(@ApiParam("政策ID") @PathVariable Long policyId){
startPage();
if(SecurityUtils.getAppuserId() == null){
throw new RuntimeException("用户ID不能为空");
}
Long userId = SecurityUtils.getAppuserId();
List<PolicyConsultRecord> list = policyConsultRecordService.getUserOwnConsultList(policyId,userId);
return getDataTable(list);
}
/**
* 用户对咨询进行满意度评价
*/
@ApiOperation("用户对咨询进行满意度评价")
@PostMapping("/satisfaction")
public AjaxResult satisfaction(@RequestBody PolicyConsultSatisfactionDTO dto){
if(!SecurityUtils.isLogin()){
return AjaxResult.error("用户未登录!");
}
if(SecurityUtils.getAppuserId() == null){
return AjaxResult.error("获取用户ID失败!");
}
dto.setUserId(SecurityUtils.getAppuserId());
return toAjax(policyConsultRecordService.submitSatisfaction(dto));
}
// ========== 管理员接口 ==========
/**
* 管理员回复留言咨询
*/
@ApiOperation("管理员回复留言咨询")
@PostMapping("/reply")
public AjaxResult reply(@RequestBody PolicyConsultReplyDTO dto){
return toAjax(policyConsultRecordService.replyConsult(dto));
}
/**
* 管理员查看全部咨询存档记录
*/
@ApiOperation("管理员查看全部咨询存档记录")
@PostMapping("/list")
public TableDataInfo allRecord(@RequestBody PolicyConsultQueryDTO query){
startPage();
List<PolicyConsultRecord> list = policyConsultRecordService.getAllConsultRecord(query);
return getDataTable(list);
}
}

View File

@@ -243,4 +243,15 @@ public class IndustryController extends BaseController
updateIndustry.setParentId(parentId);
industryService.updateIndustry(updateIndustry);
}
/**
* 查询第一级行业大类
*/
@ApiOperation("查询第一级行业大类")
@GetMapping("/first-level")
public AjaxResult getFirstLevelIndustries()
{
List<Industry> list = industryService.selectFirstLevelIndustryList();
return success(list);
}
}

View File

@@ -141,7 +141,7 @@ public class Job extends BaseEntity
@ApiModelProperty("是否发布 0未发布 1发布")
private Integer isPublish;
@ApiModelProperty("数据来源 5本地石河子模板导入")
@ApiModelProperty("数据来源 5本地石河子模板导入;本地录入1;互联网岗位上传2;")
private String dataSource;
@ApiModelProperty("岗位链接")

View File

@@ -0,0 +1,34 @@
package com.ruoyi.cms.domain.policy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("政策咨询查询")
public class PolicyConsultQueryDTO {
@ApiModelProperty("页码")
private Integer pageNum = 1;
@ApiModelProperty("每页条数")
private Integer pageSize = 10;
@ApiModelProperty("政策名称搜索关键词")
private String searchValue;
@ApiModelProperty("咨询状态 PENDING待回复、REPLIED已回复")
private String consultStatus;
@ApiModelProperty("满意度0-5分")
private Integer satisfaction;
// 咨询起始时间
@ApiModelProperty("咨询起始时间")
private Date beginConsultTime;
// 咨询结束时间
@ApiModelProperty("咨询结束时间")
private Date endConsultTime;
}

View File

@@ -0,0 +1,83 @@
package com.ruoyi.cms.domain.policy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel("政策咨询记录")
public class PolicyConsultRecord extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 咨询渠道 - 留言板 */
public static final String CHANNEL_MESSAGE_BOARD = "MESSAGE_BOARD";
/** 咨询渠道 - 在线客服 */
public static final String CHANNEL_ONLINE_CHAT = "ONLINE_CHAT";
/** 状态 - 待回复 */
public static final String STATUS_PENDING = "PENDING";
/** 状态 - 已回复 */
public static final String STATUS_REPLIED = "REPLIED";
/** 状态 - 已办结 */
public static final String STATUS_CLOSED = "CLOSED";
/** 主键 */
@ApiModelProperty("主键")
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/** 咨询用户ID */
@ApiModelProperty("咨询用户ID")
private Long userId;
/** 管理员ID */
@ApiModelProperty("管理员ID")
private Long adminId;
/** 浏览咨询对应的政策ID */
@ApiModelProperty("浏览咨询对应的政策ID")
private Long policyId;
/** 政策名称 */
@ApiModelProperty("政策名称")
private String policyName;
/** 咨询渠道MESSAGE_BOARD 留言板、ONLINE_CHAT在线客服等 */
@ApiModelProperty("咨询渠道MESSAGE_BOARD 留言板")
private String consultChannel;
/** 用户咨询问题 */
@ApiModelProperty("用户咨询问题")
private String questionContent;
/** 管理员回复内容 */
@ApiModelProperty("管理员回复内容")
private String replyContent;
/** 状态 PENDING待回复、REPLIED已回复、CLOSED已办结 */
@ApiModelProperty("状态 PENDING待回复、REPLIED已回复、CLOSED已办结")
private String consultStatus;
/** 咨询提交时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("咨询提交时间")
private Date consultTime;
/** 回复时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("回复时间")
private Date replyTime;
/** 用户满意度 五颗星 每颗星代表1分 */
@ApiModelProperty("用户满意度 五颗星 每颗星代表1分")
private Integer satisfaction;
}

View File

@@ -0,0 +1,20 @@
package com.ruoyi.cms.domain.policy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("管理员回复")
public class PolicyConsultReplyDTO {
@NotNull(message = "记录ID不能为空")
@ApiModelProperty(value = "记录ID", required = true, example = "1")
private Long recordId;
@ApiModelProperty(value = "回复内容", required = true, example = "回复内容")
@NotNull(message = "回复内容不能为空")
private String replyContent;
}

View File

@@ -0,0 +1,23 @@
package com.ruoyi.cms.domain.policy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("政策咨询满意度评价")
public class PolicyConsultSatisfactionDTO {
@NotNull(message = "记录ID不能为空")
@ApiModelProperty(value = "记录ID", required = true, example = "1")
private Long recordId;
@ApiModelProperty(value = "满意度", required = true, example = "1")
@NotNull(message = "满意度不能为空")
private Integer satisfaction;
@ApiModelProperty(value = "用户ID")
private Long userId;
}

View File

@@ -0,0 +1,26 @@
package com.ruoyi.cms.domain.policy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("用户提交留言")
public class PolicyConsultSubmitDTO {
@NotNull(message = "政策ID不能为空")
@ApiModelProperty(value = "政策ID", required = true, example = "1")
private Long policyId;
@NotNull(message = "咨询问题不能为空")
@ApiModelProperty(value = "咨询问题", required = true, example = "咨询问题")
private String questionContent;
@NotNull(message = "咨询渠道不能为空( 渠道固定传 MESSAGE_BOARD留言板渠道")
@ApiModelProperty(value = "咨询渠道", required = true, example = "MESSAGE_BOARD")
private String consultChannel;
@ApiModelProperty(value = "咨询用户ID")
private Long userId;
}

View File

@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@@ -73,4 +74,36 @@ public class PolicyInfo extends BaseEntity {
@ApiModelProperty("状态0启用 1禁用")
private String status;
@ApiModelProperty("行业大类")
private String industryBigType;
@ApiModelProperty("行业大类名称")
private String industryBigTypeName;
@ApiModelProperty("政策文号")
private String docNo;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("生效日期")
private Date effectiveTime;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("失效日期")
private Date expireTime;
@ApiModelProperty("政策背景")
private String policyBackground;
@ApiModelProperty("目标宗旨")
private String policyPurpose;
@ApiModelProperty("具体条款")
private String policyClause;
@ApiModelProperty("实施细则")
private String implementRule;
@ApiModelProperty("电子邮件")
private String email;
}

View File

@@ -41,4 +41,6 @@ public interface CompanyMapper extends BaseMapper<Company>
/** 查询企业未参加的已结束户外招聘会。 */
List<CompanyMissedOutdoorFairVO> selectMissedOutdoorFairList(@Param("companyId") Long companyId);
public List<Company> selectCompanyCleanList(CompanySearch company);
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.cms.mapper.policy;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cms.domain.policy.PolicyConsultRecord;
public interface PolicyConsultRecordMapper extends BaseMapper<PolicyConsultRecord> {
int insert(PolicyConsultRecord policyConsultRecord);
}

View File

@@ -61,4 +61,10 @@ public interface IIndustryService
void importData();
/**
* 查询第一级行业大类
*
* @return 行业集合
*/
public List<Industry> selectFirstLevelIndustryList();
}

View File

@@ -41,7 +41,7 @@ import java.util.stream.Collectors;
/**
* 实体模板Service业务层处理
*
*
* @author ruoyi
*/
@Service
@@ -607,7 +607,7 @@ public class ESJobSearchImpl implements IESJobSearchService
// 薪资范围筛选:兼容前端字段 salaryMin/salaryMax 和 minSalary/maxSalary
Long userMinSalary = Objects.nonNull(esJobSearch.getSalaryMin()) ? esJobSearch.getSalaryMin() : esJobSearch.getMinSalary();
Long userMaxSalary = Objects.nonNull(esJobSearch.getSalaryMax()) ? esJobSearch.getSalaryMax() : esJobSearch.getMaxSalary();
// 岗位最高薪资必须在用户筛选范围内
// 条件:岗位最大薪资 <= 用户最大薪资 AND 岗位最大薪资 >= 用户最小薪资
if(Objects.nonNull(userMinSalary) && Objects.nonNull(userMaxSalary)){
@@ -828,17 +828,17 @@ public class ESJobSearchImpl implements IESJobSearchService
public EsPageInfo<ESJobDocument> aiList(ESJobSearch jobQuery) {
Integer pageNum = jobQuery.getCurrent();
Integer pageSize = jobQuery.getPageSize();
// 第一次查询:包含区域条件
EsPageInfo<ESJobDocument> result = doAiListQuery(jobQuery, pageNum, pageSize, true);
// 降级查询:如果没有找到岗位且有区域条件,忽略区域重新查询
if ((result.getList() == null || result.getList().isEmpty())
if ((result.getList() == null || result.getList().isEmpty())
&& (hasText(jobQuery.getArea()) || jobQuery.getJobLocationAreaCode() != null)) {
logger.info("AI岗位查询降级忽略区域条件重新查询");
result = doAiListQuery(jobQuery, pageNum, pageSize, false);
}
return result;
}
@@ -851,7 +851,7 @@ public class ESJobSearchImpl implements IESJobSearchService
*/
private EsPageInfo<ESJobDocument> doAiListQuery(ESJobSearch jobQuery, Integer pageNum, Integer pageSize, boolean includeArea) {
LambdaEsQueryWrapper<ESJobDocument> wrapper = new LambdaEsQueryWrapper<>();
if(hasText(jobQuery.getJobTitle())){
wrapper.and(a->a.match(ESJobDocument::getJobTitle,jobQuery.getJobTitle().trim(),5.0f)
.or()

View File

@@ -34,6 +34,9 @@ public class IndustryServiceImpl extends ServiceImpl<IndustryMapper,Industry> im
@Autowired
private IndustryMapper industryMapper;
/** 行业根节点父ID */
public static final Long INDUSTRY_ROOT_PARENT_ID = 0L;
/**
* 查询行业
*
@@ -234,4 +237,12 @@ public class IndustryServiceImpl extends ServiceImpl<IndustryMapper,Industry> im
}
@Override
public List<Industry> selectFirstLevelIndustryList() {
Industry industry = new Industry();
industry.setParentId(INDUSTRY_ROOT_PARENT_ID);
industry.setStatus("0");
return industryMapper.selectIndustryList(industry);
}
}

View File

@@ -297,6 +297,8 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
.collect(Collectors.toList());
job.setFilesList(processedFiles);
//浏览量默认添加+1
this.view(jobId);
return job;
}
@@ -1009,6 +1011,7 @@ public class JobServiceImpl extends ServiceImpl<JobMapper,Job> implements IJobSe
job.setCreateBy(string);
job.setCreateTime(formattedDate);
job.setRowId(Long.valueOf(rowWork.getId()));
job.setDataSource("2");//互联网岗位上传
jobBatch.add(job);

View File

@@ -0,0 +1,18 @@
package com.ruoyi.cms.service.policy;
import com.ruoyi.cms.domain.policy.*;
import java.util.List;
public interface IPolicyConsultRecordService {
int insert(PolicyConsultSubmitDTO policyConsultSubmitDTO);
int replyConsult(PolicyConsultReplyDTO policyConsultReplyDTO);
int submitSatisfaction(PolicyConsultSatisfactionDTO dto);
List<PolicyConsultRecord> getUserOwnConsultList(Long policyId, Long userId);
List<PolicyConsultRecord> getAllConsultRecord(PolicyConsultQueryDTO queryDTO);
}

View File

@@ -0,0 +1,128 @@
package com.ruoyi.cms.service.policy.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cms.domain.policy.*;
import com.ruoyi.cms.mapper.policy.PolicyConsultRecordMapper;
import com.ruoyi.cms.mapper.policy.PolicyInfoMapper;
import com.ruoyi.cms.service.policy.IPolicyConsultRecordService;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import static com.ruoyi.common.utils.DateUtils.YYYY_MM_DD_HH_MM_SS;
@Service
public class PolicyConsultRecordServiceImpl extends ServiceImpl<PolicyConsultRecordMapper, PolicyConsultRecord> implements IPolicyConsultRecordService {
@Autowired
private PolicyConsultRecordMapper policyConsultRecordMapper;
@Autowired
private PolicyInfoMapper policyInfoMapper;
private static final Logger log = LoggerFactory.getLogger(PolicyConsultRecordServiceImpl.class);
@Override
public int insert(PolicyConsultSubmitDTO policyConsultSubmitDTO) {
log.info("开始执行保存...");
PolicyInfo policyInfo = policyInfoMapper.selectPolicyInfoById(policyConsultSubmitDTO.getPolicyId());
if (policyInfo == null) {
throw new RuntimeException("政策不存在");
}
PolicyConsultRecord record = new PolicyConsultRecord();
record.setUserId(policyConsultSubmitDTO.getUserId());
record.setPolicyId(policyConsultSubmitDTO.getPolicyId());
record.setPolicyName(policyInfo.getZcmc());
record.setConsultChannel(policyConsultSubmitDTO.getConsultChannel());
record.setQuestionContent(policyConsultSubmitDTO.getQuestionContent());
record.setConsultStatus(PolicyConsultRecord.STATUS_PENDING);
record.setConsultTime(new Date());
return policyConsultRecordMapper.insert(record);
}
/**
* 2.管理员回复咨询
*/
@Override
public int replyConsult(PolicyConsultReplyDTO dto) {
PolicyConsultRecord record = policyConsultRecordMapper.selectById(dto.getRecordId());
record.setReplyContent(dto.getReplyContent());
record.setConsultStatus(PolicyConsultRecord.STATUS_REPLIED);
record.setReplyTime(new Date());
record.setAdminId(SecurityUtils.getUserId());//管理员id
record.setUpdateBy(SecurityUtils.getUsername());//管理员名称
record.setUpdateTime(DateUtils.dateTimeNow(YYYY_MM_DD_HH_MM_SS));
return policyConsultRecordMapper.updateById(record);
}
/**
* 3.用户评价满意度(存档满意度信息)
*/
@Override
public int submitSatisfaction(PolicyConsultSatisfactionDTO dto) {
PolicyConsultRecord record = policyConsultRecordMapper.selectById(dto.getRecordId());
// 权限校验:只能评价自己的咨询记录
if (!record.getUserId().equals(dto.getUserId())){
throw new RuntimeException("无权操作");
}
record.setSatisfaction(dto.getSatisfaction());
record.setUpdateTime(DateUtils.dateTimeNow(YYYY_MM_DD_HH_MM_SS));
return policyConsultRecordMapper.updateById(record);
}
/**
* 4.【重要】用户查询自己的留言咨询记录
* 需求备注留言板自己看自己只能查询userId匹配的数据
*/
@Override
public List<PolicyConsultRecord> getUserOwnConsultList(Long policyId, Long userId) {
LambdaQueryWrapper<PolicyConsultRecord> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(PolicyConsultRecord::getUserId, userId);
// 可选:按政策筛选
if(policyId != null){
wrapper.eq(PolicyConsultRecord::getPolicyId, policyId);
}
wrapper.orderByDesc(PolicyConsultRecord::getConsultTime);
return policyConsultRecordMapper.selectList(wrapper);
}
/**
* 管理员后台:查询全部咨询存档记录(用于台账查看)
*/
@Override
public List<PolicyConsultRecord> getAllConsultRecord(PolicyConsultQueryDTO query) {
LambdaQueryWrapper<PolicyConsultRecord> wrapper = new LambdaQueryWrapper<>();
// 状态
if(StringUtils.isNotEmpty(query.getConsultStatus())){
wrapper.eq(PolicyConsultRecord::getConsultStatus, query.getConsultStatus());
}
// 满意度
if(query.getSatisfaction() != null){
wrapper.eq(PolicyConsultRecord::getSatisfaction, query.getSatisfaction());
}
// 政策
if(StringUtils.isNotEmpty(query.getSearchValue())){
wrapper.like(PolicyConsultRecord::getPolicyName, query.getSearchValue());
}
// 时间区间
if(query.getBeginConsultTime() != null){
wrapper.ge(PolicyConsultRecord::getConsultTime, query.getBeginConsultTime());
}
if(query.getEndConsultTime() != null){
wrapper.le(PolicyConsultRecord::getConsultTime, query.getEndConsultTime());
}
// 排序:最新咨询靠前
wrapper.orderByDesc(PolicyConsultRecord::getConsultTime);
return policyConsultRecordMapper.selectList(wrapper);
}
}

View File

@@ -5,7 +5,9 @@ import com.github.pagehelper.PageInfo;
import com.ruoyi.cms.domain.policy.PolicyInfo;
import com.ruoyi.cms.domain.policy.PolicyInfoQuery;
import com.ruoyi.cms.mapper.policy.PolicyInfoMapper;
import com.ruoyi.cms.service.IIndustryService;
import com.ruoyi.cms.service.policy.IPolicyInfoService;
import com.ruoyi.common.core.domain.entity.Industry;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
@@ -29,6 +31,12 @@ public class PolicyInfoServiceImpl implements IPolicyInfoService {
@Autowired
private PolicyInfoMapper policyInfoMapper;
@Autowired
private IIndustryService industryService;
@Override
public TableDataInfo getPortalList(PolicyInfoQuery query) {
PageHelper.startPage(query.getPageNum(), query.getPageSize());
@@ -58,7 +66,10 @@ public class PolicyInfoServiceImpl implements IPolicyInfoService {
@Override
public PolicyInfo getDetail(Long id) {
return policyInfoMapper.selectPolicyInfoById(id);
PolicyInfo policyInfo = policyInfoMapper.selectPolicyInfoById(id);
Industry industry = industryService.selectIndustryByIndustryId(Long.valueOf(policyInfo.getIndustryBigType()));
policyInfo.setIndustryBigTypeName(industry.getIndustryName());
return policyInfo;
}
@Override

View File

@@ -37,6 +37,22 @@ public class JobRecommendUtil {
public static final Float EXP_MATCH_LOW1 = 2F;
public static final Float EXP_MATCH_LOWER = 1F;
private static final Map<Character, Character> CHINA_NUM_MAP;
static {
CHINA_NUM_MAP = new HashMap<>();
CHINA_NUM_MAP.put('零', '0');
CHINA_NUM_MAP.put('一', '1');
CHINA_NUM_MAP.put('二', '2');
CHINA_NUM_MAP.put('三', '3');
CHINA_NUM_MAP.put('四', '4');
CHINA_NUM_MAP.put('五', '5');
CHINA_NUM_MAP.put('六', '6');
CHINA_NUM_MAP.put('七', '7');
CHINA_NUM_MAP.put('八', '8');
CHINA_NUM_MAP.put('九', '9');
}
// =====================基础计算方法=====================
/**
@@ -48,17 +64,62 @@ public class JobRecommendUtil {
if (StrUtil.isBlank(startDateStr)) {
return 0;
}
LocalDate start = LocalDate.parse(startDateStr + "-01");
LocalDate start = parseToFirstDayOfMonth(startDateStr);
LocalDate end;
if (StrUtil.isBlank(endDateStr)) {
end = LocalDate.now();
} else {
end = LocalDate.parse(endDateStr + "-01");
end = parseToFirstDayOfMonth(endDateStr);
}
Period period = Period.between(start, end);
return period.getYears() * 12 + period.getMonths();
}
/**
* 兼容两种格式yyyy-MM / yyyy-MM-dd返回当月1号
*/
private static LocalDate parseToFirstDayOfMonth(String dateStr) {
try {
String source = dateStr.trim();
//中文年份转阿拉伯数字:二零一六 → 2016
source = convertChinaYearToNum(source);
LocalDate date;
if (source.matches("^\\d{4}$")) {
// 仅年份 2016 → 2016-01-01
date = LocalDate.parse(source + "-01-01");
} else if (source.matches("^\\d{4}-\\d{2}$")) {
// yyyy-MM
date = LocalDate.parse(source + "-01");
} else if (source.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
// yyyy-MM-dd
date = LocalDate.parse(source);
} else {
throw new IllegalArgumentException("无法识别日期格式:" + dateStr);
}
return date.withDayOfMonth(1);
} catch (Exception e) {
throw new IllegalArgumentException("日期解析失败,原始值:" + dateStr
+ "支持格式2016、2016-09、2016-09-09、二零一六", e);
}
}
/**
* 中文年份字符串转数字年份
* 例:二零一六 → 2016二零二五-03 保留后面横杠
*/
private static String convertChinaYearToNum(String str) {
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray()) {
if (CHINA_NUM_MAP.containsKey(c)) {
sb.append(CHINA_NUM_MAP.get(c));
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
* 计算全部工作经历总月数(简单累加,不处理时间重叠)
*/