Browse Source

房态管理-房价管理

liujunqiang 2 years ago
parent
commit
0eb8f4564c

+ 31 - 118
mhotel/src/com/happy/Model/HousePrice.java

@@ -1,124 +1,37 @@
 package com.happy.Model;
 package com.happy.Model;
 
 
-import java.util.Date;
+import com.happy.common.model.BaseModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 
 /**
 /**
- * @Description  
- * @Author  raojiaolong
- * @Date 2023-08-21 
+ * 民宿单日房价表Model
  */
  */
-
-public class HousePrice {
-
-
-	private Integer id; // 主键
-
-	private Integer managerId; // 商家id
-
-	private Integer houseId; // 房型id
-
-	private Double price; // 单价
-
-	private String remark; // 备注
-
-	private String setDate; // 设置日期
-
-	private Integer createId; // 创建人
-
-	private Date createDate; // 创建时间
-
-	private Date modifyDate; // 修改时间
-
-	private Integer status; // 状态(0删除 1正常)
-
-
-	public Integer getId() {
-		return id;
-	}
-
-	public void setId(Integer id) {
-		this.id = id;
-	}
-
-
-	public Integer getManagerId() {
-		return managerId;
-	}
-
-	public void setManagerId(Integer managerId) {
-		this.managerId = managerId;
-	}
-
-
-	public Integer getHouseId() {
-		return houseId;
-	}
-
-	public void setHouseId(Integer houseId) {
-		this.houseId = houseId;
-	}
-
-
-	public Double getPrice() {
-		return price;
-	}
-
-	public void setPrice(Double price) {
-		this.price = price;
-	}
-
-
-	public String getRemark() {
-		return remark;
-	}
-
-	public void setRemark(String remark) {
-		this.remark = remark;
-	}
-
-
-	public String getSetDate() {
-		return setDate;
-	}
-
-	public void setSetDate(String setDate) {
-		this.setDate = setDate;
-	}
-
-
-	public Integer getCreateId() {
-		return createId;
-	}
-
-	public void setCreateId(Integer createId) {
-		this.createId = createId;
-	}
-
-
-	public Date getCreateDate() {
-		return createDate;
-	}
-
-	public void setCreateDate(Date createDate) {
-		this.createDate = createDate;
-	}
-
-
-	public Date getModifyDate() {
-		return modifyDate;
-	}
-
-	public void setModifyDate(Date modifyDate) {
-		this.modifyDate = modifyDate;
-	}
-
-
-	public Integer getStatus() {
-		return status;
-	}
-
-	public void setStatus(Integer status) {
-		this.status = status;
-	}
-
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HousePrice extends BaseModel {
+    /**
+     * 商家id
+     */
+    private String managerId;
+    /**
+     * 房型id
+     */
+    private String houseId;
+    /**
+     * 单价
+     */
+    private Double price;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 设置日期
+     */
+    private String setDate;
+    /**
+     * 状态(0删除 1正常)
+     */
+    private Integer status;
 }
 }

+ 56 - 0
mhotel/src/com/happy/Until/BeanMapTool.java

@@ -0,0 +1,56 @@
+package com.happy.Until;
+
+import org.springframework.cglib.beans.BeanMap;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class BeanMapTool {
+    public static <T> Map<String, ? super Object> beanToMap(T bean) {
+        BeanMap beanMap = BeanMap.create(bean);
+        Map<String, Object> map = new HashMap<>();
+
+        beanMap.forEach((key, value) -> {
+            map.put(String.valueOf(key), value);
+        });
+        return map;
+    }
+
+    public static <T> T mapToBean(Map<String, ?> map, Class<T> clazz)
+            throws IllegalAccessException, InstantiationException {
+        T bean = clazz.newInstance();
+        BeanMap beanMap = BeanMap.create(bean);
+        beanMap.putAll(map);
+        return bean;
+    }
+
+    public static <T> List<Map<String, ?>> objectsToMaps(List<T> objList) {
+        List<Map<String, ?>> list = new ArrayList<>();
+        if (objList != null && !objList.isEmpty()) {
+            Map<String, ?> map;
+            T bean;
+            for (T t : objList) {
+                bean = t;
+                map = beanToMap(bean);
+                list.add(map);
+            }
+        }
+        return list;
+    }
+
+    public static <T> List<T> mapsToObjects(List<Map<String, ?>> maps, Class<T> clazz)
+            throws InstantiationException, IllegalAccessException {
+        List<T> list = new ArrayList<>();
+        if (maps != null && !maps.isEmpty()) {
+            Map<String, ?> map;
+            for (Map<String, ?> stringMap : maps) {
+                map = stringMap;
+                T bean = mapToBean(map, clazz);
+                list.add(bean);
+            }
+        }
+        return list;
+    }
+}

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

