Browse Source

增加产品消费处理新增和更新功能,增加open api 接口返回产品最大更新时间

chenlei1231 3 months ago
parent
commit
6b2220342a

+ 48 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/api/controller/OpenAPIController.java

@@ -1,13 +1,19 @@
 package org.jeecg.modules.adweb.api.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
-
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.config.shiro.IgnoreAuth;
 import org.jeecg.modules.adweb.api.vo.APIRequestVO;
 import org.jeecg.modules.adweb.api.vo.ProductInfoVO;
+import org.jeecg.modules.adweb.common.mapper.CommonMapper;
+import org.jeecg.modules.adweb.site.entity.AdwebSite;
+import org.jeecg.modules.adweb.site.service.IAdwebSiteService;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 @RestController
 @RequestMapping("/open-api")
@@ -16,10 +22,49 @@ public class OpenAPIController {
 
     private static final String STATIC_BEARER_TOKEN = "Bearer uxl9Wpzh65vXNUyDvynJDjBo";
 
+    @Resource
+    private CommonMapper commonMapper;
+
+    @Resource
+    private IAdwebSiteService adwebSiteService;
+
     @PostMapping("/product/list")
     @ResponseBody
     public List<ProductInfoVO> listProducts(@RequestParam APIRequestVO apiReques) {
 
         return Collections.EMPTY_LIST;
     }
+
+    @IgnoreAuth
+    @PostMapping("/product/getMaxDate")
+    @ResponseBody
+    public Result<?> getMaxDate(HttpServletRequest request) {
+        String domain = request.getParameter("siteHost");
+        if (domain == null) {
+            return Result.error("未传递合法的参数!");
+        }
+
+        log.info("request from domain: {}", domain);
+        //获取站点
+        QueryWrapper<AdwebSite> adwebSiteQueryWrapper = new QueryWrapper<>();
+        adwebSiteQueryWrapper.like("domain", domain);
+        AdwebSite adwebsite = adwebSiteService.getOne(adwebSiteQueryWrapper);
+        if (adwebsite == null) {
+            return Result.error("该站点未绑定adweb3系统!");
+        }
+
+        String filterSiteCode = "site_code='%s'".formatted(adwebsite.getCode());
+
+        Date maxDate = commonMapper.getMaxDate("adweb_product", "request_time", filterSiteCode);
+        Long maxTime = null;
+        if (maxDate != null) {
+            maxTime = maxDate.getTime();
+        }
+
+        Map<String, Object> result = new HashMap<>();
+
+        result.put("maxTime", maxTime);
+        result.put("wordpress_setting", adwebsite.getWordpressSetting()); // 指定wordpress 传输的产品类型是来自adwebpro还是woocommerce
+        return Result.ok(result);
+    }
 }

+ 4 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/product/entity/AdwebProduct.java

