初始化数据分组规则、分组删除关联数据

This commit is contained in:
Qi 2025-06-17 09:46:13 +08:00
parent 47216f68fa
commit 4985133ea4
9 changed files with 246 additions and 42 deletions

View File

@ -1,8 +1,11 @@
package org.jeecg.modules.controller;
import java.util.Arrays;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
@ -13,7 +16,9 @@ import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.modules.entity.CetGroup;
import org.jeecg.modules.entity.CetInvigilateData;
import org.jeecg.modules.service.ICetGroupService;
import org.jeecg.modules.service.ICetInvigilateDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@ -35,6 +40,8 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
public class CetGroupController extends JeecgController<CetGroup, ICetGroupService> {
@Autowired
private ICetGroupService cetGroupService;
@Autowired
private ICetInvigilateDataService cetInvigilateDataService;
/**
* 分页列表查询
@ -49,16 +56,45 @@ public class CetGroupController extends JeecgController<CetGroup, ICetGroupServi
@ApiOperation(value="分组数据表-分页列表查询", notes="分组数据表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<CetGroup>> queryPageList(CetGroup cetGroup,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<CetGroup> queryWrapper = QueryGenerator.initQueryWrapper(cetGroup, req.getParameterMap());
Page<CetGroup> page = new Page<CetGroup>(pageNo, pageSize);
Page<CetGroup> page = new Page<>(pageNo, pageSize);
IPage<CetGroup> pageList = cetGroupService.page(page, queryWrapper);
// 取分页内所有分组id类型保持一致假设是Long
Set<String> groupIds = pageList.getRecords().stream()
.map(CetGroup::getId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if(!groupIds.isEmpty()){
// 批量查询所有这些分组下的用户
List<CetInvigilateData> userList = cetInvigilateDataService.list(
new QueryWrapper<CetInvigilateData>().in("group_id", groupIds)
);
// 按groupId分组用户名称列表groupId类型保持一致
Map<String, List<String>> groupIdToUserNames = userList.stream()
.collect(Collectors.groupingBy(CetInvigilateData::getGroupId,
Collectors.mapping(CetInvigilateData::getName, Collectors.toList())));
// 设置每个分组的userNames字段
pageList.getRecords().forEach(group -> {
String groupIdStr = String.valueOf(group.getId());
List<String> names = groupIdToUserNames.get(groupIdStr);
// 拼接为字符串例如用逗号分隔
String userNamesStr = (names != null && !names.isEmpty()) ? String.join(", ", names) : "";
group.setRowUser(userNamesStr);
});
}
return Result.OK(pageList);
}
/**
/**
* 添加
*
* @param cetGroup
@ -98,12 +134,20 @@ public class CetGroupController extends JeecgController<CetGroup, ICetGroupServi
@ApiOperation(value="分组数据表-通过id删除", notes="分组数据表-通过id删除")
@RequiresPermissions("cet:cet_group:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
public Result<String> delete(@RequestParam(name="id", required=true) String id) {
// 删除分组表中的分组
cetGroupService.removeById(id);
// 将数据总表对应groupId置空
UpdateWrapper<CetInvigilateData> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("group_id", id).set("group_id", null);
cetInvigilateDataService.update(updateWrapper);
return Result.OK("删除成功!");
}
/**
/**
* 批量删除
*
* @param ids
@ -113,12 +157,21 @@ public class CetGroupController extends JeecgController<CetGroup, ICetGroupServi
@ApiOperation(value="分组数据表-批量删除", notes="分组数据表-批量删除")
@RequiresPermissions("cet:cet_group:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.cetGroupService.removeByIds(Arrays.asList(ids.split(",")));
public Result<String> deleteBatch(@RequestParam(name="ids", required=true) String ids) {
List<String> idList = Arrays.asList(ids.split(","));
// 删除分组表中的分组
cetGroupService.removeByIds(idList);
// 将数据总表对应groupId置空
UpdateWrapper<CetInvigilateData> updateWrapper = new UpdateWrapper<>();
updateWrapper.in("group_id", idList).set("group_id", null);
cetInvigilateDataService.update(updateWrapper);
return Result.OK("批量删除成功!");
}
/**
/**
* 通过id查询
*
* @param id

View File

@ -1,8 +1,7 @@
package org.jeecg.modules.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -11,17 +10,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.entity.CetGraduates;
import org.jeecg.modules.entity.CetTeachers;
import org.jeecg.modules.entity.CetNoTeachers;
import org.jeecg.modules.entity.*;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.modules.entity.CetInvigilateData;
import org.jeecg.modules.service.ICetGraduatesService;
import org.jeecg.modules.service.ICetInvigilateDataService;
import org.jeecg.modules.service.ICetNoTeachersService;
import org.jeecg.modules.service.ICetTeachersService;
import org.jeecg.modules.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@ -49,6 +42,24 @@ public class CetInvigilateDataController extends JeecgController<CetInvigilateDa
private ICetGraduatesService cetGraduatesService;
@Autowired
private ICetNoTeachersService cetNoTeachersService;
@Autowired
private ICetGroupService cetGroupService;
/**
* 批量分组
*
* @param
* @return
*/
@AutoLog(value = "分组")
@ApiOperation(value="分组", notes="分组")
@PostMapping(value = "/batchHandleGroup")
public Result<String> batchHandleGroup(@RequestBody Map<String, Object> webData) {
return cetInvigilateDataService.batchHandleGroup(webData);
}
/**
* 分页列表查询
@ -69,6 +80,28 @@ public class CetInvigilateDataController extends JeecgController<CetInvigilateDa
QueryWrapper<CetInvigilateData> queryWrapper = QueryGenerator.initQueryWrapper(cetInvigilateData, req.getParameterMap());
Page<CetInvigilateData> page = new Page<CetInvigilateData>(pageNo, pageSize);
IPage<CetInvigilateData> pageList = cetInvigilateDataService.page(page, queryWrapper);
// 取所有分组ID假设 groupId String 类型如果是 Long 请对应修改
Set<String> groupIds = pageList.getRecords().stream()
.map(CetInvigilateData::getGroupId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (!groupIds.isEmpty()) {
// 批量查询分组信息
List<CetGroup> groupList = cetGroupService.list(
new QueryWrapper<CetGroup>().in("id", groupIds)
);
// 转成 Map<groupId, groupName>
Map<String, String> groupIdToName = groupList.stream()
.collect(Collectors.toMap(CetGroup::getId, CetGroup::getGroupName));
// 给每条数据设置 groupName 字段需保证 CetInvigilateData 有对应字段及setter
pageList.getRecords().forEach(item -> {
String name = groupIdToName.get(item.getGroupId());
item.setGroupName(name != null ? name : "");
});
}
return Result.OK(pageList);
}

View File

@ -84,4 +84,8 @@ public class CetGraduates implements Serializable {
/**类型*/
@TableField(exist = false)
private String type;
/**类型*/
@Excel(name = "分组", width = 15)
@ApiModelProperty(value = "分组")
private String groupId;
}

