This commit is contained in:
@jyuhsin
2025-06-13 17:23:39 +08:00
parent d3364e96f5
commit d1267e1a87
5 changed files with 273 additions and 78 deletions
@@ -21,6 +21,7 @@ import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.utils.ViTool;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.therapyRecuperation.constant.TheRapyRecuperationState;
import io.v.nutz.zhgh.therapyRecuperation.mode.TheRapyRecuperationEnrollExcelMode;
@@ -337,10 +338,6 @@ public class TheRapyRecuperationUserQueryController {
@Param(value = "satisfyPeople", required = false) Boolean satisfyPeople,
HttpServletResponse response) throws IOException {
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("疗休养报名人员名单.zip", StandardCharsets.UTF_8));
Cnd commonCnd = Cnd.NEW();
if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) {
commonCnd.and(Cnd.likeEX(searchName, searchKeyword));
@@ -359,8 +356,10 @@ public class TheRapyRecuperationUserQueryController {
line.lineName,
enroll.*,
date_format( enroll.signingUptime, '%Y-%m-%d %H:%i:%s' ) signingUptimeFormat,
date_format( lineu.playStartTime, '%Y-%m-%d' ) playStartTime,
date_format( lineu.playStartTime, '%m-%d' ) playStartTime,
date_format( lineu.playEndTime, '%m-%d' ) playEndTime,
lineu.lineId,
TIMESTAMPDIFF(YEAR, u.birthday, CURDATE()) as age,
( SELECT COUNT( 1 ) FROM the_rapy_recuperation_enroll_companion WHERE trreId = enroll.id) familyCount,
(
SELECT
@@ -399,7 +398,39 @@ public class TheRapyRecuperationUserQueryController {
lineSql.setCondition(lineCnd);
List<NutMap> lineEnroll = baseService.listMap(lineSql);
if (satisfyPeople) {
List<NutMap> lineResult = new ArrayList<>();
//查家属
List<String> list = lineEnroll.stream().map(o -> o.getString("id")).toList();
List<TheRapyRecuperationEnrollCompanion> companions = baseService.dao().query(TheRapyRecuperationEnrollCompanion.class, Cnd.where("trreId", "in", list));
int index = 0;
for (int i = 0; i < lineEnroll.size(); i++) {
NutMap nutMap = lineEnroll.get(i);
if(i == 0) {
index = 1;
}
nutMap.put("index", index);
nutMap.put("playTime", nutMap.getString("playStartTime") + "" + nutMap.getString("playEndTime"));
lineResult.add(nutMap);
//找这个人的家属
List<TheRapyRecuperationEnrollCompanion> companionList = companions.stream().filter(o -> o.getTrreId().equals(nutMap.getString("id"))).toList();
if(Lang.isNotEmpty(companionList)) {
for (int c = 1; c <= companionList.size(); c++) {
NutMap map = Lang.obj2nutmap(companionList.get(c - 1));
map.put("index", c + index);
map.put("unionName", "家属");
map.put("familyUserName", map.getString("userName"));
map.put("lineName", nutMap.getString("lineName"));
map.put("playTime", nutMap.getString("playTime"));
map.put("userName", "");
lineResult.add(map);
}
index += companionList.size() + 1;
} else {
index ++;
}
}
/*if (satisfyPeople) {
//按照选择线路id分组,便于判断是否成团
Map<String, List<NutMap>> enrollGroup = lineEnroll.stream().collect(Collectors.groupingBy(o -> o.getString("takePartInLineId")));
@@ -416,7 +447,7 @@ public class TheRapyRecuperationUserQueryController {
Map<String, List<NutMap>> lineGroupMap = lineEnroll.stream().collect(Collectors.groupingBy(o -> o.getString("lineId")));
//查询所有的线路
List<TheRapyRecuperationLine> lineList = baseService.dao().query(TheRapyRecuperationLine.class, Cnd.NEW());
Map<String, String> lineMap = lineList.stream().collect(Collectors.toMap(TheRapyRecuperationLine::getId, TheRapyRecuperationLine::getLineName));
Map<String, String> lineMap = lineList.stream().collect(Collectors.toMap(TheRapyRecuperationLine::getId, TheRapyRecuperationLine::getLineName));*/
//定点的查询
Sql travelSql = Sqls.create("""
@@ -459,14 +490,21 @@ public class TheRapyRecuperationUserQueryController {
commonEntities.add(entity);
//线路表头
ArrayList<ExcelExportEntity> lineEntities = new ArrayList<>(commonEntities);
lineEntities.add(new ExcelExportEntity("出行时间", "playStartTime", 20));
ArrayList<ExcelExportEntity> lineEntities = new ArrayList<>();
lineEntities.add(new ExcelExportEntity("序号", "index", 10));
lineEntities.add(new ExcelExportEntity("二级分工会", "unionName", 30));
lineEntities.add(new ExcelExportEntity("姓名", "userName", 10));
lineEntities.add(new ExcelExportEntity("家属姓名", "familyUserName", 10));
lineEntities.add(new ExcelExportEntity("手机号", "mobile", 15));
lineEntities.add(new ExcelExportEntity("性别", "sex", 10));
lineEntities.add(new ExcelExportEntity("身份证号码", "idCard", 30));
lineEntities.add(new ExcelExportEntity("年龄", "age", 10));
lineEntities.add(new ExcelExportEntity("身高(cm)", "height", 10));
lineEntities.add(new ExcelExportEntity("线路名称", "lineName", 20));
lineEntities.add(new ExcelExportEntity("旅行社", "travelAgencyName", 20));
lineEntities.add(new ExcelExportEntity("随行人", "familyCount", 20));
ExcelExportEntity lineEntity = new ExcelExportEntity("随行人信息", "companionInfo", 50);
lineEntity.setWrap(true);
lineEntities.add(lineEntity);
lineEntities.add(new ExcelExportEntity("行程", "playTime", 20));
lineEntities.add(new ExcelExportEntity("房间需求", "roomCount", 20));
lineEntities.add(new ExcelExportEntity("用房备注", "roomRemarkName", 30));
lineEntities.add(new ExcelExportEntity("其他", "other", 20));
//自由组团表头
ArrayList<ExcelExportEntity> travelEntities = new ArrayList<>(commonEntities);
@@ -478,23 +516,16 @@ public class TheRapyRecuperationUserQueryController {
try {
if(Arrays.asList(types).contains("line")) {
for (String key : lineGroupMap.keySet()) {
List<NutMap> enrollList = lineGroupMap.get(key);
enrollList.forEach(item -> {
// String remark = TherapyRecuperationCommon.getRemarkBySchoolTime(item.getString("schoolTime"));
// item.put("remark", remark);
});
String fileName = "线路报名人员/" + lineMap.get(key) + ".xlsx";
zipOutputStream.putNextEntry(new ZipEntry(fileName));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, lineEntities, enrollList);
workbook.write(zipOutputStream);
zipOutputStream.closeEntry();
response.flushBuffer();
}
ViTool.excelResponse(response, "线路报名人员.xls");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.HSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, lineEntities, lineResult);
workbook.write(response.getOutputStream());
}
if(Arrays.asList(types).contains("base")) {
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("疗休养报名人员名单.zip", StandardCharsets.UTF_8));
for (String key : travelGroupMap.keySet()) {
List<NutMap> enrollList = travelGroupMap.get(key);
enrollList.forEach(item -> {
@@ -212,5 +212,30 @@ public class TheRapyRecuperationEnroll extends BaseModel {
@Comment("出行时间")
private String specificTime;
@Column
@ColDefine(type = ColType.DOUBLE)
@Comment("房间数量")
private Double roomCount;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("房间数量显示")
private String roomCountName;
@Column
@ColDefine(type = ColType.INT)
@Comment("用房备注")
private Integer roomRemark;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用房备注")
private String roomRemarkName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("拼房人")
private String roommate;
private String firstLetter;
}
@@ -70,6 +70,11 @@ public class TheRapyRecuperationEnrollCompanion extends BaseModel {
@Comment("床位信息id")
private String bedInfoId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("身高")
private String height;
/**
* 床位信息
*/
@@ -841,6 +841,14 @@ public class TheRapyRecuperationEnrollServiceImpl extends ViServiceImpl<TheRapyR
return Map.of(false, "报名时间已过,抱歉不能报名");
}
//报的线路,不管新增还是编辑都要判断
if(StrUtil.isNotBlank(enrollInfo.getTakePartInLineId())) {
Map<Boolean, String> roomValid = validRoom(enrollInfo);
if(roomValid != null && roomValid.containsKey(false)) {
return roomValid;
}
}
TheRapyRecuperationType trrt = regionTypeLineMap.get(lineInfo.getRegionalNature());
if (StrUtil.isBlank(enrollInfo.getId()) && StrUtil.isNotBlank(enrollInfo.getTakePartInLineId())) {
@@ -1051,7 +1059,7 @@ public class TheRapyRecuperationEnrollServiceImpl extends ViServiceImpl<TheRapyR
// 去判断当前报名的记录,名额有没有超出限制,包含家属
List<TheRapyRecuperationEnrollCompanion> companionList = enrollInfo.getCompanionList();
int applyNum = 1;
int applyNum = StrUtil.isNotBlank(enrollInfo.getId()) ? 0 : 1;
if (Lang.isNotEmpty(companionList)) {
applyNum = applyNum + companionList.size();
}
@@ -1061,7 +1069,7 @@ public class TheRapyRecuperationEnrollServiceImpl extends ViServiceImpl<TheRapyR
if (canApplyNum == 0) {
return Map.of(false, "此线路报名人数已满,请选择其他线路报名");
} else {
return Map.of(false, "此线路剩余可报名人数为:【" + canApplyNum + "人】,您当前报名人数为:【" + applyNum + "人】,请减少随行人或选择其他线路报名");
return Map.of(false, "此线路剩余可报名人数为:【" + canApplyNum + "人】,您当前报名人数为:【" + (StrUtil.isNotBlank(enrollInfo.getId()) ? applyNum + 1 : applyNum) + "人】,请减少随行人或选择其他线路报名");
}
}
@@ -1217,6 +1225,11 @@ public class TheRapyRecuperationEnrollServiceImpl extends ViServiceImpl<TheRapyR
return Map.of(true, "验证成功");
}
public Map<Boolean, String> validRoom(TheRapyRecuperationEnroll enrollInfo) {
return null;
}
public Map<Boolean, String> validSignCount(TheRapyRecuperationEnroll enrollInfo, TheRapyRecuperationConfig config, int estimatedFamilyNumbers, String type) {
int hasSignNumber = 0;//已经报名的人数
int currentSignNumber = 1;//当前报名人数,1表示自己,下面的if是加家属人数