jiangping
2023-09-19 b96db512032a8a8889a28afb654cf360c63ad226
server/service/src/main/java/com/doumee/service/business/impl/BaseGoodsServiceImpl.java
@@ -1,6 +1,7 @@
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;
@@ -12,15 +13,15 @@
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.BaseGoodsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.model.dto.BaseGoodsCreateOrUpdateRequest;
import com.doumee.dao.business.model.dto.BaseGoodsDTO;
import com.doumee.dao.business.model.dto.BaseGoodsParamCreatRequest;
import com.doumee.dao.business.model.dto.*;
import com.doumee.service.business.BaseDataService;
import com.doumee.service.business.BaseGoodsService;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,16 +29,19 @@
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.Date;
import java.util.List;
import java.util.Objects;
import java.io.File;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 素材库-商品信息表Service实现
 * @author 江蹄蹄
 * @date 2023/09/07 11:41
 */
@Slf4j
@Service
public class BaseGoodsServiceImpl implements BaseGoodsService {
@@ -65,12 +69,21 @@
    @Autowired
    private GoodsMapper goodsMapper;
    @Autowired
    private BaseCategoryMapper baseCategoryMapper;
    @Autowired
    @Lazy
    private BaseDataService baseDataService;
    @Override
    public Integer create(BaseGoodsCreateOrUpdateRequest baseGoods) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(baseGoodsMapper.selectCount(new QueryWrapper<BaseGoods>().eq("ISDELETED", Constants.ZERO).eq("name",baseGoods.getName()))>0){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"【"+baseGoods.getName()+"】已存在");
        }
//        if(baseGoodsMapper.selectCount(new QueryWrapper<BaseGoods>().eq("ISDELETED", Constants.ZERO).eq("name",baseGoods.getName()))>0){
//            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"【"+baseGoods.getName()+"】已存在");
//        }
        Integer integer = baseGoodsMapper.selectCount(new QueryWrapper<BaseGoods>().eq("ISDELETED", Constants.ZERO));
        BaseGoods insert = new BaseGoods();
@@ -81,7 +94,8 @@
        insert.setIsdeleted(Constants.ZERO);
        insert.setRemark(baseGoods.getRemark());
        insert.setName(baseGoods.getName());
        insert.setStatus(Constants.ZERO);
        //默认下架
        insert.setStatus(Constants.ONE);
        insert.setSortnum(integer+Constants.ONE);
        insert.setImgurl(baseGoods.getImgurl());
        insert.setCategoryId(baseGoods.getCategoryId());
@@ -136,7 +150,12 @@
    @Override
    public void deleteById(Integer id) {
        baseGoodsMapper.deleteById(id);
        BaseGoods model = new BaseGoods();
        model.setId(id);
        model.setEditDate(new Date());
        model.setIsdeleted(Constants.ONE);
        updateById(model);
//        baseGoodsMapper.deleteById(id);
    }
    @Override
@@ -150,7 +169,10 @@
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        baseGoodsMapper.deleteBatchIds(ids);
        for(Integer id : ids){
            deleteById(id);
        }
//        baseGoodsMapper.deleteBatchIds(ids);
    }
@@ -159,11 +181,11 @@
    public void update(BaseGoodsCreateOrUpdateRequest baseGoods) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(baseGoodsMapper.selectCount(new QueryWrapper<BaseGoods>()
                .eq("ISDELETED",Constants.ZERO).ne("id",baseGoods.getId())
                .eq("name",baseGoods.getName()))>0){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"【"+baseGoods.getName()+"】已存在");
        }
//        if(baseGoodsMapper.selectCount(new QueryWrapper<BaseGoods>()
//                .eq("ISDELETED",Constants.ZERO).ne("id",baseGoods.getId())
//                .eq("name",baseGoods.getName()))>0){
//            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"【"+baseGoods.getName()+"】已存在");
//        }
        UpdateWrapper<BaseGoods> wrapper = new UpdateWrapper<>();
        wrapper.lambda()
