重点部分都做了注释,其他都是业务代码了
@SneakyThrows
@Override
public Map<String,Object> getTypeDetailByProdMainId(Long id) {
Map<String,Object> mapData = new ConcurrentHashMap();//要保证线程安全
CountDownLatch countDownLatch = new CountDownLatch(2);//计数
DecimalFormat df=new DecimalFormat("0.00");//设置保留位数
//市场占有率
List<Map<String, Object>> typeDetailByProdMainId = expertRatingMapper.getTypeDetailByProdMainId(id);
String ids = "";
for (Map map : typeDetailByProdMainId){
String idss = String.valueOf(map.get("id"));
ids = ids+","+idss;
}
ids = ids.replaceFirst(",","");
List<Map<String, Object>> sale = expertRatingMapper.getSale(ids);
Long pid = null;//id
int rank = 0;//排名
double sales = 0;//销售额
boolean bool = false;//是否有多条重复
for (int i = 0;i<sale.size(); i++){
String prod_main_id = String.valueOf(sale.get(i).get("prod_main_id"));
if(id.longValue() == Long.valueOf(prod_main_id).longValue()) {
//销售额
sales = Double.valueOf(String.valueOf(sale.get(i).get("sale")));
//过滤出相同销售额的数据,获得第一条的id
double finalSales = sales;
List<Map<String, Object>> sale1 = sale.stream().filter(s -> Double.valueOf(String.valueOf(s.get("sale"))) == finalSales).collect(Collectors.toList());
if(0<sale1.size()){
pid = Long.valueOf(String.valueOf(sale1.get(0).get("prod_main_id")));
bool = true;
}else{
rank = i -1;
}
break;//跳出循环,减少遍历次数
}
}
//存在相同销售额
if(bool){
int j = 0;
for (Map map : sale){
j++;
Long prodid = Long.valueOf(String.valueOf(map.get("prod_main_id")));
if(pid.longValue()==prodid.longValue()){
rank = j-1;
break;
}
}
}
//【1-(行业排名-1)/行业品牌数】*50
String format = df.format((1-(float)rank/sale.size())*50);
mapData.put("formatSale",format);
String finalIds = ids;
//---------------------------销售范围---------------
executorService.execute(()->{
List<Map<String,Object>> cityMap = expertRatingMapper.getCity(finalIds);
double cityVal;//城市比例
Long cityIds = null;//相同
boolean boolCity = false;
int rankCity = 0;
for (int c = 0;c<cityMap.size();c++){
Long cityId = Long.valueOf(String.valueOf(cityMap.get(c).get("prod_main_id")));
if(id.longValue()== cityId.longValue()){
cityVal = Double.valueOf(String.valueOf(cityMap.get(c).get("city")));
//过滤出相同城市占比的数据,获得第一条
double finalCityVal = cityVal;
List<Map<String,Object>> cityMap1 = cityMap.stream().filter(s->
Double.valueOf(String.valueOf(s.get("city")))== finalCityVal).collect(Collectors.toList());
if(0<cityMap1.size()){
cityIds = Long.valueOf(String.valueOf(cityMap1.get(0).get("prod_main_id")));
boolCity = true;
}else {
rankCity = c - 1;
}
break;
}
}
if(boolCity){
int ci = 0;
for (Map map : cityMap){
ci++;
Long citId = Long.valueOf(String.valueOf(map.get("prod_main_id")));
if(citId.longValue()==cityIds.longValue()){
rankCity = ci - 1;
break;
}
}
}
String forMatCity = df.format((1-(float)rankCity/cityMap.size())*40);
mapData.put("forMatCity",forMatCity);
countDownLatch.countDown();//-1
});
//---------------------------出口能力--------------------
executorService.execute(()->{
List<Map<String, Object>> export = expertRatingMapper.getExport(finalIds);
double proportion;//出口额
boolean bools = false;//出口额是否相同
Long proId = null;//相同
int rankExport = 0;
for(int f=0;f<export.size();f++){
Long prodId = Long.valueOf(String.valueOf(export.get(f).get("prod_main_id")));
if(id.longValue()==prodId.longValue()){
//获取近三年出口额
proportion = Double.valueOf(String.valueOf(export.get(f).get("proportion")));
//过滤出相同出口额的数据,获得第一条
double finalProportion = proportion;
List<Map<String, Object>> proportion1 = export.stream().filter(s -> Double.valueOf(String.valueOf(s.get("proportion"))) == finalProportion).collect(Collectors.toList());
if(0<proportion1.size()){
proId = Long.valueOf(String.valueOf(proportion1.get(0).get("prod_main_id")));
bools = true;
}else {
rankExport = f -1;
}
break;
}
}
if(bools){
int g = 0;
for (Map map : export){
g++;
Long proporId = Long.valueOf(String.valueOf(map.get("prod_main_id")));
if(proId.longValue()==proporId.longValue()){
rankExport = g - 1;
break;
}
}
}
String forMatExport = df.format((1-(float)rankExport/export.size())*40);
mapData.put("forMatExport",forMatExport);
countDownLatch.countDown();//-1
});
countDownLatch.await();
return mapData;
}