diff --git a/src/main/java/com/budwk/app/sys/listener/SysUserChangeListener.java b/src/main/java/com/budwk/app/sys/listener/SysUserChangeListener.java index 21d9c9a..baab895 100644 --- a/src/main/java/com/budwk/app/sys/listener/SysUserChangeListener.java +++ b/src/main/java/com/budwk/app/sys/listener/SysUserChangeListener.java @@ -1,6 +1,7 @@ package com.budwk.app.sys.listener; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.event.user.UserChangeEventListener; import com.budwk.app.base.event.user.UserChangeMsg; import com.budwk.app.sys.models.Sys_user_role; @@ -31,9 +32,17 @@ public class SysUserChangeListener implements UserChangeEventListener { @Aop(TransAop.READ_COMMITTED) public void receive(UserChangeMsg message) { if (ObjectUtil.equals(message.getOperationType(), UserChangeMsg.UNIT_CHANGE_OPERATION)) { + if (StrUtil.isBlank(message.getSourceUnitId())) { + return; + } + // 单位变动,删除原单位的角色 dao.clear(Sys_user_role.class, Cnd.where("userId", "in", message.getUserIds()).and("unitId", "=", message.getSourceUnitId())); + if (StrUtil.isBlank(message.getTargetUnitId())) { + return; + } + // 判断这两个单位是不是在一个工会,如果不是,删除原来工会的所有角色 Sql sql = Sqls.create(""" SELECT @@ -51,8 +60,9 @@ public class SysUserChangeListener implements UserChangeEventListener { dao.execute(sql); NutMap result = (NutMap) sql.getResult(); - if (!result.getBoolean("result")) { - dao.clear(Sys_user_role.class, Cnd.where("userId", "in", message.getUserIds()).and("unionId", "=", result.getString("sourceUnionId"))); + String sourceUnionId = result.getString("sourceUnionId"); + if (!result.getBoolean("result") && StrUtil.isNotBlank(sourceUnionId)) { + dao.clear(Sys_user_role.class, Cnd.where("userId", "in", message.getUserIds()).and("unionId", "=", sourceUnionId)); } } diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user.java b/src/main/java/com/budwk/app/sys/models/Sys_user.java index 707a90d..74ac165 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user.java @@ -294,6 +294,11 @@ public class Sys_user extends BaseModel implements Serializable { @Default(value = "0") private Boolean aidFundMember; + @Column + @Comment("大病基金会员类别") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String aidFundMemberType; + @Column @Comment("家庭主要成员及其工作单位") @ColDefine(type = ColType.MYSQL_JSON) diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java index 8a4ae5e..efbda11 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.event.role.RoleEventMsg; @@ -26,13 +27,14 @@ import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.FieldFilter; +import org.nutz.dao.util.Daos; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; import org.nutz.lang.random.R; import org.nutz.lang.util.NutMap; -import org.springframework.beans.BeanUtils; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.lang.reflect.Field; @@ -64,6 +66,11 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService private static Map unitIdNameMap; + /** + * 数据中心允许更新的用户字段表达式。 + */ + private static String dataCenterUpdateFields; + /** * 字段映射类,用于缓存反射结果 */ @@ -110,6 +117,24 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService return fieldMappings; } + /** + * 获取数据中心字段白名单表达式,供批量更新时过滤本地业务字段。 + * + * @return 字段过滤表达式 + */ + private static String getDataCenterUpdateFields() { + if (dataCenterUpdateFields == null) { + synchronized (SysDataUserAllUpdateServiceImpl.class) { + if (dataCenterUpdateFields == null) { + dataCenterUpdateFields = getFieldMappings().stream() + .map(mapping -> mapping.field.getName()) + .collect(Collectors.joining("|", "^(id|", ")$")); + } + } + } + return dataCenterUpdateFields; + } + /** * 检查用户是否符合会员条件 * @@ -182,12 +207,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService for (Sys_user_source source : sources) { Sys_user user = userMap.get(source.getLoginname()); - // 创建用户对象 - Sys_user u = new Sys_user(); - BeanUtils.copyProperties(source, u); - - // 数据中心可能返回三级单位编码,系统用户统一挂到二级单位。 - u.setUnitId(normalizeSecondLevelUnitId(u.getUnitId())); + // 创建只包含数据中心字段的用户对象,避免覆盖本地维护的会员、登录、积分等业务字段。 + Sys_user u = buildDataCenterUser(source); if (user == null) { // 新增用户,初始化数据 @@ -199,8 +220,6 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService } else { // 修改现有用户 u.setId(user.getId()); - // 全量更新只同步数据中心基础资料,会员状态由会员业务流程维护。 - u.setMember(null); needDoUpdateList.add(u); } @@ -244,7 +263,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService List> batches = ListUtil.split(needDoUpdateList, 500); batches.forEach(batch -> { try { - dao.updateIgnoreNull(batch); + Dao extDao = Daos.ext(dao, FieldFilter.create(Sys_user.class, getDataCenterUpdateFields())); + extDao.updateIgnoreNull(batch); } catch (Exception e) { log.error("批量更新用户异常", e); } @@ -369,6 +389,53 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService return unitId; } + /** + * 构建数据中心同步对象,只写入带有DataCenterColumn注解且来源非空的字段。 + * + * @param source 数据中心来源用户 + * @return 待新增或更新的系统用户 + */ + private Sys_user buildDataCenterUser(Sys_user_source source) { + Sys_user user = new Sys_user(); + for (FieldMapping mapping : getFieldMappings()) { + try { + Object sourceValue = mapping.field.get(source); + Object updateValue = normalizeDataCenterValue(mapping.field.getName(), sourceValue); + if (updateValue != null) { + mapping.field.set(user, updateValue); + } + } catch (IllegalAccessException e) { + log.error("数据中心字段赋值失败: {}", mapping.field.getName(), e); + } + } + return user; + } + + /** + * 数据中心字段更新值归一化,空字符串和空值不参与更新,单位编码统一归一到二级单位。 + * + * @param fieldName 字段名 + * @param value 来源值 + * @return 可更新值 + */ + private Object normalizeDataCenterValue(String fieldName, Object value) { + if (value == null) { + return null; + } + if (value instanceof String) { + String strValue = (String) value; + String trimmedValue = StrUtil.trimToNull(strValue); + if (trimmedValue == null) { + return null; + } + if ("unitId".equals(fieldName)) { + return normalizeSecondLevelUnitId(trimmedValue); + } + return trimmedValue; + } + return value; + } + /** * 构建变更的历史数据 * @@ -403,14 +470,18 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService } Object sourceValue = mapping.field.get(source); Object userValue = mapping.field.get(user); + Object updateValue = normalizeDataCenterValue(mapping.field.getName(), sourceValue); + if (updateValue == null) { + continue; + } // 如果值不相等,记录变更 - if (!ObjectUtil.equals(sourceValue, userValue)) { + if (!ObjectUtil.equals(updateValue, userValue)) { NutMap change = NutMap.NEW(); change.put("fieldName", mapping.name); change.put("field", mapping.field.getName()); change.put("sourceValue", userValue == null ? "" : userValue.toString()); - change.put("newValue", sourceValue == null ? "" : sourceValue.toString()); + change.put("newValue", updateValue.toString()); changeList.add(change); } } catch (IllegalAccessException e) { @@ -436,18 +507,21 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 2. 单位变更 String oldUnitId = normalizeSecondLevelUnitId(user.getUnitId()); String newUnitId = normalizeSecondLevelUnitId(source.getUnitId()); - if (!ObjectUtil.equals(oldUnitId, newUnitId)) { + if (StrUtil.isNotBlank(newUnitId) && !ObjectUtil.equals(oldUnitId, newUnitId)) { changeTypes.add(MemberChangeType.UNIT_CHANGE.name()); NutMap change = NutMap.NEW(); change.put("fieldName", "单位"); change.put("field", "unitId"); - change.put("sourceValue", unitIdNameMap.get(oldUnitId)); - change.put("newValue", unitIdNameMap.get(newUnitId)); + change.put("sourceValue", getUnitChangeDisplayValue(oldUnitId)); + change.put("newValue", getUnitChangeDisplayValue(newUnitId)); changeList.add(change); - // 单位异动发送订阅消息,清空原单位的所有角色 - UserChangePublisher.broadcast(new UserChangeMsg(List.of(user.getId()), - UserChangeMsg.UNIT_CHANGE_OPERATION, oldUnitId, newUnitId)); + // 旧单位为空时没有明确的来源单位角色范围,避免清理到全局角色。 + if (StrUtil.isNotBlank(oldUnitId)) { + // 单位异动发送订阅消息,清空原单位的所有角色 + UserChangePublisher.broadcast(new UserChangeMsg(List.of(user.getId()), + UserChangeMsg.UNIT_CHANGE_OPERATION, oldUnitId, newUnitId)); + } } // 如果没有任何变更,返回null @@ -458,8 +532,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 生成变更信息描述 String changeInfos = changeList.stream() .map(v -> v.getString("fieldName") + ":" + - HtmlUtil.cleanHtmlTag(v.getString("sourceValue")) + "→" + - HtmlUtil.cleanHtmlTag(v.getString("newValue"))) + cleanChangeValue(v.get("sourceValue")) + "→" + + cleanChangeValue(v.get("newValue"))) .collect(Collectors.joining(";")); // 设置历史记录信息 @@ -469,4 +543,31 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService return history; } + + /** + * 单位变更历史展示值,优先显示单位名称,单位表缺失时显示单位编码,空单位显示空字符串。 + * + * @param unitId 单位编码 + * @return 历史记录展示值 + */ + private String getUnitChangeDisplayValue(String unitId) { + if (StrUtil.isBlank(unitId)) { + return ""; + } + String unitName = unitIdNameMap.get(unitId); + return StrUtil.blankToDefault(unitName, unitId); + } + + /** + * 生成变更描述前统一处理空值和HTML标签,避免来源数据为空时生成历史记录失败。 + * + * @param value 变更前后值 + * @return 清洗后的变更展示值 + */ + private String cleanChangeValue(Object value) { + if (value == null) { + return ""; + } + return HtmlUtil.cleanHtmlTag(value.toString()); + } } diff --git a/src/main/java/com/budwk/app/sys/views/View_user.java b/src/main/java/com/budwk/app/sys/views/View_user.java index fc28b17..e90a9fe 100644 --- a/src/main/java/com/budwk/app/sys/views/View_user.java +++ b/src/main/java/com/budwk/app/sys/views/View_user.java @@ -210,4 +210,7 @@ public class View_user { @Column private Boolean aidFundMember; + + @Column + private String aidFundMemberType; } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/controller/FundMemberQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/controller/FundMemberQueryController.java index 0371310..7c8955e 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/controller/FundMemberQueryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/controller/FundMemberQueryController.java @@ -39,6 +39,7 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; @@ -78,6 +79,7 @@ public class FundMemberQueryController { u.userState, u.preparedBy, u.personType, + u.aidFundMemberType, u.unitName, u.unionName, (SELECT changeTime FROM fund_member_change_record WHERE loginName = u.loginName AND isJoin = 1 ORDER BY changeTime DESC limit 1) joinTime @@ -93,6 +95,14 @@ public class FundMemberQueryController { return Result.success(pagination); } + @At + @SaCheckPermission("fundMember.query") + @ApiOperation("修改大病基金会员类别") + public Result updateAidFundMemberType(@Param("loginName") String loginName, @Param("aidFundMemberType") String aidFundMemberType) { + fundMemberService.updateAidFundMemberType(loginName, aidFundMemberType); + return Result.success(); + } + @At @SaCheckPermission("fundMember.query") @Ok("void") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/interceptor/FundMemberPassInterceptor.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/interceptor/FundMemberPassInterceptor.java index da99226..343563c 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/interceptor/FundMemberPassInterceptor.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/interceptor/FundMemberPassInterceptor.java @@ -25,8 +25,10 @@ public class FundMemberPassInterceptor implements FlowInterceptor { public void intercept(Execution execution) { Dao dao = ServiceContext.find(Dao.class); FundMemberApply fundMemberApply = Json.fromJson(FundMemberApply.class, execution.getArgs().getStr("f_data")); - // 修改基金会员状态 - dao.update(Sys_user.class, Chain.make("aidFundMember", 1), Cnd.where(Sys_user::getLoginname, "=", fundMemberApply.getLoginName())); + // 修改基金会员状态,并同步申请时选择的大病基金会员类别。 + dao.update(Sys_user.class, + Chain.make("aidFundMember", 1).add("aidFundMemberType", fundMemberApply.getAidFundMemberType()), + Cnd.where(Sys_user::getLoginname, "=", fundMemberApply.getLoginName())); // 添加到变更记录 FundMemberChangeRecord record = BeanUtil.copyProperties(fundMemberApply, FundMemberChangeRecord.class, "id"); record.setId(null); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/models/FundMemberApply.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/models/FundMemberApply.java index fc5a1bd..673c2cc 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/models/FundMemberApply.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/models/FundMemberApply.java @@ -57,6 +57,11 @@ public class FundMemberApply extends BaseModel { @ColDefine(type = ColType.DATE) private Date retireTime; + @Column + @Comment("大病基金会员类别") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String aidFundMemberType; + @Column @Comment("家庭住址") @ColDefine(type = ColType.VARCHAR, width = 100) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/FundMemberService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/FundMemberService.java index 6254d7a..0d64785 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/FundMemberService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/FundMemberService.java @@ -9,4 +9,12 @@ public interface FundMemberService extends BaseService { * 验证是否已经申请了 */ void validateApply(); + + /** + * 修改大病基金会员类别。 + * + * @param loginName 工号 + * @param aidFundMemberType 大病基金会员类别 + */ + void updateAidFundMemberType(String loginName, String aidFundMemberType); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/impl/FundMemberServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/impl/FundMemberServiceImpl.java index 32e18fa..856079f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/impl/FundMemberServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/service/impl/FundMemberServiceImpl.java @@ -4,9 +4,11 @@ import cn.hutool.core.util.StrUtil; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.sys.models.Sys_user; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.fund.member.models.FundMemberApply; import com.budwk.app.zhgh.dayofficework.fund.member.service.FundMemberService; +import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.ioc.loader.annotation.IocBean; @@ -36,4 +38,17 @@ public class FundMemberServiceImpl extends BaseServiceImpl impl throw new RuntimeException("您有申请流程正在进行中,请等待流程结束后再次操作"); } } + + @Override + public void updateAidFundMemberType(String loginName, String aidFundMemberType) { + if (StrUtil.isBlank(loginName)) { + throw new RuntimeException("工号不能为空"); + } + if (StrUtil.isBlank(aidFundMemberType)) { + throw new RuntimeException("会员类别不能为空"); + } + dao().update(Sys_user.class, + Chain.make("aidFundMemberType", aidFundMemberType), + Cnd.where(Sys_user::getLoginname, "=", loginName).and(Sys_user::getAidFundMember, "=", 1)); + } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/vo/FundMemberCommonPageForm.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/vo/FundMemberCommonPageForm.java index 234a983..57e085c 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/vo/FundMemberCommonPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/member/vo/FundMemberCommonPageForm.java @@ -43,6 +43,10 @@ public class FundMemberCommonPageForm extends PageForm { @ApiModelProperty("教职工类别") private List personTypes; + // 大病基金会员类别 + @ApiModelProperty("大病基金会员类别") + private List aidFundMemberTypes; + public void buildSearch(Cnd cnd, String prefix){ if (cnd == null) { cnd = Cnd.NEW(); @@ -60,5 +64,6 @@ public class FundMemberCommonPageForm extends PageForm { cnd.andEX(prefix + "userState", "in", this.getUserStates()); cnd.andEX(prefix + "preparedBy", "in", this.getPreparedBys()); cnd.andEX(prefix + "personType", "in", this.getPersonTypes()); + cnd.andEX(prefix + "aidFundMemberType", "in", this.getAidFundMemberTypes()); } } diff --git a/src/main/resources/views/platform/zhgh/dayofficework/fund/member/batchJoin/index.html b/src/main/resources/views/platform/zhgh/dayofficework/fund/member/batchJoin/index.html index 327267d..8e428ab 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/fund/member/batchJoin/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/fund/member/batchJoin/index.html @@ -39,10 +39,10 @@ layout("/layouts/platform.html"){ - - - + + + + @@ -106,7 +106,7 @@ layout("/layouts/platform.html"){ { label: "出生年月", prop: "birthday" }, { label: "在职状态", prop: "userState", sortable: true }, { label: "教职工类别", prop: "personType", sortable: true }, - { label: '编制类别', prop: 'preparedBy', sortable: true }, + // { label: '编制类别', prop: 'preparedBy', sortable: true }, { label: "所属工会", prop: "unionName" }, { label: "所属单位", prop: "unitName" }, ], @@ -163,7 +163,7 @@ layout("/layouts/platform.html"){ const pageForm = clone(this.pageForm) pageForm.userStates = JSON.stringify(this.pageForm.userStates) pageForm.personTypes = JSON.stringify(this.pageForm.personTypes) - pageForm.preparedBys = JSON.stringify(this.pageForm.preparedBys) + // pageForm.preparedBys = JSON.stringify(this.pageForm.preparedBys) this.$axios.post('/platform/fundMember/batchJoin/pageData', pageForm) .then(res => { this.tableData = res.data.list diff --git a/src/main/resources/views/platform/zhgh/dayofficework/fund/member/info.js b/src/main/resources/views/platform/zhgh/dayofficework/fund/member/info.js index 0db1847..df76063 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/fund/member/info.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/fund/member/info.js @@ -3,11 +3,15 @@ const fundMemberInfo = {
申请信息 - 点击查看流程图 + 点击查看流程图
{{viewData.userName}} {{viewData.loginName}} + {{viewData.aidFundMemberType}} + {{viewData.userState}} + {{viewData.unionName}} + {{viewData.unitName}} {{viewData.sex}} {{viewData.birthday}} {{viewData.idCard}} @@ -72,21 +76,29 @@ const fundMemberInfo = { onOpen(row) { this.row = row this.visible = true + this.viewData = Object.assign({}, row || {}) + this.doneTasks = [] this.getInfo() this.getDoneTasks() }, // 获取申请信息 getInfo() { + if (!this.row || !this.row.id) { + return + } this.$axios.post('/platform/fundMember/common/info', {id: this.row.id}).then((res) => { if (res.code === 0) { - this.viewData = res.data + this.viewData = Object.assign({}, this.viewData, res.data || {}) } }) }, // 获取已办任务审批记录 getDoneTasks() { + if (!this.row || !this.row.instanceId) { + return + } this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => { if (res.code === 0) { this.doneTasks = res.data @@ -96,6 +108,10 @@ const fundMemberInfo = { // 查看流程图 openChart() { + if (!this.row || !this.row.instanceId) { + this.$message.warning("暂无流程信息") + return + } this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId) } } diff --git a/src/main/resources/views/platform/zhgh/dayofficework/fund/member/query/index.html b/src/main/resources/views/platform/zhgh/dayofficework/fund/member/query/index.html index 71d31ac..cb985bd 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/fund/member/query/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/fund/member/query/index.html @@ -39,14 +39,14 @@ layout("/layouts/platform.html"){ - - - - - + + + + + + @@ -78,6 +78,11 @@ layout("/layouts/platform.html"){ 加入 退出 +