|  |  | 
 |  |  | package com.doumee.service.business.impl; | 
 |  |  |  | 
 |  |  | import com.doumee.biz.system.SystemDictDataBiz; | 
 |  |  | import com.doumee.core.model.PageData; | 
 |  |  | import com.doumee.core.model.PageWrap; | 
 |  |  | import com.doumee.core.utils.Constants; | 
 |  |  | import com.doumee.core.utils.DateUtil; | 
 |  |  | import com.doumee.core.utils.PinYinUtil; | 
 |  |  | import com.doumee.core.utils.Utils; | 
 |  |  | import com.doumee.core.utils.aliyun.ALiYunUtil; | 
 |  |  | import com.doumee.dao.business.*; | 
 |  |  | import com.doumee.dao.business.model.*; | 
 |  |  | import com.doumee.dao.business.model.dto.OssModel; | 
 |  |  | import com.doumee.service.business.BaseDataService; | 
 |  |  | 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 lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.commons.lang3.StringUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.context.annotation.Lazy; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.util.CollectionUtils; | 
 |  |  |  | 
 |  |  | import java.io.File; | 
 |  |  | import java.lang.reflect.Field; | 
 |  |  | import java.lang.reflect.Method; | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.UUID; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 商品源数据信息表Service实现 | 
 |  |  | 
 |  |  |  * @date 2023/09/08 11:39 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class BaseDataServiceImpl implements BaseDataService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private BaseDataMapper baseDataMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private MultifileMapper multifileMapper; | 
 |  |  |     @Autowired | 
 |  |  |     @Lazy | 
 |  |  |     private SystemDictDataBiz systemDictDataBiz; | 
 |  |  |     @Autowired | 
 |  |  |     private BaseGoodsMapper baseGoodsMapper; | 
 |  |  |     @Autowired | 
 |  |  | 
 |  |  |    | 
 |  |  |     @Override | 
 |  |  |     public PageData<BaseData> findPage(PageWrap<BaseData> pageWrap) { | 
 |  |  |         pageWrap.getModel().setIsdeleted(Constants.ZERO); | 
 |  |  |         IPage<BaseData> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
 |  |  |         QueryWrapper<BaseData> queryWrapper = new QueryWrapper<>(); | 
 |  |  |         Utils.MP.blankToNull(pageWrap.getModel()); | 
 |  |  | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getIsdeleted, pageWrap.getModel().getIsdeleted()); | 
 |  |  |         } | 
 |  |  |         if (pageWrap.getModel().getTitle() != null) { | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getTitle, pageWrap.getModel().getTitle()); | 
 |  |  |             queryWrapper.lambda().like(BaseData::getTitle, pageWrap.getModel().getTitle()); | 
 |  |  |         } | 
 |  |  |         if (pageWrap.getModel().getName() != null) { | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getName, pageWrap.getModel().getName()); | 
 |  |  |             queryWrapper.lambda().like(BaseData::getName, pageWrap.getModel().getName()); | 
 |  |  |         } | 
 |  |  |         if (pageWrap.getModel().getSku() != null) { | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getSku, pageWrap.getModel().getSku()); | 
 |  |  |             queryWrapper.lambda().like(BaseData::getSku, pageWrap.getModel().getSku()); | 
 |  |  |         } | 
 |  |  |         if (pageWrap.getModel().getBrand() != null) { | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getBrand, pageWrap.getModel().getBrand()); | 
 |  |  |             queryWrapper.lambda().like(BaseData::getBrand, pageWrap.getModel().getBrand()); | 
 |  |  |         } | 
 |  |  |         if (pageWrap.getModel().getCategory() != null) { | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getCategory, pageWrap.getModel().getCategory()); | 
 |  |  |             queryWrapper.lambda().like(BaseData::getCategory, pageWrap.getModel().getCategory()); | 
 |  |  |         } | 
 |  |  |         if (pageWrap.getModel().getUrl() != null) { | 
 |  |  |             queryWrapper.lambda().eq(BaseData::getUrl, pageWrap.getModel().getUrl()); | 
 |  |  | 
 |  |  |     } | 
 |  |  |     public static   boolean IS_RUNNING = false; | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public   void dealBaseData() { | 
 |  |  |         if(IS_RUNNING){ | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         log.info("开始处理源数据=================start==================="); | 
 |  |  |         IS_RUNNING = true; | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  | 
 |  |  |             param.setStatus(Constants.ZERO); | 
 |  |  |             List<BaseData> allLis=findList(param); | 
 |  |  |             if(allLis==null || allLis.size() ==0){ | 
 |  |  |  | 
 |  |  |                 log.info("开始处理源数据=================end========无待处理数据==========="); | 
 |  |  |                 return ; | 
 |  |  |             } | 
 |  |  |             Brand brand = new Brand(); | 
 |  |  | 
 |  |  |             p.setIsdeleted(Constants.ZERO); | 
 |  |  |             //查询全部类别属性信息 | 
 |  |  |             List<BaseCateParam> paramList = baseCateParamMapper.selectList(new QueryWrapper<>(p)); | 
 |  |  |             //默認加价系数 | 
 |  |  |             BigDecimal rate = systemDictDataBiz.getGoodsPriceRate(); | 
 |  |  |             OssModel ossModel = initOssModel(); | 
 |  |  |             Date date = new Date(); | 
 |  |  |             for(BaseData data : allLis){ | 
 |  |  |                 BaseGoods goods = new BaseGoods(); | 
 |  |  |                 goods.setBaseDataId(data.getId()); | 
 |  |  |                 goods.setIsdeleted(Constants.ZERO); | 
 |  |  |                 if(baseGoodsMapper.selectCount(new QueryWrapper<>(goods)) >0){ | 
 |  |  |                     //如果已经存在,逻辑删除旧的商品数据 | 
 |  |  |                     UpdateWrapper<BaseGoods> updateModel = new UpdateWrapper<>(); | 
 |  |  |                     updateModel.lambda().set(BaseGoods::getIsdeleted,Constants.ONE); | 
 |  |  |                     updateModel.lambda().set(BaseGoods::getEditDate, new Date()); | 
 |  |  |                     updateModel.lambda().eq(BaseGoods::getBaseDataId, data.getId()); | 
 |  |  |                     baseGoodsMapper.update(null, updateModel); | 
 |  |  |                 } | 
 |  |  |                 goods.setCreateDate(date); | 
 |  |  |                 goods.setName(StringUtils.defaultString(data.getName(),data.getTitle())); | 
 |  |  |                 goods.setRemark(data.getTitle()); | 
 |  |  | 
 |  |  |                 goods.setStatus(Constants.ZERO); | 
 |  |  |                 goods.setShortPinyin(PinYinUtil.getFirstSpell(goods.getName())); | 
 |  |  |                 goods.setPinyin(PinYinUtil.getFullSpell(goods.getName())); | 
 |  |  |                 goods.setPrice(data.getSaleprice()); | 
 |  |  |                 goods.setZdPrice(data.getPrice()); | 
 |  |  |                 //处理品牌数据 | 
 |  |  |                 Brand bModel = getBrandModelFromList(data.getBrand(),brandList); | 
 |  |  | 
 |  |  |                     goods.setBrandId(bModel.getId()); | 
 |  |  |                 } | 
 |  |  |                 //处理列表数据 | 
 |  |  |                 BaseCategory cModel = getCateModelFromList(data.getBrand(),data.getCategoryImg(), cateList); | 
 |  |  |                 if(bModel!= null){ | 
 |  |  |                     goods.setBrandId(bModel.getId()); | 
 |  |  |                 BaseCategory cModel = getCateModelFromList(rate,data.getCategory(),ossModel,data.getCategoryImg(), cateList); | 
 |  |  |                 if(cModel!= null){ | 
 |  |  |                     goods.setCategoryId(cModel.getId()); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 goods.setImgurl(getOssImgurl(ossModel,ossModel.getGoodsFolder(), data.getImgurl())); | 
 |  |  |                 goods.setPrice(Constants.formatBigdecimal(data.getSaleprice()).multiply(Constants.formatBigdecimal(cModel.getPriceRate()))); | 
 |  |  |                 //插入新商品数据 | 
 |  |  |                 baseGoodsMapper.insert(goods); | 
 |  |  |                 //处理分类属性 | 
 |  |  |                 dealCateParamAll(cModel.getId(),goods.getId(),data,paramList); | 
 |  |  |                 //处理背景图 | 
 |  |  |                 dealBgImgAll(ossModel,goods.getId(),data); | 
 |  |  |  | 
 |  |  |                 data.setEditDate(new Date()); | 
 |  |  |                 data.setStatus(Constants.ONE); | 
 |  |  |                 //更新数据处理状态 | 
 |  |  |                 baseDataMapper.updateById(data); | 
 |  |  |             } | 
 |  |  |             log.info("开始处理源数据=================success================处理数据共("+allLis.size()+")个==="); | 
 |  |  |         }catch (Exception e){ | 
 |  |  |  | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             log.info("开始处理源数据=================error==================="+e.getMessage()); | 
 |  |  |         }finally { | 
 |  |  |             IS_RUNNING = false; | 
 |  |  |             log.info("开始处理源数据=================end==================="); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private void dealBgImgAll(OssModel ossModel, Integer id, BaseData data) { | 
 |  |  |         int i =0; | 
 |  |  |         //多图,英文逗号隔开 | 
 |  |  |         if(StringUtils.isNotBlank(data.getBgImg())){ | 
 |  |  |            String tImg =  data.getBgImg().replace(",", ","); | 
 |  |  |             String[] imgs =tImg.split(","); | 
 |  |  |             for (int j = 0; j < imgs.length; j++) { | 
 |  |  |                 if(StringUtils.isNotBlank(imgs[j])){ | 
 |  |  |                     i += addImg(i,ossModel,id,imgs[j]); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | //        i += addImg(i,ossModel,id,data.getBgImg()); | 
 |  |  | //        i += addImg(i,ossModel,id,data.getBgImg2()); | 
 |  |  | //        addImg(i,ossModel,id,data.getBgImg3()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private int addImg(int i,OssModel ossModel, Integer id,String bgImg) { | 
 |  |  |         if(StringUtils.isNotBlank(bgImg)){ | 
 |  |  |             String img =getOssImgurl(ossModel, ossModel.getGoodsFolder() ,bgImg); | 
 |  |  |             if(StringUtils.isNotBlank(img)){ | 
 |  |  |                 Multifile f = new Multifile(); | 
 |  |  |                 f.setFileurl(img); | 
 |  |  |                 f.setObjType(Constants.ZERO); | 
 |  |  |                 f.setName(bgImg.substring(bgImg.lastIndexOf("/")+1)); | 
 |  |  |                 f.setType(Constants.ZERO); | 
 |  |  |                 f.setObjId(id); | 
 |  |  |                 f.setCreateDate(new Date()); | 
 |  |  |                 f.setIsdeleted(Constants.ZERO); | 
 |  |  |                 f.setSortnum(i); | 
 |  |  |                 multifileMapper.insert(f); | 
 |  |  |                 return  1; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return  0; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public OssModel initOssModel() { | 
 |  |  |         OssModel model = new OssModel(); | 
 |  |  |         model.setUrl(systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()); | 
 |  |  |         model.setEndpoint(systemDictDataBiz.queryByCode(Constants.OSS, Constants.ENDPOINT).getCode()); | 
 |  |  |         model.setAccessId(systemDictDataBiz.queryByCode(Constants.OSS, Constants.ACCESS_ID).getCode()); | 
 |  |  |         model.setAccessKey(systemDictDataBiz.queryByCode(Constants.OSS, Constants.ACCESS_KEY).getCode()); | 
 |  |  |         model.setBucket(systemDictDataBiz.queryByCode(Constants.OSS, Constants.BUCKETNAME).getCode()); | 
 |  |  |         model.setCateFolder(systemDictDataBiz.queryByCode(Constants.OSS, Constants.CATEGORY_IMG).getCode()); | 
 |  |  |         model.setGoodsFolder(systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode()); | 
 |  |  |         return model; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |                     String val =(String) item.invoke(data); | 
 |  |  |                     dealCateParam(cateId,goodsId,val.toString(),cateList); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     throw new RuntimeException(e); | 
 |  |  | //                    throw new RuntimeException(e); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |         if(StringUtils.isBlank(attr)){ | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  | //        商品名称:火星人F30BX | 
 |  |  |         //如果属性不为空,处理属性数据 | 
 |  |  |         int index  = attr.indexOf(":"); | 
 |  |  |         if(index <=0){ | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         String attrName = attr.substring(0,index); | 
 |  |  |         if(StringUtils.isBlank(attrName) || StringUtils.equals(attrName, "商品名称") || StringUtils.equals(attrName, "商品编号")){ | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         String val = attr.substring(index+1); | 
 |  |  |         BaseCateParam cate = getCateParamModelFromList(cateId,attrName, list); | 
 |  |  |         BaseGoodsParam p = new BaseGoodsParam(); | 
 |  |  | 
 |  |  |      */ | 
 |  |  |  | 
 |  |  |     private Brand getBrandModelFromList(String name, List<Brand> brandList) { | 
 |  |  |         if(StringUtils.isBlank(name)){ | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         if(brandList!=null && brandList.size()>0){ | 
 |  |  |             for(Brand brand : brandList){ | 
 |  |  |                 if(StringUtils.equals(name,brand.getName())){ | 
 |  |  | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |  | 
 |  |  |     private BaseCategory getCateModelFromList(String name, String img,List<BaseCategory> list) { | 
 |  |  |     private BaseCategory getCateModelFromList(BigDecimal dRate,String name, OssModel ossModel, String img, List<BaseCategory> list) { | 
 |  |  |         if(StringUtils.isBlank(name)){ | 
 |  |  |             return  null; | 
 |  |  |         } | 
 |  |  |         if(list!=null && list.size()>0){ | 
 |  |  |             for(BaseCategory p : list){ | 
 |  |  |                 if(StringUtils.equals(name,p.getName())){ | 
 |  |  | 
 |  |  |         BaseCategory model = new BaseCategory(); | 
 |  |  |         model.setCreateDate(new Date()); | 
 |  |  |         model.setName(name); | 
 |  |  |         model.setPriceRate(dRate); | 
 |  |  |         model.setIsdeleted(Constants.ZERO); | 
 |  |  |         model.setImgurl(img); | 
 |  |  |         model.setPinyin(PinYinUtil.getFullSpell(model.getName())); | 
 |  |  |         model.setShortPinyin(PinYinUtil.getFirstSpell(model.getName())); | 
 |  |  |         model.setImgurl(getOssImgurl(ossModel, ossModel.getCateFolder() ,img)); | 
 |  |  |         //插入新的品牌信息 | 
 |  |  |         baseCategoryMapper.insert(model); | 
 |  |  |         //加入集合中 | 
 |  |  |         list.add(model); | 
 |  |  |         return model; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public String getOssImgurl(OssModel ossModel, String folder,String img) { | 
 |  |  |         if(StringUtils.isBlank(img)){ | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         try { | 
 |  |  |             String nowDate = DateUtil.getNowShortDate();// 当前时间(年月日) | 
 |  |  |             String nfix  = img.lastIndexOf(".")>0?img.substring(img.lastIndexOf(".")):null; | 
 |  |  |             nfix = StringUtils.defaultString(nfix,".jpg"); | 
 |  |  |             String fileName = UUID.randomUUID() + nfix; | 
 |  |  |             String tempFileName = nowDate + "/" + fileName; | 
 |  |  |             String key =folder+ tempFileName;// 文件名 | 
 |  |  |  | 
 |  |  |             ALiYunUtil obs = new ALiYunUtil(ossModel.getEndpoint(), ossModel.getAccessId(), ossModel.getAccessKey()); | 
 |  |  |             if (obs.uploadOnlineObject(img,ossModel.getBucket(), key,null)) { | 
 |  |  |                     return  tempFileName; | 
 |  |  |             } | 
 |  |  |         }catch (Exception e){ | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |         return  null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public     String getOssImgurl(OssModel ossModel, String folder, File f) { | 
 |  |  |         if(f == null || !f.isFile()){ | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         try { | 
 |  |  |             String img = f.getPath(); | 
 |  |  |             String nowDate = DateUtil.getNowShortDate();// 当前时间(年月日) | 
 |  |  |             String nfix  = img.lastIndexOf(".")>0?img.substring(img.lastIndexOf(".")):null; | 
 |  |  |             nfix = StringUtils.defaultString(nfix,".jpg"); | 
 |  |  |             String fileName = UUID.randomUUID() + nfix; | 
 |  |  |             String tempFileName = nowDate + "/" + fileName; | 
 |  |  |             String key =folder+ tempFileName;// 文件名 | 
 |  |  |  | 
 |  |  |             ALiYunUtil obs = new ALiYunUtil(ossModel.getEndpoint(), ossModel.getAccessId(), ossModel.getAccessKey()); | 
 |  |  |             if (obs.uploadFile(ossModel.getBucket(), key,f,null)) { | 
 |  |  |                     return  tempFileName; | 
 |  |  |             } | 
 |  |  |         }catch (Exception e){ | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |         return  null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |