feat: 新增招聘会机构管理和场地所属机构关联
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package com.ruoyi.cms.controller.cms;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.ruoyi.cms.domain.JobFairInstitution;
|
||||
import com.ruoyi.cms.service.IJobFairInstitutionService;
|
||||
import com.ruoyi.common.annotation.Log;
|
||||
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.enums.BusinessType;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* 招聘会机构管理 Controller。
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/cms/job-fair-institution")
|
||||
@Api(tags = "后台:招聘会机构管理")
|
||||
public class JobFairInstitutionController extends BaseController
|
||||
{
|
||||
@Autowired
|
||||
private IJobFairInstitutionService institutionService;
|
||||
|
||||
@ApiOperation("查询机构列表")
|
||||
@PreAuthorize("@ss.hasPermi('cms:jobFairInstitution:list')")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo list(JobFairInstitution query)
|
||||
{
|
||||
startPage();
|
||||
List<JobFairInstitution> list = institutionService.selectInstitutionList(query);
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@ApiOperation("获取机构详细信息")
|
||||
@PreAuthorize("@ss.hasPermi('cms:jobFairInstitution:query')")
|
||||
@GetMapping("/{id}")
|
||||
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||
{
|
||||
return success(institutionService.getById(id));
|
||||
}
|
||||
|
||||
@ApiOperation("新增机构")
|
||||
@PreAuthorize("@ss.hasPermi('cms:jobFairInstitution:add')")
|
||||
@Log(title = "招聘会机构", businessType = BusinessType.INSERT)
|
||||
@PostMapping
|
||||
public AjaxResult add(@RequestBody JobFairInstitution institution)
|
||||
{
|
||||
JobFairInstitution saved = institutionService.saveInstitution(institution);
|
||||
AjaxResult result = toAjax(saved != null && saved.getId() != null);
|
||||
if (result.isSuccess()) {
|
||||
result.put("data", saved);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ApiOperation("修改机构")
|
||||
@PreAuthorize("@ss.hasPermi('cms:jobFairInstitution:edit')")
|
||||
@Log(title = "招聘会机构", businessType = BusinessType.UPDATE)
|
||||
@PutMapping
|
||||
public AjaxResult edit(@RequestBody JobFairInstitution institution)
|
||||
{
|
||||
return toAjax(institutionService.updateInstitution(institution));
|
||||
}
|
||||
|
||||
@ApiOperation("删除机构")
|
||||
@PreAuthorize("@ss.hasPermi('cms:jobFairInstitution:remove')")
|
||||
@Log(title = "招聘会机构", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public AjaxResult remove(@PathVariable Long[] ids)
|
||||
{
|
||||
return toAjax(institutionService.removeInstitutionByIds(Arrays.asList(ids)));
|
||||
}
|
||||
}
|
||||
@@ -100,7 +100,7 @@ public class VenueInfoController extends BaseController
|
||||
@GetMapping(value = "/{id}")
|
||||
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||
{
|
||||
return success(venueInfoService.getById(id));
|
||||
return success(venueInfoService.getVenueInfoWithInstitutions(id));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,11 +109,12 @@ public class VenueInfoController extends BaseController
|
||||
@ApiOperation("新增场地信息")
|
||||
@PreAuthorize("@ss.hasPermi('cms:venueInfo:add')")
|
||||
@Log(title = "场地信息", businessType = BusinessType.INSERT)
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@PostMapping
|
||||
public AjaxResult add(@RequestBody VenueInfo venueInfo)
|
||||
{
|
||||
fillHandleFields(venueInfo);
|
||||
return toAjax(venueInfoService.save(venueInfo));
|
||||
return toAjax(venueInfoService.saveWithInstitutions(venueInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -122,11 +123,12 @@ public class VenueInfoController extends BaseController
|
||||
@ApiOperation("修改场地信息")
|
||||
@PreAuthorize("@ss.hasPermi('cms:venueInfo:edit')")
|
||||
@Log(title = "场地信息", businessType = BusinessType.UPDATE)
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@PutMapping
|
||||
public AjaxResult edit(@RequestBody VenueInfo venueInfo)
|
||||
{
|
||||
fillHandleFields(venueInfo);
|
||||
return toAjax(venueInfoService.updateById(venueInfo));
|
||||
return toAjax(venueInfoService.updateWithInstitutions(venueInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -138,7 +140,7 @@ public class VenueInfoController extends BaseController
|
||||
@DeleteMapping("/{ids}")
|
||||
public AjaxResult remove(@PathVariable Long[] ids)
|
||||
{
|
||||
return toAjax(venueInfoService.removeByIds(Arrays.asList(ids)));
|
||||
return toAjax(venueInfoService.removeByIdsWithInstitutions(Arrays.asList(ids)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.ruoyi.cms.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 招聘会机构对象 cms_job_fair_institution。
|
||||
*/
|
||||
@Data
|
||||
@ApiModel("招聘会机构")
|
||||
@TableName("cms_job_fair_institution")
|
||||
public class JobFairInstitution extends BaseEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
@ApiModelProperty("主键ID")
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty("机构名称")
|
||||
private String institutionName;
|
||||
|
||||
@ApiModelProperty("机构简介")
|
||||
private String institutionIntro;
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
@@ -74,4 +75,12 @@ public class VenueInfo extends BaseEntity
|
||||
@Excel(name = "经办人")
|
||||
@ApiModelProperty("经办人")
|
||||
private String handler;
|
||||
|
||||
@TableField(exist = false)
|
||||
@ApiModelProperty("所属机构ID列表")
|
||||
private java.util.List<Long> institutionIds;
|
||||
|
||||
@TableField(exist = false)
|
||||
@ApiModelProperty("所属机构名称,多个用顿号分隔")
|
||||
private String institutionNames;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.ruoyi.cms.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 场地与招聘会机构关联对象 cms_venue_institution。
|
||||
*/
|
||||
@Data
|
||||
@TableName("cms_venue_institution")
|
||||
public class VenueInstitution
|
||||
{
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Long id;
|
||||
|
||||
private Long venueId;
|
||||
|
||||
private Long institutionId;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ruoyi.cms.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.ruoyi.cms.domain.JobFairInstitution;
|
||||
|
||||
/**
|
||||
* 招聘会机构 Mapper。
|
||||
*/
|
||||
public interface JobFairInstitutionMapper extends BaseMapper<JobFairInstitution>
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ruoyi.cms.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.ruoyi.cms.domain.VenueInstitution;
|
||||
|
||||
/**
|
||||
* 场地与招聘会机构关联 Mapper。
|
||||
*/
|
||||
public interface VenueInstitutionMapper extends BaseMapper<VenueInstitution>
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.ruoyi.cms.service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.ruoyi.cms.domain.JobFairInstitution;
|
||||
|
||||
/**
|
||||
* 招聘会机构 Service。
|
||||
*/
|
||||
public interface IJobFairInstitutionService extends IService<JobFairInstitution>
|
||||
{
|
||||
/**
|
||||
* 查询机构列表。
|
||||
*/
|
||||
List<JobFairInstitution> selectInstitutionList(JobFairInstitution query);
|
||||
|
||||
/**
|
||||
* 新增机构并校验机构名称。
|
||||
*/
|
||||
JobFairInstitution saveInstitution(JobFairInstitution institution);
|
||||
|
||||
/**
|
||||
* 修改机构并校验机构名称。
|
||||
*/
|
||||
boolean updateInstitution(JobFairInstitution institution);
|
||||
|
||||
/**
|
||||
* 删除机构;已被场地使用的机构不允许删除。
|
||||
*/
|
||||
boolean removeInstitutionByIds(Collection<Long> ids);
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.ruoyi.cms.service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.ruoyi.cms.domain.VenueInfo;
|
||||
@@ -21,6 +22,18 @@ public interface IVenueInfoService extends IService<VenueInfo>
|
||||
*/
|
||||
List<VenueInfo> selectVenueInfoList(VenueInfo venueInfo);
|
||||
|
||||
/** 查询场地详情并填充所属机构。 */
|
||||
VenueInfo getVenueInfoWithInstitutions(Long id);
|
||||
|
||||
/** 新增场地及所属机构关联。 */
|
||||
boolean saveWithInstitutions(VenueInfo venueInfo);
|
||||
|
||||
/** 修改场地及所属机构关联。 */
|
||||
boolean updateWithInstitutions(VenueInfo venueInfo);
|
||||
|
||||
/** 删除场地及所属机构关联。 */
|
||||
boolean removeByIdsWithInstitutions(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 新增场地信息相关字典项
|
||||
*
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
package com.ruoyi.cms.service.impl;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.ruoyi.cms.domain.JobFairInstitution;
|
||||
import com.ruoyi.cms.domain.VenueInstitution;
|
||||
import com.ruoyi.cms.mapper.JobFairInstitutionMapper;
|
||||
import com.ruoyi.cms.mapper.VenueInstitutionMapper;
|
||||
import com.ruoyi.cms.service.IJobFairInstitutionService;
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* 招聘会机构 Service 实现。
|
||||
*/
|
||||
@Service
|
||||
public class JobFairInstitutionServiceImpl
|
||||
extends ServiceImpl<JobFairInstitutionMapper, JobFairInstitution>
|
||||
implements IJobFairInstitutionService
|
||||
{
|
||||
@Autowired
|
||||
private VenueInstitutionMapper venueInstitutionMapper;
|
||||
|
||||
@Override
|
||||
public List<JobFairInstitution> selectInstitutionList(JobFairInstitution query)
|
||||
{
|
||||
LambdaQueryWrapper<JobFairInstitution> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.like(StringUtils.isNotBlank(query.getInstitutionName()),
|
||||
JobFairInstitution::getInstitutionName, query.getInstitutionName());
|
||||
wrapper.orderByDesc(JobFairInstitution::getCreateTime);
|
||||
wrapper.orderByAsc(JobFairInstitution::getId);
|
||||
return list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public JobFairInstitution saveInstitution(JobFairInstitution institution)
|
||||
{
|
||||
normalizeAndCheck(institution, null);
|
||||
save(institution);
|
||||
return institution;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean updateInstitution(JobFairInstitution institution)
|
||||
{
|
||||
if (institution == null || institution.getId() == null || getById(institution.getId()) == null) {
|
||||
throw new ServiceException("机构不存在");
|
||||
}
|
||||
normalizeAndCheck(institution, institution.getId());
|
||||
return updateById(institution);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean removeInstitutionByIds(Collection<Long> ids)
|
||||
{
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
Long usedCount = venueInstitutionMapper.selectCount(new LambdaQueryWrapper<VenueInstitution>()
|
||||
.in(VenueInstitution::getInstitutionId, ids));
|
||||
if (usedCount != null && usedCount > 0) {
|
||||
throw new ServiceException("机构已被场地使用,请先从场地信息中移除该机构");
|
||||
}
|
||||
return removeByIds(ids);
|
||||
}
|
||||
|
||||
private void normalizeAndCheck(JobFairInstitution institution, Long excludingId)
|
||||
{
|
||||
if (institution == null) {
|
||||
throw new ServiceException("机构信息不能为空");
|
||||
}
|
||||
String name = StringUtils.trim(institution.getInstitutionName());
|
||||
if (StringUtils.isBlank(name)) {
|
||||
throw new ServiceException("机构名称不能为空");
|
||||
}
|
||||
if (name.length() > 200) {
|
||||
throw new ServiceException("机构名称长度不能超过200个字符");
|
||||
}
|
||||
if (StringUtils.isNotBlank(institution.getInstitutionIntro())
|
||||
&& institution.getInstitutionIntro().length() > 2000) {
|
||||
throw new ServiceException("机构简介长度不能超过2000个字符");
|
||||
}
|
||||
institution.setInstitutionName(name);
|
||||
LambdaQueryWrapper<JobFairInstitution> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(JobFairInstitution::getInstitutionName, name);
|
||||
wrapper.ne(excludingId != null, JobFairInstitution::getId, excludingId);
|
||||
if (count(wrapper) > 0) {
|
||||
throw new ServiceException("机构名称已存在");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,28 @@
|
||||
package com.ruoyi.cms.service.impl;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.ruoyi.cms.domain.VenueInfo;
|
||||
import com.ruoyi.cms.domain.JobFairInstitution;
|
||||
import com.ruoyi.cms.domain.VenueInstitution;
|
||||
import com.ruoyi.cms.mapper.JobFairInstitutionMapper;
|
||||
import com.ruoyi.cms.mapper.VenueInfoMapper;
|
||||
import com.ruoyi.cms.mapper.VenueInstitutionMapper;
|
||||
import com.ruoyi.cms.service.IVenueInfoService;
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.common.utils.DictUtils;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* 场地信息Service业务层处理
|
||||
@@ -23,6 +35,12 @@ public class VenueInfoServiceImpl extends ServiceImpl<VenueInfoMapper, VenueInfo
|
||||
{
|
||||
private static final String VENUE_TYPE_DICT = "venue_info_type";
|
||||
|
||||
@Autowired
|
||||
private VenueInstitutionMapper venueInstitutionMapper;
|
||||
|
||||
@Autowired
|
||||
private JobFairInstitutionMapper jobFairInstitutionMapper;
|
||||
|
||||
/**
|
||||
* 查询场地信息列表
|
||||
*
|
||||
@@ -37,7 +55,119 @@ public class VenueInfoServiceImpl extends ServiceImpl<VenueInfoMapper, VenueInfo
|
||||
queryWrapper.like(StringUtils.isNotBlank(venueInfo.getVenueName()), VenueInfo::getVenueName, venueInfo.getVenueName());
|
||||
queryWrapper.like(StringUtils.isNotBlank(venueInfo.getVenueAddress()), VenueInfo::getVenueAddress, venueInfo.getVenueAddress());
|
||||
queryWrapper.orderByDesc(VenueInfo::getCreateTime);
|
||||
return list(queryWrapper);
|
||||
List<VenueInfo> list = list(queryWrapper);
|
||||
enrichInstitutions(list);
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VenueInfo getVenueInfoWithInstitutions(Long id)
|
||||
{
|
||||
VenueInfo venueInfo = getById(id);
|
||||
if (venueInfo != null) {
|
||||
enrichInstitutions(Collections.singletonList(venueInfo));
|
||||
}
|
||||
return venueInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean saveWithInstitutions(VenueInfo venueInfo)
|
||||
{
|
||||
validateInstitutionIds(venueInfo == null ? null : venueInfo.getInstitutionIds());
|
||||
boolean saved = save(venueInfo);
|
||||
if (saved) {
|
||||
replaceInstitutionRelations(venueInfo.getId(), venueInfo.getInstitutionIds());
|
||||
}
|
||||
return saved;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean updateWithInstitutions(VenueInfo venueInfo)
|
||||
{
|
||||
if (venueInfo == null || venueInfo.getId() == null || getById(venueInfo.getId()) == null) {
|
||||
return false;
|
||||
}
|
||||
validateInstitutionIds(venueInfo.getInstitutionIds());
|
||||
boolean updated = updateById(venueInfo);
|
||||
if (updated) {
|
||||
replaceInstitutionRelations(venueInfo.getId(), venueInfo.getInstitutionIds());
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean removeByIdsWithInstitutions(Collection<Long> ids)
|
||||
{
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
venueInstitutionMapper.delete(new LambdaQueryWrapper<VenueInstitution>()
|
||||
.in(VenueInstitution::getVenueId, ids));
|
||||
return removeByIds(ids);
|
||||
}
|
||||
|
||||
private void validateInstitutionIds(List<Long> institutionIds)
|
||||
{
|
||||
if (institutionIds == null || institutionIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<Long> distinctIds = institutionIds.stream()
|
||||
.filter(id -> id != null)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
if (distinctIds.size() != institutionIds.stream().filter(id -> id != null).count()) {
|
||||
throw new ServiceException("所属机构不能重复");
|
||||
}
|
||||
if (distinctIds.size() != jobFairInstitutionMapper.selectBatchIds(distinctIds).size()) {
|
||||
throw new ServiceException("所属机构中包含不存在的机构");
|
||||
}
|
||||
}
|
||||
|
||||
private void replaceInstitutionRelations(Long venueId, List<Long> institutionIds)
|
||||
{
|
||||
venueInstitutionMapper.delete(new LambdaQueryWrapper<VenueInstitution>()
|
||||
.eq(VenueInstitution::getVenueId, venueId));
|
||||
if (institutionIds == null) {
|
||||
return;
|
||||
}
|
||||
for (Long institutionId : institutionIds.stream().filter(id -> id != null).distinct().collect(Collectors.toList())) {
|
||||
VenueInstitution relation = new VenueInstitution();
|
||||
relation.setVenueId(venueId);
|
||||
relation.setInstitutionId(institutionId);
|
||||
venueInstitutionMapper.insert(relation);
|
||||
}
|
||||
}
|
||||
|
||||
private void enrichInstitutions(List<VenueInfo> venues)
|
||||
{
|
||||
if (venues == null || venues.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<Long> venueIds = venues.stream().map(VenueInfo::getId).filter(id -> id != null).collect(Collectors.toList());
|
||||
List<VenueInstitution> relations = venueInstitutionMapper.selectList(new LambdaQueryWrapper<VenueInstitution>()
|
||||
.in(!venueIds.isEmpty(), VenueInstitution::getVenueId, venueIds)
|
||||
.orderByAsc(VenueInstitution::getId));
|
||||
Map<Long, List<Long>> idsByVenue = new LinkedHashMap<>();
|
||||
for (VenueInstitution relation : relations) {
|
||||
idsByVenue.computeIfAbsent(relation.getVenueId(), key -> new ArrayList<>()).add(relation.getInstitutionId());
|
||||
}
|
||||
List<Long> institutionIds = relations.stream().map(VenueInstitution::getInstitutionId).distinct().collect(Collectors.toList());
|
||||
Map<Long, JobFairInstitution> institutions = institutionIds.isEmpty()
|
||||
? Collections.emptyMap()
|
||||
: jobFairInstitutionMapper.selectBatchIds(institutionIds).stream()
|
||||
.collect(Collectors.toMap(JobFairInstitution::getId, item -> item));
|
||||
for (VenueInfo venue : venues) {
|
||||
List<Long> ids = idsByVenue.getOrDefault(venue.getId(), Collections.emptyList());
|
||||
venue.setInstitutionIds(ids);
|
||||
venue.setInstitutionNames(ids.stream()
|
||||
.map(institutions::get)
|
||||
.filter(item -> item != null)
|
||||
.map(JobFairInstitution::getInstitutionName)
|
||||
.collect(Collectors.joining("、")));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
148
sql/migration_job_fair_institution.test-executed.sql
Normal file
148
sql/migration_job_fair_institution.test-executed.sql
Normal file
@@ -0,0 +1,148 @@
|
||||
-- 执行状态:测试环境已执行
|
||||
-- 测试环境:test
|
||||
-- 测试执行时间:2026-07-24 09:39:31 +0800
|
||||
-- 正式环境:未执行
|
||||
-- 招聘会机构管理及场地所属机构多选关联。
|
||||
-- 依赖:招聘会管理目录(menu_name='招聘会管理')和场地信息维护权限已存在。
|
||||
-- 可重复执行;正式环境仅在功能验收通过并获单独授权后执行。
|
||||
|
||||
BEGIN;
|
||||
|
||||
SET LOCAL search_path = shz, public;
|
||||
|
||||
CREATE SEQUENCE IF NOT EXISTS cms_job_fair_institution_id_seq
|
||||
START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
|
||||
|
||||
CREATE SEQUENCE IF NOT EXISTS cms_venue_institution_id_seq
|
||||
START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS cms_job_fair_institution (
|
||||
id BIGINT NOT NULL DEFAULT nextval('cms_job_fair_institution_id_seq') PRIMARY KEY,
|
||||
institution_name VARCHAR(200) NOT NULL,
|
||||
institution_intro TEXT,
|
||||
create_by VARCHAR(64) DEFAULT '',
|
||||
create_time TIMESTAMP(0),
|
||||
update_by VARCHAR(64) DEFAULT '',
|
||||
update_time TIMESTAMP(0),
|
||||
remark VARCHAR(500),
|
||||
del_flag CHAR(1) DEFAULT '0'
|
||||
);
|
||||
|
||||
COMMENT ON TABLE cms_job_fair_institution IS '招聘会机构管理表';
|
||||
COMMENT ON COLUMN cms_job_fair_institution.institution_name IS '机构名称';
|
||||
COMMENT ON COLUMN cms_job_fair_institution.institution_intro IS '机构简介';
|
||||
COMMENT ON COLUMN cms_job_fair_institution.del_flag IS '删除标志(0代表存在 2代表删除)';
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uk_cms_job_fair_institution_name
|
||||
ON cms_job_fair_institution (institution_name) WHERE del_flag = '0';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS cms_venue_institution (
|
||||
id BIGINT NOT NULL DEFAULT nextval('cms_venue_institution_id_seq') PRIMARY KEY,
|
||||
venue_id BIGINT NOT NULL,
|
||||
institution_id BIGINT NOT NULL
|
||||
);
|
||||
|
||||
COMMENT ON TABLE cms_venue_institution IS '场地与招聘会机构关联表';
|
||||
COMMENT ON COLUMN cms_venue_institution.venue_id IS '场地ID';
|
||||
COMMENT ON COLUMN cms_venue_institution.institution_id IS '机构ID';
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uk_cms_venue_institution
|
||||
ON cms_venue_institution (venue_id, institution_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_cms_venue_institution_institution
|
||||
ON cms_venue_institution (institution_id);
|
||||
|
||||
WITH parent_menu AS (
|
||||
SELECT menu_id
|
||||
FROM sys_menu
|
||||
WHERE menu_name = '招聘会管理' AND parent_id = 0
|
||||
ORDER BY menu_id
|
||||
LIMIT 1
|
||||
), inserted_page AS (
|
||||
INSERT INTO sys_menu (
|
||||
menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon,
|
||||
create_by, create_time, remark
|
||||
)
|
||||
SELECT
|
||||
(SELECT COALESCE(MAX(menu_id), 0) + 1 FROM sys_menu),
|
||||
'机构管理', parent_menu.menu_id, 3, 'institution', 'jobfair/institution/index', NULL, '',
|
||||
1, 0, 'C', '0', '0', 'cms:jobFairInstitution:list', '#',
|
||||
'system', NOW(), '招聘会机构管理菜单'
|
||||
FROM parent_menu
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM sys_menu existing
|
||||
WHERE existing.parent_id = parent_menu.menu_id
|
||||
AND existing.menu_name = '机构管理'
|
||||
)
|
||||
RETURNING menu_id
|
||||
), institution_page AS (
|
||||
SELECT menu_id FROM inserted_page
|
||||
UNION
|
||||
SELECT menu_id
|
||||
FROM sys_menu
|
||||
WHERE menu_name = '机构管理'
|
||||
AND parent_id = (SELECT menu_id FROM parent_menu)
|
||||
), button_seed(menu_name, order_num, perms) AS (
|
||||
VALUES
|
||||
('机构查询', 1, 'cms:jobFairInstitution:query'),
|
||||
('机构新增', 2, 'cms:jobFairInstitution:add'),
|
||||
('机构修改', 3, 'cms:jobFairInstitution:edit'),
|
||||
('机构删除', 4, 'cms:jobFairInstitution:remove')
|
||||
), max_menu AS (
|
||||
SELECT COALESCE(MAX(menu_id), 0) AS menu_id FROM sys_menu
|
||||
)
|
||||
INSERT INTO sys_menu (
|
||||
menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon,
|
||||
create_by, create_time, remark
|
||||
)
|
||||
SELECT
|
||||
max_menu.menu_id + 1 + ROW_NUMBER() OVER (ORDER BY button_seed.order_num),
|
||||
button_seed.menu_name, institution_page.menu_id, button_seed.order_num, '', NULL, NULL, '',
|
||||
1, 0, 'F', '0', '0', button_seed.perms, '#',
|
||||
'system', NOW(), '招聘会机构管理按钮权限'
|
||||
FROM institution_page
|
||||
CROSS JOIN button_seed
|
||||
CROSS JOIN max_menu
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM sys_menu existing WHERE existing.perms = button_seed.perms
|
||||
);
|
||||
|
||||
WITH institution_menus AS (
|
||||
SELECT menu_id
|
||||
FROM sys_menu
|
||||
WHERE perms IN (
|
||||
'cms:jobFairInstitution:list',
|
||||
'cms:jobFairInstitution:query',
|
||||
'cms:jobFairInstitution:add',
|
||||
'cms:jobFairInstitution:edit',
|
||||
'cms:jobFairInstitution:remove'
|
||||
)
|
||||
UNION
|
||||
SELECT menu_id
|
||||
FROM sys_menu
|
||||
WHERE menu_name = '机构管理'
|
||||
AND parent_id = (SELECT menu_id FROM sys_menu WHERE menu_name = '招聘会管理' AND parent_id = 0 ORDER BY menu_id LIMIT 1)
|
||||
), venue_roles AS (
|
||||
SELECT DISTINCT role_id
|
||||
FROM sys_role_menu
|
||||
WHERE menu_id IN (
|
||||
SELECT menu_id FROM sys_menu WHERE perms = 'cms:venueInfo:list'
|
||||
)
|
||||
), role_menu_rows AS (
|
||||
SELECT venue_roles.role_id, institution_menus.menu_id
|
||||
FROM venue_roles
|
||||
CROSS JOIN institution_menus
|
||||
)
|
||||
INSERT INTO sys_role_menu (role_id, menu_id)
|
||||
SELECT role_menu_rows.role_id, role_menu_rows.menu_id
|
||||
FROM role_menu_rows
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM sys_role_menu existing
|
||||
WHERE existing.role_id = role_menu_rows.role_id
|
||||
AND existing.menu_id = role_menu_rows.menu_id
|
||||
);
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user