@@ -475,4 +475,51 @@ public class DateUtil
         return i;
         return i;
     }
     }
 
 
+    /**
+     * 获得两个日期之间的所有日期
+     *
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     */
+    public static List<Date> getDateListBetween(Date startDate, Date endDate) {
+        List<Date> result = new ArrayList<>();
+        // result.add(parseDateToStr(startDate, Time_Formatter_Day));
+        result.add(startDate);
+        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));
+            result.add(calBegin.getTime());
+        }
+        return result;
+    }
+
+    /**
+     * 判断当前时间是否在[startTime, endTime]区间
+     *
+     * @param dataIn 传入的时间
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     */
+    public static boolean isEffectiveDate(Date dataIn, Date startTime, Date endTime) {
+        if (dataIn.getTime() == startTime.getTime()
+                || dataIn.getTime() == endTime.getTime()) {
+            return true;
+        }
+        Calendar date = Calendar.getInstance();
+        date.setTime(dataIn);
+        Calendar begin = Calendar.getInstance();
+        begin.setTime(startTime);
+        Calendar end = Calendar.getInstance();
+        end.setTime(endTime);
+        return date.after(begin) && date.before(end);
+    }
+
 }
 }

+ 18 - 0
mhotel/src/com/happy/Until/GetHttpParam.java

@@ -6,11 +6,13 @@ import com.alibaba.fastjson.JSON;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import java.io.BufferedReader;
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
 import java.net.URLDecoder;
 import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
@@ -205,4 +207,20 @@ public class GetHttpParam {
         }
         }
         return null;
         return null;
     }
     }
+
+    public static String getRequestPostData(HttpServletRequest request) throws IOException {
+        int contentLength = request.getContentLength();
+        if (contentLength < 0) {
+            return null;
+        }
+        byte[] buffer = new byte[contentLength];
+        for (int i = 0; i < contentLength; ) {
+            int len = request.getInputStream().read(buffer, i, contentLength - i);
+            if (len == -1) {
+                break;
+            }
+            i += len;
+        }
+        return new String(buffer, StandardCharsets.UTF_8);
+    }
 }
 }

+ 69 - 0
mhotel/src/com/happy/action/HousePriceAction.java

@@ -0,0 +1,69 @@
+package com.happy.action;
+
+import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.HousePrice;
+import com.happy.Until.GetHttpParam;
+import com.happy.Until.ResUtil;
+import com.happy.common.controller.BaseController;
+import com.happy.dto.HousePriceDto;
+import com.happy.service.HousePriceService;
+import com.opensymphony.xwork2.ModelDriven;
+import lombok.SneakyThrows;
+import org.apache.struts2.ServletActionContext;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+public class HousePriceAction extends BaseController implements ModelDriven<HousePriceDto> {
+    private final HousePriceDto housePriceDto = new HousePriceDto();
+
+    @Override
+    public HousePriceDto getModel() {
+        return housePriceDto;
+    }
+
+    @Resource(name = "housePriceService")
+    private HousePriceService housePriceService;
+
+    /**
+     * 批量改价 房态管理-房价管理
+     * 约定body数据格式:{"dateList":["2023-08-11,2023-08-20"],"priceList":[{"managerId":"1586005529","houseId":"1379573861","price":"180"}]}
+     */
+    @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);
+        housePriceService.modifyPriceBatch(dateList, priceList);
+    }
+
+    /**
+     * 改价 房态管理-房价管理
+     */
+    public void modifyPrice() {
+        housePriceService.modifyPrice(housePriceDto);
+    }
+
+    /**
+     * 表格数据 房态管理-房价管理
+     */
+    public void queryPage() {
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "查询成功");
+            put("code", 200);
+            put("data", housePriceService.queryPage(housePriceDto, page, rows));
+        }}.toString());
+    }
+
+    /**
+     * 表格数据 房态管理-房价管理-改价记录
+     */
+    public void queryPageHistory() {
+        ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
+            put("message", "查询成功");
+            put("code", 200);
+            put("data", housePriceService.queryPageHistory(housePriceDto, page, rows));
+        }}.toString());
+    }
+}

