活动场地预约-预约审核(包含手机端):修复多个场地管理员审核同时审核相同一页数据时(包含一键通过和一键驳回),后端异常报错的问题;

This commit is contained in:
2026-10-23 17:22:10 +08:00
parent 030bb7cb23
commit 7d5e948e4c
3 changed files with 51 additions and 8 deletions
@@ -19,6 +19,7 @@ import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.util.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
@@ -179,11 +180,21 @@ public class SiteReviewController {
siteReserveService.insert(audit);
int reviewCount = 0;
for (int i = 0; i < reviewList.size(); i++) {
ActivitySiteReserve fetch = reviewList.get(i);
Integer stateCode = fetch.getReserve_state();
Integer afterStateCode = afterStateList.get(i);
// 按原审核状态更新,避免多个管理员同时审核时重复处理同一申请
int updateCount = siteReserveService.update(Chain.make("reserve_state", afterStateCode),
Cnd.NEW().and("sqid", "=", fetch.getSqid()).and("reserve_state", "=", stateCode));
if (updateCount == 0) {
skippedCount++;
continue;
}
reviewCount++;
List<ActivitySiteReserve> reserves = siteReserveService.query(Cnd.NEW().and("sqid", "=", fetch.getSqid()));
String days = "";
for (ActivitySiteReserve siteReserve : reserves) {
@@ -244,8 +255,13 @@ public class SiteReviewController {
}
}
}
if (reviewCount == 0) {
siteReserveService.dao().delete(audit);
return Result.success("所选预约已被其他人审核,无需重复处理")
.addData(NutMap.NEW().setv("skippedCount", skippedCount));
}
if (skippedCount > 0) {
return Result.success("审核完成,成功处理" + reviewList.size() + "条,跳过" + skippedCount + "条状态已变化的预约")
return Result.success("审核完成,成功处理" + reviewCount + "条,跳过" + skippedCount + "条状态已变化的预约")
.addData(NutMap.NEW().setv("skippedCount", skippedCount));
}
return Result.success("审核成功");
@@ -8,6 +8,7 @@ import io.v.nutz.activity.services.ActivityCommonService;
import io.v.nutz.activity.services.SiteInfoService;
import io.v.nutz.activity.services.SiteReserveService;
import io.v.nutz.annontation.ViReturn;
import io.v.nutz.base.result.Result;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.SendMsg;
import io.v.nutz.base.utils.Vi;
@@ -20,6 +21,7 @@ import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.commons.lang3.StringUtils;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
@@ -39,6 +41,7 @@ import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @Author JyuHsin
@@ -223,15 +226,34 @@ public class SiteAuditMobileController {
@At("/audit")
@Ok("json:full")
@ViReturn
public Object audit(@Param("ids") String[] ids, Audit audit,
@Param("isPass") boolean isPass) {
dao.insert(audit);
for (String id : ids) {
public Object audit(@Param("ids") String[] ids, @Param("reserveState") Integer[] reserveState, Audit audit,
@Param("isPass") Boolean isPass) {
if (ids == null || reserveState == null || ids.length == 0 || ids.length != reserveState.length || isPass == null) {
return Result.error("审核参数错误,请刷新页面后重试");
}
ActivitySiteReserve fetch = siteReserveService.fetch(id);
dao.insert(audit);
int reviewCount = 0;
for (int i = 0; i < ids.length; i++) {
ActivitySiteReserve fetch = siteReserveService.fetch(ids[i]);
if (fetch == null || !Objects.equals(fetch.getReserve_state(), reserveState[i])) {
continue;
}
Integer stateCode = fetch.getReserve_state();
Integer afterStateCode = activityCommonService.findAfterStateCode(stateCode, isPass);
if (afterStateCode == null) {
continue;
}
// 按原审核状态更新,避免多个管理员同时审核时重复处理同一申请
int updateCount = dao.update(ActivitySiteReserve.class, Chain.make("reserve_state", afterStateCode),
Cnd.NEW().and("sqid", "=", fetch.getSqid()).and("reserve_state", "=", stateCode));
if (updateCount == 0) {
continue;
}
reviewCount++;
List<ActivitySiteReserve> reserves = siteReserveService.query(Cnd.NEW().and("sqid", "=", fetch.getSqid()));
String days = "";
@@ -292,7 +314,10 @@ public class SiteAuditMobileController {
}
}
}
return null;
if (reviewCount == 0) {
dao.delete(audit);
}
return Result.success("操作完成");
}
public List<NutMap> listMap(Sql sql) {
@@ -466,8 +466,10 @@ layout("/mobile/platform.html"){
if (this.type === 'all') {
idList = this.userList.map(o => o.id)
}
const reviewList = this.userList.filter(o => idList.includes(o.id))
const resp = await $.post('/mobile/activity/site/audit/audit', {
ids: JSON.stringify(idList),
ids: JSON.stringify(reviewList.map(o => o.id)),
reserveState: JSON.stringify(reviewList.map(o => o.reserve_state)),
auditOpinion: this.reason,
isPass: this.auditType === 'pass'
})