liukangdong
2024-09-29 b2d360d9113b6955287108ca9e90d76a1f3c1419
server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -1,5 +1,6 @@
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;
@@ -8,16 +9,21 @@
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;
@@ -26,6 +32,7 @@
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;
@@ -34,10 +41,12 @@
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.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实现
@@ -46,11 +55,22 @@
 */
@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) {
@@ -80,6 +100,11 @@
    @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
@@ -237,6 +262,8 @@
        }
        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());
@@ -244,7 +271,30 @@
                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
@@ -253,6 +303,7 @@
        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);
@@ -274,7 +325,22 @@
                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())  ){
@@ -298,20 +364,264 @@
                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);
            }
            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);
@@ -332,11 +642,28 @@
            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);
@@ -365,12 +692,12 @@
                    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);
        }
    }
@@ -417,6 +744,7 @@
            shop.setSecondType(model.getSecondType());
            shop.setAttribute(model.getAttribute());
            shop.setParentIamId(model.getParentOrgId());
            shop.setScode(model.getScode());
            newList.add(shop);
        }else {
            shop.setEditor(loginUserInfo.getId());
@@ -425,6 +753,7 @@
            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);
@@ -556,10 +885,16 @@
                    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());
@@ -567,4 +902,181 @@
            }
        }
    }
    @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,LINK_PHONE,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(0,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(" * " +
                        " ,  (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::getScode,shop.getScode()).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);
                }
            }
            Set<String> hs = new HashSet<String>(seqNameList);
            shop.setSeqNameList(new ArrayList<String>(hs));
        }
        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<>();
        }
        Boolean manageShop = true;
        if(users.getRoleCodes().indexOf(StringUtils.trimToNull(systemDictDataBiz.queryByCode(Constants.ZBOM_CUSTOMIZED,Constants.USERS_MANAGE_CODE).getCode()))>=0){
            manageShop = false;
        }
        List<Shop> shopList = shopMapper.selectList(new QueryWrapper<Shop>()
                .lambda()
                .eq(Shop::getScode,userShop.getScode())
                .eq(Shop::getType,Constants.TWO)
                .eq(Shop::getSecondType,Constants.THREE)
                .apply(manageShop,"1=2")
        );
        //查询经营范围信息
        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.getScode().equals(shop.getScode())).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);
                    }
                }
                Set<String> hs = new HashSet<String>(seqNameList);
                shop.setSeqNameList(new ArrayList<String>(hs));
            }
        }
        return shopList;
    }
}