+ 26 - 0
mhotel/src/com/happy/common/model/BaseModel.java

@@ -0,0 +1,26 @@
+package com.happy.common.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class BaseModel implements Serializable {
+    /**
+     * 主键
+     */
+    private String id;
+    /**
+     * 创建人
+     */
+    private String createId;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+    /**
+     * 修改时间
+     */
+    private Date modifyDate;
+}

+ 39 - 0
mhotel/src/com/happy/dao/HousePriceDao.java

@@ -0,0 +1,39 @@
+package com.happy.dao;
+
+import com.happy.Model.HousePrice;
+import com.happy.dto.HousePriceDto;
+
+import java.util.List;
+
+public interface HousePriceDao {
+    void insertBatch(List<HousePrice> housePriceList);
+
+    /**
+     * @param housePriceDto 查询参数
+     * @param pageNumber    页码
+     * @param pageSize      每页显示的条数
+     */
+    List<HousePriceDto> queryListOne(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize);
+
+    /**
+     * @param housePriceDto 查询参数
+     */
+    int queryTotalOne(HousePriceDto housePriceDto);
+
+    /**
+     * @param housePriceDto 查询参数
+     */
+    List<HousePriceDto> queryListTwo(HousePriceDto housePriceDto);
+
+    /**
+     * @param housePriceDto 查询参数
+     * @param pageNumber    页码
+     * @param pageSize      每页显示的条数
+     */
+    List<HousePriceDto> queryListThree(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize);
+
+    /**
+     * @param housePriceDto 查询参数
+     */
+    int queryTotalThree(HousePriceDto housePriceDto);
+}

+ 152 - 0
mhotel/src/com/happy/dao/impl/HousePriceDaoImpl.java

