فهرست منبع

1、修改系统通知排序问题
2、优化统计报表接口
3、编写IC卡

Bingo 3 سال پیش
والد
کامیت
cecaaf9cb7
37فایلهای تغییر یافته به همراه1311 افزوده شده و 148 حذف شده
  1. 11 0
      pom.xml
  2. 2 1
      src/main/java/com/chuanghai/ihotel/common/exception/BizCodeEnume.java
  3. 35 0
      src/main/java/com/chuanghai/ihotel/config/JacksonConfig.java
  4. 33 10
      src/main/java/com/chuanghai/ihotel/controller/ConditionController.java
  5. 42 7
      src/main/java/com/chuanghai/ihotel/controller/HotelAdminController.java
  6. 1 1
      src/main/java/com/chuanghai/ihotel/controller/HotelOrderController.java
  7. 8 11
      src/main/java/com/chuanghai/ihotel/controller/RoomRealtimeStatuController.java
  8. 1 17
      src/main/java/com/chuanghai/ihotel/controller/StatisticalReportController.java
  9. 7 4
      src/main/java/com/chuanghai/ihotel/controller/request/HotelICRequest.java
  10. 2 2
      src/main/java/com/chuanghai/ihotel/controller/request/OrderQueryRequest.java
  11. 2 2
      src/main/java/com/chuanghai/ihotel/controller/request/StatisticalReportRequest.java
  12. 16 0
      src/main/java/com/chuanghai/ihotel/controller/request/StatuIdRequest.java
  13. 6 1
      src/main/java/com/chuanghai/ihotel/entity/HotelAdminEntity.java
  14. 3 0
      src/main/java/com/chuanghai/ihotel/entity/HotelICEntity.java
  15. 1 1
      src/main/java/com/chuanghai/ihotel/entity/StatisticalReportEntity.java
  16. 4 2
      src/main/java/com/chuanghai/ihotel/service/HotelAdminService.java
  17. 4 2
      src/main/java/com/chuanghai/ihotel/service/RoomRealtimeStatuService.java
  18. 2 0
      src/main/java/com/chuanghai/ihotel/service/RoomService.java
  19. 1 2
      src/main/java/com/chuanghai/ihotel/service/StatisticalReportService.java
  20. 34 8
      src/main/java/com/chuanghai/ihotel/service/impl/HotelAdminServiceImpl.java
  21. 5 2
      src/main/java/com/chuanghai/ihotel/service/impl/HotelFingerprintServiceImpl.java
  22. 20 3
      src/main/java/com/chuanghai/ihotel/service/impl/HotelICServiceImpl.java
  23. 1 1
      src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderBillServiceImpl.java
  24. 137 18
      src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderServiceImpl.java
  25. 2 2
      src/main/java/com/chuanghai/ihotel/service/impl/HotelStaffServiceImpl.java
  26. 29 11
      src/main/java/com/chuanghai/ihotel/service/impl/RoomRealtimeStatuServiceImpl.java
  27. 16 0
      src/main/java/com/chuanghai/ihotel/service/impl/RoomServiceImpl.java
  28. 1 1
      src/main/java/com/chuanghai/ihotel/service/impl/RoomTypeServiceImpl.java
  29. 14 32
      src/main/java/com/chuanghai/ihotel/service/impl/StatisticalReportServiceImpl.java
  30. 778 0
      src/main/java/com/chuanghai/ihotel/util/CellStyleModel.java
  31. 2 0
      src/main/java/com/chuanghai/ihotel/util/RSAUtils.java
  32. 19 0
      src/main/java/com/chuanghai/ihotel/vo/AdminOrderIndexVO.java
  33. 57 0
      src/main/java/com/chuanghai/ihotel/vo/HotelAdminVO.java
  34. 6 6
      src/main/java/com/chuanghai/ihotel/vo/HotelAndBillVO.java
  35. 4 0
      src/main/java/com/chuanghai/ihotel/vo/LoginUserVO.java
  36. 3 0
      src/main/resources/application.yml
  37. 2 1
      src/main/resources/mapper/ihotel/HotelAdminDao.xml

+ 11 - 0
pom.xml

@@ -131,6 +131,17 @@
             <artifactId>fastjson</artifactId>
             <version>1.2.57</version>
         </dependency>
+<!-- 后端校验 -->
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>2.0.1.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.6.6</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 2 - 1
src/main/java/com/chuanghai/ihotel/common/exception/BizCodeEnume.java

@@ -35,7 +35,8 @@ public enum BizCodeEnume {
     DATA_NOT_EXIST(16000, "数据不存在"),
     FILE_IS_NOT_EXIT(16006, "临时文件不存在"),
     FILE_UPLOAD_ERROR(16007, "文件上传失败"),
-    FILE_IS_TOO_BIG(16008, "文件太大");
+    FILE_IS_TOO_BIG(16008, "文件太大"),
+    DATE_ERROR(16009, "只能关闭当天房间");
 
     private int code;
     private String msg;

+ 35 - 0
src/main/java/com/chuanghai/ihotel/config/JacksonConfig.java

@@ -0,0 +1,35 @@
+package com.chuanghai.ihotel.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+
+/**
+ * @Author: binguo
+ * @Date: 2022/12/19 星期一 12:26
+ * @Description: 解决前端Long类型数据失真问题
+ * @Version: 1.0
+ */
+@Configuration
+public class JacksonConfig {
+
+    @Bean
+    @Primary
+    @ConditionalOnMissingBean(ObjectMapper.class)
+    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
+        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
+
+        // 全局配置序列化返回 JSON 处理
+        SimpleModule simpleModule = new SimpleModule();
+        //JSON Long ==> String
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+        return objectMapper;
+    }
+
+}

+ 33 - 10
src/main/java/com/chuanghai/ihotel/controller/ConditionController.java

@@ -5,12 +5,10 @@ import com.chuanghai.ihotel.common.utils.CommonResult;
 import com.chuanghai.ihotel.common.utils.PageParam;
 import com.chuanghai.ihotel.common.utils.PageUtils;
 import com.chuanghai.ihotel.controller.request.HotelICRequest;
-import com.chuanghai.ihotel.controller.request.StatisticalReportRequest;
 import com.chuanghai.ihotel.entity.HotelFingerprintEntity;
 import com.chuanghai.ihotel.entity.HotelICEntity;
 import com.chuanghai.ihotel.service.HotelFingerprintService;
 import com.chuanghai.ihotel.service.HotelICService;
-import com.chuanghai.ihotel.util.FiledUtil;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +16,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 
 /**
- * 指纹、IC管理
+ * 指纹、IC管理
  *
  * @Author: binguo
  * @Date: 2022/12/12 星期一 10:48
@@ -67,21 +65,41 @@ public class ConditionController {
     }
 
     /**
-     * IC卡新增/修改
+     * IC卡新增
      * @param adminToken  管理员token
      * @param hotelICEntity  IC卡参数
      * @return
      */
     @AdminLoginCheck
-    @PostMapping("ic/addOrUpdate")
+    @PostMapping("ic/add")
     public CommonResult addICInfo(@RequestHeader("admin_token") String adminToken,
                                   @RequestBody HotelICEntity hotelICEntity) {
-        hotelICService.saveOrUpdate(hotelICEntity);
+        hotelICService.save(hotelICEntity);
         return CommonResult.ok();
     }
 
 
     /**
+     * IC卡修改
+     * @param adminToken  管理员token
+     * @param hotelICEntity  IC卡参数
+     * @return
+     */
+    @AdminLoginCheck
+    @PostMapping("ic/update")
+    public CommonResult updateICInfo(@RequestHeader("admin_token") String adminToken,
+                                     @RequestBody HotelICEntity hotelICEntity){
+        boolean flag = hotelICService.updateById(hotelICEntity);
+        if (flag) {
+            return CommonResult.ok();
+        }else {
+            return CommonResult.fail();
+
+        }
+    }
+
+
+    /**
      * IC卡解绑
      * @param adminToken 管理员token
      * @param statu 状态 0 已解绑  1 未解绑
@@ -89,15 +107,20 @@ public class ConditionController {
      * @return
      */
     @AdminLoginCheck
-    @PostMapping("ic/unbundIC")
+    @GetMapping("ic/unbundIC")
     public CommonResult unbundIC(@RequestHeader("admin_token") String adminToken,
                                @Param("statu") String statu,
                                @Param("id") Long id){
         HotelICEntity hotelICEntity = new HotelICEntity();
         hotelICEntity.setId(id);
         hotelICEntity.setStatu(statu);
-        hotelICService.updateById(hotelICEntity);
-        return CommonResult.ok();
+        boolean flag = hotelICService.updateById(hotelICEntity);
+        if (flag) {
+            return CommonResult.ok();
+        }else {
+            return CommonResult.fail();
+
+        }
     }
 
     /**
@@ -166,7 +189,7 @@ public class ConditionController {
      * @return
      */
     @AdminLoginCheck