View File

@ -3,6 +3,7 @@ package org.jeecg.modules.entity;
import java.io.Serializable;
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 lombok.Data;
@ -31,18 +32,22 @@ public class CetGroup implements Serializable {
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private java.lang.String id;
/**分组名称*/
@Excel(name = "分组名称", width = 15)
private String id;
@Excel(name = "分组名称", width = 15)
@ApiModelProperty(value = "分组名称")
private java.lang.String groupName;
private String groupName;
/**分组名称*/
@Excel(name = "分组名称", width = 15)
@ApiModelProperty(value = "分组名称")
@TableField(exist = false)
private String rowUser;
/**教室ID*/
@Excel(name = "教室ID", width = 15)
@ApiModelProperty(value = "教室ID")
private java.lang.String roomId;
private String roomId;
/**创建人*/
@ApiModelProperty(value = "创建人")
private java.lang.String createBy;
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ -50,7 +55,7 @@ public class CetGroup implements Serializable {
private java.util.Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private java.lang.String updateBy;
private String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ -58,5 +63,5 @@ public class CetGroup implements Serializable {
private java.util.Date updateTime;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private java.lang.String sysOrgCode;
private String sysOrgCode;
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
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 lombok.Data;
@ -84,4 +85,13 @@ public class CetInvigilateData implements Serializable {
@Excel(name = "类型", width = 15)
@ApiModelProperty(value = "类型")
private String type;
/**类型*/
// @Excel(name = "分组", width = 15)
@ApiModelProperty(value = "分组")
private String groupId;
/**类型*/
@Excel(name = "分组", width = 15)
@ApiModelProperty(value = "分组")
@TableField(exist = false)
private String groupName;
}

View File

@ -76,4 +76,8 @@ public class CetNoTeachers implements Serializable {
/**类型*/
@TableField(exist = false)
private String type;
/**类型*/
@Excel(name = "分组", width = 15)
@ApiModelProperty(value = "分组")
private String groupId;
}

View File

@ -84,5 +84,9 @@ public class CetTeachers implements Serializable {
/**类型*/
@TableField(exist = false)
private String type;
/**类型*/
@Excel(name = "分组", width = 15)
@ApiModelProperty(value = "分组")
private String groupId;
}

View File

@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.entity.CetInvigilateData;
import java.util.Map;
/**
* @Description: 数据总表
* @Author: jeecg-boot
@ -15,4 +17,5 @@ public interface ICetInvigilateDataService extends IService<CetInvigilateData> {
Result<String> add(CetInvigilateData cetInvigilateData);
Result<String> batchHandleGroup(Map<String, Object> webData);
}

View File

@ -5,24 +5,20 @@ import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import lombok.RequiredArgsConstructor;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.entity.CetGraduates;
import org.jeecg.modules.entity.CetInvigilateData;
import org.jeecg.modules.entity.CetNoTeachers;
import org.jeecg.modules.entity.CetTeachers;
import org.jeecg.modules.entity.*;
import org.jeecg.modules.mapper.CetGraduatesMapper;
import org.jeecg.modules.mapper.CetInvigilateDataMapper;
import org.jeecg.modules.mapper.CetNoTeachersMapper;
import org.jeecg.modules.mapper.CetTeachersMapper;
import org.jeecg.modules.service.ICetGraduatesService;
import org.jeecg.modules.service.ICetInvigilateDataService;
import org.jeecg.modules.service.ICetNoTeachersService;
import org.jeecg.modules.service.ICetTeachersService;
import org.jeecg.modules.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
/**
* @Description: 数据总表
* @Author: jeecg-boot
@ -40,6 +36,12 @@ public class CetInvigilateDataServiceImpl extends ServiceImpl<CetInvigilateDataM
private CetGraduatesMapper cetGraduatesMapper;
@Autowired
private CetNoTeachersMapper cetNoTeachersMapper;
@Autowired
private CetInvigilateDataMapper cetInvigilateDataMapper;
@Autowired
private ICetGroupService cetGroupService;
@Override
@ -93,4 +95,90 @@ public class CetInvigilateDataServiceImpl extends ServiceImpl<CetInvigilateDataM
}
}
@Override
public Result<String> batchHandleGroup(Map<String, Object> webData) {
List<String> ids = (List<String>) webData.get("ids");
if (ids == null || ids.isEmpty()) {
return Result.error("ID列表为空");
}
List<CetInvigilateData> users = cetInvigilateDataMapper.selectBatchIds(ids);
List<CetInvigilateData> maleTeachers = new ArrayList<>();
List<CetInvigilateData> femaleTeachers = new ArrayList<>();
List<CetInvigilateData> maleOthers = new ArrayList<>();
List<CetInvigilateData> femaleOthers = new ArrayList<>();
List<CetInvigilateData> maleGraduates = new ArrayList<>();
List<CetInvigilateData> femaleGraduates = new ArrayList<>();
for (CetInvigilateData user : users) {
String type = user.getType();
String sex = user.getSex();
boolean isMale = "".equals(sex);
switch (type) {
case "教师":
if (isMale) maleTeachers.add(user);
else femaleTeachers.add(user);
break;
case "研究生":
if (isMale) maleGraduates.add(user);
else femaleGraduates.add(user);
break;
default:
if (isMale) maleOthers.add(user);
else femaleOthers.add(user);
break;
}
}
List<List<CetInvigilateData>> groups = new ArrayList<>();
// 分组逻辑
while (!maleTeachers.isEmpty() && !femaleOthers.isEmpty()) {
groups.add(Arrays.asList(maleTeachers.remove(0), femaleOthers.remove(0)));
}
while (!femaleTeachers.isEmpty() && !maleOthers.isEmpty()) {
groups.add(Arrays.asList(femaleTeachers.remove(0), maleOthers.remove(0)));
}
while (!maleTeachers.isEmpty() && !femaleTeachers.isEmpty()) {
groups.add(Arrays.asList(maleTeachers.remove(0), femaleTeachers.remove(0)));
}
while (!maleTeachers.isEmpty() && !femaleGraduates.isEmpty()) {
groups.add(Arrays.asList(maleTeachers.remove(0), femaleGraduates.remove(0)));
}
while (!femaleTeachers.isEmpty() && !maleGraduates.isEmpty()) {
groups.add(Arrays.asList(femaleTeachers.remove(0), maleGraduates.remove(0)));
}
int index = 1;
for (List<CetInvigilateData> group : groups) {
// 创建组
String groupName = "" + index + "";
CetGroup cetGroup = new CetGroup()
.setGroupName(groupName)
.setRoomId("") // 可选
.setCreateBy("system") // 建议改为当前用户
.setCreateTime(new Date())
.setSysOrgCode("default");
cetGroupService.save(cetGroup); // 保存组自动生成 ID
String groupId = cetGroup.getId();
// 设置组ID并更新每位成员
for (CetInvigilateData member : group) {
member.setGroupId(groupId); // 确保 entity 中有 groupId 字段
cetInvigilateDataMapper.updateById(member);
}
index++;
}
int successCount = groups.size();
int total = ids.size() / 2;
return Result.ok("共成功组队:" + successCount + " 组,失败:" + (total - successCount) + "");
}
}