diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java index fa05d53..36ce5a6 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java @@ -97,8 +97,8 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl Map doctoralData = pullPostDoctoral(); Date nowDate = new Date(); - String appId = "1926887238437818370"; - String secret = "32df31fcf4fc43f9a647ee1f47134f36"; + String appId = "XXXXXXXXXXXXXXXXXXXXX"; + String secret = "XXXXXXXXXXXXXXXXXXXX"; List rawDataList = new ArrayList<>(); int skip = 0; @@ -280,8 +280,8 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl @Override public Map pullPostDoctoral() { - String appId = "1926887238437818370"; - String secret = "32df31fcf4fc43f9a647ee1f47134f36"; + String appId = "XXXXXXXXXXXXXXXXXXXXXX"; + String secret = "XXXXXXXXXXXXXXXXXXXXXX"; List allUsers = new ArrayList<>(); int skip = 0; diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureUserStatisticsController.java b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureUserStatisticsController.java index 92b0b00..3bffb9b 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureUserStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/controller/ActivityCultureUserStatisticsController.java @@ -112,11 +112,7 @@ public class ActivityCultureUserStatisticsController { if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) { cnd.where().andLike(page.getSearchName(), page.getSearchKeyword()); } - if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) { - cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC"); - } else { - cnd.desc("atp.applyDateTime"); - } + activityCultureApplyUserService.applyUserStatisticsSort(cnd, page); sql.setCondition(cnd); Pagination pagination = activityCultureApplyUserService.listPageMap(page.getPageNumber(), page.getPageSize(), sql); List list = pagination.getList(); diff --git a/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureApplyUserService.java b/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureApplyUserService.java index 822834f..9137ad0 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureApplyUserService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/culture/service/ActivityCultureApplyUserService.java @@ -6,6 +6,7 @@ import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson; +import org.nutz.dao.Cnd; import org.nutz.lang.util.NutMap; import java.util.List; @@ -19,6 +20,14 @@ public interface ActivityCultureApplyUserService extends BaseService personIds, JSONObject dynamicFormParam) { ActivityTissue tissue = dao().fetch(ActivityTissue.class, activityId); diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpUserServiceImpl.java index bf51688..a9d880b 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpUserServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/service/impl/TrainSignUpUserServiceImpl.java @@ -12,6 +12,7 @@ import org.nutz.dao.sql.Criteria; import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; +import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; import java.util.List; @@ -51,9 +52,12 @@ public class TrainSignUpUserServiceImpl extends BaseServiceImpl { */ NutMap pageData(String projectId, String unionId, Boolean isSelectByAdmin); + /** + * 移动端工会统计;方式筛选只影响已选人数和各福利选项人数。 + * @param projectId 必填福利项目 ID + * @param unionId 工会 ID,空值表示全部工会 + * @param isSelectByAdmin null 表示全部方式,true 表示管理员代选,false 表示个人选择 + * @return tableList 为工会统计行(teacherSum 总人数、selectedNum 已选、unSelectedNum 真正未选); + * tableColumn 为列描述(label 名称、prop 字段),其中包含动态福利选项人数列 + */ + NutMap mobilePageData(String projectId, String unionId, Boolean isSelectByAdmin); + /** * 查询某分工会已选择人员 * @param pageForm diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java index f3cae88..56c173d 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java @@ -415,6 +415,8 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); cnd.andEX("t1.userState", "in", pageForm.getUserStates()); if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + // 默认先按工号正序分页,工号相同时沿用工会和单位顺序。 + cnd.asc("t2.loginname"); cnd.asc("t1.welfareUnionName"); cnd.asc("t1.welfareUnitName"); } else { @@ -644,32 +646,52 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme LEFT JOIN sys_user t2 ON t2.id = t1.userId $condition """); - Cnd cnd = Cnd.NEW(); - cnd.and("t1.projectId", "=", pageForm.getProjectId()); - cnd.and("t2.idCard", "in", Sqls.create("select idCard from sys_user where idCard is not null and idCard != '' group by idCard having count(1) > 1")); + // 只统计当前福利项目名单中的身份证号;同号名单记录至少两条才属于重复组。 + Sql repeatIdCardSql = Sqls.create(""" + select u.idCard from welfare_list w + inner join sys_user u on u.id = w.userId + where w.projectId = @projectId and u.idCard is not null and u.idCard != '' + group by u.idCard having count(1) > 1 + """).setParam("projectId", pageForm.getProjectId()); + + // 页面筛选只决定导出哪些重复组,匹配到的身份证号用于补齐同组全部记录。 + Sql matchedIdCardSql = Sqls.create(""" + select distinct t2.idCard from welfare_list t1 + inner join sys_user t2 on t2.id = t1.userId + $condition + """); + Cnd matchedCnd = Cnd.NEW(); + matchedCnd.and("t1.projectId", "=", pageForm.getProjectId()); + matchedCnd.and("t2.idCard", "in", repeatIdCardSql); if (StrUtil.isNotBlank(pageForm.getUserName())) { - cnd.where().andLike("t2.username", pageForm.getUserName()); + matchedCnd.where().andLike("t2.username", pageForm.getUserName()); } if (StrUtil.isNotBlank(pageForm.getLoginName())) { - cnd.where().andLike("t2.loginname", pageForm.getLoginName()); + matchedCnd.where().andLike("t2.loginname", pageForm.getLoginName()); } - cnd.andEX("t2.sex", "=", pageForm.getSex()); - cnd.andEX("t2.birthday", "=", pageForm.getBirthday()); + matchedCnd.andEX("t2.sex", "=", pageForm.getSex()); + matchedCnd.andEX("t2.birthday", "=", pageForm.getBirthday()); if (pageForm.getBirthMonths() != null && pageForm.getBirthMonths().length > 0) { - cnd.andEX("MONTH(t2.birthday)", "in", pageForm.getBirthMonths()); + matchedCnd.andEX("MONTH(t2.birthday)", "in", pageForm.getBirthMonths()); + } + matchedCnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); + matchedCnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); + matchedCnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); + matchedCnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); + matchedCnd.andEX("t1.userState", "in", pageForm.getUserStates()); + matchedIdCardSql.setCondition(matchedCnd); + List matchedIdCards = listMap(matchedIdCardSql); + List list = new ArrayList<>(); + if (!matchedIdCards.isEmpty()) { + Cnd cnd = Cnd.NEW(); + cnd.and("t1.projectId", "=", pageForm.getProjectId()); + cnd.and("t2.idCard", "in", matchedIdCards.stream().map(item -> item.getString("idCard")).toArray(String[]::new)); + cnd.asc("t2.idCard"); + cnd.asc("t2.loginname"); + cnd.asc("t1.id"); + sql.setCondition(cnd); + list = listMap(sql); } - cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); - cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); - cnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); - cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); - cnd.andEX("t1.userState", "in", pageForm.getUserStates()); - - cnd.asc("t2.idCard"); - cnd.asc("t1.welfareUnionName"); - cnd.asc("t1.welfareUnitName"); - - sql.setCondition(cnd); - List list = listMap(sql); try { List exportEntities = new ArrayList<>(); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java index adbc3ed..2832367 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java @@ -102,6 +102,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl unSelectedByUnion = new HashMap<>(); + for (NutMap row : allMethods.getList("tableList", NutMap.class)) { + unSelectedByUnion.put(row.getString("id"), row.getLong("unSelectedNum")); + } + for (NutMap row : result.getList("tableList", NutMap.class)) { + row.put("unSelectedNum", unSelectedByUnion.getOrDefault(row.getString("id"), 0L)); + } + } + return result; + } + @Override public Pagination selectedUnionUserPageData(PageForm pageForm, String projectId, String unionId, Boolean isSelectByAdmin) { Sql sql = Sqls.create(""" diff --git a/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js b/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js index 7acfab7..e610490 100644 --- a/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js +++ b/src/main/resources/static/assets/platform/js/util/h5PopupHistory.js @@ -14,7 +14,8 @@ const h5PopupHistory = (() => { popup.closeFromHistory() } - window.addEventListener("popstate", handlePopState) + // 捕获阶段优先消费弹框返回事件,避免 PJAX 重载页面并重置筛选条件。 + window.addEventListener("popstate", handlePopState, true) return { /** @@ -37,11 +38,13 @@ const h5PopupHistory = (() => { /** * 通过取消、关闭按钮关闭指定弹框时,同步回退对应历史记录。 * @param id 弹框唯一标识,必须是当前最上层弹框 - * @return boolean;true 表示已发起历史回退,false 表示弹框不在栈顶 + * @return boolean;true 表示已发起历史回退,false 表示弹框不在栈顶或正在关闭 */ close(id) { const top = popupStack[popupStack.length - 1] - if (!top || top.id !== id) return false + if (!top || top.id !== id || top.closing) return false + // history.back 异步触发 popstate;等待期间重复点击或关闭回调不能再回退一层。 + top.closing = true window.history.back() return true }, diff --git a/src/main/resources/views/layouts/platform.html b/src/main/resources/views/layouts/platform.html index 3a0f334..761527b 100644 --- a/src/main/resources/views/layouts/platform.html +++ b/src/main/resources/views/layouts/platform.html @@ -65,8 +65,8 @@ - + diff --git a/src/main/resources/views/layouts/platform_h5.html b/src/main/resources/views/layouts/platform_h5.html index 46a6243..204f0c5 100644 --- a/src/main/resources/views/layouts/platform_h5.html +++ b/src/main/resources/views/layouts/platform_h5.html @@ -27,6 +27,8 @@ + + @@ -57,7 +59,6 @@ - diff --git a/src/main/resources/views/platform/zhgh/activity/culture/common/userStatistics.js b/src/main/resources/views/platform/zhgh/activity/culture/common/userStatistics.js index bc0dce6..ecc1a5c 100644 --- a/src/main/resources/views/platform/zhgh/activity/culture/common/userStatistics.js +++ b/src/main/resources/views/platform/zhgh/activity/culture/common/userStatistics.js @@ -1,6 +1,6 @@ const ACTIVITY_CULTURE_USER_STATISTICS = { template: /*language=HTML*/ ` - +