@@ -287,16 +309,16 @@
        MPJLambdaWrapper<BaseGoods> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.leftJoin(Brand.class,Brand::getId,BaseGoods::getBrandId)
                .leftJoin(BaseCategory.class,BaseCategory::getId,BaseGoods::getBaseDataId)
                .leftJoin(BaseCategory.class,BaseCategory::getId,BaseGoods::getCategoryId)
                .selectAll(BaseGoods.class)
                .selectAs(Brand::getName,BaseGoodsDTO::getBrandName)
                .selectAs(BaseCategory::getSortnum,BaseGoodsDTO::getCategoryName)
                .selectAs(BaseCategory::getName,BaseGoodsDTO::getCategoryName)
                .eq(BaseGoods::getId,id);
        BaseGoodsDTO baseGoodsDTO = baseGoodsJoinMapper.selectJoinOne(BaseGoodsDTO.class, queryWrapper);
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.FILE_DIR).getCode()
                + systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.PROJECTS).getCode();
        baseGoodsDTO.setImgfullurl(prefixUrl+baseGoodsDTO.getImgurl());
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        baseGoodsDTO.setImgfullurl(StringUtils.isNotBlank(baseGoodsDTO.getImgurl()) ? prefixUrl+baseGoodsDTO.getImgurl() : null);
        List<Multifile> multifiles = multifileMapper.selectList(new QueryWrapper<Multifile>()
                .eq("OBJ_ID", id)
@@ -342,7 +364,7 @@
                    .selectAs(BaseCategory::getName,BaseGoods::getCategoryName)
                    .eq(BaseGoods::getIsdeleted, Constants.ZERO)
                    .like(StringUtils.isNotBlank(pageWrap.getModel().getName()), BaseGoods::getName,pageWrap.getModel().getName())
                    .eq(pageWrap.getModel().getId()!=null,BaseGoods::getId, pageWrap.getModel().getId())
                    .like(pageWrap.getModel().getId()!=null,BaseGoods::getId, pageWrap.getModel().getId())
                    .eq(pageWrap.getModel().getCategoryId()!=null,BaseGoods::getCategoryId, pageWrap.getModel().getCategoryId())
                    .eq(pageWrap.getModel().getBrandId()!=null,BaseGoods::getBrandId, pageWrap.getModel().getBrandId())
                    .eq(pageWrap.getModel().getStatus()!=null,BaseGoods::getStatus, pageWrap.getModel().getStatus());
@@ -357,9 +379,232 @@
        return pageData;
    }
    @Override
    public PageData<BaseGoods> findCompanyPage(PageWrap<BaseGoods> pageWrap) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        IPage<BaseGoods> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<BaseGoods> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.leftJoin(Brand.class,Brand::getId,BaseGoods::getBrandId)
                .leftJoin(BaseCategory.class,BaseCategory::getId,BaseGoods::getCategoryId)
                .selectAll(BaseGoods.class)
                .selectAs(Brand::getName,BaseGoods::getBrandName)
                .selectAs(BaseCategory::getName,BaseGoods::getCategoryName)
                .eq(BaseGoods::getStatus, Constants.ZERO)
                .eq(BaseGoods::getIsdeleted, Constants.ZERO)
                .like(StringUtils.isNotBlank(pageWrap.getModel().getName()), BaseGoods::getName,pageWrap.getModel().getName())
                .like(pageWrap.getModel().getId()!=null,BaseGoods::getId, pageWrap.getModel().getId())
                .eq(pageWrap.getModel().getCategoryId()!=null,BaseGoods::getCategoryId, pageWrap.getModel().getCategoryId())
                .eq(pageWrap.getModel().getBrandId()!=null,BaseGoods::getBrandId, pageWrap.getModel().getBrandId())
                .eq(pageWrap.getModel().getStatus()!=null,BaseGoods::getStatus, pageWrap.getModel().getStatus())
                .notExists(user.getType().equals(Constants.UserType.COMPANY.getKey())," select 1 from goods g where g.GOODS_ID = t.id and g.TYPE = 1  and  g.company_id = "+user.getCompanyId()+"  ");
        queryWrapper.orderByDesc(Goods::getId);
        PageData<BaseGoods> pageData =PageData.from(baseGoodsJoinMapper.selectJoinPage(page,BaseGoods.class,queryWrapper));
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        pageData.getRecords().forEach(i->{
            i.setFullImgUrl(prefixUrl + i.getImgurl());
        });
        return pageData;
    }
    @Override
    public long count(BaseGoods baseGoods) {
        QueryWrapper<BaseGoods> wrapper = new QueryWrapper<>(baseGoods);
        return baseGoodsMapper.selectCount(wrapper);
    }
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    @Override
    public Integer importBaseGoodsBatch(MultipartFile file) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        try {
            ExcelImporter ie = new ExcelImporter(file,0,0);
            List<BaseGoodsImportDTO> dataList = ie.getDataList(BaseGoodsImportDTO.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 platformDir =systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PLATFORM).getCode();
            String basePath = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.GOODS_IMG_DIR).getCode()
                    + proDir + platformDir ;
            OssModel ossModel = baseDataService.initOssModel();
            for (int index = 0; index < dataList.size(); index++) {
                BaseGoodsImportDTO  s = dataList.get(index);
                if(existedIdInList(s.getId(),index,dataList)){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"第【"+(1+index)+"行】商品编号【"+s.getId()+"】在表格中重复");
                }
                if(baseGoodsMapper.selectCount(new QueryWrapper<BaseGoods>().lambda().eq(BaseGoods::getIsdeleted, Constants.ZERO)
                        .eq(BaseGoods::getBaseDataId,s.getId())
                        .eq(BaseGoods::getOrigin,Constants.BasegoodsOrigin.imported))>0){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"第【"+(1+index)+"行】商品编号【"+s.getId()+"】已导入!");
                }
                BaseGoods baseGoods = new BaseGoods();
                baseGoods.setCreator(user.getId());
                baseGoods.setOrigin(Constants.BasegoodsOrigin.imported);
                baseGoods.setBaseDataId(s.getId());
                baseGoods.setCreateDate(new Date());
                baseGoods.setEditor(user.getId());
                baseGoods.setEditDate(new Date());
                baseGoods.setIsdeleted(Constants.ZERO);
                baseGoods.setName(s.getName());
                baseGoods.setStatus(Constants.ZERO);
                baseGoods.setZdPrice(new BigDecimal(s.getZdPrice()));
                baseGoods.setPrice(new BigDecimal(s.getPrice()));
                if (StringUtils.isBlank(s.getCategoryName())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"第【"+(1+index)+"行】商品类别不可为空");
                }
                QueryWrapper<BaseCategory> categoryQuery = new QueryWrapper<>();
                categoryQuery.lambda()
                    .eq(BaseCategory::getName,s.getCategoryName());
                categoryQuery.lambda()
                    .eq(BaseCategory::getIsdeleted,Constants.ZERO);
                BaseCategory baseCategory = baseCategoryMapper.selectOne(categoryQuery.last(" limit 1"));
                if (Objects.isNull(baseCategory)){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"第【"+(1+index)+"行】商品类别【"+s.getCategoryName()+"】不存在");
                }
                QueryWrapper<Brand> brandQuery = new QueryWrapper<>();
                brandQuery.lambda()
                        .eq(Brand::getType,Constants.ONE)
                        .eq(Brand::getName,s.getBrandName());
                brandQuery.lambda()
                        .eq(Brand::getIsdeleted,Constants.ZERO);
                brandQuery.lambda()
                        .eq(Brand::getType,Constants.ONE);
                Brand brand = brandMapper.selectOne(brandQuery.last("limit 1"));
                if (Objects.isNull(brand)){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"第【"+(1+index)+"行】商品品牌【"+s.getBrandName()+"】不存在");
                }
                String path =basePath+ s.getId();
                List<String> mulFiles = new ArrayList<>();
                if(StringUtils.isNotBlank(path)){
                    File dir =new File(path+File.separator);
                    if(dir!=null && dir.isDirectory()){
                        File[]  files = dir.listFiles();
                        if(files!=null && files.length>0){
                            for(File f:files){
                                if(isImgFile(f)){
                                    //取第一张图片作为列表图
                                    baseGoods.setImgurl(baseDataService.getOssImgurl(ossModel,ossModel.getGoodsFolder(),f));
                                }
                                if(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));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
//                baseGoods.setImgurl();
                baseGoods.setCategoryId(baseCategory.getId());
                baseGoods.setBrandId(brand.getId());
                baseGoodsMapper.insert(baseGoods);
                if(mulFiles !=null && mulFiles.size()>0){
                    for(int i=0;i<mulFiles.size();i++){
                        String str = mulFiles.get(i);
                        Multifile f = new Multifile();
                        f.setObjType(Constants.ONE);
                        f.setName(str);
                        f.setType(Constants.ZERO);
                        f.setObjId(baseGoods.getId());
                        f.setCreateDate(new Date());
                        f.setCreator(user.getId());
                        f.setIsdeleted(Constants.ZERO);
                        f.setSortnum(i);
                        f.setCompanyId(user.getCompanyId());
                        f.setFileurl(str);
                        multifileMapper.insert(f);
                    }
                }
                String baseGoodsParamString = s.getBaseGoodsParamString();
                List<List<String>> collect = Arrays.asList(baseGoodsParamString.split("\n"))
                        .stream()
                        .map(s1 -> Arrays.asList(s1.split("[:,:]")) )
                        .filter(s1->!CollectionUtils.isEmpty(s1))
                        .collect(Collectors.toList());
                if (!CollectionUtils.isEmpty(baseCategory.getBaseCateParamList())) {
                    for (int i = 0; i < baseCategory.getBaseCateParamList().size(); i++) {
                        BaseCateParam baseCateParam = baseCategory.getBaseCateParamList().get(i);
                        BaseGoodsParam baseGoodsParam = new BaseGoodsParam();
                        baseGoodsParam.setCreator(user.getId());
                        baseGoodsParam.setCreateDate(new Date());
                        baseGoodsParam.setEditor(user.getId());
                        baseGoodsParam.setEditDate(new Date());
                        baseGoodsParam.setIsdeleted(Constants.ZERO);
                        baseGoodsParam.setName(baseCateParam.getName());
                        baseGoodsParam.setRemark(baseCateParam.getRemark());
                        baseGoodsParam.setStatus(Constants.ZERO);
                        baseGoodsParam.setSortnum(i + Constants.ONE);
                        baseGoodsParam.setPramaId(baseCateParam.getId());
                        baseGoodsParam.setGoodsId(baseGoods.getId());
                        if (!CollectionUtils.isEmpty(collect)) {
                            List<String> list = collect.stream()
                                    .filter(s3 -> s3.get(0).equals(baseCateParam.getName()))
                                    .findFirst()
                                    .orElse(new ArrayList<>());
                            baseGoodsParam.setVal(list.size() > 1 ? list.get(1) : null);
                        }
                        baseGoodsParamMapper.insert(baseGoodsParam);
                    }
                    ;
                }
            }
        }catch (Exception e) {
            log.error(String.format("批量插入异常%s ",e.getMessage()));
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage());
        }finally {
        }
        return null;
    }
    private boolean existedIdInList(String id,int index, List<BaseGoodsImportDTO> dataList) {
        for (int j = 0; j <dataList.size(); j++) {
            if(index!=j && StringUtils.equals(id,dataList.get(j).getId())){
                return true;
            }
        }
        return false;
    }
    private boolean isImgFile(File f) {
        if(f!=null && f.isFile() ){
            String name = f.getName();
            if(name.endsWith(".jpg")
                    ||name.endsWith(".JPG")
                    ||name.endsWith(".JPEG")
                    ||name.endsWith(".jpeg")
                    ||name.endsWith(".PNG")
                    ||name.endsWith(".png")){
                return  true;
            }
        }
        return  false;
    }
}