| | |
| | | Date date = new Date(); |
| | | BigDecimal cLatitude =new BigDecimal(0); |
| | | BigDecimal cLongitude =new BigDecimal(0); |
| | | |
| | | String location = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.COMPANY_LOCATION).getCode(); |
| | | try { |
| | | String[] ss = location.split(","); |
| | |
| | | cLatitude = new BigDecimal(ss[1]); |
| | | }catch (Exception e){ |
| | | } |
| | | int index =0; |
| | | for(JkCustomer c : customerList){ |
| | | try { |
| | | log.info("交通规划========"+c.getName()+"==========="+index++); |
| | | dealDistancePerCustomer(c,url,date,cLatitude,cLongitude,customerList); |
| | | }catch (Exception e){ |
| | | |
| | | } |
| | | int circle = customerList.size()/100;// |
| | | if(customerList.size()%100>0){ |
| | | circle +=1; |
| | | } |
| | | |
| | | boolean[] results = new boolean[circle] ; |
| | | for (int i = 0; i < circle; i++) { |
| | | final int start =i*100; |
| | | final int end = (i+1)*100 > customerList.size()? customerList.size(): (i+1)*100; |
| | | results[i] =false; |
| | | BigDecimal finalCLatitude = cLatitude; |
| | | BigDecimal finalCLongitude = cLongitude; |
| | | log.error("交通规划====线程circle:"+i+"====start:"+start+"===========end:"+end); |
| | | int finalI = i; |
| | | Thread t1=new Thread(() -> { |
| | | try { |
| | | int index =0; |
| | | for (int j = start; j < end; j++) { |
| | | try { |
| | | log.error("交通规划========"+customerList.get(j).getName()+"========cirle:"+finalI+"==="+index++); |
| | | dealDistancePerCustomer(customerList.get(j),url,date, finalCLatitude, finalCLongitude,customerList); |
| | | }catch (Exception e){ |
| | | |
| | | } |
| | | } |
| | | }catch (Exception e){ |
| | | }finally { |
| | | results[finalI] =true; |
| | | boolean isDone = false; |
| | | for(boolean t : results){ |
| | | isDone = isDone&&t; |
| | | } |
| | | if(isDone){ |
| | | cate.setStatus(Constants.ZERO); |
| | | categoryMapper.updateById(cate);//更新任务执行状态 |
| | | } |
| | | } |
| | | |
| | | }); |
| | | t1.start(); |
| | | } |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | }finally { |
| | | cate.setStatus(Constants.ZERO); |
| | | categoryMapper.updateById(cate);//更新任务执行状态 |
| | | |
| | | } |
| | | } |
| | | |
| | | private void dealDistancePerCustomer(JkCustomer c, String url, Date date, BigDecimal cLatitude, BigDecimal cLongitude, List<JkCustomer> customerList) { |
| | | private void dealDistancePerCustomer(JkCustomer c, String url, Date date, BigDecimal cLatitude, BigDecimal cLongitude, List<JkCustomer> customerList) throws InterruptedException { |
| | | List<JkCustomer> updateCustomerList = new ArrayList<>(); |
| | | List<JkCustomerNavigation> navigationList = new ArrayList<>(); |
| | | List<DistanceMapParam> tmpList = new ArrayList<>(); |
| | |
| | | t0.setId(-2);//表示返回园区 |
| | | t0.setDistance(Constants.formatLongNum(c.getStartDistance()) ); |
| | | if(Constants.formatLongNum(c.getStartDistance()) <= 0){ |
| | | //园区前往该客户的距离,如果之前未获取过 |
| | | //园区前往该客户的距离,如果之前未获取 |
| | | isNew = true; |
| | | JkCustomer start = new JkCustomer(); |
| | | start.setId(-1); |
| | | start.setLongitude(cLongitude); |
| | | start.setLatitude(cLatitude); |
| | | DistanceCustomerModel dm = DistanceCalculator.calculateDistanceGaode(url,start,c); |
| | | c.setStartDistance(dm.getDistance() ); |
| | | t0.setDistance(dm.getDistance()); |
| | | u.setStartDistance(dm.getDistance()); |
| | | if(dm.getLocations().size()>0){ |
| | | //如果有路径信息 |
| | | u.setStartSteps(dm.getPolyline()); |
| | | if(dm.getCode() == 1){ |
| | | //规划失败 |
| | | log.error("==============客户交通规划成功起点:"+c.getName()); |
| | | c.setStartDistance(dm.getDistance() ); |
| | | t0.setDistance(dm.getDistance()); |
| | | u.setStartDistance(dm.getDistance()); |
| | | if(dm.getLocations().size()>0){ |
| | | //如果有路径信息 |
| | | u.setStartSteps(dm.getPolyline()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | tmpList.add(t0); |
| | | for(JkCustomer cm : customerList){ |
| | | //客户和客户之间的距离信息 |
| | | Thread.sleep(500); |
| | | DistanceMapParam t = new DistanceMapParam(); |
| | | t.setId(cm.getId()); |
| | | DistanceMapParam param = getParamByCustomerIds( cm.getId(),distanceMapParamList); |
| | | if(param!=null){//如果之前已经获取过 |
| | | if(param!=null && param.getDistance()!=0){//如果之前已经获取过 |
| | | t = param; |
| | | }else{ |
| | | JkCustomerNavigation navigation = new JkCustomerNavigation(); |
| | |
| | | start.setId(-1); |
| | | start.setLongitude(cLongitude); |
| | | start.setLatitude(cLatitude); |
| | | |
| | | DistanceCustomerModel dm = DistanceCalculator.calculateDistanceGaode(url,c,start); |
| | | c.setEndDistance(dm.getDistance() ); |
| | | tt.setDistance(dm.getDistance()); |
| | | u.setEndDistance(dm.getDistance()); |
| | | if(dm.getLocations().size()>0){ |
| | | //如果有路径信息 |
| | | u.setEndSteps(dm.getPolyline()); |
| | | if(dm.getCode()== 1){ |
| | | //规划失败 |
| | | log.error("==============客户交通规划成功2:"+c.getName()); |
| | | c.setEndDistance(dm.getDistance() ); |
| | | tt.setDistance(dm.getDistance()); |
| | | u.setEndDistance(dm.getDistance()); |
| | | if(dm.getLocations().size()>0){ |
| | | //如果有路径信息 |
| | | u.setEndSteps(dm.getPolyline()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | tmpList.add(tt); |
| | | if(isNew){// |
| | |
| | | TspSolver.DataModel dataModel = new TspSolver.DataModel(); |
| | | int vehicleNumber1 = lineList.size();//线路数量 |
| | | long[] vehicleCapacities1=new long[lineList.size()];//每辆车的最大订单量限制 |
| | | long[] vehicleMaxNodes=new long[lineList.size()];//每辆车的最大订单量限制 |
| | | long[] demands1 = new long[customerList.size()+1]; //各个点的订单量 |
| | | long[][] distanceMatrix1 = new long[customerList.size()+1][customerList.size()+1]; |
| | | distanceMatrix1[0][0] = 0; |
| | |
| | | } |
| | | for (int i = 0; i < lineList.size(); i++) { |
| | | vehicleCapacities1[i] = lineList.get(i).getMaxOrder();//每辆车的最大订单量限制 |
| | | vehicleMaxNodes[i] =lineList.get(i).getMaxCustomer();//最大客户数 |
| | | } |
| | | //构造优化数据模型 |
| | | dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1); |
| | | dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1,vehicleMaxNodes); |
| | | TspSolver.startSearch(dataModel); |
| | | dealSearchSolution(model,dataModel); |
| | | }catch (Exception e){ |
| | |
| | | TspSolver.DataModel dataModel = new TspSolver.DataModel(); |
| | | int vehicleNumber1 = 1;//线路数量 |
| | | long[] vehicleCapacities1=new long[]{line.getMaxOrder()};//每辆车的最大订单量限制 |
| | | long[] vehicleMaxNodes=new long[]{line.getMaxCustomer()};//每辆车的最大订单量限制 |
| | | long[] demands1 = new long[customerListParam.size()+1]; //各个点的订单量 |
| | | long[][] distanceMatrix1 = new long[customerListParam.size()+1][customerListParam.size()+1]; |
| | | distanceMatrix1[0][0] = 0; |
| | |
| | | } |
| | | } |
| | | //构造优化数据模型 |
| | | dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1); |
| | | dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1,vehicleMaxNodes); |
| | | TspSolver.startSearch(dataModel); |
| | | if(dataModel.getSolutions()==null || dataModel.getSolutions().size()==0){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"线路【"+line.getLineName()+"】调整失败 ,未获得最优交通规划方案!"); |
| | |
| | | queryWrapper.eq(JkSketch::getSortnum, pageWrap.getModel().getSortnum()); |
| | | } |
| | | if (pageWrap.getModel().getDateInfo() != null) { |
| | | queryWrapper.eq(JkSketch::getDateInfo, pageWrap.getModel().getDateInfo()); |
| | | queryWrapper.like(JkSketch::getDateInfo, DateUtil.dateToString(pageWrap.getModel().getDateInfo(),"yyyy-MM-dd")); |
| | | } |
| | | if (pageWrap.getModel().getJobId() != null) { |
| | | queryWrapper.eq(JkSketch::getJobId, pageWrap.getModel().getJobId()); |
| | |
| | | .leftJoin(JkLine.class,JkLine::getId,JkSketchLine::getLineId) |
| | | .leftJoin(Category.class,Category::getId,JkLine::getCategoryId ) |
| | | .leftJoin(Cars.class,Cars::getId,JkLine::getCarId) |
| | | .eq(JkSketch::getIsdeleted,Constants.ZERO) |
| | | .and(StringUtils.isNotBlank(telecomLineInfoDTO.getSearchInfo()),i->i.like(Cars::getCode,telecomLineInfoDTO.getSearchInfo()).or().like(JkLine::getName,telecomLineInfoDTO.getSearchInfo())) |
| | | .eq(StringUtils.isNotBlank(telecomLineInfoDTO.getDateInfo()),JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()) |
| | | .like(StringUtils.isNotBlank(telecomLineInfoDTO.getDateInfo()),JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()) |
| | | .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkLine::getCategoryId, telecomLineInfoDTO.getCategoryId()) |
| | | .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkLine::getId, telecomLineInfoDTO.getLineId()); |
| | | |
| | |
| | | telecomLineCountVO.setCustomerNum(Constants.ZERO); |
| | | MPJLambdaWrapper<JkSketch> sketchMPJLambdaWrapper = new MPJLambdaWrapper<JkSketch>().selectAll(JkSketch.class ) |
| | | .selectAs(Category::getName,JkSketch::getCategoryName) |
| | | .select(" ifnull((select count(1) from jk_sketch_customer jc where jc.ISDELETED= 0 and jc.SKETCH_ID = t.id),0)" ,JkSketch::getCustomerNum) |
| | | .select(" ifnull((select count(1) from jk_sketch_customer jc where jc.ISDELETED = 0 and jc.SKETCH_ID = t.id),0)" ,JkSketch::getCustomerNum) |
| | | .select(" ifnull((select count(1) from jk_sketch_line jc where jc.TYPE = 0 and jc.SKETCH_ID = t.id),0)" ,JkSketch::getBeforeLineNum) |
| | | .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId ) |
| | | .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()); |
| | | .eq(JkSketch::getIsdeleted,Constants.ZERO) |
| | | .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()); |
| | | List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper); |
| | | if(CollectionUtils.isEmpty(sketchList)){ |
| | | return telecomLineCountVO; |
| | |
| | | TelecomCategoryDataVO telecomCategoryDataVO = new TelecomCategoryDataVO(); |
| | | telecomCategoryDataVO.setId(jkSketch.getCategoryId()); |
| | | telecomCategoryDataVO.setName(jkSketch.getCategoryName()); |
| | | telecomCategoryDataVO.setCustomerNum(jkSketch.getCustomerNum()); |
| | | telecomCategoryDataVO.setCustomerNum(Constants.ZERO); |
| | | List<JkSketchLine> childLineList = jkSketchLineList.stream().filter(i->Constants.equalsInteger(i.getSketchId(),jkSketch.getId())).collect(Collectors.toList()); |
| | | //优化前数据 |
| | | List<JkSketchLine> beforeList = childLineList.stream() |
| | | List<JkSketchLine> beforeList = jkSketchLineList.stream() |
| | | .filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()); |
| | | //优化后数据 |
| | | List<JkSketchLine> afterList = childLineList.stream() |
| | |
| | | lineNum = lineNum + (Constants.equalsInteger(jkSketch.getOptStatus(),Constants.ZERO)?beforeList.size():afterList.size()); |
| | | List<TelecomLineDataVO> telecomLineDataVOList = new ArrayList<>(); |
| | | for (JkSketchLine sketchLine: Constants.equalsInteger(jkSketch.getOptStatus(),Constants.ZERO)?beforeList:afterList) { |
| | | // JkSketchLine finalSketchLine = sketchLine; |
| | | // List<JkSketchLine> afterSelectList = afterList.stream().filter(i->Constants.equalsInteger(i.getLineId(), finalSketchLine.getLineId())).collect(Collectors.toList()); |
| | | // if(afterSelectList.size()>Constants.ZERO){ |
| | | // sketchLine = afterSelectList.get(Constants.ZERO); |
| | | // } |
| | | TelecomLineDataVO telecomLineDataVO = new TelecomLineDataVO(); |
| | | telecomLineDataVO.setId(sketchLine.getId()); |
| | | telecomLineDataVO.setName(sketchLine.getLineName()); |
| | | telecomLineDataVOList.add(telecomLineDataVO); |
| | | telecomCategoryDataVO.setCustomerNum(telecomCategoryDataVO.getCustomerNum() + sketchLine.getMaxCustomer()); |
| | | telecomLineCountVO.setCustomerNum( |
| | | telecomLineCountVO.getCustomerNum() + sketchLine.getMaxCustomer() |
| | | ); |
| | |
| | | MPJLambdaWrapper<JkSketch> sketchMPJLambdaWrapper = new MPJLambdaWrapper<JkSketch>().selectAll(JkSketch.class ) |
| | | .selectAs(Category::getName,JkSketch::getCategoryName) |
| | | .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId ) |
| | | .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()); |
| | | .eq(JkSketch::getIsdeleted,Constants.ZERO) |
| | | .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()); |
| | | List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper); |
| | | if(CollectionUtils.isEmpty(sketchList)){ |
| | | return new ArrayList<TelecomCategoryDataVO>(); |
| | |
| | | .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkSketchLine::getCategoryId,telecomLineInfoDTO.getCategoryId()) |
| | | .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkSketchLine::getLineId,telecomLineInfoDTO.getLineId()) |
| | | .apply(" ( t.TYPE = t1.OPT_STATUS ) ") |
| | | .eq(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()); |
| | | .like(JkSketch::getDateInfo, telecomLineInfoDTO.getDateInfo()); |
| | | List<JkSketchLine> returnLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper); |
| | | |
| | | // //优化前数据 |