package com.doumee.service.business.impl; 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.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.join.ShopJoinMapper; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Shop; import com.doumee.dao.business.vo.ShopTree; import com.doumee.dao.business.vo.ShopTreeVo; import com.doumee.dao.system.model.SystemUser; 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.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.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; /** * 志邦组织信息表Service实现 * @author 江蹄蹄 * @date 2024/07/04 14:40 */ @Service public class ShopServiceImpl implements ShopService { @Autowired private RedisTemplate redisTemplate; @Autowired private ShopJoinMapper shopMapper; @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); } @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()+"%' )" ); for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(shopMapper.selectPage(page, queryWrapper)); } @Override public long count(Shop shop) { QueryWrapper wrapper = new QueryWrapper<>(shop); return shopMapper.selectCount(wrapper); } @Override @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 updateShops = new ArrayList<>(); 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); } return "导入成功"; }catch (BusinessException e){ throw e; }catch (Exception e){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); }finally { redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP); } } @Override @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(),"对不起,录入数据为空!"); } List list = shopMapper.selectJoinList(Shop.class,new MPJLambdaWrapper() .selectAll(Shop.class) ); List insertShops = new ArrayList<>(); Date date =new Date(); 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); } } return "导入成功"; }catch (BusinessException e){ throw e; }catch (Exception e){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"信息导入失败,请稍后重试"); }finally { 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{ s.setParentId(parent.getId()); s.setNamePath(parent.getNamePath()+"/"+s.getName()); s.setIdPath(parent.getIdPath()+s.getId()+"/"); shopMapper.updateById(s); } if(shop.getChildList()!=null && shop.getChildList().size()>0){ updateNamePath(s,shop.getChildList()); } } } } }