Bläddra i källkod

新增MQ同步接口

fgd 1 år sedan
förälder
incheckning
97db34db77

+ 7 - 0
pom.xml

@@ -23,6 +23,7 @@
         <module>sd-framework</module>
         <module>sd-business</module>
         <module>code-generation</module>
+        <module>sd-mq</module>
     </modules>
 
     <parent>
@@ -53,6 +54,12 @@
                 <version>${sd.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.sd</groupId>
+                <artifactId>sd-mq</artifactId>
+                <version>${sd.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 5 - 0
sd-business/pom.xml

@@ -24,6 +24,11 @@
             <artifactId>sd-framework</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.sd</groupId>
+            <artifactId>sd-mq</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 61 - 0
sd-business/src/main/java/com/sd/business/listener/ArtworkListener.java

@@ -0,0 +1,61 @@
+package com.sd.business.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson2.JSON;
+import com.rabbitmq.client.Channel;
+import com.ruoyi.common.constant.StatusConstant;
+import com.sd.business.entity.artwork.po.ArtworkLibrary;
+import com.sd.business.service.artwork.ArtworkLibraryService;
+import com.sd.mq.config.ArtworkConfig;
+import com.sd.mq.entity.ArtworkMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Exchange;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.QueueBinding;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * 图稿监听
+ */
+@Slf4j
+@Component
+public class ArtworkListener {
+
+    @Autowired
+    private ArtworkLibraryService artworkLibraryService;
+
+    @RabbitListener(bindings = {
+            @QueueBinding(value = @Queue(ArtworkConfig.KX_ARTWORK_QUEUE_NAME), exchange = @Exchange(ArtworkConfig.DIRECT_EXCHANGE_NAME))
+    })
+    public void msgReceive(ArtworkMessage artworkMessage, Channel channel, Message message) throws IOException {
+
+        log.info("接收更新图稿:{}", JSON.toJSONString(artworkMessage));
+
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+
+        try {
+            if (Objects.equals(artworkMessage.getType(), StatusConstant.YES)) {
+                ArtworkLibrary artworkLibrary = BeanUtil.copyProperties(artworkMessage, ArtworkLibrary.class);
+                artworkLibrary.setMesId(artworkLibrary.getId());
+                artworkLibrary.setId(null);
+                artworkLibrary.setType(1);
+                artworkLibrary.setArtworkType(2);
+                artworkLibraryService.save(artworkLibrary);
+            } else {
+                artworkLibraryService.remove(q -> q.eq(ArtworkLibrary::getMesId, artworkMessage.getId()));
+            }
+
+            channel.basicAck(deliveryTag, true);
+        } catch (Exception e) {
+            log.error("接收更新图稿异常", e);
+            channel.basicReject(deliveryTag, true);
+        }
+    }
+
+}

+ 132 - 0
sd-business/src/main/java/com/sd/business/listener/BomSpecListener.java

@@ -0,0 +1,132 @@
+package com.sd.business.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.rabbitmq.client.Channel;
+import com.sd.business.entity.bom.po.Bom;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.service.bom.BomService;
+import com.sd.business.service.bom.BomSpecService;
+import com.sd.mq.config.BomSpecConfig;
+import com.sd.mq.entity.BomMessage;
+import com.sd.mq.entity.BomSpecDetail;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Exchange;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.QueueBinding;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * bom规格监听
+ */
+@Slf4j
+@Component
+public class BomSpecListener {
+
+    @Autowired
+    private BomService bomService;
+
+    @Autowired
+    private BomSpecService bomSpecService;
+
+    @RabbitListener(bindings = {
+            @QueueBinding(value = @Queue(BomSpecConfig.ADD_BOM_NAME), exchange = @Exchange(BomSpecConfig.DIRECT_EXCHANGE_NAME))
+    })
+    public void addMsgReceive(BomMessage bomMessage, Channel channel, Message message) throws IOException {
+
+        log.info("接收新增bom:{}", JSON.toJSONString(bomMessage));
+
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+
+        try {
+            Bom bom = BeanUtil.copyProperties(bomMessage, Bom.class);
+            bom.setMesId(bom.getId());
+            bom.setId(IdWorker.getId());
+            List<BomSpecDetail> bomSpecDetailList = bomMessage.getBomSpecDetailList();
+            List<BomSpec> bomSpecList = BeanUtil.copyToList(bomSpecDetailList, BomSpec.class);
+            bomSpecList.forEach(item -> {
+                item.setMesId(item.getId());
+                item.setId(null);
+                item.setBomId(bom.getId());
+            });
+            bomService.save(bom);
+            bomSpecService.saveBatch(bomSpecList);
+            channel.basicAck(deliveryTag, true);
+        } catch (Exception e) {
+            log.error("接收新增bom异常", e);
+            channel.basicReject(deliveryTag, true);
+        }
+    }
+
+
+    @RabbitListener(bindings = {
+            @QueueBinding(value = @Queue(BomSpecConfig.EDIT_BOM_NAME), exchange = @Exchange(BomSpecConfig.DIRECT_EXCHANGE_NAME))
+    })
+    public void editMsgReceive(BomMessage bomMessage, Channel channel, Message message) throws IOException {
+
+        log.info("接收更新bom:{}", JSON.toJSONString(bomMessage));
+
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+
+        try {
+            Bom bom = bomService.getOne(q -> q.eq(Bom::getMesId, bomMessage.getId()));
+            if (bom == null) {
+                channel.basicAck(deliveryTag, true);
+                return;
+            }
+            Bom editBom = BeanUtil.copyProperties(bomMessage, Bom.class);
+            editBom.setId(bom.getId());
+
+            Map<Long, Long> bomSpecMap = bomSpecService.mapKV(BomSpec::getMesId, BomSpec::getId, q -> q.eq(BomSpec::getBomId, bom.getId()));
+
+            List<BomSpecDetail> bomSpecDetailList = bomMessage.getBomSpecDetailList();
+            List<BomSpec> bomSpecList = BeanUtil.copyToList(bomSpecDetailList, BomSpec.class);
+            bomSpecList.forEach(item -> {
+                item.setMesId(item.getId());
+                item.setId(bomSpecMap.get(item.getMesId()));
+                item.setBomId(bom.getId());
+            });
+
+            // 更新bom明细
+            bomService.updateById(editBom);
+            bomSpecService.editLinked(bomSpecList, BomSpec::getBomId, bom.getId());
+
+            channel.basicAck(deliveryTag, true);
+        } catch (Exception e) {
+            log.error("接收更新bom异常", e);
+            channel.basicReject(deliveryTag, true);
+        }
+    }
+
+    @RabbitListener(bindings = {
+            @QueueBinding(value = @Queue(BomSpecConfig.DELETE_BOM_NAME), exchange = @Exchange(BomSpecConfig.DIRECT_EXCHANGE_NAME))
+    })
+    public void deleteMsgReceive(BomMessage bomMessage, Channel channel, Message message) throws IOException {
+
+        log.info("接收删除bom:{}", JSON.toJSONString(bomMessage));
+
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+
+        try {
+            Bom bom = bomService.getOne(q -> q.eq(Bom::getMesId, bomMessage.getId()));
+            if (bom == null) {
+                channel.basicAck(deliveryTag, true);
+                return;
+            }
+            bomService.removeById(bom.getId());
+            bomSpecService.remove(q -> q.eq(BomSpec::getBomId, bom.getId()));
+            channel.basicAck(deliveryTag, true);
+        } catch (Exception e) {
+            log.error("接收删除bom异常", e);
+            channel.basicReject(deliveryTag, true);
+        }
+    }
+}

+ 46 - 0
sd-mq/pom.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sd</groupId>
+        <artifactId>sd_sell</artifactId>
+        <version>3.0</version>
+    </parent>
+
+    <artifactId>sd-mq</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.23</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.18</version>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 49 - 0
sd-mq/src/main/java/com/sd/mq/config/ArtworkConfig.java

@@ -0,0 +1,49 @@
+package com.sd.mq.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@EnableRabbit
+@Configuration
+public class ArtworkConfig {
+
+    public static final String KX_ARTWORK_QUEUE_NAME = "kx.artwork.queue";
+    public static final String DIRECT_EXCHANGE_NAME = "artwork.direct.exchange";
+
+    /**
+     * 创建一个Direct类型的交换机
+     */
+    @Bean
+    public DirectExchange artworkDirectExchange() {
+        // durable:是否持久化,默认是false,持久化交换机。
+        // autoDelete:是否自动删除,交换机先有队列或者其他交换机绑定的时候,然后当该交换机没有队列或其他交换机绑定的时候,会自动删除。
+        // arguments:交换机设置的参数,比如设置交换机的备用交换机(Alternate Exchange),当消息不能被路由到该交换机绑定的队列上时,会自动路由到备用交换机
+        return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue addArtworkQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(KX_ARTWORK_QUEUE_NAME, true, false, false);
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding addArtworkBinding() {
+        return BindingBuilder.bind(addArtworkQueue()).to(artworkDirectExchange()).withQueueName();
+    }
+
+}

+ 91 - 0
sd-mq/src/main/java/com/sd/mq/config/BomSpecConfig.java

@@ -0,0 +1,91 @@
+package com.sd.mq.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@EnableRabbit
+@Configuration
+public class BomSpecConfig {
+
+    public static final String ADD_BOM_NAME = "add.bom.queue";
+    public static final String EDIT_BOM_NAME = "edit.bom.queue";
+    public static final String DELETE_BOM_NAME = "delete.bom.queue";
+    public static final String DIRECT_EXCHANGE_NAME = "bom.direct.exchange";
+
+    /**
+     * 创建一个Direct类型的交换机
+     */
+    @Bean
+    public DirectExchange bomSpecDirectExchange() {
+        // durable:是否持久化,默认是false,持久化交换机。
+        // autoDelete:是否自动删除,交换机先有队列或者其他交换机绑定的时候,然后当该交换机没有队列或其他交换机绑定的时候,会自动删除。
+        // arguments:交换机设置的参数,比如设置交换机的备用交换机(Alternate Exchange),当消息不能被路由到该交换机绑定的队列上时,会自动路由到备用交换机
+        return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue addBomSpecQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(ADD_BOM_NAME, true, false, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue editBomSpecQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(EDIT_BOM_NAME, true, false, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue deleteBomSpecQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(DELETE_BOM_NAME, true, false, false);
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding addBomSpecBinding() {
+        return BindingBuilder.bind(addBomSpecQueue()).to(bomSpecDirectExchange()).withQueueName();
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding editBomSpecBinding() {
+        return BindingBuilder.bind(editBomSpecQueue()).to(bomSpecDirectExchange()).withQueueName();
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding deleteBomSpecBinding() {
+        return BindingBuilder.bind(deleteBomSpecQueue()).to(bomSpecDirectExchange()).withQueueName();
+    }
+
+}

+ 48 - 0
sd-mq/src/main/java/com/sd/mq/config/OrderConfig.java

@@ -0,0 +1,48 @@
+package com.sd.mq.config;
+
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.DirectExchange;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@EnableRabbit
+@Configuration
+public class OrderConfig {
+
+    public static final String KX_ORDER_ADD_NAME = "kx.order.add.queue";
+    public static final String DIRECT_EXCHANGE_NAME = "order.direct.exchange";
+
+    /**
+     * 创建一个Direct类型的交换机
+     */
+    @Bean
+    public DirectExchange orderDirectExchange() {
+        // durable:是否持久化,默认是false,持久化交换机。
+        // autoDelete:是否自动删除,交换机先有队列或者其他交换机绑定的时候,然后当该交换机没有队列或其他交换机绑定的时候,会自动删除。
+        // arguments:交换机设置的参数,比如设置交换机的备用交换机(Alternate Exchange),当消息不能被路由到该交换机绑定的队列上时,会自动路由到备用交换机
+        return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);
+    }
+
+    /**
+     * 创建一个队列
+     */
+    @Bean
+    public Queue addOrderQueue() {
+        // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
+        // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
+        // autoDelete:是否自动删除,有消息者订阅本队列,然后所有消费者都解除订阅此队列,会自动删除。
+        // arguments:队列携带的参数,比如设置队列的死信队列,消息的过期时间等等。
+        return new Queue(KX_ORDER_ADD_NAME, true, false, false);
+    }
+
+    /**
+     * 绑定交换机和队列
+     */
+    @Bean
+    public Binding addOrderBinding() {
+        return BindingBuilder.bind(addOrderQueue()).to(orderDirectExchange()).withQueueName();
+    }
+}

+ 45 - 0
sd-mq/src/main/java/com/sd/mq/entity/ArtworkMessage.java

@@ -0,0 +1,45 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ArtworkMessage extends BaseMessage {
+
+    /**
+     * mes系统id
+     */
+    private Long id;
+
+    /**
+     * 保存路径
+     */
+    private String path;
+
+    /**
+     * 图片名称
+     */
+    private String imgName;
+
+    /**
+     * 图片url地址
+     */
+    private String imgUrl;
+
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+    /**
+     * 文件地址
+     */
+    private String fileUrl;
+
+    /**
+     * 类型: 1新增 2删除
+     */
+    private int type;
+
+}

+ 16 - 0
sd-mq/src/main/java/com/sd/mq/entity/BaseMessage.java

@@ -0,0 +1,16 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+public class BaseMessage implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long messageId;
+
+}

+ 126 - 0
sd-mq/src/main/java/com/sd/mq/entity/BomMessage.java

@@ -0,0 +1,126 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class BomMessage extends BaseMessage {
+
+    /**
+     * mes系统id
+     */
+    private Long id;
+
+    /**
+     * bom分类id
+     */
+    private Long bomClassifyId;
+
+    /**
+     * 品号
+     */
+    private String code;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 定制记件标准 字典:bom_customPieceBasis
+     */
+    private String customPieceBasis;
+
+    /**
+     * 包装记件标准 字典:bom_packagePieceBasis
+     */
+    private String packagePieceBasis;
+
+    /**
+     * 发货记件标准 字典:bom_shipmentsPieceBasis
+     */
+    private String shipmentsPieceBasis;
+
+    /**
+     * 项目小类 字典:bom_itemSubclass
+     */
+    private String itemSubclass;
+
+    /**
+     * 种类 字典:bom_species
+     */
+    private String species;
+
+    /**
+     * 材质
+     */
+    private String material;
+
+    /**
+     * 型号
+     */
+    private String modelNumber;
+
+    /**
+     * 正面纹路 字典:bom_frontGrain
+     */
+    private String frontGrain;
+
+    /**
+     * 背面纹路 字典:bom_reverseGrain
+     */
+    private String reverseGrain;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * LOGO
+     */
+    private String logo;
+
+    /**
+     * 色层 字典:bom_chromatophore
+     */
+    private String chromatophore;
+
+    /**
+     * 售价体系 字典:bom_sellingPriceSystem
+     */
+    private String sellingPriceSystem;
+
+    /**
+     * 角度 字典:bom_angle
+     */
+    private String angle;
+
+    /**
+     * 配方
+     */
+    private String formula;
+
+    /**
+     * 压纹工艺 字典:bom_embossingProcess
+     */
+    private String embossingProcess;
+
+    /**
+     * 产品主图
+     */
+    private String mainImgUrl;
+
+    /**
+     * 详细描述
+     */
+    private String detailText;
+
+    /**
+     * bom规格明细
+     */
+    private List<BomSpecDetail> bomSpecDetailList;
+}

+ 74 - 0
sd-mq/src/main/java/com/sd/mq/entity/BomSpecDetail.java

@@ -0,0 +1,74 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class BomSpecDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * mes系统id
+     */
+    private Long id;
+
+    /**
+     * 图片路径
+     */
+    private String mainImgUrl;
+
+    /**
+     * 品名
+     */
+    private String name;
+
+    /**
+     * 品号
+     */
+    private String code;
+
+    /**
+     * 颜色
+     */
+    private String colour;
+
+    /**
+     * 成本价
+     */
+    private BigDecimal costPrice;
+
+    /**
+     * 对内销售价(含税)
+     */
+    private BigDecimal internalSellingPrice;
+
+    /**
+     * 对外销售价(含税)
+     */
+    private BigDecimal externalSellingPrice;
+
+    /**
+     * 长 cm
+     */
+    private BigDecimal length;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal width;
+
+    /**
+     * 高 cm
+     */
+    private BigDecimal height;
+
+    /**
+     * 净重 g
+     */
+    private BigDecimal netWeight;
+}

+ 71 - 0
sd-mq/src/main/java/com/sd/mq/entity/OrderMessage.java

@@ -0,0 +1,71 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class OrderMessage extends BaseMessage {
+
+    /**
+     * 订单号
+     */
+    private String code;
+
+    /**
+     * 收货人
+     */
+    private String consignee;
+
+    /**
+     * 收货人电话
+     */
+    private String consigneeNumber;
+
+    /**
+     * 省
+     */
+    private String province;
+
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 县
+     */
+    private String county;
+
+    /**
+     * 街道
+     */
+    private String streetCode;
+
+    /**
+     * 详细地址
+     */
+    private String detailedAddress;
+
+    /**
+     * 邮编
+     */
+    private String postcode;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 操作人
+     */
+    private String operator;
+
+    /**
+     * 订单商品
+     */
+    private List<OrderSkuDetail> orderSkuDetailList;
+}

+ 54 - 0
sd-mq/src/main/java/com/sd/mq/entity/OrderSkuDetail.java

@@ -0,0 +1,54 @@
+package com.sd.mq.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class OrderSkuDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 包材配置集合
+     */
+    private String packagingSet;
+
+    /**
+     * 设计图
+     */
+    private String blueprint;
+
+    /**
+     * 设计图详情 json格式
+     */
+    private String blueprintDetails;
+
+    /**
+     * 生产文件
+     */
+    private String productionDocument;
+
+    /**
+     * 打样图
+     */
+    private String proofingImg;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 打印 1单面 2 双面
+     */
+    private Integer printType;
+}

+ 22 - 0
sd-mq/src/main/java/com/sd/mq/util/RabbitMqUtil.java

@@ -0,0 +1,22 @@
+package com.sd.mq.util;
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.sd.mq.entity.BaseMessage;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+
+public class RabbitMqUtil {
+
+    private static final RabbitTemplate rabbitTemplate = SpringUtil.getBean(RabbitTemplate.class);
+
+    /**
+     * 发送消息
+     */
+    public static void send(String exchange, String routingKey, BaseMessage message) {
+        if (message.getMessageId() == null) {
+            message.setMessageId(IdUtil.getSnowflake().nextId());
+        }
+        rabbitTemplate.convertAndSend(exchange, routingKey, message);
+    }
+
+}

+ 15 - 0
sd-starter/src/main/resources/application-dev.yml

@@ -37,6 +37,21 @@ spring:
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms
 
+  rabbitmq:
+    port: 2762
+    host: 139.9.184.42
+    username: fjhx_sd_rabbit_mq
+    password: da3aKs*Sa_s13D*das
+    virtual-host: test
+    #这个配置是保证提供者确保消息推送到交换机中,不管成不成功,都会回调
+    publisher-confirm-type: correlated
+    #保证交换机能把消息推送到队列中
+    publisher-returns: true
+    #这个配置是保证消费者会消费消息,手动确认
+    listener:
+      simple:
+        acknowledge-mode: manual
+
 # token配置
 token:
   # 令牌自定义标识

+ 15 - 0
sd-starter/src/main/resources/application-prod.yml

@@ -14,6 +14,21 @@ spring:
           username: sd_prod
           password: lG0-nX8#rJ4#jT5
 
+  rabbitmq:
+    port: 2762
+    host: 116.205.243.35
+    username: fjhx_sd_rabbit_mq
+    password: da3aKs*Sa_s13D*das
+    virtual-host: prod
+    #这个配置是保证提供者确保消息推送到交换机中,不管成不成功,都会回调
+    publisher-confirm-type: correlated
+    #保证交换机能把消息推送到队列中
+    publisher-returns: true
+    #这个配置是保证消费者会消费消息,手动确认
+    listener:
+      simple:
+        acknowledge-mode: manual
+
   # redis 配置
   redis:
     # 地址

+ 15 - 0
sd-starter/src/main/resources/application-test.yml

@@ -14,6 +14,21 @@ spring:
           username: root
           password: 5fWD*oa^nso@kmKa
 
+  rabbitmq:
+    port: 2762
+    host: 116.205.243.35
+    username: fjhx_sd_rabbit_mq
+    password: da3aKs*Sa_s13D*das
+    virtual-host: test
+    #这个配置是保证提供者确保消息推送到交换机中,不管成不成功,都会回调
+    publisher-confirm-type: correlated
+    #保证交换机能把消息推送到队列中
+    publisher-returns: true
+    #这个配置是保证消费者会消费消息,手动确认
+    listener:
+      simple:
+        acknowledge-mode: manual
+
   # redis 配置
   redis:
     # 地址