Explorar o código

客人 散客入住功能开发

baiyun hai 1 ano
pai
achega
f3006c157b
Modificáronse 24 ficheiros con 1884 adicións e 0 borrados
  1. 107 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfAreaPermissionsController.java
  2. 106 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfGuestController.java
  3. 114 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfOrderController.java
  4. 50 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/KfAreaPermissions.java
  5. 60 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/KfGuest.java
  6. 104 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/KfOrder.java
  7. 40 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfAreaPermissionsBo.java
  8. 57 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfGuestBo.java
  9. 92 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfOrderBo.java
  10. 67 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfAreaPermissionsVo.java
  11. 85 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfGuestVo.java
  12. 101 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfOrderVo.java
  13. 22 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfAreaPermissionsMapper.java
  14. 15 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfGuestMapper.java
  15. 21 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfOrderMapper.java
  16. 73 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfAreaPermissionsService.java
  17. 69 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfGuestService.java
  18. 70 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java
  19. 181 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfAreaPermissionsServiceImpl.java
  20. 153 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfGuestServiceImpl.java
  21. 164 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java
  22. 38 0
      ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/basics/KfAreaPermissionsMapper.xml
  23. 21 0
      ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/basics/KfGuestMapper.xml
  24. 74 0
      ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/business/KfOrderMapper.xml

+ 107 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfAreaPermissionsController.java

