diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/MemberHouseController.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/MemberHouseController.java new file mode 100644 index 0000000..68ae0d7 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/MemberHouseController.java @@ -0,0 +1,102 @@ +package com.fjrcloud.community.module.community.controller.admin.memberhouse; + +import com.fjrcloud.community.framework.apilog.core.annotation.ApiAccessLog; +import com.fjrcloud.community.framework.common.pojo.CommonResult; +import com.fjrcloud.community.framework.common.pojo.PageParam; +import com.fjrcloud.community.framework.common.pojo.PageResult; +import com.fjrcloud.community.framework.common.util.object.BeanUtils; +import com.fjrcloud.community.framework.excel.core.util.ExcelUtils; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHousePageReqVO; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHouseRespVO; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHouseSaveReqVO; +import com.fjrcloud.community.module.community.dal.dataobject.memberhouse.MemberHouseDO; +import com.fjrcloud.community.module.community.service.memberhouse.MemberHouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.fjrcloud.community.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.fjrcloud.community.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 业主认证信息") +@RestController +@RequestMapping("/community/member-house") +@Validated +public class MemberHouseController { + + @Resource + private MemberHouseService memberHouseService; + + @PostMapping("/create") + @Operation(summary = "创建业主认证信息") + @PreAuthorize("@ss.hasPermission('community:member-house:create')") + public CommonResult createMemberHouse(@Valid @RequestBody MemberHouseSaveReqVO createReqVO) { + return success(memberHouseService.createMemberHouse(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新业主认证信息") + @PreAuthorize("@ss.hasPermission('community:member-house:update')") + public CommonResult updateMemberHouse(@Valid @RequestBody MemberHouseSaveReqVO updateReqVO) { + memberHouseService.updateMemberHouse(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除业主认证信息") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('community:member-house:delete')") + public CommonResult deleteMemberHouse(@RequestParam("id") Long id) { + memberHouseService.deleteMemberHouse(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除业主认证信息") + @PreAuthorize("@ss.hasPermission('community:member-house:delete')") + public CommonResult deleteMemberHouseList(@RequestParam("ids") List ids) { + memberHouseService.deleteMemberHouseListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得业主认证信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('community:member-house:query')") + public CommonResult getMemberHouse(@RequestParam("id") Long id) { + MemberHouseDO memberHouse = memberHouseService.getMemberHouse(id); + return success(BeanUtils.toBean(memberHouse, MemberHouseRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得业主认证信息分页") + @PreAuthorize("@ss.hasPermission('community:member-house:query')") + public CommonResult> getMemberHousePage(@Valid MemberHousePageReqVO pageReqVO) { + PageResult pageResult = memberHouseService.getMemberHousePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MemberHouseRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出业主认证信息 Excel") + @PreAuthorize("@ss.hasPermission('community:member-house:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMemberHouseExcel(@Valid MemberHousePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = memberHouseService.getMemberHousePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "业主认证信息.xls", "数据", MemberHouseRespVO.class, + BeanUtils.toBean(list, MemberHouseRespVO.class)); + } + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHousePageReqVO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHousePageReqVO.java new file mode 100644 index 0000000..31ceda7 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHousePageReqVO.java @@ -0,0 +1,41 @@ +package com.fjrcloud.community.module.community.controller.admin.memberhouse.vo; + +import com.fjrcloud.community.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 管理后台 - 业主认证信息分页查询请求 VO + * 用于接收前端传入的分页参数及多维度过滤条件 + */ +@Schema(description = "管理后台 - 业主认证信息分页 Request VO") +@Data +public class MemberHousePageReqVO extends PageParam { + + /** + * 小区ID(对应下拉框) + */ + private Long communityId; + + /** + * 人员信息(姓名或手机号模糊搜索) + */ + private String keyword; + + /** + * 是否产权人 + */ + private Boolean isOwner; + + /** + * 与业主关系 + */ + private String relationType; + + /** + * 审核状态 + */ + private Integer status; + + +} diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHouseRespVO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHouseRespVO.java new file mode 100644 index 0000000..d5c7e13 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHouseRespVO.java @@ -0,0 +1,96 @@ +package com.fjrcloud.community.module.community.controller.admin.memberhouse.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 业主认证信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MemberHouseRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20067") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "会员ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24858") + @ExcelProperty("会员ID") + private Long memberId; + + @Schema(description = "小区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15661") + @ExcelProperty("小区ID") + private Long communityId; + + @Schema(description = "小区名称", example = "张三") + @ExcelProperty("小区名称") + private String communityName; + + @Schema(description = "房屋id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15336") + @ExcelProperty("房屋id") + private Long houseId; + + @Schema(description = "楼号") + @ExcelProperty("楼号") + private String buildingNo; + + @Schema(description = "单元号") + @ExcelProperty("单元号") + private String unitNo; + + @Schema(description = "门牌号") + @ExcelProperty("门牌号") + private String roomNo; + + @Schema(description = "是否产权人(0-否,1-是)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("是否产权人(0-否,1-是)") + private Boolean isOwner; + + @Schema(description = "与产权人关系", example = "2") + @ExcelProperty("与产权人关系") + private String relationType; + + @Schema(description = "姓名", example = "张三") + @ExcelProperty("姓名") + private String name; + + @Schema(description = "手机号") + @ExcelProperty("手机号") + private String mobile; + + @Schema(description = "证件类型", example = "2") + @ExcelProperty("证件类型") + private String idType; + + @Schema(description = "证件号") + @ExcelProperty("证件号") + private String idNumber; + + @Schema(description = "性别(0-未知,1-男,2-女)") + @ExcelProperty("性别(0-未知,1-男,2-女)") + private Integer sex; + + @Schema(description = "出生日期") + @ExcelProperty("出生日期") + private LocalDate birthday; + + @Schema(description = "附件URL", example = "https://www.fjrcloud.cn") + @ExcelProperty("附件URL") + private String attachmentUrl; + + @Schema(description = "认证状态(0-待审核,1-已认证,2-驳回)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("认证状态(0-待审核,1-已认证,2-驳回)") + private Integer status; + + @Schema(description = "驳回原因", example = "不好") + @ExcelProperty("驳回原因") + private String rejectReason; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHouseSaveReqVO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHouseSaveReqVO.java new file mode 100644 index 0000000..cbdd914 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/admin/memberhouse/vo/MemberHouseSaveReqVO.java @@ -0,0 +1,75 @@ +package com.fjrcloud.community.module.community.controller.admin.memberhouse.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDate; + +@Schema(description = "管理后台 - 业主认证信息新增/修改 Request VO") +@Data +public class MemberHouseSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20067") + private Long id; + + @Schema(description = "会员ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "24858") + @NotNull(message = "会员ID不能为空") + private Long memberId; + + @Schema(description = "小区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15661") + @NotNull(message = "小区ID不能为空") + private Long communityId; + + @Schema(description = "小区名称", example = "张三") + private String communityName; + + @Schema(description = "房屋id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15336") + @NotNull(message = "房屋id不能为空") + private Long houseId; + + @Schema(description = "楼号") + private String buildingNo; + + @Schema(description = "单元号") + private String unitNo; + + @Schema(description = "门牌号") + private String roomNo; + + @Schema(description = "是否产权人(0-否,1-是)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否产权人(0-否,1-是)不能为空") + private Boolean isOwner; + + @Schema(description = "与产权人关系", example = "2") + private String relationType; + + @Schema(description = "姓名", example = "张三") + private String name; + + @Schema(description = "手机号") + private String mobile; + + @Schema(description = "证件类型", example = "2") + private String idType; + + @Schema(description = "证件号") + private String idNumber; + + @Schema(description = "性别(0-未知,1-男,2-女)") + private Integer sex; + + @Schema(description = "出生日期") + private LocalDate birthday; + + @Schema(description = "附件URL", example = "https://www.fjrcloud.cn") + private String attachmentUrl; + + @Schema(description = "认证状态(0-待审核,1-已认证,2-驳回)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "认证状态(0-待审核,1-已认证,2-驳回)不能为空") + private Integer status; + + @Schema(description = "驳回原因", example = "不好") + private String rejectReason; + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/house/AppHouseController.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/house/AppHouseController.java new file mode 100644 index 0000000..104ee30 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/house/AppHouseController.java @@ -0,0 +1,37 @@ +package com.fjrcloud.community.module.community.controller.app.house; + +import com.fjrcloud.community.framework.common.pojo.CommonResult; +import com.fjrcloud.community.module.community.controller.app.house.vo.HouseTreeNodeVO; +import com.fjrcloud.community.module.community.service.house.HouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +import static com.fjrcloud.community.framework.common.pojo.CommonResult.success; + +@Tag(name = "用户 APP - 房屋信息") +@RestController +@RequestMapping("/community/house") +@Validated +@Slf4j +public class AppHouseController { + + @Resource + private HouseService houseService; + + @GetMapping("/tree") + @Operation(summary = "获取小区房屋级联树(楼号-单元-房号)") + @Parameter(name = "communityId", description = "小区ID", required = true, example = "1") + public CommonResult> getHouseTree(@RequestParam("communityId") Long communityId) { + return success(houseService.getHouseTreeByCommunityId(communityId)); + } +} diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/house/vo/HouseTreeNodeVO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/house/vo/HouseTreeNodeVO.java new file mode 100644 index 0000000..0c6d6b1 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/controller/app/house/vo/HouseTreeNodeVO.java @@ -0,0 +1,20 @@ +package com.fjrcloud.community.module.community.controller.app.house.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "APP - 房屋层级树节点 VO") +@Data +public class HouseTreeNodeVO { + + @Schema(description = "节点值(用于提交表单)", example = "1") + private String value; + + @Schema(description = "节点显示名称(用于下拉展示)", example = "1号楼") + private String label; + + @Schema(description = "子节点列表(楼号下是单元,单元下是房号)") + private List children; +} diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java new file mode 100644 index 0000000..e65e35d --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/dataobject/memberhouse/MemberHouseDO.java @@ -0,0 +1,105 @@ +package com.fjrcloud.community.module.community.dal.dataobject.memberhouse; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fjrcloud.community.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDate; + +/** + * 业主认证信息 DO + * + * @author 芋道源码 + */ +@TableName("comm_member_house") +@KeySequence("comm_member_house_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MemberHouseDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 会员ID + */ + private Long memberId; + /** + * 小区ID + */ + private Long communityId; + /** + * 小区名称 + */ + private String communityName; + /** + * 房屋id + */ + private Long houseId; + /** + * 楼号 + */ + private String buildingNo; + /** + * 单元号 + */ + private String unitNo; + /** + * 门牌号 + */ + private String roomNo; + /** + * 是否产权人(0-否,1-是) + */ + private Boolean isOwner; + /** + * 与产权人关系 + */ + private String relationType; + /** + * 姓名 + */ + private String name; + /** + * 手机号 + */ + private String mobile; + /** + * 证件类型 + */ + private String idType; + /** + * 证件号 + */ + private String idNumber; + /** + * 性别(0-未知,1-男,2-女) + */ + private Integer sex; + /** + * 出生日期 + */ + private LocalDate birthday; + /** + * 附件URL + */ + private String attachmentUrl; + /** + * 认证状态(0-待审核,1-已认证,2-驳回) + */ + private Integer status; + /** + * 驳回原因 + */ + private String rejectReason; + + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java new file mode 100644 index 0000000..45850e8 --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/dal/mysql/memberhouse/MemberHouseMapper.java @@ -0,0 +1,38 @@ +package com.fjrcloud.community.module.community.dal.mysql.memberhouse; + +import com.fjrcloud.community.framework.common.pojo.PageResult; +import com.fjrcloud.community.framework.mybatis.core.mapper.BaseMapperX; +import com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHousePageReqVO; +import com.fjrcloud.community.module.community.dal.dataobject.memberhouse.MemberHouseDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 业主认证信息 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MemberHouseMapper extends BaseMapperX { + + default PageResult selectPage(MemberHousePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MemberHouseDO::getCommunityId, reqVO.getCommunityId()) + .eqIfPresent(MemberHouseDO::getIsOwner, reqVO.getIsOwner()) + .eqIfPresent(MemberHouseDO::getRelationType, reqVO.getRelationType()) + .eqIfPresent(MemberHouseDO::getStatus, reqVO.getStatus()) + .orderByDesc(MemberHouseDO::getId)); + } + + default List selectListByCommunityAndRoom(Long communityId, String buildingNo, String unitNo, String roomNo, String mobile) { + return selectList(new LambdaQueryWrapperX() + .eq(MemberHouseDO::getCommunityId, communityId) + .eq(MemberHouseDO::getBuildingNo, buildingNo) + .eq(MemberHouseDO::getUnitNo, unitNo) + .eq(MemberHouseDO::getRoomNo, roomNo) + .eq(MemberHouseDO::getMobile, mobile)); + } + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/enums/ErrorCodeConstants.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/enums/ErrorCodeConstants.java index d3e5618..1039449 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/enums/ErrorCodeConstants.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/enums/ErrorCodeConstants.java @@ -18,4 +18,14 @@ public interface ErrorCodeConstants { ErrorCode HOUSE_NOT_EXISTS = new ErrorCode(2_001_001_001, "房屋信息主不存在"); ErrorCode HOUSE_IMPORT_LIST_IS_EMPTY = new ErrorCode(2_001_001_002, "导入房屋数据不能为空!"); + + ErrorCode MEMBER_HOUSE_NOT_EXISTS = new ErrorCode(2_002_001_002, "业主认证信息不存在"); + + ErrorCode MEMBER_HOUSE_EXISTS = new ErrorCode(2_002_001_003, "该房屋已存在认证记录,请勿重复提交"); + + ErrorCode MEMBER_HOUSE_AUDITED_NOT_UPDATE = new ErrorCode(2_002_001_004, "已审核通过的认证记录不允许修改"); + + ErrorCode MEMBER_HOUSE_AUDIT_STATUS_ERROR = new ErrorCode(2_002_001_005, "该记录状态不允许进行审核操作"); + + ErrorCode MEMBER_HOUSE_REJECT_REASON_REQUIRED = new ErrorCode(2_002_001_006, "驳回时必须填写驳回原因"); } diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseService.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseService.java index db82e9b..866346b 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseService.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseService.java @@ -5,6 +5,7 @@ import com.fjrcloud.community.framework.common.pojo.PageResult; import com.fjrcloud.community.module.community.controller.admin.house.vo.HouseImportExcelVO; import com.fjrcloud.community.module.community.controller.admin.house.vo.HousePageReqVO; import com.fjrcloud.community.module.community.controller.admin.house.vo.HouseSaveReqVO; +import com.fjrcloud.community.module.community.controller.app.house.vo.HouseTreeNodeVO; import com.fjrcloud.community.module.community.dal.dataobject.house.HouseDO; import javax.validation.Valid; @@ -71,4 +72,12 @@ public interface HouseService { */ ImportResultRespVO importHouseList(List importHouses, boolean isUpdateSupport); + /** + * 获取小区房屋级联树(楼号 - 单元 - 房号) + * + * @param communityId 小区 ID + * @return 房屋树形列表 + */ + List getHouseTreeByCommunityId(Long communityId); + } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseServiceImpl.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseServiceImpl.java index 7521a6f..55bbc38 100644 --- a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseServiceImpl.java +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/house/HouseServiceImpl.java @@ -5,11 +5,13 @@ import cn.hutool.core.util.StrUtil; import com.fjrcloud.community.framework.common.pojo.ImportResultRespVO; import com.fjrcloud.community.framework.common.pojo.PageResult; import com.fjrcloud.community.framework.common.util.object.BeanUtils; +import com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX; import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder; import com.fjrcloud.community.framework.tenant.core.util.TenantUtils; import com.fjrcloud.community.module.community.controller.admin.house.vo.HouseImportExcelVO; import com.fjrcloud.community.module.community.controller.admin.house.vo.HousePageReqVO; import com.fjrcloud.community.module.community.controller.admin.house.vo.HouseSaveReqVO; +import com.fjrcloud.community.module.community.controller.app.house.vo.HouseTreeNodeVO; import com.fjrcloud.community.module.community.dal.dataobject.community.CommunityDO; import com.fjrcloud.community.module.community.dal.dataobject.house.HouseDO; import com.fjrcloud.community.module.community.dal.mysql.community.CommunityMapper; @@ -107,7 +109,7 @@ public class HouseServiceImpl implements HouseService { // 2. 校验导入数据中是否存在重复的房屋标识(小区名称 + 楼号 + 单元号 + 门牌号) Map houseIdentifierCount = new LinkedHashMap<>(); for (HouseImportExcelVO house : importHouses) { - if (StrUtil.isNotBlank(house.getCommunityName()) + if (StrUtil.isNotBlank(house.getCommunityName()) && StrUtil.isNotBlank(house.getBuildingNo()) && StrUtil.isNotBlank(house.getUnitNo()) && StrUtil.isNotBlank(house.getRoomNo())) { @@ -115,7 +117,7 @@ public class HouseServiceImpl implements HouseService { houseIdentifierCount.put(identifier, houseIdentifierCount.getOrDefault(identifier, 0L) + 1); } } - + Set duplicateIdentifiers = houseIdentifierCount.entrySet().stream() .filter(entry -> entry.getValue() > 1) .map(Map.Entry::getKey) @@ -273,4 +275,60 @@ public class HouseServiceImpl implements HouseService { return CollUtil.isNotEmpty(houses) ? houses.get(0) : null; } + @Override + public List getHouseTreeByCommunityId(Long communityId) { + // 1. 仅查询必要的三个层级字段,提升查询效率 + List houses = houseMapper.selectList(new LambdaQueryWrapperX() + .eq(HouseDO::getCommunityId, communityId) + .select(HouseDO::getBuildingNo, HouseDO::getUnitNo, HouseDO::getRoomNo) + .isNotNull(HouseDO::getBuildingNo) + .isNotNull(HouseDO::getRoomNo)); + + if (CollUtil.isEmpty(houses)) { + return Collections.emptyList(); + } + + // 2. 内存聚合:构建 楼号 -> 单元号 -> 房号 的嵌套 Map + Map>> buildingUnitMap = new HashMap<>(); + for (HouseDO house : houses) { + String buildingNo = StrUtil.blankToDefault(house.getBuildingNo(), "其他"); + String unitNo = StrUtil.blankToDefault(house.getUnitNo(), "默认单元"); + String roomNo = house.getRoomNo(); + + buildingUnitMap.computeIfAbsent(buildingNo, k -> new HashMap<>()) + .computeIfAbsent(unitNo, k -> new ArrayList<>()) + .add(roomNo); + } + + // 3. 转换为树形 VO 结构 + List tree = new ArrayList<>(); + buildingUnitMap.keySet().stream().sorted().forEach(buildingNo -> { + HouseTreeNodeVO buildingNode = new HouseTreeNodeVO(); + buildingNode.setValue(buildingNo); + buildingNode.setLabel(buildingNo + "号楼"); + buildingNode.setChildren(new ArrayList<>()); + + Map> unitMap = buildingUnitMap.get(buildingNo); + unitMap.keySet().stream().sorted().forEach(unitNo -> { + HouseTreeNodeVO unitNode = new HouseTreeNodeVO(); + unitNode.setValue(unitNo); + unitNode.setLabel(unitNo + "单元"); + unitNode.setChildren(new ArrayList<>()); + + // 房号去重并排序 + unitMap.get(unitNo).stream().distinct().sorted().forEach(roomNo -> { + HouseTreeNodeVO roomNode = new HouseTreeNodeVO(); + roomNode.setValue(roomNo); + roomNode.setLabel(roomNo); + unitNode.getChildren().add(roomNode); + }); + + buildingNode.getChildren().add(unitNode); + }); + tree.add(buildingNode); + }); + + return tree; + } + } \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java new file mode 100644 index 0000000..8bc360e --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseService.java @@ -0,0 +1,84 @@ +package com.fjrcloud.community.module.community.service.memberhouse; + +import com.fjrcloud.community.framework.common.pojo.PageResult; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHousePageReqVO; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHouseSaveReqVO; +import com.fjrcloud.community.module.community.dal.dataobject.memberhouse.MemberHouseDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 业主认证信息 Service 接口 + * + * @author 芋道源码 + */ +public interface MemberHouseService { + + /** + * 创建业主认证信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMemberHouse(@Valid MemberHouseSaveReqVO createReqVO); + + /** + * 更新业主认证信息 + * + * @param updateReqVO 更新信息 + */ + void updateMemberHouse(@Valid MemberHouseSaveReqVO updateReqVO); + + /** + * 删除业主认证信息 + * + * @param id 编号 + */ + void deleteMemberHouse(Long id); + + /** + * 批量删除业主认证信息 + * + * @param ids 编号 + */ + void deleteMemberHouseListByIds(List ids); + + /** + * 获得业主认证信息 + * + * @param id 编号 + * @return 业主认证信息 + */ + MemberHouseDO getMemberHouse(Long id); + + /** + * 获得业主认证信息分页 + * + * @param pageReqVO 分页查询 + * @return 业主认证信息分页 + */ + PageResult getMemberHousePage(MemberHousePageReqVO pageReqVO); + + /** + * 审核业主认证 + * + * @param id 认证 ID + * @param status 审核状态(1-通过,2-驳回) + * @param rejectReason 驳回原因(仅驳回时必填) + */ + void auditMemberHouse(Long id, Integer status, String rejectReason); + + /** + * 解除绑定(删除认证记录) + * + * @param id 认证 ID + */ + void unbindMemberHouse(Long id); + + /** + * 校验认证是否存在 + */ + MemberHouseDO validateMemberHouseExists(Long id); + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java new file mode 100644 index 0000000..437bcdb --- /dev/null +++ b/fjrcloud-module-community/src/main/java/com/fjrcloud/community/module/community/service/memberhouse/MemberHouseServiceImpl.java @@ -0,0 +1,149 @@ +package com.fjrcloud.community.module.community.service.memberhouse; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.fjrcloud.community.framework.common.pojo.PageResult; +import com.fjrcloud.community.framework.common.util.object.BeanUtils; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHousePageReqVO; +import com.fjrcloud.community.module.community.controller.admin.memberhouse.vo.MemberHouseSaveReqVO; +import com.fjrcloud.community.module.community.dal.dataobject.memberhouse.MemberHouseDO; +import com.fjrcloud.community.module.community.dal.mysql.memberhouse.MemberHouseMapper; +import com.fjrcloud.community.module.community.service.community.CommunityService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.fjrcloud.community.module.community.enums.ErrorCodeConstants.*; + +/** + * 业主认证信息 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +@Slf4j +public class MemberHouseServiceImpl implements MemberHouseService { + + @Resource + private MemberHouseMapper memberHouseMapper; + + @Resource + private CommunityService communityService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createMemberHouse(MemberHouseSaveReqVO createReqVO) { + // 1. 校验小区是否存在 + if (communityService.getCommunity(createReqVO.getCommunityId()) == null) { + throw exception(COMMUNITY_NOT_EXISTS); + } + + // 2. 校验重复认证:同一小区、同一房屋、同一手机号不能重复认证 + List existList = memberHouseMapper.selectListByCommunityAndRoom( + createReqVO.getCommunityId(), + createReqVO.getBuildingNo(), + createReqVO.getUnitNo(), + createReqVO.getRoomNo(), + createReqVO.getMobile()); + if (CollUtil.isNotEmpty(existList)) { + throw exception(MEMBER_HOUSE_EXISTS); + } + + // 3. 插入数据,默认状态为待审核 (0) + MemberHouseDO memberHouse = BeanUtils.toBean(createReqVO, MemberHouseDO.class); + memberHouse.setStatus(0); + memberHouseMapper.insert(memberHouse); + + return memberHouse.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMemberHouse(MemberHouseSaveReqVO updateReqVO) { + // 校验存在 + MemberHouseDO existHouse = validateMemberHouseExists(updateReqVO.getId()); + + // 如果状态不是待审核或驳回,不允许修改基础信息(视业务规则而定) + if (existHouse.getStatus().equals(1)) { + throw exception(MEMBER_HOUSE_AUDITED_NOT_UPDATE); + } + + // 更新 + MemberHouseDO updateObj = BeanUtils.toBean(updateReqVO, MemberHouseDO.class); + memberHouseMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteMemberHouse(Long id) { + // 校验存在 + validateMemberHouseExists(id); + // 删除 + memberHouseMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteMemberHouseListByIds(List ids) { + memberHouseMapper.deleteByIds(ids); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditMemberHouse(Long id, Integer status, String rejectReason) { + // 1. 校验记录存在 + MemberHouseDO house = validateMemberHouseExists(id); + + // 2. 校验状态:只有待审核 (0) 才能进行审核 + if (house.getStatus() != 0) { + throw exception(MEMBER_HOUSE_AUDIT_STATUS_ERROR); + } + + // 3. 如果是驳回,必须填写驳回原因 + if (status == 2 && StrUtil.isBlank(rejectReason)) { + throw exception(MEMBER_HOUSE_REJECT_REASON_REQUIRED); + } + + // 4. 更新审核状态、审核人、审核时间 + MemberHouseDO updateObj = new MemberHouseDO(); + updateObj.setId(id); + updateObj.setStatus(status); + updateObj.setRejectReason(rejectReason); + + memberHouseMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void unbindMemberHouse(Long id) { + // 解除绑定即删除该认证记录 + validateMemberHouseExists(id); + memberHouseMapper.deleteById(id); + } + + @Override + public MemberHouseDO validateMemberHouseExists(Long id) { + MemberHouseDO memberHouse = memberHouseMapper.selectById(id); + if (memberHouse == null) { + throw exception(MEMBER_HOUSE_NOT_EXISTS); + } + return memberHouse; + } + + @Override + public MemberHouseDO getMemberHouse(Long id) { + return memberHouseMapper.selectById(id); + } + + @Override + public PageResult getMemberHousePage(MemberHousePageReqVO pageReqVO) { + return memberHouseMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/fjrcloud-module-community/src/main/resources/mapper/memberhouse/MemberHouseMapper.xml b/fjrcloud-module-community/src/main/resources/mapper/memberhouse/MemberHouseMapper.xml new file mode 100644 index 0000000..2297e74 --- /dev/null +++ b/fjrcloud-module-community/src/main/resources/mapper/memberhouse/MemberHouseMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file