@@ -0,0 +1,152 @@
+package com.happy.dao.impl;
+
+import com.happy.Model.HousePrice;
+import com.happy.Until.BeanMapTool;
+import com.happy.dao.HousePriceDao;
+import com.happy.dto.HousePriceDto;
+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.NamedParameterJdbcTemplate;
+import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Repository("housePriceDao")
+public class HousePriceDaoImpl implements HousePriceDao {
+    @Autowired
+    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
+
+    static final String KEY_START_SET_DATE = "startSetDate";
+    static final String KEY_END_SET_DATE = "endSetDate";
+
+    @Override
+    public void insertBatch(List<HousePrice> housePriceList) {
+        final String sql = "insert into house_price values (:id, :managerId, :houseId, :price, :remark, :setDate, :createId, :createDate, :modifyDate, :status)";
+        namedParameterJdbcTemplate.batchUpdate(sql, SqlParameterSourceUtils.createBatch(housePriceList.toArray()));
+    }
+
+    @Override
+    public List<HousePriceDto> queryListOne(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        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);
+        return namedParameterJdbcTemplate.query(sql.toString(), paramMap, new BeanPropertyRowMapper<>(HousePriceDto.class));
+    }
+
+    @Override
+    public int queryTotalOne(HousePriceDto housePriceDto) {
+        final String SQL_HEAD = "select count(1) from house t1 where t1.status = 1";
+        Map<String, Object> paramMap = buildParamMap(housePriceDto, null, null);
+        StringBuilder sql = buildSqlHouse(SQL_HEAD, "", housePriceDto, null, null);
+        return namedParameterJdbcTemplate.queryForObject(sql.toString(), paramMap, Integer.class);
+    }
+
+    @Override
+    public List<HousePriceDto> queryListTwo(HousePriceDto housePriceDto) {
+        final String SQL_HEAD = "select t1.id, t1.manager_id, t1.house_id, t1.price, t1.remark, t1.set_date, t1.create_id, t1.create_date, t1.modify_date, t1.status from house_price t1 where t1.status = 1";
+        final String SQL_TAIL = " order by create_date desc";
+        Map<String, Object> paramMap = buildParamMap(housePriceDto, null, null);
+        StringBuilder sql = buildSqlHousePrice(SQL_HEAD, SQL_TAIL, housePriceDto, null, null);
+        return namedParameterJdbcTemplate.query(sql.toString(), paramMap, new BeanPropertyRowMapper<>(HousePriceDto.class));
+    }
+
+    @Override
+    public List<HousePriceDto> queryListThree(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        final String SQL_HEAD = "select t.* from(select t1.id, t1.house_id, t2.h_name as houseName, group_concat(replace(t1.set_date, ',', ' 至 ')) as set_date, t1.price, t1.create_id, date_format(t1.create_date, '%Y-%m-%d %H:%i:%s') as operationTime from house_price t1 left join house t2 on t1.status = t2.status and t1.manager_id = t2.manager_id and t1.house_id = t2.id where t1.status = 1";
+        final String SQL_TAIL = " group by t1.id) t order by t.operationTime desc";
+        Map<String, Object> paramMap = buildParamMap(housePriceDto, pageNumber, pageSize);
+        StringBuilder sql = buildSqlHousePrice(SQL_HEAD, SQL_TAIL, housePriceDto, pageNumber, pageSize);
+        return namedParameterJdbcTemplate.query(sql.toString(), paramMap, new BeanPropertyRowMapper<>(HousePriceDto.class));
+    }
+
+    @Override
+    public int queryTotalThree(HousePriceDto housePriceDto) {
+        final String SQL_HEAD = "select count(1) from (select 1 from house_price t1 left join house t2 on t1.status = t2.status and t1.manager_id = t2.manager_id and t1.house_id = t2.id where t1.status = 1";
+        final String SQL_TAIL = ") t";
+        Map<String, Object> paramMap = buildParamMap(housePriceDto, null, null);
+        StringBuilder sql = buildSqlHousePrice(SQL_HEAD, SQL_TAIL, housePriceDto, null, null);
+        return namedParameterJdbcTemplate.queryForObject(sql.toString(), paramMap, Integer.class);
+    }
+
+    /**
+     * 构建主表t1为house_price的sql查询条件
+     */
+    private StringBuilder buildSqlHousePrice(String sqlHead, String sqlTail, HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        StringBuilder sql = new StringBuilder(sqlHead);
+        if (StringUtils.isNotBlank(housePriceDto.getManagerId())) {
+            sql.append(" and t1.manager_id=:managerId");
+        }
+        if (housePriceDto.getHouseIdList() != null && !housePriceDto.getHouseIdList().isEmpty()) {
+            sql.append(" and t1.house_id in (:houseIdList)");
+        }
+        if (StringUtils.isNotBlank(housePriceDto.getHouseId())) {
+            sql.append(" and t1.house_id=:houseId");
+        }
+        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))
+                    .append(String.format(" or substring_index(t1.set_date, ',', -1) between :%s and :%s)", KEY_START_SET_DATE, KEY_END_SET_DATE));
+        }
+        sql.append(sqlTail).append(buildSqlPage(pageNumber, pageSize));
+        return sql;
+    }
+
+    /**
+     * 构建主表t1为house的sql查询条件
+     */
+    private StringBuilder buildSqlHouse(String sqlHead, String sqlTail, HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        StringBuilder sql = new StringBuilder(sqlHead);
+        if (StringUtils.isNotBlank(housePriceDto.getManagerId())) {
+            sql.append(" and t1.manager_id=:managerId");
+        }
+        if (StringUtils.isNotBlank(housePriceDto.getHouseId())) {
+            sql.append(" and t1.id=:houseId");
+        }
+        sql.append(sqlTail).append(buildSqlPage(pageNumber, pageSize));
+        return sql;
+    }
+
+    /**
+     * 构建分页查询条件
+     */
+    private String buildSqlPage(Integer pageNumber, Integer pageSize) {
+        String result = "";
+        if (pageNumber != null && pageSize != null) {
+            result = " limit :pageNumber, :pageSize";
+        } else if (pageSize != null) {
+            result = " limit :pageSize";
+        }
+        return result;
+    }
+
+    /**
+     * 构建sql查询参数
+     */
+    private Map<String, Object> buildParamMap(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        Map<String, Object> paramMap = BeanMapTool.beanToMap(housePriceDto);
+        String setDate = housePriceDto.getSetDate();
+        if (StringUtils.isNotBlank(setDate) && setDate.split(",").length == 2) {
+            String[] setDateArr = setDate.split(",");
+            paramMap.put(KEY_START_SET_DATE, setDateArr[0]);
+            paramMap.put(KEY_END_SET_DATE, setDateArr[1]);
+        }
+        return putPageParams(pageNumber, pageSize, paramMap);
+    }
+
+    /**
+     * 追加sql查询分页参数
+     */
+    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);
+        } else if (pageSize != null) {
+            paramMap.put("pageSize", pageSize);
+        }
+        return paramMap;
+    }
+}