@@ -0,0 +1,107 @@
+package org.dromara.hotel.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.hotel.domain.vo.KfAreaPermissionsVo;
+import org.dromara.hotel.domain.bo.KfAreaPermissionsBo;
+import org.dromara.hotel.service.IKfAreaPermissionsService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客房权限
+ * 前端访问路由地址为:/basics/kfAreaPermissions
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/basics/kfAreaPermissions")
+public class KfAreaPermissionsController extends BaseController {
+
+    private final IKfAreaPermissionsService kfAreaPermissionsService;
+
+    /**
+     * 查询客房权限列表
+     */
+    @SaCheckPermission("basics:kfAreaPermissions:list")
+    @GetMapping("/list")
+    public TableDataInfo<KfAreaPermissionsVo> list(KfAreaPermissionsBo bo, PageQuery pageQuery) {
+        return kfAreaPermissionsService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客房权限列表
+     */
+    @SaCheckPermission("basics:kfAreaPermissions:export")
+    @Log(title = "客房权限", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(KfAreaPermissionsBo bo, HttpServletResponse response) {
+        List<KfAreaPermissionsVo> list = kfAreaPermissionsService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客房权限", KfAreaPermissionsVo.class, response);
+    }
+
+    /**
+     * 获取客房权限详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("basics:kfAreaPermissions:query")
+    @GetMapping("/{id}")
+    public R<KfAreaPermissionsVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(kfAreaPermissionsService.queryById(id));
+    }
+
+    /**
+     * 新增客房权限
+     */
+    @SaCheckPermission("basics:kfAreaPermissions:add")
+    @Log(title = "客房权限", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestParam Long[] areaIds, @RequestParam String[] userIds) {
+        return toAjax(kfAreaPermissionsService.insertBatch(areaIds, userIds));
+    }
+
+
+    /**
+     * 修改客房权限
+     */
+    @SaCheckPermission("basics:kfAreaPermissions:edit")
+    @Log(title = "客房权限", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody KfAreaPermissionsBo bo) {
+        return toAjax(kfAreaPermissionsService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客房权限
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("basics:kfAreaPermissions:remove")
+    @Log(title = "客房权限", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(kfAreaPermissionsService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfGuestController.java

@@ -0,0 +1,106 @@
+package org.dromara.hotel.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.hotel.domain.vo.KfGuestVo;
+import org.dromara.hotel.domain.bo.KfGuestBo;
+import org.dromara.hotel.service.IKfGuestService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 客人管理
+ * 前端访问路由地址为:/basics/kfGuest
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/basics/kfGuest")
+public class KfGuestController extends BaseController {
+
+    private final IKfGuestService kfGuestService;
+
+    /**
+     * 查询客人管理列表
+     */
+    @SaCheckPermission("basics:kfGuest:list")
+    @GetMapping("/list")
+    public TableDataInfo<KfGuestVo> list(KfGuestBo bo, PageQuery pageQuery) {
+        return kfGuestService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出客人管理列表
+     */
+    @SaCheckPermission("basics:kfGuest:export")
+    @Log(title = "客人管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(KfGuestBo bo, HttpServletResponse response) {
+        List<KfGuestVo> list = kfGuestService.queryList(bo);
+        ExcelUtil.exportExcel(list, "客人管理", KfGuestVo.class, response);
+    }
+
+    /**
+     * 获取客人管理详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("basics:kfGuest:query")
+    @GetMapping("/{id}")
+    public R<KfGuestVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(kfGuestService.queryById(id));
+    }
+
+    /**
+     * 新增客人管理
+     */
+    @SaCheckPermission("basics:kfGuest:add")
+    @Log(title = "客人管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody KfGuestBo bo) {
+        return toAjax(kfGuestService.insertByBo(bo));
+    }
+
+    /**
+     * 修改客人管理
+     */
+    @SaCheckPermission("basics:kfGuest:edit")
+    @Log(title = "客人管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody KfGuestBo bo) {
+        return toAjax(kfGuestService.updateByBo(bo));
+    }
+
+    /**
+     * 删除客人管理
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("basics:kfGuest:remove")
+    @Log(title = "客人管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(kfGuestService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 114 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfOrderController.java

@@ -0,0 +1,114 @@
+package org.dromara.hotel.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.hotel.domain.vo.KfOrderVo;
+import org.dromara.hotel.domain.bo.KfOrderBo;
+import org.dromara.hotel.service.IKfOrderService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 散客入住
+ * 前端访问路由地址为:/business/guestOrder
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/guestOrder")
+public class KfOrderController extends BaseController {
+
+    private final IKfOrderService kfOrderService;
+
+    /**
+     * 查询散客入住列表
+     */
+    @SaCheckPermission("business:guestOrder:list")
+    @GetMapping("/list")
+    public TableDataInfo<KfOrderVo> list(KfOrderBo bo, PageQuery pageQuery) {
+        return kfOrderService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 根据 guestName 查询散客入住列表
+     */
+    @SaCheckPermission("business:guestOrder:list")
+    @GetMapping("/queryListByGuestName")
+    public R<List<KfOrderVo>> queryListByGuestName(@RequestParam String guestName) {
+        return R.ok(kfOrderService.queryListByGuestName(guestName));
+    }
+    /**
+     * 导出散客入住列表
+     */
+    @SaCheckPermission("business:guestOrder:export")
+    @Log(title = "散客入住", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(KfOrderBo bo, HttpServletResponse response) {
+        List<KfOrderVo> list = kfOrderService.queryList(bo);
+        ExcelUtil.exportExcel(list, "散客入住", KfOrderVo.class, response);
+    }
+
+    /**
+     * 获取散客入住详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("business:guestOrder:query")
+    @GetMapping("/{id}")
+    public R<KfOrderVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(kfOrderService.queryById(id));
+    }
+
+    /**
+     * 新增散客入住
+     */
+    @SaCheckPermission("business:guestOrder:add")
+    @Log(title = "散客入住", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody KfOrderBo bo) {
+        return toAjax(kfOrderService.insertByBo(bo));
+    }
+
+    /**
+     * 修改散客入住
+     */
+    @SaCheckPermission("business:guestOrder:edit")
+    @Log(title = "散客入住", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody KfOrderBo bo) {
+        return toAjax(kfOrderService.updateByBo(bo));
+    }
+
+    /**
+     * 删除散客入住
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("business:guestOrder:remove")
+    @Log(title = "散客入住", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(kfOrderService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 50 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/KfAreaPermissions.java

@@ -0,0 +1,50 @@
+package org.dromara.hotel.domain;
+
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+
+/**
+ * 客房权限对象 t_kf_area_permissions
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_kf_area_permissions")
+public class KfAreaPermissions extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+    private String phone;
+    /**
+     * 区域ID
+     */
+    private Long areaId;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+}
+

+ 60 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/KfGuest.java

@@ -0,0 +1,60 @@
+package org.dromara.hotel.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 客人管理对象 t_kf_guest
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_kf_guest")
+public class KfGuest extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 原始数据ID
+     */
+    private String otherId;
+
+
+}

+ 104 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/KfOrder.java

@@ -0,0 +1,104 @@
+package org.dromara.hotel.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 散客入住对象 t_kf_order
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_kf_order")
+public class KfOrder extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客人ID
+     */
+    private Long guestId;
+
+    /**
+     * 客人姓名
+     */
+    private String guestName;
+
+    /**
+     * 客团ID
+     */
+    private Long teamId;
+
+    /**
+     * 客团名称
+     */
+    private String teamName;
+
+    /**
+     * 房间编号
+     */
+    private String roomCode;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 入住时间
+     */
+    private Date startTime;
+
+    /**
+     * 退住时间
+     */
+    private Date endTime;
+
+    /**
+     * 订单类型
+     */
+    private String orderType;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+
+    /**
+     * 应收金额
+     */
+    private Long planMoney;
+
+    /**
+     * 实收金额
+     */
+    private Long actualMoney;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 40 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfAreaPermissionsBo.java

@@ -0,0 +1,40 @@
+package org.dromara.hotel.domain.bo;
+
+import org.dromara.hotel.domain.KfAreaPermissions;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 客房权限业务对象 t_kf_area_permissions
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = KfAreaPermissions.class, reverseConvertGenerate = false)
+public class KfAreaPermissionsBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+    private String realName;
+
+    /**
+     * 区域ID
+     */
+    private Long areaId;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfGuestBo.java

@@ -0,0 +1,57 @@
+package org.dromara.hotel.domain.bo;
+
+import org.dromara.hotel.domain.KfGuest;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 客人管理业务对象 t_kf_guest
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = KfGuest.class, reverseConvertGenerate = false)
+public class KfGuestBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 姓名
+     */
+    @NotBlank(message = "姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 性别
+     */
+    @NotBlank(message = "性别不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String sex;
+
+    /**
+     * 身份证号
+     */
+    @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String idCard;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 92 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfOrderBo.java

@@ -0,0 +1,92 @@
+package org.dromara.hotel.domain.bo;
+
+import org.dromara.hotel.domain.KfOrder;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 散客入住业务对象 t_kf_order
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = KfOrder.class, reverseConvertGenerate = false)
+public class KfOrderBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 客人ID
+     */
+    @NotNull(message = "客人ID不能为空", groups = { AddGroup.class })
+    private Long guestId;
+
+    /**
+     * 客人姓名
+     */
+    private String guestName;
+
+    /**
+     * 客团名称
+     */
+    private String teamName;
+
+    /**
+     * 房间编号
+     */
+    @NotBlank(message = "房间编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String roomCode;
+
+    /**
+     * 房间名称
+     */
+    private String roomName;
+
+    /**
+     * 入住时间
+     */
+    @NotNull(message = "入住时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date startTime;
+
+    /**
+     * 退住时间
+     */
+    @NotNull(message = "退住时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date endTime;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+    private String[] orderStatusList;
+
+    /**
+     * 应收金额
+     */
+    private Long planMoney;
+
+    /**
+     * 实收金额
+     */
+    private Long actualMoney;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfAreaPermissionsVo.java

@@ -0,0 +1,67 @@
+package org.dromara.hotel.domain.vo;
+
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
+import org.dromara.hotel.domain.KfAreaPermissions;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客房权限视图对象 t_kf_area_permissions
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = KfAreaPermissions.class)
+public class KfAreaPermissionsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    @ExcelProperty(value = "用户ID")
+    private String userId;
+    private String realName;
+    private String deptName;
+    private String phone;
+
+    /**
+     * 区域ID
+     */
+    @ExcelProperty(value = "区域ID")
+    private Long areaId;
+
+    /**
+     * 创建人
+     */
+    @ExcelProperty(value = "创建人")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+}

+ 85 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfGuestVo.java

@@ -0,0 +1,85 @@
+package org.dromara.hotel.domain.vo;
+
+import org.dromara.hotel.domain.KfGuest;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 客人管理视图对象 t_kf_guest
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = KfGuest.class)
+public class KfGuestVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 姓名
+     */
+    @ExcelProperty(value = "姓名")
+    private String name;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_user_sex")
+    private String sex;
+
+    /**
+     * 身份证号
+     */
+    @ExcelProperty(value = "身份证号")
+    private String idCard;
+
+    /**
+     * 手机号
+     */
+    @ExcelProperty(value = "手机号")
+    private String phone;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 原始数据ID
+     */
+    private String otherId;
+    /**
+     * 创建人
+     */
+    @ExcelProperty(value = "创建人")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+}

+ 101 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfOrderVo.java

@@ -0,0 +1,101 @@
+package org.dromara.hotel.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.hotel.domain.KfOrder;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 散客入住视图对象 t_kf_order
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = KfOrder.class)
+public class KfOrderVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 客人姓名
+     */
+    private Long guestId;
+    @ExcelProperty(value = "客人姓名")
+    private String guestName;
+    @ExcelProperty(value = "手机号码")
+    private String phone;
+    @ExcelProperty(value = "身份证号")
+    private String idCard;
+    @ExcelProperty(value = "性别")
+    private String sex;
+    /**
+     * 客团名称
+     */
+    @ExcelProperty(value = "客团名称")
+    private String teamName;
+
+    /**
+     * 房间名称
+     */
+    @ExcelProperty(value = "房间名称")
+    private String roomName;
+
+    /**
+     * 入住时间
+     */
+    @ExcelProperty(value = "入住时间")
+    private Date startTime;
+
+    /**
+     * 退住时间
+     */
+    @ExcelProperty(value = "退住时间")
+    private Date endTime;
+
+    /**
+     * 订单状态
+     */
+    @ExcelProperty(value = "订单状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "kf_order_status")
+    private String orderStatus;
+
+    /**
+     * 应收金额
+     */
+    @ExcelProperty(value = "应收金额")
+    private Long planMoney;
+
+    /**
+     * 实收金额
+     */
+    @ExcelProperty(value = "实收金额")
+    private Long actualMoney;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+}

+ 22 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfAreaPermissionsMapper.java

@@ -0,0 +1,22 @@
+package org.dromara.hotel.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.hotel.domain.KfAreaPermissions;
+import org.dromara.hotel.domain.bo.KfAreaPermissionsBo;
+import org.dromara.hotel.domain.vo.KfAreaPermissionsVo;
+
+/**
+ * 客房权限Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+public interface KfAreaPermissionsMapper extends BaseMapperPlus<KfAreaPermissions, KfAreaPermissionsVo> {
+
+    /**
+     * 分页查询
+     */
+    Page<KfAreaPermissionsVo> selectByBo(Page<KfAreaPermissions> page, @Param("bo") KfAreaPermissionsBo bo);
+}

+ 15 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfGuestMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.hotel.mapper;
+
+import org.dromara.hotel.domain.KfGuest;
+import org.dromara.hotel.domain.vo.KfGuestVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 客人管理Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+public interface KfGuestMapper extends BaseMapperPlus<KfGuest, KfGuestVo> {
+
+}

+ 21 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfOrderMapper.java

@@ -0,0 +1,21 @@
+package org.dromara.hotel.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.hotel.domain.KfOrder;
+import org.dromara.hotel.domain.bo.KfOrderBo;
+import org.dromara.hotel.domain.vo.KfOrderVo;
+
+import java.util.List;
+
+/**
+ * 散客入住Mapper接口
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+public interface KfOrderMapper extends BaseMapperPlus<KfOrder, KfOrderVo> {
+    Page<KfOrderVo> selectPageByBo(Page<KfOrder> page, KfOrderBo bo);
+
+    List<KfOrderVo> queryListByGuestName(String guestName);
+}

+ 73 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfAreaPermissionsService.java

@@ -0,0 +1,73 @@
+package org.dromara.hotel.service;
+
+import org.dromara.hotel.domain.vo.KfAreaPermissionsVo;
+import org.dromara.hotel.domain.bo.KfAreaPermissionsBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 客房权限Service接口
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+public interface IKfAreaPermissionsService {
+
+    /**
+     * 查询客房权限
+     *
+     * @param id 主键
+     * @return 客房权限
+     */
+    KfAreaPermissionsVo queryById(Long id);
+
+    /**
+     * 分页查询客房权限列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客房权限分页列表
+     */
+    TableDataInfo<KfAreaPermissionsVo> queryPageList(KfAreaPermissionsBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客房权限列表
+     *
+     * @param bo 查询条件
+     * @return 客房权限列表
+     */
+    List<KfAreaPermissionsVo> queryList(KfAreaPermissionsBo bo);
+
+    /**
+     * 新增客房权限
+     *
+     * @param bo 客房权限
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(KfAreaPermissionsBo bo);
+
+    Boolean insertBatch(Long[] areaIds, String[] userIds);
+
+    /**
+     * 修改客房权限
+     *
+     * @param bo 客房权限
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(KfAreaPermissionsBo bo);
+
+    /**
+     * 校验并批量删除客房权限信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<Map<String, Object>> groupByAreaIds(Long[] areaIds);
+}

+ 69 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfGuestService.java

@@ -0,0 +1,69 @@
+package org.dromara.hotel.service;
+
+import org.dromara.hotel.domain.KfGuest;
+import org.dromara.hotel.domain.vo.KfGuestVo;
+import org.dromara.hotel.domain.bo.KfGuestBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 客人管理Service接口
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+public interface IKfGuestService {
+
+    /**
+     * 查询客人管理
+     *
+     * @param id 主键
+     * @return 客人管理
+     */
+    KfGuestVo queryById(Long id);
+
+    /**
+     * 分页查询客人管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客人管理分页列表
+     */
+    TableDataInfo<KfGuestVo> queryPageList(KfGuestBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的客人管理列表
+     *
+     * @param bo 查询条件
+     * @return 客人管理列表
+     */
+    List<KfGuestVo> queryList(KfGuestBo bo);
+
+    /**
+     * 新增客人管理
+     *
+     * @param bo 客人管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(KfGuestBo bo);
+
+    /**
+     * 修改客人管理
+     *
+     * @param bo 客人管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(KfGuestBo bo);
+
+    /**
+     * 校验并批量删除客人管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java

@@ -0,0 +1,70 @@
+package org.dromara.hotel.service;
+
+import org.dromara.hotel.domain.KfOrder;
+import org.dromara.hotel.domain.vo.KfOrderVo;
+import org.dromara.hotel.domain.bo.KfOrderBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 散客入住Service接口
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+public interface IKfOrderService {
+
+    /**
+     * 查询散客入住
+     *
+     * @param id 主键
+     * @return 散客入住
+     */
+    KfOrderVo queryById(Long id);
+
+    /**
+     * 分页查询散客入住列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 散客入住分页列表
+     */
+    TableDataInfo<KfOrderVo> queryPageList(KfOrderBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的散客入住列表
+     *
+     * @param bo 查询条件
+     * @return 散客入住列表
+     */
+    List<KfOrderVo> queryList(KfOrderBo bo);
+
+    List<KfOrderVo> queryListByGuestName(String guestName);
+    /**
+     * 新增散客入住
+     *
+     * @param bo 散客入住
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(KfOrderBo bo);
+
+    /**
+     * 修改散客入住
+     *
+     * @param bo 散客入住
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(KfOrderBo bo);
+
+    /**
+     * 校验并批量删除散客入住信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 181 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfAreaPermissionsServiceImpl.java

@@ -0,0 +1,181 @@
+package org.dromara.hotel.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.interceptor.MybatisDecryptInterceptor;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.hotel.domain.bo.KfAreaPermissionsBo;
+import org.dromara.hotel.domain.vo.KfAreaPermissionsVo;
+import org.dromara.hotel.domain.KfAreaPermissions;
+import org.dromara.hotel.mapper.KfAreaPermissionsMapper;
+import org.dromara.hotel.service.IKfAreaPermissionsService;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 客房权限Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-11-12
+ */
+@RequiredArgsConstructor
+@Service
+public class KfAreaPermissionsServiceImpl implements IKfAreaPermissionsService {
+
+    private final KfAreaPermissionsMapper baseMapper;
+
+    /**
+     * 查询客房权限
+     *
+     * @param id 主键
+     * @return 客房权限
+     */
+    @Override
+    public KfAreaPermissionsVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询客房权限列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客房权限分页列表
+     */
+    @Override
+    public TableDataInfo<KfAreaPermissionsVo> queryPageList(KfAreaPermissionsBo bo, PageQuery pageQuery) {
+        Page<KfAreaPermissionsVo> result = baseMapper.selectByBo(pageQuery.build(), bo);
+        //返回数据解密
+        MybatisDecryptInterceptor dencrypt = SpringUtils.getBean(MybatisDecryptInterceptor.class);
+        result.getRecords().stream().forEach(item -> {
+            item.setPhone(dencrypt.decrypt(item.getPhone()));
+        });
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客房权限列表
+     *
+     * @param bo 查询条件
+     * @return 客房权限列表
+     */
+    @Override
+    public List<KfAreaPermissionsVo> queryList(KfAreaPermissionsBo bo) {
+        LambdaQueryWrapper<KfAreaPermissions> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<KfAreaPermissions> buildQueryWrapper(KfAreaPermissionsBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KfAreaPermissions> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getAreaId() != null, KfAreaPermissions::getAreaId, bo.getAreaId());
+        return lqw;
+    }
+
+    private QueryWrapper<KfAreaPermissions> buildQueryWrapper(KfAreaPermissionsBo bo,String tableAlias) {
+        QueryWrapper<KfAreaPermissions> lqw = new QueryWrapper<>();
+        String columnPrefix = "";
+        if(StringUtils.isNotBlank(tableAlias)){
+            columnPrefix = tableAlias + ".";
+        }
+        lqw.eq(bo.getAreaId() != null, columnPrefix+"area_id", bo.getAreaId());
+        return lqw;
+    }
+
+    /**
+     * 新增客房权限
+     *
+     * @param bo 客房权限
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(KfAreaPermissionsBo bo) {
+        KfAreaPermissions add = MapstructUtils.convert(bo, KfAreaPermissions.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean insertBatch(Long[] areaIds, String[] userIds) {
+        List<KfAreaPermissions> permissionsList = new ArrayList<>();
+
+        // 校验输入参数
+        if (areaIds == null || userIds == null || areaIds.length == 0 || userIds.length == 0) {
+            throw new IllegalArgumentException("areaIds and userIds must not be null or empty");
+        }
+        Map<Long, String> resMap = groupByAreaIds(areaIds).stream()
+            .collect(Collectors.toMap(map -> Long.parseLong(map.get("area_id").toString()), map -> map.get("user_id").toString()));
+        // 构建权限对象列表
+        for (Long areaId : areaIds) {
+            String dbUserIds = resMap.get(areaId);
+            for (String userId : userIds) {
+                if (dbUserIds == null || !dbUserIds.contains(userId)) {
+                    KfAreaPermissions permissions = new KfAreaPermissions();
+                    permissions.setAreaId(areaId);
+                    permissions.setUserId(userId);
+                    permissionsList.add(permissions);
+                }
+            }
+        }
+
+        boolean flag = baseMapper.insertBatch(permissionsList);
+        return flag;
+    }
+
+    /**
+     * 修改客房权限
+     *
+     * @param bo 客房权限
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(KfAreaPermissionsBo bo) {
+        KfAreaPermissions update = MapstructUtils.convert(bo, KfAreaPermissions.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(KfAreaPermissions entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除客房权限信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> groupByAreaIds(Long[] areaIds) {
+        QueryWrapper<KfAreaPermissions> qw = new QueryWrapper<>();
+        qw.select("area_id", "group_concat(user_id) as user_id");
+        qw.in("area_id", areaIds);
+        qw.groupBy("area_id");
+        return baseMapper.selectMaps(qw);
+    }
+}

+ 153 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfGuestServiceImpl.java

@@ -0,0 +1,153 @@
+package org.dromara.hotel.service.impl;
+
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.hotel.domain.bo.KfGuestBo;
+import org.dromara.hotel.domain.vo.KfGuestVo;
+import org.dromara.hotel.domain.KfGuest;
+import org.dromara.hotel.mapper.KfGuestMapper;
+import org.dromara.hotel.service.IKfGuestService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 客人管理Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-11-11
+ */
+@RequiredArgsConstructor
+@Service
+public class KfGuestServiceImpl implements IKfGuestService {
+
+    private final KfGuestMapper baseMapper;
+
+    /**
+     * 查询客人管理
+     *
+     * @param id 主键
+     * @return 客人管理
+     */
+    @Override
+    public KfGuestVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询客人管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 客人管理分页列表
+     */
+    @Override
+    public TableDataInfo<KfGuestVo> queryPageList(KfGuestBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<KfGuest> lqw = buildQueryWrapper(bo);
+        Page<KfGuestVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的客人管理列表
+     *
+     * @param bo 查询条件
+     * @return 客人管理列表
+     */
+    @Override
+    public List<KfGuestVo> queryList(KfGuestBo bo) {
+        LambdaQueryWrapper<KfGuest> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<KfGuest> buildQueryWrapper(KfGuestBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KfGuest> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getName()), KfGuest::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), KfGuest::getIdCard, bo.getIdCard());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), KfGuest::getPhone, bo.getPhone());
+        return lqw;
+    }
+
+    private QueryWrapper<KfGuest> buildQueryWrapper(KfGuestBo bo,String tableAlias) {
+        QueryWrapper<KfGuest> lqw = new QueryWrapper<>();
+        String columnPrefix = "";
+        if(StringUtils.isNotBlank(tableAlias)){
+            columnPrefix = tableAlias + ".";
+        }
+        lqw.like(StringUtils.isNotBlank(bo.getName()), columnPrefix+"name", bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), columnPrefix+"id_card", bo.getIdCard());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), columnPrefix+"phone", bo.getPhone());
+        return lqw;
+    }
+
+    /**
+     * 新增客人管理
+     *
+     * @param bo 客人管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(KfGuestBo bo) {
+        KfGuest add = MapstructUtils.convert(bo, KfGuest.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改客人管理
+     *
+     * @param bo 客人管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(KfGuestBo bo) {
+        KfGuest update = MapstructUtils.convert(bo, KfGuest.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(KfGuest entity){
+        // 身份证号、手机号不允许重复
+        if(StringUtils.isNotBlank(entity.getIdCard()) || StringUtils.isNotBlank(entity.getPhone())){
+            LambdaQueryWrapper<KfGuest> lqw = Wrappers.lambdaQuery();
+            lqw.and(StringUtils.isNotBlank(entity.getIdCard()), qw -> qw.eq(KfGuest::getIdCard, entity.getIdCard()).or().eq(KfGuest::getPhone, entity.getPhone()));
+            lqw.ne(entity.getId() != null, KfGuest::getId, entity.getId());
+            if(baseMapper.selectCount(lqw) > 0){
+                throw new ServiceException("身份证号或手机号已存在!");
+            }
+        }
+    }
+
+    /**
+     * 校验并批量删除客人管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 164 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java

@@ -0,0 +1,164 @@
+package org.dromara.hotel.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.hotel.domain.bo.KfOrderBo;
+import org.dromara.hotel.domain.vo.KfOrderVo;
+import org.dromara.hotel.domain.KfOrder;
+import org.dromara.hotel.mapper.KfOrderMapper;
+import org.dromara.hotel.service.IKfOrderService;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 散客入住Service业务层处理
+ *
+ * @author LionLi
+ * @date 2024-11-13
+ */
+@RequiredArgsConstructor
+@Service
+public class KfOrderServiceImpl implements IKfOrderService {
+
+    private final KfOrderMapper baseMapper;
+
+    /**
+     * 查询散客入住
+     *
+     * @param id 主键
+     * @return 散客入住
+     */
+    @Override
+    public KfOrderVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询散客入住列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 散客入住分页列表
+     */
+    @Override
+    public TableDataInfo<KfOrderVo> queryPageList(KfOrderBo bo, PageQuery pageQuery) {
+        Page<KfOrderVo> result = baseMapper.selectPageByBo(pageQuery.build(), bo);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的散客入住列表
+     *
+     * @param bo 查询条件
+     * @return 散客入住列表
+     */
+    @Override
+    public List<KfOrderVo> queryList(KfOrderBo bo) {
+        LambdaQueryWrapper<KfOrder> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    /**
+     * 根据 guestName 查询散客入住列表
+     *
+     * @param guestName 散客入住
+     * @return 散客入住列表
+     */
+    @Override
+    public List<KfOrderVo> queryListByGuestName(String guestName) {
+        return baseMapper.queryListByGuestName(guestName);
+    }
+
+    private LambdaQueryWrapper<KfOrder> buildQueryWrapper(KfOrderBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<KfOrder> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getGuestName()), KfOrder::getGuestName, bo.getGuestName());
+        lqw.like(StringUtils.isNotBlank(bo.getTeamName()), KfOrder::getTeamName, bo.getTeamName());
+        lqw.like(StringUtils.isNotBlank(bo.getRoomName()), KfOrder::getRoomName, bo.getRoomName());
+        lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null,
+            KfOrder::getStartTime ,params.get("beginStartTime"), params.get("endStartTime"));
+        if(StringUtils.isNotBlank(bo.getOrderStatus())){
+            lqw.in(KfOrder::getOrderStatus, bo.getOrderStatus().split(","));
+        }
+        return lqw;
+    }
+
+    private QueryWrapper<KfOrder> buildQueryWrapper(KfOrderBo bo,String tableAlias) {
+        QueryWrapper<KfOrder> lqw = new QueryWrapper<>();
+        Map<String, Object> params = bo.getParams();
+        String columnPrefix = "";
+        if(StringUtils.isNotBlank(tableAlias)){
+            columnPrefix = tableAlias + ".";
+        }
+        lqw.like(StringUtils.isNotBlank(bo.getGuestName()), columnPrefix+"guest_name", bo.getGuestName());
+        lqw.like(StringUtils.isNotBlank(bo.getTeamName()), columnPrefix+"team_name", bo.getTeamName());
+        lqw.like(StringUtils.isNotBlank(bo.getRoomName()), columnPrefix+"room_name", bo.getRoomName());
+        lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null,
+        columnPrefix+"start_time" ,params.get("beginStartTime"), params.get("endStartTime"));
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), columnPrefix+"order_status", bo.getOrderStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增散客入住
+     *
+     * @param bo 散客入住
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(KfOrderBo bo) {
+        KfOrder add = MapstructUtils.convert(bo, KfOrder.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改散客入住
+     *
+     * @param bo 散客入住
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(KfOrderBo bo) {
+        KfOrder update = MapstructUtils.convert(bo, KfOrder.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(KfOrder entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除散客入住信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 38 - 0
ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/basics/KfAreaPermissionsMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.hotel.mapper.KfAreaPermissionsMapper">
+
+    <resultMap type="org.dromara.hotel.domain.KfAreaPermissions" id="KfAreaPermissionsResult">
+            <result property="id"    column="id"    />
+            <result property="userId"    column="user_id"    />
+            <result property="phone"    column="phone"    />
+            <result property="areaId"    column="area_id"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+            <result property="createDept"    column="create_dept"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <select id="selectByBo" resultType="org.dromara.hotel.domain.vo.KfAreaPermissionsVo">
+        select p.id,p.user_id,p.area_id,p.create_by,p.create_time,p.update_by,p.update_time,p.tenant_id
+             , u.real_name as realName,d.dept_name as deptName,u.phone
+            from t_kf_area_permissions p
+        left join t_sys_user u on p.user_id = u.user_id
+        left join t_sys_dept d on u.dept_id = d.dept_id
+        <where>
+            <if test="bo.areaId != null and bo.areaId != ''">
+                and p.area_id = #{bo.areaId}
+            </if>
+            <if test="bo.realName != null and bo.realName != ''">
+                and u.real_name like concat('%', #{bo.realName}, '%')
+            </if>
+            and p.del_flag = 0
+        </where>
+        order by p.create_time desc
+    </select>
+</mapper>

+ 21 - 0
ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/basics/KfGuestMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.hotel.mapper.KfGuestMapper">
+
+    <resultMap type="org.dromara.hotel.domain.KfGuest" id="KfGuestResult">
+            <result property="id"    column="id"    />
+            <result property="name"    column="name"    />
+            <result property="sex"    column="sex"    />
+            <result property="idCard"    column="id_card"    />
+            <result property="phone"    column="phone"    />
+            <result property="remark"    column="remark"    />
+            <result property="otherId"    column="other_id"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+    </resultMap>
+</mapper>

+ 74 - 0
ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/business/KfOrderMapper.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.hotel.mapper.KfOrderMapper">
+
+    <resultMap type="org.dromara.hotel.domain.KfOrder" id="KfOrderResult">
+            <result property="id"    column="id"    />
+            <result property="guestId"    column="guest_id"    />
+            <result property="guestName"    column="guest_name"    />
+            <result property="teamId"    column="team_id"    />
+            <result property="teamName"    column="team_name"    />
+            <result property="roomCode"    column="room_code"    />
+            <result property="roomName"    column="room_name"    />
+            <result property="startTime"    column="start_time"    />
+            <result property="endTime"    column="end_time"    />
+            <result property="orderType"    column="order_type"    />
+            <result property="orderStatus"    column="order_status"    />
+            <result property="planMoney"    column="plan_money"    />
+            <result property="actualMoney"    column="actual_money"    />
+            <result property="remark"    column="remark"    />
+            <result property="createBy"    column="create_by"    />
+            <result property="createTime"    column="create_time"    />
+            <result property="updateBy"    column="update_by"    />
+            <result property="updateTime"    column="update_time"    />
+            <result property="createDept"    column="create_dept"    />
+            <result property="tenantId"    column="tenant_id"    />
+            <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <select id="selectPageByBo" resultType="org.dromara.hotel.domain.vo.KfOrderVo">
+        select
+        o.id,o.guest_id,g.name as guestName,o.team_id,o.team_name,o.room_code,o.room_name,o.start_time,o.end_time
+             ,o.order_status,o.plan_money,o.actual_money,o.remark,g.phone,g.sex,g.id_card as idCard from t_kf_order o
+        left join
+        t_kf_guest g on o.guest_id = g.id
+        <where>
+            o.del_flag = '0'
+            <if test="bo.guestName != null and bo.guestName != ''">
+                and g.name like concat('%', #{bo.guestName}, '%')
+            </if>
+            <if test="bo.teamName != null and bo.teamName != ''">
+                and o.team_name like concat('%', #{bo.teamName}, '%')
+            </if>
+            <if test="bo.roomName != null and bo.roomName != ''">
+                and o.room_name like concat('%', #{bo.roomName}, '%')
+            </if>
+            <if test="bo.orderStatusList != null and bo.orderStatusList.length > 0">
+                and o.order_status in
+                <foreach collection="bo.orderStatusList" item="orderStatus" open="(" separator="," close=")">
+                    #{orderStatus}
+                </foreach>
+            </if>
+            <if test="bo.params != null and bo.params.size() > 0">
+                and o.start_time between #{bo.params.beginStartTime} and #{bo.params.endStartTime}
+            </if>
+        order by o.create_time desc
+        </where>
+    </select>
+
+    <select id="queryListByGuestName" resultType="org.dromara.hotel.domain.vo.KfOrderVo">
+        select g.id as guestId,
+            concat_ws(' | ',g.name, g.phone, g.id_card, CASE o.order_status
+            WHEN '1' THEN '当前已预定'
+            WHEN '3' THEN '当前已入住'
+            else ''
+            END) AS guestName
+            from t_kf_guest g left join t_kf_order o on g.id = o.guest_id and o.order_status in ('1','3')
+            <where>
+                g.del_flag = '0'
+                and g.name like concat('%', #{guestName}, '%')
+            </where>
+    </select>
+</mapper>