|  |  | 
 |  |  | package com.doumee.service.business.impl; | 
 |  |  |  | 
 |  |  | 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.model.PageWrap; | 
 |  |  | import com.doumee.core.utils.Constants; | 
 |  |  | import com.doumee.core.utils.Utils; | 
 |  |  | import com.doumee.dao.admin.request.CategoryImport; | 
 |  |  | import com.doumee.dao.admin.request.FcodeImport; | 
 |  |  | import com.doumee.dao.admin.request.ShopImport; | 
 |  |  | import com.doumee.dao.admin.request.UpdateShopSortDTO; | 
 |  |  | import com.doumee.dao.business.ShopMapper; | 
 |  |  | import com.doumee.dao.business.CategorySegMapper; | 
 |  |  | import com.doumee.dao.business.MemberMapper; | 
 |  |  | import com.doumee.dao.business.SegmentsMapper; | 
 |  |  | import com.doumee.dao.business.UsersMapper; | 
 |  |  | import com.doumee.dao.business.join.ShopJoinMapper; | 
 |  |  | import com.doumee.dao.business.model.Member; | 
 |  |  | import com.doumee.dao.business.model.Shop; | 
 |  |  | import com.doumee.dao.business.model.*; | 
 |  |  | import com.doumee.dao.business.vo.ShopTree; | 
 |  |  | import com.doumee.dao.business.vo.ShopTreeVo; | 
 |  |  | import com.doumee.dao.system.model.SystemUser; | 
 |  |  | import com.doumee.dao.business.vo.UnitCodeVo; | 
 |  |  | import com.doumee.dao.web.reqeust.EditShopDTO; | 
 |  |  | import com.doumee.dao.web.reqeust.ShopQueryByLLDTO; | 
 |  |  | import com.doumee.service.business.ShopService; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | 
 |  |  | 
 |  |  | import com.github.yulichang.wrapper.MPJLambdaWrapper; | 
 |  |  | import org.apache.commons.lang3.StringUtils; | 
 |  |  | import org.apache.shiro.SecurityUtils; | 
 |  |  | import org.springframework.beans.BeanUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.data.redis.core.RedisTemplate; | 
 |  |  | import org.springframework.scheduling.annotation.Async; | 
 |  |  | 
 |  |  | import org.springframework.util.CollectionUtils; | 
 |  |  | import org.springframework.web.multipart.MultipartFile; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Objects; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.concurrent.Callable; | 
 |  |  | import java.util.concurrent.ExecutorService; | 
 |  |  | import java.util.concurrent.Executors; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 志邦组织信息表Service实现 | 
 |  |  | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | public class ShopServiceImpl implements ShopService { | 
 |  |  |  | 
 |  |  |     ExecutorService executor = Executors.newFixedThreadPool(1); | 
 |  |  |     @Autowired | 
 |  |  |     private RedisTemplate<String, Object> redisTemplate; | 
 |  |  |     @Autowired | 
 |  |  |     private ShopJoinMapper shopMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SegmentsMapper segmentsMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private CategorySegMapper categorySegMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private UsersMapper usersMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private SystemDictDataBiz systemDictDataBiz; | 
 |  |  |     @Autowired | 
 |  |  |     private MemberMapper memberMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Long create(Shop shop) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |         queryWrapper.apply(StringUtils.isNotBlank(pageWrap.getModel().getParentName()), | 
 |  |  |                     "(t1.name like '%"+pageWrap.getModel().getParentName()+"%' or t1.code like '%"+pageWrap.getModel().getParentName()+"%' )" ); | 
 |  |  |         queryWrapper.exists(StringUtils.isNotBlank(pageWrap.getModel().getSiteCode()), | 
 |  |  |                     "(select c.id from category_seg c where c.isdeleted=0 and (c.org_id=t.code or c.scode =t1.code ) limit 1)" ); | 
 |  |  |         for(PageWrap.SortData sortData: pageWrap.getSorts()) { | 
 |  |  |             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { | 
 |  |  |                 queryWrapper.orderByDesc(sortData.getProperty()); | 
 |  |  | 
 |  |  |                 queryWrapper.orderByAsc(sortData.getProperty()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return PageData.from(shopMapper.selectPage(page, queryWrapper)); | 
 |  |  |         PageData<Shop> pageData = PageData.from(shopMapper.selectPage(page, queryWrapper)); | 
 |  |  |         //查询经营范围信息 | 
 |  |  |         List<CategorySeg> categorySegAllList = categorySegMapper.selectList(new QueryWrapper<CategorySeg>().lambda() | 
 |  |  |                 .isNotNull(CategorySeg::getOrgId) | 
 |  |  |                 .eq(CategorySeg::getIsdeleted,Constants.ZERO)); | 
 |  |  |         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categorySegAllList)){ | 
 |  |  |             for (Shop shop:pageData.getRecords()) { | 
 |  |  |                 if(StringUtils.isBlank(shop.getOrgId())){ | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 List<CategorySeg> categorySegList = categorySegAllList.stream().filter(i->i.getOrgId().equals(shop.getOrgId())).collect(Collectors.toList()); | 
 |  |  |                 List<UnitCodeVo> unitCodeVoList =systemDictDataBiz.getUnitList(); | 
 |  |  |                 List<String> seqNameList = new ArrayList<>(); | 
 |  |  |                 for(CategorySeg model : categorySegList){ | 
 |  |  |                     String seqName = systemDictDataBiz.getUnitName(model.getUnitCode(),unitCodeVoList); | 
 |  |  |                     if(Objects.nonNull(seqName)){ | 
 |  |  |                         seqNameList.add(seqName); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 shop.setSeqNameList(seqNameList); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return pageData; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |         return shopMapper.selectCount(wrapper); | 
 |  |  |     } | 
 |  |  |     @Override | 
 |  |  | //    @Async | 
 |  |  |     @Transactional(rollbackFor = {BusinessException.class,Exception.class}) | 
 |  |  |     public String importFcodeBatch(MultipartFile file){ | 
 |  |  |         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP); | 
 |  |  | 
 |  |  |                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); | 
 |  |  |             } | 
 |  |  |             Date date =new Date(); | 
 |  |  |             List<Shop> updateShops = new ArrayList<>(); | 
 |  |  |             List<FcodeImport> finalDataList = dataList; | 
 |  |  |             Callable<String> task = () -> { | 
 |  |  |                 dealFcodeDataBiz(finalDataList,date,loginUserInfo); | 
 |  |  |                 return "异步任务完成"; | 
 |  |  |             }; | 
 |  |  |             executor.submit(task); | 
 |  |  |             return "导入成功"; | 
 |  |  |         }catch (BusinessException e){ | 
 |  |  |             throw e; | 
 |  |  |         }catch (Exception e){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void dealFcodeDataBiz(List<FcodeImport> dataList, Date date, LoginUserInfo loginUserInfo) { | 
 |  |  |         try { | 
 |  |  |             for(int i=0;i<dataList.size();i++){ | 
 |  |  |                 FcodeImport model = dataList.get(i); | 
 |  |  |                 if(StringUtils.isBlank(model.getOrgId())  ){ | 
 |  |  | 
 |  |  |                 shopMapper.updateById(shop); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return "导入成功"; | 
 |  |  |         }catch (BusinessException e){ | 
 |  |  |             throw e; | 
 |  |  |         }catch (Exception e){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
 |  |  |         }finally { | 
 |  |  |             executor.shutdown(); | 
 |  |  |             redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = {BusinessException.class,Exception.class}) | 
 |  |  |     public String importCategoryBatch(MultipartFile file){ | 
 |  |  |         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP); | 
 |  |  |         if(importing!=null && importing){ | 
 |  |  |             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入或者上下级重置任务正在执行中,请稍后再试!"); | 
 |  |  |         } | 
 |  |  |         redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_SHOP,true); | 
 |  |  |         try { | 
 |  |  |             LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); | 
 |  |  |             ExcelImporter ie = null; | 
 |  |  |             List<CategoryImport> dataList =null; | 
 |  |  |             try { | 
 |  |  |                 ie = new ExcelImporter(file,0,0); | 
 |  |  |                 dataList = ie.getDataList(CategoryImport.class,null); | 
 |  |  |             }  catch (Exception e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |             if(dataList == null || dataList.size() ==0){ | 
 |  |  |                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); | 
 |  |  |             } | 
 |  |  |             Date date =new Date(); | 
 |  |  |             List<CategoryImport> finalDataList = dataList; | 
 |  |  |             Callable<String> task = () -> { | 
 |  |  |                 dealCategoryDataBiz(finalDataList,date,loginUserInfo); | 
 |  |  |                 return "异步任务完成"; | 
 |  |  |             }; | 
 |  |  |             executor.submit(task); | 
 |  |  |             return "导入成功"; | 
 |  |  |         }catch (BusinessException e){ | 
 |  |  |             throw e; | 
 |  |  |         }catch (Exception e){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Async | 
 |  |  |     public void dealCategoryDataBiz(List<CategoryImport> dataList, Date date, LoginUserInfo loginUserInfo) { | 
 |  |  |         try { | 
 |  |  |             List<CategorySeg> categorySegList = new ArrayList<>(); | 
 |  |  |             List<Segments> segmentsList = new ArrayList<>(); | 
 |  |  |             Map<String,List<String>> siteCodes = new HashMap<>(); | 
 |  |  |             List<String> orgIdList = new ArrayList<>(); | 
 |  |  |             for(int i=0;i<dataList.size();i++){ | 
 |  |  |                 CategoryImport model = dataList.get(i); | 
 |  |  |                 if(StringUtils.isBlank(model.getOrgId())  ){ | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 orgIdList.add(model.getOrgId()); | 
 |  |  |                 dealSegmentData(date,model,loginUserInfo,segmentsList); | 
 |  |  |                 categorySegList.add(initInsertCategorySeg(date,model,loginUserInfo,siteCodes)); | 
 |  |  |             } | 
 |  |  |             if(orgIdList.size()>0){ | 
 |  |  |                 categorySegMapper.delete(new UpdateWrapper<CategorySeg>().lambda() .in(CategorySeg::getOrgId,orgIdList)); | 
 |  |  |             } | 
 |  |  |             if(siteCodes.size()>0){ | 
 |  |  |                 for(Map.Entry<String ,List<String>> entry : siteCodes.entrySet()){ | 
 |  |  |                     String key = entry.getKey(); | 
 |  |  |                     List<String> codes = entry.getValue(); | 
 |  |  |                     Shop ts = null; | 
 |  |  |                     String tcode =key.substring(2); | 
 |  |  |                     if(StringUtils.startsWith(key,"f_")){ | 
 |  |  |                         ts = shopMapper.selectOne(new QueryWrapper<Shop>().lambda() | 
 |  |  |                                 .eq(Shop::getCode,tcode) | 
 |  |  |                                 .eq(Shop::getSecondType,Constants.TWO )); | 
 |  |  |                     } | 
 |  |  |                     if(StringUtils.startsWith(key,"f_")){ | 
 |  |  |                         ts = shopMapper.selectOne(new QueryWrapper<Shop>().lambda() | 
 |  |  |                                 .eq(Shop::getCode,tcode) | 
 |  |  |                                 .eq(Shop::getSecondType,Constants.ONE )); | 
 |  |  |                     } | 
 |  |  |                     if(ts!=null){ | 
 |  |  |                         ts.setSiteCode(String.join("; ", codes) +";"); | 
 |  |  |                         shopMapper.updateById(ts); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if(categorySegList.size()>0){ | 
 |  |  |                 int temp = 0; | 
 |  |  |                 while(temp < categorySegList.size()){ | 
 |  |  |                     int index; | 
 |  |  |                     if(temp + 500 <= categorySegList.size()){ | 
 |  |  |                         index = temp+500; | 
 |  |  |                     }else{ | 
 |  |  |                         index = categorySegList.size(); | 
 |  |  |                     } | 
 |  |  |                     categorySegMapper.insert(categorySegList.subList(temp,index)); | 
 |  |  |                     temp = index; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if(segmentsList.size()>0){ | 
 |  |  |                 int temp = 0; | 
 |  |  |                 while(temp < segmentsList.size()){ | 
 |  |  |                     int index; | 
 |  |  |                     if(temp + 500 <= segmentsList.size()){ | 
 |  |  |                         index = temp+500; | 
 |  |  |                     }else{ | 
 |  |  |                         index = segmentsList.size(); | 
 |  |  |                     } | 
 |  |  |                     segmentsMapper.insert(segmentsList.subList(temp,index)); | 
 |  |  |                     temp = index; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }catch (BusinessException e){ | 
 |  |  |             throw e; | 
 |  |  |         }catch (Exception e){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
 |  |  |         }finally { | 
 |  |  |             executor.shutdown(); // 关闭ExecutorService | 
 |  |  |             redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void dealSegmentData(Date date, CategoryImport model, LoginUserInfo loginUserInfo, List<Segments> segmentsList) { | 
 |  |  |  | 
 |  |  |         if(StringUtils.isNotBlank(model.getSegId())){ | 
 |  |  |             //如果战区不为空 | 
 |  |  |             if(newSegment(model.getSegId(),Constants.ZERO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda() | 
 |  |  |                     .eq(Segments::getSegmentId,model.getSegId()) | 
 |  |  |                     .eq(Segments::getUnitCode,model.getUnitCode()) | 
 |  |  |                     .eq(Segments::getType,Constants.ZERO)) ==0){ | 
 |  |  |                 segmentsList.add(initSegmentData(model,date,loginUserInfo,Constants.ZERO)); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if(StringUtils.isNotBlank(model.getSegId2())){ | 
 |  |  |             //如果省区不为空 | 
 |  |  |             if(newSegment(model.getSegId2(),Constants.ONE,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda() | 
 |  |  |                     .eq(Segments::getSegmentId,model.getSegId2()) | 
 |  |  |                     .eq(Segments::getParentId,model.getSegId()) | 
 |  |  |                     .eq(Segments::getUnitCode,model.getUnitCode()) | 
 |  |  |                     .eq(Segments::getType,Constants.ONE)) ==0){ | 
 |  |  |                 segmentsList.add(initSegmentData(model,date,loginUserInfo,Constants.ONE)); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if(StringUtils.isNotBlank(model.getSegId3())){ | 
 |  |  |             //如果片区不为空 | 
 |  |  |             if(newSegment(model.getSegId3(),Constants.TWO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda() | 
 |  |  |                     .eq(Segments::getSegmentId,model.getSegId3()) | 
 |  |  |                     .eq(Segments::getUnitCode,model.getUnitCode()) | 
 |  |  |                     .eq(Segments::getParentId,model.getSegId2()) | 
 |  |  |                     .eq(Segments::getType,Constants.TWO)) ==0){ | 
 |  |  |                 segmentsList.add(initSegmentData(model,date,loginUserInfo,Constants.TWO)); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private boolean newSegment(String segId2, int one, List<Segments> segmentsList) { | 
 |  |  |         for(Segments s : segmentsList){ | 
 |  |  |             if(StringUtils.equals(s.getSegmentId(),segId2) && Constants.equalsInteger(one,s.getType())){ | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Segments initSegmentData(CategoryImport model, Date date, LoginUserInfo loginUserInfo, int type) { | 
 |  |  |         Segments data = new Segments(); | 
 |  |  |         data.setCreateDate(date); | 
 |  |  |         data.setEditDate(date); | 
 |  |  |         data.setCreator(loginUserInfo.getId()); | 
 |  |  |         data.setEditor(loginUserInfo.getId()); | 
 |  |  |         data.setIsdeleted(Constants.ZERO); | 
 |  |  |         data.setStatus(Constants.ZERO); | 
 |  |  |         data.setUnitCode(model.getUnitCode()); | 
 |  |  |         data.setType(type); | 
 |  |  |         if(type ==Constants.ZERO){ | 
 |  |  |             data.setName(model.getSegName()); | 
 |  |  |             data.setSegmentId(model.getSegId()); | 
 |  |  |             data.setParentId(null); | 
 |  |  |             data.setRemark(model.getSegName()); | 
 |  |  |         }else if(type ==Constants.ONE){ | 
 |  |  |             data.setName(model.getSegName2()); | 
 |  |  |             data.setSegmentId(model.getSegId2()); | 
 |  |  |             data.setParentId(model.getSegId()); | 
 |  |  |             data.setRemark(model.getSegName()+"/"+model.getSegName2()); | 
 |  |  |         }else{ | 
 |  |  |             data.setName(model.getSegName3()); | 
 |  |  |             data.setSegmentId(model.getSegId3()); | 
 |  |  |             data.setParentId(model.getSegId2()); | 
 |  |  |             data.setRemark(model.getSegName()+"/"+model.getSegName2()+"/"+model.getSegName3()); | 
 |  |  |         } | 
 |  |  |         return data; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private CategorySeg initInsertCategorySeg(Date date, CategoryImport model, LoginUserInfo loginUserInfo,Map<String,List<String>> siteCodes) { | 
 |  |  |         CategorySeg data = new CategorySeg(); | 
 |  |  |         data.setCreateDate(date); | 
 |  |  |         data.setEditDate(date); | 
 |  |  |         data.setCreator(loginUserInfo.getId()); | 
 |  |  |         data.setEditor(loginUserInfo.getId()); | 
 |  |  |         data.setIsdeleted(Constants.ZERO); | 
 |  |  |         data.setOrgId(model.getOrgId()); | 
 |  |  |         data.setSegId(model.getSegId()); | 
 |  |  |         data.setSegId2(model.getSegId2()); | 
 |  |  |         data.setSegId3(model.getSegId3()); | 
 |  |  |         data.setSegName(model.getSegName()); | 
 |  |  |         data.setSegName2(model.getSegName2()); | 
 |  |  |         data.setSegName3(model.getSegName3()); | 
 |  |  |         data.setShipToAddress(model.getShipToAddress()); | 
 |  |  |         data.setShipToPhone(model.getShipToPhone()); | 
 |  |  |         data.setShipToPerson(model.getShipToPerson()); | 
 |  |  |         data.setBrandId(model.getBrandId()); | 
 |  |  |         data.setUnitCode(model.getUnitCode()); | 
 |  |  |         data.setSiteCode(model.getSiteCode()); | 
 |  |  |         data.setScode(model.getScode()); | 
 |  |  |         dealSiteCode(model,siteCodes); | 
 |  |  |  | 
 |  |  |         return data; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void dealSiteCode(CategoryImport model, Map<String, List<String>> siteCodes) { | 
 |  |  |         List<String> tList = siteCodes.get(model.getOrgId()); | 
 |  |  |         if(tList == null){ | 
 |  |  |             tList = new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if(isNewSiteCode(model.getSiteCode(),tList)){ | 
 |  |  |             tList.add(model.getSiteCode()); | 
 |  |  |             siteCodes.put("f_"+model.getOrgId(),tList); | 
 |  |  |         } | 
 |  |  |         tList = siteCodes.get(model.getScode()); | 
 |  |  |         if(tList == null){ | 
 |  |  |             tList = new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if(isNewSiteCode(model.getSiteCode(),tList)){ | 
 |  |  |             tList.add(model.getSiteCode()); | 
 |  |  |             siteCodes.put("s_"+model.getScode(),tList); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private boolean isNewSiteCode(String siteCode, List<String> tList) { | 
 |  |  |         if(tList!=null){ | 
 |  |  |             for(String s :tList){ | 
 |  |  |                 if(StringUtils.equals(s,siteCode)){ | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return  true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | //    @Async | 
 |  |  |     @Transactional(rollbackFor = {BusinessException.class,Exception.class}) | 
 |  |  |     public String importBatch(MultipartFile file){ | 
 |  |  |         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP); | 
 |  |  | 
 |  |  |             if(dataList == null || dataList.size() ==0){ | 
 |  |  |                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); | 
 |  |  |             } | 
 |  |  |             Date date =new Date(); | 
 |  |  |             List<ShopImport> finalDataList = dataList; | 
 |  |  |             Callable<String> task = () -> { | 
 |  |  |                 dealShopDataBiz(finalDataList,date,loginUserInfo); | 
 |  |  |                 return "异步任务完成"; | 
 |  |  |             }; | 
 |  |  |             executor.submit(task); | 
 |  |  |  | 
 |  |  |             return "导入成功"; | 
 |  |  |         }catch (BusinessException e){ | 
 |  |  |             throw e; | 
 |  |  |         }catch (Exception e){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void dealShopDataBiz(List<ShopImport> dataList, Date date, LoginUserInfo loginUserInfo) { | 
 |  |  |         try { | 
 |  |  |             List<Shop> list =  shopMapper.selectJoinList(Shop.class,new MPJLambdaWrapper<Shop>() | 
 |  |  |                     .selectAll(Shop.class) | 
 |  |  |             ); | 
 |  |  |             List<Shop> insertShops = new ArrayList<>(); | 
 |  |  |             Date date =new Date(); | 
 |  |  |             List<Shop> updateShops = new ArrayList<>(); | 
 |  |  |             for(int i=0;i<dataList.size();i++){ | 
 |  |  |                 ShopImport model = dataList.get(i); | 
 |  |  | 
 |  |  |                     shopMapper.updateById(s); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return "导入成功"; | 
 |  |  |         }catch (BusinessException e){ | 
 |  |  |             throw e; | 
 |  |  |         }catch (Exception e){ | 
 |  |  |             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
 |  |  |         }finally { | 
 |  |  |             executor.shutdown(); | 
 |  |  |             redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |                     s.setIdPath(s.getId()+"/"); | 
 |  |  |                     shopMapper.updateById(s); | 
 |  |  |                 }else{ | 
 |  |  |                     String idPath = StringUtils.defaultString(parent.getIdPath(),"")+ shop.getId()+"/"; | 
 |  |  |                     String namePath =StringUtils.defaultString(parent.getNamePath(),"")+"/"+shop.getName(); | 
 |  |  |                     s.setParentId(parent.getId()); | 
 |  |  |                     s.setNamePath(parent.getNamePath()+"/"+s.getName()); | 
 |  |  |                     s.setIdPath(parent.getIdPath()+s.getId()+"/"); | 
 |  |  |                     shopMapper.updateById(s); | 
 |  |  |                     s.setNamePath(namePath); | 
 |  |  |                     s.setIdPath(idPath); | 
 |  |  |                     if(!(Constants.equalsLong(parent.getId(),shop.getParentId()) | 
 |  |  |                             && StringUtils.equals(idPath,shop.getIdPath()) | 
 |  |  |                             &&StringUtils.equals(namePath,shop.getNamePath())) ){ | 
 |  |  |                         shopMapper.updateById(s); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 if(shop.getChildList()!=null && shop.getChildList().size()>0){ | 
 |  |  |                     updateNamePath(s,shop.getChildList()); | 
 |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public PageData<Shop> queryShopByLL(PageWrap<Shop> pageWrap) { | 
 |  |  |         if(Objects.isNull(pageWrap.getModel()) | 
 |  |  |                 || Objects.isNull(pageWrap.getModel().getLatitude()) | 
 |  |  |                 || Objects.isNull(pageWrap.getModel().getLongitude())){ | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         IPage<Shop> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
 |  |  |         MPJLambdaWrapper<Shop> queryWrapper = new MPJLambdaWrapper<>(); | 
 |  |  |         queryWrapper.select("ID,NAME,ADDRESS,PROVINCE_NAME,CITY_NAME,AREA_NAME,TOWN,AREA_NAME,LEGAL_PHONE," + | 
 |  |  |                         " CONVERT (ST_Distance_Sphere (point ("+pageWrap.getModel().getLongitude()+", "+pageWrap.getModel().getLatitude()+" ), point ( LONGITUDE, LATITUDE )) /1000,decimal(15,2)) as distance ") | 
 |  |  |                 .eq("isdeleted",Constants.ZERO) | 
 |  |  |                 .isNotNull("LATITUDE") | 
 |  |  |                 .isNotNull("LONGITUDE") | 
 |  |  |                 .eq("ATTRIBUTE",Constants.ONE) | 
 |  |  |                 .orderByAsc(" distance "); | 
 |  |  |         Utils.MP.blankToNull(pageWrap.getModel()); | 
 |  |  |         PageData<Shop> pageData = PageData.from(shopMapper.selectPage(page, queryWrapper)); | 
 |  |  |         String prefix = StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()) + | 
 |  |  |         StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.USERS_FILE).getCode()); | 
 |  |  |         for (Shop shop:pageData.getRecords()) { | 
 |  |  |             //查询门店下导购数据 | 
 |  |  |             List<Users> usersList =usersMapper.selectList(new QueryWrapper<Users>().lambda().eq(Users::getDepartmentId,shop.getId()) | 
 |  |  |                     .eq(Users::getIsdeleted,Constants.ZERO) | 
 |  |  |                     .eq(Users::getStatus,Constants.ONE) | 
 |  |  |                     .eq(Users::getType,Constants.ZERO) | 
 |  |  |             ); | 
 |  |  |             for (Users users:usersList) { | 
 |  |  |                 if(StringUtils.isNotBlank(users.getImgurl())){ | 
 |  |  |                     users.setImgurlFull(prefix + users.getImgurl()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             shop.setUsersList(usersList); | 
 |  |  |         } | 
 |  |  |         return pageData; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Shop shopDetail(Long id,Long memberId) { | 
 |  |  |         QueryWrapper<Shop> queryWrapper = new QueryWrapper<Shop>(); | 
 |  |  |         if(Objects.nonNull(memberId)){ | 
 |  |  |             Member member = memberMapper.selectById(memberId); | 
 |  |  |             //如果人员没有经纬度信息,则不查询距离 | 
 |  |  |             if(Objects.nonNull(member)&&Objects.nonNull(member.getLatitude())&&Objects.nonNull(member.getLongitude())){ | 
 |  |  |                 queryWrapper.select("ID,NAME,ADDRESS,PROVINCE_NAME,CITY_NAME,AREA_NAME,TOWN,AREA_NAME,LEGAL_PHONE," + | 
 |  |  |                         " CONVERT (ST_Distance_Sphere (point ("+member.getLongitude()+", "+member.getLatitude()+" ), point ( LONGITUDE, LATITUDE )) /1000,decimal(15,2)) as distance "); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         queryWrapper.eq("id",id); | 
 |  |  |         Shop shop = shopMapper.selectOne(queryWrapper); | 
 |  |  |         if(Objects.isNull(shop)){ | 
 |  |  |             throw new BusinessException(ResponseStatus.DATA_EMPTY); | 
 |  |  |         } | 
 |  |  |         String prefix = StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()) + | 
 |  |  |                 StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.USERS_FILE).getCode()); | 
 |  |  |         List<Users> usersList =usersMapper.selectList(new QueryWrapper<Users>().lambda().eq(Users::getDepartmentId,shop.getId()) | 
 |  |  |                 .eq(Users::getIsdeleted,Constants.ZERO) | 
 |  |  |                 .eq(Users::getStatus,Constants.ONE) | 
 |  |  |                 .eq(Users::getType,Constants.ZERO) | 
 |  |  |         ); | 
 |  |  |         for (Users users:usersList) { | 
 |  |  |             if(StringUtils.isNotBlank(users.getImgurl())){ | 
 |  |  |                 users.setImgurlFull(prefix + users.getImgurl()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         shop.setUsersList(usersList); | 
 |  |  |         //查询经营范围信息 | 
 |  |  |         List<CategorySeg> categorySegList = categorySegMapper.selectList(new QueryWrapper<CategorySeg>().lambda().eq(CategorySeg::getOrgId,shop.getOrgId()).eq(CategorySeg::getIsdeleted,Constants.ZERO)); | 
 |  |  |         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categorySegList)){ | 
 |  |  |             List<UnitCodeVo> unitCodeVoList =systemDictDataBiz.getUnitList(); | 
 |  |  |             List<String> seqNameList = new ArrayList<>(); | 
 |  |  |             for(CategorySeg model : categorySegList){ | 
 |  |  |                 String seqName = systemDictDataBiz.getUnitName(model.getUnitCode(),unitCodeVoList); | 
 |  |  |                 if(Objects.nonNull(seqName)){ | 
 |  |  |                     seqNameList.add(seqName); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             shop.setSeqNameList(seqNameList); | 
 |  |  |         } | 
 |  |  |         return shop; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void updShop(EditShopDTO editShopDTO) { | 
 |  |  |         if(Objects.isNull(editShopDTO) | 
 |  |  |         || Objects.isNull(editShopDTO.getId())){ | 
 |  |  |             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
 |  |  |         } | 
 |  |  |         Shop shop = shopMapper.selectById(editShopDTO.getId()); | 
 |  |  |         if(Objects.isNull(shop)){ | 
 |  |  |             throw new BusinessException(ResponseStatus.DATA_EMPTY); | 
 |  |  |         } | 
 |  |  |         Shop updShop = new Shop(); | 
 |  |  |         BeanUtils.copyProperties(editShopDTO,updShop); | 
 |  |  |         shopMapper.updateById(updShop); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |