aaa
doum
2026-06-03 7d83e5cd4c804539b66eb090e99b0569a128e365
server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -18,6 +19,8 @@
import com.doumee.dao.business.join.GoodsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.model.dto.*;
import com.doumee.dao.system.model.SystemDepartment;
import com.doumee.service.CateParamSelectService;
import com.doumee.service.business.BaseDataService;
import com.doumee.service.business.GoodsService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -29,6 +32,8 @@
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
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;
@@ -43,6 +48,8 @@
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * 商品信息表Service实现
@@ -64,6 +71,8 @@
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private BaseCategoryMapper baseCategoryMapper;
    @Autowired
    private CateAttrMapper cateAttrMapper;
    @Autowired
    private CateParamMapper cateParamMapper;
@@ -79,10 +88,13 @@
    @Autowired
    private GoodsJoinMapper goodsJoinMapper;
    @Lazy
    @Autowired
    private CateParamSelectMapper cateParamSelectMapper;
    private CateParamSelectService cateParamSelectService;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
@@ -130,6 +142,8 @@
        return goods.getId();
    }
    @Async
    @Override
    @Transactional( rollbackFor = {Exception.class, BusinessException.class})
    public  Integer createPlat(GoodCreatePlatRequest param){
@@ -153,6 +167,11 @@
        if(category.getPlatCateId() == null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请前往【类别管理】先关联平台类别!");
        }
        BaseCategory baseCategory = baseCategoryMapper.selectById(category.getPlatCateId());
        if(baseCategory == null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请前往【类别管理】先关联平台类别!");
        }
        BaseGoods bp = new BaseGoods();
        bp.setCategoryId(category.getPlatCateId());
        bp.setIsdeleted(Constants.ZERO);
@@ -175,24 +194,40 @@
            //  如果选择平台商品和查询结果对不上,提示错误
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请正确选择平台商品!");
        }
        for(BaseGoods model : goodsList){
            //遍历平台商品信息,进行商品信息同步
            Goods goods = initGoodsPlatParam(user,model,param);
            if(goods == null){
                continue;
        List<Multifile> multifileList = new ArrayList<>();
        List<GoodsParam> goodsParamList = new ArrayList<>();
        try{
            for(BaseGoods model : goodsList){
                //遍历平台商品信息,进行商品信息同步
                //分类加价系数
                model.setCateRatePrice(baseCategory.getPriceRate());
                Goods goods = initGoodsPlatParam(user,model,param);
                if(goods == null){
                    continue;
                }
                goodsMapper.insert(goods);
                //开始处理附件
                dealPlatMultifule(goods.getId(),user,model,multifileList);
                //开始处理参数配置
                dealPlatGoodsParam(model,goods,user,goodsParamList);
            }
            goodsMapper.insert(goods);
           //开始处理附件
            dealPlatMultifule(goods.getId(),user,model);
            //开始处理参数配置
            dealPlatGoodsParam(model,goods,user);
            if(multifileList.size()>0){
                multifileMapper.insertBatch(multifileList);
            }
            if(goodsParamList.size()>0){
                goodsParamMapper.insertBatch(goodsParamList);
            }
            cateParamSelectService.dealCateParamSelect();
        }catch (Exception e){
           e.printStackTrace();
        }finally {
            redisTemplate.opsForValue().set(user.getCompanyId()+Constants.OPEN_SYNC_SWITCH,false);
        }
        return 1;
    }
    private void dealPlatGoodsParam(BaseGoods model, Goods goods, LoginUserInfo user) {
    private void dealPlatGoodsParam(BaseGoods model, Goods goods, LoginUserInfo user,List<GoodsParam> paramList) {
        BaseGoodsParam baseGoodsParam = new BaseGoodsParam();
        baseGoodsParam.setGoodsId(model.getId());
        baseGoodsParam.setIsdeleted(Constants.ZERO);
@@ -220,7 +255,8 @@
                goodsParam.setVal(bgParam.getVal());
                goodsParam.setName(bgParam.getName());
                goodsParam.setPramaId(Objects.isNull(cateParam)?null:cateParam.getId());
                goodsParamMapper.insert(goodsParam);
                paramList.add(goodsParam);
//                goodsParamMapper.insert(goodsParam);
            }
        }
    }
@@ -257,10 +293,12 @@
    /**
     *  开始处理平台商品关联附件,复制一套到企业商品上
     */
    private void dealPlatMultifule(Integer id, LoginUserInfo user, BaseGoods model) {
    private void dealPlatMultifule(Integer id, LoginUserInfo user, BaseGoods model,List<Multifile> fileList ) {
        Multifile f = new Multifile();
        f.setObjId(model.getId());
        f.setObjType(Constants.ONE);
        f.setIsdeleted(Constants.ZERO);
        f.setObjType(Constants.ONE);
        List<Multifile> multifileList =multifileMapper.selectList(new QueryWrapper<>(f));
        if(!Objects.isNull(multifileList)&&multifileList.size()>Constants.ZERO){
            for (int i = 0; i < multifileList.size(); i++) {
@@ -276,7 +314,8 @@
                multifile.setName(multifile.getName());
                multifile.setSortnum(multifile.getSortnum());
                multifile.setCompanyId(user.getCompanyId());
                multifileMapper.insert(multifile);
                fileList.add(multifile);
//                multifileMapper.insert(multifile);
            }
        }
    }
@@ -288,13 +327,14 @@
                    return p.getPrice().setScale(0,BigDecimal.ROUND_CEILING);
                }
            }
            throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"数据异常请刷新重试");
        }
        //如果没有配置入手价,安装加价系数来计算
//        if(model.getCateRatePrice()==null){
//            model.setCateRatePrice(systemDictDataBiz.getGoodsPriceRate());
//        }
        if(model.getCateRatePrice()==null){
            model.setCateRatePrice(systemDictDataBiz.getGoodsPriceRate());
        }
        //返回 .multiply(model.getCateRatePrice())
        return (Constants.formatBigdecimal(model.getPrice()).multiply(param.getRate())).setScale(0,BigDecimal.ROUND_CEILING);
        return (Constants.formatBigdecimal(model.getPrice()).multiply(model.getCateRatePrice()).multiply(param.getRate())).setScale(0,BigDecimal.ROUND_CEILING);
    }
