ChannelMapServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. package com.ruoyi.demo.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.github.pagehelper.PageHelper;
  4. import com.github.pagehelper.PageInfo;
  5. import com.ruoyi.demo.entity.*;
  6. import com.ruoyi.demo.entity.bo.*;
  7. import com.ruoyi.demo.entity.vo.ChannelMapAceeptVo;
  8. import com.ruoyi.demo.mapper.*;
  9. import com.ruoyi.demo.service.ChannelMapService;
  10. import com.ruoyi.demo.utils.InitMapUtil;
  11. import com.ruoyi.demo.utils.WdRedisStoreage;
  12. import lombok.RequiredArgsConstructor;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.data.redis.core.RedisTemplate;
  15. import org.springframework.stereotype.Service;
  16. import java.math.BigDecimal;
  17. import java.util.ArrayList;
  18. import java.util.HashMap;
  19. import java.util.List;
  20. @RequiredArgsConstructor
  21. @Service
  22. public class ChannelMapServiceImpl implements ChannelMapService {
  23. @Autowired
  24. private AddrCategoryDao addrCategoryDao;
  25. @Autowired
  26. private WdInfoDao originWdInfoDao;
  27. @Autowired
  28. InitMapUtil initMapUtil;
  29. @Autowired
  30. AttentionPoolDao attentionPoolDao;
  31. @Autowired
  32. WdInfoDao wdInfoDao;
  33. @Autowired
  34. RedisTemplate redisTemplate;
  35. @Autowired
  36. WdRedisStoreage wdRedisStoreage;
  37. @Autowired
  38. StoreWdDao storeWdDao;
  39. @Autowired
  40. HouseWdDao houseWdDao;
  41. @Autowired
  42. BuildWdDao buildWdDao;
  43. @Autowired
  44. TrafficWdDao trafficWdDao;
  45. @Autowired
  46. EnterpriseWdDao enterpriseWdDao;
  47. @Override
  48. public WdCount area(ChannelMapAceeptVo channelMapAceeptVo) {
  49. //1.根据不同级别得到 需要封装的 地区码
  50. List<String> addrCodeList = new ArrayList<>();
  51. if ("province".equals(channelMapAceeptVo.getRankType())) {
  52. //省码
  53. for (String s : channelMapAceeptVo.getAddrCode()) {
  54. String substring = s.substring(0, 2);
  55. addrCodeList.add(substring);
  56. }
  57. } else if ("city".equals(channelMapAceeptVo.getRankType())) {
  58. //省的所有市
  59. for (String s : channelMapAceeptVo.getAddrCode()) {
  60. String substring = s.substring(0, 2);
  61. addrCodeList.add(substring);
  62. }
  63. } else if ("zone".equals(channelMapAceeptVo.getRankType())) {
  64. //市的所有区
  65. for (String s : channelMapAceeptVo.getAddrCode()) {
  66. String substring = s.substring(0, 4);
  67. addrCodeList.add(substring);
  68. }
  69. } else {
  70. return null;
  71. }
  72. //2.找到所有需要封装的 地区信息
  73. QueryWrapper<AddrCategory> queryWrapper = new QueryWrapper<>();
  74. if ("province".equals(channelMapAceeptVo.getRankType())) {
  75. queryWrapper.eq("city", "");
  76. } else if ("city".equals(channelMapAceeptVo.getRankType())) {
  77. queryWrapper.eq("district", "").and(addrCategoryQueryWrapper -> {
  78. addrCategoryQueryWrapper.ne("city", "");
  79. });
  80. } else if ("zone".equals(channelMapAceeptVo.getRankType())) {
  81. queryWrapper.ne("district", "");
  82. }
  83. queryWrapper.and(addrCategoryQueryWrapper -> {
  84. addrCategoryQueryWrapper.or(addrCategoryQueryWrapper1 -> {
  85. for (String s : addrCodeList) {
  86. addrCategoryQueryWrapper1.likeRight("addr_code", s).or();
  87. }
  88. });
  89. });
  90. List<AddrCategory> addrCategories = addrCategoryDao.selectList(queryWrapper);
  91. //3.组装地区信息
  92. List<WdCountBody> result = new ArrayList<>();
  93. HashMap<String,Integer> statistics = new HashMap<>(); //统计信息
  94. for (AddrCategory addrCategory : addrCategories) {
  95. WdCountBody wdCountBody = new WdCountBody();
  96. //组装
  97. wdCountBody.setLat(addrCategory.getLatGd());
  98. wdCountBody.setLng(addrCategory.getLngGd());
  99. wdCountBody.setAddrCode(addrCategory.getAddrCode());
  100. if ("province".equals(channelMapAceeptVo.getRankType())) {
  101. wdCountBody.setName(addrCategory.getProvince());
  102. statistics.put(addrCategory.getAddrCode().substring(0,2),0);
  103. } else if ("city".equals(channelMapAceeptVo.getRankType())) {
  104. wdCountBody.setName(addrCategory.getCity());
  105. statistics.put(addrCategory.getAddrCode().substring(0,4),0);
  106. } else if ("zone".equals(channelMapAceeptVo.getRankType())) {
  107. wdCountBody.setName(addrCategory.getDistrict());
  108. statistics.put(addrCategory.getAddrCode().substring(0,6),0);
  109. }
  110. result.add(wdCountBody);
  111. }
  112. //4.组装条件构造器找到网点信息网点
  113. //2.1 渠道、地区分类
  114. QueryWrapper<WdInfo> queryWrapper2 = new QueryWrapper<>();
  115. queryWrapper2.select("addr_code","count(*) as audit");
  116. queryWrapper2.in("wd_type_code", channelMapAceeptVo.getChannel()).and(originWdInfoQueryWrapper -> {
  117. for (String s : addrCodeList) {
  118. originWdInfoQueryWrapper.likeRight("addr_code", s).or();
  119. }
  120. });
  121. //搜索字段
  122. if (channelMapAceeptVo.getSearchText() != null && !channelMapAceeptVo.getSearchText().trim().equals("")) {
  123. queryWrapper2.and(originWdInfoQueryWrapper -> {
  124. originWdInfoQueryWrapper.like("wd_name", channelMapAceeptVo.getSearchText() );
  125. });
  126. }
  127. //城市等级分类
  128. if(channelMapAceeptVo.getCityTier() != null && channelMapAceeptVo.getCityTier().length > 0){
  129. List<String> tierCode = new ArrayList<>();
  130. for (String s : channelMapAceeptVo.getCityTier()) {
  131. List<String> list = initMapUtil.getInitCityTierListMap(s);
  132. if (list != null){
  133. tierCode.addAll(list);
  134. }
  135. }
  136. queryWrapper.and(wdInfoQueryWrapper -> {
  137. for (String s : tierCode) {
  138. wdInfoQueryWrapper.likeRight("addr_code", s).or();
  139. }
  140. });
  141. }
  142. queryWrapper2.groupBy("addr_code");
  143. //5.统计
  144. int total = 0;
  145. List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper2);
  146. for (WdInfo wdInfo : wdInfos) {
  147. if("province".equals(channelMapAceeptVo.getRankType())){
  148. statistics.put(wdInfo.getAddrCode().substring(0,2),statistics.get(wdInfo.getAddrCode().substring(0,2))+wdInfo.getAudit());
  149. } else if ("city".equals(channelMapAceeptVo.getRankType())) {
  150. statistics.put(wdInfo.getAddrCode().substring(0,4),statistics.get(wdInfo.getAddrCode().substring(0,4))+wdInfo.getAudit());
  151. } else if ("zone".equals(channelMapAceeptVo.getRankType())) {
  152. statistics.put(wdInfo.getAddrCode().substring(0,6),statistics.get(wdInfo.getAddrCode().substring(0,6))+wdInfo.getAudit());
  153. }
  154. total+=+wdInfo.getAudit();
  155. }
  156. //5.计算radio
  157. for (WdCountBody wdCountBody : result) {
  158. String code = null;
  159. if("province".equals(channelMapAceeptVo.getRankType())){
  160. code = wdCountBody.getAddrCode().substring(0,2);
  161. }else if("city".equals(channelMapAceeptVo.getRankType())){
  162. code = wdCountBody.getAddrCode().substring(0,4);
  163. }else if("zone".equals(channelMapAceeptVo.getRankType())){
  164. code = wdCountBody.getAddrCode().substring(0,6);
  165. }
  166. if(statistics.get(code) != null){
  167. wdCountBody.setCount(statistics.get(code));
  168. }else {
  169. wdCountBody.setCount(0);
  170. }
  171. if (total != 0){
  172. BigDecimal bigDecimal = new BigDecimal((float) wdCountBody.getCount() / total);
  173. float v = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
  174. wdCountBody.setRadio(v);
  175. }
  176. else
  177. wdCountBody.setRadio(0.0f);
  178. }
  179. WdCount wdCount = new WdCount();
  180. wdCount.setWdCountBodyList(result);
  181. wdCount.setTotal(total);
  182. return wdCount;
  183. }
  184. //TODO 待测试(redis版本)
  185. @Override
  186. public HashMap list(ChannelMapAceeptVo channelMapAceeptVo) {
  187. //1.根据条件获取网点
  188. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  189. assembleQueryWrapper(queryWrapper,channelMapAceeptVo);
  190. PageHelper.startPage(channelMapAceeptVo.getPageNum(), channelMapAceeptVo.getPageSize());
  191. List<WdInfo> originWdInfos = wdInfoDao.selectList(queryWrapper);
  192. PageInfo<WdInfo> PageInfo = new PageInfo<>(originWdInfos);
  193. //2.获取标签并组装
  194. List<WdTopologicalInfoBo> result = new ArrayList<>(); //返回的封装网点数据集
  195. for (WdInfo wdInfo : PageInfo.getList()) {
  196. WdTopologicalInfoBo wdTopologicalInfoBo = new WdTopologicalInfoBo(wdInfo);
  197. wdTopologicalInfoBo.setAddrCodeInfo(initMapUtil.getInitAddrCodeMap(wdInfo.getAddrCode()));
  198. List<String> tags = wdRedisStoreage.getWdTag(wdInfo);
  199. wdTopologicalInfoBo.setTag(tags);
  200. result.add(wdTopologicalInfoBo);
  201. }
  202. //返回结果集
  203. PageInfo.setList(null);
  204. HashMap data = new HashMap();
  205. data.put("data",result);
  206. data.put("page",PageInfo);
  207. return data;
  208. }
  209. @Override
  210. public PageInfo<WdInfo> point(String[] channel, String searchText, String[] addrCode, int pageNum, int pageSize) {
  211. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  212. queryWrapper.in("wd_type_code", channel);
  213. for (String s : addrCode) {
  214. queryWrapper.and(originWdInfoQueryWrapper -> {
  215. originWdInfoQueryWrapper.eq("addr_code",s);
  216. });
  217. }
  218. if (searchText != null && !searchText.trim().equals("")) {
  219. queryWrapper.and(originWdInfoQueryWrapper -> {
  220. originWdInfoQueryWrapper.like("wd_name", searchText);
  221. });
  222. }
  223. PageHelper.startPage(pageNum, pageSize);
  224. List<WdInfo> originWdInfos = originWdInfoDao.selectList(queryWrapper);
  225. PageInfo<WdInfo> PageInfo = new PageInfo<>(originWdInfos);
  226. return PageInfo;
  227. }
  228. @Override
  229. public WdInfo getWdInfo(String wdId) {
  230. QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
  231. queryWrapper.eq("wd_id",wdId);
  232. WdInfo wdInfo = wdInfoDao.selectOne(queryWrapper);
  233. if(wdInfo == null)
  234. return wdInfo;
  235. if("1".equals(wdInfo.getWdTypeCode())){
  236. QueryWrapper<StoreWd> queryWrapper1 = new QueryWrapper<>();
  237. queryWrapper1.eq("wd_id",wdId);
  238. StoreWd storeWd = storeWdDao.selectOne(queryWrapper1);
  239. StoreWdInfoBo storeWdInfoBo = new StoreWdInfoBo(wdInfo);
  240. storeWdInfoBo.setStoreWd(storeWd);
  241. storeWdInfoBo.setTags(wdRedisStoreage.getWdTag(wdInfo));
  242. storeWdInfoBo.setAddrCode(initMapUtil.getInitAddrCodeMap(storeWdInfoBo.getAddrCode()));
  243. return storeWdInfoBo;
  244. }else if("2".equals(wdInfo.getWdTypeCode())){
  245. QueryWrapper<HouseWd> queryWrapper1 = new QueryWrapper<>();
  246. queryWrapper1.eq("wd_id",wdId);
  247. HouseWd houseWd = houseWdDao.selectOne(queryWrapper1);
  248. HouseWdInfoBo houseWdInfoBo = new HouseWdInfoBo(wdInfo);
  249. houseWdInfoBo.setHouseWd(houseWd);
  250. houseWdInfoBo.setTags(wdRedisStoreage.getWdTag(wdInfo));
  251. houseWdInfoBo.setAddrCode(initMapUtil.getInitAddrCodeMap(houseWdInfoBo.getAddrCode()));
  252. return houseWdInfoBo;
  253. }else if("3".equals(wdInfo.getWdTypeCode())){
  254. QueryWrapper<BuildWd> queryWrapper1 = new QueryWrapper<>();
  255. queryWrapper1.eq("wd_id",wdId);
  256. BuildWd buildWd = buildWdDao.selectOne(queryWrapper1);
  257. BuildWdInfoBo buildWdInfoBo = new BuildWdInfoBo(wdInfo);
  258. buildWdInfoBo.setBuildWd(buildWd);
  259. buildWdInfoBo.setTags(wdRedisStoreage.getWdTag(wdInfo));
  260. buildWdInfoBo.setAddrCode(initMapUtil.getInitAddrCodeMap(buildWdInfoBo.getAddrCode()));
  261. return buildWdInfoBo;
  262. }else if("4".equals(wdInfo.getWdTypeCode())){
  263. QueryWrapper<TrafficWd> queryWrapper1 = new QueryWrapper<>();
  264. queryWrapper1.eq("wd_id",wdId);
  265. TrafficWd trafficWd = trafficWdDao.selectOne(queryWrapper1);
  266. TrafficWdInfoBo trafficWdInfoBo = new TrafficWdInfoBo(wdInfo);
  267. trafficWdInfoBo.setTrafficWd(trafficWd);
  268. trafficWdInfoBo.setTags(wdRedisStoreage.getWdTag(wdInfo));
  269. trafficWdInfoBo.setAddrCode(initMapUtil.getInitAddrCodeMap(trafficWdInfoBo.getAddrCode()));
  270. return trafficWdInfoBo;
  271. }else if("5".equals(wdInfo.getWdTypeCode())){
  272. QueryWrapper<EnterpriseWd> queryWrapper1 = new QueryWrapper<>();
  273. queryWrapper1.eq("wd_id",wdId);
  274. EnterpriseWd enterpriseWd = enterpriseWdDao.selectOne(queryWrapper1);
  275. EnterpriseWdInfoBo enterpriseWdInfoBo = new EnterpriseWdInfoBo(wdInfo);
  276. enterpriseWdInfoBo.setEnterpriseWd(enterpriseWd);
  277. enterpriseWdInfoBo.setTags(wdRedisStoreage.getWdTag(wdInfo));
  278. enterpriseWdInfoBo.setAddrCode(initMapUtil.getInitAddrCodeMap(enterpriseWdInfoBo.getAddrCode()));
  279. return enterpriseWdInfoBo;
  280. }
  281. return wdInfo;
  282. }
  283. public void assembleQueryWrapper(QueryWrapper<WdInfo> queryWrapper,ChannelMapAceeptVo channelMapAceeptVo){
  284. //1.根据不同级别得到需要查询的 地区码
  285. List<String> addrCodeList = new ArrayList<>();
  286. if ("province".equals(channelMapAceeptVo.getRankType())) {
  287. //省码
  288. for (String s : channelMapAceeptVo.getAddrCode()) {
  289. String substring = s.substring(0, 2);
  290. addrCodeList.add(substring);
  291. }
  292. } else if ("city".equals(channelMapAceeptVo.getRankType())) {
  293. //省的所有市
  294. for (String s : channelMapAceeptVo.getAddrCode()) {
  295. String substring = s.substring(0, 2);
  296. addrCodeList.add(substring);
  297. }
  298. } else if ("zone".equals(channelMapAceeptVo.getRankType())) {
  299. //市的所有区
  300. for (String s : channelMapAceeptVo.getAddrCode()) {
  301. String substring = s.substring(0, 4);
  302. addrCodeList.add(substring);
  303. }
  304. } else if ("district".equals(channelMapAceeptVo.getRankType())){
  305. //区的所有街道
  306. for (String s : channelMapAceeptVo.getAddrCode()) {
  307. String substring = s.substring(0, 6);
  308. addrCodeList.add(substring);
  309. }
  310. }
  311. queryWrapper.in("wd_type_code", channelMapAceeptVo.getChannel()).and(originWdInfoQueryWrapper -> {
  312. for (String s : addrCodeList) {
  313. originWdInfoQueryWrapper.likeRight("addr_code", s).or();
  314. }
  315. });
  316. //搜索字段
  317. if (channelMapAceeptVo.getSearchText() != null && !channelMapAceeptVo.getSearchText() .trim().equals("")) {
  318. queryWrapper.and(originWdInfoQueryWrapper -> {
  319. originWdInfoQueryWrapper.like("wd_name", channelMapAceeptVo.getSearchText() );
  320. });
  321. }
  322. //城市等级分类
  323. if(channelMapAceeptVo.getCityTier() != null && channelMapAceeptVo.getCityTier().length > 0){
  324. List<String> tierCode = new ArrayList<>();
  325. for (String s : channelMapAceeptVo.getCityTier()) {
  326. List<String> list = initMapUtil.getInitCityTierListMap(s);
  327. if (list != null){
  328. tierCode.addAll(list);
  329. }
  330. }
  331. queryWrapper.and(wdInfoQueryWrapper -> {
  332. for (String s : tierCode) {
  333. wdInfoQueryWrapper.likeRight("addr_code", s).or();
  334. }
  335. });
  336. }
  337. //排序字段查询
  338. if (channelMapAceeptVo.getOrderby() != null && !channelMapAceeptVo.getOrderby().trim().equals("")) {
  339. PageHelper.orderBy(channelMapAceeptVo.getOrderby());
  340. }
  341. }
  342. }