QueryLogServiceImpl.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. package com.leeroa.dydb.zhaoshang.service.impl;
  2. import com.google.common.cache.Cache;
  3. import com.google.common.cache.CacheBuilder;
  4. import com.leeroa.base.parameter.service.ParameterContainer;
  5. import com.leeroa.base.utils.sql.SQLUtils;
  6. import com.leeroa.base.utils.sql.TemplateUtils;
  7. import com.leeroa.cache.ConfigCache;
  8. import com.leeroa.core.index.domain.IndexWeightDetail;
  9. import com.leeroa.core.index.utils.IndexWeightUtils;
  10. import com.leeroa.dydb.datasource.lianjia.domain.DataLianjia;
  11. import com.leeroa.dydb.datasource.lianjia.domain.DataLianjiaUp;
  12. import com.leeroa.dydb.datasource.loanorder.domain.DataLoanOrder;
  13. import com.leeroa.dydb.datasource.utils.HouseUtils;
  14. import com.leeroa.dydb.price.domain.CommunityPrice;
  15. import com.leeroa.dydb.price.domain.CommunityQuery;
  16. import com.leeroa.dydb.utils.DoubleUtils;
  17. import com.leeroa.dydb.zhaoshang.bo.QueryLogBo;
  18. import com.leeroa.dydb.zhaoshang.dao.QueryLogDao;
  19. import com.leeroa.dydb.zhaoshang.domain.QueryLog;
  20. import com.leeroa.dydb.zhaoshang.service.QueryLogService;
  21. import com.leeroa.dydb.zhaoshang.vo.QueryLogVo;
  22. import com.michael.core.beans.BeanWrapBuilder;
  23. import com.michael.core.beans.BeanWrapCallback;
  24. import com.michael.core.hibernate.HibernateUtils;
  25. import com.michael.core.hibernate.validator.ValidatorUtils;
  26. import com.michael.core.pager.PageVo;
  27. import com.michael.utils.SnowflakeID;
  28. import com.michael.utils.date.DateUtils;
  29. import com.michael.utils.gson.GsonUtils;
  30. import com.michael.utils.string.StringUtils;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.hibernate.Criteria;
  33. import org.hibernate.Session;
  34. import org.hibernate.criterion.MatchMode;
  35. import org.hibernate.criterion.Order;
  36. import org.hibernate.criterion.Projections;
  37. import org.hibernate.criterion.Restrictions;
  38. import org.springframework.stereotype.Service;
  39. import javax.annotation.Resource;
  40. import java.text.SimpleDateFormat;
  41. import java.util.*;
  42. import java.util.concurrent.TimeUnit;
  43. import java.util.regex.Matcher;
  44. import java.util.regex.Pattern;
  45. /**
  46. * @author Michael
  47. */
  48. @Slf4j
  49. @Service("queryLogService")
  50. public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<QueryLog, QueryLogVo> {
  51. @Resource
  52. private QueryLogDao queryLogDao;
  53. private Cache<String, Double> rateCache = CacheBuilder.newBuilder()
  54. .expireAfterWrite(1, TimeUnit.HOURS).build();
  55. @Override
  56. public String save(QueryLog queryLog) {
  57. validate(queryLog);
  58. String id = queryLogDao.save(queryLog);
  59. return id;
  60. }
  61. @Override
  62. public void update(QueryLog queryLog) {
  63. validate(queryLog);
  64. queryLogDao.update(queryLog);
  65. }
  66. private void validate(QueryLog queryLog) {
  67. ValidatorUtils.validate(queryLog);
  68. }
  69. @Override
  70. public PageVo pageQuery(QueryLogBo bo) {
  71. PageVo vo = new PageVo();
  72. Long total = queryLogDao.getTotal(bo);
  73. vo.setTotal(total);
  74. if (total == null || total == 0) {
  75. return vo;
  76. }
  77. List<QueryLog> queryLogList = queryLogDao.pageQuery(bo);
  78. List<QueryLogVo> vos = BeanWrapBuilder.newInstance()
  79. .setCallback(this)
  80. .wrapList(queryLogList, QueryLogVo.class);
  81. vo.setData(vos);
  82. return vo;
  83. }
  84. @Override
  85. public QueryLogVo findById(String id) {
  86. QueryLog queryLog = queryLogDao.findById(id);
  87. return BeanWrapBuilder.newInstance()
  88. .wrap(queryLog, QueryLogVo.class);
  89. }
  90. @Override
  91. public void deleteByIds(String[] ids) {
  92. if (ids == null || ids.length == 0) {
  93. return;
  94. }
  95. for (String id : ids) {
  96. queryLogDao.deleteById(id);
  97. }
  98. }
  99. @Override
  100. public List<QueryLogVo> query(QueryLogBo bo) {
  101. List<QueryLog> queryLogList = queryLogDao.query(bo);
  102. List<QueryLogVo> vos = BeanWrapBuilder.newInstance()
  103. .setCallback(this)
  104. .wrapList(queryLogList, QueryLogVo.class);
  105. return vos;
  106. }
  107. @Override
  108. public String getHouseNameByAddress(String address) {
  109. final Session session = HibernateUtils.getSession();
  110. String areaName = HouseUtils.getArea(address);
  111. // 这里不考虑非成都城区的情况
  112. // if (areaName != null && !HouseUtils.AREA_CHENGDU.contains(areaName)) {
  113. // areaName = null;
  114. // }
  115. // 获得街道号
  116. // String streetName = HouseUtils.getStreet(address);
  117. // String houseName = null;
  118. // // 如果没有解析到街道,则直接尝试解析小区名称。
  119. // if (streetName == null) {
  120. // houseName = HouseUtils.getHouseName(address);
  121. // if (houseName != null) {
  122. // return houseName;
  123. // }
  124. // }
  125. // // 这里表示没有解析出来街道,也没有解析出来小区名称
  126. // if (streetName == null) {
  127. // log.warn("地址解析失败:{}", address);
  128. // return null;
  129. // }
  130. //先解析小区名称
  131. String houseName =HouseUtils.getHouseName(address);
  132. String streetName = null;
  133. // 如果没有小区名称。再解析地址
  134. if (houseName != null && !"".equals(houseName)) {
  135. return houseName;
  136. }
  137. streetName = HouseUtils.getStreet(address);
  138. if (streetName == null) {
  139. log.warn("地址解析失败:{}", address);
  140. return null;
  141. }
  142. // 查询价值库中的地址。并给定区域(如果有)
  143. Criteria cpCriteria = session.createCriteria(CommunityPrice.class)
  144. .setProjection(Projections.property("houses"))
  145. .add(Restrictions.like("address", streetName, MatchMode.ANYWHERE));
  146. addAreaRestrictions(cpCriteria, areaName);
  147. houseName = (String) cpCriteria
  148. .addOrder(Order.desc("priceUpdateTime"))
  149. .setMaxResults(1).uniqueResult();
  150. if (houseName != null) {
  151. return houseName;
  152. }
  153. // 查询个贷中的地址。并给定区域(如果有)
  154. Criteria criteria = session.createCriteria(DataLoanOrder.class)
  155. .setProjection(Projections.property("houses"))
  156. .add(Restrictions.like("address", streetName, MatchMode.ANYWHERE));
  157. addAreaRestrictions(criteria, areaName);
  158. houseName = (String) criteria
  159. .addOrder(Order.desc("priceDate"))
  160. .setMaxResults(1).uniqueResult();
  161. if (houseName != null) {
  162. return houseName;
  163. }
  164. // 尝试直接解析一下小区名称
  165. houseName = HouseUtils.getHouseName(address);
  166. return houseName;
  167. }
  168. public Double getAvgPriceByRoad(String road) {
  169. final Session session = HibernateUtils.getSession();
  170. // 查询价值库中的地址。并给定区域(如果有)
  171. return (Double) session.createCriteria(CommunityPrice.class)
  172. .setProjection(Projections.avg("price"))
  173. .add(Restrictions.like("address", road, MatchMode.ANYWHERE))
  174. .uniqueResult();
  175. }
  176. @Override
  177. public Double getPriceByHouseName(String houseName) {
  178. final Session session = HibernateUtils.getSession();
  179. CommunityPrice communityPrice = (CommunityPrice) session.createCriteria(CommunityPrice.class)
  180. .add(Restrictions.eq("houses", houseName))
  181. .addOrder(Order.desc("priceUpdateTime"))
  182. .setMaxResults(1)
  183. .uniqueResult();
  184. if (communityPrice != null) {
  185. return communityPrice.getPrice();
  186. }
  187. return null;
  188. }
  189. private void addAreaRestrictions(Criteria criteria, String areaName) {
  190. if (areaName == null) {
  191. return;
  192. }
  193. // 历史名称的特殊处理
  194. if (StringUtils.include(areaName, "双流区", "天府新区", "双流县")) {
  195. criteria.add(Restrictions.in("areaName", "双流区", "天府新区", "双流县"));
  196. } else if (StringUtils.include(areaName, "高新区", "武侯区")) {
  197. criteria.add(Restrictions.in("areaName", "高新区", "武侯区"));
  198. } else if (StringUtils.include(areaName, "郫都区", "郫县")) {
  199. criteria.add(Restrictions.in("areaName", "郫都区", "郫县"));
  200. } else {
  201. criteria.add(Restrictions.eq("areaName", areaName));
  202. }
  203. }
  204. @Override
  205. public CommunityQuery queryByZhaoShang(QueryLog ql) {
  206. // 保存搜索记录
  207. save(ql);
  208. final Session session = HibernateUtils.getSession();
  209. Date now = DateUtils.getDayBegin(new Date());
  210. CommunityQuery cq = new CommunityQuery();
  211. // 案例均价、最大值、最小值、案例数量、12个月走势
  212. cq.setProvinceName(HouseUtils.getProvince(ql.getAddress()));
  213. cq.setCityName(HouseUtils.getCity(ql.getAddress()));
  214. cq.setHouseName(ql.getName());
  215. cq.setAddress(ql.getAddress());
  216. // 评估状态
  217. cq.setStatus("Y");
  218. // 房屋用途写死(001住宅,002公寓,026车库)
  219. cq.setUsage("1002001");
  220. // 询价时间
  221. cq.setQueryTime(DateUtils.formatDatetime(now));
  222. String address = ql.getAddress();
  223. String houseName = ql.getName();
  224. // 获取城市,如果不是成都市的,则返回
  225. String cityName = HouseUtils.getCity(address);
  226. // if (cityName != null && !cityName.contains("成都")) {
  227. // log.info("招商查询,非成都地区,直接返回:{}", address);
  228. // cq.setStatus("N");
  229. // cq.setRemark(CommunityQu
  230. // cq.setHouseName("");ery.ERROR_TYPE_NOT_LOCAL);
  231. // return cq;
  232. // }
  233. // 获取区县,如果不是成都市的,也返回
  234. String areaName = HouseUtils.getArea(address);
  235. // if (StringUtils.isNotEmpty(areaName) && HouseUtils.AREA_OTHER.contains(areaName)) {
  236. // log.info("招商查询,非成都地区,直接返回:{}", address);
  237. // cq.setStatus("N");
  238. // cq.setHouseName("");
  239. // cq.setRemark(CommunityQuery.ERROR_TYPE_NOT_LOCAL);
  240. // return cq;
  241. // }
  242. // 如果没有传递小区名称,则通过地址查询一次个贷数据
  243. if (StringUtils.isEmpty(houseName)) {
  244. houseName = getHouseNameByAddress(address);
  245. }
  246. final Double area = Double.parseDouble(ql.getBuildingArea());
  247. // 没有解析出来小区
  248. if (houseName == null) {
  249. String road = HouseUtils.getRoad(address);
  250. if (road == null) {
  251. cq.setStatus("N");
  252. cq.setHouseName("");
  253. cq.setRemark(CommunityQuery.ERROR_TYPE_PARSE_FAIL);
  254. return cq;
  255. }
  256. // 通过道路号,再查询一次
  257. Double price = getAvgPriceByRoad(road);
  258. if (price == null) {
  259. cq.setStatus("N");
  260. cq.setHouseName("");
  261. cq.setRemark(CommunityQuery.ERROR_TYPE_PARSE_FAIL);
  262. return cq;
  263. }
  264. // 调用价格系数进行一次处理
  265. price = getRatePrice(price);
  266. cq.setAreaName(HouseUtils.getChengDuArea(address));
  267. cq.setHouseName(road);
  268. cq.setCommunityName(road);
  269. cq.setPrice(price);
  270. cq.setMinPrice(price);
  271. cq.setMaxPrice(price);
  272. cq.setPrice(price);
  273. cq.setHouseAvgPrice(price);
  274. // 案例数量
  275. cq.setHouseCases(1);
  276. // 案例总价(原始数据是按照万元计算)
  277. cq.setMoney(price * area);
  278. cq.setBuildArea(area);
  279. cq.setHouseAvgPrice(price);
  280. cq.setCommunityAvgPrice(price);
  281. cq.setRemark(CommunityQuery.MATCH_TYPE_STREET);
  282. return cq;
  283. }
  284. // 根据小区名称获取小区的数据
  285. CommunityPrice communityPrice = null;
  286. while (true) {
  287. // communityPrice = (CommunityPrice) session.createCriteria(CommunityPrice.class)
  288. // .add(Restrictions.eq("houses", houseName))
  289. // .add(Restrictions.eq("cityName",cityName))
  290. // .add(Restrictions.eq("areaName",areaName))
  291. // .addOrder(Order.desc("priceUpdateTime"))
  292. // .setMaxResults(1)
  293. // .uniqueResult();
  294. Criteria criteria = session.createCriteria(CommunityPrice.class);
  295. criteria.add(Restrictions.eq("houses", houseName));
  296. if (StringUtils.isNotEmpty(cityName)){
  297. criteria.add(Restrictions.eq("cityName",cityName));
  298. }
  299. if (StringUtils.isNotEmpty(areaName)){
  300. criteria.add(Restrictions.eq("areaName",areaName));
  301. }
  302. criteria.addOrder(Order.desc("priceUpdateTime"));
  303. criteria.setMaxResults(1);
  304. communityPrice = (CommunityPrice) criteria.uniqueResult();
  305. if (communityPrice != null) {
  306. break;
  307. }
  308. // 如果是小区名称中包含几期xx区这种数据,则移出过后再查询一次
  309. Pattern pattern = Pattern.compile("(.+)[一二三四五六七八九十\\w]+[期区]");
  310. Matcher matcher = pattern.matcher(houseName);
  311. if (matcher.find()) {
  312. houseName = matcher.group(1);
  313. cq.setRemark(CommunityQuery.MATCH_TYPE_LIKE);
  314. continue;
  315. }
  316. // 为了提高命中率,按照名称再模糊匹配一次
  317. // communityPrice = (CommunityPrice) session.createCriteria(CommunityPrice.class)
  318. // .add(Restrictions.like("houses", houseName, MatchMode.START))
  319. // .add(Restrictions.eq("cityName",cityName))
  320. // .add(Restrictions.eq("areaName",areaName))
  321. // .setMaxResults(1)
  322. // .addOrder(Order.asc("houses"))
  323. // .uniqueResult();
  324. Criteria criteria1 = session.createCriteria(CommunityPrice.class);
  325. criteria1.add(Restrictions.like("houses", houseName, MatchMode.START));
  326. if (StringUtils.isNotEmpty(cityName)){
  327. criteria1.add(Restrictions.eq("cityName",cityName));
  328. }
  329. if (StringUtils.isNotEmpty(areaName)){
  330. criteria1.add(Restrictions.eq("areaName",areaName));
  331. }
  332. criteria1.addOrder(Order.desc("priceUpdateTime"));
  333. criteria1.setMaxResults(1);
  334. communityPrice = (CommunityPrice) criteria1.uniqueResult();
  335. cq.setRemark(CommunityQuery.MATCH_TYPE_LIKE);
  336. break;
  337. }
  338. cq.setCommunityName(houseName);
  339. cq.setHouseName(houseName);
  340. log.info("查询小区数据 : {} => {}", houseName, GsonUtils.toJson(communityPrice));
  341. // 基本上不存在查询不出来的情况
  342. if (communityPrice != null) {
  343. cq.setCaseId(communityPrice.getId());
  344. cq.setProvinceName(communityPrice.getProvinceName());
  345. cq.setCityName(communityPrice.getCityName());
  346. // 行政区
  347. cq.setAreaName(communityPrice.getAreaName());
  348. // 设置经纬度
  349. if (StringUtils.isNotEmpty(communityPrice.getLatitude())) {
  350. cq.setBaiduLat(Double.parseDouble(communityPrice.getLatitude()));
  351. }
  352. if (StringUtils.isNotEmpty(communityPrice.getLongitude())) {
  353. cq.setBaiduLng(Double.parseDouble(communityPrice.getLongitude()));
  354. }
  355. String buildYear = communityPrice.getBuildYear();
  356. if (StringUtils.isEmpty(buildYear)) {
  357. // 从链家的数据里取一次建成年份
  358. buildYear = (String) session.createCriteria(DataLianjia.class)
  359. .setProjection(Projections.property("buildYear"))
  360. .add(Restrictions.eq("houses", houseName))
  361. .add(Restrictions.isNotNull("buildYear"))
  362. .setMaxResults(1)
  363. .uniqueResult();
  364. }
  365. if (StringUtils.isEmpty(buildYear)) {
  366. // 如果依旧没有年份,则从挂牌数据中取一次
  367. buildYear = (String) session.createCriteria(DataLianjiaUp.class)
  368. .setProjection(Projections.property("buildYear"))
  369. .add(Restrictions.eq("houses", houseName))
  370. .add(Restrictions.isNotNull("buildYear"))
  371. .setMaxResults(1)
  372. .uniqueResult();
  373. }
  374. if (StringUtils.isEmpty(buildYear)) {
  375. // 如果依旧没有年份,则写死一个2000
  376. buildYear = "2020";
  377. }
  378. cq.setBuildYear(buildYear);
  379. cq.setId(communityPrice.getId() + "_" + SnowflakeID.getInstance().next());
  380. cq.setCommunityAlias(communityPrice.getHouses());
  381. // 如果地址中包含成都,则表示是全路径的地址
  382. if (communityPrice.getAddress() != null && communityPrice.getAddress().contains("成都")) {
  383. // address = communityPrice.getAddress().split(",")[0];
  384. }
  385. // 建筑面积
  386. cq.setBuildArea(area);
  387. // 最小单价
  388. // 最大单价
  389. // 均价
  390. Double price = getRatePrice(communityPrice.getPrice());
  391. // 获得参数化过后的价格
  392. cq.setMinPrice(price);
  393. cq.setMaxPrice(price);
  394. cq.setPrice(price);
  395. cq.setHouseAvgPrice(price);
  396. cq.setMngPrice(communityPrice.getMngPrice());
  397. // 案例数量
  398. cq.setHouseCases(1);
  399. // 案例总价(原始数据是按照万元计算)
  400. cq.setMoney(price * area);
  401. // 物业费
  402. cq.setMngPrice(communityPrice.getMngPrice());
  403. // 总套数
  404. cq.setTotalHouse(communityPrice.getHouseQuantity());
  405. } else {
  406. // cq.setRemark(CommunityQuery.ERROR_TYPE_NO_DATA);
  407. // cq.setStatus("N");
  408. //再通过地址模糊匹配
  409. // communityPrice = (CommunityPrice) session.createCriteria(CommunityPrice.class)
  410. // .add(Restrictions.like("address", houseName))
  411. // .add(Restrictions.eq("cityName",cityName))
  412. // .add(Restrictions.eq("areaName",areaName))
  413. // .addOrder(Order.desc("priceUpdateTime"))
  414. // .setMaxResults(1)
  415. // .uniqueResult();
  416. Criteria criteria = session.createCriteria(CommunityPrice.class);
  417. criteria.add(Restrictions.like("address", houseName,MatchMode.ANYWHERE));
  418. if (StringUtils.isNotEmpty(cityName)){
  419. criteria.add(Restrictions.eq("cityName",cityName));
  420. }
  421. if (StringUtils.isNotEmpty(areaName)){
  422. criteria.add(Restrictions.eq("areaName",areaName));
  423. }
  424. criteria.addOrder(Order.desc("priceUpdateTime"));
  425. criteria.setMaxResults(1);
  426. communityPrice = (CommunityPrice) criteria.uniqueResult();
  427. if (communityPrice == null){
  428. cq.setRemark(CommunityQuery.ERROR_TYPE_NO_DATA);
  429. cq.setStatus("N");
  430. }else {
  431. houseName = communityPrice.getHouses();
  432. cq.setCommunityName(houseName);
  433. cq.setHouseName(houseName);
  434. cq.setAreaName(communityPrice.getAreaName());
  435. cq.setCityName(communityPrice.getCityName());
  436. Double price = getRatePrice(communityPrice.getPrice());
  437. cq.setPrice(price);
  438. cq.setMinPrice(price);
  439. cq.setMaxPrice(price);
  440. cq.setBuildArea(area);
  441. cq.setMoney(price * area);
  442. cq.setMngPrice(communityPrice.getMngPrice());
  443. // 总套数
  444. cq.setTotalHouse(communityPrice.getHouseQuantity());
  445. }
  446. }
  447. cq.setAddress(address);
  448. // 根据地址解析出街道
  449. cq.setStreetName(HouseUtils.getStreet(address));
  450. // 根据地址解析出门牌号
  451. Optional<String> doorNOOp = HouseUtils.getHouseNO(address);
  452. doorNOOp.ifPresent(cq::setDoorName);
  453. // 根据地址解析出楼栋
  454. Optional<String> buildOp = HouseUtils.getBuildingName(address);
  455. buildOp.ifPresent(cq::setBuildingName);
  456. // 根据地址解析出房号
  457. Optional<String> houseNOOp = HouseUtils.getHouseNO(address);
  458. houseNOOp.ifPresent(cq::setHouseName);
  459. // 趋势类型
  460. cq.setTrendType("CONST");
  461. // 查询12个月的房价
  462. // 获得开始时间和截至时间
  463. Date startDate = DateUtils.addMonth(now, -12);
  464. Map<String, Object> params = new HashMap<>();
  465. params.put("startDate", startDate);
  466. params.put("endDate", now);
  467. params.put("houses", houseName);
  468. String sql = TemplateUtils.getTemplate("fmt/ql.fmt", params, ConfigCache.isDebug());
  469. List<Map<String, Object>> data = SQLUtils.listMap(sql, params);
  470. List<Map<String, Object>> trendData = new ArrayList<>();
  471. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
  472. Double totalAvg = 0d;
  473. Double prevAvgPrice = 0d;
  474. for (int i = 0; i < 12; i++) {
  475. Date current = DateUtils.addMonth(startDate, i);
  476. String dt = dateFormat.format(current);
  477. // 要拼接的格式为:时间,单价,总价
  478. // 从查询结果中找出对应的月份数据
  479. Map<String, Object> innerData = new HashMap<>();
  480. for (Map<String, Object> map : data) {
  481. String month = (String) map.get("dt");
  482. if (StringUtils.equals(month, dt)) {
  483. innerData.put("EVAL_DATE", dt);
  484. Double avgPrice = (Double) map.get("avgPrice");
  485. prevAvgPrice = avgPrice;
  486. totalAvg += avgPrice;
  487. // 设置最小值
  488. Double minPrice = (Double) map.get("minPrice");
  489. if (minPrice < cq.getMinPrice()) {
  490. cq.setMinPrice(minPrice);
  491. }
  492. // 设置最大值
  493. Double maxPrice = (Double) map.get("maxPrice");
  494. if (maxPrice > cq.getMaxPrice()) {
  495. cq.setMaxPrice(maxPrice);
  496. }
  497. // 设置当前月份的均价
  498. Double money = avgPrice * area;
  499. innerData.put("UNIT_PRICE", avgPrice);
  500. innerData.put("TOTAL_PRICE", money);
  501. break;
  502. }
  503. }
  504. // 如果没有匹配到,则取上一个月月份的数据
  505. if (innerData.isEmpty()) {
  506. innerData.put("EVAL_DATE", dt);
  507. innerData.put("UNIT_PRICE", prevAvgPrice);
  508. innerData.put("TOTAL_PRICE", prevAvgPrice * area);
  509. }
  510. trendData.add(innerData);
  511. }
  512. // 再次设置总的均价
  513. if (data.size() > 0) {
  514. cq.setHouseAvgPrice(totalAvg / data.size());
  515. }
  516. cq.setTrendData(trendData);
  517. return cq;
  518. }
  519. private double getRatePrice(Double price) {
  520. if (price == null || price == 0) {
  521. return 0;
  522. }
  523. String key = "招商价格浮动比例";
  524. Double rate = rateCache.getIfPresent(key);
  525. if (rate == null) {
  526. IndexWeightDetail iwd = IndexWeightUtils.getIndex("其他配置", "招商价格浮动比例");
  527. if (iwd != null && StringUtils.isNotEmpty(iwd.getValues()) && iwd.getValues().matches("\\d+(\\.\\d+)?")) {
  528. rate = DoubleUtils.parse(iwd.getValues());
  529. } else {
  530. rate = 0.0;
  531. }
  532. rateCache.put(key, rate);
  533. }
  534. return price * rate * 0.01;
  535. }
  536. @Override
  537. public void doCallback(QueryLog queryLog, QueryLogVo vo) {
  538. ParameterContainer container = ParameterContainer.getInstance();
  539. }
  540. }