-    @PostMapping("fingerprint/unbundFingerprint")
+    @GetMapping("fingerprint/unbundFingerprint")
     public CommonResult unbundFingerprint(@RequestHeader("admin_token") String adminToken,
                                  @Param("statu") String statu,
                                  @Param("id") Long id){

+ 42 - 7
src/main/java/com/chuanghai/ihotel/controller/HotelAdminController.java

@@ -11,7 +11,9 @@ import com.chuanghai.ihotel.controller.request.AdminLoginRequest;
 import com.chuanghai.ihotel.controller.request.AdminPasswordUpdateRequest;
 import com.chuanghai.ihotel.entity.HotelAdminEntity;
 import com.chuanghai.ihotel.service.HotelAdminService;
+import com.chuanghai.ihotel.vo.HotelAdminVO;
 import com.chuanghai.ihotel.vo.LoginUserVO;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -63,8 +65,10 @@ public class HotelAdminController {
     @GetMapping("/list")
     public CommonResult<PageUtils<HotelAdminEntity>> list(@RequestHeader("admin_token") String adminToken,
                                                           String keyword,
-                                                          PageParam pageParam){
-        PageUtils page = hotelAdminService.queryPage(pageParam, keyword);
+                                                          PageParam pageParam,
+                                                          String telPhone,
+                                                          String userType){
+        PageUtils page = hotelAdminService.queryPage(pageParam, keyword, telPhone, userType);
 
         return CommonResult.ok().setResult(page);
     }
@@ -79,14 +83,30 @@ public class HotelAdminController {
     @ParamCheck(index = {2})
     @PostMapping("/add")
     public CommonResult<String> add(@RequestHeader("admin_token") String adminToken,
-                                     @RequestBody HotelAdminEntity staffEntity){
-
+                                     @RequestBody HotelAdminVO staffEntity){
         String password = staffEntity.getPassword();
         if (!StringUtils.hasText(password)) {
             throw new RRException(BizCodeEnume.PARAMETER_ERROR, "密码不能为空");
         }
 
-        hotelAdminService.mySave(staffEntity);
+        HotelAdminEntity hotelAdminEntity = new HotelAdminEntity();
+        BeanUtils.copyProperties(staffEntity, hotelAdminEntity);
+        String[] authority = staffEntity.getAuthority();
+        String[] authorityArr = new String[7];
+        String authorityStr = "";
+        for (int i = 0; i < authority.length; i++) {
+            String[] authoritySplit = authority[i].split("_");
+            authorityArr[Integer.parseInt(authoritySplit[1])] = authoritySplit[0];
+        }
+        for (int i = 0; i < authorityArr.length; i++) {
+            authorityStr += authorityArr[i]+"/";
+        }
+
+        authorityStr = authorityStr.replace("null/","");
+        authorityStr = authorityStr.substring(0,authorityStr.length() - 1);
+        hotelAdminEntity.setAuthority(authorityStr);
+
+        hotelAdminService.mySave(hotelAdminEntity);
         return CommonResult.ok();
     }
 
@@ -96,9 +116,24 @@ public class HotelAdminController {
     @AdminLoginCheck
     @ParamCheck(index = 2)
     @PutMapping("/update")
-    public CommonResult<String> update(@RequestHeader("admin_token") String adminToken, @RequestBody HotelAdminEntity hotelStaff){
+    public CommonResult<String> update(@RequestHeader("admin_token") String adminToken, @RequestBody HotelAdminVO hotelStaff){
+        HotelAdminEntity hotelAdminEntity = new HotelAdminEntity();
+        BeanUtils.copyProperties(hotelStaff, hotelAdminEntity);
+        String[] authority = hotelStaff.getAuthority();
+        String[] authorityArr = new String[7];
+        String authorityStr = "";
+        for (int i = 0; i < authority.length; i++) {
+            String[] authoritySplit = authority[i].split("_");
+            authorityArr[Integer.parseInt(authoritySplit[1])] = authoritySplit[0];
+        }
+        for (int i = 0; i < authorityArr.length; i++) {
+            authorityStr += authorityArr[i]+"/";
+        }
         hotelStaff.setPassword(null);
-		boolean flag = hotelAdminService.updateById(hotelStaff);
+        authorityStr = authorityStr.replace("null/","");
+        authorityStr = authorityStr.substring(0,authorityStr.length() - 1);
+        hotelAdminEntity.setAuthority(authorityStr);
+		boolean flag = hotelAdminService.updateByIdPassword(hotelAdminEntity);
 
 		if (flag) {
             return CommonResult.ok();

+ 1 - 1
src/main/java/com/chuanghai/ihotel/controller/HotelOrderController.java

@@ -334,7 +334,7 @@ public class HotelOrderController {
 
 
     /**
-     *  生成统计报表
+     *  生成统计报表  scheduled\SystemScheduled.java 每月1号凌晨5点自动统计上月数据
      */
     @GetMapping("createReport")
     public void createReport() {

+ 8 - 11
src/main/java/com/chuanghai/ihotel/controller/RoomRealtimeStatuController.java

@@ -7,21 +7,17 @@ import com.chuanghai.ihotel.common.exception.RRException;
 import com.chuanghai.ihotel.common.utils.CommonResult;
 import com.chuanghai.ihotel.controller.request.RoomLockRequest;
 import com.chuanghai.ihotel.controller.request.RoomRealtimeStatuRequest;
+import com.chuanghai.ihotel.controller.request.StatuIdRequest;
 import com.chuanghai.ihotel.controller.request.ToDirtyRequest;
 import com.chuanghai.ihotel.service.RoomRealtimeStatuService;
 import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
+import java.util.Set;
 
 
 /**
@@ -69,15 +65,15 @@ public class RoomRealtimeStatuController {
     /**
      * 脏房修改为空闲房间
      * @param adminToken 管理员token
-     * @param statuId 状态id
+     * @param statuIdRequest 状态id集合
      * @return
      * @apiNote 注意,只有当房间为脏房或被锁定时,房间状态才可以被置为空闲房间
      */
     @AdminLoginCheck
-    @PutMapping("clean/{statuId}")
+    @PostMapping("clean/cleanByStatuId")
     public CommonResult<String> cleanByStatuId(@RequestHeader("admin_token") String adminToken,
-                                               @PathVariable("statuId") Long statuId) {
-        roomRealtimeStatuService.cleanByStatuId(statuId);
+                                               @RequestBody StatuIdRequest statuIdRequest) {
+        roomRealtimeStatuService.cleanByStatuId(statuIdRequest);
 
         return CommonResult.ok();
     }
@@ -117,6 +113,7 @@ public class RoomRealtimeStatuController {
     @PutMapping("lock")
     public CommonResult<String> lock(@RequestBody RoomLockRequest roomLockRequest, @RequestHeader("admin_token") String adminToken) {
         roomRealtimeStatuService.lock(roomLockRequest);
+
         return CommonResult.ok();
     }
 

+ 1 - 17
src/main/java/com/chuanghai/ihotel/controller/StatisticalReportController.java

@@ -50,29 +50,13 @@ public class StatisticalReportController {
     /**
      * 导出报表【管理端】
      * @param response
-     * @param pageParam 分页参数
      * @param request  查询条件
      */
     @GetMapping("downLoadReport")
     public void downLoadReport(HttpServletResponse response,
-                                       PageParam pageParam,
                                        StatisticalReportRequest request) {
-         statisticalReportService.downLoadReport(response, pageParam, request);
+         statisticalReportService.downLoadReport(response, request);
     }
 
 
-//    /**
-//     * 查询总计【管理端】
-//     * @param adminToken 管理员token令牌
-//     * @param pageParam 分页参数
-//     * @param request  查询条件
-//     */
-//    @GetMapping("queryTotalReport")
-//    public CommonResult queryTotalReport(@RequestHeader("admin_token") String adminToken,
-//                                         PageParam pageParam,
-//                                         StatisticalReportRequest request){
-//        ReportVO reportVO = statisticalReportService.queryTotalReport(pageParam, request);
-//
-//        return CommonResult.ok().setResult(reportVO);
-//    }
 }

+ 7 - 4
src/main/java/com/chuanghai/ihotel/controller/request/HotelICRequest.java

@@ -3,6 +3,7 @@ package com.chuanghai.ihotel.controller.request;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
+import javax.validation.constraints.Pattern;
 import java.time.LocalDateTime;
 
 /**
@@ -14,12 +15,15 @@ import java.time.LocalDateTime;
 @Data
 public class HotelICRequest {
     /**
-     * 持有者姓名
+     * 指纹编码/IC卡号/姓名
      */
-    private String holderName;
+    private String keyWord;
+
+
     /**
      * 用户类型
      */
+    @Pattern(regexp = "[0-1]", message = "是否可用只能为0或者为1")
     private String userType;
     /**
      * 房间编号
@@ -28,6 +32,5 @@ public class HotelICRequest {
     /**
      * 创建时间
      */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime createTime;
+    private String createTime;
 }

+ 2 - 2
src/main/java/com/chuanghai/ihotel/controller/request/OrderQueryRequest.java

@@ -18,9 +18,9 @@ public class OrderQueryRequest {
      */
     private Long orderId;
     /**
-     * 订单
+     * 关键字(订单号、房间号)
      */
-    private String orderNo;
+    private String keyWord;
     /**
      * 订单用户标识
      */

+ 2 - 2
src/main/java/com/chuanghai/ihotel/controller/request/StatisticalReportRequest.java

@@ -15,11 +15,11 @@ import java.time.LocalDateTime;
 public class StatisticalReportRequest {
 
     /**
-     * 起始时间 yyyy-MM-dd HH:mm:ss
+     * 起始时间 yyyy-MM
      */
     private String startTime;
     /**
-     * 终止时间 yyyy-MM-dd HH:mm:ss
+     * 终止时间 yyyy-MM
      */
     private String endTime;
 }

+ 16 - 0
src/main/java/com/chuanghai/ihotel/controller/request/StatuIdRequest.java

@@ -0,0 +1,16 @@
+package com.chuanghai.ihotel.controller.request;
+
+import lombok.Data;
+
+import java.util.Set;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/1/6 星期五 16:47
+ * @Description: com.chuanghai.ihotel.controller.request
+ * @Version: 1.0
+ */
+@Data
+public class StatuIdRequest {
+    private Set<Long> statuIds;
+}

+ 6 - 1
src/main/java/com/chuanghai/ihotel/entity/HotelAdminEntity.java

@@ -11,7 +11,7 @@ import java.io.Serializable;
 
 /**
  * 酒店管理员
- * 
+ *
  * @author codingliang
  * @email codingliang@gmail.com
  * @date 2022-07-27 10:02:04
@@ -54,4 +54,9 @@ public class HotelAdminEntity implements Serializable {
 	@Pattern(regexp = "[1-2]", message = "状态只能为1或2")
 	private String statu;
 
+	/**
+	 * 权限字符串
+	 */
+	private String authority;
+
 }

+ 3 - 0
src/main/java/com/chuanghai/ihotel/entity/HotelICEntity.java

@@ -11,6 +11,7 @@ import com.chuanghai.ihotel.conver.aliexcel.UserTypeConverter;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
@@ -53,6 +54,7 @@ public class HotelICEntity implements Serializable {
      */
     @ExcelProperty(value = "用户类型", converter= UserTypeConverter.class)
     @ColumnWidth(25)
+    @Pattern(regexp = "[0-1]", message = "是否可用只能为0或者为1")
     private String userType;
     /**
      * 生效时间
@@ -80,5 +82,6 @@ public class HotelICEntity implements Serializable {
      */
     @ExcelProperty(value = "状态", converter= StatuConverter.class)
     @ColumnWidth(15)
+    @Pattern(regexp = "[0-1]", message = "是否可用只能为0或者为1")
     private String statu;
 }

+ 1 - 1
src/main/java/com/chuanghai/ihotel/entity/StatisticalReportEntity.java

@@ -30,7 +30,7 @@ public class StatisticalReportEntity implements Serializable {
     /**
      * 编号
      */
-    private Integer id;
+    private Long id;
 
     /**
      * 时间

+ 4 - 2
src/main/java/com/chuanghai/ihotel/service/HotelAdminService.java

@@ -9,7 +9,7 @@ import com.chuanghai.ihotel.entity.HotelAdminEntity;
 import com.chuanghai.ihotel.vo.LoginUserVO;
 
 /**
- * 酒店员工 
+ * 酒店员工
  *
  * @author codingliang
  * @email codingliang@gmail.com
@@ -17,7 +17,7 @@ import com.chuanghai.ihotel.vo.LoginUserVO;
  */
 public interface HotelAdminService extends IService<HotelAdminEntity> {
 
-    PageUtils queryPage(PageParam pageParam, String keyword);
+    PageUtils queryPage(PageParam pageParam, String keyword, String telPhone, String userType);
 
     /**
      * 登录
@@ -33,5 +33,7 @@ public interface HotelAdminService extends IService<HotelAdminEntity> {
      * @param request
      */
     void updatePassword(AdminPasswordUpdateRequest request);
+
+    Boolean updateByIdPassword(HotelAdminEntity hotelAdminEntity);
 }
 

+ 4 - 2
src/main/java/com/chuanghai/ihotel/service/RoomRealtimeStatuService.java

@@ -5,6 +5,7 @@ import com.chuanghai.ihotel.common.utils.PageUtils;
 import com.chuanghai.ihotel.common.utils.PageParam;
 import com.chuanghai.ihotel.controller.request.RoomLockRequest;
 import com.chuanghai.ihotel.controller.request.RoomRealtimeStatuRequest;
+import com.chuanghai.ihotel.controller.request.StatuIdRequest;
 import com.chuanghai.ihotel.controller.request.ToDirtyRequest;
 import com.chuanghai.ihotel.dto.LockRoomDTO;
 import com.chuanghai.ihotel.entity.RoomRealtimeStatuEntity;
@@ -13,6 +14,7 @@ import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 实时房态
@@ -70,9 +72,9 @@ public interface RoomRealtimeStatuService extends IService<RoomRealtimeStatuEnti
 
     /**
      * 房态状态改为干净
-     * @param statuId
+     * @param statuIdRequest
      */
-    void cleanByStatuId(Long statuId);
+    void cleanByStatuId(StatuIdRequest statuIdRequest);
 
     /**
      * 锁定房间

+ 2 - 0
src/main/java/com/chuanghai/ihotel/service/RoomService.java

@@ -41,5 +41,7 @@ public interface RoomService extends IService<RoomEntity> {
     void updateElectricType(Long roomId,String operType);
 
     RoomEntity queryByRoomId(Long roomId);
+
+    void queryRoomNum (Long roomTypeId);
 }
 

+ 1 - 2
src/main/java/com/chuanghai/ihotel/service/StatisticalReportService.java

@@ -23,8 +23,7 @@ public interface StatisticalReportService extends IService<StatisticalReportEnti
 
     ReportVO queryReport(PageParam pageParam, StatisticalReportRequest request);
 
-    void downLoadReport(HttpServletResponse response, PageParam pageParam, StatisticalReportRequest request);
+    void downLoadReport(HttpServletResponse response, StatisticalReportRequest request);
 
-    ReportVO queryTotalReport(PageParam pageParam, StatisticalReportRequest request);
 }
 

+ 34 - 8
src/main/java/com/chuanghai/ihotel/service/impl/HotelAdminServiceImpl.java

@@ -29,12 +29,17 @@ public class HotelAdminServiceImpl extends ServiceImpl<HotelAdminDao, HotelAdmin
 
     @Value("${my-security.private-key}")
     private String privateKey;
+    @Value("${my-security.public-key}")
+    private String publickey;
 
     @Override
-    public PageUtils queryPage(PageParam pageParam, String keyword) {
+    public PageUtils queryPage(PageParam pageParam, String keyword, String telPhone, String userType) {
         QueryWrapper<HotelAdminEntity> queryWrapper = new QueryWrapper<>();
         if (StringUtils.hasText(keyword)) {
-            queryWrapper.and(e -> e.eq("username", keyword).or().eq("phone", keyword));
+            queryWrapper.and(e -> e.like("username", keyword).or().like("phone", keyword));
+        }
+        if (!userType.equals("1")) {
+                queryWrapper.eq("phone", telPhone);
         }
 
         IPage<HotelAdminEntity> page = this.page(
@@ -72,12 +77,16 @@ public class HotelAdminServiceImpl extends ServiceImpl<HotelAdminDao, HotelAdmin
         String token = JWTUtil.geneJsonWebToken(dto);
 
         // 生成vo
-        return LoginUserVO.builder()
-                .token(token)
-                .tokenTtl(JWTUtil.getExpired())
-                .userName(staff.getUsername())
-                .userType("1")
-                .build();
+
+            return LoginUserVO.builder()
+                    .token(token)
+                    .tokenTtl(JWTUtil.getExpired())
+                    .userName(staff.getUsername())
+                    .userType(staff.getAdminType())
+                    .authority(staff.getAuthority())
+                    .telPhone(staff.getPhone())
+                    .build();
+
     }
 
     @Override
@@ -133,4 +142,21 @@ public class HotelAdminServiceImpl extends ServiceImpl<HotelAdminDao, HotelAdmin
         }
     }
 
+    @Override
+    public Boolean updateByIdPassword(HotelAdminEntity hotelAdminEntity) {
+        String password;
+        try {
+            password = RSAUtils.decrypt(hotelAdminEntity.getPassword(), RSAUtils.getPrivateKey(privateKey));
+            if (StringUtils.hasText(password)) {
+                BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+                hotelAdminEntity.setPassword(passwordEncoder.encode(password));
+            }else {
+                hotelAdminEntity.setPassword(null);
+            }
+        } catch (Exception e) {
+            throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "新增用户失败-密码解密错误");
+        }
+        return this.updateById(hotelAdminEntity);
+    }
+
 }

+ 5 - 2
src/main/java/com/chuanghai/ihotel/service/impl/HotelFingerprintServiceImpl.java

@@ -33,9 +33,12 @@ public class HotelFingerprintServiceImpl extends ServiceImpl<HotelFingerprintDao
     @Override
     public PageUtils queryInfo(PageParam pageParam, String roomNo, HotelICRequest hotelICRequest) {
         QueryWrapper<HotelFingerprintEntity> wrapper = new QueryWrapper<>();
-        wrapper.like(StringUtils.hasText(hotelICRequest.getHolderName()),"holder_name", hotelICRequest.getHolderName());
         wrapper.eq(StringUtils.hasText(hotelICRequest.getUserType()),"user_type", hotelICRequest.getUserType());
-        wrapper.eq(hotelICRequest.getCreateTime() != null,"create_time", hotelICRequest.getCreateTime());
+        wrapper.apply(hotelICRequest.getCreateTime() != null, "date_format(create_time, '%Y-%m-%d') = {0}", hotelICRequest.getCreateTime());
+        wrapper.like(StringUtils.hasText(hotelICRequest.getKeyWord()), "holder_name", hotelICRequest.getKeyWord())
+                .or()
+                .like(hotelICRequest.getKeyWord() != null, "fingerprint_number", hotelICRequest.getKeyWord());
+
         wrapper.eq("room_no", roomNo);
         wrapper.orderByDesc("create_time");
         IPage<HotelFingerprintEntity> page = this.page(

+ 20 - 3
src/main/java/com/chuanghai/ihotel/service/impl/HotelICServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletResponse;
 import java.net.URLEncoder;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -32,11 +33,27 @@ public class HotelICServiceImpl extends ServiceImpl<HotelICDao, HotelICEntity> i
 
     @Override
     public PageUtils queryICInfo(PageParam pageParam, String roomNo, HotelICRequest hotelICRequest) {
+
         QueryWrapper<HotelICEntity> wrapper = new QueryWrapper<>();
-        wrapper.like(StringUtils.hasText(hotelICRequest.getHolderName()),"holder_name", hotelICRequest.getHolderName());
-        wrapper.eq(StringUtils.hasText(hotelICRequest.getUserType()),"user_type", hotelICRequest.getUserType());
-        wrapper.eq(hotelICRequest.getCreateTime() != null,"create_time", hotelICRequest.getCreateTime());
         wrapper.eq("room_no", roomNo);
+        // wrapper.between(hotelICRequest.getCreateTime() != null, "create_time", hotelICRequest.getCreateTime());
+//        wrapper.like(StringUtils.hasText(hotelICRequest.getKeyWord()), "holder_name", hotelICRequest.getKeyWord())
+//                .eq(StringUtils.hasText(hotelICRequest.getUserType()), "user_type", hotelICRequest.getUserType())
+//                .apply(StringUtils.hasText(hotelICRequest.getCreateTime()), "date_format(create_time, '%Y-%m-%d') = {0}", hotelICRequest.getCreateTime())
+//                .eq("statu","1")
+//                .or()
+//                .like(StringUtils.hasText(hotelICRequest.getKeyWord()), "card_number", hotelICRequest.getKeyWord())
+//                .eq(StringUtils.hasText(hotelICRequest.getUserType()), "user_type", hotelICRequest.getUserType())
+//                .apply(StringUtils.hasText(hotelICRequest.getCreateTime()), "date_format(create_time, '%Y-%m-%d') = {0}", hotelICRequest.getCreateTime())
+//                .eq("statu","1");
+        wrapper.eq(StringUtils.hasText(hotelICRequest.getUserType()), "user_type", hotelICRequest.getUserType())
+                .apply(StringUtils.hasText(hotelICRequest.getCreateTime()), "date_format(create_time, '%Y-%m-%d') = {0}", hotelICRequest.getCreateTime())
+                .eq("statu", "1");
+
+        if (StringUtils.hasText(hotelICRequest.getKeyWord())) {
+            wrapper.and(e -> e.like("card_number", hotelICRequest.getKeyWord()).or().like("holder_name", hotelICRequest.getKeyWord()));
+        }
+
         wrapper.orderByDesc("create_time");
         IPage<HotelICEntity> page = this.page(
                 new MyQuery<HotelICEntity>().getPage(pageParam),

+ 1 - 1
src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderBillServiceImpl.java

@@ -209,4 +209,4 @@ public class HotelOrderBillServiceImpl extends ServiceImpl<HotelOrderBillDao, Ho
         return param;
     }
 
-}
+}

+ 137 - 18
src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderServiceImpl.java

@@ -1,6 +1,8 @@
 package com.chuanghai.ihotel.service.impl;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,10 +32,12 @@ import com.chuanghai.ihotel.enums.OrderStatuEnum;
 import com.chuanghai.ihotel.enums.SystemNoticeTypeEnum;
 import com.chuanghai.ihotel.enums.UserIdentityTypeEnum;
 import com.chuanghai.ihotel.service.*;
+import com.chuanghai.ihotel.util.CellStyleModel;
 import com.chuanghai.ihotel.util.CommonUtil;
 import com.chuanghai.ihotel.util.FiledUtil;
 import com.chuanghai.ihotel.vo.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.xmlbeans.impl.piccolo.util.DuplicateKeyException;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.BeanUtils;
@@ -46,6 +50,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.sql.SQLIntegrityConstraintViolationException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -98,7 +103,10 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         QueryWrapper<HotelOrderEntity> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(request.getOrderId() != null, "id", request.getOrderId());
         queryWrapper.eq(StringUtils.hasText(request.getDeleteFlag()), "delete_flag", request.getDeleteFlag());
-        queryWrapper.eq(StringUtils.hasText(request.getOrderNo()), "order_no", request.getOrderNo());
+        if (StringUtils.hasText(request.getKeyWord())) {
+            queryWrapper.and(e -> e.like("order_no", request.getKeyWord()).or().like("room_no", request.getKeyWord()));
+        }
+        //queryWrapper.like(StringUtils.hasText(request.getOrderNo()), "order_no", request.getOrderNo());
         queryWrapper.eq(StringUtils.hasText(request.getUserFlag()), "user_flag", request.getUserFlag());
         queryWrapper.eq(StringUtils.hasText(request.getUserName()), "user_name", request.getUserName());
         queryWrapper.eq(StringUtils.hasText(request.getUserPhone()), "user_phone", request.getUserPhone());
@@ -173,8 +181,51 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
 
                 return vo;
             }).collect(Collectors.toList());
+            List<AdminOrderIndexVO> objectVOList = new ArrayList<>();
+            voList.forEach(adminOrderIndexVO -> {
+                BigDecimal waterPayment = BigDecimal.ZERO;
+                BigDecimal electricPayment = BigDecimal.ZERO;
+                BigDecimal totalPayment = BigDecimal.ZERO;
+                //住房总押金   单价 * 天数
+                int housDay = 0;
+                HotelOrderEntity order = adminOrderIndexVO.getOrder();
+                HotelOrderBillEntity orderBill = adminOrderIndexVO.getOrderBill();
+                //电费计算
+                String startOfElectric = this.check(orderBill, "startOfElectric");
+
+                String endOfElectric = this.check(orderBill, "endOfElectric");
+
+                String priceOfElectric = this.check(orderBill, "priceOfElectric");
+
+                String calculateElectric = this.calculate(startOfElectric, endOfElectric, priceOfElectric);
+
+                electricPayment = electricPayment.add(new BigDecimal(calculateElectric)).setScale(2, BigDecimal.ROUND_UP);
+                //水费计算
+                String startOfWater = this.check(orderBill, "startOfWater");
+
+                String endOfWater = this.check(orderBill, "endOfWater");
+
+                String priceOfWater = this.check(orderBill, "priceOfWater");
+
+                String calculateWater = this.calculate(startOfWater, endOfWater, priceOfWater);
+                waterPayment = waterPayment.add(new BigDecimal(calculateWater)).setScale(2, BigDecimal.ROUND_UP);
+
+                //收款总计
+                totalPayment = totalPayment.add(order.getPayAmount()).setScale(2, BigDecimal.ROUND_UP);
+
+                housDay = order.getEnableEndTime().getDayOfMonth() - order.getEnableStartTime().getDayOfMonth();
+                SystemSettingEntity systemSetting = systemSettingService.get();
+                //住房总押金   单价 * 天数
+                BigDecimal totalHousDeposit = systemSetting.getDeposit().multiply(new BigDecimal(housDay)).setScale(2, BigDecimal.ROUND_UP);
+                adminOrderIndexVO.setAllOfElectricPayment(electricPayment);
+                adminOrderIndexVO.setAllOfWaterAmount(waterPayment);
+                adminOrderIndexVO.setAllOfReceiveAmount(totalHousDeposit);
+                BigDecimal refundPayment = totalPayment.add(totalHousDeposit).subtract(electricPayment).subtract(waterPayment).setScale(2, BigDecimal.ROUND_UP);
+                adminOrderIndexVO.setRefundPayment(refundPayment);
+                objectVOList.add(adminOrderIndexVO);
+            });
 
-            pageUtils.setList(voList);
+            pageUtils.setList(objectVOList);
         }
 
         return pageUtils;
@@ -200,9 +251,9 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
             hotelAndBillVO.setPayTime(order.getPayTime());
 
             //电费计算
-            String startOfElectric = this.check(orderBill, "startOfWater");
+            String startOfElectric = this.check(orderBill, "startOfElectric");
 
-            String endOfElectric = this.check(orderBill, "endOfWater");
+            String endOfElectric = this.check(orderBill, "endOfElectric");
 
             String priceOfElectric = this.check(orderBill, "priceOfElectric");
 
@@ -223,12 +274,14 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
             hotelAndBillVO.setAcceptPayment(systemSetting.getFreeTotal());
             //退预付款
             BigDecimal refundPayment = systemSetting.getFreeTotal().subtract(order.getPayAmount());
+
             hotelAndBillVO.setRefundPayment(refundPayment);
             hotelAndBillVO.setCreateTime(order.getCreateTime());
             hotelAndBillVO.setPayTime(order.getPayTime());
             hotelAndBillVOList.add(hotelAndBillVO);
         });
 
+
         String fileName;
         try {
             fileName = URLEncoder.encode("订单管理" + new Date().getTime(), "UTF-8");
@@ -243,12 +296,60 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
     }
 
     /**
+     * 获取上月第一天
+     *
+     * @return
+     */
+    public String getLastMonthFirstDayStr() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(new Date());
+        int year = cal.get(Calendar.YEAR);
+        int month = cal.get(Calendar.MONTH);
+        int date = cal.get(Calendar.DATE);
+        cal.set(year, month, date, 0, 0, 1);
+
+        //获取当前时间上一个月
+        cal.add(Calendar.MONTH, -1);
+        //获取上个月的第一天
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+        return df.format(cal.getTime());
+
+    }
+
+    /**
+     * 获取上月最后一天
+     *
+     * @return
+     */
+    public String getLastMonthLastDayStr() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(new Date());
+        int year = cal.get(Calendar.YEAR);
+        int month = cal.get(Calendar.MONTH);
+        int date = cal.get(Calendar.DATE);
+        cal.set(year, month, date, 23, 59, 59);
+        //获取当前时间上一个月
+        cal.add(Calendar.MONTH, -1);
+        //获取上个月的最后一天
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        return df.format(cal.getTime());
+    }
+
+
+    /**
      * 统计报表
      */
     @Override
     public void statisticalReport() {
-        LocalDateTime firstDayOfMonth = LocalDateTime.of(LocalDate.from(LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth())), LocalTime.MIN);
-        LocalDateTime lastDayOfMonth = LocalDateTime.of(LocalDate.from(LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth())), LocalTime.MAX);
+        String lastMonthFirstDayStr = this.getLastMonthFirstDayStr();
+        String lastMonthLastDayStr = this.getLastMonthLastDayStr();
+
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime firstDayOfMonth = LocalDateTime.parse(lastMonthFirstDayStr, df);
+        LocalDateTime lastDayOfMonth = LocalDateTime.parse(lastMonthLastDayStr, df);
+
         List<AdminOrderIndexVO> voList = this.queryByMonthHotelOrder(firstDayOfMonth, lastDayOfMonth);
         BigDecimal waterPayment = BigDecimal.ZERO;
         BigDecimal electricPayment = BigDecimal.ZERO;
@@ -262,9 +363,9 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
             HotelOrderEntity order = orderAndBill.getOrder();
             HotelOrderBillEntity orderBill = orderAndBill.getOrderBill();
             //电费计算
-            String startOfElectric = this.check(orderBill, "startOfWater");
+            String startOfElectric = this.check(orderBill, "startOfElectric");
 
-            String endOfElectric = this.check(orderBill, "endOfWater");
+            String endOfElectric = this.check(orderBill, "endOfElectric");
 
             String priceOfElectric = this.check(orderBill, "priceOfElectric");
 
@@ -286,11 +387,11 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
 
             housDay = order.getEnableEndTime().getDayOfMonth() - order.getEnableStartTime().getDayOfMonth();
         }
-
-        StatisticalReportEntity statisticalReportEntity = queryByMonth(firstDayOfMonth);
-        if (statisticalReportEntity != null) {
-            statisticalReport.setId(statisticalReportEntity.getId());
-        }
+        StatisticalReportEntity statisticalReportEntity = new StatisticalReportEntity();
+//        statisticalReportEntity = queryByMonth(firstDayOfMonth);
+//        if (statisticalReportEntity != null) {
+//            statisticalReport.setId(statisticalReportEntity.getId());
+//        }
         SystemSettingEntity systemSetting = systemSettingService.get();
         //住房总押金   单价 * 天数
         BigDecimal totalHousDeposit = systemSetting.getDeposit().multiply(new BigDecimal(housDay)).setScale(2, BigDecimal.ROUND_UP);
@@ -303,22 +404,30 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         statisticalReport.setRefundPayment(systemSetting.getFreeTotal().add(totalHousDeposit).subtract(electricPayment).subtract(waterPayment));
         statisticalReport.setTotalPayment(totalPayment);
 
-        statisticalReportService.saveOrUpdate(statisticalReport);
+        statisticalReportService.save(statisticalReport);
 
     }
 
     @Override
-    public String check (HotelOrderBillEntity orderBill, String field) {
+    public String check(HotelOrderBillEntity orderBill, String field) {
         String result = "0.0";
         boolean isPWaterNull = FiledUtil.checkObjFieldsIsNull(orderBill, field);
         if (!isPWaterNull) {
-            result = orderBill.getPriceOfWater();
+            switch (field){
+                case "startOfWater" :  result = orderBill.getStartOfWater(); break;
+                case "endOfWater" :  result = orderBill.getEndOfWater(); break;
+                case "priceOfWater" :  result = orderBill.getPriceOfWater(); break;
+                case "startOfElectric" :  result = orderBill.getStartOfElectric(); break;
+                case "endOfElectric" :  result = orderBill.getEndOfElectric(); break;
+                case "priceOfElectric" :  result = orderBill.getPriceOfElectric(); break;
+            }
+
             result = result.equals("0E-8") ? "0.0" : result;
         }
         return result;
     }
 
-    public StatisticalReportEntity queryByMonth(LocalDateTime dateTime){
+    public StatisticalReportEntity queryByMonth(LocalDateTime dateTime) {
         QueryWrapper<StatisticalReportEntity> wrapper = new QueryWrapper<>();
         wrapper.eq("time", dateTime);
         return statisticalReportService.getOne(wrapper);
@@ -330,7 +439,10 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
 
         QueryWrapper<HotelOrderEntity> wrapper = new QueryWrapper<>();
         wrapper.eq("order_statu", "5");
-        wrapper.between("pay_time", startTime, endTime);
+        if (startTime != null && endTime != null) {
+            wrapper.between("pay_time", startTime, endTime);
+        }
+
         List<HotelOrderEntity> orderList = this.list(wrapper);
         List<AdminOrderIndexVO> voList = new ArrayList<>();
         Set<Long> ids = orderList.stream().map(order -> order.getId()).collect(Collectors.toSet());
@@ -391,6 +503,12 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         RoomTypeEntity roomType = roomTypeService.myGetById(roomTypeId);
         if (roomType == null) {
             throw new RRException(BizCodeEnume.PARAMETER_ERROR, "房型不存在");
+        } else {
+            if (roomType.getRoomNum() < 1) {
+                throw new RRException(BizCodeEnume.PARAMETER_ERROR, "该房型客房不足");
+            } else {
+                roomService.queryRoomNum(roomTypeId);
+            }
         }
 
         LocalDateTime startTime = CommonUtil.localDateToTime(request.getStartTime(), TimeConstant.INTO_TIME);
@@ -429,6 +547,7 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         return vo;
     }
 
+
     @Override
     public void orderPaySuccess(Long orderId, String orderNo, String realPayAmount, LocalDateTime payTime) {
         HotelOrderEntity order = null;

+ 2 - 2
src/main/java/com/chuanghai/ihotel/service/impl/HotelStaffServiceImpl.java

@@ -21,7 +21,7 @@ public class HotelStaffServiceImpl extends ServiceImpl<HotelStaffDao, HotelStaff
     public PageUtils queryPage(PageParam pageParam, String keyword) {
         QueryWrapper<HotelStaffEntity> queryWrapper = new QueryWrapper<>();
         if (StringUtils.hasText(keyword)) {
-            queryWrapper.and(e -> e.eq("username", keyword).or().eq("phone", keyword));
+            queryWrapper.and(e -> e.like("username", keyword).or().like("phone", keyword));
         }
 
         IPage<HotelStaffEntity> page = this.page(
@@ -32,4 +32,4 @@ public class HotelStaffServiceImpl extends ServiceImpl<HotelStaffDao, HotelStaff
         return new PageUtils(page);
     }
 
-}
+}

+ 29 - 11
src/main/java/com/chuanghai/ihotel/service/impl/RoomRealtimeStatuServiceImpl.java

@@ -12,6 +12,7 @@ import com.chuanghai.ihotel.constant.RedisKey;
 import com.chuanghai.ihotel.constant.TimeConstant;
 import com.chuanghai.ihotel.controller.request.RoomLockRequest;
 import com.chuanghai.ihotel.controller.request.RoomRealtimeStatuRequest;
+import com.chuanghai.ihotel.controller.request.StatuIdRequest;
 import com.chuanghai.ihotel.controller.request.ToDirtyRequest;
 import com.chuanghai.ihotel.dao.RoomRealtimeStatuDao;
 import com.chuanghai.ihotel.dto.LockRoomDTO;
@@ -32,8 +33,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import javax.validation.constraints.NotNull;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -73,6 +76,12 @@ public class RoomRealtimeStatuServiceImpl extends ServiceImpl<RoomRealtimeStatuD
         RoomTypeEntity roomType = roomTypeService.myGetById(roomTypeId);
         if (roomType == null) {
             throw new RRException(BizCodeEnume.PARAMETER_ERROR, "房型不存在");
+        }else {
+            if (roomType.getRoomNum() < 1){
+                throw new RRException(BizCodeEnume.PARAMETER_ERROR, "该房型客房不足");
+            }else {
+                roomService.queryRoomNum(roomTypeId);
+            }
         }
 
         String key = String.format(RedisKey.LOCK_ROOM_BY_ROOM_TYPE, roomTypeId);
@@ -180,24 +189,33 @@ public class RoomRealtimeStatuServiceImpl extends ServiceImpl<RoomRealtimeStatuD
     }
 
     @Override
-    public void cleanByStatuId(Long statuId) {
-        RoomRealtimeStatuEntity statu = this.getById(statuId);
+    public void cleanByStatuId(StatuIdRequest statuIdRequest) {
 
-        if (statu == null) {
-            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "无效的statuId");
-        }
+        statuIdRequest.getStatuIds().forEach(statuId->{
+            RoomRealtimeStatuEntity statu = this.getById(statuId);
 
-        if (!(RoomStatuEnum.DIRTY.getCode().equals(statu.getStatu())
-                || RoomStatuEnum.LOCK.getCode().equals(statu.getStatu()))) {
-            throw new RRException(BizCodeEnume.PERMISSION_DENIED, "房间非脏房或锁定房,不可以置为空闲房间");
-        }
+            if (statu == null) {
+                throw new RRException(BizCodeEnume.PARAMETER_ERROR, "无效的statuId");
+            }
+
+            if (!(RoomStatuEnum.DIRTY.getCode().equals(statu.getStatu())
+                    || RoomStatuEnum.LOCK.getCode().equals(statu.getStatu()))) {
+                throw new RRException(BizCodeEnume.PERMISSION_DENIED, "房间非脏房或锁定房,不可以置为空闲房间");
+            }
+
+            statu.setStatu(RoomStatuEnum.FREE.getCode());
+            this.updateById(statu);
+        });
 
-        statu.setStatu(RoomStatuEnum.FREE.getCode());
-        this.updateById(statu);
     }
 
     @Override
     public void lock(RoomLockRequest roomLockRequest) {
+        @NotNull(message = "不能为空") LocalDate startDate = roomLockRequest.getStartDate();
+        long untilDate = startDate.until(LocalDate.now(), ChronoUnit.DAYS);
+        if (untilDate >= 1L || untilDate <= -1L) {
+            throw new RRException(BizCodeEnume.DATE_ERROR,"只能关闭 "+LocalDate.now()+" 房间");
+        }
         Set<Long> roomIds = roomLockRequest.getRoomId();
         if (roomIds.size() <= 0) {
             return;

+ 16 - 0
src/main/java/com/chuanghai/ihotel/service/impl/RoomServiceImpl.java

@@ -234,4 +234,20 @@ public class RoomServiceImpl extends ServiceImpl<RoomDao, RoomEntity> implements
     public RoomEntity queryByRoomId(Long roomId) {
        return this.getById(roomId);
     }
+
+    /**
+     * 根据房型ID查询是否有可用的房间
+     * @param roomTypeId
+     * @return
+     */
+    @Override
+    public void queryRoomNum (Long roomTypeId) {
+        QueryWrapper<RoomEntity> wrapper = new QueryWrapper<>();
+        wrapper.eq("room_type_id", roomTypeId)
+                .eq("enable_use", "1");
+        List<RoomEntity> list = roomService.list(wrapper);
+        if (list.size() < 1) {
+            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "该房型客房不足");
+        }
+    }
 }

+ 1 - 1
src/main/java/com/chuanghai/ihotel/service/impl/RoomTypeServiceImpl.java

@@ -90,4 +90,4 @@ public class RoomTypeServiceImpl extends ServiceImpl<RoomTypeDao, RoomTypeEntity
         return this.removeByIds(ids);
     }
 
-}
+}

+ 14 - 32
src/main/java/com/chuanghai/ihotel/service/impl/StatisticalReportServiceImpl.java

@@ -79,6 +79,8 @@ public class StatisticalReportServiceImpl extends ServiceImpl<StatisticalReportD
             String enfLocalTime = request.getEndTime() + "-01 00:00:00";
             LocalDateTime enfLocal = LocalDateTime.parse(enfLocalTime, df);
             queryWrapper.between("time", startLocal, enfLocal);
+//            queryWrapper.ge("time",startLocal);
+//            queryWrapper.le("time",enfLocal);
         }
 
 
@@ -113,9 +115,7 @@ public class StatisticalReportServiceImpl extends ServiceImpl<StatisticalReportD
         reportVO.setWaterTotalPayment(waterTotalPayment);
         reportVO.setRefundTotalPayment(refundTotalPayment);
         reportVO.setTatolPayment(totalPayment);
-        list.remove(0);
-       // reportVO.setReportEntityList(list);
-        page.setTotal(page.getTotal() - 1);
+
         page.setRecords(list);
         PageUtils pageUtils = new PageUtils(page);
         reportVO.setPage(pageUtils);
@@ -126,21 +126,23 @@ public class StatisticalReportServiceImpl extends ServiceImpl<StatisticalReportD
      * 导出统计明细
      *
      * @param response
-     * @param pageParam
      * @param request
      */
     @Override
-    public void downLoadReport(HttpServletResponse response, PageParam pageParam, StatisticalReportRequest request) {
+    public void downLoadReport(HttpServletResponse response, StatisticalReportRequest request) {
+       // PageParam pageParam = new PageParam();
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        QueryWrapper<StatisticalReportEntity> queryWrapper = new QueryWrapper<>();
-        List<AdminOrderIndexVO> list = new ArrayList<>();
+       // QueryWrapper<StatisticalReportEntity> queryWrapper = new QueryWrapper<>();
+        List<AdminOrderIndexVO> list;
+        LocalDateTime enfLocal = null;
+        LocalDateTime startLocal = null;
         if (StringUtils.hasText(request.getStartTime()) && StringUtils.hasText(request.getEndTime())) {
             String startLocalTime = request.getStartTime() + "-01 00:00:00";
-            LocalDateTime startLocal = LocalDateTime.parse(startLocalTime, df);
+            startLocal = LocalDateTime.parse(startLocalTime, df);
             String enfLocalTime = request.getEndTime() + "-01 00:00:00";
-            LocalDateTime enfLocal = LocalDateTime.parse(enfLocalTime, df);
-            list = hotelOrderService.queryByMonthHotelOrder(startLocal, enfLocal);
+            enfLocal = LocalDateTime.parse(enfLocalTime, df);
         }
+        list = hotelOrderService.queryByMonthHotelOrder(startLocal, enfLocal);
         List<StatisticalReportVO> statisticalReportVOList = new ArrayList<>();
         list.forEach(orderAndBill -> {
             HotelAndBillVO hotelAndBillVO = new HotelAndBillVO();
@@ -152,9 +154,9 @@ public class StatisticalReportServiceImpl extends ServiceImpl<StatisticalReportD
             hotelAndBillVO.setOrderStatu(order.getOrderStatu());
             hotelAndBillVO.setPayTime(order.getPayTime());
             //电费计算
-            String startOfElectric = hotelOrderService.check(orderBill, "startOfWater");
+            String startOfElectric = hotelOrderService.check(orderBill, "startOfElectric");
 
-            String endOfElectric = hotelOrderService.check(orderBill, "endOfWater");
+            String endOfElectric = hotelOrderService.check(orderBill, "endOfElectric");
 
             String priceOfElectric = hotelOrderService.check(orderBill, "priceOfElectric");
 
@@ -198,26 +200,6 @@ public class StatisticalReportServiceImpl extends ServiceImpl<StatisticalReportD
         }
     }
 
-    @Override
-    public ReportVO queryTotalReport(PageParam pageParam, StatisticalReportRequest request) {
-        ReportVO reportVO = new ReportVO();
-        BigDecimal electricTotalPayment = BigDecimal.ZERO;
-        BigDecimal waterTotalPayment = BigDecimal.ZERO;
-        BigDecimal refundTotalPayment = BigDecimal.ZERO;
-        BigDecimal totalPayment = BigDecimal.ZERO;
-//        List<StatisticalReportEntity> statisticalReportList = this.queryReport(pageParam, request).getList();
-//        for (StatisticalReportEntity statisticalReport :statisticalReportList ){
-//            electricTotalPayment = electricTotalPayment.add(statisticalReport.getElectricPayment());
-//            waterTotalPayment = waterTotalPayment.add(statisticalReport.getWaterPayment());
-//            refundTotalPayment = refundTotalPayment.add(statisticalReport.getRefundPayment());
-//            totalPayment = totalPayment.add(statisticalReport.getTotalPayment());
-//        };
-        reportVO.setElectricTotalPayment(electricTotalPayment);
-        reportVO.setWaterTotalPayment(waterTotalPayment);
-        reportVO.setRefundTotalPayment(refundTotalPayment);
-        reportVO.setTatolPayment(totalPayment);
 
-        return reportVO;
-    }
 }
 

+ 778 - 0
src/main/java/com/chuanghai/ihotel/util/CellStyleModel.java

@@ -0,0 +1,778 @@
+package com.chuanghai.ihotel.util;
+
+import lombok.Data;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.DefaultIndexedColorMap;
+import org.apache.poi.xssf.usermodel.XSSFColor;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * @Author: binguo
+ * @Date: 2022/12/27 星期二 10:07
+ * @Description: EasyExcel 样式信息类
+ * @Version: 1.0
+ */
+@Data
+public class CellStyleModel {
+
+
+    /**
+     * sheet名称
+     */
+    private String sheetName;
+    /**
+     * 列索引
+     */
+    private int colIndex;
+    /**
+     * 行索引
+     */
+    private int rowIndex;
+    /**
+     * 字体名称
+     */
+    private String fontName;
+    /**
+     * 字体大小
+     */
+    private Double fontHeight;
+    /**
+     * 字体颜色
+     */
+    private Object fontColor;
+    /**
+     * 字体加粗
+     */
+    private Boolean fontBold;
+    /**
+     * 字体斜体
+     */
+    private Boolean fontItalic;
+    /**
+     * 字体下划线
+     */
+    private Byte fontUnderLine;
+    /**
+     * 字体上标下标
+     */
+    private Short fontTypeOffset;
+    /**
+     * 字体删除线
+     */
+    private Boolean fontStrikeout;
+    /**
+     * 背景颜色
+     */
+    private Object backgroundColor;
+
+    /**
+     * 上边框线条类型
+     */
+    private BorderStyle borderTop;
+    /**
+     * 右边框线条类型
+     */
+    private BorderStyle borderRight;
+    /**
+     * 下边框线条类型
+     */
+    private BorderStyle borderBottom;
+    /**
+     * 左边框线条类型
+     */
+    private BorderStyle borderLeft;
+    /**
+     * 上边框线条颜色
+     */
+    private Object topBorderColor;
+    /**
+     * 上边框线条颜色
+     */
+    private Object rightBorderColor;
+    /**
+     * 下边框线条颜色
+     */
+    private Object bottomBorderColor;
+    /**
+     *
+     */
+    private Object leftBorderColor;
+    /**
+     * 水平对齐方式
+     */
+    private HorizontalAlignment horizontalAlignment;
+    /**
+     * 垂直对齐方式
+     */
+    private VerticalAlignment verticalAlignment;
+    /**
+     * 自动换行方式
+     */
+    private Boolean wrapText;
+
+    /**
+     * 生成字体名称样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param fontName    字体名称(默认宋体)
+     * @return
+     */
+    public static CellStyleModel createFontNameCellStyleModel(String sheetName, int rowIndex, int columnIndex, String fontName) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, fontName, null, null, null, null, null, null, null);
+    }
+
+    /**
+     * 生成字体名称大小信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param fontHeight  字体大小
+     * @return
+     */
+    public static CellStyleModel createFontHeightCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Double fontHeight) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, fontHeight, null, null, null, null, null, null);
+    }
+
+    /**
+     * 得到RBG自定义颜色
+     *
+     * @param redNum   红色数值
+     * @param greenNum 绿色数值
+     * @param blueNum  蓝色数值
+     * @return
+     */
+    public static XSSFColor getRGBColor(int redNum, int greenNum, int blueNum) {
+        XSSFColor color = new XSSFColor(new byte[]{(byte) redNum, (byte) greenNum, (byte) blueNum}, new DefaultIndexedColorMap());
+        return color;
+    }
+
+    /**
+     * 生成字体颜色样式信息(支持自定义RGB颜色)
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param redNum      红色数值
+     * @param greenNum    绿色数值
+     * @param blueNum     蓝色数值
+     * @return
+     */
+    public static CellStyleModel createFontColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , int redNum, int greenNum, int blueNum) {
+        XSSFColor fontColor = getRGBColor(redNum, greenNum, blueNum);
+        return createFontColorCellStyleModel(sheetName, rowIndex, columnIndex, fontColor);
+    }
+
+    /**
+     * 生成字体颜色样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param fontColor   字体颜色
+     * @return
+     */
+    public static CellStyleModel createFontColorCellStyleModel(String sheetName, int rowIndex, int columnIndex, Object fontColor) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, null, fontColor, null, null, null, null, null);
+    }
+
+    /**
+     * 生成字体加粗样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param fontBold    字体加粗
+     * @return
+     */
+    public static CellStyleModel createFontBoldCellStyleModel(String sheetName, int rowIndex, int columnIndex, Boolean fontBold) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, fontBold, null, null, null, null);
+    }
+
+    /**
+     * 生成字体斜体样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param fontItalic  字体斜体
+     * @return
+     */
+    public static CellStyleModel createFontItalicCellStyleModel(String sheetName, int rowIndex, int columnIndex, Boolean fontItalic) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, fontItalic, null, null, null);
+    }
+
+    /**
+     * 生成字体下划线样式信息
+     *
+     * @param sheetName     sheet页名称
+     * @param rowIndex      行号
+     * @param columnIndex   列号
+     * @param fontUnderLine 字体下划线
+     * @return
+     */
+    public static CellStyleModel createFontUnderLineCellStyleModel(String sheetName, int rowIndex, int columnIndex, Byte fontUnderLine) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, null, fontUnderLine, null, null);
+    }
+
+    /**
+     * 生成字体上标下标样式信息
+     *
+     * @param sheetName      sheet页名称
+     * @param rowIndex       行号
+     * @param columnIndex    列号
+     * @param fontTypeOffset 字体上标下标
+     * @return
+     */
+    public static CellStyleModel createFontTypeOffsetCellStyleModel(String sheetName, int rowIndex, int columnIndex, Short fontTypeOffset) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, null, null, fontTypeOffset, null);
+    }
+
+    /**
+     * 生成字体删除线样式信息
+     *
+     * @param sheetName     sheet页名称
+     * @param rowIndex      行号
+     * @param columnIndex   列号
+     * @param fontStrikeout 字体删除线
+     * @return
+     */
+    public static CellStyleModel createFontStrikeoutCellStyleModel(String sheetName, int rowIndex, int columnIndex, Boolean fontStrikeout) {
+        return createFontCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, null, null, null, fontStrikeout);
+    }
+
+    /**
+     * 生成字体样式信息
+     *
+     * @param sheetName      sheet页名称
+     * @param rowIndex       行号
+     * @param columnIndex    列号
+     * @param fontName       字体名称(默认宋体)
+     * @param fontHeight     字体大小
+     * @param fontColor      字体颜色
+     * @param fontBold       字体加粗
+     * @param fontItalic     字体斜体
+     * @param fontUnderLine  字体下划线
+     * @param fontTypeOffset 字体上标下标
+     * @param fontStrikeout  字体删除线
+     * @return
+     */
+    public static CellStyleModel createFontCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , String fontName, Double fontHeight, Object fontColor, Boolean fontBold, Boolean fontItalic, Byte fontUnderLine
+            , Short fontTypeOffset, Boolean fontStrikeout) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, fontName, fontHeight, fontColor, fontBold, fontItalic
+                , fontUnderLine, fontTypeOffset, fontStrikeout, null);
+    }
+
+    /**
+     * 生成背景颜色样式信息
+     *
+     * @param sheetName       sheet页名称
+     * @param rowIndex        行号
+     * @param columnIndex     列号
+     * @param backgroundColor 背景颜色
+     * @return
+     */
+    public static CellStyleModel createBackgroundColorCellStyleModel(String sheetName, int rowIndex, int columnIndex, Object backgroundColor) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, null, null, null, null, backgroundColor);
+    }
+
+    /**
+     * 生成背景颜色样式信息(支持自定义RGB颜色)
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param redNum      红色数值
+     * @param greenNum    绿色数值
+     * @param blueNum     蓝色数值
+     * @return
+     */
+    public static CellStyleModel createBackgroundColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , int redNum, int greenNum, int blueNum) {
+        XSSFColor backgroundColor = getRGBColor(redNum, greenNum, blueNum);
+        return createBackgroundColorCellStyleModel(sheetName, rowIndex, columnIndex, backgroundColor);
+    }
+
+    /**
+     * 生成样式信息
+     *
+     * @param sheetName       sheet页名称
+     * @param rowIndex        行号
+     * @param columnIndex     列号
+     * @param fontName        字体名称(宋体)
+     * @param fontHeight      字体大小
+     * @param fontColor       字体颜色
+     * @param fontBold        字体加粗
+     * @param fontItalic      字体斜体
+     * @param fontUnderLine   字体下划线
+     * @param fontTypeOffset  字体上标下标
+     * @param fontStrikeout   字体删除线
+     * @param backgroundColor 背景颜色
+     * @return
+     */
+    public static CellStyleModel createCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , String fontName, Double fontHeight, Object fontColor, Boolean fontBold, Boolean fontItalic, Byte fontUnderLine
+            , Short fontTypeOffset, Boolean fontStrikeout, Object backgroundColor) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, fontName, fontHeight, fontColor, fontBold, fontItalic
+                , fontUnderLine, fontTypeOffset, fontStrikeout, backgroundColor, null, null, null, null, null, null, null, null);
+    }
+
+    /**
+     * 生成上边框线条颜色样式信息
+     *
+     * @param sheetName      sheet页名称
+     * @param rowIndex       行号
+     * @param columnIndex    列号
+     * @param topBorderColor 上边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createTopBorderColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Object topBorderColor) {
+        return createBorderColorCellStyleModel(sheetName, rowIndex, columnIndex, topBorderColor, null, null, null);
+    }
+
+    /**
+     * 生成右边框线条颜色样式信息
+     *
+     * @param sheetName        sheet页名称
+     * @param rowIndex         行号
+     * @param columnIndex      列号
+     * @param rightBorderColor 右边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createRightBorderColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Object rightBorderColor) {
+        return createBorderColorCellStyleModel(sheetName, rowIndex, columnIndex, null, rightBorderColor, null, null);
+    }
+
+    /**
+     * 生成下边框线条颜色样式信息
+     *
+     * @param sheetName         sheet页名称
+     * @param rowIndex          行号
+     * @param columnIndex       列号
+     * @param bottomBorderColor 下边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createBottomBorderColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Object bottomBorderColor) {
+        return createBorderColorCellStyleModel(sheetName, rowIndex, columnIndex, null, null, bottomBorderColor, null);
+    }
+
+    /**
+     * 生成左边框线条颜色样式信息
+     *
+     * @param sheetName       sheet页名称
+     * @param rowIndex        行号
+     * @param columnIndex     列号
+     * @param leftBorderColor 左边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createLeftBorderColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Object leftBorderColor) {
+        return createBorderColorCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, leftBorderColor);
+    }
+
+    /**
+     * 生成上边框线条类型样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param borderTop   上边框线条类型
+     * @return
+     */
+    public static CellStyleModel createTopBorderLineTypeCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderTop) {
+        return createBorderLineTypeCellStyleModel(sheetName, rowIndex, columnIndex, borderTop, null, null, null);
+    }
+
+    /**
+     * 生成右边框线条类型样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param borderRight 右边框线条类型
+     * @return
+     */
+    public static CellStyleModel createRightBorderLineTypeCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderRight) {
+        return createBorderLineTypeCellStyleModel(sheetName, rowIndex, columnIndex, null, borderRight, null, null);
+    }
+
+    /**
+     * 生成下边框线条类型样式信息
+     *
+     * @param sheetName    sheet页名称
+     * @param rowIndex     行号
+     * @param columnIndex  列号
+     * @param borderBottom 下边框线条类型
+     * @return
+     */
+    public static CellStyleModel createBottomBorderLineTypeCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderBottom) {
+        return createBorderLineTypeCellStyleModel(sheetName, rowIndex, columnIndex, null, null, borderBottom, null);
+    }
+
+    /**
+     * 生成左边框线条类型样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param borderLeft  左边框线条类型
+     * @return
+     */
+    public static CellStyleModel createLeftBorderLineTypeCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderLeft) {
+        return createBorderLineTypeCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, borderLeft);
+    }
+
+    /**
+     * 生成边框线条颜色样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param borderColor 边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createBorderColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Object borderColor) {
+        return createBorderCellStyleModel(sheetName, rowIndex, columnIndex, null, borderColor);
+    }
+
+    /**
+     * 生成边框线条颜色样式信息
+     *
+     * @param sheetName         sheet页名称
+     * @param rowIndex          行号
+     * @param columnIndex       列号
+     * @param topBorderColor    上边框线条颜色
+     * @param rightBorderColor  右边框线条颜色
+     * @param bottomBorderColor 下边框线条颜色
+     * @param leftBorderColor   左边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createBorderColorCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Object topBorderColor, Object rightBorderColor, Object bottomBorderColor, Object leftBorderColor) {
+        return createBorderCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null
+                , topBorderColor, rightBorderColor, bottomBorderColor, leftBorderColor);
+    }
+
+    /**
+     * 生成边框线条类型样式信息
+     *
+     * @param sheetName      sheet页名称
+     * @param rowIndex       行号
+     * @param columnIndex    列号
+     * @param borderLineType 边框线条类型
+     * @return
+     */
+    public static CellStyleModel createBorderLineTypeCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderLineType) {
+        return createBorderCellStyleModel(sheetName, rowIndex, columnIndex, borderLineType, null);
+    }
+
+    /**
+     * 生成边框线条类型样式信息
+     *
+     * @param sheetName    sheet页名称
+     * @param rowIndex     行号
+     * @param columnIndex  列号
+     * @param borderTop    上边框线条类型
+     * @param borderRight  右边框线条类型
+     * @param borderBottom 下边框线条类型
+     * @param borderLeft   左边框线条类型
+     * @return
+     */
+    public static CellStyleModel createBorderLineTypeCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderTop, BorderStyle borderRight, BorderStyle borderBottom, BorderStyle borderLeft) {
+        return createBorderCellStyleModel(sheetName, rowIndex, columnIndex, borderTop, borderRight, borderBottom, borderLeft
+                , null, null, null, null);
+    }
+
+    /**
+     * 生成边框样式信息
+     *
+     * @param sheetName      sheet页名称
+     * @param rowIndex       行号
+     * @param columnIndex    列号
+     * @param borderLineType 边框线条类型
+     * @param borderColor    边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createBorderCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderLineType, Object borderColor) {
+        return createBorderCellStyleModel(sheetName, rowIndex, columnIndex, borderLineType, borderLineType, borderLineType, borderLineType
+                , borderColor, borderColor, borderColor, borderColor);
+    }
+
+    /**
+     * 生成边框样式信息
+     *
+     * @param sheetName         sheet页名称
+     * @param rowIndex          行号
+     * @param columnIndex       列号
+     * @param borderTop         上边框线条类型
+     * @param borderRight       右边框线条类型
+     * @param borderBottom      下边框线条类型
+     * @param borderLeft        左边框线条类型
+     * @param topBorderColor    上边框线条颜色
+     * @param rightBorderColor  右边框线条颜色
+     * @param bottomBorderColor 下边框线条颜色
+     * @param leftBorderColor   左边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createBorderCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , BorderStyle borderTop, BorderStyle borderRight, BorderStyle borderBottom, BorderStyle borderLeft, Object topBorderColor
+            , Object rightBorderColor, Object bottomBorderColor, Object leftBorderColor) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, null, null, null, null
+                , null, borderTop, borderRight, borderBottom, borderLeft, topBorderColor, rightBorderColor
+                , bottomBorderColor, leftBorderColor);
+    }
+
+    /**
+     * 生成样式信息
+     *
+     * @param sheetName         sheet页名称
+     * @param rowIndex          行号
+     * @param columnIndex       列号
+     * @param fontName          字体名称(宋体)
+     * @param fontHeight        字体大小
+     * @param fontColor         字体颜色
+     * @param fontBold          字体加粗
+     * @param fontItalic        字体斜体
+     * @param fontUnderLine     字体下划线
+     * @param fontTypeOffset    字体上标下标
+     * @param fontStrikeout     字体删除线
+     * @param backgroundColor   背景颜色
+     * @param borderTop         上边框线条类型
+     * @param borderRight       右边框线条类型
+     * @param borderBottom      下边框线条类型
+     * @param borderLeft        左边框线条类型
+     * @param topBorderColor    上边框线条颜色
+     * @param rightBorderColor  右边框线条颜色
+     * @param bottomBorderColor 下边框线条颜色
+     * @param leftBorderColor   左边框线条颜色
+     * @return
+     */
+    public static CellStyleModel createCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , String fontName, Double fontHeight, Object fontColor, Boolean fontBold, Boolean fontItalic, Byte fontUnderLine
+            , Short fontTypeOffset, Boolean fontStrikeout, Object backgroundColor, BorderStyle borderTop, BorderStyle borderRight
+            , BorderStyle borderBottom, BorderStyle borderLeft, Object topBorderColor, Object rightBorderColor, Object bottomBorderColor
+            , Object leftBorderColor) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, fontName, fontHeight, fontColor, fontBold, fontItalic
+                , fontUnderLine, fontTypeOffset, fontStrikeout, backgroundColor, borderTop, borderRight, borderBottom
+                , borderLeft, topBorderColor, rightBorderColor, bottomBorderColor, leftBorderColor, null, null);
+    }
+
+    /**
+     * 生成水平对齐方式信息
+     *
+     * @param sheetName           sheet页名称
+     * @param rowIndex            行号
+     * @param columnIndex         列号
+     * @param horizontalAlignment 水平对齐方式
+     * @return
+     */
+    public static CellStyleModel createHorizontalAlignmentCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , HorizontalAlignment horizontalAlignment) {
+        return createAlignmentCellStyleModel(sheetName, rowIndex, columnIndex, horizontalAlignment, null);
+    }
+
+    /**
+     * 生成垂直对齐方式信息
+     *
+     * @param sheetName         sheet页名称
+     * @param rowIndex          行号
+     * @param columnIndex       列号
+     * @param verticalAlignment 垂直对齐方式
+     * @return
+     */
+    public static CellStyleModel createVerticalAlignmentCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , VerticalAlignment verticalAlignment) {
+        return createAlignmentCellStyleModel(sheetName, rowIndex, columnIndex, null, verticalAlignment);
+    }
+
+    /**
+     * 生成对齐方式信息
+     *
+     * @param sheetName           sheet页名称
+     * @param rowIndex            行号
+     * @param columnIndex         列号
+     * @param horizontalAlignment 水平对齐方式
+     * @param verticalAlignment   垂直对齐方式
+     * @return
+     */
+    public static CellStyleModel createAlignmentCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null
+                , null, null, null, null, null, null, null
+                , null, null, null, null, null, null
+                , horizontalAlignment, verticalAlignment);
+    }
+
+    /**
+     * 生成样式信息
+     *
+     * @param sheetName           sheet页名称
+     * @param rowIndex            行号
+     * @param columnIndex         列号
+     * @param fontName            字体名称(宋体)
+     * @param fontHeight          字体大小
+     * @param fontColor           字体颜色
+     * @param fontBold            字体加粗
+     * @param fontItalic          字体斜体
+     * @param fontUnderLine       字体下划线
+     * @param fontTypeOffset      字体上标下标
+     * @param fontStrikeout       字体删除线
+     * @param backgroundColor     背景颜色
+     * @param borderTop           上边框线条类型
+     * @param borderRight         右边框线条类型
+     * @param borderBottom        下边框线条类型
+     * @param borderLeft          左边框线条类型
+     * @param topBorderColor      上边框线条颜色
+     * @param rightBorderColor    右边框线条颜色
+     * @param bottomBorderColor   下边框线条颜色
+     * @param leftBorderColor     左边框线条颜色
+     * @param horizontalAlignment 水平对齐方式
+     * @param verticalAlignment   垂直对齐方式
+     * @return
+     */
+    public static CellStyleModel createCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , String fontName, Double fontHeight, Object fontColor, Boolean fontBold, Boolean fontItalic, Byte fontUnderLine
+            , Short fontTypeOffset, Boolean fontStrikeout, Object backgroundColor, BorderStyle borderTop, BorderStyle borderRight
+            , BorderStyle borderBottom, BorderStyle borderLeft, Object topBorderColor, Object rightBorderColor, Object bottomBorderColor
+            , Object leftBorderColor, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, fontName, fontHeight, fontColor, fontBold, fontItalic
+                , fontUnderLine, fontTypeOffset, fontStrikeout, backgroundColor, borderTop, borderRight, borderBottom
+                , borderLeft, topBorderColor, rightBorderColor, bottomBorderColor, leftBorderColor, horizontalAlignment, verticalAlignment, null);
+    }
+
+    /**
+     * 生成自动换行样式信息
+     *
+     * @param sheetName   sheet页名称
+     * @param rowIndex    行号
+     * @param columnIndex 列号
+     * @param wrapText    自动换行
+     * @return
+     */
+    public static CellStyleModel createWrapTextCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , Boolean wrapText) {
+        return createCellStyleModel(sheetName, rowIndex, columnIndex, null, null, null, null, null
+                , null, null, null, null, null, null, null
+                , null, null, null, null, null, null, null
+                , wrapText);
+    }
+
+    /**
+     * 生成样式信息
+     *
+     * @param sheetName           sheet页名称
+     * @param rowIndex            行号
+     * @param columnIndex         列号
+     * @param fontName            字体名称(宋体)
+     * @param fontHeight          字体大小
+     * @param fontColor           字体颜色
+     * @param fontBold            字体加粗
+     * @param fontItalic          字体斜体
+     * @param fontUnderLine       字体下划线
+     * @param fontTypeOffset      字体上标下标
+     * @param fontStrikeout       字体删除线
+     * @param backgroundColor     背景颜色
+     * @param borderTop           上边框线条类型
+     * @param borderRight         右边框线条类型
+     * @param borderBottom        下边框线条类型
+     * @param borderLeft          左边框线条类型
+     * @param topBorderColor      上边框线条颜色
+     * @param rightBorderColor    右边框线条颜色
+     * @param bottomBorderColor   下边框线条颜色
+     * @param leftBorderColor     左边框线条颜色
+     * @param horizontalAlignment 水平对齐方式
+     * @param verticalAlignment   垂直对齐方式
+     * @param wrapText            自动换行
+     * @return
+     */
+    public static CellStyleModel createCellStyleModel(String sheetName, int rowIndex, int columnIndex
+            , String fontName, Double fontHeight, Object fontColor, Boolean fontBold, Boolean fontItalic, Byte fontUnderLine
+            , Short fontTypeOffset, Boolean fontStrikeout, Object backgroundColor, BorderStyle borderTop, BorderStyle borderRight
+            , BorderStyle borderBottom, BorderStyle borderLeft, Object topBorderColor, Object rightBorderColor, Object bottomBorderColor
+            , Object leftBorderColor, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, Boolean wrapText) {
+        CellStyleModel CellStyleModel = new CellStyleModel();
+        //sheet页名称
+        CellStyleModel.setSheetName(sheetName);
+        //行号
+        CellStyleModel.setRowIndex(rowIndex);
+        //列号
+        CellStyleModel.setColIndex(columnIndex);
+
+        //设置字体样式
+        //字体名称(比如宋体)
+        fontName = fontName != null && StrUtil.equals(fontName, "") ? "宋体" : fontName;
+        CellStyleModel.setFontName(fontName);
+        //字体大小
+        fontHeight = fontHeight != null && fontHeight <= 0 ? null : fontHeight;
+        CellStyleModel.setFontHeight(fontHeight);
+        //字体颜色
+        fontColor = fontColor != null && (fontColor instanceof IndexedColors == false && fontColor instanceof XSSFColor == false)
+                ? null : fontColor;
+        CellStyleModel.setFontColor(fontColor);
+        //字体加粗
+        CellStyleModel.setFontBold(fontBold);
+        //字体斜体
+        CellStyleModel.setFontItalic(fontItalic);
+        //字体下划线
+        fontUnderLine = fontUnderLine != null && (fontUnderLine != Font.U_NONE && fontUnderLine != Font.U_SINGLE && fontUnderLine != Font.U_DOUBLE
+                && fontUnderLine != Font.U_DOUBLE_ACCOUNTING && fontUnderLine != Font.U_SINGLE_ACCOUNTING) ? null : fontUnderLine;
+        CellStyleModel.setFontUnderLine(fontUnderLine);
+        //字体上标下标
+        fontTypeOffset = fontTypeOffset != null && (fontTypeOffset != Font.SS_NONE && fontTypeOffset != Font.SS_SUB && fontTypeOffset != Font.SS_SUPER)
+                ? null : fontTypeOffset;
+        CellStyleModel.setFontTypeOffset(fontTypeOffset);
+        //字体删除线
+        CellStyleModel.setFontStrikeout(fontStrikeout);
+
+        //背景颜色
+        backgroundColor = backgroundColor != null && (backgroundColor instanceof IndexedColors == false && backgroundColor instanceof XSSFColor == false)
+                ? null : backgroundColor;
+        CellStyleModel.setBackgroundColor(backgroundColor);
+
+        //边框样式
+        //上边框线条类型
+        CellStyleModel.setBorderTop(borderTop);
+        //右边框线条类型
+        CellStyleModel.setBorderRight(borderRight);
+        //下边框线条类型
+        CellStyleModel.setBorderBottom(borderBottom);
+        //左边框线条类型
+        CellStyleModel.setBorderLeft(borderLeft);
+        //上边框颜色类型
+        CellStyleModel.setTopBorderColor(topBorderColor);
+        //右边框颜色类型
+        CellStyleModel.setRightBorderColor(rightBorderColor);
+        //下边框颜色类型
+        CellStyleModel.setBottomBorderColor(bottomBorderColor);
+        //左边框颜色类型
+        CellStyleModel.setLeftBorderColor(leftBorderColor);
+
+        //对齐方式
+        //水平对齐方式
+        CellStyleModel.setHorizontalAlignment(horizontalAlignment);
+        //垂直对齐方式
+        CellStyleModel.setVerticalAlignment(verticalAlignment);
+
+        //自动换行
+        CellStyleModel.setWrapText(wrapText);
+        return CellStyleModel;
+    }
+}
+
+