@@ -67,8 +67,10 @@ public class AdwebProduct implements Serializable {
      * mq生产时间
      */
     @Excel(name = "mq生产时间", width = 15)
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Schema(description = "mq生产时间")
-    private java.lang.String requestTime;
+    private java.util.Date requestTime;
     /**
      * wp产品ID
      */
@@ -98,7 +100,7 @@ public class AdwebProduct implements Serializable {
      */
     @Excel(name = "wp产品中文名称", width = 15)
     @Schema(description = "wp产品中文名称")
-    private java.lang.String productsNameZh;
+    private java.lang.String productNameZh;
     /**
      * wp产品封面图
      */

+ 1 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/product/service/IAdwebProductService.java

@@ -13,7 +13,5 @@ import org.jeecg.modules.adweb.site.entity.AdwebSite;
  */
 public interface IAdwebProductService extends IService<AdwebProduct> {
 
-    void addProduct(ProductDTO productDTO, AdwebSite adwebSites);
-
-    void updateProduct(ProductDTO productDTO, AdwebSite adwebSites);
+    void addOrUpdateProduct(ProductDTO productDTO, AdwebSite adwebSites);
 }

+ 70 - 10
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/product/service/impl/AdwebProductServiceImpl.java

@@ -1,7 +1,10 @@
 package org.jeecg.modules.adweb.product.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.adweb.product.dto.ProductDTO;
 import org.jeecg.modules.adweb.product.entity.AdwebProduct;
 import org.jeecg.modules.adweb.product.mapper.AdwebProductMapper;
@@ -16,6 +19,7 @@ import org.springframework.stereotype.Service;
  * @Version: V1.0
  */
 @Service
+@Slf4j
 public class AdwebProductServiceImpl extends ServiceImpl<AdwebProductMapper, AdwebProduct> implements IAdwebProductService {
 
     /**
@@ -23,22 +27,78 @@ public class AdwebProductServiceImpl extends ServiceImpl<AdwebProductMapper, Adw
      * @param adwebSites
      */
     @Override
-    public void addProduct(ProductDTO productDTO, AdwebSite adwebSites) {
+    public void addOrUpdateProduct(ProductDTO productDTO, AdwebSite adwebSites) {
+        // 产品同步时,update 有可能是新增或者更新,根据数据库中记录进行再次判断
+        if ("update".equals(productDTO.getActionType())) {
+            handleUpdate(productDTO, adwebSites);
+        } else if ("delete".equals(productDTO.getActionType())) {
+            handleDelete(productDTO, adwebSites);
+        } else {
+            handleAdd(productDTO, adwebSites);
+        }
+
+    }
+
+    private void handleUpdate(ProductDTO productDTO, AdwebSite adwebSites) {
+        QueryWrapper<AdwebProduct> productQuery = new QueryWrapper<>();
+        productQuery.eq("product_id", productDTO.getProductId());
+        productQuery.eq("site_code", adwebSites.getCode());
+
+        AdwebProduct product = this.getOne(productQuery);
+        // 执行更新操作
+        if (product != null) {
+            updateProduct(productDTO, product);
+        } else {
+            addProduct(productDTO, adwebSites);
+        }
+    }
+
+    private void handleDelete(ProductDTO productDTO, AdwebSite adwebSites) {
+        UpdateWrapper<AdwebProduct> productQuery = new UpdateWrapper<>();
+        productQuery.eq("product_id", productDTO.getProductId());
+        productQuery.eq("site_code", adwebSites.getCode());
+        productQuery.set("action_type", "delete");
+
+        try {
+            this.update(productQuery);
+            log.info("MQ消息删除产品成功:{}", productDTO);
+        } catch (Exception e) {
+            log.error("MQ消息删除产品失败:{}", e.getMessage(), e);
+        }
+    }
+
+    private void handleAdd(ProductDTO productDTO, AdwebSite adwebSites) {
         AdwebProduct product = new AdwebProduct();
         BeanUtil.copyProperties(productDTO, product);
+        product.setSiteCode(adwebSites.getCode());
+        this.saveProduct(product);
+    }
+
+    private void updateProduct(ProductDTO productDTO, AdwebProduct product) {
+        BeanUtil.copyProperties(productDTO, product);
 
-        product
-                .setSiteCode(adwebSites.getCode());
+        try {
+            this.updateById(product);
+            log.info("MQ消息更新产品成功:{}", product);
+        } catch (Exception e) {
+            log.error("MQ消息更新产品失败:{}", e.getMessage(), e);
+        }
+    }
 
-        this.save(product);
+    private void addProduct(ProductDTO productDTO, AdwebSite adwebSites) {
+        AdwebProduct product = new AdwebProduct();
+        BeanUtil.copyProperties(productDTO, product);
+        product.setSiteCode(adwebSites.getCode()).setActionType("add");
+        this.saveProduct(product);
     }
 
-    /**
-     * @param productDTO
-     * @param adwebSites
-     */
-    @Override
-    public void updateProduct(ProductDTO productDTO, AdwebSite adwebSites) {
+    private void saveProduct(AdwebProduct product) {
+        try {
+            this.save(product);
 
+            log.info("MQ消息新增产品成功:{}", product);
+        } catch (Exception e) {
+            log.error("MQ消息新增产品失败:{}", e.getMessage());
+        }
     }
 }

+ 20 - 44
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mq/ProductReceiver.java

@@ -36,50 +36,26 @@ public class ProductReceiver extends BaseRabbiMqHandler<List<ProductDTO>> {
     @RabbitHandler
     // ackMode需要设置为MANUAL - BaseRabbiMqHandler.onMessage()有channel.basicAck()操作
     @RabbitListener(queues = "site_product_dev", ackMode = "MANUAL")
-    public void onMessage(
-            List<ProductDTO> products,
-            Channel channel,
-            @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
-        super.onMessage(
-                products,
-                deliveryTag,
-                channel,
-                new MqListener<List<ProductDTO>>() {
-                    @Override
-                    public void handler(List<ProductDTO> products, Channel channel) {
-                        // 业务处理
-                        log.info("收到产品MQ消息 {}", products);
-
-
-                        for (ProductDTO product : products) {
-
-                            // TODO 产品消息内容唯一性判断
-
-                            // 查看发布当前消息的站点是否是 adweb3 平台中绑定的是否是有效站点, 如果不是则直接确认消息,不做业务处理
-                            List<AdwebSite> adwebSites =
-                                    adwebSiteService.list(
-                                            new LambdaQueryWrapper<AdwebSite>()
-                                                    .like(AdwebSite::getDomain, product.getSiteHost())
-                                                    .ne(AdwebSite::getStatus, 0));
-
-                            // 一个消息中的产品所属站点相同,一条不符合,则认为全部不符合
-                            if (adwebSites.isEmpty()) {
-                                log.error(
-                                        "站点:{} 不是adweb3的有效绑定站点,MQ消息确认失败",
-                                        product.getSiteHost());
-                                return;
-                            }
-
-
-                            try {
-                                // 产品入库
-                                adwebProductService.addProduct(
-                                        product, adwebSites.get(0));
-                            } catch (Exception e) {
-                                log.error("产品:{}, 入库异常:{}", e.getMessage(), product);
-                            }
-                        }
+    public void onMessage(List<ProductDTO> products, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
+        super.onMessage(products, deliveryTag, channel, new MqListener<List<ProductDTO>>() {
+            @Override
+            public void handler(List<ProductDTO> products, Channel channel) {
+                // 业务处理
+                log.info("收到产品MQ消息 {}", products);
+                for (ProductDTO product : products) {
+                    // 查看发布当前消息的站点是否是 adweb3 平台中绑定的是否是有效站点, 如果不是则直接确认消息,不做业务处理
+                    List<AdwebSite> adwebSites = adwebSiteService.list(new LambdaQueryWrapper<AdwebSite>().like(AdwebSite::getDomain, product.getSiteHost()).ne(AdwebSite::getStatus, 0));
+
+                    // 一个消息中的产品所属站点相同,一条不符合,则认为全部不符合
+                    if (adwebSites.isEmpty()) {
+                        log.error("站点:{} 不是adweb3的有效绑定站点,MQ消息确认失败", product.getSiteHost());
+                        return;
                     }
-                });
+                    
+                    // 产品入库
+                    adwebProductService.addOrUpdateProduct(product, adwebSites.get(0));
+                }
+            }
+        });
     }
 }