Browse Source

房态管理

liujunqiang 2 years ago
parent
commit
8c3434044e

+ 6 - 6
mhotel/src/com/happy/Model/House.java

@@ -14,12 +14,12 @@ public class House {
 	/**
 	 * id
 	 */
-	private Integer id;
+	private String id;
 
 	/**
 	 * 所属商家Id
 	 */
-	private Integer managerId;
+	private String managerId;
 
 	/**
 	 * 房型名称
@@ -79,19 +79,19 @@ public class House {
 	 */
 	private List<FileInfo> fileInfoList;
 
-	public Integer getId() {
+	public String getId() {
 		return id;
 	}
 
-	public void setId(Integer id) {
+	public void setId(String id) {
 		this.id = id;
 	}
 
-	public Integer getManagerId() {
+	public String getManagerId() {
 		return managerId;
 	}
 
-	public void setManagerId(Integer managerId) {
+	public void setManagerId(String managerId) {
 		this.managerId = managerId;
 	}
 

+ 14 - 0
mhotel/src/com/happy/Model/HouseNumber.java

@@ -1,5 +1,7 @@
 package com.happy.Model;
 
+import com.happy.dto.HouseNumberStatusDto;
+
 import java.util.Date;
 /**
  * @Description  
@@ -17,6 +19,11 @@ public class HouseNumber {
 	private Date modifyDate; // 修改时间
 	private Integer status; // 状态(0.删除 1.正常)
 
+	/**
+	 * 房态信息 房态管理-房态管理
+	 */
+	private HouseNumberStatusDto houseNumberStatus;
+
 
 	public String getId() {
 		return id;
@@ -80,4 +87,11 @@ public class HouseNumber {
 		this.status = status;
 	}
 
+	public HouseNumberStatusDto getHouseNumberStatus() {
+		return houseNumberStatus;
+	}
+
+	public void setHouseNumberStatus(HouseNumberStatusDto houseNumberStatus) {
+		this.houseNumberStatus = houseNumberStatus;
+	}
 }

+ 24 - 0
mhotel/src/com/happy/Until/DateUtil.java

@@ -502,6 +502,30 @@ public class DateUtil
     }
 
     /**
+     * 获得两个日期之间的所有日期
+     *
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     */
+    public static List<String> getDateStrListBetween(Date startDate, Date endDate) {
+        List<String> result = new ArrayList<>();
+        result.add(parseDateToStr(startDate, Time_Formatter_Day));
+        Calendar calBegin = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calBegin.setTime(startDate);
+        Calendar calEnd = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calEnd.setTime(endDate);
+        // 测试此日期是否在指定日期之后
+        while (endDate.after(calBegin.getTime())) {
+            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+            calBegin.add(Calendar.DAY_OF_MONTH, 1);
+            result.add(parseDateToStr(calBegin.getTime(), Time_Formatter_Day));
+        }
+        return result;
+    }
+
+    /**
      * 判断当前时间是否在[startTime, endTime]区间
      *
      * @param dataIn 传入的时间

+ 59 - 0
mhotel/src/com/happy/action/HouseNumberStatusAction.java

@@ -1,8 +1,16 @@
 package com.happy.action;
 
+import com.alibaba.fastjson.JSONObject;
+import com.happy.Until.GetHttpParam;
+import com.happy.Until.ResUtil;
 import com.happy.common.controller.BaseController;
 import com.happy.dto.HouseNumberStatusDto;
+import com.happy.service.HouseNumberStatusService;
 import com.opensymphony.xwork2.ModelDriven;
+import lombok.SneakyThrows;
+import org.apache.struts2.ServletActionContext;
+
+import javax.annotation.Resource;
 
 public class HouseNumberStatusAction extends BaseController implements ModelDriven<HouseNumberStatusDto> {
     private final HouseNumberStatusDto houseNumberStatusDto = new HouseNumberStatusDto();
@@ -12,4 +20,55 @@ public class HouseNumberStatusAction extends BaseController implements ModelDriv
         return houseNumberStatusDto;
     }
 
+    @Resource(name = "HouseNumberStatusService")
+    private HouseNumberStatusService houseNumberStatusService;
+    /**
+     * 表格数据 房态管理-房态管理
+     */
+    public void queryData() {
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+            put("data", houseNumberStatusService.queryData(houseNumberStatusDto));
+        }}.toString());
+
+    }
+
+    /**
+     * 查询可置脏/净、可开/关的房型及房间号 房态管理-房态管理
+     */
+    public void queryListWithHouse() {
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+            put("data", houseNumberStatusService.queryListWithHouse(houseNumberStatusDto));
+        }}.toString());
+
+    }
+
+    /**
+     * 批量置脏/净、批量开/关房 房态管理-房态管理
+     */
+    @SneakyThrows
+    public void modifyStatusBatch() {
+        String postDataStr = GetHttpParam.getRequestPostData(request);
+        HouseNumberStatusDto postDataObj = JSONObject.parseObject(postDataStr, HouseNumberStatusDto.class);
+        houseNumberStatusService.modifyStatusBatch(postDataObj);
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+        }}.toString());
+    }
+
+    /**
+     * 置脏/净、开/关房 房态管理-房态管理
+     */
+    @SneakyThrows
+    public void modifyStatus() {
+        houseNumberStatusService.modifyStatus(houseNumberStatusDto);
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+        }}.toString());
+    }
 }

+ 22 - 6
mhotel/src/com/happy/action/HousePriceAction.java