+ 28 - 0
mhotel/src/com/happy/dto/HousePriceDto.java

@@ -0,0 +1,28 @@
+package com.happy.dto;
+
+import com.happy.Model.HousePrice;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HousePriceDto extends HousePrice {
+    /**
+     * 房型名称
+     */
+    public String houseName;
+    /**
+     * 房型ID集合
+     */
+    public List<String> houseIdList;
+    /**
+     * 原价
+     */
+    private Double originalPrice;
+    /**
+     * 查询条件 房态管理-房价管理-改价记录-操作时间
+     */
+    public String operationTime;
+}

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

@@ -0,0 +1,38 @@
+package com.happy.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.HousePrice;
+import com.happy.dto.HousePriceDto;
+import com.happy.dto.IPage;
+
+import java.util.List;
+
+public interface HousePriceService {
+    /**
+     * 批量改价 房态管理-房价管理
+     */
+    void modifyPriceBatch(List<String> dateList, List<HousePrice> priceList);
+
+    /**
+     * 改价 房态管理-房价管理
+     */
+    void modifyPrice(HousePriceDto housePriceDto);
+
+    /**
+     * 表格数据 房态管理-房价管理
+     *
+     * @param housePriceDto 查询参数
+     * @param pageNumber    页码
+     * @param pageSize      每页显示的条数
+     */
+    JSONObject queryPage(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize);
+
+    /**
+     * 表格数据 房态管理-房价管理-改价记录
+     *
+     * @param housePriceDto 查询参数
+     * @param pageNumber    页码
+     * @param pageSize      每页显示的条数
+     */
+    IPage<HousePriceDto> queryPageHistory(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize);
+}

+ 134 - 0
mhotel/src/com/happy/service/impl/HousePriceServiceImpl.java

