Merge remote-tracking branch 'origin/main'

This commit is contained in:
2026-07-04 01:22:46 +08:00
5 changed files with 255 additions and 97 deletions
@@ -34,6 +34,7 @@ import com.budwk.app.zhgh.dayofficework.thirtyTeachTour.service.ThirtyTeachTourL
import com.budwk.app.zhgh.dayofficework.thirtyTeachTour.service.ThirtyTeachTourMatterService;
import com.budwk.app.zhgh.dayofficework.thirtyTeachTour.service.ThirtyTeachTourUserAssignmentService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
@@ -445,12 +446,14 @@ public class ThirtyTeachTourMySignupController {
* @param ledger 报名台账主信息
* @param families 家属信息 JSON 数组
* @param directRelative 直系亲属线路报名信息 JSON
* @param boardingPlaceOnly H5 修改页只更新乘车地点时传 true,避免修改其他只读报名信息
* @return 修改结果;直系亲属线路、超额报销等场景会返回待审核提示
*/
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"thirtyTeachTour.mysignup", "h5.thirtyTeachTour.mysignup"}, mode = SaMode.OR)
public Result doSignup(ThirtyTeachTourLedger ledger, @Param("families") String families, @Param("directRelative") String directRelative) {
public Result doSignup(ThirtyTeachTourLedger ledger, @Param("families") String families, @Param("directRelative") String directRelative,
@Param("boardingPlaceOnly") Boolean boardingPlaceOnly) {
Result checkResult = checkSignup(ledger);
if (checkResult != null) {
return checkResult;
@@ -462,6 +465,9 @@ public class ThirtyTeachTourMySignupController {
if (oldLedger == null) {
return Result.error("报名记录不存在");
}
if (Boolean.TRUE.equals(boardingPlaceOnly)) {
return updateH5BoardingPlaceOnly(ledger, oldLedger);
}
List<ThirtyTeachTourLedgerFamily> familyList = parseFamilies(families);
Result familyResult = checkFamilies(familyList);
if (familyResult != null) {
@@ -541,6 +547,41 @@ public class ThirtyTeachTourMySignupController {
return Result.success().addMsg(approvalRequired ? "修改已提交,等待审核" : "修改成功");
}
/**
* H5 我的疗休养修改页仅允许调整乘车地点,其他报名、家属和直系亲属信息均以原台账为准。
* 保存时同步当前人员分配记录中的乘车地点,保证移动端列表、人员分配和台账展示一致。
*
* @param submitLedger 页面提交的台账信息,仅读取 id 和 boardingPlace
* @param oldLedger 当前登录人的原台账记录
* @return 乘车地点保存结果
*/
private Result updateH5BoardingPlaceOnly(ThirtyTeachTourLedger submitLedger, ThirtyTeachTourLedger oldLedger) {
if (oldLedger == null || StrUtil.isBlank(oldLedger.getMatterId())) {
return Result.error("报名记录缺少事项信息,不能修改");
}
ThirtyTeachTourMatter matter = tourMatterService.fetch(oldLedger.getMatterId());
if (matter == null || Boolean.TRUE.equals(matter.getDelFlag()) || !Boolean.TRUE.equals(matter.getEnabled())) {
return Result.error("报名出行时段不存在或已停用");
}
if (isTravelEnded(matter.getTravelEndTime())) {
return Result.error("线路出行已结束,不能修改");
}
ThirtyTeachTourSetting setting = tourLedgerService.dao().fetch(ThirtyTeachTourSetting.class, matter.getSettingId());
oldLedger.setBoardingPlace(submitLedger == null ? "" : submitLedger.getBoardingPlace());
Result boardingPlaceResult = normalizeBoardingPlace(oldLedger, matter, setting);
if (boardingPlaceResult != null) {
return boardingPlaceResult;
}
// H5 修改页除乘车地点外全部只读,数据库更新也只落乘车地点字段,避免前端绕过只读限制。
tourLedgerService.update(Chain.make("boardingPlace", oldLedger.getBoardingPlace()),
Cnd.where(ThirtyTeachTourLedger::getId, "=", oldLedger.getId())
.and(ThirtyTeachTourLedger::getJobNo, "=", currentJobNo())
.and(ThirtyTeachTourLedger::getDelFlag, "=", false));
tourUserAssignmentService.backfillExistingAssignmentAfterSignup(matter.getSettingId(), matter.getId(), SecurityUtil.getUserId(),
oldLedger.getBoardingPlace(), oldLedger.getPhotoFiles(), oldLedger.getCurrentPeriodPhotoFiles());
return Result.success().addMsg("修改成功");
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"thirtyTeachTour.mysignup", "h5.thirtyTeachTour.mysignup"}, mode = SaMode.OR)
@@ -698,11 +698,13 @@ public class ThirtyTeachTourUserAssignmentServiceImpl extends BaseServiceImpl<Th
sql.setParam("unionId", unionId);
List<NutMap> rows = listMap(sql);
NutMap quotaInfo = Lang.isEmpty(rows) ? emptyQuotaInfo() : rows.get(0);
int branchTotalQuota = branchPeriodQuotaTotal(settingId, unionId);
int formalQuota = defaultInt(quotaInfo.getInt("formalQuota"));
int backupQuota = defaultInt(quotaInfo.getInt("backupQuota"));
int formalUsed = defaultInt(quotaInfo.getInt("formalUsed"));
int backupUsed = defaultInt(quotaInfo.getInt("backupUsed"));
return NutMap.NEW()
.addv("branchTotalQuota", branchTotalQuota)
.addv("formalQuota", formalQuota)
.addv("backupQuota", backupQuota)
.addv("formalUsed", formalUsed)
@@ -2072,6 +2074,7 @@ public class ThirtyTeachTourUserAssignmentServiceImpl extends BaseServiceImpl<Th
private NutMap emptyQuotaInfo() {
return NutMap.NEW()
.addv("branchTotalQuota", 0)
.addv("formalQuota", 0)
.addv("backupQuota", 0)
.addv("formalUsed", 0)
@@ -2080,6 +2083,29 @@ public class ThirtyTeachTourUserAssignmentServiceImpl extends BaseServiceImpl<Th
.addv("backupRemaining", 0);
}
/**
* 统计当前配置下当前分工会所有出行时间段分配人员名额的汇总数量,用于人员分配弹窗展示分工会总名额。
*/
private int branchPeriodQuotaTotal(String settingId, String unionId) {
if (StrUtil.isBlank(settingId) || StrUtil.isBlank(unionId)) {
return 0;
}
Sql sql = Sqls.create("""
SELECT COALESCE(SUM(formalQuota), 0) AS branchTotalQuota
FROM thirty_teach_tour_setting_period_quota
WHERE settingId = @settingId
AND unionId = @unionId
AND delFlag = 0
""");
sql.setParam("settingId", settingId);
sql.setParam("unionId", unionId);
List<NutMap> rows = listMap(sql);
if (Lang.isEmpty(rows)) {
return 0;
}
return defaultInt(rows.get(0).getInt("branchTotalQuota"));
}
private NutMap emptyPeriodQuotaInfo(String periodId) {
return NutMap.NEW()
.addv("periodId", periodId)