| | |
| | | import com.tcm.training.admin.live.entity.Clinic; |
| | | import com.tcm.training.admin.member.entity.AppUser; |
| | | import com.tcm.training.admin.live.mapper.ClinicMapper; |
| | | import com.tcm.training.admin.member.excel.MemberUserExcelRow; |
| | | import com.tcm.training.admin.member.dto.UserResetPasswordRequest; |
| | | import com.tcm.training.admin.member.dto.UserStatusRequest; |
| | | import com.tcm.training.admin.member.dto.UserUpdateRequest; |
| | |
| | | private static final Pattern PASSWORD_PATTERN = Pattern.compile( |
| | | "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z\\d]).{12,64}$" |
| | | ); |
| | | private static final String MEMBER_STATUS_ALL = "ALL"; |
| | | private static final String MEMBER_STATUS_ACTIVE = "ACTIVE"; |
| | | private static final String MEMBER_STATUS_EXPIRED = "EXPIRED"; |
| | | |
| | | private final UserMapper userMapper; |
| | | private final ClinicMapper clinicMapper; |
| | |
| | | Long clinicId, |
| | | Integer status, |
| | | Integer isMember, |
| | | String memberStatus, |
| | | LocalDateTime memberExpireFrom, |
| | | LocalDateTime memberExpireTo, |
| | | LocalDateTime registeredFrom, |
| | | LocalDateTime registeredTo) { |
| | | String normalizedMemberStatus = normalizeMemberStatus(memberStatus); |
| | | IPage<UserListRow> result = userMapper.selectUserPage( |
| | | new Page<UserListRow>(page, pageSize), |
| | | trimToNull(nickname), |
| | |
| | | clinicId, |
| | | status, |
| | | isMember, |
| | | normalizedMemberStatus, |
| | | memberExpireFrom, |
| | | memberExpireTo, |
| | | registeredFrom, |
| | | registeredTo |
| | | ); |
| | |
| | | item.setAge(row.getAge()); |
| | | item.setGender(row.getGender()); |
| | | item.setIsMember(row.getIsMember() != null && row.getIsMember() == 1); |
| | | item.setMemberExpireAt(row.getMemberExpireAt()); |
| | | item.setStatus(row.getStatus()); |
| | | item.setCreatedAt(row.getCreatedAt()); |
| | | list.add(item); |
| | |
| | | Long clinicId, |
| | | Integer status, |
| | | Integer isMember, |
| | | String memberStatus, |
| | | LocalDateTime memberExpireFrom, |
| | | LocalDateTime memberExpireTo, |
| | | LocalDateTime registeredFrom, |
| | | LocalDateTime registeredTo, |
| | | HttpServletResponse response) throws IOException { |
| | | String normalizedMemberStatus = normalizeMemberStatus(memberStatus); |
| | | boolean memberMode = normalizedMemberStatus != null; |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | String filename = URLEncoder.encode("用户列表", "UTF-8").replace("+", "%20"); |
| | | String filename = URLEncoder.encode(memberMode ? "会员用户列表" : "用户列表", "UTF-8").replace("+", "%20"); |
| | | response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + filename + ".xlsx"); |
| | | |
| | | List<UserListRow> rows = userMapper.selectUserList( |
| | |
| | | clinicId, |
| | | status, |
| | | isMember, |
| | | normalizedMemberStatus, |
| | | memberExpireFrom, |
| | | memberExpireTo, |
| | | registeredFrom, |
| | | registeredTo |
| | | ); |
| | | if (memberMode) { |
| | | List<MemberUserExcelRow> memberExcelRows = new ArrayList<MemberUserExcelRow>(); |
| | | for (UserListRow row : rows) { |
| | | MemberUserExcelRow excel = new MemberUserExcelRow(); |
| | | excel.setId(row.getId()); |
| | | excel.setNickname(row.getNickname()); |
| | | excel.setPhone(PhoneMasker.mask(row.getPhone())); |
| | | excel.setMemberStatus(row.getIsMember() != null && row.getIsMember() == 1 ? "生效中" : "已失效"); |
| | | excel.setMemberExpireAt(DateTimes.format(row.getMemberExpireAt())); |
| | | memberExcelRows.add(excel); |
| | | } |
| | | FastExcel.write(response.getOutputStream(), MemberUserExcelRow.class) |
| | | .sheet("会员用户列表") |
| | | .doWrite(memberExcelRows); |
| | | return; |
| | | } |
| | | List<UserExcelRow> excelRows = new ArrayList<UserExcelRow>(); |
| | | for (UserListRow row : rows) { |
| | | UserExcelRow excel = new UserExcelRow(); |
| | |
| | | return trimmed.isEmpty() ? null : trimmed; |
| | | } |
| | | |
| | | private String normalizeMemberStatus(String memberStatus) { |
| | | String normalized = trimToNull(memberStatus); |
| | | if (normalized == null) { |
| | | return null; |
| | | } |
| | | String upper = normalized.toUpperCase(); |
| | | if (MEMBER_STATUS_ALL.equals(upper) || MEMBER_STATUS_ACTIVE.equals(upper) || MEMBER_STATUS_EXPIRED.equals(upper)) { |
| | | return upper; |
| | | } |
| | | throw new IllegalArgumentException("会员状态筛选不合法"); |
| | | } |
| | | |
| | | private String typeText(Integer type) { |
| | | return type != null && type == 1 ? "诊所" : "个人"; |
| | | } |