@@ -323,6 +363,9 @@
        if(!Objects.isNull(multifileList)&&multifileList.size()>Constants.ZERO){
            for (int i = 0; i < multifileList.size(); i++) {
                Multifile multifile = multifileList.get(i);
                if(StringUtils.isBlank(multifile.getFileurl())){
                    continue;
                }
                multifile.setCreator(user.getId());
                multifile.setCreateDate(new Date());
                multifile.setIsdeleted(Constants.ZERO);
@@ -338,6 +381,7 @@
        if(!Objects.isNull(goodsParamList)&&goodsParamList.size()>0){
            for (int i = 0; i < goodsParamList.size(); i++) {
                GoodsParam goodsParam = goodsParamList.get(i);
                goodsParam.setId(null);
                goodsParam.setCreator(user.getId());
                goodsParam.setCreateDate(new Date());
                goodsParam.setIsdeleted(Constants.ZERO);
@@ -371,7 +415,10 @@
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        goodsMapper.deleteBatchIds(ids);
        for(Integer id : ids){
            deleteById(id);
        }
//        goodsMapper.deleteBatchIds(ids);
    }
    @Override
@@ -464,6 +511,7 @@
        if(!Objects.isNull(goodsParamList)&&goodsParamList.size()>0){
            for (int i = 0; i < goodsParamList.size(); i++) {
                GoodsParam goodsParam = goodsParamList.get(i);
                goodsParam.setId(null);
                goodsParam.setCreator(user.getId());
                goodsParam.setCreateDate(new Date());
                goodsParam.setIsdeleted(Constants.ZERO);
@@ -547,7 +595,7 @@
                continue;
            }
            //拉式商品 且 上架时,需要限制 平台商品是否已下架
            if(dbGoods.getType().equals(Constants.goodsType.PULL)&&batchDisableDTO.getStatus().equals(Constants.ZERO)){
            if(dbGoods.getType().equals(Constants.goodsType.PULL.getValue())&&batchDisableDTO.getStatus().equals(Constants.ZERO)){
                BaseGoods baseGoods = baseGoodsMapper.selectById(dbGoods.getGoodsId());
                if(Objects.isNull(baseGoods)||!baseGoods.getStatus().equals(Constants.ZERO)){
                    errNum++;
@@ -580,7 +628,7 @@
        if(!Objects.isNull(category)){
            goods.setCategoryName(category.getName());
        }
        goods.setMultifileList(multifileMapper.selectList(new QueryWrapper<Multifile>().eq("OBJ_ID",id)));
        goods.setMultifileList(multifileMapper.selectList(new QueryWrapper<Multifile>().eq("OBJ_TYPE",Constants.ZERO).eq("OBJ_ID",id)));
        return goods;
    }
@@ -602,6 +650,7 @@
        queryWrapper.leftJoin(Category.class, Category::getId, Goods::getCategoryId);
        queryWrapper.leftJoin(Brand.class, Brand::getId, Goods::getBrandId);
        queryWrapper.eq(Goods::getStatus,Constants.ZERO);
        queryWrapper.eq(Goods::getCompanyId, goods.getCompanyId());
        queryWrapper.eq(Goods::getIsdeleted,Constants.ZERO);
        queryWrapper.like(StringUtils.isNotBlank(goods.getAttrFirstIds()),Goods::getAttrFirstIds,goods.getAttrFirstIds());
        queryWrapper.like(StringUtils.isNotBlank(goods.getAttrFirstNames()),Goods::getAttrFirstNames,goods.getAttrFirstNames());
@@ -612,14 +661,11 @@
        queryWrapper.between(!Objects.isNull(goods.getSPrice())&&!Objects.isNull(goods.getEPrice()),
                Goods::getPrice,goods.getSPrice(),goods.getEPrice());
        queryWrapper.orderByDesc(Goods::getId);
        List<Goods> goodsList = goodsJoinMapper.selectJoinList(Goods.class,queryWrapper);
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        goodsList.forEach(i->{
            i.setPrefixUrl(prefixUrl);
            i.setMultifileList(multifileMapper.selectList(new QueryWrapper<Multifile>().eq("OBJ_ID",i.getId()).orderByAsc(" SORTNUM ")));
            i.setGoodsParamList(goodsParamMapper.selectList(new QueryWrapper<GoodsParam>().eq("GOODS_ID",i.getId()).orderByAsc(" SORTNUM ")));
        });
        List<Goods> goodsList =  this.goodsMapper.selectListByCollection(goods);
      //  List<Goods> goodsList = goodsJoinMapper.selectJoinList(Goods.class,queryWrapper);
        if(!Objects.isNull(goodsList)&&goodsList.size()>Constants.ZERO){
            this.dealGoodsMsg(goodsList);
        }
        return goodsList;
    }
@@ -670,6 +716,9 @@
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        goodsIPage.getRecords().forEach(i->{
            i.setPrefixUrl(prefixUrl);
            if(i.getType().equals(Constants.ONE)){
                i.setBasePrice(Constants.formatBigdecimal(i.getBasePrice()).multiply(Constants.formatBigdecimal(i.getBasePriceRate())).setScale(0,BigDecimal.ROUND_CEILING));
            }
        });
        return PageData.from(goodsIPage);
    }
@@ -692,6 +741,265 @@
    @Override
    public Integer importBatch(MultipartFile file){
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Boolean  isGrouping = (Boolean)redisTemplate.opsForValue().get(user.getCompanyId()+Constants.COMPANY_IMPORT_GOODS);
        if(isGrouping!=null && isGrouping ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前已存在产品导入操作,此次操作无效,请稍后重试!");
        }
        redisTemplate.opsForValue().set(user.getCompanyId()+Constants.COMPANY_IMPORT_GOODS,true,30, TimeUnit.MINUTES);
        int num =1,index =1;
        try {
            ExcelImporter ie =  new ExcelImporter(file,0,0);;
            List<GoodsImport> dataList =ie.getDataList(GoodsImport.class,null);
            if(dataList == null || dataList.size() ==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!");
            }
            String proDir =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PROJECTS).getCode();
            String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.GOODS_IMG_DIR).getCode() + proDir + File.separator + user.getCompanyId();
            //品类数据
            List<Brand> brandList = brandMapper.selectList(new LambdaQueryWrapper<Brand>() .eq(Brand::getIsdeleted,Constants.ZERO)
                    .and(wapper-> wapper.eq(Brand::getCompanyId ,user.getCompanyId()).or().eq(Brand::getType,Constants.ONE)));
            //企业产品数据
            List<Goods> goodsList = goodsMapper.selectList(new LambdaQueryWrapper<Goods>() .eq(Goods::getIsdeleted,Constants.ZERO)
                    .eq(Goods::getCompanyId,user.getCompanyId()));
            //品类数据
            List<Category> categoryList = categoryMapper.selectList(new LambdaQueryWrapper<Category>() .eq(Category::getIsdeleted,Constants.ZERO)
                            .eq(Category::getCompanyId,user.getCompanyId()));
            //查询全部产品参数配置
            List<CateParam> allParamsList = cateParamMapper.selectList(new LambdaQueryWrapper<CateParam>().eq(CateParam::getIsdeleted,Constants.ZERO));
            for(GoodsImport m: dataList){
                if(StringUtils.isBlank(m.getName())
                        &&StringUtils.isBlank(m.getCategory())
                        &&StringUtils.isBlank(m.getZdPrice())
                        &&StringUtils.isBlank(m.getPrice())
                        &&StringUtils.isBlank(m.getId())
                        &&StringUtils.isBlank(m.getBrand())){
                   // 全部空行,跳过处理;
                    num++;
                    continue;
                }
                if(StringUtils.isBlank(m.getName())
                        ||StringUtils.isBlank(m.getCategory())
                        ||StringUtils.isBlank(m.getZdPrice())
                        ||StringUtils.isBlank(m.getPrice())
                        ||StringUtils.isBlank(m.getId())
                        ||StringUtils.isBlank(m.getBrand())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行数据无效,请检查输入!");
                }
                Goods g = new Goods();
                g.setIsdeleted(Constants.ZERO);
                g.setRemark(m.getId());
                g.setCompanyId(user.getCompanyId());
                //品类数据
                g = goodsMapper.selectOne(new QueryWrapper<>(g).last(" limit 1"));
                if(g != null){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品图片文件夹重复,请检查输入!");
                }
                Category cate = getCategroyByNameFromList(m.getCategory(),categoryList);
                if(cate == null){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品类别无效,请检查输入!");
                }
                Brand brand = getImportBrandByNameFromList(m.getBrand(),brandList);
                if(brand == null){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品品牌无效,请检查输入!");
                }
                if(findGoodsByNameFromList(m.getName(),goodsList) !=null){
                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"第【"+(num)+"】行产品名称【"+m.getName()+"】已存在");
                }
                Goods newModel = new Goods();
                newModel.setRemark(m.getId());
                newModel.setCategoryId(cate.getId());
                newModel.setBrandId(brand.getId());
                newModel.setIsdeleted(Constants.ZERO);
                newModel.setCreator(user.getId());
                newModel.setCompanyId(user.getCompanyId());
                newModel.setCreateDate(new Date());
                newModel.setName(m.getName());
                newModel.setStatus(Constants.ZERO);
                try {
                    newModel.setZdPrice(BigDecimal.valueOf(Double.parseDouble(m.getZdPrice())));
                    newModel.setPrice(BigDecimal.valueOf(Double.parseDouble(m.getPrice())));
                }catch (Exception e){
                }
                if(newModel.getZdPrice() == null){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行指导价无效,请检查输入!");
                }
                if(newModel.getPrice() == null){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行入手价无效,请检查输入!");
                }
                newModel.setPinyin(PinYinUtil.getFullSpell(m.getName()));
                newModel.setShortPinyin(PinYinUtil.getFirstSpell(m.getName()));
                List<String> mulFiles =getGoodsImageFileList(newModel,path);
                //查询商品信息
                goodsMapper.insert(newModel);
                //加入到已经存在的产品集合中,用于下一个信息去重处理
                goodsList.add(newModel);
                //处理产品属性业务
                dealGoodsParamBiz(cate,newModel,m,allParamsList,num);
                //处理产品图片资源业务
                dealGoodsImagesBiz(mulFiles,newModel);
                index++;//记录导入产品成功+1
            }
        }catch (BusinessException e){
            throw e;
        }catch (Exception e){
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"导入产品数据发生异常,请稍后重试!");
        }finally {
            redisTemplate.opsForValue().set(user.getCompanyId()+Constants.COMPANY_IMPORT_GOODS,false);
        }
        return  index;
    }
    private void dealGoodsImagesBiz(List<String> mulFiles, Goods newModel) {
        if(mulFiles !=null && mulFiles.size()>0){
            List<Multifile> multifileList = new ArrayList<>();
            for(int i=0;i<mulFiles.size();i++){
                String s = mulFiles.get(i);
                Multifile f = new Multifile();
                f.setObjType(Constants.ZERO);
                f.setName(s);
                f.setType(Constants.ZERO);
                f.setObjId(newModel.getId());
                f.setCreateDate(newModel.getCreateDate());
                f.setCreator(newModel.getCreator());
                f.setIsdeleted(Constants.ZERO);
                f.setSortnum(i);
                f.setCompanyId(newModel.getCompanyId());
                f.setFileurl(s);
                multifileList.add(f);
            }
            multifileMapper.insert(multifileList);
        }
    }
    private List<String> getGoodsImageFileList(Goods newModel, String path) {
        List<String> mulFiles = null;
        if(StringUtils.isNotBlank(path)){
            OssModel ossModel = baseDataService.initOssModel();
            File dir =new File(path+File.separator+newModel.getRemark()+File.separator);
            if(dir!=null && dir.isDirectory()){
                File[]  files = dir.listFiles();
                if(files!=null && files.length>0){
                    for(File f:files){
                        if(StringUtils.isBlank(newModel.getImgurl()) && isImgFile(f)){
                            //取第一张图片作为列表图
                            newModel.setImgurl(baseDataService.getOssImgurl(ossModel,ossModel.getGoodsFolder(),f));
                        }
                        if((mulFiles ==null || mulFiles.size() == 0) && f.isDirectory()){
                            //如果是文件夹
                            File[] fs = f.listFiles();
                            if(fs!=null && fs.length>0){
                                for(File mf : fs){
                                    if(isImgFile(mf)){
                                        if(mulFiles==null){
                                            mulFiles = new ArrayList<>();
                                        }
                                        mulFiles.add(baseDataService.getOssImgurl(ossModel,ossModel.getGoodsFolder(),mf));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return mulFiles;
    }
    private void dealGoodsParamBiz(Category cate, Goods newModel, GoodsImport m, List<CateParam> allParamsList,int num) {
        List<GoodsParam> paramList = new ArrayList<>();
        String[] params =  StringUtils.defaultString(m.getParamStr(),"").split("\n");
        //查询全部产品参数配置
        List<CateParam> allParams =getCateParamByCateid(cate.getId(),allParamsList);
        if(params.length > 0){
            for(String s : params){
                if(StringUtils.isBlank(s)){
                    continue;
                }
                s = s.replace(":",":");
                String[] ts = s.split(":");
                if(ts.length == 0){
                    continue;
                }
                //查询属性规格对象
                CateParam ta = getCateParamByName(ts[0], allParams);
                if(ta == null){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行产品参数中【"+s+"】无效,请检查输入!");
                }
                GoodsParam gp = new GoodsParam();
                gp.setIsdeleted(Constants.ZERO);
                gp.setCreator(newModel.getCreator());
                gp.setCreateDate(newModel.getCreateDate());
                gp.setGoodsId(newModel.getId());
                gp.setName(ta.getName());
                gp.setPramaId(ta.getId());
                gp.setStatus(Constants.ZERO);
                gp.setVal(ts.length>1?ts[1]:null);
                gp.setSortnum(ta.getSortnum());
                //插入产品参数关联表
                paramList.add(gp);
//                        goodsParamMapper.insert(gp);
            }
        }
        if(paramList.size() >0){
            goodsParamMapper.insert(paramList);
        }
    }
    private Goods findGoodsByNameFromList(String name, List<Goods> goodsList) {
        if(goodsList!=null){
            for(Goods brand :goodsList){
                if(StringUtils.equals(name.trim(),brand.getName())){
                    return brand;
                }
            }
        }
        return null;
    }
    private List<CateParam> getCateParamByCateid(Integer cateid, List<CateParam> allParamsList) {
        List<CateParam> list = null;
        if(allParamsList!=null){
            for(CateParam brand :allParamsList){
                if(Constants.equalsInteger(cateid,brand.getCategoryId())){
                   if(list == null){
                       list = new ArrayList<>();
                   }
                   list.add(brand);
                }
            }
        }
        return list;
    }
    private Category getCategroyByNameFromList(String name, List<Category> categoryList) {
        if(categoryList!=null){
            for(Category brand :categoryList){
                if(StringUtils.equals(name.trim(),brand.getName())){
                    return brand;
                }
            }
        }
        return null;
    }
    private Brand getImportBrandByNameFromList(String name, List<Brand> brandList) {
        if(brandList!=null){
            for(Brand brand :brandList){
                if(StringUtils.equals(name.trim(),brand.getName())){
                    return brand;
                }
            }
        }
        return null;
    }
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    @Override
    public Integer importBatchImg(MultipartFile file){
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        ExcelImporter ie = null;
        List<GoodsImport> dataList =null;
        try {
@@ -706,21 +1014,8 @@
        int num =1;
        for(GoodsImport m: dataList){
            if(StringUtils.isBlank(m.getName())
                    &&StringUtils.isBlank(m.getCategory())
                    &&StringUtils.isBlank(m.getZdPrice())
                    &&StringUtils.isBlank(m.getPrice())
                    &&StringUtils.isBlank(m.getId())
                    &&StringUtils.isBlank(m.getBrand())){
            if(  StringUtils.isBlank(m.getId()) ){
                continue;
            }
            if(StringUtils.isBlank(m.getName())
                    ||StringUtils.isBlank(m.getCategory())
                    ||StringUtils.isBlank(m.getZdPrice())
                    ||StringUtils.isBlank(m.getPrice())
                    ||StringUtils.isBlank(m.getId())
                    ||StringUtils.isBlank(m.getBrand())){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行数据无效,请检查输入!");
            }
            Goods g = new Goods();
            g.setIsdeleted(Constants.ZERO);
@@ -728,55 +1023,14 @@
            g.setCompanyId(user.getCompanyId());
            //品类数据
            g = goodsMapper.selectOne(new QueryWrapper<>(g).last(" limit 1"));
            if(g != null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品图片文件夹重复,请检查输入!");
            if(g == null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品不存在,请检查输入!");
            }
            Category cate = new Category();
            cate.setIsdeleted(Constants.ZERO);
            cate.setName(m.getCategory());
            cate.setCompanyId(user.getCompanyId());
            //品类数据
            cate = categoryMapper.selectOne(new QueryWrapper<>(cate).last(" limit 1"));
            if(cate == null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品类别无效,请检查输入!");
            }
            Brand brand = new Brand();
            brand.setIsdeleted(Constants.ZERO);
            brand.setName(m.getBrand());
            //品类数据
            QueryWrapper<Brand> qwrapper = new QueryWrapper<>(brand);
            qwrapper.lambda().and(wapper-> wapper.eq(Brand::getCompanyId ,user.getCompanyId()).or().eq(Brand::getType,Constants.ONE));
            brand = brandMapper.selectOne(qwrapper.last(" limit 1"));
            if(brand == null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行商品品牌无效,请检查输入!");
            }
            if(goodsMapper.selectCount(new QueryWrapper<Goods>().eq("ISDELETED",Constants.ZERO).eq("name",m.getName()))>0){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"【"+m.getName()+"】已存在");
            };
            Goods newModel = new Goods();
            newModel.setRemark(m.getId());
            newModel.setCategoryId(cate.getId());
            newModel.setBrandId(brand.getId());
            newModel.setIsdeleted(Constants.ZERO);
            newModel.setCreator(user.getId());
            newModel.setCompanyId(user.getCompanyId());
            newModel.setCreateDate(new Date());
            newModel.setName(m.getName());
            newModel.setStatus(Constants.ZERO);
            try {
                newModel.setZdPrice(BigDecimal.valueOf(Double.parseDouble(m.getZdPrice())));
                newModel.setPrice(BigDecimal.valueOf(Double.parseDouble(m.getPrice())));
            }catch (Exception e){
            }
            if(newModel.getZdPrice() == null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行指导价无效,请检查输入!");
            }
            if(newModel.getPrice() == null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行入手价无效,请检查输入!");
            }
            newModel.setPinyin(PinYinUtil.getFullSpell(m.getName()));
            newModel.setShortPinyin(PinYinUtil.getFirstSpell(m.getName()));
            Goods newModel = new Goods();
            newModel.setId(g.getId());
            newModel.setEditor(user.getId());
            newModel.setEditDate(new Date());
            String[] params =  StringUtils.defaultString(m.getParamStr(),"").split("\n");
            List<String> mulFiles = null;
@@ -814,56 +1068,13 @@
                }
            }
            //查询商品信息
            goodsMapper.insert(newModel);
            CateParam cp = new CateParam();
            cp.setIsdeleted(Constants.ZERO);
            cp.setCategoryId(cate.getId());
            //查询全部产品参数配置
            List<CateParam> allParams = cateParamMapper.selectList(new QueryWrapper<>(cp));
            if(params.length > 0){
                for(String s : params){
                    if(StringUtils.isBlank(s)){
                        continue;
                    }
                    s = s.replace(":",":");
                    String[] ts = s.split(":");
                    if(ts.length == 0){
                        continue;
                    }
                    //查询属性规格对象
                    CateParam ta = getCateParamByName(ts[0], allParams);
                    if(ta == null){
                        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(num)+"】行产品参数中【"+s+"】无效,请检查输入!");
                    }
                    GoodsParam gp = new GoodsParam();
                    gp.setIsdeleted(Constants.ZERO);
                    gp.setCreator(user.getId());
                    gp.setCreateDate(newModel.getCreateDate());
                    gp.setGoodsId(newModel.getId());
                    gp.setName(ta.getName());
                    gp.setPramaId(ta.getId());
                    gp.setStatus(Constants.ZERO);
                    gp.setVal(ts.length>1?ts[1]:null);
                    gp.setSortnum(ta.getSortnum());
                    //插入产品参数关联表
                    goodsParamMapper.insert(gp);
                    //存储 cate_param_select 查询是否已存在
//                    if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
//                            .eq("PARAM_ID",gp.getPramaId()).eq("NAME",gp.getName()))<=Constants.ZERO){
//                        CateParamSelect cateParamSelect = new CateParamSelect();
//                        cateParamSelect.setCreator(user.getId());
//                        cateParamSelect.setCreateDate(new Date());
//                        cateParamSelect.setName(gp.getVal());
//                        cateParamSelect.setIsdeleted(Constants.ZERO);
//                        cateParamSelect.setStatus(Constants.ZERO);
//                        cateParamSelect.setParamId(gp.getPramaId());
//                        cateParamSelect.setCategoryId(newModel.getCategoryId());
//                        cateParamSelect.setStatus(Constants.ZERO);
//                        cateParamSelectMapper.insert(cateParamSelect);
//                    };
                }
            }
            goodsMapper.updateById(newModel);
            if(mulFiles !=null && mulFiles.size()>0){
                multifileMapper.update(null,new UpdateWrapper<Multifile>().lambda()
                        .set(Multifile::getIsdeleted,Constants.ONE)
                        .eq(Multifile::getIsdeleted,Constants.ZERO)
                        .eq(Multifile::getObjId,g.getId())
                        .eq(Multifile::getType,Constants.ZERO));
                for(int i=0;i<mulFiles.size();i++){
                    String s = mulFiles.get(i);
                    Multifile f = new Multifile();
@@ -1060,18 +1271,36 @@
                .apply(!Objects.isNull(pageWrap.getModel()) && !Objects.isNull(pageWrap.getModel().getEPrice()), "  t.PRICE <=  "+pageWrap.getModel().getEPrice()+" ");
        queryWrapper.orderByDesc(Goods::getId);
        IPage<Goods> goodsIPage =  goodsJoinMapper.selectJoinPage(page, Goods.class, queryWrapper);
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        goodsIPage.getRecords().forEach(i->{
            i.setPrefixUrl(prefixUrl);
            i.setMultifileList(multifileMapper.selectList(new QueryWrapper<Multifile>().eq("OBJ_ID",i.getId()).orderByAsc(" SORTNUM ")));
            i.setGoodsParamList(goodsParamMapper.selectList(new QueryWrapper<GoodsParam>()
                    .eq("GOODS_ID",i.getId())
                    .orderByAsc(" SORTNUM ")));
        });
        if(!Objects.isNull(goodsIPage.getRecords())&&goodsIPage.getRecords().size()>Constants.ZERO){
            this.dealGoodsMsg(goodsIPage.getRecords());
        }
        return PageData.from(goodsIPage);
    }
    public void dealGoodsMsg(List<Goods> goodsList){
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        String prefixUrlCategory = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.CATEGORY_IMG).getCode();
        List<Integer> integerList = goodsList.stream().map(Goods::getId).collect(Collectors.toList());
        List<Multifile> mFileList = multifileMapper.selectList(new QueryWrapper<Multifile>()
                .lambda().in(Multifile::getObjId,integerList)
                .eq(Multifile::getType,Constants.ZERO)
                .eq(Multifile::getIsdeleted,Constants.ZERO)
                .eq(Multifile::getObjType,Constants.ZERO));
        List<GoodsParam> goodsParamList = goodsParamMapper.selectList(new QueryWrapper<GoodsParam>()
                    .in("GOODS_ID",integerList)
                    .orderByAsc(" SORTNUM "));
        goodsList.forEach(i->{
            i.setCategoryImgurl(prefixUrlCategory + i.getCategoryImgurl());
            i.setPrefixUrl(prefixUrl);
            i.setMultifileList(mFileList.stream().filter(s -> s.getObjId().equals(i.getId())).collect(Collectors.toList()));
            i.setGoodsParamList(goodsParamList.stream().filter(s -> s.getGoodsId().equals(i.getId())).collect(Collectors.toList()));
        });
    }
    @Override
    public List<Goods> findListForH5(GoodsRequest goodsRequest) {
@@ -1104,18 +1333,23 @@
                .apply(!Objects.isNull(goodsRequest) && !Objects.isNull(goodsRequest.getEPrice()), "  t.PRICE <=  "+goodsRequest.getEPrice()+" ");
        queryWrapper.orderByDesc(Goods::getId);
        List<Goods> goodsList = goodsJoinMapper.selectJoinList(Goods.class,queryWrapper);
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        goodsList.forEach(i->{
            i.setPrefixUrl(prefixUrl);
            i.setMultifileList(multifileMapper.selectList(new QueryWrapper<Multifile>().eq("OBJ_ID",i.getId()).orderByAsc(" SORTNUM ")));
            i.setGoodsParamList(goodsParamMapper.selectList(
                    new QueryWrapper<GoodsParam>().eq("GOODS_ID",i.getId())
                            .apply(" name in ( select cp.NAME from cate_param cp where cp.CATEGORY_ID = "+i.getCategoryId()+" and cp.ISSHOW = 1 and cp.ISDELETED = 0 and cp.STATUS = 0 ) ")
                            .orderByAsc(" SORTNUM ")));
        });
        if(!Objects.isNull(goodsList)&&goodsList.size()>Constants.ZERO){
            this.dealGoodsMsg(goodsList);
        }
        return goodsList;
    }
    @Override
    @Transactional
    public  void openSyncSwitch() {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Boolean  openSyncSwitch = (Boolean)redisTemplate.opsForValue().get(loginUserInfo.getCompanyId()+Constants.OPEN_SYNC_SWITCH);
        if(openSyncSwitch!=null && openSyncSwitch ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据同步中,请稍后刷新重试");
        }
        redisTemplate.opsForValue().set(loginUserInfo.getCompanyId()+Constants.OPEN_SYNC_SWITCH,true);
    }
}