你吃橘子了么你? 图片 定时任务框架太多了,选个简单高可用的以为就安心用就完了,结果哈,最先发现这个问题是去

举报
赵KK日常技术记录 发表于 2023/06/30 23:52:02 2023/06/30
【摘要】 需求分析在现有地点中解析其地点优先级,最小到区县,当前区县可指定作业优先级,当绑定优先级数据后的数据应在选择时优先展示。行政优先级维护采用百度地图数据行政区域编码维护,考虑到现有数据是人工维护,获取其省市区县可能不准确,所以先根据其经纬度定位后可准确获取其省市区县,然后再进行编码维护。示例地点北京市东城区天安门,百度坐标116.403963,39.915119API:https://lbsy...

需求分析
在现有地点中解析其地点优先级,最小到区县,当前区县可指定作业优先级,当绑定优先级数据后的数据应在选择时优先展示。

行政优先级维护
采用百度地图数据行政区域编码维护,考虑到现有数据是人工维护,获取其省市区县可能不准确,所以先根据其经纬度定位后可准确获取其省市区县,然后再进行编码维护。

示例
地点北京市东城区天安门,百度坐标116.403963,39.915119

API:
https://lbsyun.baidu.com/index.php?title=webapi/district-search
https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

Map<String, String> map = IbsBMapUtils.reverseGeocoding(“116.403963”, “39.915119”);
String province = map.get(“province”);

List<IbsBMapUtils.Districts> districts = IbsBMapUtils.regionSearch(province.substring(0, 2));
for (IbsBMapUtils.Districts district : districts) {
DivisionDo divisionDo = new DivisionDo();
divisionDo.setProvinceCode(district.getCode());
divisionDo.setProvinceName(district.getName());
divisionDo.setWarehouseCode(locationConfigDO.getWarehouseCode());
List<IbsBMapUtils.Districts> districtsList = district.getDistricts();
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(districtsList)) {
for (IbsBMapUtils.Districts districts2 : districtsList) {
divisionDo.setCityCode(districts2.getCode());
divisionDo.setCityName(districts2.getName());
List<IbsBMapUtils.Districts> districts3 = districts2.getDistricts();
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(districts3)) {
for (IbsBMapUtils.Districts district3 : districts3) {
divisionDo.setRegionName(district3.getName());
divisionDo.setRegionCode(district3.getCode());
divisionRepository.insert(divisionDo);
}
} else {
divisionRepository.insert(divisionDo);
}
}
} else {
divisionRepository.insert(divisionDo);
}
}

当前区域指定优先级作业后数据优先展示
例如北京市有N个区,指定了N个规划路线,当东城区指定了由最近的骑手配送时,则点击东城区商家的配送线路优先展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

List<MunicipalLevel> list = MunicipalLevelMapper.selectMunicipalLevelList(“北京市-东城区”);

   if(CollectionUtils.isEmpty(list)){
       return Collections.emptyList();
   } else {
List<String> riderList = divisionMapper.getRiderByProvince("11001", "北京市","东城区");
           //错误实例
		if (CollectionUtils.isNotEmpty(riderList)) {
               for (String riderName : riderList) {
                   List<RirderListResponse> listResponses = list.stream().filter(vo -> StringUtils.isNotEmpty(vo.getRirderName()) && vo.getRiderName().equals(riderName)).collect(Collectors.toList());
                   if (CollectionUtils.isNotEmpty(listResponses)) {
                       for (int i = 0; i < listResponses.size(); i++) {
                           RirderListResponse response = listResponses.get(i);
                           final List l = list;
                           l.set(i, l.set(j, l.get(i)));
                       }
                   }
               }
           }

   }
   log.warn("响应{}", JSONObject.toJSONString(list));

bug修复
当前查询出东城区绑定优先级为1.2.3.4时,查询出来的顺序更新索引位置会变为4.3.2.1,且考虑到list会多个且可重复重新更改代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List<MunicipalLevel> list = MunicipalLevelMapper.selectMunicipalLevelList(“北京市-东城区”);

   if(CollectionUtils.isEmpty(list)){
       return Collections.emptyList();
   } else {
          List<String> riderList = divisionMapper.getRiderByProvince("11001", "北京市","东城区");
           riderList = riderList.stream().filter(item -> responseList.stream().map(RouteListResponse::getName).collect(Collectors.toList()).contains(item)).collect(Collectors.toList());
           Collections.reverse(riderList);
               Collections.reverse(riderList);
               for (int i = 0; i < riderList.size(); i++) {
                   for (MunicipalLevel res : list) {
                       if(res.getName().equals(riderList.get(i))){
                           Collections.swap(list, list.indexOf(res), i);
                       }
                   }
               }
           }
   }         

bug再次修复终极版
当存在多个优先级相同的区域路线时,会因为本身在list的位置不同,导致最后只有第一个正确,其他元素位置不正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

if(CollectionUtils.isEmpty(list)){
return Collections.emptyList();
} else {
// List<String> riderList = divisionMapper.getRiderByProvince(“11001”, “北京市”,“东城区”);
//riderList = riderList.stream().filter(item -> responseList.stream().map(RouteListResponse::getName).collect(Collectors.toList()).contains(item)).collect(Collectors.toList());
//Collections.reverse(riderList);
//借助外部元素记录交换元素位置
if (CollectionUtils.isNotEmpty(supplierList)) {
int a = 0 ;
for (int i = 0; i < riderList.size(); i++) {
for (MunicipalLevel res : list) {
if(res.getName().equals(riderList.get(i))){
Collections.swap(list, list.indexOf(res), i);
a++;
}
}
}
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。