|
|
@@ -0,0 +1,600 @@
|
|
|
+package org.dromara.product.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.alibaba.csp.sentinel.transport.endpoint.Protocol;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
+import org.dromara.easyes.core.biz.EsPageInfo;
|
|
|
+import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
|
|
+import org.dromara.easyes.core.conditions.update.LambdaEsUpdateWrapper;
|
|
|
+import org.dromara.external.api.domain.ExternalItemDto;
|
|
|
+import org.dromara.external.api.domain.ExternalProductDto;
|
|
|
+import org.dromara.external.api.service.RemoteExternalItemService;
|
|
|
+import org.dromara.external.api.service.RemoteExternalProductService;
|
|
|
+import org.dromara.product.domain.*;
|
|
|
+import org.dromara.product.domain.bo.ProductBaseBo;
|
|
|
+import org.dromara.product.domain.vo.ProductBaseVo;
|
|
|
+import org.dromara.product.domain.vo.ProductPoolLinkAuditVo;
|
|
|
+import org.dromara.product.esmapper.ProductEsMapper;
|
|
|
+import org.dromara.product.mapper.*;
|
|
|
+import org.dromara.system.api.RemoteUserService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.dromara.product.domain.bo.ProductPoolAuditBo;
|
|
|
+import org.dromara.product.domain.vo.ProductPoolAuditVo;
|
|
|
+import org.dromara.product.service.IProductPoolAuditService;
|
|
|
+import org.dromara.common.core.exception.ServiceException;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 产品池审核Service业务层处理
|
|
|
+ *
|
|
|
+ * @author LionLi
|
|
|
+ * @date 2026-03-27
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class ProductPoolAuditServiceImpl extends ServiceImpl<ProductPoolAuditMapper, ProductPoolAudit> implements IProductPoolAuditService {
|
|
|
+
|
|
|
+ private final ProductPoolAuditMapper baseMapper;
|
|
|
+
|
|
|
+ //产品池和产品关联审核对象
|
|
|
+ private final ProductPoolLinkAuditMapper productPoolLinkAuditMapper;
|
|
|
+ //产品池
|
|
|
+ private final ProductPoolMapper productPoolMapper;
|
|
|
+ //产品池产品关联对象
|
|
|
+ private final ProductPoolLinkMapper productPoolLinkMapper;
|
|
|
+ //客户协议
|
|
|
+ private final ProtocolInfoMapper protocolInfoMapper;
|
|
|
+ //客户协议商品池
|
|
|
+ private final ProtocolProductsMapper protocolProductsMapper;
|
|
|
+ //商品
|
|
|
+ private final ProductEsMapper productEsMapper;
|
|
|
+ //商品
|
|
|
+ private final ProductBaseMapper productBaseMapper;
|
|
|
+
|
|
|
+ @DubboReference
|
|
|
+ private RemoteUserService remoteUserService;
|
|
|
+ //项目对象
|
|
|
+ @DubboReference
|
|
|
+ private RemoteExternalItemService remoteExternalItemService;
|
|
|
+ //项目商品池
|
|
|
+ @DubboReference
|
|
|
+ private RemoteExternalProductService remoteExternalProductService;
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询产品池审核
|
|
|
+ *
|
|
|
+ * @param id 主键
|
|
|
+ * @return 产品池审核
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ProductPoolAuditVo queryById(Long id){
|
|
|
+ ProductPoolAuditVo productPoolAuditVo = baseMapper.selectVoById(id);
|
|
|
+ if (productPoolAuditVo != null) {
|
|
|
+ Long createBy = productPoolAuditVo.getCreateBy();
|
|
|
+ if(createBy != null) {
|
|
|
+ String CreateByName = remoteUserService.selectNicknameById(createBy);
|
|
|
+ if(CreateByName != null) {
|
|
|
+ productPoolAuditVo.setCreateByName(CreateByName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Long auditUserId = productPoolAuditVo.getAuditUserId();
|
|
|
+ if(auditUserId != null) {
|
|
|
+ String AuditByName = remoteUserService.selectNicknameById(auditUserId);
|
|
|
+ if(AuditByName != null) {
|
|
|
+ productPoolAuditVo.setAuditByName(AuditByName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 根据类型回显产品池名称
|
|
|
+ setPoolNameByType(productPoolAuditVo);
|
|
|
+ }
|
|
|
+ return productPoolAuditVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询产品池审核列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 产品池审核分页列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<ProductPoolAuditVo> queryPageList(ProductPoolAuditBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<ProductPoolAudit> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<ProductPoolAuditVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ result.getRecords().forEach(item -> {
|
|
|
+ Long createBy = item.getCreateBy();
|
|
|
+ if(createBy != null) {
|
|
|
+ String CreateByName = remoteUserService.selectNicknameById(createBy);
|
|
|
+ if(CreateByName != null) {
|
|
|
+ item.setCreateByName(CreateByName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Long auditUserId = item.getAuditUserId();
|
|
|
+ if(auditUserId != null) {
|
|
|
+ String AuditByName = remoteUserService.selectNicknameById(auditUserId);
|
|
|
+ if(AuditByName != null) {
|
|
|
+ item.setAuditByName(AuditByName);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 根据类型回显产品池名称
|
|
|
+ setPoolNameByType(item);
|
|
|
+ });
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询符合条件的产品池审核列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @return 产品池审核列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<ProductPoolAuditVo> queryList(ProductPoolAuditBo bo) {
|
|
|
+ LambdaQueryWrapper<ProductPoolAudit> lqw = buildQueryWrapper(bo);
|
|
|
+ return baseMapper.selectVoList(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<ProductPoolAudit> buildQueryWrapper(ProductPoolAuditBo bo) {
|
|
|
+ Map<String, Object> params = bo.getParams();
|
|
|
+ LambdaQueryWrapper<ProductPoolAudit> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.orderByAsc(ProductPoolAudit::getId);
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getName()), ProductPoolAudit::getName, bo.getName());
|
|
|
+ lqw.eq(bo.getPoolId() != null, ProductPoolAudit::getPoolId, bo.getPoolId());
|
|
|
+ lqw.eq(bo.getItemId() != null, ProductPoolAudit::getItemId, bo.getItemId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getType()), ProductPoolAudit::getType, bo.getType());
|
|
|
+ lqw.eq(bo.getProtocolId() != null, ProductPoolAudit::getProtocolId, bo.getProtocolId());
|
|
|
+ lqw.eq(bo.getCustomerId() != null, ProductPoolAudit::getCustomerId, bo.getCustomerId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getProductReviewStatus()), ProductPoolAudit::getProductReviewStatus, bo.getProductReviewStatus());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getReviewReason()), ProductPoolAudit::getReviewReason, bo.getReviewReason());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductPoolAudit::getPlatformCode, bo.getPlatformCode());
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增产品池审核
|
|
|
+ *
|
|
|
+ * @param bo 产品池审核
|
|
|
+ * @return 是否新增成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean insertByBo(ProductPoolAuditBo bo) {
|
|
|
+ ProductPoolAudit add = MapstructUtils.convert(bo, ProductPoolAudit.class);
|
|
|
+ validEntityBeforeSave(add);
|
|
|
+ boolean flag = baseMapper.insert(add) > 0;
|
|
|
+ if (flag) {
|
|
|
+ bo.setId(add.getId());
|
|
|
+ // 保存产品池和产品关联审核数据
|
|
|
+ if (bo.getProducts() != null && !bo.getProducts().isEmpty()) {
|
|
|
+ savePoolLinkAudits(bo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改产品池审核
|
|
|
+ *
|
|
|
+ * @param bo 产品池审核
|
|
|
+ * @return 是否修改成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean updateByBo(ProductPoolAuditBo bo) {
|
|
|
+ ProductPoolAudit update = MapstructUtils.convert(bo, ProductPoolAudit.class);
|
|
|
+ validEntityBeforeSave(update);
|
|
|
+ boolean flag = baseMapper.updateById(update) > 0;
|
|
|
+ if (flag) {
|
|
|
+ // 先删除旧的产品关联审核数据
|
|
|
+ productPoolLinkAuditMapper.delete(Wrappers.<ProductPoolLinkAudit>lambdaQuery()
|
|
|
+ .eq(ProductPoolLinkAudit::getPoolAuditId, bo.getId()));
|
|
|
+
|
|
|
+ // 再保存新的产品关联审核数据
|
|
|
+ if (bo.getProducts() != null && !bo.getProducts().isEmpty()) {
|
|
|
+ savePoolLinkAudits(bo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据类型设置产品池名称
|
|
|
+ * 0 自营产品池,1 精选产品池,4 营销产品池 -> 查询 product_pool 表
|
|
|
+ * 2 协议产品池 -> 查询 protocol_info 表
|
|
|
+ * 3 项目产品池 -> 调用远程服务查询外部项目
|
|
|
+ */
|
|
|
+ private void setPoolNameByType(ProductPoolAuditVo vo) {
|
|
|
+ String type = vo.getType();
|
|
|
+ if (type == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ("0".equals(type) ) {
|
|
|
+ //自营产品池
|
|
|
+ //获取所有的审核池里的商品id
|
|
|
+ List<ProductPoolLinkAudit> productPoolLinkAudits = productPoolLinkAuditMapper.selectList(Wrappers.<ProductPoolLinkAudit>lambdaQuery()
|
|
|
+ .eq(ProductPoolLinkAudit::getPoolAuditId, vo.getId())
|
|
|
+ );
|
|
|
+ List<Long> productIds = productPoolLinkAudits.stream().map(ProductPoolLinkAudit::getProductId).collect(Collectors.toList());
|
|
|
+ //将商品改为自营
|
|
|
+ productBaseMapper.update(Wrappers.<ProductBase>lambdaUpdate()
|
|
|
+ .set(ProductBase::getIsSelf, 1)
|
|
|
+ .in(ProductBase::getId, productIds)
|
|
|
+ );
|
|
|
+ productEsMapper.update(new LambdaEsUpdateWrapper<ProductBaseVo>()
|
|
|
+ .set(ProductBaseVo::getIsSelf, 1)
|
|
|
+ .in(ProductBaseVo::getId, productIds)
|
|
|
+ );
|
|
|
+ } if ("1".equals(type)) {
|
|
|
+ //精选产品池
|
|
|
+ //获取所有的审核池里的商品id
|
|
|
+ List<ProductPoolLinkAudit> productPoolLinkAudits = productPoolLinkAuditMapper.selectList(Wrappers.<ProductPoolLinkAudit>lambdaQuery()
|
|
|
+ .eq(ProductPoolLinkAudit::getPoolAuditId, vo.getId())
|
|
|
+ );
|
|
|
+ List<Long> productIds = productPoolLinkAudits.stream().map(ProductPoolLinkAudit::getProductId).collect(Collectors.toList());
|
|
|
+ //将商品改为自营
|
|
|
+ productBaseMapper.update(Wrappers.<ProductBase>lambdaUpdate()
|
|
|
+ .set(ProductBase::getProductCategory, 2)
|
|
|
+ .in(ProductBase::getId, productIds)
|
|
|
+ );
|
|
|
+ productEsMapper.update(new LambdaEsUpdateWrapper<ProductBaseVo>()
|
|
|
+ .set(ProductBaseVo::getProductCategory, 2)
|
|
|
+ .in(ProductBaseVo::getId, productIds)
|
|
|
+ );
|
|
|
+ } else if ("2".equals(type)) {
|
|
|
+ // 协议产品池
|
|
|
+ if (vo.getProtocolId() != null) {
|
|
|
+ ProtocolInfo protocolInfo = protocolInfoMapper.selectById(vo.getProtocolId());
|
|
|
+ if (protocolInfo != null) {
|
|
|
+ vo.setPoolName(protocolInfo.getProtocolNo());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if ("3".equals(type)) {
|
|
|
+ // 项目产品池
|
|
|
+ if (vo.getItemId() != null && remoteExternalItemService != null) {
|
|
|
+ try {
|
|
|
+ ExternalItemDto itemInfo = remoteExternalItemService.getItemInfo(vo.getItemId());
|
|
|
+ if (itemInfo != null) {
|
|
|
+ vo.setPoolName(itemInfo.getItemName());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("获取项目信息失败:itemId={}", vo.getItemId(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else if ("4".equals(type)){
|
|
|
+ //营销产品池
|
|
|
+ if (vo.getPoolId() != null) {
|
|
|
+ ProductPool productPool = productPoolMapper.selectById(vo.getPoolId());
|
|
|
+ if (productPool != null) {
|
|
|
+ vo.setPoolName(productPool.getName());
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ log.warn("获取营销产品池信息失败:itemId={}", vo.getPoolId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存前的数据校验
|
|
|
+ */
|
|
|
+ private void validEntityBeforeSave(ProductPoolAudit entity){
|
|
|
+ //TODO 做一些数据校验,如唯一约束
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存产品池和产品关联审核数据
|
|
|
+ *
|
|
|
+ * @param bo 产品审核业务对象
|
|
|
+ */
|
|
|
+ private void savePoolLinkAudits(ProductPoolAuditBo bo) {
|
|
|
+ List<ProductPoolAuditBo.ProductItem> products = bo.getProducts();
|
|
|
+ for (ProductPoolAuditBo.ProductItem product : products) {
|
|
|
+ ProductPoolLinkAudit linkAudit = new ProductPoolLinkAudit();
|
|
|
+ linkAudit.setPoolAuditId(bo.getId());
|
|
|
+ linkAudit.setPoolId(bo.getPoolId());
|
|
|
+ linkAudit.setItemId(bo.getItemId());
|
|
|
+ linkAudit.setProductId(product.getProductId());
|
|
|
+ linkAudit.setProductPrice(product.getProductPrice());
|
|
|
+ linkAudit.setNegotiatedPrice(product.getNegotiatedPrice());
|
|
|
+ linkAudit.setCategoryId(product.getCategoryId());
|
|
|
+ linkAudit.setProductReviewStatus("0"); // 0=待提交
|
|
|
+ linkAudit.setReviewer(String.valueOf(LoginHelper.getUserId()));
|
|
|
+
|
|
|
+ productPoolLinkAuditMapper.insert(linkAudit);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验并批量删除产品池审核信息
|
|
|
+ *
|
|
|
+ * @param ids 待删除的主键集合
|
|
|
+ * @param isValid 是否进行有效性校验
|
|
|
+ * @return 是否删除成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if(isValid){
|
|
|
+ //TODO 做一些业务上的校验,判断是否需要校验
|
|
|
+ }
|
|
|
+ return baseMapper.deleteByIds(ids) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取产品池产品审核列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery
|
|
|
+ * @return 产品池审核列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<ProductBaseVo> getPoolAuditProductPage(ProductBaseBo bo, PageQuery pageQuery) {
|
|
|
+ List<ProductPoolLinkAuditVo> productPoolLinkAuditVos = productPoolLinkAuditMapper.selectVoList(Wrappers.lambdaQuery(ProductPoolLinkAudit.class)
|
|
|
+ .eq(ProductPoolLinkAudit::getPoolAuditId, bo.getPoolAuditId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getAuditStatus()),ProductPoolLinkAudit::getProductReviewStatus, bo.getAuditStatus())
|
|
|
+ );
|
|
|
+ if (CollUtil.isEmpty(productPoolLinkAuditVos)) {
|
|
|
+ return TableDataInfo.build();
|
|
|
+ }
|
|
|
+ LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<>();
|
|
|
+ esQueryWrapper.in(ProductBaseVo::getId, productPoolLinkAuditVos.stream().map(ProductPoolLinkAuditVo::getProductId).toList())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductNo()), ProductBaseVo::getProductNo, bo.getProductNo())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getItemName()), ProductBaseVo::getItemName, bo.getItemName())
|
|
|
+ .like(ObjectUtil.isNotEmpty(bo.getBrandName()), ProductBaseVo::getBrandName, bo.getBrandName())
|
|
|
+ .eq(bo.getBrandId() != null, ProductBaseVo::getBrandId, bo.getBrandId())
|
|
|
+ .eq(bo.getTopCategoryId() != null, ProductBaseVo::getTopCategoryId, bo.getTopCategoryId())
|
|
|
+ .eq(bo.getMediumCategoryId() != null, ProductBaseVo::getMediumCategoryId, bo.getMediumCategoryId())
|
|
|
+ .eq(bo.getBottomCategoryId() != null, ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getUnitId()), ProductBaseVo::getUnitId, bo.getUnitId())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), ProductBaseVo::getProductStatus, bo.getProductStatus())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getIsSelf()), ProductBaseVo::getIsSelf, bo.getIsSelf())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()), ProductBaseVo::getProductReviewStatus, bo.getProductReviewStatus())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getDataSource()), ProductBaseVo::getDataSource, bo.getDataSource())
|
|
|
+ .eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
|
|
|
+ .orderByDesc(ProductBaseVo::getCreateTime)
|
|
|
+ ;
|
|
|
+ EsPageInfo<ProductBaseVo> esPageInfo = productEsMapper.pageQuery(esQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
|
|
|
+ TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(esPageInfo.getList());
|
|
|
+ tableDataInfo.setTotal(esPageInfo.getTotal());
|
|
|
+ tableDataInfo.getRows().forEach(item -> {
|
|
|
+ item.setExternalPrice(productPoolLinkAuditVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getProductPrice());
|
|
|
+ item.setAgreementPrice(productPoolLinkAuditVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getNegotiatedPrice());
|
|
|
+ item.setPoolAuditProductId(productPoolLinkAuditVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getId());
|
|
|
+ item.setAuditStatus(Integer.valueOf(productPoolLinkAuditVos.stream().filter(o -> o.getProductId().equals(item.getId())).findFirst().get().getProductReviewStatus()));
|
|
|
+ });
|
|
|
+
|
|
|
+ return tableDataInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量审核产品池商品
|
|
|
+ *
|
|
|
+ * @param poolAuditId 审核池 ID
|
|
|
+ * @param productIds 产品 ID 列表
|
|
|
+ * @param auditStatus 审核状态 2=通过,3=驳回
|
|
|
+ * @param reason 审核原因
|
|
|
+ * @return 是否审核成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean batchAuditProducts(Long poolAuditId, List<Long> productIds, String auditStatus, String reason) {
|
|
|
+ // 查询审核池信息
|
|
|
+ ProductPoolAudit audit = baseMapper.selectById(poolAuditId);
|
|
|
+ if (audit == null) {
|
|
|
+ throw new ServiceException("审核池不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询审核池关联的产品
|
|
|
+ List<ProductPoolLinkAudit> linkAudits = productPoolLinkAuditMapper.selectList(
|
|
|
+ Wrappers.lambdaQuery(ProductPoolLinkAudit.class)
|
|
|
+ .eq(ProductPoolLinkAudit::getPoolAuditId, poolAuditId)
|
|
|
+ .eq(ProductPoolLinkAudit::getProductReviewStatus, "2")
|
|
|
+// .in(ProductPoolLinkAudit::getProductId, productIds)
|
|
|
+ );
|
|
|
+
|
|
|
+ if (CollUtil.isEmpty(linkAudits)) {
|
|
|
+ throw new ServiceException("未找到待审核的产品");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取当前用户 ID(审核人)- 从安全上下文获取
|
|
|
+ Long currentUserId = null;
|
|
|
+ try {
|
|
|
+ currentUserId = LoginHelper.getUserId();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("无法获取当前用户 ID,使用默认值", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ("2".equals(auditStatus)) {
|
|
|
+ // 审核通过:根据类型添加到不同的表
|
|
|
+ handleAuditPass(audit, linkAudits, currentUserId);
|
|
|
+ } else if ("3".equals(auditStatus)) {
|
|
|
+ // 审核驳回:只需要填写原因
|
|
|
+// handleAuditReject(poolAuditId, productIds, reason, currentUserId);
|
|
|
+ } else {
|
|
|
+ throw new ServiceException("无效的审核状态");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新审核池主表状态
|
|
|
+ updateAuditStatus(audit, auditStatus, reason, currentUserId);
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理审核通过
|
|
|
+ */
|
|
|
+ private void handleAuditPass(ProductPoolAudit audit, List<ProductPoolLinkAudit> linkAudits, Long currentUserId) {
|
|
|
+ String type = audit.getType();
|
|
|
+
|
|
|
+ if ("0".equals(type) || "1".equals(type) || "4".equals(type)) {
|
|
|
+ // 自营产品池、精选产品池、营销产品池 -> 添加到 product_pool_link
|
|
|
+ addToProductPoolLink(audit, linkAudits, currentUserId);
|
|
|
+ }else if ("".equals(type)) {
|
|
|
+ // 协议产品池 -> 添加到 protocol_products
|
|
|
+ addToProtocolProducts(audit, linkAudits, currentUserId);
|
|
|
+ } else if ("3".equals(type)) {
|
|
|
+ // 项目产品池 -> 调用远程服务添加到外部项目商品池
|
|
|
+ addToExternalProductPool(audit, linkAudits, currentUserId);
|
|
|
+ } else if ("2".equals(type)) {
|
|
|
+ // 协议产品池 -> 添加到 protocol_products
|
|
|
+ addToProtocolProducts(audit, linkAudits, currentUserId);
|
|
|
+ } else if ("3".equals(type)) {
|
|
|
+ // 项目产品池 -> 调用远程服务添加到外部项目商品池
|
|
|
+ addToExternalProductPool(audit, linkAudits, currentUserId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加到自营产品池
|
|
|
+ */
|
|
|
+ private void addToProductPoolLink(ProductPoolAudit audit, List<ProductPoolLinkAudit> linkAudits, Long currentUserId) {
|
|
|
+ List<ProductPoolLink> poolLinks = linkAudits.stream().map(link -> {
|
|
|
+ ProductPoolLink poolLink = new ProductPoolLink();
|
|
|
+ poolLink.setPoolId(audit.getPoolId());
|
|
|
+ poolLink.setItemId(audit.getItemId());
|
|
|
+ poolLink.setCategoryId(link.getCategoryId());
|
|
|
+ poolLink.setProductId(link.getProductId());
|
|
|
+ poolLink.setProductPrice(link.getProductPrice());
|
|
|
+ poolLink.setNegotiatedPrice(link.getNegotiatedPrice());
|
|
|
+ poolLink.setStock(0L); // 初始库存为 0
|
|
|
+ poolLink.setProductReviewStatus("2"); // 审核通过
|
|
|
+ poolLink.setIsShow("1"); // 默认显示
|
|
|
+ poolLink.setIsPoolStatus("1"); // 在池中
|
|
|
+ poolLink.setReviewer(String.valueOf(currentUserId));
|
|
|
+ return poolLink;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 批量插入
|
|
|
+ if (CollUtil.isNotEmpty(poolLinks)) {
|
|
|
+ productPoolLinkMapper.insertBatch(poolLinks);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加到协议产品池
|
|
|
+ */
|
|
|
+ private void addToProtocolProducts(ProductPoolAudit audit, List<ProductPoolLinkAudit> linkAudits, Long currentUserId) {
|
|
|
+ //获取协议
|
|
|
+ ProtocolInfo protocolInfo = protocolInfoMapper.selectById(audit.getProtocolId());
|
|
|
+
|
|
|
+ List<ProtocolProducts> products = linkAudits.stream().map(link -> {
|
|
|
+ ProtocolProducts product = new ProtocolProducts();
|
|
|
+ product.setProtocolId(audit.getProtocolId());
|
|
|
+ if (protocolInfo != null) {
|
|
|
+ product.setProtocolNo(protocolInfo.getProtocolNo());
|
|
|
+ product.setDataSource(protocolInfo.getDataSource());
|
|
|
+ product.setCustomerId(protocolInfo.getCustomerId());
|
|
|
+ }
|
|
|
+ //获取协议商品
|
|
|
+ ProtocolProducts protocolProducts = protocolProductsMapper.selectOne(Wrappers.lambdaQuery(ProtocolProducts.class)
|
|
|
+ .eq(ProtocolProducts::getProductId, link.getProductId())
|
|
|
+ .eq(ProtocolProducts::getProtocolId, audit.getProtocolId())
|
|
|
+ .last("LIMIT 1")
|
|
|
+ );
|
|
|
+ product.setProductNo(protocolProducts.getProductNo());
|
|
|
+
|
|
|
+ product.setId(protocolProducts.getProtocolId());
|
|
|
+ product.setAgreementPrice(link.getNegotiatedPrice());
|
|
|
+ product.setAuditStatus(2); // 审核通过
|
|
|
+ product.setStatus("0"); // 正常状态
|
|
|
+ product.setDelFlag("0"); // 未删除
|
|
|
+ return product;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 批量插入 如果存在冲突的记录,则更新
|
|
|
+ if (CollUtil.isNotEmpty(products)) {
|
|
|
+ protocolProductsMapper.insertBatch(products);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加到外部项目产品池
|
|
|
+ */
|
|
|
+ private void addToExternalProductPool(ProductPoolAudit audit, List<ProductPoolLinkAudit> linkAudits, Long currentUserId) {
|
|
|
+ //获取项目
|
|
|
+// ExternalItemDto itemInfo = remoteExternalItemService.getItemInfo(audit.getItemId());
|
|
|
+ List<ExternalProductDto> externalProductDtos = linkAudits.stream().map(link -> {
|
|
|
+ ExternalProductDto product = new ExternalProductDto();
|
|
|
+ product.setItemId(audit.getItemId());
|
|
|
+ product.setProductId(link.getProductId());
|
|
|
+ ProductBaseVo productBaseVo = productEsMapper.selectById(link.getProductId());
|
|
|
+ if (ObjectUtil.isNotEmpty(productBaseVo)) {
|
|
|
+ product.setProductNo(productBaseVo.getProductNo());
|
|
|
+ product.setItemName(productBaseVo.getItemName());
|
|
|
+ }
|
|
|
+ return product;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 调用远程服务添加到外部项目商品池
|
|
|
+ if (remoteExternalProductService != null) {
|
|
|
+ try {
|
|
|
+ remoteExternalProductService.syncExternalProduct( externalProductDtos);
|
|
|
+ // 暂时直接记录日志,实际应该调用远程服务
|
|
|
+ log.info("添加产品到项目池:, ItemId={}", audit.getItemId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("添加产品到外部项目池失败", e);
|
|
|
+ throw new ServiceException("添加产品到项目池失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理审核驳回
|
|
|
+ */
|
|
|
+ private void handleAuditReject(Long poolAuditId, List<Long> productIds, String reason, Long currentUserId) {
|
|
|
+ // 更新审核关联表的状态和原因
|
|
|
+ for (Long productId : productIds) {
|
|
|
+ productPoolLinkAuditMapper.update(null,
|
|
|
+ Wrappers.lambdaUpdate(ProductPoolLinkAudit.class)
|
|
|
+ .set(ProductPoolLinkAudit::getProductReviewStatus, "3")
|
|
|
+ .set(ProductPoolLinkAudit::getReviewReason, reason)
|
|
|
+ .set(ProductPoolLinkAudit::getReviewer, String.valueOf(currentUserId))
|
|
|
+ .eq(ProductPoolLinkAudit::getPoolAuditId, poolAuditId)
|
|
|
+ .eq(ProductPoolLinkAudit::getProductId, productId)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新审核池主表状态
|
|
|
+ */
|
|
|
+ private void updateAuditStatus(ProductPoolAudit audit, String auditStatus, String reason, Long currentUserId) {
|
|
|
+ audit.setProductReviewStatus(auditStatus);
|
|
|
+ audit.setReviewReason(reason);
|
|
|
+ audit.setAuditUserId(currentUserId);
|
|
|
+ audit.setAuditTime(DateUtil.date());
|
|
|
+ baseMapper.updateById(audit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清空审核池
|
|
|
+ *
|
|
|
+ * @param id 审核池 ID
|
|
|
+ * @return 是否清空成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int clearPool(Long id) {
|
|
|
+ return productPoolLinkAuditMapper.delete(Wrappers.lambdaQuery(ProductPoolLinkAudit.class).eq(ProductPoolLinkAudit::getPoolAuditId, id));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|