Merge remote-tracking branch 'origin/main'

This commit is contained in:
2026-04-08 14:20:06 +08:00
12 changed files with 92 additions and 71 deletions
@@ -16,10 +16,10 @@ public enum Api2FinanceFiledMap {
RYDM("rydm", "loginname"),
// 人员名称
RYMC("rymc", "username"),
// 编制会费
HF("hf", "name"),
// 合同制会费
HF2("hf2", "unitType");
// 编制会费,需与财务拉取后读取的 NutMap key 保持一致。
HF("hf", "preparationMemberFee"),
// 合同制会费,需与财务拉取后读取的 NutMap key 保持一致。
HF2("hf2", "contractMemberFee");
public final String apiField;
public final String dbColumn;
@@ -195,8 +195,6 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
Sys_user u = new Sys_user();
BeanUtils.copyProperties(source, u);
// 先不处理会员
u.setMember(null);
if (user == null) {
// 新增用户,初始化数据
@@ -204,9 +202,9 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
u.setSalt(salt);
u.setPassword(PwdUtil.getPassword(PwdUtil.generate(12), salt));
// if (u.getMember()) {
// addMemberUserIds.add(u.getId());
// }
if (u.getMember()) {
addMemberUserIds.add(u.getId());
}
needInitUserList.add(u);
} else {
@@ -218,13 +216,13 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService
u.setId(user.getId());
// 更新会员状态
boolean currentIsMember = user.getMember() != null && user.getMember();
boolean currentIsMember = source.getMember() != null && source.getMember();
// if (!currentIsMember) {
// addMemberUserIds.add(user.getId());
// } else{
// removeMemberUserIds.add(user.getId());
// }
if (currentIsMember) {
addMemberUserIds.add(user.getId());
} else{
removeMemberUserIds.add(user.getId());
}
needDoUpdateList.add(u);
}
@@ -25,7 +25,6 @@ import com.budwk.app.sys.models.Sys_user_source;
import com.budwk.app.sys.services.SysDataUnitPullService;
import com.budwk.app.sys.services.SysDataUserPullService;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.sys.utils.DataCenterUtil;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.async.Async;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -396,7 +395,7 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source>
List<JSONObject> rawDataList = new ArrayList<>();
String year = String.valueOf(DateUtil.thisYear());
String month = String.valueOf(DateUtil.thisMonth() + 1);
String month = String.valueOf(DateUtil.thisMonth());
int pageNum = 1;
int pageSize = 1000;
@@ -414,12 +413,14 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source>
"pageSize", pageSize
);
httpRequest.body(JSONUtil.toJsonStr(reqBody));
log.info("财务接口填写数据: {}", reqBody);
JSONObject resp = JSONUtil.parseObj(httpRequest.execute().body());
log.info("财务接口返回结果: {}", resp);
if (resp.getInt("code") != 0) {
throw new BaseException("获取财务数据失败,错误码: " + resp.getInt("code") + ";错误原因:" + resp.getStr("msg"));
}
// 财务接口的分页信息在 data 节点,明细数据在顶层 records 节点,解析时需要分别读取。
JSONObject data = resp.getJSONObject("data");
if (pageNum == 1) {
totalCount = data.getInt("total", 0);
@@ -427,16 +428,18 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source>
totalPages = (int) Math.ceil((double) totalCount / pageSize);
}
JSONArray records = data.getJSONArray("records");
JSONArray records = resp.getJSONArray("records");
log.info("财务数据转换前: {}", records);
if (CollUtil.isNotEmpty(records)) {
rawDataList.addAll(records.stream().map(v -> (JSONObject) v).toList());
log.info("数据拉取进度: {}/{}", rawDataList.size(), totalCount);
log.info("财务数据拉取进度: {}/{}", rawDataList.size(), totalCount);
}
log.info("财务数据转换后: {}", records.stream().map(v -> (JSONObject) v).toList());
pageNum++; // 只加页码
} while (pageNum <= totalPages);
// 接口数据输出
log.info("数据拉取结果: {}", rawDataList);
log.info("财务数据拉取结果: {}", rawDataList);
// 最后结果数据
Map<String, NutMap> result = new HashMap<>();
@@ -445,14 +448,25 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl<Sys_user_source>
.collect(Collectors.toMap(e -> e.apiField, e -> e.dbColumn));
for (JSONObject row : rawDataList) {
NutMap nutMap = DataCenterUtil.mapJsonToBean(row, NutMap.class, api2db);
NutMap nutMap = NutMap.NEW();
// NutMap 不是普通 JavaBean,不能用反射字段赋值,这里按映射关系直接写入键值。
api2db.forEach((apiField, dbColumn) -> {
Object value = row.get(apiField);
if (value != null) {
nutMap.setv(dbColumn, value);
}
});
if (StrUtil.isBlank(nutMap.getString("loginname"))) {
log.warn("财务数据缺少工号,跳过本条记录: {}", row);
continue;
}
result.put(nutMap.getString("loginname"), nutMap);
}
// 输出结果
log.info("财务数据拉取转换结果: {}", result);
log.info("数据拉取完成,共拉取 {} 条数据", result.size());
log.info("财务数据拉取完成,共拉取 {} 条数据", result.size());
return result;
}
}
@@ -3,20 +3,15 @@ package com.budwk.app.zhgh.club.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessInstanceStatusEnum;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
@@ -39,8 +34,6 @@ import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Author: JyuHsin
@@ -244,6 +237,7 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
}
cnd.andEX("year(info.createTime)", "=", pageForm.getYear());
cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.groupBy("info.id");
cnd.desc("createTime");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
@@ -141,13 +141,12 @@ public class ExecutiveCommitteeDelegationOnePushController {
List<ExecutiveCommitteeOnePush> userValue = dao.query(ExecutiveCommitteeOnePush.class,
Cnd.where("teacherMeetId", "=", teacherMeetId)
.and("addType", "=", 1));
List<ExecutiveCommitteeOnePush> onePushList = dao.query(ExecutiveCommitteeOnePush.class, Cnd.NEW());
List<String> userIds = onePushList.stream().map(v -> v.getUserId()).collect(Collectors.toList());
List<String> userIds = userValue.stream().map(v -> v.getUserId()).collect(Collectors.toList());
Cnd cnd = Cnd.NEW();
cnd.andEX("db.sessionId", "=", teacherMeetId);
cnd.andEX("db.userId", "not in", userIds);
cnd.andEX("db.userId", "!=", SecurityUtil.getUserId());
// cnd.andEX("db.userId", "!=", SecurityUtil.getUserId());
cnd.and("db.delegationId", "=", db.getDelegationId());
Sql sql = Sqls.create("""
SELECT
@@ -107,6 +107,7 @@ public class ExecutiveCommitteePushDwSjAuditController {
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN executive_committee_union_push_info info ON info.id = ins.businessNo
left join sys_user us on us.id=info.userId
LEFT JOIN teacher_congress_delegate tcd on tcd.sessionId=@sessionId and tcd.userId=info.userId
LEFT JOIN teacher_congress_delegation ion on ion.id=tcd.delegationId
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
@@ -129,8 +130,8 @@ public class ExecutiveCommitteePushDwSjAuditController {
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("info.userName", pageForm.getSearchKeyword());
group.orLike("info.loginName", pageForm.getSearchKeyword());
group.orLike("us.userName", pageForm.getSearchKeyword());
group.orLike("us.loginName", pageForm.getSearchKeyword());
cnd.and(group);
}
@@ -19,7 +19,6 @@ import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.executiveCommittee.models.ExecutiveCommitteeConfig;
import com.budwk.app.zhgh.democratic.executiveCommittee.models.ExecutiveCommitteeOnePush;
import com.budwk.app.zhgh.democratic.executiveCommittee.models.ExecutiveCommitteeUnionPushInfo;
import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate;
import io.swagger.annotations.Api;
@@ -43,7 +42,6 @@ import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zhf
@@ -109,6 +107,7 @@ public class ExecutiveCommitteeUnionPushController {
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId
FROM
executive_committee_union_push_info info
left join sys_user us on us.id=info.userId
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
@@ -122,8 +121,8 @@ public class ExecutiveCommitteeUnionPushController {
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("info.userName", pageForm.getSearchKeyword());
group.orLike("info.loginName", pageForm.getSearchKeyword());
group.orLike("us.userName", pageForm.getSearchKeyword());
group.orLike("us.loginName", pageForm.getSearchKeyword());
cnd.and(group);
}
cnd.desc("info.createdAt");
@@ -158,19 +157,19 @@ public class ExecutiveCommitteeUnionPushController {
if (config.getFirstEndTime().getTime() < System.currentTimeMillis()) {
return Result.error("一次预选已结束");
}
List<ExecutiveCommitteeOnePush> userValue = dao.query(ExecutiveCommitteeOnePush.class,
/* List<ExecutiveCommitteeOnePush> userValue = dao.query(ExecutiveCommitteeOnePush.class,
Cnd.where("teacherMeetId", "=", teacherMeetId));
List<ExecutiveCommitteeOnePush> onePushList = dao.query(ExecutiveCommitteeOnePush.class, Cnd.NEW());
List<String> userIds = onePushList.stream().map(v -> v.getUserId()).collect(Collectors.toList());
List<String> userIds = onePushList.stream().map(v -> v.getUserId()).collect(Collectors.toList());*/
List<ExecutiveCommitteeUnionPushInfo> pushInfoList = dao.query(ExecutiveCommitteeUnionPushInfo.class, Cnd.where(ExecutiveCommitteeUnionPushInfo::getTeacherMeetId, "=", teacherMeetId));
List<String> unionPushUserIds = pushInfoList.stream().map(v -> v.getUserId()).toList();
List<String> unionPushUserIds = pushInfoList.stream().map(ExecutiveCommitteeUnionPushInfo::getUserId).toList();
Cnd cnd = Cnd.NEW();
cnd.andEX("db.sessionId", "=", teacherMeetId);
cnd.andEX("db.userId", "not in", userIds);
// cnd.andEX("db.userId", "not in", userIds);
cnd.andEX("db.userId", "not in", unionPushUserIds);
// cnd.andEX("db.userId", "!=", SecurityUtil.getUserId());
cnd.and("u.unionId", "=", SecurityUtil.getUnionId());
@@ -192,9 +191,9 @@ public class ExecutiveCommitteeUnionPushController {
List<NutMap> unionQuotaList = config.getUnionQuotaList();
NutMap unionQuota = unionQuotaList.stream().filter(v -> v.getString("unionId").equals(SecurityUtil.getUnionId())).findFirst().orElse(null);
if (Lang.isNotEmpty(unionQuota)) {
return Result.success(Map.of("userData", userData, "userValue", userValue, "quotaCount", unionQuota.getInt("quotaCount")));
return Result.success(Map.of("userData", userData, "userValue", pushInfoList, "quotaCount", unionQuota.getInt("quotaCount")));
}
return Result.success(Map.of("userData", userData, "userValue", userValue, "quotaCount", 0));
return Result.success(Map.of("userData", userData, "userValue", pushInfoList, "quotaCount", 0));
}
@@ -105,7 +105,7 @@ public class ProposalCommitteeFilingUnitController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "committeeFilingUnit");
cnd.and("t.taskName", "=", "committeeFiling");
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
@@ -27,13 +27,6 @@ layout("/layouts/platform.html"){
></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select clearable filterable placeholder="请选择所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
<search-item label="代表团">
<el-select clearable filterable placeholder="请选择代表团" style="width: 100%"
v-model="pageForm.delegationId">
@@ -41,6 +34,14 @@ layout("/layouts/platform.html"){
v-for="item in delegations"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select clearable filterable placeholder="请选择所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
@@ -10,8 +10,8 @@ layout("/layouts/platform.html"){
<el-input v-model="pageForm.searchKeyword" placeholder="请输入姓名或工号" clearable>
</el-input>
</search-item>
<search-item label="教代会">
<el-select
<search-item label="教代会">
<el-select
v-model="pageForm.teacherMeetId"
filterable
placeholder="请选择教代会"
@@ -26,6 +26,13 @@ layout("/layouts/platform.html"){
></el-option>
</el-select>
</search-item>
<search-item label="所属工会" v-if="$auth.hasRoleOr('SYSADMIN')">
<el-select clearable filterable placeholder="请选择所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
</search>
@@ -10,22 +10,29 @@ layout("/layouts/platform.html"){
<el-input v-model="pageForm.searchKeyword" placeholder="请输入姓名或工号" clearable>
</el-input>
</search-item>
<search-item label="教代会">
<el-select
v-model="pageForm.teacherMeetId"
filterable
placeholder="请选择教代会"
style="width:100%;"
@change="getAllDelegation(pageForm.teacherMeetId);doSearch()"
>
<el-option
v-for="item in teacherMeets"
:key="item.id"
:label="item.fullName"
:value="item.id"
></el-option>
</el-select>
</search-item>
<search-item label="教代会">
<el-select
v-model="pageForm.teacherMeetId"
filterable
placeholder="请选择教代会"
style="width:100%;"
@change="getAllDelegation(pageForm.teacherMeetId);doSearch()"
>
<el-option
v-for="item in teacherMeets"
:key="item.id"
:label="item.fullName"
:value="item.id"
></el-option>
</el-select>
</search-item>
<search-item label="所属工会" v-if="$auth.hasRoleOr('SYSADMIN')">
<el-select clearable filterable placeholder="请选择所属工会" style="width: 100%"
v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unionOptions"></el-option>
</el-select>
</search-item>
</search>
@@ -195,6 +195,7 @@ layout("/layouts/platform.html"){
{label: "提案编号", prop: "code"},
{label: "提案名称", prop: "name"},
{label: "提案人", prop: "createUserName"},
{label: "提案人单位", prop: "unitName", visible: false},
{label: "提案类别", prop: "typeName"},
{label: "届次", prop: "sessionName"},
{label: "代表团", prop: "delegationName"},