+ 2 - 0
src/main/java/com/chuanghai/ihotel/util/RSAUtils.java

@@ -150,6 +150,8 @@ public class RSAUtils {
 
     public static void main(String[] args) {
 
+        
+
 
 
         try {

+ 19 - 0
src/main/java/com/chuanghai/ihotel/vo/AdminOrderIndexVO.java

@@ -4,6 +4,8 @@ import com.chuanghai.ihotel.entity.HotelOrderBillEntity;
 import com.chuanghai.ihotel.entity.HotelOrderEntity;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * @Author: codingliang
  * @Description: 管理员订单首页
@@ -21,4 +23,21 @@ public class AdminOrderIndexVO {
      * 订单账单信息
      */
     private HotelOrderBillEntity orderBill;
+
+    /**
+     * 水费总金额
+     */
+    private BigDecimal allOfWaterAmount;
+    /**
+     * 电费总金额
+     */
+    private BigDecimal allOfElectricPayment;
+    /**
+     * 收预付款=  住房天数 * 住房押金(天)
+     */
+    private BigDecimal allOfReceiveAmount;
+    /**
+     * 退预付款(refundPayment)= 收预付款(allOfReceiveAmount) + 实际支付金额(payAmount) - 水费总金额(allOfWaterAmount) - 电费总金额(allOfElectricPayment)
+     */
+    private BigDecimal refundPayment;
 }

+ 57 - 0
src/main/java/com/chuanghai/ihotel/vo/HotelAdminVO.java

@@ -0,0 +1,57 @@
+package com.chuanghai.ihotel.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+
+/**
+ * @Author: binguo
+ * @Date: 2022/12/30 星期五 10:57
+ * @Description: com.chuanghai.ihotel.vo
+ * @Version: 1.0
+ */
+@Data
+public class HotelAdminVO {
+    /**
+     * id
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    @TableId
+    private Long id;
+    /**
+     * 手机号码 登录账号
+     */
+    @NotBlank(message = "手机号码不能为空")
+    private String phone;
+    /**
+     * 员工姓名
+     */
+    @NotBlank(message = "员工姓名不能为空")
+    private String username;
+    /**
+     * 管理员类别 1超级管理员、2普通管理员
+     */
+    @NotBlank(message = "管理员类别不能为空")
+    @Pattern(regexp = "[1-2]", message = "管理员类别只能为1或2")
+    private String adminType;
+    /**
+     * 密码 登录密码,新增时不能为空,使用RSA加密后传输
+     */
+    private String password;
+    /**
+     * 状态 0冻结、1正常
+     */
+    @NotBlank(message = "状态不能为空")
+    @Pattern(regexp = "[1-2]", message = "状态只能为1或2")
+    private String statu;
+
+    /**
+     * 权限字符数组
+     */
+    //@NotBlank(message = "权限不能为空")
+    private String[] authority;
+
+}

+ 6 - 6
src/main/java/com/chuanghai/ihotel/vo/HotelAndBillVO.java

@@ -30,38 +30,38 @@ public class HotelAndBillVO {
      * 订单状态 0已取消、1待支付、2待入住、3已入住、4待结账、5已完成
      */
     @ExcelProperty(value = "支付状态", converter= PayStatuConverter.class)
-    @ColumnWidth(25)
+    @ColumnWidth(15)
     private String orderStatu;
     /**
      * 房间编号
      */
     @ExcelProperty("房间编号")
-    @ColumnWidth(25)
+    @ColumnWidth(15)
     private String roomNo;
     /**
      * 电费
      */
     @ExcelProperty("电费")
-    @ColumnWidth(25)
+    @ColumnWidth(15)
     private String electricity;
     /**
      * 水费
      */
     @ExcelProperty("水费")
-    @ColumnWidth(25)
+    @ColumnWidth(15)
     private String waterBill;
     /**
      * 收预付款
      */
     @ExcelProperty("收预付款")
-    @ColumnWidth(25)
+    @ColumnWidth(15)
     @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal acceptPayment;
     /**
      * 退预付款
      */
     @ExcelProperty("退预付款")
-    @ColumnWidth(25)
+    @ColumnWidth(15)
     @JsonSerialize(using = BigDecimalSerializer.class)
     private BigDecimal refundPayment;
     /**

+ 4 - 0
src/main/java/com/chuanghai/ihotel/vo/LoginUserVO.java

@@ -41,4 +41,8 @@ public class LoginUserVO {
      * token过期时间
      */
     private long tokenTtl;
+    /**
+     * 权限数组
+     */
+    private String authority;
 }

+ 3 - 0
src/main/resources/application.yml

@@ -53,6 +53,9 @@ mybatis-plus:
   global-config:
     db-config:
       id-type: assign_id
+#  configuration:
+#    #关闭sql打印
+#    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
 logging:
   level:
     com.chuanghai: debug

+ 2 - 1
src/main/resources/mapper/ihotel/HotelAdminDao.xml

@@ -11,7 +11,8 @@
         <result property="adminType" column="admin_type"/>
         <result property="password" column="password"/>
         <result property="statu" column="statu"/>
+        <result property="authority" column="authority"/>
     </resultMap>
 
 
-</mapper>
+</mapper>