| package com.doumee.service.business.impl; | 
|   | 
| import cn.hutool.core.bean.BeanUtil; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.alibaba.fastjson.TypeReference; | 
| import com.doumee.biz.system.SystemDictDataBiz; | 
| import com.doumee.core.annotation.excel.ExcelImporter; | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import com.doumee.core.tsp.*; | 
| import com.doumee.core.utils.*; | 
| import com.doumee.core.wms.model.response.WmsBaseDataResponse; | 
| import com.doumee.core.wms.model.response.WmsBaseResponse; | 
| import com.doumee.dao.admin.request.JkOrdersImport; | 
| import com.doumee.dao.business.*; | 
| import com.doumee.dao.business.dto.TelecomLineInfoDTO; | 
| import com.doumee.dao.business.model.*; | 
| import com.doumee.dao.business.vo.TelecomCategoryDataVO; | 
| import com.doumee.dao.business.vo.TelecomJkLineListVO; | 
| import com.doumee.dao.business.vo.TelecomLineCountVO; | 
| import com.doumee.dao.business.vo.TelecomLineDataVO; | 
| import com.doumee.service.business.third.model.LoginUserInfo; | 
| import com.doumee.service.business.third.model.PageData; | 
| import com.doumee.service.business.third.model.PageWrap; | 
| import com.doumee.service.business.JkSketchService; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| import com.github.yulichang.wrapper.MPJLambdaWrapper; | 
| import lombok.extern.slf4j.Slf4j; | 
| import netscape.javascript.JSObject; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.data.redis.core.RedisTemplate; | 
| import org.springframework.scheduling.annotation.Async; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
| import org.springframework.util.CollectionUtils; | 
| import org.springframework.web.multipart.MultipartFile; | 
|   | 
| import javax.annotation.PostConstruct; | 
| import java.math.BigDecimal; | 
| import java.util.*; | 
| import java.util.Date; | 
| import java.util.concurrent.TimeUnit; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * 交控-线路优化记录信息表Service实现 | 
|  * @author 江蹄蹄 | 
|  * @date 2025/09/28 09:01 | 
|  */ | 
| @Service | 
| @Slf4j | 
| public class JkSketchServiceImpl implements JkSketchService { | 
|   | 
|     @Autowired | 
|     private JkSketchMapper jkSketchMapper; | 
|     @Autowired | 
|     private CategoryMapper categoryMapper; | 
|     @Autowired | 
|     private JkSketchLineMapper jkSketchLineMapper; | 
|     @Autowired | 
|     private JkSketchCustomerMapper jkSketchCustomerMapper; | 
|     @Autowired | 
|     private JkCustomerMapper jkCustomerMapper; | 
|     @Autowired | 
|     private JkCustomerNavigationMapper jkCustomerNavigationMapper; | 
|     @Autowired | 
|     private JkLineMapper jkLineMapper; | 
|   | 
|     @Autowired | 
|     private SystemDictDataBiz systemDictDataBiz; | 
|     @Autowired | 
|     private JkOrdersMapper jkOrdersMapper; | 
|   | 
|     @Autowired | 
|     private RedisTemplate<String, Object> redisTemplate; | 
|   | 
|     @Override | 
|     public Integer create(JkSketch jkSketch) { | 
|         jkSketchMapper.insert(jkSketch); | 
|         return jkSketch.getId(); | 
|     } | 
|     @Override | 
|     public void deleteById(Integer id) { | 
|         jkSketchMapper.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public void delete(JkSketch jkSketch) { | 
|         UpdateWrapper<JkSketch> deleteWrapper = new UpdateWrapper<>(jkSketch); | 
|         jkSketchMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     @PostConstruct | 
|     public void initAyncsJob() { | 
|         //重置交通规划和线路规划的异步任务状态 | 
|         jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda() | 
|                 .set(JkSketch::getStatus,Constants.THREE) | 
|                 .eq(JkSketch::getIsdeleted,Constants.ZERO) | 
|                 .eq(JkSketch::getStatus,Constants.ONE)); | 
|         categoryMapper.update(null,new UpdateWrapper<Category>().lambda() | 
|                 .set(Category::getStatus,Constants.ZERO) | 
|                 .eq(Category::getType,Constants.FOUR) | 
|                 .eq(Category::getIsdeleted,Constants.ZERO) | 
|                 .eq(Category::getStatus,Constants.TWO)); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<Integer> ids) { | 
|         if (CollectionUtils.isEmpty(ids)) { | 
|             return; | 
|         } | 
|         jkSketchMapper.deleteBatchIds(ids); | 
|     } | 
|     //线路优化 | 
|     @Override | 
|     public JkSketch updateById(JkSketch jkSketch ) { | 
|         JkSketch model = jkSketchMapper.selectById(jkSketch.getId()); | 
|         if(model == null ||Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){ | 
|             throw  new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|         if( model.getDateInfo() ==  null){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路日期信息不正确,不支持优化!"); | 
|         } | 
|         if(Constants.equalsInteger(Constants.ZERO,jkSketch.getForceUpdate()) && Constants.equalsInteger(model.getStatus(),Constants.ONE)){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路存在正在优化中,请耐心等待优化完成或者选择强制优化操作!"); | 
|         } | 
|   | 
|         if(  jkSketch.getLineIdList() ==null || jkSketch.getLineIdList().size()==0 ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请选择有效合理的线路进行优化操作!"); | 
|         } | 
|         //当前所有线路(符合条件的线路) | 
|         List<JkLine> lineList =  jkLineMapper.selectJoinList(JkLine.class,new MPJLambdaWrapper<JkLine>() | 
|                 .selectAll(JkLine.class) | 
|                 .eq(JkLine::getWeeks,DateUtil.getWeekZhouOfDate(model.getDateInfo()))//只能选择当前的线路 | 
|                 .eq(JkLine::getIsdeleted,Constants.ZERO) | 
|                 .in(JkLine::getId,jkSketch.getLineIdList()) | 
|         ); | 
|         Integer totalCus = 0,totalNum =0; | 
|         for(JkLine line :lineList){ | 
|             totalCus += Constants.formatIntegerNum(line.getMaxCustomer());//总客户量 | 
|             totalNum += Constants.formatIntegerNum(line.getMaxOrder());//总送货量 | 
|         } | 
|         if( totalCus < Constants.formatIntegerNum(model.getOrderNum())  ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"该线路订单客户数量超过了线路总客户量限制,无法进行优化!"); | 
|         } | 
|         if( totalNum < Constants.formatBigdecimal(model.getTotalNum()).doubleValue()){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"该线路订单送货量超过了线路总送货量限制,无法进行优化!"); | 
|         } | 
|         model.setLineList(lineList);//线路集合 | 
|         model.setCustomerList(checkJketchCustomerLocation(model,false));//订单集合 | 
|         model.setStatus(Constants.ONE); | 
|         model.setPlanLineNum(lineList.size()); | 
|         model.setEditDate(new Date()); | 
|         model.setEditor(jkSketch.getLoginUserInfo().getId()); | 
|         model.setPlanLineDate(model.getEditDate()); | 
|         model.setPlanLineUserId(jkSketch.getLoginUserInfo().getId()); | 
|         model.setJobId(UUID.randomUUID().toString()); | 
|         redisTemplate.opsForValue().set(Constants.RedisKeys.JKLINE_JOB+model.getJobId(),true );//做异步处理 | 
|         jkSketchMapper.updateById(model); | 
|         return model; | 
|     } | 
|   | 
|     @Override | 
|     public  JkSketch updateSketchLine(JkSketch jkSketch) { | 
|         JkSketch model = jkSketchMapper.selectById(jkSketch.getId()); | 
|         if(model == null ||Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){ | 
|             throw  new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|         if(  jkSketch.getSketchLineList() ==null || jkSketch.getSketchLineList().size()==0 ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请按要求调整优化方案!"); | 
|         } | 
|         if(Constants.equalsInteger(model.getStatus(),Constants.ONE)){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前线路正存在优化任务,请耐心等待优化完成再进行该调整操作!"); | 
|         } | 
|   | 
|         //当前所有线路(符合条件的线路) | 
|         List<JkSketchLine> lineList =  jkSketchLineMapper.selectJoinList(JkSketchLine.class,new MPJLambdaWrapper<JkSketchLine>() | 
|                 .selectAll(JkSketchLine.class ) | 
|                 .selectAs(JkLine::getName,JkSketchLine::getLineName) | 
|                 .selectAs(JkLine::getMaxOrder,JkSketchLine::getMaxOrder) | 
|                 .selectAs(JkLine::getMaxCustomer,JkSketchLine::getMaxCustomer) | 
|                 .leftJoin(JkLine.class,JkLine::getId,JkOrders::getLineId ) | 
|                 .eq(JkSketchLine::getSketchId,jkSketch.getId()) | 
|                 .eq(JkSketchLine::getType, Constants.formatIntegerNum(model.getOptStatus())) | 
|                 .eq(JkSketchLine::getIsdeleted,Constants.ZERO)); | 
|         if(lineList ==null ||lineList.size() ==0){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前线路不满足优化方案调整条件!"); | 
|         } | 
|         for(JkSketchLine line :lineList){ | 
|             JkSketchLine lineParam =getLineParamById(line.getId(),jkSketch.getSketchLineList()); | 
|             if(lineParam == null){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请基于现有线路进行方案调整,线路【"+line.getLineName()+"】线路配置不正确!"); | 
|             } | 
|             if(lineParam.getCustomerList() == null || lineParam.getCustomerList().size() == 0 ){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请基于现有线路进行方案调整,线路【"+line.getLineName()+"】客户信息不能为空!"); | 
|             } | 
|             Integer totalCus = 0; | 
|             BigDecimal totalNum =new BigDecimal(0); | 
|             for(JkSketchCustomer customer :lineParam.getCustomerList()){ | 
|                  totalCus += 1;//总客户量 | 
|                  totalNum = totalNum.add(Constants.formatBigdecimal(customer.getTotalNum()));//总送货量 | 
|                  customer.setSketchLineId(line.getId()); | 
|             } | 
|             if( totalCus > Constants.formatIntegerNum(line.getMaxCustomer()) ){ | 
|                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"线路【"+line.getLineName()+"】线路订单客户数量超过了线路总客户量限制,无法进行调整!"); | 
|             } | 
|             if( totalNum.doubleValue() > Constants.formatIntegerNum(line.getMaxOrder())){ | 
|                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"线路【"+line.getLineName()+"】订单送货量超过了线路总送货量限制,无法进行调整!"); | 
|             } | 
|             lineParam.setTotalNum(totalNum); | 
|             lineParam.setOrderNum(totalCus); | 
|         } | 
|         model.setSketchLineList(jkSketch.getSketchLineList());//线路信息 | 
|         model.setStatus(Constants.ONE); | 
|         model.setEditDate(new Date()); | 
|         model.setEditor(jkSketch.getLoginUserInfo().getId()); | 
|         model.setPlanLineDate(model.getEditDate()); | 
|         model.setPlanLineUserId(jkSketch.getLoginUserInfo().getId()); | 
|         model.setJobId(UUID.randomUUID().toString()); | 
|         redisTemplate.opsForValue().set(Constants.RedisKeys.JKLINE_JOB+model.getJobId(),true );//做异步处理 | 
|         jkSketchMapper.updateById(model); | 
|         return model; | 
|     } | 
|   | 
|     private JkSketchLine getLineParamById(Integer id, List<JkSketchLine> sketchLineList) { | 
|         for(JkSketchLine line: sketchLineList){ | 
|             if(Constants.equalsInteger(line.getId(),id)){ | 
|                 return line; | 
|             } | 
|         } | 
|         return  null; | 
|     } | 
|   | 
|     @Override | 
|     public JkSketch initOriginDistance(JkSketch jkSketch ) { | 
|         JkSketch model = jkSketchMapper.selectById(jkSketch.getId()); | 
|         if(model == null ||Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){ | 
|             throw  new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|         if(!Constants.equalsInteger(model.getStatus(),Constants.ZERO) ){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路已被优化,已无法计算原始路线路程数"); | 
|         } | 
|         checkJketchCustomerLocation(model,true); | 
|         model.setEditDate(new Date()); | 
|         model.setDistance(model.getOriginDistance()); | 
|         jkSketchMapper.updateById(model); | 
|         return model; | 
|     } | 
|   | 
|     @Override | 
|     @Async | 
|     public  void distanceCustomer( Category cate) { | 
|         try { | 
|             List<JkCustomer> customerList = cate.getCustomerList(); | 
|             String url = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.GAODE_DISTANCE_GEOAPI_URL).getCode(); | 
|             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(","); | 
|                 cLongitude = new BigDecimal(ss[0]); | 
|                 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){ | 
|   | 
|                 } | 
|             } | 
|   | 
|         }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) { | 
|         List<JkCustomer> updateCustomerList = new ArrayList<>(); | 
|         List<JkCustomerNavigation> navigationList = new ArrayList<>(); | 
|         List<DistanceMapParam> tmpList = new ArrayList<>(); | 
|         List<DistanceMapParam> distanceMapParamList  = getListFromJsonStr(c.getDistance()); | 
|         boolean isNew = false; | 
|         JkCustomer u =new JkCustomer(); | 
|         DistanceMapParam t0 = new DistanceMapParam(); | 
|         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()); | 
|             } | 
|         } | 
|         tmpList.add(t0); | 
|         for(JkCustomer cm : customerList){ | 
|             //客户和客户之间的距离信息 | 
|             DistanceMapParam t = new DistanceMapParam(); | 
|             t.setId(cm.getId()); | 
|             DistanceMapParam param = getParamByCustomerIds( cm.getId(),distanceMapParamList); | 
|             if(param!=null){//如果之前已经获取过 | 
|                 t = param; | 
|             }else{ | 
|                 JkCustomerNavigation navigation = new JkCustomerNavigation(); | 
|                 navigation.setStartId(c.getId()); | 
|                 navigation.setEndId(cm.getId()); | 
|                 navigation.setIsdeleted(Constants.ZERO); | 
|                 navigation.setCreateDate(date); | 
|                 navigation.setEditDate(date); | 
|                 navigation.setEndLatitude(cm.getLatitude()); | 
|                 navigation.setEndLogitude(cm.getLongitude()); | 
|                 navigation.setStartLatitude(c.getLatitude()); | 
|                 navigation.setStartLogitude(c.getLongitude()); | 
|                 isNew = true; | 
|                 if(Constants.equalsInteger(c.getId(),cm.getId())){ | 
|                     t.setDistance(0l); | 
|                 }else{ | 
|                     DistanceCustomerModel dm = DistanceCalculator.calculateDistanceGaode(url,c,cm); | 
|                     t.setDistance(dm.getDistance() ); | 
|                     if(dm.getLocations().size()>0){ | 
|                         //如果有路径信息 | 
|                         navigation.setSteps(dm.getPolyline()); | 
|                     } | 
|                 } | 
|                 navigation.setIdIndex(c.getId()+"-"+cm.getId()); | 
|                 navigation.setDistance(t.getDistance()); | 
|                 navigationList.add(navigation); | 
|             } | 
|             tmpList.add(t); | 
|         } | 
|         DistanceMapParam tt = new DistanceMapParam(); | 
|         tt.setId(-2);//表示返回园区 | 
|         tt.setDistance(Constants.formatLongNum(c.getEndDistance())); | 
|         if(Constants.formatLongNum(c.getEndDistance()) <= 0){ | 
|             //该客户返回园区的距离 ,如果之前未获取过 | 
|             isNew = true; | 
|             JkCustomer start = new JkCustomer(); | 
|             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()); | 
|             } | 
|         } | 
|         tmpList.add(tt); | 
|         if(isNew){// | 
|             u.setDistanceStatus(Constants.ONE); | 
|             u.setId(c.getId()); | 
|             u.setDistance(JSONObject.toJSONString(tmpList)); | 
|             updateCustomerList.add(u); | 
|         } | 
|         if(updateCustomerList.size()>0){ | 
|             for(JkCustomer c1 : updateCustomerList){ | 
|                 jkCustomerMapper.updateById(c1);//更新客户与其他点之间的距离 | 
|             } | 
|         } | 
|         if(navigationList.size()>0){ | 
|             jkCustomerNavigationMapper.delete(new UpdateWrapper<JkCustomerNavigation>().lambda() | 
|                     .eq(JkCustomerNavigation::getStartId,c.getId()));//删除历史数据 | 
|             jkCustomerNavigationMapper.insert(navigationList);//插入最新数据 | 
|         } | 
|     } | 
|   | 
|     private  List<JkCustomer>  checkNeedDistanceDo( List<JkCustomer> customerList) { | 
|         if(customerList==null || customerList.size()==0){ | 
|             return null; | 
|         } | 
|         boolean need = false; | 
|         List<JkCustomer> list = new ArrayList<>(); | 
|         for(JkCustomer jk : customerList){ | 
|             if(Constants.equalsInteger(jk.getDistanceStatus(),Constants.ZERO)){ | 
|                 need = true; | 
|                 list.add(jk); | 
|             } | 
|         } | 
|         if(!need){//如果无需进行处理 | 
|             return null; | 
|         } | 
|         return  list; | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public  Category checkDataValid(JkSketch model) { | 
|         if(model.getCategoryId() == null){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         MPJLambdaWrapper<Category> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.selectAll(Category.class ) | 
|                 .eq(Category::getIsdeleted,Constants.ZERO) | 
|                 .eq(Category::getType,Constants.FOUR) | 
|                 .eq(Category::getId,model.getCategoryId() ); | 
|         Category c = categoryMapper.selectJoinOne(Category.class,queryWrapper); | 
|         if(c==null){ | 
|             throw  new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|         if(Constants.equalsInteger(c.getStatus(),Constants.TWO)){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该主线正在进行客户距离计算任务,请耐心等待任务完成!"); | 
|         } | 
|   | 
|         MPJLambdaWrapper<JkCustomer> queryWrapper1 = new MPJLambdaWrapper<>(); | 
|         queryWrapper1.selectAll(JkCustomer.class ) | 
|                 .leftJoin(JkLine.class,JkLine::getId,JkCustomer::getLineId) | 
|                 .eq(JkCustomer::getIsdeleted,Constants.ZERO) | 
|                 .eq(JkLine::getCategoryId,model.getCategoryId() ); | 
|         List<JkCustomer> customerList = jkCustomerMapper.selectJoinList(JkCustomer.class,queryWrapper1); | 
|         List<JkCustomer> needList =checkNeedDistanceDo(customerList); | 
|         if(needList == null || needList.size() == 0){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该主线下无需要进行距离计算的客户信息!"); | 
|         } | 
|         String errorMsg =""; | 
|         for(JkCustomer c1 : customerList){ | 
|             if(c1.getLatitude()==null || c1.getLongitude() ==null || Constants.equalsInteger(c1.getDistanceStatus(),Constants.TWO)){ | 
|                 errorMsg += c.getName()+"-"+c.getName()+" | "; | 
|             } | 
|         } | 
|         if(StringUtils.isNotBlank(errorMsg)){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户:【"+errorMsg+"】定位信息不完整,不满足距离计算条件!"); | 
|         } | 
|         c.setStatus(Constants.TWO); | 
|         categoryMapper.updateById(c);//更新任务执行状态 | 
|         c.setCustomerList(customerList); | 
|         return  c; | 
|     } | 
|   | 
|     /** | 
|      * 开始异步执行线路优化任务 | 
|      * @param model | 
|      */ | 
|     @Override | 
|     @Async | 
|     public void startUpdateLineAsync(JkSketch model) { | 
|         try { | 
|             List<JkSketchCustomer> customerList = model.getCustomerList(); | 
|             List<JkLine> lineList = model.getLineList(); | 
|             TspSolver.DataModel dataModel = new TspSolver.DataModel(); | 
|             int vehicleNumber1 = lineList.size();//线路数量 | 
|             long[] vehicleCapacities1=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; | 
|             demands1[0] =0;//原点 | 
|             for (int i = 0; i < customerList.size(); i++) { | 
|                 List<DistanceMapParam>  disList =  customerList.get(i).getDistanceMapParamList(); | 
|                 distanceMatrix1[0][i+1] =  disList.get(0).getDistance(); | 
|                 distanceMatrix1[i+1][0] = disList.get(disList.size() -1).getDistance(); | 
|                 demands1[i+1] = Constants.formatBigdecimal( customerList.get(i).getTotalNum()).longValue();  //各个点的订单量 | 
|                 for (int j = 0; j < customerList.size(); j++) { | 
|                     distanceMatrix1[i+1][j+1] =disList.get(j+1).getDistance() ; | 
|                 } | 
|                /* for (int j = 0; j< disList.size()-2; j++) { | 
|                     if(j+1 >=10){ | 
|                         break; | 
|                     } | 
|                     if(disList.size()>j+1){ | 
|                         distanceMatrix1[i+1][j+1]  = disList.get(j+1).getDistance()/1000;//构造距离矩阵 | 
|                     }else{ | 
|                         distanceMatrix1[i+1][j+1]  = 1l; | 
|                     } | 
|                 }*/ | 
|             } | 
|             for (int i = 0; i < lineList.size(); i++) { | 
|                 vehicleCapacities1[i] = lineList.get(i).getMaxOrder();//每辆车的最大订单量限制 | 
|             } | 
|             //构造优化数据模型 | 
|             dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1); | 
|             TspSolver.startSearch(dataModel); | 
|             dealSearchSolution(model,dataModel); | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda() | 
|                     .eq(JkSketch::getId,model.getId() ) | 
|                     .eq(JkSketch::getJobId,model.getJobId() ) | 
|                     .set(JkSketch::getPlanLineInfo,"最近一次线路优化失败!") | 
|                     .set(JkSketch::getStatus,Constants.THREE) | 
|                     .set(JkSketch::getPlanLineEndDate,new Date())); | 
|         } | 
|     } | 
|     @Override | 
|     @Async | 
|     public  void startInitOriginDistanceBatch( JkSketch  model) { | 
|                 initOriginDistance(model); | 
|     } | 
|     @Override | 
|     @Async | 
|     public  void startEditSketchLineAsync(JkSketch model) { | 
|         boolean success = true; | 
|         int totalDistance = 0; | 
|         List<JkSketchLine> lineList = model.getSketchLineList(); | 
|         try { | 
|             MPJLambdaWrapper<JkSketchCustomer> queryWrapper = new MPJLambdaWrapper<>(); | 
|             queryWrapper.selectAll(JkSketchCustomer.class ) | 
|                     .selectAs(JkCustomer::getName,JkSketchCustomer::getName) | 
|                     .selectAs(JkCustomer::getCode,JkSketchCustomer::getCode) | 
|                     .selectAs(JkCustomer::getDistance,JkSketchCustomer::getDistanceJson) | 
|                     .selectAs(JkCustomer::getLongitude,JkSketchCustomer::getLongitude) | 
|                     .selectAs(JkCustomer::getLatitude,JkSketchCustomer::getLatitude) | 
|                     .selectAs(JkCustomer::getStartDistance,JkSketchCustomer::getStartDistance) | 
|                     .selectAs(JkCustomer::getEndDistance,JkSketchCustomer::getEndDistance) | 
|                     .leftJoin(JkCustomer.class,JkCustomer::getId,JkSketchCustomer::getCustomerId ) | 
|                     .eq(JkSketchCustomer::getType, Constants.equalsInteger(model.getOptStatus(),Constants.ONE)?1:0) | 
|                     .eq(JkSketchCustomer::getSketchId, model.getId()) | 
|                     .eq(JkSketchCustomer::getIsdeleted,Constants.ZERO) | 
|                     .orderByAsc(JkSketchCustomer::getSortnum); | 
|             List<JkSketchCustomer> customerList = jkSketchCustomerMapper.selectJoinList(JkSketchCustomer.class,queryWrapper); | 
|             if(customerList == null ||customerList.size() ==0){ | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户信息为空,不满足优化条件!"); | 
|             } | 
|   | 
|             int totalNum = 0; | 
|             for(JkSketchLine line : lineList){ | 
|                 //完善线路客户优化参数 | 
|                 List<JkSketchCustomer> customerListParam =  line.getCustomerList() ; | 
|                 if(customerListParam ==null || customerListParam.size()==0){ | 
|                     throw  new BusinessException(ResponseStatus.BAD_REQUEST); | 
|                 } | 
|                 initSketchCustomerListParam(line.getCustomerList(),customerList) ; | 
|                 totalNum += customerListParam.size(); | 
|             } | 
|             if(totalNum != Constants.formatIntegerNum(model.getOrderNum())){ | 
|                 throw  new BusinessException(ResponseStatus.BAD_REQUEST); | 
|             } | 
|             for(JkSketchLine line : lineList){ | 
|                 //逐个路线优化 | 
|                 List<JkSketchCustomer> customerListParam =  line.getCustomerList() ; | 
|                 TspSolver.DataModel dataModel = new TspSolver.DataModel(); | 
|                 int vehicleNumber1 = 1;//线路数量 | 
|                 long[] vehicleCapacities1=new long[]{line.getMaxOrder()};//每辆车的最大订单量限制 | 
|                 long[] demands1 = new long[customerListParam.size()+1]; //各个点的订单量 | 
|                 long[][] distanceMatrix1 = new long[customerListParam.size()+1][customerListParam.size()+1]; | 
|                 distanceMatrix1[0][0] = 0; | 
|                 demands1[0] =0;//原点 | 
|                 for (int i = 0; i < customerListParam.size(); i++) { | 
|                     List<DistanceMapParam>  disList =  customerListParam.get(i).getDistanceMapParamList(); | 
|                     distanceMatrix1[0][i+1] =  disList.get(0).getDistance(); | 
|                     distanceMatrix1[i+1][0] = disList.get(disList.size() -1).getDistance(); | 
|                     demands1[i+1] = Constants.formatBigdecimal( customerListParam.get(i).getTotalNum()).longValue();  //各个点的订单量 | 
|                     for (int j = 0; j < customerListParam.size(); j++) { | 
|                         distanceMatrix1[i+1][j+1] =disList.get(j+1).getDistance() ; | 
|                     } | 
|                 } | 
|                 //构造优化数据模型 | 
|                 dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1); | 
|                 TspSolver.startSearch(dataModel); | 
|                 if(dataModel.getSolutions()==null || dataModel.getSolutions().size()==0){ | 
|                     throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"线路【"+line.getLineName()+"】调整失败 ,未获得最优交通规划方案!"); | 
|                 } | 
|                 TspSolverSolutions so = dataModel.getSolutions().get(0); | 
|                 List<Integer> routes = so.getRouteIndex(); | 
|                 totalDistance += so.getDistance(); | 
|                 if(routes.size() <=2) { | 
|                     throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"线路【"+line.getLineName()+"】调整失败 ,未获得最优交通规划方案!"); | 
|                 } | 
|                 //有效路径 | 
|                 for (Integer cIndex : routes){ | 
|                     if(cIndex ==0){ | 
|                         continue; //起始点不处理 | 
|                     } | 
|                     JkSketchCustomer customer = customerListParam.get(cIndex-1); | 
|                     customer.setSortnum(cIndex-1); | 
|                 } | 
|                 line.setDistance(so.getDistance()); | 
|             } | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             success =false; | 
|         }finally { | 
|             if(success){ | 
|                 List<JkSketchCustomer> allList = new ArrayList<>(); | 
|                 for(JkSketchLine line : lineList){ | 
|                     allList.addAll(line.getCustomerList()); | 
|                 } | 
|                 jkSketchLineMapper.updateById(lineList); | 
|                 jkSketchCustomerMapper.updateById(allList); | 
|             } | 
|             jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda() | 
|                     .eq(JkSketch::getId,model.getId() ) | 
|                     .eq(JkSketch::getJobId,model.getJobId() ) | 
|                     .set(success,JkSketch::getDistance,totalDistance) | 
|                     .set(JkSketch::getPlanLineInfo,success?"最近一次线路调整成功":"最近一次线路调整失败!") | 
|                     .set(JkSketch::getStatus,success?Constants.TWO:Constants.THREE) | 
|                     .set(JkSketch::getPlanLineEndDate,new Date())); | 
|         } | 
|     } | 
|     private List<JkSketchCustomer> initSketchCustomerListParam(List<JkSketchCustomer> customerList, List<JkSketchCustomer> customerList1) { | 
|         for(JkSketchCustomer param : customerList){ | 
|             for(JkSketchCustomer model : customerList1){ | 
|               if(Constants.equalsInteger(model.getId(),param.getId())){ | 
|                   param.setLatitude(model.getLatitude()); | 
|                   param.setLongitude(model.getLongitude()); | 
|                   param.setStartDistance(model.getStartDistance()); | 
|                   param.setEndDistance(model.getEndDistance()); | 
|                   param.setDistanceJson(model.getDistanceJson()); | 
|               } | 
|             } | 
|         } | 
|         for(JkSketchCustomer c : customerList){ | 
|             List<DistanceMapParam> tmpList = new ArrayList<>(); | 
|             List<DistanceMapParam> distanceMapParamList  = getListFromJsonStr(c.getDistanceJson()); | 
|             DistanceMapParam t0 = new DistanceMapParam(); | 
|             t0.setId(-2);//表示返回园区 | 
|             t0.setDistance(Constants.formatLongNum(c.getStartDistance()) ); | 
|             tmpList.add(t0); | 
|             for(JkSketchCustomer cm : customerList){ | 
|                 //客户和客户之间的距离信息 | 
|                 DistanceMapParam t = new DistanceMapParam(); | 
|                 t.setId(cm.getCustomerId()); | 
|                 t.setDistance(0); | 
|                 DistanceMapParam param = getParamByCustomerIds( cm.getCustomerId(),distanceMapParamList); | 
|                 if(param!=null){//如果之前已经获取过 | 
|                     t = param; | 
|                 } | 
|                 tmpList.add(t); | 
|             } | 
|             DistanceMapParam tt = new DistanceMapParam(); | 
|             tt.setId(-2);//表示返回园区 | 
|             tt.setDistance(Constants.formatLongNum(c.getEndDistance())); | 
|             tmpList.add(tt); | 
|             c.setDistanceMapParamList(tmpList); | 
|         } | 
|         return  customerList; | 
|     } | 
|   | 
|   | 
|     private void initCustomerDistance( List<JkSketchLine> lineList,JkSketch model,boolean updateLineDistance) { | 
|         List<JkSketchCustomer> customerList = model.getCustomerList(); | 
|         for(JkSketchCustomer c : customerList){ | 
|             List<DistanceMapParam> tmpList = new ArrayList<>(); | 
|             List<DistanceMapParam> distanceMapParamList  = getListFromJsonStr(c.getDistanceJson()); | 
|             DistanceMapParam t0 = new DistanceMapParam(); | 
|             t0.setId(-2);//表示返回园区 | 
|             t0.setDistance(Constants.formatLongNum(c.getStartDistance()) ); | 
|             if(Constants.formatLongNum(c.getStartDistance()) <= 0){ | 
|                 //园区前往该客户的距离,如果之前未获取过 | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户:"+c.getName()+"交通规划尚未完成,不满足优化条件!"); | 
|             } | 
|             tmpList.add(t0); | 
|             for(JkSketchCustomer cm : customerList){ | 
|                 //客户和客户之间的距离信息 | 
|                 DistanceMapParam t = new DistanceMapParam(); | 
|                 t.setId(cm.getCustomerId()); | 
|                 DistanceMapParam param = getParamByCustomerIds( cm.getCustomerId(),distanceMapParamList); | 
|                 if(param!=null){//如果之前已经获取过 | 
|                     t = param; | 
|                 }else{ | 
|                     throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户:"+c.getName()+"交通规划尚未完成,不满足路程计算条件!"); | 
|                 } | 
|                 tmpList.add(t); | 
|             } | 
|             DistanceMapParam tt = new DistanceMapParam(); | 
|             tt.setId(-2);//表示返回园区 | 
|             tt.setDistance(Constants.formatLongNum(c.getEndDistance())); | 
|             if(Constants.formatLongNum(c.getEndDistance()) <= 0){ | 
|                 //该客户返回园区的距离 ,如果之前未获取过 | 
|                 throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户:"+c.getName()+"交通规划尚未完成,不满足路程计算条件!"); | 
|             } | 
|             tmpList.add(tt); | 
|             c.setDistanceMapParamList(tmpList); | 
|         } | 
|         if(lineList!=null){ | 
|             long totalDistance = 0; | 
|             for (JkSketchLine line :lineList){ | 
|                 long lineDistance = 0; | 
|                 List<JkSketchCustomer> customers = getCustomerListByLineId(line.getId(),customerList); | 
|                 int index =0; | 
|                 for(JkSketchCustomer c : customers){ | 
|                     if(index ==0){ | 
|                         lineDistance+= Constants.formatLongNum(c.getStartDistance()); | 
|                     } | 
|                     if(index == customers.size()-1){ | 
|                         lineDistance+= Constants.formatLongNum(c.getEndDistance()); | 
|                         break; | 
|                     } | 
|                     DistanceMapParam param = getParamByCustomerIds( customers.get(index+1).getCustomerId(),getListFromJsonStr(c.getDistanceJson())); | 
|                     lineDistance += param.getDistance(); | 
|                     index++; | 
|                   /*  for(JkSketchCustomer cm : customers){ | 
|                         DistanceMapParam param = getParamByCustomerIds( cm.getCustomerId(),getListFromJsonStr(c.getDistanceJson())); | 
|                         lineDistance += param.getDistance(); | 
|                     }*/ | 
|                 } | 
|                 if(updateLineDistance && Constants.equalsInteger(model.getStatus(),Constants.ZERO) ){ | 
|                     line.setDistance(lineDistance); | 
|                     jkSketchLineMapper.updateById(line); | 
|                 } | 
|                 totalDistance += lineDistance; | 
|             } | 
|             if(Constants.equalsInteger(model.getStatus(),Constants.ZERO) ||Constants.formatLongNum(model.getOriginDistance()) <= 0l ){ | 
|                 //如果首次优化或者之前没有计算过,设置优化前原始路径 | 
|                 model.setOriginDistance(totalDistance); | 
|             } | 
|         } | 
|     } | 
|   | 
|     private List<JkSketchCustomer> getCustomerListByLineId(Integer id, List<JkSketchCustomer> customerList) { | 
|         List<JkSketchCustomer> list = new ArrayList<>(); | 
|         for (JkSketchCustomer c :customerList){ | 
|             if(Constants.equalsInteger(c.getSketchLineId(),id)){ | 
|                 list.add(c); | 
|             } | 
|         } | 
|         return list; | 
|     } | 
|   | 
|     private DistanceMapParam getParamByCustomerIds(  Integer id1, List<DistanceMapParam> distanceMapParamList) { | 
|         if(distanceMapParamList!=null){ | 
|             for(DistanceMapParam p :distanceMapParamList){ | 
|                 if(Constants.equalsInteger(p.getId(),id1)){ | 
|                     return p; | 
|                 } | 
|             } | 
|         } | 
|   | 
|         return null; | 
|     } | 
|   | 
|     private List<DistanceMapParam> getListFromJsonStr(String distanceJson) { | 
|         try { | 
|             return  JSONObject.parseObject(distanceJson, new TypeReference<List<DistanceMapParam>>(){}.getType()); | 
|         }catch (Exception e){ | 
|         } | 
|         return new ArrayList<>(); | 
|     } | 
|   | 
|     private void dealSearchSolution(JkSketch model, TspSolver.DataModel dataModel) { | 
|         Date date = new Date(); | 
|         List<TspSolverSolutions> solutions = dataModel.getSolutions(); | 
|         List<JkSketchLine> sketchLineList = new ArrayList<>(); | 
|         List<JkSketchCustomer> sketchCustomerList  = new ArrayList<>(); | 
|         long totalDistance = 0l; | 
|         if(solutions!=null && solutions.size()>0){ | 
|             for(TspSolverSolutions so : solutions){ | 
|                 List<Integer> routes = so.getRouteIndex(); | 
|                 totalDistance+= so.getDistance(); | 
|                 if(routes.size() <=2) { | 
|                     continue;//无客户的非有效路线 | 
|                 } | 
| //                totalDistance+= so.getDistance(); | 
|                 JkLine  line =model.getLineList().get(so.getLineIndex()); | 
|                 JkSketchLine tModel =  new JkSketchLine(); | 
|                 tModel.setSketchId(model.getId()); | 
|                 tModel.setCreator(model.getEditor()); | 
|                 tModel.setCreateDate(date); | 
|                 tModel.setLineId(line.getId()); | 
|                 tModel.setTotalNum(new BigDecimal(0)); | 
|                 tModel.setOrderNum(routes.size()-2); | 
|                 tModel.setDateInfo(model.getDateInfo()); | 
|                 tModel.setType(Constants.ONE); | 
|                 tModel.setSortnum(sketchLineList.size()+1); | 
|                 tModel.setEditDate(tModel.getCreateDate()); | 
|                 tModel.setEditor(tModel.getCreator()); | 
|                 tModel.setIsdeleted(Constants.ZERO); | 
|                 tModel.setDistance(so.getDistance());// | 
|                 sketchLineList.add(tModel); | 
|                 tModel.setCustomerList( new ArrayList<>()); | 
|                 //有效路径 | 
|                 for (Integer cIndex : routes){ | 
|                     if(cIndex ==0){ | 
|                         continue; //起始点不处理 | 
|                     } | 
|                     JkSketchCustomer customer = model.getCustomerList().get(cIndex-1); | 
|                     tModel.setTotalNum(tModel.getTotalNum().add(Constants.formatBigdecimal(customer.getTotalNum())));//送货量 | 
|                     JkSketchCustomer cModel =  new JkSketchCustomer(); | 
|                     cModel.setCreator(tModel.getCreator()); | 
|                     cModel.setOrderId(customer.getOrderId()); | 
|                     cModel.setCreateDate(tModel.getCreateDate()); | 
|                     cModel.setType(Constants.ONE); | 
|                     cModel.setTotalNum(customer.getTotalNum()); | 
|                     cModel.setDateInfo(model.getDateInfo()); | 
|                     cModel.setSortnum(tModel.getCustomerList().size()+1); | 
|                     cModel.setEditDate(tModel.getCreateDate()); | 
|                     cModel.setEditor(tModel.getCreator()); | 
|                     cModel.setIsdeleted(Constants.ZERO); | 
|                     cModel.setSketchId(model.getId()); | 
|                     cModel.setCustomerId(customer.getCustomerId()); | 
|                     tModel.getCustomerList().add(cModel); | 
|   | 
|                 } | 
|             } | 
|         } | 
|         if(sketchLineList!=null && sketchLineList.size()>0){ | 
|             jkSketchLineMapper.update(null,new UpdateWrapper<JkSketchLine>().lambda() | 
|                     .set(JkSketchLine::getIsdeleted,Constants.ONE) | 
|                     .eq(JkSketchLine::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkSketchLine::getType,Constants.ONE) | 
|                     .eq(JkSketchLine::getDateInfo,model.getDateInfo())); | 
|             jkSketchCustomerMapper.update(null,new UpdateWrapper<JkSketchCustomer>().lambda() | 
|                     .set(JkSketchCustomer::getIsdeleted,Constants.ONE) | 
|                     .eq(JkSketchCustomer::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkSketchCustomer::getType,Constants.ONE) | 
|                     .eq(JkSketchCustomer::getDateInfo,model.getDateInfo())); | 
|             if(sketchLineList.size()>0){ | 
|                 jkSketchLineMapper.insert(sketchLineList); | 
|             } | 
|             for(JkSketchLine l : sketchLineList){ | 
|                 if(l.getCustomerList()!=null ){ | 
|                     for(JkSketchCustomer c :l.getCustomerList()){ | 
|                         c.setSketchLineId(l.getId()); | 
|                     } | 
|                     sketchCustomerList.addAll(l.getCustomerList()); | 
|                 } | 
|             } | 
|             if(sketchCustomerList.size()>0){ | 
|                 jkSketchCustomerMapper.insert(sketchCustomerList); | 
|             } | 
|             jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda() | 
|                     .eq(JkSketch::getId,model.getId() ) | 
|                     .eq(JkSketch::getJobId,model.getJobId() ) | 
|                     .set(JkSketch::getLineNum,sketchLineList.size() ) | 
|                     .set(JkSketch::getOptStatus,Constants.ONE)//已生成优化线路 | 
|                     .set(JkSketch::getDistance,totalDistance) | 
|                     .set(JkSketch::getPlanLineInfo,"最近一次线路优化成功,优化后总距离:"+(totalDistance/1000)+"公里!") | 
|                     .set(JkSketch::getStatus,Constants.TWO) | 
|                     .set(JkSketch::getPlanLineEndDate,date)); | 
|         }else{ | 
|             jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda() | 
|                     .eq(JkSketch::getId,model.getId() ) | 
|                     .eq(JkSketch::getJobId,model.getJobId() ) | 
|                     .set(JkSketch::getPlanLineInfo,"最近一次线路优化失败,未找到最优路线!") | 
|                     .set(JkSketch::getStatus,Constants.THREE) | 
|                     .set(JkSketch::getPlanLineEndDate,date)); | 
|         } | 
|     } | 
|   | 
|     private   List<JkSketchCustomer>  checkJketchCustomerLocation(JkSketch model,boolean updateLineDistance) { | 
|         MPJLambdaWrapper<JkSketchCustomer> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.selectAll(JkSketchCustomer.class ) | 
|                 .selectAs(JkCustomer::getName,JkSketchCustomer::getName) | 
|                 .selectAs(JkCustomer::getCode,JkSketchCustomer::getCode) | 
|                 .selectAs(JkCustomer::getDistanceStatus,JkSketchCustomer::getDistanceStatus) | 
|                 .selectAs(JkCustomer::getDistance,JkSketchCustomer::getDistanceJson) | 
|                 .selectAs(JkCustomer::getLongitude,JkSketchCustomer::getLongitude) | 
|                 .selectAs(JkCustomer::getLatitude,JkSketchCustomer::getLatitude) | 
|                 .selectAs(JkCustomer::getStartDistance,JkSketchCustomer::getStartDistance) | 
|                 .selectAs(JkCustomer::getEndDistance,JkSketchCustomer::getEndDistance) | 
|                 .leftJoin(JkCustomer.class,JkCustomer::getId,JkSketchCustomer::getCustomerId ) | 
|                 .eq(JkSketchCustomer::getType, Constants.formatIntegerNum(model.getOptStatus())) | 
|                 .eq(JkSketchCustomer::getSketchId, model.getId()) | 
|                 .eq(JkSketchCustomer::getIsdeleted,Constants.ZERO) | 
|                 .orderByAsc(JkSketchCustomer::getSortnum); | 
|         List<JkSketchCustomer> customerList = jkSketchCustomerMapper.selectJoinList(JkSketchCustomer.class,queryWrapper); | 
|         if(customerList == null ||customerList.size() ==0){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户信息为空,不满足优化条件!"); | 
|         } | 
|         String errorMsg =""; | 
|         String errorMsg1 =""; | 
|         for(JkSketchCustomer c : customerList){ | 
|             if(c.getLatitude()==null || c.getLongitude() ==null){ | 
|                 errorMsg += c.getName()+"-"+c.getName()+" | "; | 
|             } | 
|             if(!Constants.equalsInteger(c.getDistanceStatus(),Constants.ONE)){ | 
|                 errorMsg1 += c.getName()+"-"+c.getName()+" | "; | 
|             } | 
|         } | 
|         if(StringUtils.isNotBlank(errorMsg)){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户:【"+errorMsg+"】定位信息不完整,不满足优化条件!"); | 
|         } | 
|         if(StringUtils.isNotBlank(errorMsg1)){ | 
|             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该线路客户:【"+errorMsg1+"】交通规划尚未完成,不满足优化条件!"); | 
|         } | 
|         model.setCustomerList(customerList); | 
|         MPJLambdaWrapper<JkSketchLine> queryWrapper1 = new MPJLambdaWrapper<>(); | 
|         queryWrapper1.selectAll(JkSketchLine.class ) | 
|                 .eq(JkSketchLine::getSketchId, model.getId()) | 
|                 .eq(JkSketchLine::getIsdeleted,Constants.ZERO) | 
|                 .eq(JkSketchLine::getType, Constants.formatIntegerNum(model.getOptStatus())) | 
|                 .orderByAsc(JkSketchLine::getSortnum); | 
|         List<JkSketchLine> lineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper1); | 
|         initCustomerDistance(lineList,model,updateLineDistance); | 
|         return customerList; | 
|     } | 
|   | 
|     @Override | 
|     public void updateByIdInBatch(List<JkSketch> jkSketchs) { | 
|         if (CollectionUtils.isEmpty(jkSketchs)) { | 
|             return; | 
|         } | 
|         for (JkSketch jkSketch: jkSketchs) { | 
|             this.updateById(jkSketch); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public JkSketch findById(Integer id) { | 
|         return jkSketchMapper.selectById(id); | 
|     } | 
|   | 
|     @Override | 
|     public JkSketch findOne(JkSketch jkSketch) { | 
|         QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch); | 
|         return jkSketchMapper.selectOne(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<JkSketch> findList(JkSketch jkSketch) { | 
|         QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch); | 
|         return jkSketchMapper.selectList(wrapper); | 
|     } | 
|    | 
|     @Override | 
|     public PageData<JkSketch> findPage(PageWrap<JkSketch> pageWrap) { | 
|         IPage<JkSketch> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
|         MPJLambdaWrapper<JkSketch> queryWrapper = new MPJLambdaWrapper<>(); | 
|         Utils.MP.blankToNull(pageWrap.getModel()); | 
|         pageWrap.getModel().setIsdeleted(Constants.ZERO); | 
|         queryWrapper.selectAll(JkSketch.class ) | 
|                 .selectAs(Category::getId,JkSketch::getCategoryId) | 
|                 .selectAs(Category::getName,JkSketch::getCategoryName) | 
|                 .leftJoin(Category.class,Category::getId,JkSketch::getCategoryId ); | 
|         queryWrapper.eq( pageWrap.getModel().getCategoryId()!=null,JkLine::getCategoryId, pageWrap.getModel().getCategoryId()); | 
|   | 
|         if (pageWrap.getModel().getId() != null) { | 
|             queryWrapper.eq(JkSketch::getId, pageWrap.getModel().getId()); | 
|         } | 
|         if (pageWrap.getModel().getCreator() != null) { | 
|             queryWrapper.eq(JkSketch::getCreator, pageWrap.getModel().getCreator()); | 
|         } | 
|         if (pageWrap.getModel().getCreateDate() != null) { | 
|             queryWrapper.ge(JkSketch::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); | 
|             queryWrapper.le(JkSketch::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); | 
|         } | 
|         if (pageWrap.getModel().getEditor() != null) { | 
|             queryWrapper.eq(JkSketch::getEditor, pageWrap.getModel().getEditor()); | 
|         } | 
|         if (pageWrap.getModel().getEditDate() != null) { | 
|             queryWrapper.ge(JkSketch::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); | 
|             queryWrapper.le(JkSketch::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); | 
|         } | 
|         if (pageWrap.getModel().getIsdeleted() != null) { | 
|             queryWrapper.eq(JkSketch::getIsdeleted, pageWrap.getModel().getIsdeleted()); | 
|         } | 
|         if (pageWrap.getModel().getInfo() != null) { | 
|             queryWrapper.eq(JkSketch::getInfo, pageWrap.getModel().getInfo()); | 
|         } | 
|         if (pageWrap.getModel().getCategoryId() != null) { | 
|             queryWrapper.eq(JkSketch::getCategoryId, pageWrap.getModel().getCategoryId()); | 
|         } | 
|         if (pageWrap.getModel().getTotalNum() != null) { | 
|             queryWrapper.eq(JkSketch::getTotalNum, pageWrap.getModel().getTotalNum()); | 
|         } | 
|         if (pageWrap.getModel().getOrderNum() != null) { | 
|             queryWrapper.eq(JkSketch::getOrderNum, pageWrap.getModel().getOrderNum()); | 
|         } | 
|         if (pageWrap.getModel().getStatus() != null) { | 
|             queryWrapper.eq(JkSketch::getStatus, pageWrap.getModel().getStatus()); | 
|         } | 
|         if (pageWrap.getModel().getSortnum() != null) { | 
|             queryWrapper.eq(JkSketch::getSortnum, pageWrap.getModel().getSortnum()); | 
|         } | 
|         if (pageWrap.getModel().getDateInfo() != null) { | 
|             queryWrapper.eq(JkSketch::getDateInfo,  pageWrap.getModel().getDateInfo()); | 
|         } | 
|         if (pageWrap.getModel().getJobId() != null) { | 
|             queryWrapper.eq(JkSketch::getJobId, pageWrap.getModel().getJobId()); | 
|         } | 
|         queryWrapper.orderByDesc(JkSketch::getDateInfo); | 
|         IPage<JkSketch> result = jkSketchMapper.selectJoinPage(page, JkSketch.class,queryWrapper); | 
|         return PageData.from(result); | 
|     } | 
|   | 
|     @Override | 
|     public long count(JkSketch jkSketch) { | 
|         QueryWrapper<JkSketch> wrapper = new QueryWrapper<>(jkSketch); | 
|         return jkSketchMapper.selectCount(wrapper); | 
|     } | 
|     @Override | 
|     @Transactional(rollbackFor = {Exception.class,BusinessException.class}) | 
|     public List<JkSketch> importBatch(MultipartFile file, String dateInfoStr, LoginUserInfo loginUser){ | 
|         if(StringUtils.isBlank(dateInfoStr)){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请选择送货日期!"); | 
|         } | 
|         Date dateInfo = DateUtil.getDateFromShortString(dateInfoStr); | 
|         if(dateInfo == null){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请选择正确的送货日期!"); | 
|         } | 
|         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_JKORDERS); | 
|         if(importing!=null && importing){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入任务正在执行中,请稍后再试!"); | 
|         } | 
|         redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKORDERS,true,30, TimeUnit.MINUTES); | 
|         try { | 
|             ExcelImporter ie = null; | 
|             List<JkOrdersImport> dataList =null; | 
|             try { | 
|                 ie = new ExcelImporter(file,1,0); | 
|                 dataList = ie.getDataList(JkOrdersImport.class,null); | 
|             }  catch (Exception e) { | 
|                 e.printStackTrace(); | 
|             } | 
|             if(dataList == null || dataList.size() ==0){ | 
|                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); | 
|             } | 
|             List<JkCustomer> customerList =  jkCustomerMapper.selectJoinList(JkCustomer.class,new MPJLambdaWrapper<JkCustomer>() | 
|                     .selectAll(JkCustomer.class) | 
|                     .eq(JkCustomer::getIsdeleted,Constants.ZERO) | 
|             ); | 
|             String week =  DateUtil.getWeekZhouOfDate(dateInfo); | 
|             //当前所有线路 | 
|             List<JkLine> lineList =  jkLineMapper.selectJoinList(JkLine.class,new MPJLambdaWrapper<JkLine>() | 
|                     .selectAll(JkLine.class) | 
|                     .eq(JkLine::getWeeks,week)//只能选择当前的线路 | 
|                     .eq(JkLine::getIsdeleted,Constants.ZERO) | 
|             ); | 
|             List<JkOrders> newOrderList = new ArrayList<>(); | 
|             for(int i=0;i<dataList.size();i++){ | 
|                 JkOrdersImport model = dataList.get(i); | 
|                 if(StringUtils.isBlank(model.getName()) | 
|                         &&StringUtils.isBlank(model.getCode()) | 
|                         &&StringUtils.isBlank(model.getNum()) | 
|                         &&StringUtils.isBlank(model.getSortnum()) | 
|                         &&StringUtils.isBlank(model.getDateInfo()) | 
|                         &&StringUtils.isBlank(model.getLineName()) ){ | 
|                     continue; | 
|                 } | 
|                 checkModelParam(model, newOrderList, i,dateInfo,loginUser,customerList,lineList ); | 
|             } | 
|             if( newOrderList.size()==0){ | 
|                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入有效数据为空!"); | 
|             } | 
|             List<JkSketch> newList = initNewSketchList(newOrderList);//按照主线路分组 | 
|             if(  newList.size() ==0 ){ | 
|                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入有效数据为空!"); | 
|             } | 
|             jkSketchMapper.update(null,new UpdateWrapper<JkSketch>().lambda() | 
|                     .set(JkSketch::getIsdeleted,Constants.ONE) | 
|                     .eq(JkSketch::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkSketch::getDateInfo,dateInfo)); | 
|             jkOrdersMapper.update(null,new UpdateWrapper<JkOrders>().lambda() | 
|                     .set(JkOrders::getIsdeleted,Constants.ONE) | 
|                     .eq(JkOrders::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkOrders::getDateInfo,dateInfo)); | 
|             if(newList.size()>0){ | 
|                 jkSketchMapper.insert(newList); | 
|             } | 
|             if(newOrderList.size()>0){ | 
|                 jkOrdersMapper.insert(newOrderList); | 
|             } | 
|             List<JkSketchLine> sketchLineList = initNewSketchLineList(newList,newOrderList,lineList); | 
|             jkSketchLineMapper.update(null,new UpdateWrapper<JkSketchLine>().lambda() | 
|                     .set(JkSketchLine::getIsdeleted,Constants.ONE) | 
|                     .eq(JkSketchLine::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkSketchLine::getDateInfo,dateInfo)); | 
|             if(sketchLineList.size()>0){ | 
|                 jkSketchLineMapper.insert(sketchLineList); | 
|             } | 
|             List<JkSketchCustomer> sketchCuustomerList = initNewSketchCustomerList(sketchLineList,newOrderList);//按照主线路分组 | 
|             jkSketchCustomerMapper.update(null,new UpdateWrapper<JkSketchCustomer>().lambda() | 
|                     .set(JkSketchCustomer::getIsdeleted,Constants.ONE) | 
|                     .eq(JkSketchCustomer::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkSketchCustomer::getDateInfo,dateInfo)); | 
|             if(sketchCuustomerList.size()>0){ | 
|                 jkSketchCustomerMapper.insert(sketchCuustomerList); | 
|             } | 
|             return newList; | 
|         }catch (BusinessException e){ | 
|             throw e; | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
|         }finally { | 
|             redisTemplate.delete(Constants.RedisKeys.IMPORTING_JKORDERS); | 
|         } | 
|   | 
|     } | 
|   | 
|   | 
|   | 
|     private List<JkSketchCustomer> initNewSketchCustomerList(List<JkSketchLine> sketchLineList, List<JkOrders> newOrderList) { | 
|         List<JkSketchCustomer> list =new ArrayList<>(); | 
|         for(JkOrders orders : newOrderList){ | 
|             JkSketchLine line = findModelFromListByLineId(orders.getLineId(),sketchLineList); | 
|             if( line!=null){ | 
|                 JkSketchCustomer tModel =  new JkSketchCustomer(); | 
|                 tModel.setCreator(orders.getCreator()); | 
|                 tModel.setOrderId(orders.getId()); | 
|                 tModel.setCreateDate(orders.getCreateDate()); | 
|                 tModel.setTotalNum(orders.getNum()); | 
|                 tModel.setDateInfo(orders.getDateInfo()); | 
|                 tModel.setSortnum(list.size()+1); | 
|                 tModel.setType(Constants.ZERO); | 
|                 tModel.setEditDate(tModel.getCreateDate()); | 
|                 tModel.setEditor(tModel.getCreator()); | 
|                 tModel.setIsdeleted(Constants.ZERO); | 
|                 tModel.setSketchId(line.getSketchId()); | 
|                 tModel.setCustomerId(orders.getCustomerId()); | 
|                 tModel.setSketchLineId(line.getId()); | 
|                 list.add(tModel); | 
|             } | 
|         } | 
|         return list; | 
|     } | 
|     private List<JkSketchLine> initNewSketchLineList(List<JkSketch> newList, List<JkOrders> newOrderList,List<JkLine> lineList) { | 
|         List<JkSketchLine> list =new ArrayList<>(); | 
|         for (JkLine line : lineList){ | 
|             JkSketchLine tModel =  new JkSketchLine(); | 
|             tModel.setSketchId(getSKetchIdByyCategoryId(line.getCategoryId(),newList)); | 
|             tModel.setCreator(newList.get(0).getCreator()); | 
|             tModel.setCreateDate(newList.get(0).getCreateDate()); | 
|             tModel.setLineId(line.getId()); | 
|             initOrderAndTotalNum(tModel,line.getId(),newOrderList); | 
|             tModel.setDateInfo(newList.get(0).getDateInfo()); | 
|             tModel.setSortnum(list.size()+1); | 
|             tModel.setType(Constants.ZERO); | 
|             tModel.setEditDate(tModel.getCreateDate()); | 
|             tModel.setEditor(tModel.getCreator()); | 
|             tModel.setIsdeleted(Constants.ZERO); | 
|             if(tModel.getSketchId()!=null && Constants.formatIntegerNum(tModel.getOrderNum()) >0){ | 
|                 list.add(tModel); | 
|             } | 
|         } | 
|   | 
|         return list; | 
|     } | 
|   | 
|     private void initOrderAndTotalNum(JkSketchLine tModel, Integer id, List<JkOrders> newOrderList) { | 
|         for(JkOrders orders : newOrderList){ | 
|             if(Constants.equalsInteger(orders.getLineId(),id)){ | 
|                 tModel.setOrderNum(Constants.formatIntegerNum(tModel.getOrderNum())+1); | 
|                 tModel.setTotalNum(Constants.formatBigdecimal(tModel.getTotalNum()).add(Constants.formatBigdecimal(orders.getNum()))); | 
|             } | 
|         } | 
|     } | 
|   | 
|     private Integer getSKetchIdByyCategoryId(Integer categoryId, List<JkSketch> newList) { | 
|         for(JkSketch model:newList){ | 
|             if(Constants.equalsInteger(model.getCategoryId(),categoryId)){ | 
|                 return model.getId(); | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     private JkSketchLine findModelFromListByLineId(Integer lineId, List<JkSketchLine> list) { | 
|         if(list !=null){ | 
|             for(JkSketchLine model : list){ | 
|                 if(Constants.equalsInteger(lineId,model.getLineId())){ | 
|                     return  model; | 
|                 } | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     private   List<JkSketch>  initNewSketchList(List<JkOrders> newOrderList) { | 
|         List<JkSketch> list =new ArrayList<>(); | 
|         for(JkOrders orders : newOrderList){ | 
|             JkSketch tModel = findModelFromListByCateId(orders.getCategoryId(),list); | 
|             if(tModel!=null){ | 
|                 tModel.setTotalNum(  tModel.getTotalNum().add(orders.getNum()));//订单量累计 | 
|                 tModel.setOrderNum(tModel.getOrderNum()+1);//客户数加1 | 
|             }else{ | 
|                 tModel = new JkSketch(); | 
|                 tModel.setLineNum(getLineNumByOrders(orders.getCategoryId(),newOrderList)); | 
|                 tModel.setPlanLineNum(tModel.getLineNum()); | 
|                 tModel.setCreator(orders.getCreator()); | 
|                 tModel.setCreateDate(orders.getCreateDate()); | 
|                 tModel.setCategoryId(orders.getCategoryId()); | 
|                 tModel.setTotalNum(orders.getNum()); | 
|                 tModel.setOptStatus(Constants.ZERO); | 
|                 tModel.setOrderNum(1); | 
|                 tModel.setDateInfo(orders.getDateInfo()); | 
|                 tModel.setSortnum(list.size()+1); | 
|                 tModel.setEditDate(tModel.getCreateDate()); | 
|                 tModel.setEditor(tModel.getCreator()); | 
|                 tModel.setStatus(Constants.ZERO); | 
|                 tModel.setIsdeleted(Constants.ZERO); | 
|                 list.add(tModel); | 
|             } | 
|         } | 
|         return list; | 
|     } | 
|   | 
|     private Integer getLineNumByOrders(Integer cateId, List<JkOrders> newOrderList) { | 
|         List<JkSketchLine> list =new ArrayList<>(); | 
|         for(JkOrders orders : newOrderList){ | 
|             if(!Constants.equalsInteger(orders.getCategoryId(),cateId)){ | 
|                 continue; | 
|             } | 
|             JkSketchLine tModel = findModelFromListByLineId(orders.getLineId(),list); | 
|             if(tModel ==null){ | 
|                 tModel = new JkSketchLine(); | 
|                 tModel.setLineId(orders.getLineId()); | 
|                 list.add(tModel); | 
|             } | 
|         } | 
|         return list.size(); | 
|     } | 
|   | 
|   | 
|     private JkOrders checkModelParam(JkOrdersImport model | 
|             , List<JkOrders> newOrderList | 
|             ,int index | 
|             ,Date dateInfo | 
|             ,LoginUserInfo loginUserInfo | 
|             ,List<JkCustomer> allList | 
|             ,List<JkLine> lineList ) { | 
|         if(StringUtils.isBlank(model.getName()) | 
|                 ||StringUtils.isBlank(model.getCode()) | 
|                 ||StringUtils.isBlank(model.getName()) | 
|                 ||StringUtils.isBlank(model.getLineName()) ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行客户信息不完整,请检查表格内容!"); | 
|         } | 
|         for(JkOrders param: newOrderList){ | 
|             if(StringUtils.isNotBlank(model.getCode())&&StringUtils.isNotBlank(param.getCode())) { | 
|                 if (StringUtils.equals(model.getCode(), param.getCode())) { | 
|                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行客户简码【" + model.getName() + "】重复出现,请检查表格内容!"); | 
|                 } | 
|             } | 
|         } | 
|         JkCustomer customer = findModelFromList(model.getCode(),allList); | 
|         if(customer == null){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行客户编码【" + model.getCode() + "】不存在,请检查表格内容!"); | 
|         } | 
|         if(!StringUtils.equals(customer.getName(),model.getName())){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行客户名称【" + model.getName() + "】和编码不匹配,请检查表格内容!"); | 
|         } | 
|         JkLine line = findLineFromListByName(model.getLineName(),lineList); | 
|         if(line == null){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,第" + (index + 3) + "行线路【" + model.getLineName() + "】不存在或者配送周期不符合,请检查表格内容!"); | 
|         } | 
|   | 
|         JkOrders tModel =   new JkOrders(); | 
|         tModel.setCreator(loginUserInfo.getId()); | 
|         tModel.setCreateDate(new Date()); | 
|         tModel.setName(model.getName()); | 
|         tModel.setCode(model.getCode()); | 
|         tModel.setNum(getDecimalByVal(model.getNum())); | 
|         tModel.setCustomerId(customer.getId()); | 
|         tModel.setDateInfo(dateInfo); | 
|         tModel.setLatitude(customer.getLatitude()); | 
|         tModel.setLongitude(customer.getLongitude()); | 
|         tModel.setSortnum(model.getSortnum()); | 
|         tModel.setLineId(line.getId()); | 
|         tModel.setCategoryId(line.getCategoryId()); | 
|         tModel.setEditDate(new Date()); | 
|         tModel.setEditor(loginUserInfo.getId()); | 
|         tModel.setIsdeleted(Constants.ZERO); | 
|         newOrderList.add(tModel); | 
|         return tModel; | 
|     } | 
|   | 
|     private BigDecimal getDecimalByVal(String val) { | 
|         try { | 
|             return new BigDecimal(val); | 
|         }catch (Exception e){ | 
|   | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     private JkCustomer findModelFromList(String code, List<JkCustomer> list) { | 
|         if(list !=null){ | 
|             for(JkCustomer model : list){ | 
|                 if(StringUtils.equals(code,model.getCode())){ | 
|                     return  model; | 
|                 } | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|     private JkSketch findModelFromListByCateId(Integer cateId, List<JkSketch> list) { | 
|         if(list !=null){ | 
|             for(JkSketch model : list){ | 
|                 if(Constants.equalsInteger(cateId,model.getCategoryId())){ | 
|                     return  model; | 
|                 } | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|     private JkLine findLineFromListByName(String name, List<JkLine> list) { | 
|         if(list !=null){ | 
|             for(JkLine model : list){ | 
|                 if(StringUtils.equals(name,model.getName())){ | 
|                     return model; | 
|                 } | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|   | 
|   | 
|     @Override | 
|     public List<TelecomJkLineListVO>  getLineForTelecom(TelecomLineInfoDTO telecomLineInfoDTO){ | 
|         if(StringUtils.isBlank(telecomLineInfoDTO.getDateInfo())){ | 
|             telecomLineInfoDTO.setDateInfo(DateUtil.getDate(new Date(),"yyyy-MM-dd")); | 
|         } | 
|         MPJLambdaWrapper<JkSketchLine> queryWrapper = new MPJLambdaWrapper<JkSketchLine>().selectAll(JkSketchLine.class ) | 
|                 .selectAs(Cars::getCode,JkSketchLine::getCarCode) | 
|                 .selectAs(Category::getName,JkSketchLine::getCategoryName) | 
|                 .selectAs(JkLine::getName,JkSketchLine::getLineName) | 
|                 .select(" ifnull((select count(1) from jk_sketch_customer jc where jc.ISDELETED= 0  and jc.SKETCH_LINE_ID = t.id),0)" ,JkSketchLine::getMaxCustomer) | 
|                 .leftJoin(JkSketch.class,JkSketch::getId,JkSketchLine::getSketchId) | 
|                 .leftJoin(JkLine.class,JkLine::getId,JkSketchLine::getLineId) | 
|                 .leftJoin(Category.class,Category::getId,JkLine::getCategoryId ) | 
|                 .leftJoin(Cars.class,Cars::getId,JkLine::getCarId) | 
|                 .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()) | 
|                 .eq(Objects.nonNull(telecomLineInfoDTO.getCategoryId()),JkLine::getCategoryId, telecomLineInfoDTO.getCategoryId()) | 
|                 .eq(Objects.nonNull(telecomLineInfoDTO.getLineId()),JkLine::getId, telecomLineInfoDTO.getLineId()); | 
|   | 
|         List<JkSketchLine> jkSketchLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper); | 
|         List<TelecomJkLineListVO> telecomJkLineListVOList = new ArrayList<>(); | 
|   | 
|         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(jkSketchLineList)){ | 
|             //优化前数据 | 
|             List<JkSketchLine> beforeList = jkSketchLineList.stream() | 
|                     .filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()); | 
|             //优化后数据 | 
|             List<JkSketchLine> afterList = jkSketchLineList.stream() | 
|                     .filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)&&Constants.equalsInteger(i.getIsdeleted(),Constants.ZERO)).collect(Collectors.toList()); | 
|              | 
|             for (JkSketchLine sketchLine:beforeList) { | 
|                 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); | 
|                 } | 
|                 TelecomJkLineListVO telecomJkLineListVO = new TelecomJkLineListVO(); | 
|                 telecomJkLineListVO.setCategoryName(sketchLine.getCategoryName()); | 
|                 telecomJkLineListVO.setName(sketchLine.getLineName()); | 
|                 telecomJkLineListVO.setCarCode(sketchLine.getCarCode()); | 
|                 telecomJkLineListVO.setCustomerNum(sketchLine.getMaxCustomer()); | 
|                 telecomJkLineListVOList.add(telecomJkLineListVO); | 
|             } | 
|   | 
|         } | 
|         return telecomJkLineListVOList; | 
|     } | 
|   | 
|     @Override | 
|     public TelecomLineCountVO getTelecomLineCount(TelecomLineInfoDTO telecomLineInfoDTO){ | 
|         if(StringUtils.isBlank(telecomLineInfoDTO.getDateInfo())){ | 
|             telecomLineInfoDTO.setDateInfo(DateUtil.getDate(new Date(),"yyyy-MM-dd")); | 
|         } | 
|         TelecomLineCountVO telecomLineCountVO = new TelecomLineCountVO(); | 
|         telecomLineCountVO.setLineNum(Constants.ZERO); | 
|         telecomLineCountVO.setCategoryNum(Constants.ZERO); | 
|         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_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()); | 
|         List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper); | 
|         if(CollectionUtils.isEmpty(sketchList)){ | 
|             return telecomLineCountVO; | 
|         } | 
|         MPJLambdaWrapper<JkSketchLine> queryWrapper = new MPJLambdaWrapper<JkSketchLine>().selectAll(JkSketchLine.class ) | 
|                 .selectAs(Cars::getCode,JkSketchLine::getCarCode) | 
|                 .selectAs(Category::getName,JkSketchLine::getCategoryName) | 
|                 .selectAs(JkLine::getName,JkSketchLine::getLineName) | 
|                 .select(" ifnull((select count(1) from jk_sketch_customer jc where jc.ISDELETED= 0 and jc.SKETCH_LINE_ID = t.id),0)" ,JkSketchLine::getMaxCustomer) | 
|                 .leftJoin(JkSketch.class,JkSketch::getId,JkSketchLine::getSketchId) | 
|                 .leftJoin(JkLine.class,JkLine::getId,JkSketchLine::getLineId) | 
|                 .leftJoin(Category.class,Category::getId,JkLine::getCategoryId ) | 
|                 .leftJoin(Cars.class,Cars::getId,JkLine::getCarId) | 
|                 .in(JkSketchLine::getSketchId,sketchList.stream().map(i->i.getId()).collect(Collectors.toList())); | 
|         List<JkSketchLine> jkSketchLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper); | 
|   | 
|         telecomLineCountVO.setCategoryNum(sketchList.size()); | 
|   | 
| //        telecomLineCountVO.setLineNum(sketchList.stream().map(i->i.getBeforeLineNum()).reduce(Constants.ZERO,Integer::sum)); | 
|         Integer lineNum = Constants.ZERO; | 
|         List<TelecomCategoryDataVO> telecomCategoryDataVOList = new ArrayList<>(); | 
|         for (JkSketch jkSketch:sketchList) { | 
|             TelecomCategoryDataVO telecomCategoryDataVO = new TelecomCategoryDataVO(); | 
|             telecomCategoryDataVO.setId(jkSketch.getCategoryId()); | 
|             telecomCategoryDataVO.setName(jkSketch.getCategoryName()); | 
|             telecomCategoryDataVO.setCustomerNum(jkSketch.getCustomerNum()); | 
|             List<JkSketchLine> childLineList = jkSketchLineList.stream().filter(i->Constants.equalsInteger(i.getSketchId(),jkSketch.getId())).collect(Collectors.toList()); | 
|             //优化前数据 | 
|             List<JkSketchLine> beforeList = childLineList.stream() | 
|                     .filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()); | 
|             //优化后数据 | 
|             List<JkSketchLine> afterList = childLineList.stream() | 
|                     .filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)&&Constants.equalsInteger(i.getIsdeleted(),Constants.ZERO)).collect(Collectors.toList()); | 
|   | 
|             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); | 
|                 telecomLineCountVO.setCustomerNum( | 
|                         telecomLineCountVO.getCustomerNum() + sketchLine.getMaxCustomer() | 
|                 ); | 
|             } | 
|             telecomCategoryDataVO.setTelecomLineDataVOList(telecomLineDataVOList); | 
|             telecomCategoryDataVOList.add(telecomCategoryDataVO); | 
|         } | 
|         telecomLineCountVO.setLineNum(lineNum); | 
|         telecomLineCountVO.setTelecomCategoryDataVOList(telecomCategoryDataVOList); | 
|         return telecomLineCountVO; | 
|     } | 
|   | 
|   | 
|   | 
|     @Override | 
|     public List<TelecomCategoryDataVO> getTelecomLineDistance(TelecomLineInfoDTO telecomLineInfoDTO){ | 
|         if(StringUtils.isBlank(telecomLineInfoDTO.getDateInfo())){ | 
|             telecomLineInfoDTO.setDateInfo(DateUtil.getDate(new Date(),"yyyy-MM-dd")); | 
|         } | 
|         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()); | 
|         List<JkSketch> sketchList = jkSketchMapper.selectJoinList(JkSketch.class,sketchMPJLambdaWrapper); | 
|         if(CollectionUtils.isEmpty(sketchList)){ | 
|             return new ArrayList<TelecomCategoryDataVO>(); | 
|         } | 
|         MPJLambdaWrapper<JkSketchLine> queryWrapper = new MPJLambdaWrapper<JkSketchLine>().selectAll(JkSketchLine.class ) | 
|                 .selectAs(Cars::getCode,JkSketchLine::getCarCode) | 
|                 .selectAs(Category::getName,JkSketchLine::getCategoryName) | 
|                 .selectAs(JkLine::getName,JkSketchLine::getLineName) | 
|                 .leftJoin(JkSketch.class,JkSketch::getId,JkSketchLine::getSketchId) | 
|                 .leftJoin(JkLine.class,JkLine::getId,JkSketchLine::getLineId) | 
|                 .leftJoin(Category.class,Category::getId,JkLine::getCategoryId ) | 
|                 .leftJoin(Cars.class,Cars::getId,JkLine::getCarId) | 
|                 .in(JkSketchLine::getSketchId,sketchList.stream().map(i->i.getId()).collect(Collectors.toList())); | 
|         List<JkSketchLine> jkSketchLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper); | 
|   | 
|         List<TelecomCategoryDataVO> telecomCategoryDataVOList = new ArrayList<>(); | 
|         for (JkSketch jkSketch:sketchList) { | 
|             TelecomCategoryDataVO telecomCategoryDataVO = new TelecomCategoryDataVO(); | 
|             telecomCategoryDataVO.setId(jkSketch.getCategoryId()); | 
|             telecomCategoryDataVO.setName(jkSketch.getCategoryName()); | 
|             //优化前数据 | 
|             List<JkSketchLine> beforeList = jkSketchLineList.stream() | 
|                     .filter(i->Constants.equalsInteger(i.getSketchId(),jkSketch.getId())&&Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()); | 
|             telecomCategoryDataVO.setDistance( | 
|                     beforeList.stream().map(i->i.getDistance()).reduce(Long.valueOf(0),Long::sum) | 
|             ); | 
|             if(Constants.equalsInteger(jkSketch.getOptStatus(),Constants.ZERO)){ | 
|                 telecomCategoryDataVO.setDistanceAfter(telecomCategoryDataVO.getDistance()); | 
|             }else{ | 
|                 //优化后数据 | 
|                 List<JkSketchLine> afterList = jkSketchLineList.stream() | 
|                         .filter(i->Constants.equalsInteger(i.getSketchId(),jkSketch.getId())&&Constants.equalsInteger(i.getType(),Constants.ONE)&&Constants.equalsInteger(i.getIsdeleted(),Constants.ZERO)).collect(Collectors.toList()); | 
|   | 
|                 Long distanceAfter = 0L; | 
|                 for (JkSketchLine jkSketchLine:afterList) { | 
|                         distanceAfter = distanceAfter + jkSketchLine.getDistance(); | 
|                 } | 
|                 telecomCategoryDataVO.setDistanceAfter(distanceAfter); | 
|   | 
|             } | 
|             telecomCategoryDataVOList.add(telecomCategoryDataVO); | 
|         } | 
|         return telecomCategoryDataVOList; | 
|     } | 
|   | 
|   | 
|     @Override | 
|     public List<TelecomLineDataVO> getTelecomLineInfo(TelecomLineInfoDTO telecomLineInfoDTO){ | 
|         if(StringUtils.isBlank(telecomLineInfoDTO.getDateInfo())){ | 
|             telecomLineInfoDTO.setDateInfo(DateUtil.getDate(new Date(),"yyyy-MM-dd")); | 
|         } | 
|         MPJLambdaWrapper<JkSketchLine> queryWrapper = new MPJLambdaWrapper<JkSketchLine>().selectAll(JkSketchLine.class ) | 
|                 .selectAs(Cars::getCode,JkSketchLine::getCarCode) | 
|                 .selectAs(Category::getName,JkSketchLine::getCategoryName) | 
|                 .selectAs(JkLine::getName,JkSketchLine::getLineName) | 
|                 .leftJoin(JkSketch.class,JkSketch::getId,JkSketchLine::getSketchId) | 
|                 .leftJoin(JkLine.class,JkLine::getId,JkSketchLine::getLineId) | 
|                 .leftJoin(Category.class,Category::getId,JkLine::getCategoryId ) | 
|                 .leftJoin(Cars.class,Cars::getId,JkLine::getCarId) | 
|                 .eq(JkSketchLine::getIsdeleted,Constants.ZERO) | 
|                 .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()); | 
|         List<JkSketchLine> returnLineList = jkSketchLineMapper.selectJoinList(JkSketchLine.class,queryWrapper); | 
|   | 
| //        //优化前数据 | 
| //        List<JkSketchLine> beforeList = jkSketchLineList.stream() | 
| //                .filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).collect(Collectors.toList()); | 
| // | 
| //        //优化后数据 | 
| //        List<JkSketchLine> afterList = jkSketchLineList.stream() | 
| //                .filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)&&Constants.equalsInteger(i.getIsdeleted(),Constants.ZERO)).collect(Collectors.toList()); | 
| // | 
| //        List<JkSketchLine> returnLineList = new ArrayList<>(); | 
| //        for (JkSketchLine jkSketchLine:beforeList) { | 
| //            List<JkSketchLine> afterSelectList = afterList.stream().filter(i->Constants.equalsInteger(i.getLineId(),jkSketchLine.getLineId())).collect(Collectors.toList()); | 
| //            if(afterSelectList.size()>Constants.ZERO){ | 
| //                returnLineList.add(afterList.get(Constants.ZERO)); | 
| //            }else{ | 
| //                returnLineList.add(jkSketchLine); | 
| //            } | 
| //        } | 
|         List<TelecomLineDataVO> dataVOList = new ArrayList<>(); | 
|         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(returnLineList)){ | 
|             //获取所有地图经纬度数据 | 
|             MPJLambdaWrapper<JkSketchCustomer> jkSketchCustomerMPJLambdaWrapper = new MPJLambdaWrapper<>(); | 
|             jkSketchCustomerMPJLambdaWrapper.selectAll(JkSketchCustomer.class ) | 
|                     .selectAs(JkCustomer::getName,JkSketchCustomer::getName) | 
|                     .selectAs(JkCustomer::getCode,JkSketchCustomer::getCode) | 
|                     .selectAs(JkCustomer::getStartDistance,JkSketchCustomer::getStartDistance) | 
|                     .selectAs(JkCustomer::getEndDistance,JkSketchCustomer::getEndDistance) | 
|                     .selectAs(JkCustomer::getLatitude,JkSketchCustomer::getLatitude) | 
|                     .selectAs(JkCustomer::getLongitude,JkSketchCustomer::getLongitude) | 
|                     .selectAs(JkCustomer::getStartSteps,JkSketchCustomer::getStartSteps) | 
|                     .selectAs(JkCustomer::getEndSteps,JkSketchCustomer::getEndSteps) | 
|                     .selectAs(JkCustomer::getLocation,JkSketchCustomer::getLocation) | 
|                     .leftJoin(JkCustomer.class,JkCustomer::getId,JkSketchCustomer::getCustomerId ) | 
|                     .eq( JkSketchCustomer::getIsdeleted,Constants.ZERO) | 
|                     .in( JkSketchCustomer::getSketchLineId,returnLineList.stream().map(i->i.getId()).collect(Collectors.toList())); | 
|   | 
|             List<JkSketchCustomer> allList =  jkSketchCustomerMapper.selectJoinList(JkSketchCustomer.class,jkSketchCustomerMPJLambdaWrapper); | 
|             BigDecimal cLatitude =new BigDecimal(0); | 
|             BigDecimal cLongitude =new BigDecimal(0); | 
|             String comLocation = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.COMPANY_LOCATION).getCode(); | 
|             try { | 
|                 String[] ss = comLocation.split(","); | 
|                 cLongitude = new BigDecimal(ss[0]); | 
|                 cLatitude =  new BigDecimal(ss[1]); | 
|             }catch (Exception e){ | 
|             } | 
|             for (JkSketchLine line:returnLineList) { | 
|                 TelecomLineDataVO telecomLineDataVO = new TelecomLineDataVO(); | 
|                 telecomLineDataVO.setId(line.getLineId()); | 
|                 telecomLineDataVO.setName(line.getLineName()); | 
|                 List<JkSketchCustomer> sketchCustomerList = allList.stream().filter(i->Constants.equalsInteger(i.getSketchLineId(),line.getId())).collect(Collectors.toList()); | 
|                 if(org.apache.commons.collections.CollectionUtils.isNotEmpty(sketchCustomerList)){ | 
|                     telecomLineDataVO.setNavigationList(this.dealLineCustomerInfo(cLatitude,cLongitude,comLocation,sketchCustomerList)); | 
|                 } | 
|                 dataVOList.add(telecomLineDataVO); | 
|             } | 
|         } | 
|         return dataVOList; | 
|     } | 
|      | 
|      | 
|      | 
|     public List<JkCustomerNavigation> dealLineCustomerInfo(BigDecimal cLatitude,BigDecimal cLongitude,String comLocation,List<JkSketchCustomer> allList){ | 
|         List<JkCustomerNavigation> list = new ArrayList<>(); | 
|         JkCustomerNavigation startmodel = new JkCustomerNavigation(); | 
|         startmodel.setStartId(-1); | 
|         startmodel.setName("园区"); | 
|         startmodel.setStartLatitude(cLatitude); | 
|         startmodel.setStartLogitude(cLongitude); | 
|         startmodel.setEndLatitude(allList.get(0).getLatitude()); | 
|         startmodel.setEndLogitude(allList.get(0).getLongitude()); | 
|         startmodel.setDistance(allList.get(0).getStartDistance()); | 
|         startmodel.setSteps(allList.get(0).getStartSteps()); | 
|         if(StringUtils.isBlank(startmodel.getSteps())){ | 
|             startmodel.setSteps(comLocation +";"+allList.get(0).getLongitude()+","+allList.get(0).getLatitude()); | 
|         } | 
|         list.add(startmodel); | 
|   | 
|         for (int i = 0; i < allList.size(); i++) { | 
|             if(allList.size() == i+1){ | 
|                 JkCustomerNavigation endmodel = new JkCustomerNavigation(); | 
|                 endmodel.setStartId(-1); | 
|                 endmodel.setLocation(allList.get(i).getLocation()); | 
|                 endmodel.setName(allList.get(i).getName()); | 
|                 endmodel.setSteps(allList.get(i).getEndSteps()); | 
|                 endmodel.setStartLatitude(allList.get(i).getLatitude()); | 
|                 endmodel.setStartLogitude(allList.get(i).getLongitude()); | 
|                 endmodel.setDistance(allList.get(0).getEndDistance()); | 
|                 endmodel.setEndLatitude(cLatitude); | 
|                 endmodel.setEndLogitude(cLongitude); | 
|                 if(StringUtils.isBlank(startmodel.getSteps())){ | 
|                     startmodel.setSteps(allList.get(i).getLongitude()+","+allList.get(i).getLatitude()+";"+comLocation); | 
|                 } | 
|                 list.add(endmodel); | 
|                 break; | 
|             } | 
|             JkSketchCustomer start = allList.get(i); | 
|             JkSketchCustomer end = allList.get(i+1); | 
|             JkCustomerNavigation tt = jkCustomerNavigationMapper.selectOne(new QueryWrapper<JkCustomerNavigation>().lambda() | 
|                     .eq(JkCustomerNavigation::getIsdeleted,Constants.ZERO) | 
|                     .eq(JkCustomerNavigation::getIdIndex, allList.get(i).getCustomerId()+"-"+ allList.get(i+1).getCustomerId()) | 
|                     .orderByDesc(JkCustomerNavigation::getId) | 
|                     .last("limit 1") | 
|             ); | 
|             if(tt==null){ | 
|                 //只有起止点 | 
|                 tt = new JkCustomerNavigation(); | 
|                 tt.setStartLatitude(start.getLatitude()); | 
|                 tt.setStartLogitude(start.getLongitude()); | 
|                 tt.setEndLatitude(end.getLatitude()); | 
|                 tt.setEndLogitude(end.getLongitude()); | 
|             } | 
|             tt.setLocation(allList.get(i).getLocation()); | 
|             tt.setName(allList.get(i).getName()); | 
|             if(StringUtils.isBlank(tt.getSteps())){ | 
|                 tt.setSteps(start.getLongitude()+","+end.getLatitude()+";"+end.getLongitude()+","+end.getLatitude()); | 
|             } | 
|             list.add(tt); | 
|         } | 
|         return list; | 
|   | 
|   | 
|     } | 
|   | 
| } |