@@ -0,0 +1,134 @@
+package com.happy.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.happy.Model.HousePrice;
+import com.happy.Until.DateUtil;
+import com.happy.Until.Func;
+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.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service("housePriceService")
+public class HousePriceServiceImpl implements HousePriceService {
+    @Resource(name = "housePriceDao")
+    private HousePriceDao housePriceDao;
+
+    @SneakyThrows
+    @Override
+    public void modifyPriceBatch(List<String> dateList, List<HousePrice> priceList) {
+        List<HousePrice> housePriceList = new ArrayList<>();
+        Date now = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second);
+        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);
+                }
+            });
+        });
+        housePriceDao.insertBatch(housePriceList);
+    }
+
+    @SneakyThrows
+    @Override
+    public void modifyPrice(HousePriceDto housePriceDto) {
+        Date now = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second);
+        housePriceDto.setId(Func.newGuid());
+        housePriceDto.setCreateId("");
+        housePriceDto.setCreateDate(now);
+        // housePriceDto.setModifyDate(now);
+        housePriceDto.setStatus(1);
+        housePriceDao.insertBatch(Collections.singletonList(housePriceDto));
+    }
+
+    @Override
+    public JSONObject queryPage(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        List<JSONObject> pageJsonObjectList = new ArrayList<>(Collections.emptyList());
+        int total = housePriceDao.queryTotalOne(housePriceDto);
+        if (total != 0) {
+            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);
+
+            //region 周期内的改价记录
+            housePriceDto.setSetDate(String.format("%s,%s", startDateStr, DateUtil.parseDateToStr(endDate, DateUtil.Time_Formatter_Day)));
+            List<String> houseIdList = pageList.stream().map(HousePriceDto::getHouseId).collect(Collectors.toList());
+            housePriceDto.setHouseIdList(houseIdList);
+            List<HousePriceDto> housePriceDtoList = housePriceDao.queryListTwo(housePriceDto);
+            //endregion
+
+            List<Date> dateListBetween = DateUtil.getDateListBetween(startDate, endDate);
+            pageList.forEach(item -> {
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("id", item.getHouseId());
+                jsonObject.put("houseName", item.getHouseName());
+                dateListBetween.forEach(date -> jsonObject.put(DateUtil.parseDateToStr(date, DateUtil.Time_Formatter_Day), getPrice(date, item, housePriceDtoList)));
+                pageJsonObjectList.add(jsonObject);
+            });
+        }
+        JSONObject result = new JSONObject();
+        result.put("pageList", pageJsonObjectList);
+        result.put("page", pageNumber);
+        result.put("rows", pageSize);
+        result.put("total", total);
+        result.put("totalPage", (int) Math.ceil((double) total / pageSize));
+        return result;
+    }
+
+    @Override
+    public IPage<HousePriceDto> queryPageHistory(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) {
+        List<HousePriceDto> pageList = Collections.emptyList();
+        int total = housePriceDao.queryTotalThree(housePriceDto);
+        if (total != 0) {
+            pageList = housePriceDao.queryListThree(housePriceDto, pageNumber, pageSize);
+        }
+        IPage<HousePriceDto> result = new IPage<>();
+        result.setPageList(pageList);
+        result.setPage(pageNumber);
+        result.setRows(pageSize);
+        result.setTotal(total);
+        result.setTotalPage((int) Math.ceil((double) total / pageSize));
+        return result;
+    }
+
+    /**
+     * 获取房型指定日期的价格
+     *
+     * @return 原价 or 周日内最新一条改价记录的价格
+     */
+    private Double getPrice(Date dateIn, HousePriceDto housePriceDto, List<HousePriceDto> housePriceDtoList) {
+        Double price = housePriceDto.getOriginalPrice();
+        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) && housePriceDto.getHouseId().equals(priceDto.getHouseId());
+            if (flag) {
+                price = priceDto.getPrice();
+                break;
+            }
+        }
+        return price;
+    }
+}

+ 6 - 0
mhotel/src/struts.xml

@@ -13,6 +13,8 @@
 	<constant name="struts.configuration.xml.reload" value="true"/>
 	<constant name="struts.configuration.xml.reload" value="true"/>
 	<!-- 指定XSLT Result使用样式表缓存 -->
 	<!-- 指定XSLT Result使用样式表缓存 -->
 	<constant name="struts.xslt.nocache" value="true"/>
 	<constant name="struts.xslt.nocache" value="true"/>
+	<!-- action的name允许出现“/” -->
+	<constant name="struts.enable.SlashesInActionNames" value="true"/>
 
 
 	<!-- 修改上传文件的大小 -->
 	<!-- 修改上传文件的大小 -->
 	<constant name="struts.multipart.maxSize" value="50000000"/>
 	<constant name="struts.multipart.maxSize" value="50000000"/>
@@ -31,6 +33,10 @@
 		</action>
 		</action>
 		<action name="house*" method = "{1}" class="com.happy.action.houseAction">
 		<action name="house*" method = "{1}" class="com.happy.action.houseAction">
 		</action>
 		</action>
+		<action name="house/price/*" method = "{1}" class="com.happy.action.HousePriceAction">
+		</action>
+		<action name="house/number/status/*" method = "{1}" class="com.happy.action.HouseNumberStatusAction">
+		</action>
 		<action name="book*" method = "{1}" class="com.happy.action.bookAction">
 		<action name="book*" method = "{1}" class="com.happy.action.bookAction">
 		</action>
 		</action>
 		<action name="app*" method = "{1}" class="com.happy.action.appAction"></action>
 		<action name="app*" method = "{1}" class="com.happy.action.appAction"></action>