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.Excel.toExcel; import com.happy.Until.Func; import com.happy.Until.ResponseUtil; import com.happy.Until.UUIDUtil; 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.lang.StringUtils; import org.apache.struts2.ServletActionContext; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @Service("housePriceService") public class HousePriceServiceImpl implements HousePriceService { @Resource(name = "housePriceDao") private HousePriceDao housePriceDao; @Resource(name = "HouseDao") private HouseDao houseDao; @SneakyThrows @Override public void modifyPriceBatch(List dateList, List priceList) { List housePriceList = new ArrayList<>(); Date now = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second); priceList.forEach(item -> { item.setCreateDate(now); item.setStatus(1); dateList.forEach(date -> { HousePrice housePrice = new HousePrice(); BeanUtils.copyProperties(item, housePrice); housePrice.setId(Func.newGuid()); housePrice.setSetDate(date); housePriceList.add(housePrice); }); }); 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.setCreateDate(now); housePriceDto.setStatus(1); housePriceDao.insertBatch(Collections.singletonList(housePriceDto)); } @Override public JSONObject queryPage(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) { List pageJsonObjectList = new ArrayList<>(Collections.emptyList()); int total = housePriceDao.queryTotalOne(housePriceDto); if (total != 0) { List pageList = housePriceDao.queryListOne(housePriceDto, pageNumber, pageSize); String startDateStr = housePriceDto.getSetDate(); Date startDate = DateUtil.parseDateOnly(startDateStr); Date endDate = DateUtil.addDate(startDate, Calendar.DATE, 20); //region 周期内的改价记录 housePriceDto.setSetDate(String.format("%s,%s", startDateStr, DateUtil.parseDateToStr(endDate, DateUtil.Time_Formatter_Day))); List houseIdList = pageList.stream().map(HousePriceDto::getHouseId).collect(Collectors.toList()); housePriceDto.setHouseIdList(houseIdList); List housePriceDtoList = housePriceDao.queryListTwo(housePriceDto); //endregion List dateListBetween = DateUtil.getDateListBetween(startDate, endDate); pageList.forEach(item -> { JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); 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 queryPageHistory(HousePriceDto housePriceDto, Integer pageNumber, Integer pageSize) { List pageList = Collections.emptyList(); int total = housePriceDao.queryTotalThree(housePriceDto); if (total != 0) { pageList = housePriceDao.queryListThree(housePriceDto, pageNumber, pageSize); } IPage 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; } @Override public List 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); } @Override public void exportHistory(HousePriceDto housePriceDto) { if (StringUtils.isBlank(housePriceDto.getManagerId())) return; List list = housePriceDao.queryListThree(housePriceDto, null, null); if (list == null || list.isEmpty()) return; // List> vectorsList = new ArrayList<>(); List vectorsList = new ArrayList<>(); list.forEach(housePrice -> { Vector columnValue = new Vector<>(); columnValue.add(housePrice.getHouseName()); columnValue.add(housePrice.getSetDate()); columnValue.add(housePrice.getPrice()); columnValue.add(housePrice.getOperationName()); columnValue.add(housePrice.getOperationTime()); vectorsList.add(columnValue); }); // 项目路径地址 String path = ServletActionContext.getRequest().getSession().getServletContext() .getRealPath("/download/");// File.separator Vector columnName = new Vector<>(); columnName.add("房型"); columnName.add("价格日期"); columnName.add("修改后价格"); columnName.add("操作人"); columnName.add("操作时间"); String filePathName = "改价记录" + UUIDUtil.generateID() + "Report.xls"; // 导出文件 new toExcel().book(vectorsList, path + filePathName, "sheet1", columnName); String url = "https://chtech.ncjti.edu.cn/hotelReservation/mhotel"; JSONObject result = new JSONObject(); result.put("downurl", url + "/download/" + filePathName); result.put("code", 200); result.put("message", "导出成功"); ResponseUtil.writeJson(ServletActionContext.getResponse(), result.toString()); } /** * 获取房型指定日期的价格 * * @return 原价 or 周日内最新一条改价记录的价格 */ private Double getPrice(Date dateIn, HousePriceDto housePriceDto, List housePriceDtoList) { Double price = housePriceDto.getOriginalPrice(); if (housePriceDtoList == null || 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; } }