HousePriceAction.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. package com.happy.action;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.happy.Model.HousePrice;
  4. import com.happy.Until.*;
  5. import com.happy.common.controller.BaseController;
  6. import com.happy.dto.HousePriceDto;
  7. import com.happy.service.HousePriceService;
  8. import com.happy.service.HouseService;
  9. import com.happy.vo.DailyPriceVo;
  10. import com.happy.vo.HousePriceDataVo;
  11. import com.happy.vo.HousePriceOneDataVo;
  12. import com.happy.vo.HousePriceResultVo;
  13. import com.opensymphony.xwork2.ModelDriven;
  14. import lombok.SneakyThrows;
  15. import org.apache.struts2.ServletActionContext;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import java.math.BigDecimal;
  20. import java.text.DecimalFormat;
  21. import java.text.ParseException;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. public class HousePriceAction extends BaseController implements ModelDriven<HousePriceDto> {
  25. private HttpServletRequest request;
  26. public HttpServletResponse response;
  27. /**
  28. * 房型ID
  29. */
  30. public Integer roomId;
  31. /**
  32. * 民宿商家ID
  33. */
  34. public Integer merchantId;
  35. /**
  36. * 入住时间
  37. */
  38. public String startTime;
  39. /**
  40. * 离店时间
  41. */
  42. public String endTime;
  43. public Integer getRoomId() {
  44. return roomId;
  45. }
  46. public void setRoomId(Integer roomId) {
  47. this.roomId = roomId;
  48. }
  49. public Integer getMerchantId() {
  50. return merchantId;
  51. }
  52. public void setMerchantId(Integer merchantId) {
  53. this.merchantId = merchantId;
  54. }
  55. public String getStartTime() {
  56. return startTime;
  57. }
  58. public void setStartTime(String startTime) {
  59. this.startTime = startTime;
  60. }
  61. public String getEndTime() {
  62. return endTime;
  63. }
  64. public void setEndTime(String endTime) {
  65. this.endTime = endTime;
  66. }
  67. private final HousePriceDto housePriceDto = new HousePriceDto();
  68. @Override
  69. public HousePriceDto getModel() {
  70. return housePriceDto;
  71. }
  72. @Resource(name = "housePriceService")
  73. private HousePriceService housePriceService;
  74. @Resource
  75. private HouseService houseService;
  76. /**
  77. * 批量改价 房态管理-房价管理
  78. * 约定body数据格式:{"dateList":["2023-08-11,2023-08-20"],"priceList":[{"managerId":"1586005529","houseId":"1379573861","price":"180"}]}
  79. */
  80. @SneakyThrows
  81. public void modifyPriceBatch() {
  82. String postDataStr = GetHttpParam.getRequestPostData(request);
  83. JSONObject postDataJSONObject = JSONObject.parseObject(postDataStr);
  84. List<String> dateList = postDataJSONObject.getJSONArray("dateList").toJavaList(String.class);
  85. List<HousePrice> priceList = postDataJSONObject.getJSONArray("priceList").toJavaList(HousePrice.class);
  86. housePriceService.modifyPriceBatch(dateList, priceList);
  87. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  88. put("message", "请求成功");
  89. put("code", 200);
  90. }}.toString());
  91. }
  92. /**
  93. * 改价 房态管理-房价管理
  94. */
  95. public void modifyPrice() {
  96. housePriceService.modifyPrice(housePriceDto);
  97. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  98. put("message", "请求成功");
  99. put("code", 200);
  100. }}.toString());
  101. }
  102. /**
  103. * 表格数据 房态管理-房价管理
  104. */
  105. public void queryPage() {
  106. if(housePriceDto.getSetDate() == null){
  107. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  108. put("message", "参数不能为空!");
  109. put("code", 500);
  110. }}.toString());
  111. }
  112. if(housePriceDto.getManagerId() == null){
  113. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  114. put("message", "参数不能为空!");
  115. put("code", 500);
  116. }}.toString());
  117. }
  118. if(page == null){
  119. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  120. put("message", "参数不能为空!");
  121. put("code", 500);
  122. }}.toString());
  123. }
  124. if(rows == null){
  125. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  126. put("message", "参数不能为空!");
  127. put("code", 500);
  128. }}.toString());
  129. }
  130. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  131. put("message", "请求成功");
  132. put("code", 200);
  133. put("data", housePriceService.queryPage(housePriceDto, page, rows));
  134. }}.toString());
  135. }
  136. public void queryHouseListByManagerId() {
  137. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  138. put("message", "请求成功");
  139. put("code", 200);
  140. put("data", housePriceService.queryHouseListByManagerId(housePriceDto.getManagerId()));
  141. }}.toString());
  142. }
  143. /**
  144. * 表格数据 房态管理-房价管理-改价记录
  145. */
  146. public void queryPageHistory() {
  147. ResUtil.writeJson(ServletActionContext.getResponse(), new JSONObject() {{
  148. put("message", "请求成功");
  149. put("code", 200);
  150. put("data", housePriceService.queryPageHistory(housePriceDto, page, rows));
  151. }}.toString());
  152. }
  153. /**
  154. * 导出表格数据 房态管理-房价管理-改价记录
  155. */
  156. public void exportHistory() {
  157. housePriceService.exportHistory(housePriceDto);
  158. }
  159. /**
  160. * 获取价格日历
  161. * managerId:民宿商家ID
  162. * startTime:入住时间
  163. * endTime:离店时间
  164. *
  165. * @return
  166. */
  167. public String priceCalendar() throws ParseException {
  168. JSONObject resultJson = new JSONObject();
  169. if (merchantId == null) {
  170. resultJson.put("message", "商家不能为空");
  171. resultJson.put("code", 500);
  172. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  173. return null;
  174. }
  175. if (startTime == null) {
  176. resultJson.put("message", "月份时间不能为空");
  177. resultJson.put("code", 500);
  178. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  179. return null;
  180. }
  181. int days = TimeExchange.getMonthDays(startTime, Integer.valueOf(startTime.substring(5, 7)));
  182. String[] months = TimeExchange.getCurrentMonthTimeFrame(startTime);
  183. String startDate = months[0];
  184. String endDate = months[1];
  185. List<HousePriceResultVo> result = new ArrayList<>();
  186. List<String> dateStrs = new ArrayList<>();
  187. for (int i = 0; i < days; i++) {
  188. String date = TimeExchange.TimeDesD(startTime, i);
  189. dateStrs.add(date);
  190. }
  191. Collections.sort(dateStrs);
  192. List<HousePriceDataVo> hprd = housePriceService.queryHousePriceDatas(merchantId, startDate, endDate);
  193. List<HousePriceOneDataVo> oneDatas = new ArrayList<>();
  194. //将数据处理成单天的
  195. for (HousePriceDataVo hp : hprd) {
  196. if (hp.getStartTime().equals(hp.getEndTime())) {
  197. HousePriceOneDataVo oneData = new HousePriceOneDataVo();
  198. oneData.setSetDate(hp.getStartTime());
  199. oneData.setCreateDate(hp.getCreateDate());
  200. oneData.setPrice(hp.getPrice());
  201. oneData.setHouseId(hp.getHouseId());
  202. oneDatas.add(oneData);
  203. } else {
  204. int beDateNum = TimeExchange.daysBetween(hp.getStartTime(), hp.getEndTime());
  205. for (int i = 0; i <= beDateNum; i++) {
  206. HousePriceOneDataVo oneData = new HousePriceOneDataVo();
  207. oneData.setSetDate(TimeExchange.TimeDesD(hp.getStartTime(), i));
  208. oneData.setCreateDate(hp.getCreateDate());
  209. oneData.setPrice(hp.getPrice());
  210. oneData.setHouseId(hp.getHouseId());
  211. oneDatas.add(oneData);
  212. }
  213. }
  214. }
  215. /**
  216. * 根据房型ID处理重复的数据
  217. */
  218. List<HousePriceOneDataVo> newOneDatas = new ArrayList<>();
  219. List<Integer> houseIds = oneDatas.stream().map(HousePriceOneDataVo::getHouseId).distinct().collect(Collectors.toList());
  220. for (Integer houseId : houseIds) {
  221. for (String str : dateStrs) {
  222. Optional<HousePriceOneDataVo> one = oneDatas.stream().filter(e -> e.getSetDate().equals(str) && e.getHouseId().equals(houseId)).sorted(Comparator.comparing(HousePriceOneDataVo::getCreateDate, Comparator.reverseOrder())).findFirst();
  223. if (one != null && one.isPresent()) {
  224. HousePriceOneDataVo oneData = new HousePriceOneDataVo();
  225. oneData.setSetDate(one.get().getSetDate());
  226. oneData.setCreateDate(one.get().getCreateDate());
  227. oneData.setPrice(one.get().getPrice());
  228. oneData.setHouseId(one.get().getHouseId());
  229. newOneDatas.add(oneData);
  230. }
  231. }
  232. }
  233. /**
  234. * 获取该民宿下最低房型价格
  235. */
  236. Double minPrice = houseService.getHouseMinPrice(merchantId);
  237. DecimalFormat decimalFormat = new DecimalFormat("#####.##");
  238. for (String str : dateStrs) {
  239. HousePriceResultVo data = new HousePriceResultVo();
  240. data.setDate(str);
  241. List<HousePriceOneDataVo> priceDatas = oneDatas.stream().filter(e -> e.getSetDate().equals(str)).sorted(Comparator.comparing(HousePriceOneDataVo::getPrice)).collect(Collectors.toList());
  242. if (priceDatas.size() > 0) {
  243. data.setTopinfo("¥" + decimalFormat.format(priceDatas.get(0).getPrice()) + "起");
  244. } else {
  245. data.setTopinfo("¥" + decimalFormat.format(minPrice) + "起");
  246. }
  247. result.add(data);
  248. }
  249. resultJson.put("message", "查询成功");
  250. resultJson.put("code", 200);
  251. resultJson.put("data", result);
  252. ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  253. return null;
  254. }
  255. /**
  256. * 根据房型ID获取每日价格
  257. * houseId:房型ID
  258. * startTime:入住时间
  259. * endTime:离店时间
  260. *
  261. * @return
  262. */
  263. public String dailyPrice() throws ParseException {
  264. JSONObject resultJson = new JSONObject();
  265. if (roomId == null) {
  266. resultJson.put("message", "房型不能为空");
  267. resultJson.put("code", 500);
  268. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  269. return null;
  270. }
  271. if (startTime == null) {
  272. resultJson.put("message", "入住时间不能为空");
  273. resultJson.put("code", 500);
  274. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  275. return null;
  276. }
  277. if (endTime == null) {
  278. resultJson.put("message", "离店时间不能为空");
  279. resultJson.put("code", 500);
  280. ResponseUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  281. return null;
  282. }
  283. List<HousePriceDataVo> priceDatas = housePriceService.queryPriceByHouseId(roomId, startTime, TimeExchange.TimeDesD(endTime, -1));
  284. List<HousePriceOneDataVo> oneDatas = new ArrayList<>();
  285. //将数据处理成单天的
  286. for (HousePriceDataVo hp : priceDatas) {
  287. if (hp.getStartTime().equals(hp.getEndTime())) {
  288. HousePriceOneDataVo oneData = new HousePriceOneDataVo();
  289. oneData.setSetDate(hp.getStartTime());
  290. oneData.setCreateDate(hp.getCreateDate());
  291. oneData.setPrice(hp.getPrice());
  292. oneData.setHouseId(hp.getHouseId());
  293. oneDatas.add(oneData);
  294. } else {
  295. int beDateNum = TimeExchange.daysBetween(hp.getStartTime(), hp.getEndTime());
  296. for (int i = 0; i <= beDateNum; i++) {
  297. HousePriceOneDataVo oneData = new HousePriceOneDataVo();
  298. oneData.setSetDate(TimeExchange.TimeDesD(hp.getStartTime(), i));
  299. oneData.setCreateDate(hp.getCreateDate());
  300. oneData.setPrice(hp.getPrice());
  301. oneData.setHouseId(hp.getHouseId());
  302. oneDatas.add(oneData);
  303. }
  304. }
  305. }
  306. List<String> dateStrs = new ArrayList<>();
  307. int dateNum = TimeExchange.daysBetween(startTime, endTime);
  308. for (int i = 0; i <= dateNum; i++) {
  309. String date = TimeExchange.TimeDesD(startTime, i);
  310. dateStrs.add(date);
  311. }
  312. /**
  313. * 获取该房型默认价格
  314. */
  315. Double housePrice = houseService.queryPriceByHouseId(roomId);
  316. DailyPriceVo dpv = new DailyPriceVo();
  317. dpv.setList(new ArrayList<>());
  318. for (String dateStr : dateStrs) {
  319. HousePriceResultVo data = new HousePriceResultVo();
  320. data.setDate(dateStr);
  321. List<HousePriceOneDataVo> datas = oneDatas.stream().filter(e -> e.getSetDate().equals(dateStr)).sorted(Comparator.comparing(HousePriceOneDataVo::getPrice)).collect(Collectors.toList());
  322. if(dateStr.equals(endTime)){
  323. data.setTopinfo("离店时间");
  324. }else{
  325. if (datas.size() > 0) {
  326. data.setTopinfo("11晚 共" + datas.get(0).getPrice());
  327. dpv.setTotalPrice((dpv.getTotalPrice() == null ? 0 : dpv.getTotalPrice()) + datas.get(0).getPrice());
  328. } else {
  329. data.setTopinfo("1晚 共" + housePrice);
  330. dpv.setTotalPrice((dpv.getTotalPrice() == null ? 0 : dpv.getTotalPrice()) + housePrice);
  331. }
  332. }
  333. dpv.getList().add(data);
  334. }
  335. resultJson.put("message", "查询成功");
  336. resultJson.put("code", 200);
  337. resultJson.put("data", dpv);
  338. ResUtil.writeJson(ServletActionContext.getResponse(), resultJson.toString());
  339. return null;
  340. }
  341. }