@@ -31,11 +31,15 @@ public class HousePriceAction extends BaseController implements ModelDriven<Hous
      */
     @SneakyThrows
     public void modifyPriceBatch() {
-        String PostDataStr = GetHttpParam.getRequestPostData(request);
-        JSONObject PostDataJSONObject = JSONObject.parseObject(PostDataStr);
-        List<String> dateList = PostDataJSONObject.getJSONArray("dateList").toJavaList(String.class);
-        List<HousePrice> priceList = PostDataJSONObject.getJSONArray("priceList").toJavaList(HousePrice.class);
+        String postDataStr = GetHttpParam.getRequestPostData(request);
+        JSONObject postDataJSONObject = JSONObject.parseObject(postDataStr);
+        List<String> dateList = postDataJSONObject.getJSONArray("dateList").toJavaList(String.class);
+        List<HousePrice> priceList = postDataJSONObject.getJSONArray("priceList").toJavaList(HousePrice.class);
         housePriceService.modifyPriceBatch(dateList, priceList);
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+        }}.toString());
     }
 
     /**
@@ -43,6 +47,10 @@ public class HousePriceAction extends BaseController implements ModelDriven<Hous
      */
     public void modifyPrice() {
         housePriceService.modifyPrice(housePriceDto);
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+        }}.toString());
     }
 
     /**
@@ -50,18 +58,26 @@ public class HousePriceAction extends BaseController implements ModelDriven<Hous
      */
     public void queryPage() {
         ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
-            put("message", "查询成功");
+            put("message", "请求成功");
             put("code", 200);
             put("data", housePriceService.queryPage(housePriceDto, page, rows));
         }}.toString());
     }
 
+    public void queryHouseListByManagerId() {
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "请求成功");
+            put("code", 200);
+            put("data", housePriceService.queryHouseListByManagerId(housePriceDto.getManagerId()));
+        }}.toString());
+    }
+
     /**
      * 表格数据 房态管理-房价管理-改价记录
      */
     public void queryPageHistory() {
         ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
-            put("message", "查询成功");
+            put("message", "请求成功");
             put("code", 200);
             put("data", housePriceService.queryPageHistory(housePriceDto, page, rows));
         }}.toString());

+ 4 - 4
mhotel/src/com/happy/action/houseAction.java

@@ -115,7 +115,7 @@ public class houseAction extends ActionSupport implements ServletRequestAware {
                 return null;
             }
             //房型验证成功添加房号
-            Long id = UUIDUtil.generateID();
+            String id = Func.newGuid();
             List<String> houseNumberList = Arrays.asList(houseNumber.split(","));
             List<HouseNumber> houseNumbers = new ArrayList<HouseNumber>();
             long count = houseNumberList.stream().distinct().count();
@@ -127,14 +127,14 @@ public class houseAction extends ActionSupport implements ServletRequestAware {
             }
             for (String s : houseNumberList){
                 HouseNumber h1 = new HouseNumber();
-                h1.setHouseId(Long.toString(id));
+                h1.setHouseId(id);
                 h1.setNumberName(s);
                 h1.setStatus(1);
                 houseNumbers.add(h1);
             }
             //执行批量房间号表操作
             int a = houseNumberService.saveBatch(houseNumbers);
