|
|
@@ -0,0 +1,201 @@
|
|
|
+package com.haha.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.haha.common.exception.BusinessException;
|
|
|
+import com.haha.entity.ErpGoods;
|
|
|
+import com.haha.entity.Product;
|
|
|
+import com.haha.mapper.ErpGoodsMapper;
|
|
|
+import com.haha.mapper.ProductMapper;
|
|
|
+import com.haha.service.ErpGoodsService;
|
|
|
+import com.qdb.sdk.QdbClient;
|
|
|
+import com.qdb.sdk.QdbException;
|
|
|
+import com.qdb.sdk.model.request.SysGoodsQueryRequest;
|
|
|
+import com.qdb.sdk.model.response.QdbResponse;
|
|
|
+import com.qdb.sdk.model.response.SysGoodsPageResult;
|
|
|
+import com.qdb.sdk.model.response.SysGoodsVO;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ERP 商品信息服务实现
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class ErpGoodsServiceImpl extends ServiceImpl<ErpGoodsMapper, ErpGoods> implements ErpGoodsService {
|
|
|
+
|
|
|
+ private final ProductMapper productMapper;
|
|
|
+
|
|
|
+ @Autowired(required = false)
|
|
|
+ private QdbClient qdbClient;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void syncFromErp() {
|
|
|
+ if (qdbClient == null) {
|
|
|
+ throw new BusinessException(500, "QdbClient 未配置,无法同步ERP商品数据");
|
|
|
+ }
|
|
|
+
|
|
|
+ int pageNo = 1;
|
|
|
+ int pageSize = 50;
|
|
|
+ boolean hasMore = true;
|
|
|
+ int syncedCount = 0;
|
|
|
+
|
|
|
+ while (hasMore) {
|
|
|
+ SysGoodsQueryRequest request = SysGoodsQueryRequest.builder()
|
|
|
+ .pageIndex(pageNo)
|
|
|
+ .pageSize(pageSize)
|
|
|
+ .status(1)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ try {
|
|
|
+ QdbResponse<SysGoodsPageResult> response = qdbClient.getGoodsApi().listSysGoodsPaged(request);
|
|
|
+ SysGoodsPageResult pageResult = response.getData();
|
|
|
+
|
|
|
+ if (pageResult == null || pageResult.getData() == null || pageResult.getData().isEmpty()) {
|
|
|
+ hasMore = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (SysGoodsVO goods : pageResult.getData()) {
|
|
|
+ upsertErpGoods(goods);
|
|
|
+ syncedCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer total = pageResult.getTotal();
|
|
|
+ if (total != null && pageNo * pageSize >= total) {
|
|
|
+ hasMore = false;
|
|
|
+ } else if (pageResult.getData().size() < pageSize) {
|
|
|
+ hasMore = false;
|
|
|
+ } else {
|
|
|
+ pageNo++;
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (QdbException e) {
|
|
|
+ log.error("同步ERP商品失败: pageNo={}, error={}", pageNo, e.getMessage());
|
|
|
+ throw new BusinessException(500, "ERP商品同步失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("ERP商品同步完成: 共同步 {} 条", syncedCount);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<ErpGoods> listAll(String keyword) {
|
|
|
+ LambdaQueryWrapper<ErpGoods> wrapper = new LambdaQueryWrapper<ErpGoods>()
|
|
|
+ .eq(ErpGoods::getStatus, 1);
|
|
|
+ if (StringUtils.hasText(keyword)) {
|
|
|
+ wrapper.and(w -> w
|
|
|
+ .like(ErpGoods::getGoodsName, keyword)
|
|
|
+ .or()
|
|
|
+ .like(ErpGoods::getGoodsCode, keyword));
|
|
|
+ }
|
|
|
+ return list(wrapper.orderByAsc(ErpGoods::getGoodsName));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void bindGoods(Long productId, Long erpGoodsId) {
|
|
|
+ Product product = productMapper.selectById(productId);
|
|
|
+ if (product == null) {
|
|
|
+ throw new BusinessException(404, "商品不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查 ERP 商品是否存在
|
|
|
+ ErpGoods erpGoods = getOne(new LambdaQueryWrapper<ErpGoods>()
|
|
|
+ .eq(ErpGoods::getErpGoodsId, erpGoodsId));
|
|
|
+ if (erpGoods == null) {
|
|
|
+ throw new BusinessException(404, "ERP商品不存在,请先同步ERP商品数据");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否已被其他本地商品绑定
|
|
|
+ List<Product> boundProducts = productMapper.selectList(new LambdaQueryWrapper<Product>()
|
|
|
+ .eq(Product::getErpGoodsId, erpGoodsId)
|
|
|
+ .eq(Product::getIsDeleted, 0));
|
|
|
+ if (!boundProducts.isEmpty() && !boundProducts.get(0).getId().equals(productId)) {
|
|
|
+ throw new BusinessException(400, "该ERP商品已关联到本地商品: " + boundProducts.get(0).getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ product.setErpGoodsId(erpGoodsId);
|
|
|
+ product.setUpdateTime(LocalDateTime.now());
|
|
|
+ productMapper.updateById(product);
|
|
|
+
|
|
|
+ log.info("商品关联ERP商品: productId={}, productName={}, erpGoodsId={}, erpGoodsName={}",
|
|
|
+ productId, product.getName(), erpGoodsId, erpGoods.getGoodsName());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void unbindGoods(Long productId) {
|
|
|
+ Product product = productMapper.selectById(productId);
|
|
|
+ if (product == null) {
|
|
|
+ throw new BusinessException(404, "商品不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ product.setErpGoodsId(null);
|
|
|
+ product.setUpdateTime(LocalDateTime.now());
|
|
|
+ productMapper.updateById(product);
|
|
|
+
|
|
|
+ log.info("商品解除ERP商品关联: productId={}, productName={}", productId, product.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 插入或更新 ERP 商品记录(按 erp_goods_id 判断)
|
|
|
+ */
|
|
|
+ private void upsertErpGoods(SysGoodsVO goods) {
|
|
|
+ ErpGoods existing = getOne(new LambdaQueryWrapper<ErpGoods>()
|
|
|
+ .eq(ErpGoods::getErpGoodsId, goods.getGoodsId()));
|
|
|
+
|
|
|
+ if (existing != null) {
|
|
|
+ existing.setGoodsCode(goods.getGoodsCode());
|
|
|
+ existing.setGoodsName(goods.getGoodsName());
|
|
|
+ existing.setShortGoodsName(goods.getShortGoodsName());
|
|
|
+ existing.setSpecs(goods.getSpecs());
|
|
|
+ existing.setSkUnit(goods.getSkUnit());
|
|
|
+ existing.setGoodsKindCode(goods.getGoodsKindCode());
|
|
|
+ existing.setGoodsKindName(goods.getGoodsKindName());
|
|
|
+ existing.setBrand(goods.getBrand());
|
|
|
+ existing.setSalePrice(goods.getSalePrice());
|
|
|
+ existing.setCostPrice(goods.getCostPrice());
|
|
|
+ existing.setProviderName(goods.getProviderName());
|
|
|
+ existing.setBatchType(goods.getBatchType());
|
|
|
+ existing.setCombination(goods.getCombination());
|
|
|
+ existing.setArticleNo(goods.getArticleNo());
|
|
|
+ existing.setPicPath(goods.getPicPath());
|
|
|
+ existing.setWeight(goods.getWeight());
|
|
|
+ existing.setUpdateTime(LocalDateTime.now());
|
|
|
+ updateById(existing);
|
|
|
+ } else {
|
|
|
+ ErpGoods erpGoods = new ErpGoods();
|
|
|
+ erpGoods.setErpGoodsId(goods.getGoodsId());
|
|
|
+ erpGoods.setGoodsCode(goods.getGoodsCode());
|
|
|
+ erpGoods.setGoodsName(goods.getGoodsName());
|
|
|
+ erpGoods.setShortGoodsName(goods.getShortGoodsName());
|
|
|
+ erpGoods.setSpecs(goods.getSpecs());
|
|
|
+ erpGoods.setSkUnit(goods.getSkUnit());
|
|
|
+ erpGoods.setGoodsKindCode(goods.getGoodsKindCode());
|
|
|
+ erpGoods.setGoodsKindName(goods.getGoodsKindName());
|
|
|
+ erpGoods.setBrand(goods.getBrand());
|
|
|
+ erpGoods.setSalePrice(goods.getSalePrice());
|
|
|
+ erpGoods.setCostPrice(goods.getCostPrice());
|
|
|
+ erpGoods.setProviderName(goods.getProviderName());
|
|
|
+ erpGoods.setBatchType(goods.getBatchType());
|
|
|
+ erpGoods.setCombination(goods.getCombination());
|
|
|
+ erpGoods.setArticleNo(goods.getArticleNo());
|
|
|
+ erpGoods.setPicPath(goods.getPicPath());
|
|
|
+ erpGoods.setWeight(goods.getWeight());
|
|
|
+ erpGoods.setStatus(1);
|
|
|
+ erpGoods.setCreateTime(LocalDateTime.now());
|
|
|
+ erpGoods.setUpdateTime(LocalDateTime.now());
|
|
|
+ save(erpGoods);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|