package com.ydd.module.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.ydd.api.DeliveryService; import com.ydd.common.core.domain.entity.SysUser; import com.ydd.common.core.page.PageResult; import com.ydd.common.enums.DeliveryTypeEnums; import com.ydd.common.enums.UserTypeEnums; import com.ydd.common.exception.CustomException; import com.ydd.module.constants.AppConstant; import com.ydd.module.domain.*; import com.ydd.module.dto.DeliveryDto; import com.ydd.module.dto.DeliveryInfo; import com.ydd.module.dto.DspDeliveryListDto; import com.ydd.module.dto.ShopDeliveryBindDto; import com.ydd.module.enums.IsDeleteEnum; import com.ydd.module.enums.ListSizeEnum; import com.ydd.module.enums.MemberTypeEnum; import com.ydd.module.enums.StatusEnum; import com.ydd.module.mapper.DspDeliveryMapper; import com.ydd.module.service.*; import com.ydd.system.mapper.SysConfigMapper; import com.ydd.system.service.ISysConfigService; import com.ydd.third.common.dto.FengniaoV3Token; import com.ydd.third.common.vo.ResObject; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 服务商配送平台Service业务层处理 * * @author douya * @date 2021-02-01 */ @Service public class DspDeliveryServiceImpl extends ServiceImpl implements IDspDeliveryService { @Resource private IDspConfigService iDspConfigService; @Resource private IShopDeliveryService iShopDeliveryService; @Resource private IShopDeliveryBindService iShopDeliveryBindService; @Resource private IMemberService iMemberService; @Resource private DeliveryService fengniaoClient; @Resource private IMemberConfigService iMemberConfigService; @Resource private ISysConfigService iSysConfigService; @Override public List queryList(SysUser user) { return baseMapper.selectByDspId(user); } @Override public PageResult queryPage(Page page, DspDelivery dspDelivery) { List list = baseMapper.queryPage(page, dspDelivery); page.setRecords(list); return new PageResult(page); } @Override public Integer statisticsUseDeliveryNum(Long id, Integer status) { return baseMapper.statisticsUseDeliveryNum(id, status); } @Override public Boolean createDspDelivery(DspDelivery dspDelivery) { //平台名称校验 List list = baseMapper.selectByName(dspDelivery.getName()); if (list.size() > ListSizeEnum.ZERO.getSize()) { throw new CustomException("已存在该配送平台,请确认后重新操作!"); } //创建默认的配送平台(没有绑定渠道商的平台) dspDelivery.setStatus(StatusEnum.SHOW.getStatus()); baseMapper.insert(dspDelivery); //查询出所有渠道商(包括被禁用的)创建对应的配送平台,默认未启用 List dspList = iDspConfigService.selectDspListByStatus(null); //渠道商的配送平台 List dspDeliveryList = new ArrayList<>(); dspList.stream().forEach(dspConfig -> { DspDelivery dspDelivery1 = new DspDelivery(); BeanUtils.copyProperties(dspDelivery, dspDelivery1); dspDelivery1.setStatus(StatusEnum.STOP.getStatus()); dspDelivery1.setDspId(dspConfig.getId()); dspDelivery1.setParentId(dspDelivery.getId().intValue()); dspDeliveryList.add(dspDelivery1); }); //批量保存已存在渠道商的配送平台 if (dspDeliveryList.size() > ListSizeEnum.ZERO.getSize()) { for (DspDelivery delivery : dspDeliveryList) { baseMapper.insert(delivery); if (delivery.getDspId()!=null) { //查询开启自动配送的用户配置 List memberConfigList = iMemberConfigService.list(new QueryWrapper().eq("open_autodelivery", StatusEnum.SHOW.status)); if (memberConfigList!=null&&memberConfigList.size()>0){ for (MemberConfig memberConfig : memberConfigList) { String autodeliveryIds=""; if (memberConfig.getAutodeliveryIds()!=null) { autodeliveryIds=memberConfig.getAutodeliveryIds(); } memberConfig.setAutodeliveryIds(autodeliveryIds +delivery.getId()); iMemberConfigService.updateById(memberConfig); } } } } } return true; } @Override @Transactional(rollbackFor = Exception.class) public void changeStatus(Long id, SysUser user) { DspDelivery dspDelivery = baseMapper.getById(id); //防止渠道商身份误操作平台配置 if (dspDelivery.getParentId() == null) { if (!user.getType().equals(UserTypeEnums.PLATFORM.getCode())) { throw new CustomException("风险操作,已被系统拦截!"); } //平台禁用配送通道时,关闭所有渠道商的该通道 if (dspDelivery.getStatus().equals(StatusEnum.SHOW.getStatus())) { baseMapper.updateAllDeliveryByParentId(dspDelivery.getId(), StatusEnum.STOP.getStatus()); //关闭时候,将此运力从配置表中移除 // List memberConfigList = iMemberConfigService.list(new QueryWrapper().eq("open_autodelivery", StatusEnum.SHOW.status)); // if (memberConfigList!=null&&memberConfigList.size()>0){ // for (MemberConfig memberConfig : memberConfigList) { // String autodeliveryIds=memberConfig.getAutodeliveryIds(); // if (memberConfig.getAutodeliveryIds()!=null) { // if (memberConfig.getAutodeliveryIds().contains(",")) { // autodeliveryIds=memberConfig.getAutodeliveryIds()+","; // } // autodeliveryIds=memberConfig.getAutodeliveryIds().replaceAll(autodeliveryIds,""); // } // memberConfig.setAutodeliveryIds(autodeliveryIds); // iMemberConfigService.updateById(memberConfig); // } // } } } else if (dspDelivery.getStatus().equals(StatusEnum.STOP.getStatus())) { //开启配送通道之前,校验平台是否关闭该配送通道 if (dspDelivery.getStatus().equals(StatusEnum.STOP.getStatus())) { DspDelivery dspDeliverys = this.getById(dspDelivery.getParentId()); if (dspDeliverys.getStatus().equals(StatusEnum.STOP.getStatus())) { throw new CustomException("管理员已关闭该配送通道,开启失败!"); } } //校验参数是否配置,没有则不允许开启 Boolean flg = true; if (StringUtils.isEmpty(dspDelivery.getAppId()) && StringUtils.isEmpty(dspDelivery.getAppKey()) && StringUtils.isEmpty(dspDelivery.getAppSecret()) && StringUtils.isEmpty(dspDelivery.getAuthUrl())) { flg = false; } if (!flg) { throw new CustomException("开启失败,请先完成该配送平台的参数配置!"); } //查询开启自动配送的用户配置 // List memberConfigList = iMemberConfigService.list(new QueryWrapper().eq("open_autodelivery", StatusEnum.SHOW.status)); // if (memberConfigList!=null&&memberConfigList.size()>0){ // for (MemberConfig memberConfig : memberConfigList) { // String autodeliveryIds=""; // if (memberConfig.getAutodeliveryIds()!=null) { // autodeliveryIds=memberConfig.getAutodeliveryIds(); // } // memberConfig.setAutodeliveryIds(autodeliveryIds +dspDelivery.getId()); // iMemberConfigService.updateById(memberConfig); // } // } } baseMapper.updateStatusById(getStatus(dspDelivery),id); } public Integer getStatus(DspDelivery dspDelivery) { return dspDelivery.getStatus().equals(StatusEnum.SHOW.getStatus()) ? StatusEnum.STOP.getStatus() : StatusEnum.SHOW.getStatus(); } @Override public List getSysConfig() { return baseMapper.getSysConfig(); } @Override public List selectDspDeliverys() { return baseMapper.selectDspDeliverys(); } @Override public List selectDspDeliverysTwo() { return baseMapper.selectDspDeliverysTwo(); } @Override public List selectOrderDspDeliverys() { List dspDeliveryList = baseMapper.selectOrderDspDeliverys(); DspDelivery dspDelivery = new DspDelivery(); dspDelivery.setId(100L); dspDelivery.setName("其它平台"); dspDeliveryList.add(dspDelivery); return dspDeliveryList; } @Override public List queryPageDspDeliverys(Page page) { return baseMapper.queryPageDspDeliverys(page); } @Override public void createList(List list) { if (list.size() > 0) { this.saveBatch(list, list.size()); } } @Override public List floorList() { return baseMapper.findFloorList(); } @Override public Boolean updateDspDeliveryById(DspDelivery dspDelivery, SysUser user) { if (user.getType().equals(UserTypeEnums.PLATFORM.getCode()) && dspDelivery.getParentId() == null) { //批量更新所有渠道商的基础配置 List list = baseMapper.selectByParentId(dspDelivery.getId()); list.stream().forEach(dspDeliverys -> { dspDeliverys.setName(dspDelivery.getName()); dspDeliverys.setLogo(dspDelivery.getLogo()); dspDeliverys.setPcLogo(dspDelivery.getPcLogo()); dspDeliverys.setWebsite(dspDelivery.getWebsite()); }); list.add(dspDelivery); this.updateBatchById(list, list.size()); } else { this.updateById(dspDelivery); } return true; } @Override public DspDelivery findOne(Integer type) { return baseMapper.selectOne(new QueryWrapper().eq("type", type).isNotNull("parent_id")); } @Override public DeliveryInfo findInfoOne(Integer id, Long merchantId) { Member member = iMemberService.findOne(merchantId); DeliveryInfo info = new DeliveryInfo(); DspDelivery delivery = baseMapper.selectOne(new QueryWrapper().eq("id", id).isNotNull("parent_id")); BeanUtils.copyProperties(delivery, info); info.setPreferredDelivery(StatusEnum.STOP.getStatus()); if (merchantId != null) { ShopDelivery shopDelivery = iShopDeliveryService.getOne(new QueryWrapper().eq("merchant_id", merchantId).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status).isNull("shop_id")); if (shopDelivery != null) { info.setAuthToken(shopDelivery.getAuthToken()); info.setPreferredDelivery(shopDelivery.getPreferredDelivery()); info.setThirdShopId(shopDelivery.getThirdShopId()); if(info.getType().equals(DeliveryTypeEnums.UUPT.getType())){ info.setShopId(shopDelivery.getThirdShopId()); } if(info.getType().equals(DeliveryTypeEnums.AIPT.getType())){ info.setPhone(shopDelivery.getAccount()); } } //达达和点我达特殊处理 if (info.getType().equals(DeliveryTypeEnums.DADA.getType()) || info.getType().equals(DeliveryTypeEnums.DWD.getType())) { ShopDelivery sd = iShopDeliveryService.getOne(new QueryWrapper().eq("merchant_id", merchantId).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status).eq("shop_id", member.getShopId())); if (sd != null) { info.setShopId(sd.getThirdShopId()); }else { //如果默认店铺被删了,则取列表第一个 List deliveries = iShopDeliveryService.list(new QueryWrapper().eq("merchant_id", merchantId).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status)); if (CollectionUtils.isNotEmpty(deliveries)){ info.setShopId(deliveries.get(0).getThirdShopId()); } } } if (info.getType().equals(DeliveryTypeEnums.FENG_NIAO.getType())||info.getType().equals(DeliveryTypeEnums.FENG_NIAO_PT.getType())){ ShopDelivery sd = iShopDeliveryService.getOne(new QueryWrapper().eq("merchant_id", member.getMerchantId()).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status).eq("shop_id", member.getShopId())); if (sd != null) { info.setThirdShopId(sd.getThirdShopId()); }else { //如果默认店铺被删了,则取列表第一个 List deliveries = iShopDeliveryService.list(new QueryWrapper().eq("merchant_id", member.getMerchantId()).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status).isNotNull("third_shop_id")); if (CollectionUtils.isNotEmpty(deliveries)){ info.setThirdShopId(deliveries.get(0).getThirdShopId()); } } } } return info; } @Override public List findList(Member member, Long shopId, Integer transport, List types, Integer defaultShop) { List list = baseMapper.selectList(new QueryWrapper() .isNotNull("parent_id") .eq("status", StatusEnum.SHOW.status) .eq("deleted", IsDeleteEnum.NORMAL.status) .in(CollectionUtils.isNotEmpty(types), "type", types)); List infos = Lists.newArrayList(); for (DspDelivery delivery : list) { // 判断运力类型, 货运只能使用货拉拉, 其他不可使用货拉拉 if (transport == 0) { if (DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType())) { continue; } } else if (transport == 1) { if (!DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType())) { continue; } } DeliveryInfo info = new DeliveryInfo(); BeanUtils.copyProperties(delivery, info); Integer isMine = 0; if (member.getMerchantId() != null) { // 非 顺丰(100米内)、蜂鸟、美团跑腿运力之外, 商家门店账号个人地址发单,也可计价自运力 if (!(info.getType().equals(DeliveryTypeEnums.SHUN_FENG.getType()) && defaultShop != 0) && !info.getType().equals(DeliveryTypeEnums.FENG_NIAO.getType()) && !info.getType().equals(DeliveryTypeEnums.FENG_NIAO_PT.getType()) && !info.getType().equals(DeliveryTypeEnums.MEI_TUAN_ZB.getType()) && shopId == null) { shopId = member.getShopId(); } ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(member.getMerchantId(), shopId, delivery.getId(), delivery.getType()); if (shopDeliveryBind != null) { info.setAuthToken(shopDeliveryBind.getAuthToken()); info.setThirdShopId(shopDeliveryBind.getThirdShopId()); isMine = 1; if (info.getType().equals(DeliveryTypeEnums.DADA.getType())){ info.setShopId(shopDeliveryBind.getDadaShopNo()); info.setDadaThirdShopId(shopDeliveryBind.getThirdShopId()); } if (info.getType().equals(DeliveryTypeEnums.DADA_YZ.getType())) { info.setShopId(shopDeliveryBind.getDadaYzShopNo()); info.setDadaThirdShopId(shopDeliveryBind.getThirdShopId()); } if(info.getType().equals(DeliveryTypeEnums.UUPT.getType())){ info.setShopId(shopDeliveryBind.getThirdShopId()); } if (info.getType().equals(DeliveryTypeEnums.AIPT.getType())){ info.setPhone(shopDeliveryBind.getAccount()); } } if (info.getType().equals(DeliveryTypeEnums.DADA.getType()) || info.getType().equals(DeliveryTypeEnums.DADA_YZ.getType()) || info.getType().equals(DeliveryTypeEnums.DWD.getType()) || info.getType().equals(DeliveryTypeEnums.FENG_NIAO.getType()) || info.getType().equals(DeliveryTypeEnums.FENG_NIAO_PT.getType()) || info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType()) || info.getType().equals(DeliveryTypeEnums.MEI_TUAN.getType())|| info.getType().equals(DeliveryTypeEnums.SHAN_SONG.getType()) || info.getType().equals(DeliveryTypeEnums.SHUN_FENG.getType())) { ShopDelivery sd = iShopDeliveryService.getOne(new QueryWrapper().eq("merchant_id", member.getMerchantId()).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status).eq("shop_id", shopId).eq("bind_status",1)); if (isMine == 0 && info.getType().equals(DeliveryTypeEnums.DADA.getType()) || info.getType().equals(DeliveryTypeEnums.DADA_YZ.getType())) { if (sd != null && sd.getThirdShopId() != null) { info.setShopId(sd.getThirdShopId()); } else { // 如果默认店铺被删了,则取列表第一个 List deliveries = iShopDeliveryService.list(new QueryWrapper().eq("merchant_id", member.getMerchantId()).eq("delivery_id", delivery.getId()) .eq("deleted", IsDeleteEnum.NORMAL.status).isNotNull("third_shop_id")); if (CollectionUtils.isNotEmpty(deliveries)){ info.setShopId(deliveries.get(0).getThirdShopId()); } } } if(sd != null && sd.getThirdShopId() != null && (info.getType().equals(DeliveryTypeEnums.FENG_NIAO.getType()) || info.getType().equals(DeliveryTypeEnums.FENG_NIAO_PT.getType()) || info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType()) || info.getType().equals(DeliveryTypeEnums.MEI_TUAN.getType()))) { info.setThirdShopId(sd.getThirdShopId()); } if (DeliveryTypeEnums.SHAN_SONG.getType().equals(info.getType())) { if(sd != null && sd.getThirdShopId() != null){ info.setShopId(sd.getThirdShopId()); } else { info.setShopId(null); } } } } if ((delivery.getType().equals(DeliveryTypeEnums.DADA.getType()) || delivery.getType().equals(DeliveryTypeEnums.DADA_YZ.getType())) && member.getMemberType().equals(MemberTypeEnum.PERSON.type)){ info.setIsMerchant(StatusEnum.SHOW.status); } info.setPreferredDelivery(StatusEnum.STOP.getStatus()); info.setIsMine(isMine); infos.add(info); } return infos; } @Override public DspDelivery findById(Long id) { return baseMapper.getById(id); } @Override public List selectDspDeliverysByTime() { List dspDeliveries = baseMapper.selectDspDeliverysByTime(); return dspDeliveries; } @Override public void fengNiaoTask() { try { List deliverys = baseMapper.selectDspDeliverysByTime(); if (deliverys != null && deliverys.size() > 0) { for (DspDelivery delivery : deliverys) { if ((System.currentTimeMillis()-delivery.getCreateTime().getTime())/1000>delivery.getReExpireIn()){ log.error("蜂鸟刷新token商户id:"+delivery.getShopId()+"刷新token失败,token过期"); continue; } ResObject resObject = fengniaoClient.fengniaoRefreshToken(delivery.getRefreshToken(), delivery.getShopId()); delivery.setExpiresIn(resObject.getData().getExpireIn()); delivery.setRefreshToken(resObject.getData().getRefreshToken()); delivery.setAuthToken(resObject.getData().getAccessToken()); delivery.setCreateTime(new Date()); baseMapper.updateById(delivery); } } } catch (Exception e) { log.error("蜂鸟刷新token定时任务出现异常", e); e.printStackTrace(); } } /** * 查询门店没有绑定的运力 * @param dtos * @return */ @Override public List findNotBindByIds(List dtos) { return baseMapper.findNotBindByIds(dtos); } @Override public List getDeliveryList() { return baseMapper.getDeliveryList(); } @Override public List getCustomerServiceList() { List customerServiceList = baseMapper.getCustomerServiceList(); String lieBaoCustomerPhone = iSysConfigService.selectConfigByKey(AppConstant.LIEBAOAI_CUSTOMER_PHONE_KEY); DspDeliveryListDto dto = new DspDeliveryListDto(); dto.setId(0L); dto.setName("猎豹AI"); dto.setLogo(AppConstant.LIE_BAO_LOGO); dto.setCustomerPhone(lieBaoCustomerPhone == null ? AppConstant.LIE_BAO_CUSTOMER_PHONE: lieBaoCustomerPhone); customerServiceList.add(customerServiceList.size(), dto); return customerServiceList; } }