-            house.setId(Math.toIntExact(id));
+            house.setId(id);
             int m = houseService.insertHouse(house);
             if (m > 0) {
                 for(FileInfo file : fileList){
@@ -224,7 +224,7 @@ public class houseAction extends ActionSupport implements ServletRequestAware {
             List<HouseNumber> houseNumbers = new ArrayList<HouseNumber>();
             for (String s : houseNumberList){
                 HouseNumber h1 = new HouseNumber();
-                h1.setHouseId(Long.toString(house.getId()));
+                h1.setHouseId(house.getId());
                 h1.setNumberName(s);
                 h1.setStatus(1);
                 houseNumbers.add(h1);

+ 5 - 1
mhotel/src/com/happy/dao/HouseNumberDao.java

@@ -3,7 +3,6 @@ package com.happy.dao;
 import com.happy.Model.Booking;
 import com.happy.Model.HouseNumber;
 
-import java.awt.print.Book;
 import java.util.List;
 
 public interface HouseNumberDao {
@@ -12,4 +11,9 @@ public interface HouseNumberDao {
     int updateBatch(List<HouseNumber> list);
 
     List<HouseNumber> queryHouseStatus(Booking book);
+
+    /**
+     * 查询指定房型下的所有非删除状态的房间
+     */
+    List<HouseNumber> queryListByHouseIdList(List<String> houseIdList);
 }

+ 10 - 0
mhotel/src/com/happy/dao/HouseNumberStatusDao.java

@@ -1,9 +1,19 @@
 package com.happy.dao;
 
 import com.happy.Model.HouseNumberStatus;
+import com.happy.dto.HouseNumberStatusDto;
 
 import java.util.List;
 
 public interface HouseNumberStatusDao {
     int saveBatch(List<HouseNumberStatus> list);
+
+    List<HouseNumberStatusDto> queryList(HouseNumberStatusDto houseNumberStatusDto);
+
+    void updateStatus(HouseNumberStatusDto houseNumberStatusDto);
+
+    /**
+     * 通过订单id集合查询订单表的一些信息集合
+     */
+    List<HouseNumberStatusDto> queryOrderSomeColumnListByIds(List<String> ids);
 }

+ 8 - 5
mhotel/src/com/happy/dao/impl/HouseNumberImplDao.java

@@ -1,7 +1,6 @@
 package com.happy.dao.impl;
 
 import com.happy.Model.Booking;
-import com.happy.Model.HotelCoupon;
 import com.happy.Model.HouseNumber;
 import com.happy.Until.UUIDUtil;
 import com.happy.dao.HouseNumberDao;
@@ -13,12 +12,8 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource;
 import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
 import org.springframework.stereotype.Repository;
 
-import java.awt.print.Book;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
 
 @Repository("HouseNumberDao")
@@ -91,4 +86,12 @@ public class HouseNumberImplDao  implements HouseNumberDao {
         if(list != null && list.size()>0) return list;
         return null;
     }
+
+    @Override
+    public List<HouseNumber> queryListByHouseIdList(List<String> houseIdList) {
+        final String sql = "select id, house_id, number_name, create_id, create_date, modify_date, status from house_number where status in (1, 2) and house_id in (:houseIdList) order by number_name";
+        return namedParameterJdbcTemplate.query(sql, new MapSqlParameterSource() {{
+            addValue("houseIdList", houseIdList);
+        }}, new BeanPropertyRowMapper<>(HouseNumber.class));
+    }
 }

+ 74 - 6
mhotel/src/com/happy/dao/impl/HouseNumberStatusImplDao.java

@@ -1,20 +1,20 @@
 package com.happy.dao.impl;
 
-import com.happy.Model.HouseNumber;
 import com.happy.Model.HouseNumberStatus;
-import com.happy.Until.UUIDUtil;
-import com.happy.dao.HouseNumberDao;
+import com.happy.Until.BeanMapTool;
 import com.happy.dao.HouseNumberStatusDao;
+import com.happy.dto.HouseNumberStatusDto;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.jdbc.core.namedparam.SqlParameterSource;
 import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
 import org.springframework.stereotype.Repository;
 
-import java.util.ArrayList;
 import java.util.List;
-import java.util.UUID;
+import java.util.Map;
 
 @Repository("HouseNumberStatusDao")
 public class HouseNumberStatusImplDao implements HouseNumberStatusDao {
@@ -36,7 +36,75 @@ public class HouseNumberStatusImplDao implements HouseNumberStatusDao {
         String insertSql = "INSERT INTO `house_number_status` (`id`, `number_id`, `booking_id`, `close_type`, `remark`, `set_date`, `create_id`, `create_date` , `modify_date` , `status`  )" +
                 " VALUES " +
                 " (:id,:numberId,:bookingId,:closeType,:remark,:setDate,:createId,:createDate,:modifyDate,:status) ";
-        int[] m = namedParameterJdbcTemplate.batchUpdate(insertSql,params);
+        int[] m = namedParameterJdbcTemplate.batchUpdate(insertSql, params);
         return m.length;
     }
+
+    @Override
+    public void updateStatus(HouseNumberStatusDto houseNumberStatusDto) {
+        StringBuilder sql = new StringBuilder("update house_number_status set status = :status, modify_date = :modifyDate");
+        if (StringUtils.isNotBlank(houseNumberStatusDto.getRemark())) {
+            sql.append(", remark = :remark");
+        }
+        sql.append(" where status != 0");
+        Map<String, Object> paramMap = buildParamMap(houseNumberStatusDto);
+        StringBuilder sqlLast = buildSql(sql.toString(), "", houseNumberStatusDto);
+        namedParameterJdbcTemplate.update(sqlLast.toString(), paramMap);
+    }
+
+    @Override
+    public List<HouseNumberStatusDto> queryList(HouseNumberStatusDto houseNumberStatusDto) {
+        final String SQL_HEAD = "select id, number_id, booking_id, close_type, remark, date_format(set_date, '%Y-%m-%d') as set_date, create_id, date_format(create_date, '%Y-%m-%d %H:%i:%s') as create_date, date_format(modify_date, '%Y-%m-%d %H:%i:%s') as modify_date, status from house_number_status where 1 = 1";
+        final String SQL_TAIL = "order by create_date desc ";
+        Map<String, Object> paramMap = buildParamMap(houseNumberStatusDto);
+        StringBuilder sql = buildSql(SQL_HEAD, SQL_TAIL, houseNumberStatusDto);
+        return namedParameterJdbcTemplate.query(sql.toString(), paramMap, new BeanPropertyRowMapper<>(HouseNumberStatusDto.class));
+    }
+
+    @Override
+    public List<HouseNumberStatusDto> queryOrderSomeColumnListByIds(List<String> ids) {
+        final String sql = "select id as bookingId, order_num, user_name as orderUserName, user_phone as orderUserPhone, pay_account as orderPayAccount, date_format(order_start_time, '%Y-%m-%d %H:%i:%s') as order_start_time, date_format(order_end_time, '%Y-%m-%d %H:%i:%s') as order_end_time from booking where id in (:ids)";
+        return namedParameterJdbcTemplate.query(sql, new MapSqlParameterSource() {{
+            addValue("ids", ids);
+        }}, new BeanPropertyRowMapper<>(HouseNumberStatusDto.class));
+    }
+
+    private StringBuilder buildSql(String sqlHead, String sqlTail, HouseNumberStatusDto houseNumberStatusDto) {
+        StringBuilder sql = new StringBuilder(sqlHead);
+        if (StringUtils.isNotBlank(houseNumberStatusDto.getNumberId())) {
+            sql.append(" and number_id = :numberId");
+        }
+        if (houseNumberStatusDto.getHouseNumberIds() != null && !houseNumberStatusDto.getHouseNumberIds().isEmpty()) {
+            sql.append(" and number_id in (:houseNumberIds)");
+        }
+        String setDate = houseNumberStatusDto.getSetDate();
+        if (StringUtils.isNotBlank(setDate)) {
+            String[] setDateArr = setDate.split(",");
+            if (setDateArr.length == 1) {
+                sql.append(" and date_format(set_date, '%Y-%m-%d') = :setDate");
+            } else {
+                sql.append(" and (date_format(set_date, '%Y-%m-%d')")
+                        .append(String.format(" between :%s and :%s)", HousePriceDaoImpl.KEY_START_SET_DATE, HousePriceDaoImpl.KEY_END_SET_DATE));
+            }
+        }
+        if (houseNumberStatusDto.getStatus() != null) {
+            sql.append(" and status = :status");
+        }
+        if (houseNumberStatusDto.getStatuses() != null && !houseNumberStatusDto.getStatuses().isEmpty()) {
+            sql.append(" and status in (:statuses)");
+        }
+        sql.append(sqlTail);
+        return sql;
+    }
+
+    private Map<String, Object> buildParamMap(HouseNumberStatusDto houseNumberStatusDto) {
+        Map<String, Object> paramMap = BeanMapTool.beanToMap(houseNumberStatusDto);
+        String setDate = houseNumberStatusDto.getSetDate();
+        if (StringUtils.isNotBlank(setDate) && setDate.split(",").length == 2) {
+            String[] setDateArr = setDate.split(",");
+            paramMap.put(HousePriceDaoImpl.KEY_START_SET_DATE, setDateArr[0]);
+            paramMap.put(HousePriceDaoImpl.KEY_END_SET_DATE, setDateArr[1]);
+        }
+        return paramMap;
+    }
 }

+ 20 - 7
mhotel/src/com/happy/dao/impl/HousePriceDaoImpl.java

@@ -21,6 +21,10 @@ public class HousePriceDaoImpl implements HousePriceDao {
 
     static final String KEY_START_SET_DATE = "startSetDate";
     static final String KEY_END_SET_DATE = "endSetDate";
+    private final String KEY_START_OPERATION_TIME = "startOperationTime";
+    private final String KEY_END_OPERATION_TIME = "endOperationTime";
+    private static final String KEY_PAGE_NUMBER = "pageNumber";
+    private static final String KEY_PAGE_SIZE = "pageSize";
 
     @Override
     public void insertBatch(List<HousePrice> housePriceList) {
@@ -33,7 +37,7 @@ public class HousePriceDaoImpl implements HousePriceDao {
         final String SQL_HEAD = "select t1.id as houseId, t1.h_name as houseName, t1.price as originalPrice, t1.create_date from house t1 where t1.status = 1";
         final String SQL_TAIL = " order by t1.create_date desc";
         Map<String, Object> paramMap = buildParamMap(housePriceDto, pageNumber, pageSize);
-        StringBuilder sql = buildSqlHouse(SQL_HEAD, "", housePriceDto, pageNumber, pageSize);
+        StringBuilder sql = buildSqlHouse(SQL_HEAD, SQL_TAIL, housePriceDto, pageNumber, pageSize);
         return namedParameterJdbcTemplate.query(sql.toString(), paramMap, new BeanPropertyRowMapper<>(HousePriceDto.class));
     }
 
@@ -86,6 +90,9 @@ public class HousePriceDaoImpl implements HousePriceDao {
         if (StringUtils.isNotBlank(housePriceDto.getHouseId())) {
             sql.append(" and t1.house_id=:houseId");
         }
+        if (StringUtils.isNotBlank(housePriceDto.getOperationTime())) {
+            sql.append(String.format(" and t1.create_date between :%s and :%s", KEY_START_OPERATION_TIME, KEY_END_OPERATION_TIME));
+        }
         String setDate = housePriceDto.getSetDate();
         if (StringUtils.isNotBlank(setDate) && setDate.split(",").length == 2) {
             sql.append(String.format(" and(substring_index(t1.set_date, ',', 1) between :%s and :%s", KEY_START_SET_DATE, KEY_END_SET_DATE))
@@ -113,12 +120,12 @@ public class HousePriceDaoImpl implements HousePriceDao {
     /**
      * 构建分页查询条件
      */
-    private String buildSqlPage(Integer pageNumber, Integer pageSize) {
+    static String buildSqlPage(Integer pageNumber, Integer pageSize) {
         String result = "";
         if (pageNumber != null && pageSize != null) {
-            result = " limit :pageNumber, :pageSize";
+            result = String.format(" limit :%s, :%s", KEY_PAGE_NUMBER, KEY_PAGE_SIZE);
         } else if (pageSize != null) {
-            result = " limit :pageSize";
+            result = String.format(" limit :%s", KEY_PAGE_SIZE);
         }
         return result;
     }
@@ -128,6 +135,12 @@ public class HousePriceDaoImpl implements HousePriceDao {
      */
     private Map<String, Object> buildParamMap(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
         Map<String, Object> paramMap = BeanMapTool.beanToMap(housePriceDto);
+        String operationTime = housePriceDto.getOperationTime();
+        if (StringUtils.isNotBlank(operationTime)) {
+            String[] operationTimeArr = operationTime.split(",");
+            paramMap.put(KEY_START_OPERATION_TIME, operationTimeArr[0]);
+            paramMap.put(KEY_END_OPERATION_TIME, operationTimeArr[1]);
+        }
         String setDate = housePriceDto.getSetDate();
         if (StringUtils.isNotBlank(setDate) && setDate.split(",").length == 2) {
             String[] setDateArr = setDate.split(",");
@@ -142,10 +155,10 @@ public class HousePriceDaoImpl implements HousePriceDao {
      */
     static Map<String, Object> putPageParams(Integer pageNumber, Integer pageSize, Map<String, Object> paramMap) {
         if (pageNumber != null && pageSize != null) {
-            paramMap.put("pageNumber", (pageNumber - 1) * pageSize);
-            paramMap.put("pageSize", pageSize);
+            paramMap.put(KEY_PAGE_NUMBER, (pageNumber - 1) * pageSize);
+            paramMap.put(KEY_PAGE_SIZE, pageSize);
         } else if (pageSize != null) {
-            paramMap.put("pageSize", pageSize);
+            paramMap.put(KEY_PAGE_SIZE, pageSize);
         }
         return paramMap;
     }

+ 45 - 0
mhotel/src/com/happy/dto/HouseNumberStatusDto.java

@@ -4,8 +4,53 @@ import com.happy.Model.HouseNumberStatus;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class HouseNumberStatusDto extends HouseNumberStatus {
+    /**
+     * 商家id
+     */
+    private String managerId;
+    /**
+     * 房间id集合
+     */
+    private List<String> houseNumberIds;
+
+    /**
+     * 房间id集合
+     */
+    private List<Integer> statuses;
+    /**
+     * 约定:1为日历房态管理,2为单日房态管理,
+     */
+    private Integer showType;
 
+    //region 订单表(booking)的一些字段
+    /**
+     * 订单-订单号
+     */
+    private String orderNum;
+    /**
+     * 订单-住客姓名
+     */
+    private String orderUserName;
+    /**
+     * 订单-住客手机号
+     */
+    private String orderUserPhone;
+    /**
+     * 订单-实际支付金额
+     */
+    private String orderPayAccount;
+    /**
+     * 订单-订房开始时间
+     */
+    private String orderStartTime;
+    /**
+     * 订单-订房结束时间
+     */
+    private String orderEndTime;
+    //endregion
 }

+ 21 - 0
mhotel/src/com/happy/service/HouseNumberStatusService.java

@@ -1,9 +1,30 @@
 package com.happy.service;
 
 import com.happy.Model.HouseNumberStatus;
+import com.happy.dto.HouseNumberStatusDto;
 
 import java.util.List;
 
 public interface HouseNumberStatusService {
     int saveBatch(List<HouseNumberStatus> list);
+
+    /**
+     * 表格数据 房态管理-房态管理
+     */
+    List<?> queryData(HouseNumberStatusDto houseNumberStatusDto);
+
+    /**
+     * 查询可置脏/净、可开/关的房型及房间号 房态管理-房态管理
+     */
+    List<?> queryListWithHouse(HouseNumberStatusDto houseNumberStatusDto);
+
+    /**
+     * 批量置脏/净、批量开/关房
+     */
+    void modifyStatusBatch(HouseNumberStatusDto houseNumberStatusDto);
+
+    /**
+     * 置脏/净、批量开/关房
+     */
+    void modifyStatus(HouseNumberStatusDto houseNumberStatusDto);
 }

+ 8 - 0
mhotel/src/com/happy/service/HousePriceService.java

@@ -1,6 +1,7 @@
 package com.happy.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.House;
 import com.happy.Model.HousePrice;
 import com.happy.dto.HousePriceDto;
 import com.happy.dto.IPage;
@@ -35,4 +36,11 @@ public interface HousePriceService {
      * @param pageSize      每页显示的条数
      */
     IPage<HousePriceDto> queryPageHistory(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize);
+
+    /**
+     * 查询指定商家的所有status为1的房型
+     *
+     * @param managerId 商家id
+     */
+    List<House> queryHouseListByManagerId(String managerId);
 }

+ 297 - 2
mhotel/src/com/happy/service/impl/HouseNumberStatusImplService.java

@@ -1,21 +1,316 @@
 package com.happy.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.House;
+import com.happy.Model.HouseNumber;
 import com.happy.Model.HouseNumberStatus;
+import com.happy.Until.DateUtil;
+import com.happy.Until.Func;
 import com.happy.dao.HouseNumberDao;
 import com.happy.dao.HouseNumberStatusDao;
+import com.happy.dao.HousePriceDao;
+import com.happy.dto.HouseNumberStatusDto;
+import com.happy.dto.HousePriceDto;
 import com.happy.service.HouseNumberStatusService;
+import com.happy.service.HousePriceService;
+import lombok.SneakyThrows;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.beans.PropertyDescriptor;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service("HouseNumberStatusService")
 public class HouseNumberStatusImplService implements HouseNumberStatusService {
 
-    @Resource
+    @Resource(name = "HouseNumberStatusDao")
     public HouseNumberStatusDao houseNumberStatusDao;
+    @Resource(name = "housePriceService")
+    private HousePriceService housePriceService;
+    @Resource(name = "HouseNumberDao")
+    public HouseNumberDao houseNumberDao;
+    @Resource(name = "housePriceDao")
+    public HousePriceDao housePriceDao;
+
     @Override
     public int saveBatch(List<HouseNumberStatus> list) {
         return houseNumberStatusDao.saveBatch(list);
     }
+
+    @Override
+    public List<?> queryData(HouseNumberStatusDto houseNumberStatusDto) {
+        String managerId = houseNumberStatusDto.getManagerId();
+        Integer showType = houseNumberStatusDto.getShowType();
+        if (StringUtils.isBlank(managerId) || showType == null) return Collections.emptyList();
+        List<House> houseList = housePriceService.queryHouseListByManagerId(houseNumberStatusDto.getManagerId());
+        if (houseList.isEmpty()) return houseList;
+        List<HouseNumber> houseNumberList = houseNumberDao.queryListByHouseIdList(houseList.stream().map(House::getId).collect(Collectors.toList()));
+        if (houseNumberList.isEmpty()) return houseList;
+
+        String setDate = houseNumberStatusDto.getSetDate();
+        Date startDate = DateUtil.parseDateOnly(setDate);
+        Date endDate = DateUtil.addDate(startDate, Calendar.DATE, 27);
+        String setDateWithEndDate = String.format("%s,%s", setDate, DateUtil.parseDateToStr(endDate, DateUtil.Time_Formatter_Day));
+
+        //region 房间状态信息
+        houseNumberStatusDto.setStatuses(Arrays.asList(2, 3, 4, 5, 6));
+        List<String> houseNumberIdList = houseNumberList.stream().map(HouseNumber::getId).collect(Collectors.toList());
+        houseNumberStatusDto.setHouseNumberIds(houseNumberIdList);
+        List<HouseNumberStatusDto> houseNumberStatusDtoList;
+        if (showType == 1) {
+            houseNumberStatusDto.setSetDate(setDateWithEndDate);
+            // 周日内的房间状态信息
+            houseNumberStatusDtoList = houseNumberStatusDao.queryList(houseNumberStatusDto);
+        } else if (showType == 2) {
+            // 当日的房间状态信息
+            houseNumberStatusDtoList = houseNumberStatusDao.queryList(houseNumberStatusDto);
+        } else {
+            houseNumberStatusDtoList = Collections.emptyList();
+        }
+        //endregion
+
+        boolean existHouseNumberStatus = !houseNumberStatusDtoList.isEmpty();
+
+        //region 订单信息
+        Map<String, HouseNumberStatusDto> orderInfoMap;
+        if (existHouseNumberStatus) {
+            List<String> bookingId = houseNumberStatusDtoList.stream()
+                    .filter(item -> item.getStatus() == 5 || item.getStatus() == 6)
+                    .map(HouseNumberStatusDto::getBookingId).collect(Collectors.toList());
+
+            if (bookingId.isEmpty()) {
+                orderInfoMap = Collections.emptyMap();
+            } else {
+                orderInfoMap = houseNumberStatusDao.queryOrderSomeColumnListByIds(bookingId)
+                        .stream().collect(Collectors.toMap(HouseNumberStatusDto::getBookingId, item -> item, (bookingIdOne, bookingIdTow) -> bookingIdOne));
+            }
+        } else {
+            orderInfoMap = Collections.emptyMap();
+        }
+        //endregion
+
+        if (existHouseNumberStatus) {
+            houseNumberList.forEach(houseNumber -> {
+                for (HouseNumberStatusDto numberStatusDto : houseNumberStatusDtoList) {
+                    // 填充预定/入住的一些订单信息
+                    if (numberStatusDto.getStatus() == 5 || numberStatusDto.getStatus() == 6) {
+                        HouseNumberStatusDto score = orderInfoMap.getOrDefault(numberStatusDto.getBookingId(), new HouseNumberStatusDto());
+                        BeanUtils.copyProperties(score, numberStatusDto, getNullPropertyNames(score));
+                    }
+                    // 填充房间状态信息
+                    if (Objects.equals(houseNumber.getId(), numberStatusDto.getNumberId())) {
+                        houseNumber.setHouseNumberStatus(numberStatusDto);
+                        // 已按创建时间倒叙,找到直接退出本次循环
+                        break;
+                    }
+                }
+            });
+        }
+
+        if (houseNumberStatusDto.getShowType() == 1) {
+            List<String> dateListBetween = DateUtil.getDateStrListBetween(startDate, endDate);
+
+            //region 周期内的改价记录
+            HousePriceDto housePriceDto = new HousePriceDto();
+            List<String> houseIdList = houseList.stream().map(House::getId).collect(Collectors.toList());
+            housePriceDto.setHouseIdList(houseIdList);
+            housePriceDto.setSetDate(setDateWithEndDate);
+            List<HousePriceDto> housePriceDtoList = housePriceDao.queryListTwo(housePriceDto);
+            //endregion
+
+            List<JSONObject> result = new ArrayList<>();
+            houseList.forEach(house -> houseNumberList.forEach(houseNumber -> {
+                if (houseNumber.getHouseId().equals(house.getId())) {
+                    JSONObject houseJsonObject = new JSONObject();
+                    houseJsonObject.put("id", house.getId());
+                    houseJsonObject.put("houseName", house.gethName());
+                    String numberName = houseNumber.getNumberName();
+                    dateListBetween.forEach(date -> {
+                        houseJsonObject.put("numberName", numberName);
+                        JSONObject dateJsonObject = new JSONObject();
+                        dateJsonObject.put("numberId", houseNumber.getId());
+                        dateJsonObject.put("houseName", house.gethName());
+                        dateJsonObject.put("numberName", numberName);
+                        dateJsonObject.put("housePrice", getPrice(DateUtil.parseDateOnly(date), house, housePriceDtoList));
+                        Optional.ofNullable(houseNumber.getHouseNumberStatus()).ifPresent(houseNumberStatus -> {
+                            if (date.equals(houseNumberStatus.getSetDate())) {
+                                dateJsonObject.put("closeType", houseNumberStatus.getCloseType());
+                                dateJsonObject.put("remark", houseNumberStatus.getRemark());
+                                dateJsonObject.put("setDate", houseNumberStatus.getSetDate());
+                                dateJsonObject.put("status", houseNumberStatus.getStatus());
+                                if (houseNumberStatus.getStatus() == 5 || houseNumberStatus.getStatus() == 6) {
+                                    dateJsonObject.put("orderNum", houseNumberStatus.getOrderNum());
+                                    dateJsonObject.put("orderUserName", houseNumberStatus.getOrderUserName());
+                                    dateJsonObject.put("orderUserPhone", houseNumberStatus.getOrderUserPhone());
+                                    dateJsonObject.put("orderPayAccount", houseNumberStatus.getOrderPayAccount());
+                                    dateJsonObject.put("orderStartTime", houseNumberStatus.getOrderStartTime());
+                                    dateJsonObject.put("orderEndTime", houseNumberStatus.getOrderEndTime());
+                                }
+                            }
+                        });
+                        houseJsonObject.put(date, dateJsonObject);
+                    });
+                    result.add(houseJsonObject);
+                }
+            }));
+            return result;
+        }
+        if (houseNumberStatusDto.getShowType() == 2) {
+            return buildResultOne(houseList, houseNumberList);
+        }
+        return null;
+    }
+
+    @Override
+    public List<?> queryListWithHouse(HouseNumberStatusDto houseNumberStatusDto) {
+        String managerId = houseNumberStatusDto.getManagerId();
+        if (StringUtils.isBlank(managerId)) return Collections.emptyList();
+        List<House> houseList = housePriceService.queryHouseListByManagerId(houseNumberStatusDto.getManagerId());
+        if (houseList.isEmpty()) return houseList;
+        List<HouseNumber> houseNumberList = houseNumberDao.queryListByHouseIdList(houseList.stream().map(House::getId).collect(Collectors.toList()));
+        if (houseNumberList.isEmpty()) return houseList;
+
+        // 需求文档只注明:批量置净时展示的是脏房(status=3)
+        if (houseNumberStatusDto.getStatus() != null && houseNumberStatusDto.getStatus() == 3) {
+            //region 此代码块为移除不是脏房的房间
+            List<String> houseNumberIdList = houseNumberList.stream().map(HouseNumber::getId).collect(Collectors.toList());
+
+            //region 脏房房间id集合
+            HouseNumberStatusDto paramsOne = new HouseNumberStatusDto();
+            paramsOne.setHouseNumberIds(houseNumberIdList);
+            paramsOne.setStatuses(Collections.singletonList(3));
+            List<String> numberIdList = houseNumberStatusDao.queryList(paramsOne).stream()
+                    .map(HouseNumberStatusDto::getNumberId)
+                    .collect(Collectors.toList());
+            //endregion
+
+            if (numberIdList.isEmpty()) return houseList;
+            Set<String> numberIdSet = new HashSet<>(numberIdList);
+            houseNumberList = houseNumberList.stream().filter(houseNumber -> numberIdSet.contains(houseNumber.getId())).collect(Collectors.toList());
+            //endregion
+        }
+        return buildResultOne(houseList, houseNumberList);
+    }
+
+    @SneakyThrows
+    @Override
+    public void modifyStatusBatch(HouseNumberStatusDto houseNumberStatusDto) {
+        Integer status = houseNumberStatusDto.getStatus();
+        boolean isStatusEqualsThree = status == 3;
+        boolean isStatusEqualsFour = status == 4;
+        List<String> dateStrListBetween;
+        if (isStatusEqualsFour) {
+            String[] setDateStr = houseNumberStatusDto.getSetDate().split(",");
+            dateStrListBetween = DateUtil.getDateStrListBetween(DateUtil.parseDateOnly(setDateStr[0]), DateUtil.parseDateOnly(setDateStr[1]));
+        } else {
+            dateStrListBetween = Collections.emptyList();
+        }
+        String currentDateStr = DateUtil.getFormatDate(DateUtil.Time_Formatter_Day);
+        Date dataTime = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second);
+        List<String> houseNumberIds = houseNumberStatusDto.getHouseNumberIds();
+        List<HouseNumberStatus> houseNumberStatusList = new ArrayList<>();
+        if (isStatusEqualsThree || isStatusEqualsFour) {
+            houseNumberIds.forEach(houseNumberId -> {
+                HouseNumberStatus houseNumberStatus = new HouseNumberStatus();
+                houseNumberStatus.setNumberId(houseNumberId);
+                houseNumberStatus.setStatus(status);
+                houseNumberStatus.setCreateId("");
+                houseNumberStatus.setCreateDate(dataTime);
+                if (isStatusEqualsThree) {
+                    houseNumberStatus.setId(Func.newGuid());
+                    houseNumberStatus.setSetDate(currentDateStr);
+                    houseNumberStatusList.add(houseNumberStatus);
+                } else {
+                    dateStrListBetween.forEach(dateStr -> {
+                        HouseNumberStatus houseNumberStatusNew = new HouseNumberStatus();
+                        BeanUtils.copyProperties(houseNumberStatus, houseNumberStatusNew);
+                        houseNumberStatusNew.setId(Func.newGuid());
+                        houseNumberStatusNew.setCloseType(houseNumberStatusDto.getCloseType());
+                        houseNumberStatusNew.setSetDate(dateStr);
+                        houseNumberStatusNew.setRemark(houseNumberStatusDto.getRemark());
+                        houseNumberStatusList.add(houseNumberStatusNew);
+                    });
+                }
+            });
+            houseNumberStatusDao.saveBatch(houseNumberStatusList);
+        } else {
+            houseNumberStatusDto.setModifyDate(dataTime);
+            houseNumberStatusDao.updateStatus(houseNumberStatusDto);
+        }
+    }
+
+    @SneakyThrows
+    @Override
+    public void modifyStatus(HouseNumberStatusDto houseNumberStatusDto) {
+        Integer status = houseNumberStatusDto.getStatus();
+        boolean isStatusEqualsThree = status == 3;
+        boolean isStatusEqualsFour = status == 4;
+        Date dataTime = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second);
+        if (isStatusEqualsThree || isStatusEqualsFour) {
+            HouseNumberStatus houseNumberStatus = new HouseNumberStatus();
+            BeanUtils.copyProperties(houseNumberStatusDto, houseNumberStatus);
+            houseNumberStatus.setId(Func.newGuid());
+            houseNumberStatus.setCreateDate(dataTime);
+            houseNumberStatus.setCreateId("");
+            houseNumberStatusDao.saveBatch(Collections.singletonList(houseNumberStatus));
+        } else {
+            houseNumberStatusDto.setModifyDate(dataTime);
+            houseNumberStatusDao.updateStatus(houseNumberStatusDto);
+        }
+    }
+
+    private List<JSONObject> buildResultOne(List<House> houseList, List<HouseNumber> houseNumberList) {
+        List<JSONObject> result = new ArrayList<>();
+        Map<String, List<HouseNumber>> houseNumberMap = houseNumberList.stream().collect(Collectors.groupingBy(HouseNumber::getHouseId));
+        houseList.forEach(house -> {
+            JSONObject houseJosoObj = (JSONObject) JSONObject.toJSON(house);
+            houseJosoObj.put("HouseNumberList", houseNumberMap.getOrDefault(house.getId(), Collections.emptyList()));
+            result.add(houseJosoObj);
+        });
+        return result;
+    }
+
+    /**
+     * 获取对象null值属性名称,用于BeanUtils.copyProperties忽略字段
+     */
+    private String[] getNullPropertyNames(Object source) {
+        final BeanWrapper src = new BeanWrapperImpl(source);
+        PropertyDescriptor[] pds = src.getPropertyDescriptors();
+        Set<String> emptyNames = new HashSet<String>();
+        for (PropertyDescriptor pd : pds) {
+            Object srcValue = src.getPropertyValue(pd.getName());
+            if (srcValue == null) {
+                emptyNames.add(pd.getName());
+            }
+        }
+        String[] result = new String[emptyNames.size()];
+        return emptyNames.toArray(result);
+    }
+
+    /**
+     * 获取房型指定日期的价格
+     *
+     * @return 原价 or 周日内最新一条改价记录的价格
+     */
+    private Double getPrice(Date dateIn, House house, List<HousePriceDto> housePriceDtoList) {
+        Double price = house.getPrice();
+        if (housePriceDtoList.isEmpty()) return price;
+        for (HousePriceDto priceDto : housePriceDtoList) {
+            String[] date = priceDto.getSetDate().split(",");
+            Date startDate = DateUtil.parseDateOnly(date[0]);
+            Date endDate = DateUtil.parseDateOnly(date[1]);
+            assert startDate != null;
+            boolean flag = DateUtil.isEffectiveDate(dateIn, startDate, endDate) && house.getId().equals(priceDto.getHouseId());
+            if (flag) {
+                price = priceDto.getPrice();
+                break;
+            }
+        }
+        return price;
+    }
 }

+ 18 - 14
mhotel/src/com/happy/service/impl/HousePriceServiceImpl.java

@@ -1,19 +1,20 @@
 package com.happy.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.House;
 import com.happy.Model.HousePrice;
 import com.happy.Until.DateUtil;
 import com.happy.Until.Func;
+import com.happy.dao.HouseDao;
 import com.happy.dao.HousePriceDao;
 import com.happy.dto.HousePriceDto;
 import com.happy.dto.IPage;
 import com.happy.service.HousePriceService;
 import lombok.SneakyThrows;
-import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -21,6 +22,8 @@ import java.util.stream.Collectors;
 public class HousePriceServiceImpl implements HousePriceService {
     @Resource(name = "housePriceDao")
     private HousePriceDao housePriceDao;
+    @Resource(name = "HouseDao")
+    private HouseDao houseDao;
 
     @SneakyThrows
     @Override
@@ -30,18 +33,13 @@ public class HousePriceServiceImpl implements HousePriceService {
         priceList.forEach(item -> {
             item.setCreateId("");
             item.setCreateDate(now);
-            // item.setModifyDate(now);
             item.setStatus(1);
             dateList.forEach(date -> {
-                try {
-                    HousePrice housePrice = (HousePrice) BeanUtils.cloneBean(item);
-                    housePrice.setId(Func.newGuid());
-                    housePrice.setSetDate(date);
-                    housePriceList.add(housePrice);
-                } catch (IllegalAccessException | InstantiationException | InvocationTargetException |
-                         NoSuchMethodException e) {
-                    throw new RuntimeException(e);
-                }
+                HousePrice housePrice = new HousePrice();
+                org.springframework.beans.BeanUtils.copyProperties(item, housePrice);
+                housePrice.setId(Func.newGuid());
+                housePrice.setSetDate(date);
+                housePriceList.add(housePrice);
             });
         });
         housePriceDao.insertBatch(housePriceList);
@@ -54,7 +52,6 @@ public class HousePriceServiceImpl implements HousePriceService {
         housePriceDto.setId(Func.newGuid());
         housePriceDto.setCreateId("");
         housePriceDto.setCreateDate(now);
-        // housePriceDto.setModifyDate(now);
         housePriceDto.setStatus(1);
         housePriceDao.insertBatch(Collections.singletonList(housePriceDto));
     }
@@ -67,7 +64,7 @@ public class HousePriceServiceImpl implements HousePriceService {
             List<HousePriceDto> pageList = housePriceDao.queryListOne(housePriceDto, pageNumber, pageSize);
             String startDateStr = housePriceDto.getSetDate();
             Date startDate = DateUtil.parseDateOnly(startDateStr);
-            Date endDate = DateUtil.addDate(startDate, Calendar.DATE, 21);
+            Date endDate = DateUtil.addDate(startDate, Calendar.DATE, 20);
 
             //region 周期内的改价记录
             housePriceDto.setSetDate(String.format("%s,%s", startDateStr, DateUtil.parseDateToStr(endDate, DateUtil.Time_Formatter_Day)));
@@ -110,6 +107,13 @@ public class HousePriceServiceImpl implements HousePriceService {
         return result;
     }
 
+    @Override
+    public List<House> queryHouseListByManagerId(String managerId) {
+        if (StringUtils.isBlank(managerId)) return Collections.emptyList();
+        String sqlx = String.format(" and manager_id = %s %s", managerId, " order by create_date desc");
+        return houseDao.queryList(sqlx);
+    }
+
     /**
      * 获取房型指定日期的价格
      *