| 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.LoginUserInfo; | 
| import com.doumee.core.model.PageData; | 
| 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.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.*; | 
| import com.doumee.dao.business.vo.ShopTree; | 
| import com.doumee.dao.business.vo.ShopTreeVo; | 
| 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.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| 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.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
| import org.springframework.util.CollectionUtils; | 
| import org.springframework.web.multipart.MultipartFile; | 
|   | 
| import java.math.BigDecimal; | 
| import java.util.*; | 
| import java.util.concurrent.Callable; | 
| import java.util.concurrent.ExecutorService; | 
| import java.util.concurrent.Executors; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * 志邦组织信息表Service实现 | 
|  * @author 江蹄蹄 | 
|  * @date 2024/07/04 14:40 | 
|  */ | 
| @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) { | 
|         shopMapper.insert(shop); | 
|         return shop.getId(); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteById(Long id) { | 
|         shopMapper.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public void delete(Shop shop) { | 
|         UpdateWrapper<Shop> deleteWrapper = new UpdateWrapper<>(shop); | 
|         shopMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<Long> ids) { | 
|         if (CollectionUtils.isEmpty(ids)) { | 
|             return; | 
|         } | 
|         shopMapper.deleteBatchIds(ids); | 
|     } | 
|   | 
|     @Override | 
|     public void updateById(Shop shop) { | 
|         shopMapper.updateById(shop); | 
|         usersMapper.update(new UpdateWrapper<Users>().lambda() | 
|                 .set(Users::getCardImg,null) | 
|                 .isNotNull(Users::getCardImg) | 
|                 .eq(Users::getDepartmentId,shop.getId()) | 
|         ); | 
|     } | 
|   | 
|     @Override | 
|     public void updateByIdInBatch(List<Shop> shops) { | 
|         if (CollectionUtils.isEmpty(shops)) { | 
|             return; | 
|         } | 
|         for (Shop shop: shops) { | 
|             this.updateById(shop); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public Shop findById(Long id) { | 
|         return shopMapper.selectById(id); | 
|     } | 
|   | 
|     @Override | 
|     public Shop findOne(Shop shop) { | 
|         QueryWrapper<Shop> wrapper = new QueryWrapper<>(shop); | 
|         return shopMapper.selectOne(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<Shop> findList(Shop shop) { | 
|         QueryWrapper<Shop> wrapper = new QueryWrapper<>(shop); | 
|         return shopMapper.selectList(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<Shop> listByParent(String piamId) { | 
|         QueryWrapper<Shop> wrapper = new QueryWrapper<>(); | 
|         wrapper .select("shop.*,(select count(b.id) from shop b where b.isdeleted=0 and b.parent_iam_id = shop.org_id) as childNum") | 
|                 .lambda() | 
|                 .eq(StringUtils.isNotBlank(piamId),Shop::getParentIamId,piamId) | 
|                 .isNull(StringUtils.isBlank(piamId),Shop::getParentIamId) | 
| //                .eq(Shop::getIsdeleted,Constants.ZERO) | 
|                 .orderByAsc(Shop::getOrderNum); | 
|         List<Shop> list = shopMapper.selectList(wrapper); | 
|         if(list!=null){ | 
|             for (Shop shop :list){ | 
|                 shop.setIsLeaf(shop.getChildNum()<=0); | 
|                 shop.setHasChildren(shop.getChildNum()>0); | 
| //                shop.setChildList(shopMapper.selectList(new QueryWrapper<Shop>().lambda().eq(Shop::getParentIamId,shop.getOrgId()))); | 
|             } | 
|         } | 
|         return  list; | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public PageData<Shop> findPage(PageWrap<Shop> pageWrap) { | 
|         IPage<Shop> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
|         MPJLambdaWrapper<Shop> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.selectAll(Shop.class); | 
|         queryWrapper.leftJoin(" shop t1 on t1.org_id = t.parent_iam_id"); | 
|         Utils.MP.blankToNull(pageWrap.getModel()); | 
|         if (pageWrap.getModel().getId() != null) { | 
|             queryWrapper.eq(Shop::getId, pageWrap.getModel().getId()); | 
|         } | 
|         if (pageWrap.getModel().getCreator() != null) { | 
|             queryWrapper.eq(Shop::getCreator, pageWrap.getModel().getCreator()); | 
|         } | 
|         if (pageWrap.getModel().getCreateDate() != null) { | 
|             queryWrapper.ge(Shop::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); | 
|             queryWrapper.le(Shop::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); | 
|         } | 
|         if (pageWrap.getModel().getEditor() != null) { | 
|             queryWrapper.eq(Shop::getEditor, pageWrap.getModel().getEditor()); | 
|         } | 
|         if (pageWrap.getModel().getEditDate() != null) { | 
|             queryWrapper.ge(Shop::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); | 
|             queryWrapper.le(Shop::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); | 
|         } | 
|         if (pageWrap.getModel().getIsdeleted() != null) { | 
|             queryWrapper.eq(Shop::getIsdeleted, pageWrap.getModel().getIsdeleted()); | 
|         } | 
|         if (pageWrap.getModel().getRemark() != null) { | 
|             queryWrapper.eq(Shop::getRemark, pageWrap.getModel().getRemark()); | 
|         } | 
|         if (pageWrap.getModel().getOrgId() != null) { | 
|             queryWrapper.eq(Shop::getOrgId, pageWrap.getModel().getOrgId()); | 
|         } | 
|         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Shop::getName, pageWrap.getModel().getName()); | 
|         if (pageWrap.getModel().getOrgOldId() != null) { | 
|             queryWrapper.eq(Shop::getOrgOldId, pageWrap.getModel().getOrgOldId()); | 
|         } | 
|         if (pageWrap.getModel().getParentId() != null) { | 
|             queryWrapper.eq(Shop::getParentId, pageWrap.getModel().getParentId()); | 
|         } | 
|         if (pageWrap.getModel().getStatus() != null) { | 
|             queryWrapper.eq(Shop::getStatus, pageWrap.getModel().getStatus()); | 
|         } | 
|         if (pageWrap.getModel().getOrderNum() != null) { | 
|             queryWrapper.eq(Shop::getOrderNum, pageWrap.getModel().getOrderNum()); | 
|         } | 
|         if (pageWrap.getModel().getSourceCode() != null) { | 
|             queryWrapper.eq(Shop::getSourceCode, pageWrap.getModel().getSourceCode()); | 
|         } | 
|         if (pageWrap.getModel().getCode() != null) { | 
|             queryWrapper.eq(Shop::getCode, pageWrap.getModel().getCode()); | 
|         } | 
|         if (pageWrap.getModel().getType() != null) { | 
|             queryWrapper.eq(Shop::getType, pageWrap.getModel().getType()); | 
|         } | 
|         if (pageWrap.getModel().getAttribute() != null) { | 
|             queryWrapper.eq(Shop::getAttribute, pageWrap.getModel().getAttribute()); | 
|         } | 
|         if (pageWrap.getModel().getWeixinId() != null) { | 
|             queryWrapper.eq(Shop::getWeixinId, pageWrap.getModel().getWeixinId()); | 
|         } | 
|         if (pageWrap.getModel().getDingdingId() != null) { | 
|             queryWrapper.eq(Shop::getDingdingId, pageWrap.getModel().getDingdingId()); | 
|         } | 
|         if (pageWrap.getModel().getSyncDate() != null) { | 
|             queryWrapper.ge(Shop::getSyncDate, Utils.Date.getStart(pageWrap.getModel().getSyncDate())); | 
|             queryWrapper.le(Shop::getSyncDate, Utils.Date.getEnd(pageWrap.getModel().getSyncDate())); | 
|         } | 
|         if (pageWrap.getModel().getSyncInfo() != null) { | 
|             queryWrapper.eq(Shop::getSyncInfo, pageWrap.getModel().getSyncInfo()); | 
|         } | 
|         if (pageWrap.getModel().getFcode() != null) { | 
|             queryWrapper.eq(Shop::getFcode, pageWrap.getModel().getFcode()); | 
|         } | 
|         if (pageWrap.getModel().getScode() != null) { | 
|             queryWrapper.eq(Shop::getScode, pageWrap.getModel().getScode()); | 
|         } | 
|         if (pageWrap.getModel().getZcode() != null) { | 
|             queryWrapper.eq(Shop::getZcode, pageWrap.getModel().getZcode()); | 
|         } | 
|         if (pageWrap.getModel().getGlCode() != null) { | 
|             queryWrapper.eq(Shop::getGlCode, pageWrap.getModel().getGlCode()); | 
|         } | 
|         if (pageWrap.getModel().getGlName() != null) { | 
|             queryWrapper.eq(Shop::getGlName, pageWrap.getModel().getGlName()); | 
|         } | 
|             queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCountry()),Shop::getCountry, pageWrap.getModel().getCountry()); | 
|         if (pageWrap.getModel().getProvinceCode() != null) { | 
|             queryWrapper.eq(Shop::getProvinceCode, pageWrap.getModel().getProvinceCode()); | 
|         } | 
|             queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getProvinceName()),Shop::getProvinceName, pageWrap.getModel().getProvinceName()); | 
|         if (pageWrap.getModel().getCityCode() != null) { | 
|             queryWrapper.eq(Shop::getCityCode, pageWrap.getModel().getCityCode()); | 
|         } | 
|             queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCityName()),Shop::getCityName, pageWrap.getModel().getCityName()); | 
|         if (pageWrap.getModel().getAreaCode() != null) { | 
|             queryWrapper.eq(Shop::getAreaCode, pageWrap.getModel().getAreaCode()); | 
|         } | 
|             queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getAreaName()),Shop::getAreaName, pageWrap.getModel().getAreaName()); | 
|         if (pageWrap.getModel().getUnitCode() != null) { | 
|             queryWrapper.eq(Shop::getUnitCode, pageWrap.getModel().getUnitCode()); | 
|         } | 
|         if (pageWrap.getModel().getSecondType() != null) { | 
|             queryWrapper.eq(Shop::getSecondType, pageWrap.getModel().getSecondType()); | 
|         } | 
|         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()); | 
|             } else { | 
|                 queryWrapper.orderByAsc(sortData.getProperty()); | 
|             } | 
|         } | 
|         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 | 
|     public long count(Shop shop) { | 
|         QueryWrapper<Shop> wrapper = new QueryWrapper<>(shop); | 
|         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); | 
|         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<FcodeImport> dataList =null; | 
|             try { | 
|                 ie = new ExcelImporter(file,0,0); | 
|                 dataList = ie.getDataList(FcodeImport.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<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())  ){ | 
|                     continue; | 
|                 } | 
|                 Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getOrgId,model.getOrgId())); | 
|                 if(shop == null){ | 
|                     continue; | 
|                 } | 
|                 shop.setCountry(model.getCountry()); | 
|                 shop.setProvinceCode(model.getProvinceCode()); | 
|                 shop.setProvinceName(model.getProvinceName()); | 
|                 shop.setCityCode(model.getCityCode()); | 
|                 shop.setCityName(model.getCityName()); | 
|                 shop.setTown(model.getTown()); | 
|                 shop.setEditDate(date); | 
|                 shop.setEditor(loginUserInfo.getId()); | 
|                 shop.setAreaCode(model.getAreaCode()); | 
|                 shop.setAreaName(model.getAreaName()); | 
|                 shop.setRegAddr(model.getRegAddr()); | 
|                 shop.setLegalPhone(model.getLegalPhone()); | 
|                 shop.setLegalIdcode(model.getLegalIdcode()); | 
|                 shop.setLegalName(model.getLegalName()); | 
|                 shop.setFcode(model.getFcode()); | 
|                 shop.setScode(model.getScode()); | 
|                 shop.setTaxRegCode(model.getTaxRegCode()); | 
|                 shopMapper.updateById(shop); | 
|             } | 
|   | 
|         }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(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<ShopImport> dataList =null; | 
|             try { | 
|                 ie = new ExcelImporter(file,1,0); | 
|                 dataList = ie.getDataList(ShopImport.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<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<>(); | 
|             List<Shop> updateShops = new ArrayList<>(); | 
|             for(int i=0;i<dataList.size();i++){ | 
|                 ShopImport model = dataList.get(i); | 
|                 if(StringUtils.isBlank(model.getName()) | 
|                         &&StringUtils.isBlank(model.getCode()) ){ | 
|                     continue; | 
|                 } | 
|                 Shop shop = checkModelParam(model,insertShops,updateShops,i,loginUserInfo,list,date); | 
|             } | 
|             if(insertShops .size() >0){ | 
|                 int temp = 0; | 
|                 while(temp < insertShops.size()){ | 
|                     int index; | 
|                     if(temp + 500 <= insertShops.size()){ | 
|                         index = temp+500; | 
|                     }else{ | 
|                         index = insertShops.size(); | 
|                     } | 
|                     shopMapper.insert(insertShops.subList(temp,index)); | 
|                     temp = index; | 
|                 } | 
|             } | 
|             if(updateShops .size() >0){ | 
|                 for(Shop s : updateShops){ | 
|                     //遍历更新数据 | 
|                     shopMapper.updateById(s); | 
|                 } | 
|             } | 
|         }catch (BusinessException e){ | 
|             throw e; | 
|         }catch (Exception e){ | 
|             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); | 
|         }finally { | 
|             executor.shutdown(); | 
|             redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP); | 
|         } | 
|     } | 
|   | 
|   | 
|     private Shop checkModelParam(ShopImport model, List<Shop> newList, List<Shop> updateList, int index, LoginUserInfo loginUserInfo | 
|             , List<Shop> list,Date date) { | 
|         if(StringUtils.isBlank(model.getOrgId())){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行【组织编码】信息不完整,请检查表格内容!"); | 
|         } | 
|         if(StringUtils.isBlank(model.getName())){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行【组织名称】信息不完整,请检查表格内容!"); | 
|         } | 
|         if( Constants.formatIntegerNum(model.getType()) <1 || Constants.formatIntegerNum(model.getType()) >3 ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行【组织一级类型】信息不正确,请填写1-5正确的类型值,请检查表格内容!"); | 
|         } | 
|         if( model.getSecondType()!=null && (Constants.formatIntegerNum(model.getSecondType()) <1 || Constants.formatIntegerNum(model.getSecondType()) >5) ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行【组织二级类型】信息不正确,请填写1-5正确的类型值,请检查表格内容!"); | 
|         } | 
|         if( Constants.formatIntegerNum(model.getType()) <1 || Constants.formatIntegerNum(model.getType()) >5 ){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行【组织类型】信息不正确,请填写1-5正确的类型值,请检查表格内容!"); | 
|         } | 
|         if( model.getAttribute() !=null && (Constants.formatIntegerNum(model.getAttribute()) <1 || Constants.formatIntegerNum(model.getAttribute()) >5 )){ | 
|             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+(index+3)+"行【组织属性】信息不正确,请填写1-5正确的属性值,请检查表格内容!"); | 
|         } | 
|         Shop shop = getShopByOrgID(model.getOrgId(),list); | 
|         if(shop == null){ | 
|             shop = new Shop(); | 
|             shop.setCreator(loginUserInfo.getId()); | 
|             shop.setCreateDate(date); | 
|             shop.setEditor(loginUserInfo.getId()); | 
|             shop.setEditDate(date); | 
|             shop.setOrgId(model.getOrgId()); | 
|             shop.setName(model.getName()); | 
|             shop.setCode(model.getCode()); | 
|             shop.setUnitCode(model.getUnitCode()); | 
|             shop.setStatus(model.getStatus()); | 
|             if(Constants.equalsInteger(model.getStatus(),Constants.TWO)){ | 
|                 shop.setIsdeleted(Constants.ONE); | 
|             }else{ | 
|                 shop.setIsdeleted(Constants.ZERO); | 
|             } | 
|             shop.setType(model.getType()); | 
|             shop.setSecondType(model.getSecondType()); | 
|             shop.setAttribute(model.getAttribute()); | 
|             shop.setParentIamId(model.getParentOrgId()); | 
|             shop.setScode(model.getScode()); | 
|             newList.add(shop); | 
|         }else { | 
|             shop.setEditor(loginUserInfo.getId()); | 
|             shop.setEditDate(date); | 
|             shop.setType(model.getType()); | 
|             shop.setSecondType(model.getSecondType()); | 
|             shop.setName(model.getName()); | 
|             shop.setCode(model.getCode()); | 
|             shop.setScode(model.getScode()); | 
|             shop.setUnitCode(model.getUnitCode()); | 
|             if(Constants.equalsInteger(model.getStatus(),Constants.TWO)){ | 
|                 shop.setIsdeleted(Constants.ONE); | 
|             }else{ | 
|                 shop.setIsdeleted(Constants.ZERO); | 
|             } | 
|             shop.setStatus(model.getStatus()); | 
|             shop.setAttribute(model.getAttribute()); | 
|             shop.setParentIamId(model.getParentOrgId()); | 
|             updateList.add(shop); | 
|         } | 
|         return  shop; | 
|     } | 
|   | 
|     private Shop getShopByOrgID(String orgId, List<Shop> list) { | 
|         if(list ==null || list.size() ==0){ | 
|             return null; | 
|         } | 
|         for(Shop s :list){ | 
|             if(StringUtils.equals(s.getOrgId(),orgId)){ | 
|                 return s; | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     @Override | 
|     public void updateSort(UpdateShopSortDTO dto) { | 
|         Shop shop = shopMapper.selectById(dto.getId()); | 
|         if(Objects.isNull(shop)){ | 
|             throw new BusinessException(ResponseStatus.DATA_EMPTY); | 
|         } | 
|   | 
|         List<Shop> shopPool; | 
|         if (shop.getParentId() == null) { | 
|             shopPool = shopMapper.selectList(new QueryWrapper<Shop>().lambda() | 
|                     .eq(Shop::getIsdeleted,Constants.ZERO) | 
|                     .isNull(Shop::getParentId) | 
|                     .orderByAsc(Shop::getOrderNum) | 
|             ); | 
|         } else { | 
|             shopPool = shopMapper.selectList(new QueryWrapper<Shop>().lambda() | 
|                     .eq(Shop::getIsdeleted,Constants.ZERO) | 
|                     .eq(Shop::getParentId,shop.getParentId()) | 
|                     .orderByAsc(Shop::getOrderNum) | 
|             ); | 
|         } | 
|         int currentMenuIndex = 0; | 
|         for (int i = 0; i < shopPool.size(); i++) { | 
|             if (shopPool.get(i).getId().equals(dto.getId())) { | 
|                 currentMenuIndex = i; | 
|                 break; | 
|             } | 
|         } | 
|         // 上移 | 
|         if ("top".equals(dto.getDirection())) { | 
|             if (currentMenuIndex - 1 < 0) { | 
|                 return; | 
|             } | 
|             Shop preMenu = shopPool.get(currentMenuIndex - 1); | 
|             shopPool.remove(currentMenuIndex - 1); | 
|             shopPool.add(currentMenuIndex, preMenu); | 
|         } | 
|         // 下移 | 
|         else { | 
|             if (currentMenuIndex + 1 > shopPool.size() - 1) { | 
|                 return; | 
|             } | 
|             Shop nextMenu = shopPool.remove(currentMenuIndex + 1); | 
|             shopPool.add(currentMenuIndex, nextMenu); | 
|         } | 
|         for (int i = 0; i < shopPool.size(); i++) { | 
|             shopPool.get(i).setOrderNum(i); | 
|         } | 
|   | 
|         for (Shop updShop:shopPool) { | 
|             shopMapper.updateById(updShop); | 
|         } | 
|     } | 
|     @Override | 
|     public   List<ShopTreeVo> shopTree(Integer type){ | 
|         MPJLambdaWrapper<Shop> queryWrapper = new MPJLambdaWrapper<>(); | 
|         queryWrapper.selectAll(Shop.class); | 
|         queryWrapper.select("t1.name_path",Shop::getParentNamePath); | 
|         queryWrapper.select("t1.id_path",Shop::getParentIdPath); | 
|         queryWrapper.select("t1.type",Shop::getParentType); | 
|         queryWrapper.leftJoin(Shop.class,Shop::getId,Shop::getParentId); | 
|         queryWrapper.eq(Shop::getIsdeleted, Constants.ZERO); | 
|         queryWrapper.eq(type!=null,Shop::getType,type); | 
|         queryWrapper.orderByAsc(true,"t.order_num"); | 
|         List<ShopTreeVo> shopList = shopMapper.selectJoinList(ShopTreeVo.class,queryWrapper); | 
|         ShopTree treeBuild = new ShopTree(shopList); | 
|         shopList = treeBuild.buildTree(); | 
|         return shopList; | 
|     } | 
|     @Override | 
|     public   List<ShopTreeVo> shopTreeCache(Integer type){ | 
|   | 
|         return (List<ShopTreeVo>) redisTemplate.opsForValue().get(Constants.RedisKeys.SHOP_TREE); | 
|     } | 
|     @Override | 
|     @Async | 
|     public   void dealShopNamePath(){ | 
|         redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_SHOP,true); | 
|         try { | 
|             List<ShopTreeVo> shopList = shopTree(null); | 
|             updateNamePath(null,shopList); | 
|         }catch (Exception e){ | 
|   | 
|         }finally { | 
|   | 
|             redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_SHOP,false); | 
|         } | 
|   | 
|     } | 
|     /** | 
|      * 递归处理组织编码和名称完整路径问题 | 
|      * @param parent | 
|      * @param shopList | 
|      */ | 
|     private void updateNamePath(Shop parent,List<ShopTreeVo> shopList) { | 
|         if(shopList!=null && shopList.size()>0){ | 
|             for(ShopTreeVo shop : shopList){ | 
|                 Shop s = new Shop(); | 
|                 s.setId(shop.getId()); | 
|                 s.setName(shop.getName()); | 
|                 if(parent == null){ | 
|                     s.setNamePath(s.getName()); | 
|                     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(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 " + | 
|                 " ,  (6371 * ACOS(COS(RADIANS("+pageWrap.getModel().getLatitude()+")) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS("+pageWrap.getModel().getLongitude()+")) + SIN(RADIANS("+pageWrap.getModel().getLatitude()+")) * SIN(RADIANS(latitude)) ) ) as distance  " ) | 
|                 .eq("isdeleted",Constants.ZERO) | 
|                 .isNotNull("LATITUDE") | 
|                 .isNotNull("LONGITUDE") | 
|                 .eq("TYPE",Constants.TWO) | 
|                 .eq("SECOND_TYPE",Constants.THREE) | 
|                 .eq("STATUS",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()) { | 
|             this.dealDistance(shop); | 
|             //查询门店下导购数据 | 
|             List<Users> usersList =usersMapper.selectList(new QueryWrapper<Users>().lambda().eq(Users::getDepartmentId,shop.getId()) | 
|                     .eq(Users::getIsdeleted,Constants.ZERO) | 
|                     .eq(Users::getStatus,Constants.ONE) | 
|             ); | 
|             for (Users users:usersList) { | 
|                 if(StringUtils.isNotBlank(users.getImgurl())){ | 
|                     users.setImgurlFull(prefix + users.getImgurl()); | 
|                 } | 
|             } | 
|             shop.setUsersList(usersList); | 
|         } | 
|         return pageData; | 
|     } | 
|   | 
|     /** | 
|      * 处理门店距离显示 | 
|      * @param shop | 
|      */ | 
|     public void dealDistance(Shop shop){ | 
|         if(Objects.isNull(shop.getDistance())){ | 
|             shop.setDistanceStr("-"); | 
|         }else{ | 
|             //距离小于1公里 显示米 | 
|             if(shop.getDistance().compareTo(BigDecimal.ONE)<Constants.ZERO){ | 
|                 BigDecimal distanceM = shop.getDistance().multiply(new BigDecimal(1000).setScale(0)); | 
|                 //100米之内 | 
|                 if(distanceM.compareTo(new BigDecimal(100))<0){ | 
|                     shop.setDistanceStr("<100米"); | 
|                 }else{ | 
|                     shop.setDistanceStr(distanceM.divide(BigDecimal.valueOf(1)).setScale(2,BigDecimal.ROUND_HALF_UP) + "m"); | 
|                 } | 
|             }else{ | 
|                 shop.setDistanceStr(shop.getDistance().divide(BigDecimal.valueOf(1)).setScale(2,BigDecimal.ROUND_HALF_UP) + "km"); | 
|             } | 
|         } | 
|     } | 
|   | 
|     @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 " + | 
|                         " ,  (6371 * ACOS(COS(RADIANS("+member.getLatitude()+")) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS("+member.getLongitude()+")) + SIN(RADIANS("+member.getLatitude()+")) * SIN(RADIANS(latitude)) ) ) 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) | 
|         ); | 
|         this.dealDistance(shop); | 
|         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); | 
|         usersMapper.update(new UpdateWrapper<Users>().lambda() | 
|                 .set(Users::getCardImg,null) | 
|                 .isNotNull(Users::getCardImg) | 
|                 .eq(Users::getDepartmentId,shop.getId()) | 
|         ); | 
|     } | 
|   | 
|     @Override | 
|     public List<Shop> getUserShopList(Long userId) { | 
|         Users users = usersMapper.selectById(userId); | 
|         if(Objects.isNull(users)){ | 
|             return new ArrayList<>(); | 
|         } | 
|         Shop userShop = shopMapper.selectById(users.getDepartmentId()); | 
|         if(Objects.isNull(userShop)){ | 
|             return new ArrayList<>(); | 
|         } | 
|         List<Shop> shopList = shopMapper.selectList(new QueryWrapper<Shop>() | 
|                 .lambda() | 
|                 .eq(Shop::getScode,userShop.getScode()) | 
|                 .eq(Shop::getType,Constants.TWO) | 
|                 .eq(Shop::getSecondType,Constants.THREE) | 
|         ); | 
|         //查询经营范围信息 | 
|         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:shopList) { | 
|                 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 shopList; | 
|     } | 
|   | 
| } |