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 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 deleteWrapper = new UpdateWrapper<>(shop); shopMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } shopMapper.deleteBatchIds(ids); } @Override public void updateById(Shop shop) { shopMapper.updateById(shop); usersMapper.update(new UpdateWrapper().lambda() .set(Users::getCardImg,null) .isNotNull(Users::getCardImg) .eq(Users::getDepartmentId,shop.getId()) ); } @Override public void updateByIdInBatch(List 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 wrapper = new QueryWrapper<>(shop); return shopMapper.selectOne(wrapper); } @Override public List findList(Shop shop) { QueryWrapper wrapper = new QueryWrapper<>(shop); return shopMapper.selectList(wrapper); } @Override public List listByParent(String piamId) { QueryWrapper 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 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().lambda().eq(Shop::getParentIamId,shop.getOrgId()))); } } return list; } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper 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 pageData = PageData.from(shopMapper.selectPage(page, queryWrapper)); //查询经营范围信息 List categorySegAllList = categorySegMapper.selectList(new QueryWrapper().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 categorySegList = categorySegAllList.stream().filter(i->i.getOrgId().equals(shop.getOrgId())).collect(Collectors.toList()); List unitCodeVoList =systemDictDataBiz.getUnitList(); List 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 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 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 finalDataList = dataList; Callable 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 dataList, Date date, LoginUserInfo loginUserInfo) { try { for(int i=0;i().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.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 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 finalDataList = dataList; Callable 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 dataList, Date date, LoginUserInfo loginUserInfo) { try { List categorySegList = new ArrayList<>(); List segmentsList = new ArrayList<>(); Map> siteCodes = new HashMap<>(); List orgIdList = new ArrayList<>(); for(int i=0;i0){ categorySegMapper.delete(new UpdateWrapper().lambda() .in(CategorySeg::getOrgId,orgIdList)); } if(siteCodes.size()>0){ for(Map.Entry> entry : siteCodes.entrySet()){ String key = entry.getKey(); List codes = entry.getValue(); Shop ts = null; String tcode =key.substring(2); if(StringUtils.startsWith(key,"f_")){ ts = shopMapper.selectOne(new QueryWrapper().lambda() .eq(Shop::getCode,tcode) .eq(Shop::getSecondType,Constants.TWO )); } if(StringUtils.startsWith(key,"f_")){ ts = shopMapper.selectOne(new QueryWrapper().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 segmentsList) { if(StringUtils.isNotBlank(model.getSegId())){ //如果战区不为空 if(newSegment(model.getSegId(),Constants.ZERO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper().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().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().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 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> 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> siteCodes) { List 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 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 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 finalDataList = dataList; Callable 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 dataList, Date date, LoginUserInfo loginUserInfo) { try { List list = shopMapper.selectJoinList(Shop.class,new MPJLambdaWrapper() .selectAll(Shop.class) ); List insertShops = new ArrayList<>(); List updateShops = new ArrayList<>(); for(int i=0;i0){ 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 newList, List updateList, int index, LoginUserInfo loginUserInfo , List 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()); 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.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 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 shopPool; if (shop.getParentId() == null) { shopPool = shopMapper.selectList(new QueryWrapper().lambda() .eq(Shop::getIsdeleted,Constants.ZERO) .isNull(Shop::getParentId) .orderByAsc(Shop::getOrderNum) ); } else { shopPool = shopMapper.selectList(new QueryWrapper().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 shopTree(Integer type){ MPJLambdaWrapper 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 shopList = shopMapper.selectJoinList(ShopTreeVo.class,queryWrapper); ShopTree treeBuild = new ShopTree(shopList); shopList = treeBuild.buildTree(); return shopList; } @Override public List shopTreeCache(Integer type){ return (List) redisTemplate.opsForValue().get(Constants.RedisKeys.SHOP_TREE); } @Override @Async public void dealShopNamePath(){ redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_SHOP,true); try { List 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 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 queryShopByLL(PageWrap pageWrap) { if(Objects.isNull(pageWrap.getModel()) || Objects.isNull(pageWrap.getModel().getLatitude()) || Objects.isNull(pageWrap.getModel().getLongitude())){ return null; } IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper 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 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 usersList =usersMapper.selectList(new QueryWrapper().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) queryWrapper = new QueryWrapper(); 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 usersList =usersMapper.selectList(new QueryWrapper().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 categorySegList = categorySegMapper.selectList(new QueryWrapper().lambda().eq(CategorySeg::getOrgId,shop.getOrgId()).eq(CategorySeg::getIsdeleted,Constants.ZERO)); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categorySegList)){ List unitCodeVoList =systemDictDataBiz.getUnitList(); List 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().lambda() .set(Users::getCardImg,null) .isNotNull(Users::getCardImg) .eq(Users::getDepartmentId,shop.getId()) ); } }