From 38179780b2f728abe6dd0e5aaa284c6ee6aa8380 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 09 Mar 2022 14:19:56 +0800
Subject: [PATCH] init otc

---
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgHistoryEntity.java                 |   30 
 src/main/resources/mapper/member/MemberSettingDao.xml                                      |    6 
 src/main/resources/application-prod.yml                                                    |    3 
 src/main/java/com/xcong/excoin/modules/otc/dto/OtcOrderAddDto.java                         |   29 
 src/main/java/com/xcong/excoin/modules/member/vo/DefaultWayVo.java                         |   18 
 src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java                     |    6 
 src/main/java/com/xcong/excoin/modules/otc/service/OtcMarketBussinessService.java          |   17 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcMarketBussinessDao.java                  |   10 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcSetting.java                          |   22 
 src/main/java/com/xcong/excoin/modules/otc/vo/ApplyConditionsVo.java                       |   37 
 src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderService.java                    |   32 
 src/main/java/com/xcong/excoin/netty/server/WebSocketServer.java                           |   13 
 src/main/java/com/xcong/excoin/rabbit/producer/OtcProducter.java                           |   68 
 src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderServiceImpl.java           |  507 ++++++
 src/main/java/com/xcong/excoin/netty/logic/WebSocketLogic.java                             |   83 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgHistoryDao.java                       |   14 
 src/main/java/com/xcong/excoin/modules/otc/controller/OtcBlackListController.java          |  101 +
 src/main/java/com/xcong/excoin/netty/logic/impl/MsgLogicImpl.java                          |   14 
 src/main/java/com/xcong/excoin/modules/otc/dto/ChatBoxDto.java                             |   22 
 src/main/java/com/xcong/excoin/modules/otc/dto/OrderApealDto.java                          |   28 
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcEntrustOrderMapper.java               |   39 
 src/main/java/com/xcong/excoin/modules/otc/dto/ChatOrderDto.java                           |   14 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrder.java                     |   79 +
 src/main/java/com/xcong/excoin/quartz/job/NettyServerStartUp.java                          |   21 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcEntrustOrderDao.java                     |   24 
 src/main/java/com/xcong/excoin/modules/otc/controller/OtcMarketBussinessController.java    |  117 +
 src/main/java/com/xcong/excoin/netty/common/ChannelManager.java                            |   37 
 src/main/java/com/xcong/excoin/modules/otc/vo/MsgListVo.java                               |   39 
 src/main/java/com/xcong/excoin/netty/bean/RequestBean.java                                 |   73 
 src/main/java/com/xcong/excoin/modules/member/entity/MemberSettingEntity.java              |    2 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderDao.java                            |   46 
 src/main/java/com/xcong/excoin/modules/otc/vo/BlackListVo.java                             |   24 
 src/main/java/com/xcong/excoin/modules/otc/dto/MbAddDto.java                               |   21 
 src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderListDto.java                    |   30 
 src/main/java/com/xcong/excoin/rabbit/consumer/OtcConsumer.java                            |  161 ++
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcBlackList.java                        |   17 
 src/main/java/com/xcong/excoin/rabbit/producer/ChatProducer.java                           |   33 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgUserListEntity.java                |   34 
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcMarketBussinessMapper.java            |   14 
 src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java                          |   42 
 src/main/java/com/xcong/excoin/netty/dispatch/MsgDispatch.java                             |   31 
 src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMarketBussinessServiceImpl.java |  180 ++
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgUserListDao.java                      |   19 
 src/main/java/com/xcong/excoin/modules/otc/dto/BlackListDto.java                           |   16 
 src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java                 |    2 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcReturnMoney.java                      |   22 
 src/main/java/com/xcong/excoin/modules/otc/vo/MarketBussinessInfoVo.java                   |   51 
 src/main/resources/application.yml                                                         |    3 
 src/main/java/com/xcong/excoin/modules/member/service/MemberService.java                   |    4 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcReturnMoneyDao.java                      |   17 
 src/main/resources/application-prodapp.yml                                                 |    3 
 src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderAddDto.java                     |   38 
 src/main/java/com/xcong/excoin/utils/dingtalk/DingTalkUtils.java                           |   87 
 src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java                                  |    9 
 src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderAppealServiceImpl.java     |   13 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrder.java                            |   96 +
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderAppealDao.java                      |    7 
 src/main/java/com/xcong/excoin/common/contants/AppContants.java                            |    7 
 src/main/java/com/xcong/excoin/modules/otc/dto/HasPayDto.java                              |   16 
 src/main/java/com/xcong/excoin/modules/otc/dto/AddBlackDto.java                            |   25 
 src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java        |    2 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcBlackListDao.java                        |   19 
 src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMsgServiceImpl.java             |  252 +++
 src/main/java/com/xcong/excoin/modules/otc/vo/ChatOrderVo.java                             |   62 
 src/main/java/com/xcong/excoin/netty/bean/ChatRequest.java                                 |   31 
 src/main/java/com/xcong/excoin/rabbit/consumer/ChatConsumer.java                           |  106 +
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppeal.java                      |   31 
 src/main/java/com/xcong/excoin/modules/member/dao/MemberPaymentMethodDao.java              |    3 
 src/main/java/com/xcong/excoin/netty/handler/WebSocketServerHandler.java                   |   37 
 src/main/java/com/xcong/excoin/modules/otc/dto/ConnectDto.java                             |   20 
 src/main/java/com/xcong/excoin/modules/otc/vo/SaleOrderDetailVo.java                       |   73 
 src/main/java/com/xcong/excoin/netty/bean/AuthRequest.java                                 |   29 
 src/main/java/com/xcong/excoin/modules/otc/controller/OtcOrderController.java              |  124 +
 src/main/java/com/xcong/excoin/modules/otc/dto/SendMsgDto.java                             |   22 
 src/main/resources/mapper/member/MemberWalletCoinDao.xml                                   |    6 
 src/main/java/com/xcong/excoin/modules/otc/controller/OtcMsgController.java                |   93 +
 src/main/java/com/xcong/excoin/modules/otc/service/OtcMsgService.java                      |   22 
 src/main/java/com/xcong/excoin/modules/otc/vo/EntrustOrderDetailVo.java                    |   82 +
 src/main/java/com/xcong/excoin/modules/otc/service/OtcEntrustOrderService.java             |   28 
 src/main/java/com/xcong/excoin/modules/otc/dto/OrderListDto.java                           |   21 
 src/main/java/com/xcong/excoin/modules/otc/vo/BuyOrderDetailVo.java                        |   82 +
 src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListVo.java                           |   63 
 src/main/resources/mapper/member/MemberPaymentMethodDao.xml                                |   15 
 src/main/java/com/xcong/excoin/netty/common/NettyTools.java                                |   11 
 src/main/java/com/xcong/excoin/netty/common/Contans.java                                   |   12 
 src/main/java/com/xcong/excoin/modules/otc/dto/MsgListDto.java                             |   20 
 src/main/java/com/xcong/excoin/netty/bean/ResponseBean.java                                |   83 
 src/main/java/com/xcong/excoin/modules/otc/dao/OtcSettingDao.java                          |    8 
 src/main/java/com/xcong/excoin/netty/initalizer/WebSocketServerInitializer.java            |    7 
 src/main/java/com/xcong/excoin/modules/member/dao/MemberSettingDao.java                    |    1 
 src/main/java/com/xcong/excoin/modules/otc/vo/TeamVo.java                                  |   28 
 src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java          |   38 
 src/main/java/com/xcong/excoin/quartz/job/OtcOrderJob.java                                 |  131 +
 src/main/java/com/xcong/excoin/modules/otc/controller/OtcEntrustOrderController.java       |  122 +
 src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcEntrustOrderServiceImpl.java    |  230 ++
 src/main/java/com/xcong/excoin/modules/otc/dto/TeamDto.java                                |   15 
 src/main/java/com/xcong/excoin/modules/otc/vo/ChatBoxVo.java                               |   38 
 src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java             |   16 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussiness.java                  |   60 
 src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderAppealService.java              |    8 
 src/main/java/com/xcong/excoin/modules/otc/vo/OrderListVo.java                             |   43 
 src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListInfoVo.java                       |   66 
 102 files changed, 4,537 insertions(+), 196 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/common/contants/AppContants.java b/src/main/java/com/xcong/excoin/common/contants/AppContants.java
index 7fde51c..4e173f2 100644
--- a/src/main/java/com/xcong/excoin/common/contants/AppContants.java
+++ b/src/main/java/com/xcong/excoin/common/contants/AppContants.java
@@ -83,4 +83,11 @@
 
     public static final BigDecimal DEFAULT_PRICE = BigDecimal.valueOf(1.28);
 
+
+    public static final String OTC_ORDER_CANCEL_TIMES = "OTC_ORDER_CANCEL_TIMES_";
+
+    public static final String MSG_NOTICE = "MSG_NOTICE_";
+
+    public static final String MSG_CHATTING = "MSG_CHATTING_";
+
 }
diff --git a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java
index 3cddbe2..bedc53d 100644
--- a/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java
+++ b/src/main/java/com/xcong/excoin/configurations/RabbitMqConfig.java
@@ -130,6 +130,15 @@
     public static final String QUEUE_TRC20_BLOCK = "QUEUE_TRC20_BLOCK";
     public static final String ROUTING_TRC20_BLOCK = "ROUTING_TRC20_BLOCK";
 
+    public static final String QUEUE_MSG_HISTORY = "queue_msg_history";
+    public static final String ROUTING_KEY_MSG_HISTORY = "routing_key_msg_history";
+
+    public static final String ROUTINGKEY_MARKET_BUSSINESS = "ROUTINGKEY_MARKET_BUSSINESS";
+    public static final String QUEUE_MARKET_BUSSINESS = "QUEUE_MARKET_BUSSINESS";
+
+    public static final String QUEUE_ORDER_RETURN = "QUEUE_ORDER_RETURN";
+    public static final String ROUTING_ORDER_RETURN = "ROUTING_ORDER_RETURN";
+
     @Resource
     private ConnectionFactory connectionFactory;
 
@@ -142,6 +151,39 @@
 //        return connectionFactory;
 //    }
 
+    // ========= otc start =============
+    @Bean
+    public Queue orderReturnQueue() {
+        return new Queue(QUEUE_ORDER_RETURN);
+    }
+
+    @Bean
+    public Binding orderReturnBinding() {
+        return BindingBuilder.bind(orderReturnQueue()).to(defaultExchange()).with(ROUTING_ORDER_RETURN);
+    }
+
+    @Bean
+    public Queue marketBussinessQueue() {
+        return new Queue(QUEUE_MARKET_BUSSINESS);
+    }
+
+    @Bean
+    public Binding marketBussinessBinding() {
+        return BindingBuilder.bind(marketBussinessQueue()).to(defaultExchange()).with(ROUTINGKEY_MARKET_BUSSINESS);
+    }
+
+    @Bean
+    public Queue msgHistoryQueue() {
+        return new Queue(QUEUE_MSG_HISTORY);
+    }
+
+    @Bean
+    public Binding msgHistoryBinding() {
+        return BindingBuilder.bind(msgHistoryQueue()).to(defaultExchange()).with(ROUTING_KEY_MSG_HISTORY);
+    }
+    // ========= otc end =============
+
+
     @Bean
     @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
     public RabbitTemplate rabbitTemplate() {
diff --git a/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java b/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java
index 9e877ec..df5dd50 100644
--- a/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java
+++ b/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java
@@ -17,4 +17,6 @@
     private boolean debug;
 
     private Long redisExpire;
+
+    private String project;
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
index b5f50d1..47d17e7 100644
--- a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
+++ b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -6,6 +6,7 @@
 import com.xcong.excoin.modules.coin.parameter.dto.RecordsPageDto;
 import com.xcong.excoin.modules.member.parameter.dto.*;
 import com.xcong.excoin.modules.member.parameter.vo.*;
+import com.xcong.excoin.modules.member.vo.DefaultWayVo;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -210,6 +211,21 @@
 	public Result memberPaymethodDetailList() {
 		return memberService.memberPaymethodDetailList();
 	}
+
+	@ApiOperation(value = "设置为默认收款方式")
+	@PostMapping(value = "/setDefaultMethod/{id}")
+	public Result setDefaultMethod(@PathVariable("id") Long id) {
+		return memberService.setDefaultPaymethod(id);
+	}
+
+	@ApiOperation(value = "获取我的默认收款方式", notes = "获取我的默认收款方式")
+	@ApiResponses({
+			@ApiResponse(code = 200, message = "获取成功", response = DefaultWayVo.class)
+	})
+	@GetMapping(value = "/findDefaultWay")
+	public Result findDefaultWay() {
+		return memberService.findDefaultWay();
+	}
 	
 	/**
      * 绑定手机号
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberPaymentMethodDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberPaymentMethodDao.java
index 1aaebf2..cbb8618 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberPaymentMethodDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberPaymentMethodDao.java
@@ -4,8 +4,11 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xcong.excoin.modules.member.entity.MemberPaymentMethodEntity;
+import org.apache.ibatis.annotations.Param;
 
 public interface MemberPaymentMethodDao extends BaseMapper<MemberPaymentMethodEntity> {
 
 	public List<MemberPaymentMethodEntity> selectByMemberId(Long memberId);
+
+	MemberPaymentMethodEntity selectDefualtMethod(@Param("memberId") Long memberId, @Param("type") Integer type, @Param("isDefault") String isDefault);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberSettingDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberSettingDao.java
index 620a813..0f678bd 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberSettingDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberSettingDao.java
@@ -16,4 +16,5 @@
 
     public int batchInsert(@Param("list") List<MemberSettingEntity> list);
 
+    public void updateMessageReminderByMemberId(@Param("memberId")Long memberId);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
index de32153..5e50fcf 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
@@ -23,4 +23,6 @@
 
     int updateBlockBalance(@Param("id") Long id, @Param("availableBalance") BigDecimal availableBalance, @Param("earlyBalance") BigDecimal earlyBalance, @Param("blockNumber") Integer blockNumber);
     int updateWalletBalance(@Param("id") Long id, @Param("availableBalance") BigDecimal availableBalance, @Param("totalBalance") BigDecimal totalBalance, @Param("frozenBalance") BigDecimal frozenBalance);
+
+    int reduceFrozenBalance(@Param("id") Long id, @Param("amount") BigDecimal amount);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
index c22bc65..ea452fd 100644
--- a/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
@@ -75,11 +75,17 @@
 
     public static final int IS_PROFIT_N = 0;
 
+    public static final Integer IS_TRADER_Y = 1;
+
+    public static final Integer IS_TRADER_N = 2;
+
     /**
      * 手机号(包含国际手机号)
      */
     private String phone;
 
+    private String name;
+
     /**
      * 邮箱
      */
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberSettingEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberSettingEntity.java
index 36ea5a7..16052a2 100644
--- a/src/main/java/com/xcong/excoin/modules/member/entity/MemberSettingEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberSettingEntity.java
@@ -31,4 +31,6 @@
      */
     private BigDecimal forceParam;
 
+    private int messageReminder;
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
index 9712db0..9224431 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -41,6 +41,8 @@
 
 	public Result memberPaymethodDetailList();
 
+	Result setDefaultPaymethod(Long id);
+
 	public Result memberBindPhone(@Valid MemberBindPhoneDto memberBindPhoneDto);
 
 	public Result memberBindEmail(@Valid MemberBindEmailDto memberBindEmailDto);
@@ -80,4 +82,6 @@
 	public Result getPcVersionInfo();
 
 	Result memberTeam(MemberTeamRecordsPageDto memberTeamRecordsPageDto);
+
+	Result findDefaultWay();
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
index ef8d15d..bdb2171 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -28,6 +28,7 @@
 import com.xcong.excoin.modules.member.parameter.dto.*;
 import com.xcong.excoin.modules.member.parameter.vo.*;
 import com.xcong.excoin.modules.member.service.MemberService;
+import com.xcong.excoin.modules.member.vo.DefaultWayVo;
 import com.xcong.excoin.modules.platform.dao.PlatformFeeSettingDao;
 import com.xcong.excoin.modules.platform.dao.PlatformSymbolsCoinDao;
 import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity;
@@ -601,6 +602,29 @@
     }
 
     @Override
+    public Result setDefaultPaymethod(Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        MemberPaymentMethodEntity defualtMethod = this.memberPaymentMethodDao.selectDefualtMethod(member.getId(), null, "1");
+
+        if (defualtMethod != null) {
+            if (id.equals(defualtMethod.getId())) {
+                return Result.fail("不能关闭默认收款方式");
+            }
+        }
+
+        MemberPaymentMethodEntity paymentMethodEntity = new MemberPaymentMethodEntity();
+        paymentMethodEntity.setId(id);
+        paymentMethodEntity.setIsDefualt("1");
+        this.memberPaymentMethodDao.updateById(paymentMethodEntity);
+
+        if (defualtMethod != null) {
+            defualtMethod.setIsDefualt("2");
+            this.memberPaymentMethodDao.updateById(defualtMethod);
+        }
+        return Result.ok("操作成功");
+    }
+
+    @Override
     @Transactional
     public Result memberBindPhone(@Valid MemberBindPhoneDto memberBindPhoneDto) {
         //获取用户ID
@@ -1094,6 +1118,20 @@
         }
         return Result.ok(memberTeamVo);
     }
+
+    @Override
+    public Result findDefaultWay() {
+        //获取用户ID
+        Long memberId = LoginUserUtils.getAppLoginUser().getId();
+
+        DefaultWayVo defaultWayVo = new DefaultWayVo();
+        MemberPaymentMethodEntity defualtMethod = this.memberPaymentMethodDao.selectDefualtMethod(memberId, null, "1");
+        if(ObjectUtil.isNotEmpty(defualtMethod)){
+            String paymentType = defualtMethod.getPaymentType();
+            defaultWayVo.setPaymentType(paymentType);
+        }
+        return Result.ok(defaultWayVo);
+    }
 }
 
 
diff --git a/src/main/java/com/xcong/excoin/modules/member/vo/DefaultWayVo.java b/src/main/java/com/xcong/excoin/modules/member/vo/DefaultWayVo.java
new file mode 100644
index 0000000..15e3c9c
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/vo/DefaultWayVo.java
@@ -0,0 +1,18 @@
+package com.xcong.excoin.modules.member.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "DefaultWayVo", description = "接口返回类")
+public class DefaultWayVo {
+    /**
+     * 类型 1-支付宝2-微信3-银行卡
+     */
+
+    @ApiModelProperty(value = "类型 1-支付宝2-微信3-银行卡")
+    private String paymentType;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/OtcBlackListController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcBlackListController.java
new file mode 100644
index 0000000..a433b96
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcBlackListController.java
@@ -0,0 +1,101 @@
+package com.xcong.excoin.modules.otc.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.otc.dao.OtcBlackListDao;
+import com.xcong.excoin.modules.otc.dao.OtcOrderDao;
+import com.xcong.excoin.modules.otc.dto.AddBlackDto;
+import com.xcong.excoin.modules.otc.dto.BlackListDto;
+import com.xcong.excoin.modules.otc.entity.OtcBlackList;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.vo.BlackListVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping(value = "/api/black")
+@Api(value = "OtcBlackListController", tags = "otc黑名单列表接口类")
+public class OtcBlackListController {
+
+    @Autowired
+    private OtcBlackListDao otcBlackListDao;
+    @Autowired
+    private OtcOrderDao otcOrderDao;
+
+    @ApiOperation(value = "添加黑名单")
+    @PostMapping(value = "/add")
+    public Result add(@RequestBody AddBlackDto addBlackDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+
+        OtcOrder otcOrder = otcOrderDao.selectById(addBlackDto.getId());
+        if (otcOrder == null) {
+            return Result.fail("订单不存在");
+        }
+
+        OtcBlackList isExist = otcBlackListDao.selectByMemberIdAndBlackMemberId(member.getId(), otcOrder.getEntrustMemberId());
+        if (isExist != null) {
+            return Result.fail("请勿重复拉黑");
+        }
+
+        if (member.getId().equals(otcOrder.getEntrustMemberId())) {
+            return Result.fail("不能拉黑自己");
+        }
+
+        OtcBlackList otcBlackList = new OtcBlackList();
+        otcBlackList.setMemberId(member.getId());
+        otcBlackList.setBlackMemberId(otcOrder.getEntrustMemberId());
+        otcBlackList.setReasons(addBlackDto.getReason());
+        otcBlackListDao.insert(otcBlackList);
+        return Result.ok("拉黑成功");
+    }
+
+    @ApiOperation(value = "黑名单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = BlackListVo.class)
+    })
+    @PostMapping(value = "/blackList")
+    public Result blackList(@RequestBody BlackListDto blackListDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Page<BlackListVo> page = new Page<>(blackListDto.getPageNum(), blackListDto.getPageSize());
+        IPage<BlackListVo> result = otcBlackListDao.selectBlackListInPage(member.getId(), page);
+        return Result.ok(result.getRecords());
+    }
+
+    @ApiOperation(value = "删除黑名单")
+    @PostMapping(value = "/del")
+    public Result del(@RequestBody AddBlackDto addBlackDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        if (addBlackDto.getType() == null) {
+            return Result.fail("参数错误");
+        }
+
+        if (addBlackDto.getType() == 1) {
+            OtcOrder otcOrder = otcOrderDao.selectById(addBlackDto.getId());
+            if (otcOrder == null) {
+                return Result.fail("订单不存在");
+            }
+
+            OtcBlackList otcBlackList = otcBlackListDao.selectByMemberIdAndBlackMemberId(member.getId(), otcOrder.getEntrustMemberId());
+            otcBlackListDao.deleteById(otcBlackList.getId());
+        } else {
+            otcBlackListDao.deleteById(addBlackDto.getId());
+        }
+
+        return Result.ok("解除成功");
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/OtcEntrustOrderController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcEntrustOrderController.java
new file mode 100644
index 0000000..324e1ba
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcEntrustOrderController.java
@@ -0,0 +1,122 @@
+package com.xcong.excoin.modules.otc.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.otc.dao.OtcSettingDao;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderAddDto;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderListDto;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.entity.OtcSetting;
+import com.xcong.excoin.modules.otc.service.OtcEntrustOrderService;
+import com.xcong.excoin.modules.otc.vo.EntrustListInfoVo;
+import com.xcong.excoin.modules.otc.vo.EntrustListVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.web3j.abi.datatypes.Int;
+
+import javax.validation.Valid;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/otcOrder")
+@Validated
+@Api(value = "OtcEntrustOrderController", tags = "otc委托订单接口类")
+public class OtcEntrustOrderController {
+
+    private final OtcEntrustOrderService otcEntrustOrderService;
+    private final OtcSettingDao otcSettingDao;
+
+    @ApiOperation(value = "添加otc委托单", notes = "添加otc委托单")
+    @PostMapping(value = "/addEntrustOrder")
+    public Result addEntrustOrder(@RequestBody EntrustOrderAddDto addDto) {
+        otcEntrustOrderService.add(addDto);
+        return Result.ok("添加成功");
+    }
+
+    @ApiOperation(value = "获取市商条件")
+    @ApiResponses({
+            @ApiResponse(code  = 200, message = "success", response = OtcSetting.class)
+    })
+    @GetMapping(value = "/findCondition")
+    public Result findCondition() {
+        OtcSetting setting = otcSettingDao.selectById(1L);
+        return Result.ok(setting);
+    }
+
+    @ApiOperation(value = "编辑otc委托单", notes = "编辑otc委托单")
+    @PostMapping(value = "/modifyEntrustOrder")
+    public Result modifyEntrustOrder(@RequestBody EntrustOrderAddDto modifyDto) {
+        otcEntrustOrderService.modify(modifyDto);
+        return Result.ok("编辑成功");
+    }
+
+    @ApiOperation(value = "获取otc委托单列表", notes = "获取otc委托单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = EntrustListVo.class)
+    })
+    @PostMapping(value = "/findEntrustOrderList")
+    public Result findEntrustOrderList(@RequestBody EntrustOrderListDto orderListDto) {
+        IPage<EntrustListVo> result = this.otcEntrustOrderService.findEntrustListInPage(orderListDto);
+        return Result.ok(result.getRecords());
+    }
+
+    @ApiOperation(value = "获取我的委托单列表", notes = "获取我的委托单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = EntrustListInfoVo.class)
+    })
+    @PostMapping(value = "/findOwnEntrustOrderList")
+    public Result findOwnEntrustOrderList(@RequestBody EntrustOrderListDto orderListDto) {
+        return Result.ok(otcEntrustOrderService.findOwnEntrustOrder(orderListDto));
+    }
+
+    @ApiOperation(value = "获取我的委托单详情")
+    @GetMapping(value = "/findOwnOrderDetail/{id}")
+    public Result findOwnOrderDetail(@PathVariable("id") Long id) {
+        return otcEntrustOrderService.findEntrustOrderDetail(id);
+    }
+
+    @ApiOperation(value = "上/下线接口")
+    @PostMapping(value = "/upOrDownList/{id}")
+    public Result upOrDownList(@PathVariable("id") Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcEntrustOrder otcEntrustOrder = this.otcEntrustOrderService.getById(id);
+        if (otcEntrustOrder == null) {
+            return Result.fail("数据不存在");
+        }
+
+        if (!member.getId().equals(otcEntrustOrder.getMemberId())) {
+            return Result.fail("数据错误");
+        }
+
+        Integer status = otcEntrustOrder.getStatus();
+        otcEntrustOrder = new OtcEntrustOrder();
+        otcEntrustOrder.setId(id);
+        if (status.equals(OtcEntrustOrder.LINE_DOWN)) {
+            otcEntrustOrder.setStatus(OtcEntrustOrder.LINE_UP);
+        } else {
+            otcEntrustOrder.setStatus(OtcEntrustOrder.LINE_DOWN);
+        }
+
+        this.otcEntrustOrderService.updateById(otcEntrustOrder);
+        return Result.ok("修改成功");
+    }
+
+    @ApiOperation(value = "撤销委托单")
+    @PostMapping(value = "/cancelOrder/{id}")
+    public Result cancelOrder(@PathVariable("id") Long id) {
+        this.otcEntrustOrderService.cancelEntrustOrder(id);
+        return Result.ok("撤销成功");
+    }
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/OtcMarketBussinessController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcMarketBussinessController.java
new file mode 100644
index 0000000..cf0f695
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcMarketBussinessController.java
@@ -0,0 +1,117 @@
+package com.xcong.excoin.modules.otc.controller;
+
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.otc.dto.MbAddDto;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import com.xcong.excoin.modules.otc.mapper.OtcMarketBussinessMapper;
+import com.xcong.excoin.modules.otc.service.OtcEntrustOrderService;
+import com.xcong.excoin.modules.otc.service.OtcMarketBussinessService;
+import com.xcong.excoin.modules.otc.vo.ApplyConditionsVo;
+import com.xcong.excoin.modules.otc.vo.MarketBussinessInfoVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/marketBussiness")
+@Api(value = "OtcMarketBussinessController", tags = "otc市商接口类")
+public class OtcMarketBussinessController {
+
+    private final OtcMarketBussinessService otcMarketBussinessService;
+    private final MemberWalletCoinDao memberWalletCoinDao;
+    private final MemberDao memberDao;
+
+    @ApiOperation(value = "申请条件", notes = "申请条件")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "获取成功", response = ApplyConditionsVo.class)
+    })
+    @PostMapping(value = "/applyConditions")
+    public Result applyConditions() {
+        return otcMarketBussinessService.applyConditions();
+    }
+
+
+    @ApiOperation(value = "申请市商接口", notes = "申请市商接口")
+    @PostMapping(value = "/applyMaketBussiness")
+    public Result applyMarketBussiness() {
+        otcMarketBussinessService.add();
+        return Result.ok("申请成功, 等待审核");
+    }
+
+//    @ApiOperation(value = "modifyMarketBussiness", notes = "修改个人信息")
+    @PostMapping(value = "/modifyMarketBussiness")
+    public Result modifyMarketBussiness(@RequestBody MbAddDto mbAddDto) {
+        if (mbAddDto.getId() == null) {
+            return Result.fail("id不能为空");
+        }
+
+        OtcMarketBussiness mb = otcMarketBussinessService.getById(mbAddDto.getId());
+        if (mb == null) {
+            return Result.fail("市商不存在");
+        }
+
+        if (!mb.getStatus().equals(OtcMarketBussiness.CHECK_PASS)) {
+            return Result.fail("暂不能修改信息");
+        }
+
+        OtcMarketBussiness otcMb = new OtcMarketBussiness();
+        otcMb.setId(mbAddDto.getId());
+//        otcMb.setNikename(mbAddDto.getNickname());
+        otcMarketBussinessService.updateById(otcMb);
+        return Result.ok("修改成功");
+    }
+
+    @ApiOperation(value = "findMarketBussinessStatus", notes = "获取市商申请状态接口")
+    @GetMapping(value = "/findMarketBussinessStatus")
+    public Result findMarketBussinessStatus() {
+        return Result.ok("获取成功", otcMarketBussinessService.findMbStatus());
+    }
+
+
+    @ApiOperation(value = "获取市商信息", notes = "获取市商信息")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "获取成功", response = MarketBussinessInfoVo.class)
+    })
+    @GetMapping(value = "/findMbInfo/{id}")
+    public Result findMbInfo(@PathVariable("id") Long id) {
+        return this.otcMarketBussinessService.findMbInfo(id);
+    }
+
+    @ApiOperation(value = "修改姓名")
+    @PostMapping(value = "/modifyName")
+    public Result modifyName(@RequestBody MbAddDto mbAddDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Long memberId = member.getId();
+
+        member = new MemberEntity();
+        member.setId(memberId);
+        member.setName(mbAddDto.getNickname());
+        memberDao.updateById(member);
+
+        return Result.ok("修改成功");
+    }
+
+    @ApiOperation(value = "查询当前用户可用")
+    @GetMapping(value = "/memberWallet")
+    public Result memberWallet() {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(member.getId(), "USDT");
+        return Result.ok(wallet.getAvailableBalance());
+    }
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/OtcMsgController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcMsgController.java
new file mode 100644
index 0000000..c6bde94
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcMsgController.java
@@ -0,0 +1,93 @@
+package com.xcong.excoin.modules.otc.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.otc.dto.*;
+import com.xcong.excoin.modules.otc.service.OtcMsgService;
+import com.xcong.excoin.modules.otc.vo.ChatBoxVo;
+import com.xcong.excoin.modules.otc.vo.ChatOrderVo;
+import com.xcong.excoin.modules.otc.vo.MsgListVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping(value = "/api/otcMsg")
+@RequiredArgsConstructor
+@Api(value = "OtcMsgController", tags = "otc用户消息接口类")
+public class OtcMsgController {
+
+    private final OtcMsgService otcMsgService;
+
+    /**
+     * 获取对话列表
+     */
+    @ApiOperation(value = "获取对话列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = MsgListVo.class)
+    })
+    @PostMapping(value = "/getMsgList")
+    public Result getMsgList(@RequestBody MsgListDto msgListDto) {
+        IPage<MsgListVo> page = otcMsgService.getMsgList(msgListDto);
+        return Result.ok(page.getRecords());
+    }
+
+    /**
+     * 联系卖家或者联系买家
+     */
+    @ApiOperation(value = "联系卖家或者联系买家")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ChatBoxVo.class)
+    })
+    @PostMapping(value = "/getChatBoxConnect")
+    public Result getChatBoxConnect(@RequestBody ConnectDto connectDto) {
+        return otcMsgService.getChatBoxConnect(connectDto);
+    }
+
+    /**
+     * 进入聊天框,获取聊天记录
+     */
+    @ApiOperation(value = "进入聊天框,获取聊天记录")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ChatBoxVo.class)
+    })
+    @PostMapping(value = "/getChatBox")
+    public Result getChatBox(@RequestBody ChatBoxDto chatBoxDto) {
+        return otcMsgService.getChatBox(chatBoxDto);
+    }
+
+    /**
+     * 进入聊天框,获取聊天记录---获取未完成记录
+     */
+    @ApiOperation(value = "进入聊天框---获取未完成记录")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ChatOrderVo.class)
+    })
+    @PostMapping(value = "/getChatOrder")
+    public Result getChatOrder(@RequestBody ChatOrderDto chatOrderDto) {
+        return otcMsgService.getChatOrder(chatOrderDto);
+    }
+
+    /**
+     * 发送消息
+     */
+    @ApiOperation(value = "发送消息")
+    @PostMapping(value = "/sendMsg")
+    public Result sendMsg(@RequestBody SendMsgDto sendMsgDto) {
+        return otcMsgService.sendMsg(sendMsgDto);
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/OtcOrderController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcOrderController.java
new file mode 100644
index 0000000..c2ef66d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcOrderController.java
@@ -0,0 +1,124 @@
+package com.xcong.excoin.modules.otc.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.otc.dao.OtcReturnMoneyDao;
+import com.xcong.excoin.modules.otc.dto.*;
+import com.xcong.excoin.modules.otc.service.OtcOrderService;
+import com.xcong.excoin.modules.otc.vo.BuyOrderDetailVo;
+import com.xcong.excoin.modules.otc.vo.OrderListVo;
+import com.xcong.excoin.modules.otc.vo.SaleOrderDetailVo;
+import com.xcong.excoin.modules.otc.vo.TeamVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping(value = "/api/otcOrder")
+@RequiredArgsConstructor
+@Api(value = "OtcOrderController", tags = "otc用户订单接口类")
+public class OtcOrderController {
+
+    private final OtcOrderService otcOrderService;
+    private final OtcReturnMoneyDao otcReturnMoneyDao;
+
+    @ApiOperation(value = "我要购买")
+    @PostMapping(value = "/buy")
+    public Result buy(@RequestBody OtcOrderAddDto orderAddDto) {
+        return otcOrderService.buyOrder(orderAddDto);
+    }
+
+    @ApiOperation(value = "我要出售")
+    @PostMapping(value = "/sale")
+    public Result sale(@RequestBody OtcOrderAddDto orderAddDto) {
+        return otcOrderService.saleOrder(orderAddDto);
+    }
+
+    @ApiOperation(value = "用户订单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = OrderListVo.class)
+    })
+    @PostMapping(value = "/orderList")
+    public Result orderList(@RequestBody OrderListDto orderListDto) {
+        IPage<OrderListVo> page = otcOrderService.findOrderListInPage(orderListDto);
+        return Result.ok(page.getRecords());
+    }
+
+    @ApiOperation(value = "买单 - 订单详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = BuyOrderDetailVo.class)
+    })
+    @GetMapping(value = "/buyOrderDetail/{id}")
+    public Result buyOrderDetail(@PathVariable("id") Long id) {
+        return otcOrderService.findBuyOrderDetail(id);
+    }
+
+    @ApiOperation(value = "卖单 - 订单详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = SaleOrderDetailVo.class)
+    })
+    @GetMapping(value = "/saleOrderDetail/{id}")
+    public Result saleOrderDetail(@PathVariable("id") Long id) {
+        return otcOrderService.findSaleOrderDetail(id);
+    }
+
+    @ApiOperation(value = "已付款,请放币")
+    @PostMapping(value = "/hasPay")
+    public Result hasPay(@RequestBody HasPayDto hasPayDto) {
+        otcOrderService.hasPay(hasPayDto);
+        return Result.ok("操作成功");
+    }
+
+    @ApiOperation(value = "确认收款")
+    @PostMapping(value = "/finishOrder/{id}")
+    public Result finishOrder(@PathVariable("id") Long id) {
+        otcOrderService.finishOrder(id);
+        return Result.ok("操作成功");
+    }
+
+    @ApiOperation(value = "取消订单")
+    @PostMapping(value = "/cancelUserOrder/{id}")
+    public Result cancelUserOrder(@PathVariable("id") Long id) {
+        otcOrderService.cancelOrder(id);
+        return Result.ok("操作成功");
+    }
+
+    @ApiOperation(value = "申诉")
+    @PostMapping(value = "/orderApeal")
+    public Result orderApeal(@RequestBody OrderApealDto orderApealDto) {
+        return otcOrderService.orderApeal(orderApealDto);
+    }
+
+    @ApiOperation(value = "获取我的团队")
+    @PostMapping(value = "/findTeamList")
+    public Result teamList(@RequestBody TeamDto teamDto) {
+        Page<TeamVo> page = new Page<>(teamDto.getPageNum(), teamDto.getPageSize());
+
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        IPage<TeamVo> data = otcReturnMoneyDao.selectMyTeamAmountInPage(member.getInviteId(), member.getId(), page);
+        BigDecimal totalAmount = otcReturnMoneyDao.selectTotalAmount(member.getId());
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("totalCnt", data.getTotal());
+        result.put("totalAmount", totalAmount == null ? BigDecimal.ZERO : totalAmount.setScale(4, BigDecimal.ROUND_DOWN));
+        result.put("result", data.getRecords());
+        return Result.ok(result);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcBlackListDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcBlackListDao.java
new file mode 100644
index 0000000..f5f1d9f
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcBlackListDao.java
@@ -0,0 +1,19 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.modules.otc.entity.OtcBlackList;
+import com.xcong.excoin.modules.otc.vo.BlackListVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface OtcBlackListDao extends BaseMapper<OtcBlackList> {
+
+    OtcBlackList selectByMemberIdAndBlackMemberId(@Param("memberId") Long memberId, @Param("blackMemberId") Long blackMemberId);
+
+    IPage<BlackListVo> selectBlackListInPage(@Param("memberId") Long memberId, Page<BlackListVo> page);
+
+    List<OtcBlackList> selectBlackListByMemberId(@Param("memberId") Long memberId);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcEntrustOrderDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcEntrustOrderDao.java
new file mode 100644
index 0000000..9a248a4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcEntrustOrderDao.java
@@ -0,0 +1,24 @@
+package com.xcong.excoin.modules.otc.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderListDto;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.vo.EntrustListVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface OtcEntrustOrderDao extends BaseMapper<OtcEntrustOrder> {
+
+    IPage<EntrustListVo> selectEntrustListInPage(@Param("record") EntrustOrderListDto dto, Page<EntrustListVo> page);
+
+    List<OtcEntrustOrder> selectEntrustOrderByOrderType(@Param("record") OtcEntrustOrder otcEntrustOrder);
+
+    IPage<OtcEntrustOrder> selectOwnEntrustListInPage(@Param("record") OtcEntrustOrder otcEntrustOrder, Page<OtcEntrustOrder> page);
+
+    int updateRemainAmount(@Param("id") Long id, @Param("amount") BigDecimal amount);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMarketBussinessDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMarketBussinessDao.java
new file mode 100644
index 0000000..910ab68
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMarketBussinessDao.java
@@ -0,0 +1,10 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcMarketBussinessDao extends BaseMapper<OtcMarketBussiness> {
+
+    OtcMarketBussiness selectMarketBussinessByMemberId(@Param("memberId") Long memberId);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgHistoryDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgHistoryDao.java
new file mode 100644
index 0000000..436da99
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgHistoryDao.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.modules.otc.entity.OtcMsgHistoryEntity;
+import com.xcong.excoin.modules.otc.vo.ChatBoxVo;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcMsgHistoryDao  extends BaseMapper<OtcMsgHistoryEntity> {
+
+    IPage<ChatBoxVo> getChatBoxMsgList(Page<ChatBoxVo> page, @Param("record")OtcMsgHistoryEntity otcMsgHistoryEntity);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgUserListDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgUserListDao.java
new file mode 100644
index 0000000..3c268df
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcMsgUserListDao.java
@@ -0,0 +1,19 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.modules.otc.entity.OtcMsgUserListEntity;
+import com.xcong.excoin.modules.otc.vo.MsgListVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface OtcMsgUserListDao extends BaseMapper<OtcMsgUserListEntity> {
+
+    IPage<MsgListVo> getMsgList(@Param("record")OtcMsgUserListEntity otcMsgUserListEntity, Page<MsgListVo> page);
+
+    List<OtcMsgUserListEntity> selectListByMemberIdAndTargetId(@Param("memberId")Long memberId, @Param("targetId")long targetId);
+
+    OtcMsgUserListEntity selectChatListByToAndFrom(@Param("to") Long to, @Param("from") Long from);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderAppealDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderAppealDao.java
new file mode 100644
index 0000000..6cdf87b
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderAppealDao.java
@@ -0,0 +1,7 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.otc.entity.OtcOrderAppeal;
+
+public interface OtcOrderAppealDao extends BaseMapper<OtcOrderAppeal> {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderDao.java
new file mode 100644
index 0000000..a71c727
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcOrderDao.java
@@ -0,0 +1,46 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.vo.ChatOrderVo;
+import com.xcong.excoin.modules.otc.vo.OrderListVo;
+import org.apache.ibatis.annotations.Param;
+import org.web3j.abi.datatypes.Int;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface OtcOrderDao extends BaseMapper<OtcOrder> {
+
+    List<OtcOrder> selectOrderListUnFinish(@Param("memberId") Long memberId, @Param("entrustOrderId") Long entrustOrderId);
+
+    IPage<OrderListVo> selectOrdderListInPage(@Param("record") OtcOrder order, Page<OrderListVo> page);
+
+    int updateOrderStatusByOrderNo(@Param("status") Integer status, @Param("payName") String payName, @Param("orderNo") String orderNo);
+
+    OtcOrder selectOrderByOrderNoAndType(@Param("orderNo") String orderNo, @Param("orderType") String orderType);
+
+    List<OtcOrder> selectOrderListWithStatusAndType(@Param("type") String orderType, @Param("status") Integer status);
+
+    Integer selectMemberCntForEntrust(@Param("entrustMemberId") Long entrustMemberId);
+
+    Integer selectTotalOrderCount(@Param("entrustMemberId") Long entrustMemberId, @Param("status") Integer status, @Param("type") String type);
+
+    BigDecimal selectMemberAvgPayTime(@Param("memberId") Long memberId);
+
+    BigDecimal selectMemberAvgCoinTime(@Param("memberId") Long memberId);
+
+    List<OtcOrder> selectOrderListForUser(@Param("memberId") Long memberId, @Param("status") Integer status);
+
+    BigDecimal selectOrderTotalAmount(@Param("memberId") Long memberId);
+
+    List<ChatOrderVo> selectByMemberIdAndTargetId(@Param("memberId")Long memberId, @Param("targetId")long targetId);
+
+    List<ChatOrderVo> selectOneByMemberIdAndTargetId(@Param("memberId")Long memberId, @Param("targetId")long targetId);
+
+    int updateIsReturnByOrderNo(@Param("isReturn") Integer isReturn, @Param("orderNo") String orderNo);
+
+    OtcOrder selectOrderUnEntrust(@Param("orderNo") String orderNo);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcReturnMoneyDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcReturnMoneyDao.java
new file mode 100644
index 0000000..c2fba13
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcReturnMoneyDao.java
@@ -0,0 +1,17 @@
+package com.xcong.excoin.modules.otc.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.excoin.modules.otc.entity.OtcReturnMoney;
+import com.xcong.excoin.modules.otc.vo.TeamVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+
+public interface OtcReturnMoneyDao extends BaseMapper<OtcReturnMoney> {
+
+    IPage<TeamVo> selectMyTeamAmountInPage(@Param("inviteId") String inviteId, @Param("memberId") Long memberId, Page<TeamVo> page);
+
+    BigDecimal selectTotalAmount(@Param("memberId") Long memberId);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dao/OtcSettingDao.java b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcSettingDao.java
new file mode 100644
index 0000000..62b4547
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dao/OtcSettingDao.java
@@ -0,0 +1,8 @@
+package com.xcong.excoin.modules.otc.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.otc.entity.OtcSetting;
+
+public interface OtcSettingDao extends BaseMapper<OtcSetting> {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/AddBlackDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/AddBlackDto.java
new file mode 100644
index 0000000..7b568e2
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/AddBlackDto.java
@@ -0,0 +1,25 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+
+@Data
+@ApiModel(value = "AddBlackDto", description = "拉黑/取消拉黑接口参数接受类")
+public class AddBlackDto {
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "订单id/黑名单id")
+    private Long id;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "1-订单 2-黑名单ID")
+    private Integer type;
+
+    @ApiModelProperty(value = "原因 - 删除不传")
+    private String reason;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/BlackListDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/BlackListDto.java
new file mode 100644
index 0000000..ccd17e2
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/BlackListDto.java
@@ -0,0 +1,16 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "BlackListDto", description = "黑名单列表参数接收类")
+public class BlackListDto {
+
+    @ApiModelProperty(value = "页数")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "条数")
+    private Integer pageSize = 10;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/ChatBoxDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/ChatBoxDto.java
new file mode 100644
index 0000000..e9d2fd2
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/ChatBoxDto.java
@@ -0,0 +1,22 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ChatBoxDto", description = "参数接收类")
+public class ChatBoxDto {
+
+    @ApiModelProperty(value = "条数", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "ID", example = "1")
+    private long id;
+
+    @ApiModelProperty(value = "目标ID", example = "1")
+    private long targetId;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/ChatOrderDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/ChatOrderDto.java
new file mode 100644
index 0000000..7451088
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/ChatOrderDto.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ChatOrderDto", description = "参数接收类")
+public class ChatOrderDto {
+
+    @ApiModelProperty(value = "目标ID", example = "1")
+    private long targetId;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/ConnectDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/ConnectDto.java
new file mode 100644
index 0000000..ba86ede
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/ConnectDto.java
@@ -0,0 +1,20 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ConnectDto", description = "参数接收类")
+public class ConnectDto {
+
+    @ApiModelProperty(value = "条数", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "目标ID", example = "1")
+    private long targetId;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderAddDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderAddDto.java
new file mode 100644
index 0000000..8f0700b
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderAddDto.java
@@ -0,0 +1,38 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+
+
+@Data
+@ApiModel(value = "EntrustOrderAddDto", description = "添加委托单接口参数接收类")
+public class EntrustOrderAddDto {
+
+    @ApiModelProperty(value = "id-编辑时传")
+    private Long id;
+
+    @NotBlank(message = "单价不能为空")
+    @ApiModelProperty(value = "单价", example = "1")
+    private BigDecimal unitPrice;
+
+    @NotBlank(message = "数量不能为空")
+    @ApiModelProperty(value = "数量", example = "1")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "总额", example = "1")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "限额 - 最大值", example = "2")
+    private BigDecimal max;
+
+    @ApiModelProperty(value = "限额 - 最小值", example = "1")
+    private BigDecimal min;
+
+    @NotBlank(message = "委托单类型不能为空")
+    @ApiModelProperty(value = "类型", example = "B/买-S/卖 编辑不传")
+    private String type;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderListDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderListDto.java
new file mode 100644
index 0000000..0f9b2e8
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/EntrustOrderListDto.java
@@ -0,0 +1,30 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "EntrustOrderListDto", description = "委托单列表接口参数接收类")
+public class EntrustOrderListDto {
+
+    @NotNull
+    @Min(1)
+    @ApiModelProperty(value = "第几页", example = "1")
+    private Integer pageNum;
+
+    @NotNull
+    @ApiModelProperty(value = "每页数量", example = "10")
+    private Integer pageSize;
+
+    @NotBlank
+    @ApiModelProperty(value = "类型", example = "B-买 S-卖")
+    private String type;
+
+    @ApiModelProperty(hidden = true)
+    private Long memberId;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/HasPayDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/HasPayDto.java
new file mode 100644
index 0000000..81651d7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/HasPayDto.java
@@ -0,0 +1,16 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "HasPayDto", description = "已付款接口接收参数类")
+public class HasPayDto {
+
+    @ApiModelProperty(value = "订单ID", example = "1")
+    private Long id;
+
+    @ApiModelProperty(value = "姓名", example = "张三")
+    private String name;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/MbAddDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/MbAddDto.java
new file mode 100644
index 0000000..1963888
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/MbAddDto.java
@@ -0,0 +1,21 @@
+package com.xcong.excoin.modules.otc.dto;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "MbAddDto", description = "申请市商接口参数接收类")
+public class MbAddDto {
+
+    @ApiModelProperty(value = "id - 编辑时传")
+    private Long id;
+
+    @NotBlank(message = "昵称不能为空")
+    @ApiModelProperty(value = "昵称", example = "123")
+    private String nickname;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/MsgListDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/MsgListDto.java
new file mode 100644
index 0000000..4588610
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/MsgListDto.java
@@ -0,0 +1,20 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MsgListDto", description = "参数接收类")
+public class MsgListDto {
+
+    @ApiModelProperty(value = "条数", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "昵称", example = "1")
+    private String nickname;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/OrderApealDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/OrderApealDto.java
new file mode 100644
index 0000000..3db3ba1
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/OrderApealDto.java
@@ -0,0 +1,28 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "OrderApealDto", description = "参数接收类")
+public class OrderApealDto {
+
+    @ApiModelProperty(value = "订单ID", example = "1")
+    private Long orderId;
+
+    /**
+     * 申诉原因
+     */
+    @ApiModelProperty(value = "申诉原因", example = "1")
+    private String reason;
+
+    /**
+     * 申诉内容
+     */
+    @ApiModelProperty(value = "申诉图片", example = "1")
+    private List<String> content;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/OrderListDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/OrderListDto.java
new file mode 100644
index 0000000..7db3fb1
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/OrderListDto.java
@@ -0,0 +1,21 @@
+package com.xcong.excoin.modules.otc.dto;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "OtcOrderListDto", description = "订单列表请求参数类")
+public class OrderListDto {
+
+    @ApiModelProperty(value = "条数", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "状态 1-未完成 2-已完成 3-已取消", example = "1")
+    private Integer status;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/OtcOrderAddDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/OtcOrderAddDto.java
new file mode 100644
index 0000000..6fad748
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/OtcOrderAddDto.java
@@ -0,0 +1,29 @@
+package com.xcong.excoin.modules.otc.dto;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "OtcOrderAddDto", description = "提交订单接口参数接收类")
+public class OtcOrderAddDto {
+
+    @NotNull
+    @ApiModelProperty(value = "购买USDT数量", example = "120.00")
+    private BigDecimal usdtAmount;
+
+    @NotNull
+    @ApiModelProperty(value = "CNY金额", example = "120.00")
+    private BigDecimal cnyAmount;
+
+    @NotNull
+    @ApiModelProperty(value = "委托单ID", example = "1")
+    private Long id;
+
+    @ApiModelProperty(value = "资金密码 -- 用户出售USDT使用", example = "123456")
+    private String password;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/SendMsgDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/SendMsgDto.java
new file mode 100644
index 0000000..586e9a7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/SendMsgDto.java
@@ -0,0 +1,22 @@
+package com.xcong.excoin.modules.otc.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "SendMsgDto", description = "参数接收类")
+public class SendMsgDto {
+
+    @ApiModelProperty(value = "目标用户ID")
+    private long targetId;
+
+    //消息
+    @ApiModelProperty(value = "消息")
+    private String msg;
+
+    //消息类型 1-文本2-图片
+    @ApiModelProperty(value = "消息类型 1-文本2-图片")
+    private Integer msgType;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/dto/TeamDto.java b/src/main/java/com/xcong/excoin/modules/otc/dto/TeamDto.java
new file mode 100644
index 0000000..706f74c
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/dto/TeamDto.java
@@ -0,0 +1,15 @@
+package com.xcong.excoin.modules.otc.dto;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TeamDto {
+
+    @ApiModelProperty(value = "条数", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNum;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcBlackList.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcBlackList.java
new file mode 100644
index 0000000..7b30805
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcBlackList.java
@@ -0,0 +1,17 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+
+@Data
+@TableName("otc_black_list")
+public class OtcBlackList extends BaseEntity {
+
+    private Long memberId;
+
+    private Long blackMemberId;
+
+    private String reasons;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrder.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrder.java
new file mode 100644
index 0000000..fb0c390
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrder.java
@@ -0,0 +1,79 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("otc_entrust_order")
+public class OtcEntrustOrder extends BaseEntity {
+
+    private Long memberId;
+
+    private Long mbId;
+
+    /**
+     * 委托单号
+     */
+    private String entrustOrderNo;
+
+    /**
+     * 单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 数量
+     */
+    private BigDecimal coinAmount;
+
+    /**
+     * 剩余数量
+     */
+    private BigDecimal remainCoinAmount;
+
+    /**
+     * 限额
+     */
+    private BigDecimal limitMinAmount;
+
+    /**
+     * 限额
+     */
+    private BigDecimal limitMaxAmount;
+
+    /**
+     * 委托总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 委托单类型 B-买 S-卖
+     */
+    private String orderType;
+    public static final String ORDER_TYPE_B = "B";
+    public static final String ORDER_TYPE_S = "S";
+
+    /**
+     * 1-上线 2-下线 3-撤销
+     */
+    private Integer status;
+    public static final Integer LINE_UP = 1;
+    public static final Integer LINE_DOWN = 2;
+    public static final Integer LINE_CANCEL = 3;
+
+    /**
+     * 是否市商 1-是 2-否
+     */
+    private Integer isMb;
+    public static final Integer IS_MB_Y = 1;
+    public static final Integer IS_MB_N = 2;
+
+    @TableField(exist = false)
+    private String payType;
+    @TableField(exist = false)
+    private Integer isDefualt;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussiness.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussiness.java
new file mode 100644
index 0000000..2ad3ae4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussiness.java
@@ -0,0 +1,60 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("otc_market_bussiness")
+public class OtcMarketBussiness extends BaseEntity {
+
+    private Long memberId;
+
+    private String nikename;
+
+    private String declaration;
+
+    /**
+     * 1-待审核2-审核通过3-审核拒绝
+     */
+    private Integer status;
+    public static final Integer CHECK_WAIT = 1;
+    public static final Integer CHECK_PASS = 2;
+    public static final Integer CHECK_REFUSE = 3;
+
+    private Integer buyCnt;
+
+    private Integer totalOrderCnt;
+
+    private BigDecimal finishRatio;
+
+    private Integer avgPayTime;
+
+    private Integer avgCoinTime;
+
+    /**
+     * 待回款
+     */
+    private BigDecimal waitBackMoney;
+
+    /**
+     * 已回款
+     */
+    private BigDecimal hasBackMoney;
+
+    /**
+     * 卖单数
+     */
+    private Integer saleOrderCnt;
+
+    private BigDecimal saleFinishRatio;
+
+    /**
+     * 买单数
+     */
+    private Integer buyOrderCnt;
+
+    private Integer saleTotalCnt;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgHistoryEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgHistoryEntity.java
new file mode 100644
index 0000000..daa3662
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgHistoryEntity.java
@@ -0,0 +1,30 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+//历史消息
+@Data
+@TableName("otc_msg_history")
+public class OtcMsgHistoryEntity extends BaseEntity {
+
+    //用户ID
+    private long memberId;
+
+    //发送方
+    private long fromMemberId;
+    //对方用户ID
+    private long targetId;
+
+    //消息
+    private String msg;
+
+    //消息类型 1-文本2-图片
+    private Integer msgType;
+
+    //是不是memberId发的消息 1:是 2:否
+    private Integer isSelf;
+    public static final Integer ISSELF_ONE = 1;
+    public static final Integer ISSELF_TWO = 2;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgUserListEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgUserListEntity.java
new file mode 100644
index 0000000..464c6f8
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMsgUserListEntity.java
@@ -0,0 +1,34 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+//用户消息列表
+@Data
+@TableName("otc_msg_user_list")
+public class OtcMsgUserListEntity  extends BaseEntity {
+
+
+
+    //用户ID
+    private long memberId;
+
+    //对方用户ID
+    private long targetId;
+
+    //是否已读 1:未读 2:已读
+    private Integer isRead;
+    public static final Integer ISREAD_ONE = 1;
+    public static final Integer ISREAD_TWO = 2;
+
+    //最后聊天时间
+    private Date lastMsgTime;
+
+    @TableField(exist = false)
+    private String nickname;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrder.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrder.java
new file mode 100644
index 0000000..dade3e0
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrder.java
@@ -0,0 +1,96 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("otc_order")
+public class OtcOrder extends BaseEntity {
+
+    private Long memberId;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 数量
+     */
+    private BigDecimal coinAmount;
+
+    /**
+     * 总额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 订单状态 1-已提交未付款2-已付款3-已完成
+     */
+    private Integer status;
+    public static final Integer STATUS_SUBMIT = 1;
+    public static final Integer STATUS_PAY = 2;
+    public static final Integer STATUS_FINISH = 3;
+    public static final Integer STATUS_CANCEL = 4;
+
+    /**
+     * 付款时间
+     */
+    private Date payTime;
+
+    /**
+     * 完成时间
+     */
+    private Date finishTime;
+
+    /**
+     * 委托单ID
+     */
+    private Long entrustOrderId;
+
+    private Long mbId;
+
+    /**
+     * 支付市商ID
+     */
+    private Long payMbId;
+
+    /**
+     * 付款人姓名
+     */
+    private String payName;
+
+    /**
+     * 委托单用户ID
+     */
+    private Long entrustMemberId;
+
+    /**
+     * 订单类型 B-买 S-卖
+     */
+    private String orderType;
+
+    /**
+     * 对面的用户ID
+     */
+    private Long oppositeMemberId;
+
+    private String bankName;
+
+    private String bankNo;
+
+    private String cardName;
+
+    private String payType;
+
+    private Integer isReturn;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppeal.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppeal.java
new file mode 100644
index 0000000..5ce16d1
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppeal.java
@@ -0,0 +1,31 @@
+package com.xcong.excoin.modules.otc.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName("otc_order_appeal")
+public class OtcOrderAppeal extends BaseEntity {
+
+    private Long memberId;
+
+    private Long orderId;
+
+    /**
+     * 申诉原因
+     */
+    private String reason;
+
+    /**
+     * 申诉内容
+     */
+    private String content;
+
+    //申诉状态  1:待处理 2:处理中 3:已处理
+    private Integer status;
+    public static final Integer STATUS_ONE = 1;
+    public static final Integer STATUS_TWO = 2;
+    public static final Integer STATUS_THREE = 3;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcReturnMoney.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcReturnMoney.java
new file mode 100644
index 0000000..0bda18b
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcReturnMoney.java
@@ -0,0 +1,22 @@
+package com.xcong.excoin.modules.otc.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("otc_return_money")
+public class OtcReturnMoney extends BaseEntity {
+
+    private String orderNo;
+
+    private Long toMemberId;
+
+    private Long fromMemberId;
+
+    private BigDecimal amount;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcSetting.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcSetting.java
new file mode 100644
index 0000000..e428fae
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcSetting.java
@@ -0,0 +1,22 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.web3j.abi.datatypes.Int;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("otc_setting")
+public class OtcSetting {
+
+    private Long id;
+
+    private Integer orderNum;
+
+    private BigDecimal completionRate;
+
+    private BigDecimal totalAmount;
+
+    private Integer cancellNum;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcEntrustOrderMapper.java b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcEntrustOrderMapper.java
new file mode 100644
index 0000000..2fc5f42
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcEntrustOrderMapper.java
@@ -0,0 +1,39 @@
+package com.xcong.excoin.modules.otc.mapper;
+
+
+import com.xcong.excoin.modules.otc.dto.EntrustOrderAddDto;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.vo.EntrustListInfoVo;
+import com.xcong.excoin.modules.otc.vo.EntrustOrderDetailVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public abstract class OtcEntrustOrderMapper {
+    public static OtcEntrustOrderMapper INSTANCE = Mappers.getMapper(OtcEntrustOrderMapper.class);
+
+    @Mapping(target = "coinAmount", source = "amount")
+    @Mapping(target = "limitMinAmount", source = "min")
+    @Mapping(target = "limitMaxAmount", source = "max")
+    @Mapping(target = "orderType", source = "type")
+    public abstract OtcEntrustOrder entrustOrderDtoToEntity(EntrustOrderAddDto entrustOrderAddDto);
+
+
+    @Mapping(target = "min", source = "limitMinAmount")
+    @Mapping(target = "max", source = "limitMaxAmount")
+    @Mapping(target = "amount", source = "coinAmount")
+    @Mapping(target = "remainAmount", source = "remainCoinAmount")
+    public abstract EntrustListInfoVo entityToListInfoVo(OtcEntrustOrder otcEntrustOrder);
+
+    public abstract List<EntrustListInfoVo> entrustToListInfoVoList(List<OtcEntrustOrder> list);
+
+    @Mapping(target = "min", source = "limitMinAmount")
+    @Mapping(target = "max", source = "limitMaxAmount")
+    @Mapping(target = "amount", source = "coinAmount")
+    @Mapping(target = "remainAmount", source = "remainCoinAmount")
+    @Mapping(target = "orderNo", source = "entrustOrderNo")
+    public abstract EntrustOrderDetailVo entityToOrderDetail(OtcEntrustOrder order);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcMarketBussinessMapper.java b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcMarketBussinessMapper.java
new file mode 100644
index 0000000..7d12167
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcMarketBussinessMapper.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.otc.mapper;
+
+
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import com.xcong.excoin.modules.otc.vo.MarketBussinessInfoVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public abstract class OtcMarketBussinessMapper {
+    public static OtcMarketBussinessMapper INSTANCE = Mappers.getMapper(OtcMarketBussinessMapper.class);
+
+    public abstract MarketBussinessInfoVo entityToVo(OtcMarketBussiness otcMarketBussiness);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/OtcEntrustOrderService.java b/src/main/java/com/xcong/excoin/modules/otc/service/OtcEntrustOrderService.java
new file mode 100644
index 0000000..e007954
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/OtcEntrustOrderService.java
@@ -0,0 +1,28 @@
+package com.xcong.excoin.modules.otc.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderAddDto;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderListDto;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.vo.EntrustListInfoVo;
+import com.xcong.excoin.modules.otc.vo.EntrustListVo;
+
+import java.util.List;
+
+public interface OtcEntrustOrderService extends IService<OtcEntrustOrder> {
+
+    void add(EntrustOrderAddDto addDto);
+
+    void modify(EntrustOrderAddDto modifyDto);
+
+    IPage<EntrustListVo> findEntrustListInPage(EntrustOrderListDto dto);
+
+    List<EntrustListInfoVo> findOwnEntrustOrder(EntrustOrderListDto orderListDto);
+
+    void cancelEntrustOrder(Long id);
+
+    Result findEntrustOrderDetail(Long id);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/OtcMarketBussinessService.java b/src/main/java/com/xcong/excoin/modules/otc/service/OtcMarketBussinessService.java
new file mode 100644
index 0000000..95de849
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/OtcMarketBussinessService.java
@@ -0,0 +1,17 @@
+package com.xcong.excoin.modules.otc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.otc.dto.MbAddDto;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+
+public interface OtcMarketBussinessService extends IService<OtcMarketBussiness> {
+
+    void add();
+
+    Integer findMbStatus();
+
+    Result findMbInfo(Long id);
+
+    Result applyConditions();
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/OtcMsgService.java b/src/main/java/com/xcong/excoin/modules/otc/service/OtcMsgService.java
new file mode 100644
index 0000000..68b82d6
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/OtcMsgService.java
@@ -0,0 +1,22 @@
+package com.xcong.excoin.modules.otc.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.otc.dto.*;
+import com.xcong.excoin.modules.otc.entity.OtcMsgUserListEntity;
+import com.xcong.excoin.modules.otc.vo.ChatBoxVo;
+import com.xcong.excoin.modules.otc.vo.MsgListVo;
+
+public interface OtcMsgService extends IService<OtcMsgUserListEntity> {
+
+    IPage<MsgListVo> getMsgList(MsgListDto msgListDto);
+
+    Result getChatBox(ChatBoxDto chatBoxDto);
+
+    Result sendMsg(SendMsgDto sendMsgDto);
+
+    Result getChatBoxConnect(ConnectDto connectDto);
+
+    Result getChatOrder(ChatOrderDto chatOrderDto);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderAppealService.java b/src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderAppealService.java
new file mode 100644
index 0000000..37d4d9a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderAppealService.java
@@ -0,0 +1,8 @@
+package com.xcong.excoin.modules.otc.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.excoin.common.system.base.IBaseService;
+import com.xcong.excoin.modules.otc.entity.OtcOrderAppeal;
+
+public interface OtcOrderAppealService extends IService<OtcOrderAppeal> {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderService.java b/src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderService.java
new file mode 100644
index 0000000..2f77b52
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/OtcOrderService.java
@@ -0,0 +1,32 @@
+package com.xcong.excoin.modules.otc.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.otc.dto.HasPayDto;
+import com.xcong.excoin.modules.otc.dto.OrderApealDto;
+import com.xcong.excoin.modules.otc.dto.OrderListDto;
+import com.xcong.excoin.modules.otc.dto.OtcOrderAddDto;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.vo.OrderListVo;
+
+public interface OtcOrderService extends IService<OtcOrder> {
+
+    Result buyOrder(OtcOrderAddDto orderAddDto);
+
+    Result saleOrder(OtcOrderAddDto orderAddDto);
+
+    IPage<OrderListVo> findOrderListInPage(OrderListDto orderListDto);
+
+    void hasPay(HasPayDto hasPayDto);
+
+    void finishOrder(Long id);
+
+    Result findBuyOrderDetail(Long id);
+
+    Result findSaleOrderDetail(Long id);
+
+    void cancelOrder(Long id);
+
+    Result orderApeal(OrderApealDto orderApealDto);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcEntrustOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcEntrustOrderServiceImpl.java
new file mode 100644
index 0000000..a7c1c69
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcEntrustOrderServiceImpl.java
@@ -0,0 +1,230 @@
+package com.xcong.excoin.modules.otc.service.impl;
+
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.exception.GlobalException;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.common.system.service.CommonService;
+import com.xcong.excoin.modules.member.dao.MemberAuthenticationDao;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.dao.MemberPaymentMethodDao;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberPaymentMethodEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.otc.dao.OtcBlackListDao;
+import com.xcong.excoin.modules.otc.dao.OtcMarketBussinessDao;
+import com.xcong.excoin.modules.otc.dao.OtcOrderDao;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderAddDto;
+import com.xcong.excoin.modules.otc.dto.EntrustOrderListDto;
+import com.xcong.excoin.modules.otc.entity.OtcBlackList;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.dao.OtcEntrustOrderDao;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.mapper.OtcEntrustOrderMapper;
+import com.xcong.excoin.modules.otc.service.OtcEntrustOrderService;
+import com.xcong.excoin.modules.otc.vo.EntrustListInfoVo;
+import com.xcong.excoin.modules.otc.vo.EntrustListVo;
+import com.xcong.excoin.modules.otc.vo.EntrustOrderDetailVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import netscape.javascript.JSObject;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class OtcEntrustOrderServiceImpl extends ServiceImpl<OtcEntrustOrderDao, OtcEntrustOrder> implements OtcEntrustOrderService {
+
+    private final MemberDao memberDao;
+    private final MemberPaymentMethodDao memberPaymentMethodDao;
+    private final OtcMarketBussinessDao otcMarketBussinessDao;
+    private final MemberWalletCoinDao memberWalletCoinDao;
+    private final OtcOrderDao otcOrderDao;
+    private final CommonService commonService;
+    private final OtcBlackListDao otcBlackListDao;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(EntrustOrderAddDto addDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcEntrustOrder otcEntrustOrder = OtcEntrustOrderMapper.INSTANCE.entrustOrderDtoToEntity(addDto);
+        otcEntrustOrder.setMemberId(member.getId());
+
+        member = memberDao.selectById(member.getId());
+        if (!MemberEntity.CERTIFY_STATUS_Y.equals(member.getCertifyStatus())) {
+            throw new GlobalException("未实名认证");
+        }
+
+        List<MemberPaymentMethodEntity> payments = memberPaymentMethodDao.selectByMemberId(member.getId());
+        if (CollUtil.isEmpty(payments)) {
+            throw new GlobalException("未绑定收款方式");
+        }
+
+        BigDecimal totalAmount = addDto.getUnitPrice().multiply(addDto.getAmount());
+        otcEntrustOrder.setTotalAmount(totalAmount);
+
+        if (totalAmount.compareTo(addDto.getMax()) < 0) {
+            throw new GlobalException("最大限额应小于总金额");
+        }
+
+        if (OtcEntrustOrder.ORDER_TYPE_S.equals(addDto.getType())) {
+            MemberWalletCoinEntity coinWallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(member.getId(), "USDT");
+//            BigDecimal multiply = addDto.getUnitPrice().multiply(coinWallet.getAvailableBalance());
+            if(coinWallet.getAvailableBalance().compareTo(addDto.getAmount()) < 0) {
+                throw new GlobalException("可用金额不足");
+            }
+
+            memberWalletCoinDao.updateFrozenBalance(member.getId(), coinWallet.getId(), addDto.getAmount());
+        }
+
+        if (!MemberEntity.IS_TRADER_Y.equals(member.getIsTrader())) {
+            throw new GlobalException("不是市商");
+        }
+
+        if (member.getIsTrader() == 2) {
+            otcEntrustOrder.setIsMb(OtcEntrustOrder.IS_MB_N);
+        } else {
+            otcEntrustOrder.setIsMb(OtcEntrustOrder.IS_MB_Y);
+        }
+
+        otcEntrustOrder.setRemainCoinAmount(addDto.getAmount());
+        otcEntrustOrder.setStatus(OtcEntrustOrder.LINE_UP);
+        otcEntrustOrder.setEntrustOrderNo(commonService.generateOrderNo(member.getId()));
+        otcEntrustOrder.setId(null);
+        this.baseMapper.insert(otcEntrustOrder);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void modify(EntrustOrderAddDto modifyDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcEntrustOrder otcEntrustOrder = OtcEntrustOrderMapper.INSTANCE.entrustOrderDtoToEntity(modifyDto);
+        otcEntrustOrder.setMemberId(member.getId());
+
+        otcEntrustOrder.setRemainCoinAmount(modifyDto.getAmount());
+        otcEntrustOrder.setStatus(OtcEntrustOrder.LINE_UP);
+
+        List<OtcOrder> orders = otcOrderDao.selectOrderListUnFinish(member.getId(), otcEntrustOrder.getId());
+        if (CollUtil.isNotEmpty(orders)) {
+            throw new GlobalException("存在未完成的订单, 无法编辑");
+        }
+
+        OtcEntrustOrder prevEntity = this.baseMapper.selectById(modifyDto.getId());
+        if (prevEntity == null) {
+            throw new GlobalException("参数错误");
+        }
+
+        if (!prevEntity.getOrderType().equals(modifyDto.getType())) {
+            throw new GlobalException("类型错误");
+        }
+
+        if (member.getIsTrader() == 2) {
+            otcEntrustOrder.setIsMb(OtcEntrustOrder.IS_MB_N);
+        } else {
+            otcEntrustOrder.setIsMb(OtcEntrustOrder.IS_MB_Y);
+        }
+
+        BigDecimal totalAmount = modifyDto.getUnitPrice().multiply(modifyDto.getAmount());
+        otcEntrustOrder.setTotalAmount(totalAmount);
+        if (OtcEntrustOrder.ORDER_TYPE_S.equals(modifyDto.getType())) {
+            MemberWalletCoinEntity coinWallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(member.getId(), "USDT");
+            coinWallet.setAvailableBalance(coinWallet.getAvailableBalance().add(coinWallet.getFrozenBalance()));
+            if(coinWallet.getAvailableBalance().compareTo(totalAmount) < 0) {
+                throw new GlobalException("可用金额不足");
+            }
+
+            coinWallet.setAvailableBalance(coinWallet.getAvailableBalance().subtract(totalAmount));
+            coinWallet.setFrozenBalance(totalAmount);
+            memberWalletCoinDao.updateById(coinWallet);
+        }
+
+        this.baseMapper.updateById(otcEntrustOrder);
+    }
+
+    @Override
+    public IPage<EntrustListVo> findEntrustListInPage(EntrustOrderListDto dto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Page<EntrustListVo> page = new Page<>(dto.getPageNum(), dto.getPageSize());
+//        List<OtcBlackList> blackLists = otcBlackListDao.selectBlackListByMemberId(member.getId());
+//        if (CollUtil.isNotEmpty(blackLists)) {
+            dto.setMemberId(member.getId());
+//        }
+        return this.baseMapper.selectEntrustListInPage(dto, page);
+    }
+
+    @Override
+    public List<EntrustListInfoVo> findOwnEntrustOrder(EntrustOrderListDto orderListDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+
+        OtcEntrustOrder query = new OtcEntrustOrder();
+        query.setStatus(3);
+        query.setMemberId(member.getId());
+
+        Page<OtcEntrustOrder> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize());
+        IPage<OtcEntrustOrder> result = this.baseMapper.selectOwnEntrustListInPage(query, page);
+        return OtcEntrustOrderMapper.INSTANCE.entrustToListInfoVoList(result.getRecords());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelEntrustOrder(Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcEntrustOrder otcEntrustOrder = this.baseMapper.selectById(id);
+        if (otcEntrustOrder == null) {
+            throw new GlobalException("参数错误");
+        }
+
+        if (OtcEntrustOrder.LINE_CANCEL.equals(otcEntrustOrder.getStatus())) {
+            throw new GlobalException("请勿重复撤销");
+        }
+
+        List<OtcOrder> orders = otcOrderDao.selectOrderListUnFinish(member.getId(), otcEntrustOrder.getId());
+        if (CollUtil.isNotEmpty(orders)) {
+            throw new GlobalException("存在未完成的订单, 无法撤销");
+        }
+
+        if (OtcEntrustOrder.ORDER_TYPE_S.equals(otcEntrustOrder.getOrderType())) {
+            MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(member.getId(), "USDT");
+            memberWalletCoinDao.subFrozenBalance(member.getId(), wallet.getId(), otcEntrustOrder.getRemainCoinAmount());
+        }
+
+        otcEntrustOrder = new OtcEntrustOrder();
+        otcEntrustOrder.setId(id);
+        otcEntrustOrder.setStatus(OtcEntrustOrder.LINE_CANCEL);
+        this.baseMapper.updateById(otcEntrustOrder);
+    }
+
+    @Override
+    public Result findEntrustOrderDetail(Long id) {
+        OtcEntrustOrder otcEntrustOrder = this.baseMapper.selectById(id);
+        if (otcEntrustOrder == null) {
+            return Result.fail("参数错误");
+        }
+
+        MemberPaymentMethodEntity defualtMethod = memberPaymentMethodDao.selectDefualtMethod(otcEntrustOrder.getMemberId(), null, "1");
+        MemberEntity member = memberDao.selectById(otcEntrustOrder.getMemberId());
+        OtcMarketBussiness mb = otcMarketBussinessDao.selectMarketBussinessByMemberId(member.getId());
+        EntrustOrderDetailVo detail = OtcEntrustOrderMapper.INSTANCE.entityToOrderDetail(otcEntrustOrder);
+        detail.setName(member.getName());
+        if (OtcEntrustOrder.ORDER_TYPE_S.equals(otcEntrustOrder.getOrderType())) {
+            detail.setOrderCnt(mb.getSaleOrderCnt());
+            detail.setFinishRatio(mb.getSaleFinishRatio());
+        } else {
+            detail.setOrderCnt(mb.getBuyOrderCnt());
+            detail.setFinishRatio(mb.getFinishRatio());
+        }
+        detail.setPayType(defualtMethod.getPaymentType());
+        return Result.ok(detail);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMarketBussinessServiceImpl.java b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMarketBussinessServiceImpl.java
new file mode 100644
index 0000000..c973749
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMarketBussinessServiceImpl.java
@@ -0,0 +1,180 @@
+package com.xcong.excoin.modules.otc.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.exception.GlobalException;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.otc.dao.OtcEntrustOrderDao;
+import com.xcong.excoin.modules.otc.dao.OtcMarketBussinessDao;
+import com.xcong.excoin.modules.otc.dao.OtcOrderDao;
+import com.xcong.excoin.modules.otc.dao.OtcSettingDao;
+import com.xcong.excoin.modules.otc.dto.MbAddDto;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.entity.OtcSetting;
+import com.xcong.excoin.modules.otc.mapper.OtcEntrustOrderMapper;
+import com.xcong.excoin.modules.otc.mapper.OtcMarketBussinessMapper;
+import com.xcong.excoin.modules.otc.service.OtcMarketBussinessService;
+import com.xcong.excoin.modules.otc.vo.ApplyConditionsVo;
+import com.xcong.excoin.modules.otc.vo.EntrustListInfoVo;
+import com.xcong.excoin.modules.otc.vo.MarketBussinessInfoVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class OtcMarketBussinessServiceImpl extends ServiceImpl<OtcMarketBussinessDao, OtcMarketBussiness> implements OtcMarketBussinessService {
+
+    private final OtcEntrustOrderDao otcEntrustOrderDao;
+    private final MemberDao memberDao;
+    private final OtcSettingDao otcSettingDao;
+    private final OtcOrderDao otcOrderDao;
+
+    @Override
+    public void add() {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        member = memberDao.selectById(member.getId());
+//        long memberId = 444L;
+//        MemberEntity member = memberDao.selectById(memberId);
+
+        if (MemberEntity.IS_TRADER_Y.equals(member.getIsTrader())) {
+            throw new GlobalException("已经是市商");
+        }
+        OtcSetting setting = otcSettingDao.selectById(1L);
+        // 所有已完成订单
+        List<OtcOrder> finishOrders = otcOrderDao.selectOrderListForUser(member.getId(), 3);
+        if (CollUtil.isEmpty(finishOrders) || setting.getOrderNum() > finishOrders.size()) {
+            throw new GlobalException("条件未达标");
+        }
+
+        List<OtcOrder> allOrders = otcOrderDao.selectOrderListForUser(member.getId(), null);
+        if (CollUtil.isNotEmpty(allOrders)) {
+            BigDecimal finishRatio = BigDecimal.valueOf(finishOrders.size()).divide(BigDecimal.valueOf(allOrders.size()), 4, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(100));
+            if (setting.getCompletionRate().compareTo(finishRatio) > 0) {
+                throw new GlobalException("条件未达标");
+            }
+        }
+
+        BigDecimal totalAmount = otcOrderDao.selectOrderTotalAmount(member.getId());
+        if (setting.getTotalAmount().compareTo(totalAmount) > 0) {
+            throw new GlobalException("条件未达标");
+        }
+
+        OtcMarketBussiness mb = this.baseMapper.selectMarketBussinessByMemberId(member.getId());
+        OtcMarketBussiness otcMb = new OtcMarketBussiness();
+        if (mb != null) {
+            if (OtcMarketBussiness.CHECK_PASS.equals(mb.getStatus()) || OtcMarketBussiness.CHECK_WAIT.equals(mb.getStatus())) {
+                throw new GlobalException("已经是市商或正在审核");
+            }
+
+            otcMb = mb;
+            otcMb.setStatus(OtcMarketBussiness.CHECK_WAIT);
+            this.baseMapper.updateById(otcMb);
+        } else {
+            otcMb.setMemberId(member.getId());
+            otcMb.setAvgCoinTime(0);
+            otcMb.setAvgPayTime(0);
+            otcMb.setTotalOrderCnt(0);
+            otcMb.setBuyCnt(0);
+            otcMb.setFinishRatio(BigDecimal.ZERO);
+            otcMb.setStatus(OtcMarketBussiness.CHECK_WAIT);
+
+            this.baseMapper.insert(otcMb);
+        }
+    }
+
+    @Override
+    public Integer findMbStatus() {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+
+        OtcMarketBussiness mb = this.baseMapper.selectMarketBussinessByMemberId(member.getId());
+        if (mb == null) {
+            return 0;
+        }
+        return mb.getStatus();
+    }
+
+    @Override
+    public Result findMbInfo(Long id) {
+        OtcMarketBussiness mb = this.baseMapper.selectById(id);
+        if (mb == null) {
+            return Result.fail("未找到对应信息");
+        }
+
+        MarketBussinessInfoVo mbVo = OtcMarketBussinessMapper.INSTANCE.entityToVo(mb);
+        mbVo.setTotalOrderCnt(mb.getTotalOrderCnt() + mb.getSaleTotalCnt());
+        mbVo.setFinishRatio(mb.getFinishRatio().add(mb.getSaleFinishRatio()).divide(BigDecimal.valueOf(2), 4, BigDecimal.ROUND_DOWN));
+        MemberEntity member = memberDao.selectById(mb.getMemberId());
+        OtcEntrustOrder query = new OtcEntrustOrder();
+        query.setMemberId(mb.getMemberId());
+        query.setIsDefualt(1);
+        query.setOrderType(OtcEntrustOrder.ORDER_TYPE_B);
+        query.setStatus(OtcEntrustOrder.LINE_UP);
+        List<OtcEntrustOrder> buysEntity = otcEntrustOrderDao.selectEntrustOrderByOrderType(query);
+        List<EntrustListInfoVo> buys = OtcEntrustOrderMapper.INSTANCE.entrustToListInfoVoList(buysEntity);
+
+        query.setOrderType(OtcEntrustOrder.ORDER_TYPE_S);
+        List<OtcEntrustOrder> salesEntity = otcEntrustOrderDao.selectEntrustOrderByOrderType(query);
+        List<EntrustListInfoVo> sales = OtcEntrustOrderMapper.INSTANCE.entrustToListInfoVoList(salesEntity);
+        mbVo.setBuys(buys);
+        mbVo.setSales(sales);
+        mbVo.setNikename(member.getName());
+        return Result.ok(mbVo);
+    }
+
+    @Override
+    public Result applyConditions() {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        member = memberDao.selectById(member.getId());
+//        long memberId = 444L;
+//        MemberEntity member = memberDao.selectById(memberId);
+        ApplyConditionsVo applyConditionsVo = new ApplyConditionsVo();
+
+        OtcSetting setting = otcSettingDao.selectById(1L);
+        applyConditionsVo.setOrderNum(setting.getOrderNum());
+        applyConditionsVo.setTotalAmount(setting.getTotalAmount());
+        applyConditionsVo.setCompletionRate(setting.getCompletionRate());
+        applyConditionsVo.setCancellNum(setting.getCancellNum());
+        // 所有已完成订单
+        List<OtcOrder> finishOrders = otcOrderDao.selectOrderListForUser(member.getId(), 3);
+        if (CollUtil.isEmpty(finishOrders) || setting.getOrderNum() > finishOrders.size()) {
+            applyConditionsVo.setOrderNumStatus(2);
+        }else{
+            applyConditionsVo.setOrderNumStatus(1);
+        }
+
+        List<OtcOrder> allOrders = otcOrderDao.selectOrderListForUser(member.getId(), null);
+        if (CollUtil.isNotEmpty(allOrders)) {
+            BigDecimal finishRatio = BigDecimal.valueOf(finishOrders.size()).divide(BigDecimal.valueOf(allOrders.size()), 4, BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(100));
+            if (setting.getCompletionRate().compareTo(finishRatio) > 0) {
+                applyConditionsVo.setCompletionRateStatus(2);
+            }else{
+                applyConditionsVo.setCompletionRateStatus(1);
+            }
+        }
+
+        BigDecimal totalAmount = otcOrderDao.selectOrderTotalAmount(member.getId());
+        totalAmount = totalAmount == null ? BigDecimal.ZERO : totalAmount;
+        if (setting.getTotalAmount().compareTo(totalAmount) > 0) {
+            applyConditionsVo.setTotalAmountStatus(2);
+        }else{
+            applyConditionsVo.setTotalAmountStatus(1);
+        }
+
+        Integer certifyStatus = member.getCertifyStatus();
+        if(MemberEntity.CERTIFY_STATUS_Y == certifyStatus){
+            applyConditionsVo.setMemberAuthStatus(1);
+        }else{
+            applyConditionsVo.setMemberAuthStatus(2);
+        }
+
+        return Result.ok(applyConditionsVo);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMsgServiceImpl.java b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMsgServiceImpl.java
new file mode 100644
index 0000000..67a62fa
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcMsgServiceImpl.java
@@ -0,0 +1,252 @@
+package com.xcong.excoin.modules.otc.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.dao.MemberSettingDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberSettingEntity;
+import com.xcong.excoin.modules.otc.dao.OtcMsgHistoryDao;
+import com.xcong.excoin.modules.otc.dao.OtcMsgUserListDao;
+import com.xcong.excoin.modules.otc.dao.OtcOrderDao;
+import com.xcong.excoin.modules.otc.dto.*;
+import com.xcong.excoin.modules.otc.entity.OtcMsgHistoryEntity;
+import com.xcong.excoin.modules.otc.entity.OtcMsgUserListEntity;
+import com.xcong.excoin.modules.otc.service.OtcMsgService;
+import com.xcong.excoin.modules.otc.vo.ChatBoxVo;
+import com.xcong.excoin.modules.otc.vo.ChatOrderVo;
+import com.xcong.excoin.modules.otc.vo.MsgListVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class OtcMsgServiceImpl extends ServiceImpl<OtcMsgUserListDao, OtcMsgUserListEntity> implements OtcMsgService {
+
+    private final OtcMsgUserListDao otcMsgUserListDao;
+    private final OtcMsgHistoryDao otcMsgHistoryDao;
+    private final OtcOrderDao otcOrderDao;
+
+    private final MemberSettingDao memberSettingDao;
+    private final MemberDao memberDao;
+
+
+    @Override
+    public IPage<MsgListVo> getMsgList(MsgListDto msgListDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Long memberId = member.getId();
+//        Long memberId = 444L;
+//        MemberEntity member = memberDao.selectById(memberId);
+
+        Page<MsgListVo> page = new Page<>(msgListDto.getPageNum(), msgListDto.getPageSize());
+
+        OtcMsgUserListEntity otcMsgUserListEntity = new OtcMsgUserListEntity();
+        otcMsgUserListEntity.setMemberId(memberId);
+        otcMsgUserListEntity.setNickname(msgListDto.getNickname());
+        IPage<MsgListVo> msgList = otcMsgUserListDao.getMsgList(otcMsgUserListEntity, page);
+        List<MsgListVo> records = msgList.getRecords();
+        //更新最外层的消息提醒
+        boolean flag = true;
+        if(CollUtil.isNotEmpty(records)){
+            for(MsgListVo msgListVo : records){
+                long targetId = msgListVo.getTargetId();
+//                MemberEntity memberEntity = memberDao.selectById(targetId);
+//                msgListVo.setNickname(memberEntity.getName());
+
+                ChatOrderVo chatOrderVo = new ChatOrderVo();
+                List<ChatOrderVo> chatOrderVos = otcOrderDao.selectOneByMemberIdAndTargetId(memberId,targetId);
+                if(CollUtil.isNotEmpty(chatOrderVos)){
+                    for(ChatOrderVo chatOrderVodone : chatOrderVos){
+                        Long memberIdDone = chatOrderVodone.getMemberId();
+                        if(memberId.equals(memberIdDone) || memberId == memberIdDone){
+                            chatOrderVo = chatOrderVodone;
+                        }
+                    }
+                }
+                msgListVo.setChatOrderVo(chatOrderVo);
+
+                Integer isRead = msgListVo.getIsRead();
+                if(OtcMsgUserListEntity.ISREAD_ONE == isRead){
+                    flag = false;
+                }
+            }
+            if(flag){
+                MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(member.getId());
+                memberSettingEntity.setMessageReminder(0);
+                memberSettingDao.updateById(memberSettingEntity);
+            }
+        }
+        return msgList;
+    }
+
+    @Override
+    @Transactional
+    public Result getChatBox(ChatBoxDto chatBoxDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+//        MemberEntity member = memberDao.selectById(443L);
+        //对话是否存在
+        long id = chatBoxDto.getId();
+        if(ObjectUtil.isEmpty(id)){
+            return Result.fail("请下拉刷新");
+        }
+        OtcMsgUserListEntity otcMsgUserListEntity = otcMsgUserListDao.selectById(id);
+        if(ObjectUtil.isEmpty(otcMsgUserListEntity)){
+            return Result.fail("请下拉刷新");
+        }
+        //更新为已读
+        otcMsgUserListEntity.setIsRead(OtcMsgUserListEntity.ISREAD_TWO);
+        otcMsgUserListDao.updateById(otcMsgUserListEntity);
+
+        long memberId = otcMsgUserListEntity.getMemberId();
+        long targetId = otcMsgUserListEntity.getTargetId();
+        Page<ChatBoxVo> page = new Page<>(chatBoxDto.getPageNum(), chatBoxDto.getPageSize());
+        OtcMsgHistoryEntity otcMsgHistoryEntity = new OtcMsgHistoryEntity();
+        otcMsgHistoryEntity.setMemberId(memberId);
+        otcMsgHistoryEntity.setTargetId(targetId);
+        IPage<ChatBoxVo> chatBoxVos= otcMsgHistoryDao.getChatBoxMsgList(page,otcMsgHistoryEntity);
+        return Result.ok(chatBoxVos);
+    }
+
+    @Override
+    @Transactional
+    public Result sendMsg(SendMsgDto sendMsgDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Long memberId = member.getId();
+//        Long memberId = 449L;
+        long targetId = sendMsgDto.getTargetId();
+        if(ObjectUtil.isEmpty(targetId)){
+            return Result.fail("对话用户不存在");
+        }
+        MemberEntity memberEntity = memberDao.selectById(targetId);
+        if(ObjectUtil.isEmpty(memberEntity)){
+            return Result.fail("对话用户不存在");
+        }
+        String msg = sendMsgDto.getMsg();
+        if(StrUtil.isEmpty(msg)){
+            return Result.fail("请输入发送消息");
+        }
+        Integer msgType = sendMsgDto.getMsgType();
+        if(ObjectUtil.isEmpty(msgType)){
+            return Result.fail("请输入发送消息");
+        }
+        //发送方
+        List<OtcMsgUserListEntity> otcMsgUserListEntityFrom = otcMsgUserListDao.selectListByMemberIdAndTargetId(memberId,targetId);
+        if(CollUtil.isEmpty(otcMsgUserListEntityFrom)){
+            OtcMsgUserListEntity otcMsgUserListEntity = new OtcMsgUserListEntity();
+            otcMsgUserListEntity.setMemberId(memberId);
+            otcMsgUserListEntity.setTargetId(targetId);
+            otcMsgUserListEntity.setIsRead(OtcMsgUserListEntity.ISREAD_TWO);
+            otcMsgUserListEntity.setLastMsgTime(DateUtil.date());
+            otcMsgUserListDao.insert(otcMsgUserListEntity);
+        }else{
+            OtcMsgUserListEntity otcMsgUserListEntity = otcMsgUserListEntityFrom.get(0);
+            otcMsgUserListEntity.setMemberId(memberId);
+            otcMsgUserListEntity.setTargetId(targetId);
+            otcMsgUserListEntity.setIsRead(OtcMsgUserListEntity.ISREAD_TWO);
+            otcMsgUserListEntity.setLastMsgTime(DateUtil.date());
+            otcMsgUserListDao.updateById(otcMsgUserListEntity);
+        }
+        //历史消息中增加新纪录
+        OtcMsgHistoryEntity otcMsgHistoryEntityFrom = new OtcMsgHistoryEntity();
+        otcMsgHistoryEntityFrom.setMemberId(memberId);
+        otcMsgHistoryEntityFrom.setFromMemberId(memberId);
+        otcMsgHistoryEntityFrom.setTargetId(targetId);
+        otcMsgHistoryEntityFrom.setMsg(msg);
+        otcMsgHistoryEntityFrom.setMsgType(msgType);
+        otcMsgHistoryEntityFrom.setIsSelf(OtcMsgHistoryEntity.ISSELF_ONE);
+        otcMsgHistoryDao.insert(otcMsgHistoryEntityFrom);
+        //接受方
+        List<OtcMsgUserListEntity> otcMsgUserListEntityTo = otcMsgUserListDao.selectListByMemberIdAndTargetId(targetId,memberId);
+        if(CollUtil.isEmpty(otcMsgUserListEntityTo)){
+            OtcMsgUserListEntity otcMsgUserListEntity = new OtcMsgUserListEntity();
+            otcMsgUserListEntity.setMemberId(targetId);
+            otcMsgUserListEntity.setTargetId(memberId);
+            otcMsgUserListEntity.setIsRead(OtcMsgUserListEntity.ISREAD_ONE);
+            otcMsgUserListEntity.setLastMsgTime(DateUtil.date());
+            otcMsgUserListDao.insert(otcMsgUserListEntity);
+        }else{
+            OtcMsgUserListEntity otcMsgUserListEntity = otcMsgUserListEntityTo.get(0);
+            otcMsgUserListEntity.setMemberId(targetId);
+            otcMsgUserListEntity.setTargetId(memberId);
+            otcMsgUserListEntity.setIsRead(OtcMsgUserListEntity.ISREAD_ONE);
+            otcMsgUserListEntity.setLastMsgTime(DateUtil.date());
+            otcMsgUserListDao.updateById(otcMsgUserListEntity);
+        }
+        //历史消息中增加新纪录
+        OtcMsgHistoryEntity otcMsgHistoryEntityTo = new OtcMsgHistoryEntity();
+        otcMsgHistoryEntityTo.setMemberId(targetId);
+        otcMsgHistoryEntityTo.setFromMemberId(memberId);
+        otcMsgHistoryEntityTo.setTargetId(targetId);
+        otcMsgHistoryEntityTo.setMsg(msg);
+        otcMsgHistoryEntityTo.setMsgType(msgType);
+        otcMsgHistoryEntityTo.setIsSelf(OtcMsgHistoryEntity.ISSELF_TWO);
+        otcMsgHistoryDao.insert(otcMsgHistoryEntityTo);
+
+        //增加一个提醒的
+        MemberSettingEntity memberSettingEntity = memberSettingDao.selectMemberSettingByMemberId(targetId);
+        memberSettingEntity.setMessageReminder(1);
+        memberSettingDao.updateById(memberSettingEntity);
+        return Result.ok("发送成功");
+    }
+
+    @Override
+    public Result getChatBoxConnect(ConnectDto connectDto) {
+
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Long memberId = member.getId();
+//        Long memberId = 443L;
+        long targetId = connectDto.getTargetId();
+        if(ObjectUtil.isEmpty(targetId)){
+            return Result.fail("请返回重试");
+        }
+        IPage<ChatBoxVo> chatBoxVos= new Page<>();
+        List<OtcMsgUserListEntity> otcMsgUserListEntitys = otcMsgUserListDao.selectListByMemberIdAndTargetId(memberId,targetId);
+        if(CollUtil.isNotEmpty(otcMsgUserListEntitys)){
+            Page<ChatBoxVo> page = new Page<>(connectDto.getPageNum(), connectDto.getPageSize());
+            OtcMsgHistoryEntity otcMsgHistoryEntity = new OtcMsgHistoryEntity();
+            otcMsgHistoryEntity.setMemberId(memberId);
+            otcMsgHistoryEntity.setTargetId(targetId);
+            chatBoxVos = otcMsgHistoryDao.getChatBoxMsgList(page,otcMsgHistoryEntity);
+        }
+        return Result.ok(chatBoxVos);
+    }
+
+    @Override
+    public Result getChatOrder(ChatOrderDto chatOrderDto) {
+
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Long memberId = member.getId();
+//        Long memberId = 443L;
+
+        long targetId = chatOrderDto.getTargetId();
+        if(ObjectUtil.isEmpty(targetId)){
+            return Result.fail("请返回重试");
+        }
+        ArrayList<ChatOrderVo> chatOrderVoList = new ArrayList<>();
+        List<ChatOrderVo> chatOrderVos = otcOrderDao.selectByMemberIdAndTargetId(memberId,targetId);
+        if(CollUtil.isNotEmpty(chatOrderVos)){
+            for(ChatOrderVo chatOrderVo : chatOrderVos){
+                Long memberIdDone = chatOrderVo.getMemberId();
+                if(memberId.equals(memberIdDone) || memberId == memberIdDone){
+                    chatOrderVoList.add(chatOrderVo);
+                }
+            }
+        }
+        return Result.ok(chatOrderVoList);
+    }
+
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderAppealServiceImpl.java b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderAppealServiceImpl.java
new file mode 100644
index 0000000..539ae48
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderAppealServiceImpl.java
@@ -0,0 +1,13 @@
+package com.xcong.excoin.modules.otc.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.excoin.modules.otc.entity.OtcOrderAppeal;
+import com.xcong.excoin.modules.otc.dao.OtcOrderAppealDao;
+import com.xcong.excoin.modules.otc.service.OtcOrderAppealService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class OtcOrderAppealServiceImpl extends ServiceImpl<OtcOrderAppealDao, OtcOrderAppeal> implements OtcOrderAppealService {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderServiceImpl.java
new file mode 100644
index 0000000..19e31ec
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcOrderServiceImpl.java
@@ -0,0 +1,507 @@
+package com.xcong.excoin.modules.otc.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xcong.excoin.common.LoginUserUtils;
+import com.xcong.excoin.common.contants.AppContants;
+import com.xcong.excoin.common.exception.GlobalException;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.common.system.service.CommonService;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.dao.MemberPaymentMethodDao;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberPaymentMethodEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.otc.dao.*;
+import com.xcong.excoin.modules.otc.dto.HasPayDto;
+import com.xcong.excoin.modules.otc.dto.OrderApealDto;
+import com.xcong.excoin.modules.otc.dto.OrderListDto;
+import com.xcong.excoin.modules.otc.dto.OtcOrderAddDto;
+import com.xcong.excoin.modules.otc.entity.*;
+import com.xcong.excoin.modules.otc.service.OtcOrderService;
+import com.xcong.excoin.modules.otc.vo.BuyOrderDetailVo;
+import com.xcong.excoin.modules.otc.vo.OrderListVo;
+import com.xcong.excoin.modules.otc.vo.SaleOrderDetailVo;
+import com.xcong.excoin.rabbit.producer.OtcProducter;
+import com.xcong.excoin.utils.RedisUtils;
+import com.xcong.excoin.utils.ThreadPoolUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class OtcOrderServiceImpl extends ServiceImpl<OtcOrderDao, OtcOrder> implements OtcOrderService {
+    private final OtcMarketBussinessDao otcMarketBussinessDao;
+    private final OtcEntrustOrderDao otcEntrustOrderDao;
+    private final OtcOrderAppealDao otcOrderAppealDao;
+    private final CommonService commonService;
+    private final MemberWalletCoinDao memberWalletCoinDao;
+    private final MemberDao memberDao;
+    private final MemberPaymentMethodDao memberPaymentMethodDao;
+    private final OtcBlackListDao otcBlackListDao;
+    private final OtcSettingDao otcSettingDao;
+    private final RedisUtils redisUtils;
+    private final OtcProducter otcProducter;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result buyOrder(OtcOrderAddDto orderAddDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+
+//        MemberEntity member = memberDao.selectById(445L);
+        OtcEntrustOrder entrustOrder = otcEntrustOrderDao.selectById(orderAddDto.getId());
+        if (entrustOrder == null) {
+            throw new GlobalException("委托单不存在");
+        }
+
+        if (member.getId().equals(entrustOrder.getMemberId())) {
+            throw new GlobalException("不能购买自己的委托单");
+        }
+
+        if (!OtcEntrustOrder.ORDER_TYPE_S.equals(entrustOrder.getOrderType())) {
+            throw new GlobalException("无法购买");
+        }
+
+        OtcSetting setting = otcSettingDao.selectById(1L);
+        String times = redisUtils.getString(AppContants.OTC_ORDER_CANCEL_TIMES + member.getId());
+        times = times == null ? "0" :times;
+        if (setting.getCancellNum() <= Integer.parseInt(times)) {
+            throw new GlobalException("订单取消次数过多, 限制交易24小时");
+        }
+
+        if (orderAddDto.getCnyAmount().compareTo(entrustOrder.getLimitMinAmount()) < 0) {
+            throw new GlobalException("低于最低限额");
+        }
+
+        if (orderAddDto.getCnyAmount().compareTo(entrustOrder.getLimitMaxAmount()) > 0) {
+            throw new GlobalException("高于最高限额");
+        }
+
+        if (orderAddDto.getUsdtAmount().compareTo(entrustOrder.getRemainCoinAmount()) > 0) {
+            throw new GlobalException("剩余数量不足");
+        }
+
+        BigDecimal cny = orderAddDto.getUsdtAmount().multiply(entrustOrder.getUnitPrice()).setScale(2, BigDecimal.ROUND_DOWN);
+        BigDecimal usdt = orderAddDto.getCnyAmount().divide(entrustOrder.getUnitPrice(), 2, BigDecimal.ROUND_DOWN);
+        if (cny.compareTo(orderAddDto.getCnyAmount()) != 0 && usdt.compareTo(orderAddDto.getUsdtAmount()) != 0) {
+            log.info("BUY = CNY:{}, CNY_{}, USDT:{}, USDT_{}", cny, orderAddDto.getCnyAmount(), usdt, orderAddDto.getUsdtAmount());
+            throw new GlobalException("数量与金额不符");
+        }
+        /**
+         * 最多三单未付款
+         */
+        QueryWrapper<OtcOrder> objectQueryWrapper = new QueryWrapper<>();
+        objectQueryWrapper.eq("member_id",member.getId());
+        objectQueryWrapper.lt("status",OtcOrder.STATUS_PAY);
+        List<OtcOrder> otcOrders = this.baseMapper.selectList(objectQueryWrapper);
+        if(CollUtil.isNotEmpty(otcOrders)){
+            if(otcOrders.size() >= 3){
+                throw new GlobalException("最多可同时有三个待付款订单");
+            }
+        }
+
+        OtcOrder otcOrder = new OtcOrder();
+        otcOrder.setOrderNo(commonService.generateOrderNo(member.getId()));
+        otcOrder.setUnitPrice(entrustOrder.getUnitPrice());
+        otcOrder.setEntrustOrderId(entrustOrder.getId());
+        otcOrder.setCoinAmount(orderAddDto.getUsdtAmount());
+        otcOrder.setTotalAmount(orderAddDto.getCnyAmount());
+        otcOrder.setMemberId(member.getId());
+        otcOrder.setOppositeMemberId(entrustOrder.getMemberId());
+        otcOrder.setStatus(OtcOrder.STATUS_SUBMIT);
+        otcOrder.setPayTime(new Date());
+        otcOrder.setEntrustMemberId(entrustOrder.getMemberId());
+        otcOrder.setOrderType(OtcEntrustOrder.ORDER_TYPE_B);
+
+        MemberPaymentMethodEntity defualtMethod = memberPaymentMethodDao.selectDefualtMethod(entrustOrder.getMemberId(), null, "1");
+        if (defualtMethod == null) {
+            throw new GlobalException("对方未设置默认支付方式");
+        }
+        if (MemberPaymentMethodEntity.PAYMENTTYPE_CARD.toString().equals(defualtMethod.getPaymentType())) {
+            otcOrder.setBankName(defualtMethod.getBank());
+        } else {
+            otcOrder.setBankName(defualtMethod.getPaymentQrcode());
+        }
+
+        otcOrder.setBankNo(defualtMethod.getAccount());
+        otcOrder.setCardName(defualtMethod.getName());
+        otcOrder.setPayType(defualtMethod.getPaymentType());
+
+        OtcOrder sale = new OtcOrder();
+        BeanUtil.copyProperties(otcOrder, sale);
+        sale.setMemberId(entrustOrder.getMemberId());
+        sale.setOppositeMemberId(member.getId());
+        sale.setOrderType(OtcEntrustOrder.ORDER_TYPE_S);
+        otcEntrustOrderDao.updateRemainAmount(entrustOrder.getId(), orderAddDto.getUsdtAmount().negate());
+        this.baseMapper.insert(otcOrder);
+        this.baseMapper.insert(sale);
+
+        ThreadPoolUtils.sendOrderMsg();
+        return Result.ok("购买成功", otcOrder.getId());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result saleOrder(OtcOrderAddDto orderAddDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcEntrustOrder entrustOrder = otcEntrustOrderDao.selectById(orderAddDto.getId());
+        if (entrustOrder == null) {
+            throw new GlobalException("委托单不存在");
+        }
+
+        if (member.getId().equals(entrustOrder.getMemberId())) {
+            throw new GlobalException("不能购买自己的委托单");
+        }
+
+        if (!OtcEntrustOrder.ORDER_TYPE_B.equals(entrustOrder.getOrderType())) {
+            throw new GlobalException("无法出售");
+        }
+
+        OtcSetting setting = otcSettingDao.selectById(1L);
+        String times = redisUtils.getString(AppContants.OTC_ORDER_CANCEL_TIMES + member.getId());
+        times = times == null ? "0" :times;
+        if (setting.getCancellNum() <= Integer.parseInt(times)) {
+            throw new GlobalException("订单取消次数过多, 限制交易24小时");
+        }
+
+        if (orderAddDto.getCnyAmount().compareTo(entrustOrder.getLimitMinAmount()) < 0) {
+            throw new GlobalException("低于最低限额");
+        }
+
+        if (orderAddDto.getCnyAmount().compareTo(entrustOrder.getLimitMaxAmount()) > 0) {
+            throw new GlobalException("高于最高限额");
+        }
+
+        if (orderAddDto.getUsdtAmount().compareTo(entrustOrder.getRemainCoinAmount()) > 0) {
+            throw new GlobalException("剩余数量不足");
+        }
+
+        if (StrUtil.isBlank(orderAddDto.getPassword())) {
+            throw new GlobalException("资金密码不能为空");
+        }
+
+        MemberEntity memberEntity = memberDao.selectById(member.getId());
+        if (!SecureUtil.md5(orderAddDto.getPassword()).equals(memberEntity.getTradePassword())) {
+            throw new GlobalException("资金密码错误");
+        }
+
+        BigDecimal cny = orderAddDto.getUsdtAmount().multiply(entrustOrder.getUnitPrice()).setScale(2, BigDecimal.ROUND_DOWN);
+        BigDecimal usdt = orderAddDto.getCnyAmount().divide(entrustOrder.getUnitPrice(), 2, BigDecimal.ROUND_DOWN);
+        if (cny.compareTo(orderAddDto.getCnyAmount()) != 0 && usdt.compareTo(orderAddDto.getUsdtAmount()) != 0) {
+            log.info("SALE = CNY:{}, CNY_{}, USDT:{}, USDT_{}", cny, orderAddDto.getCnyAmount(), usdt, orderAddDto.getUsdtAmount());
+            throw new GlobalException("数量与金额不符");
+        }
+
+        MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(member.getId(), "USDT");
+        if (wallet.getAvailableBalance().compareTo(orderAddDto.getUsdtAmount()) < 0) {
+            throw new GlobalException("钱包余额不足");
+        }
+
+        OtcOrder otcOrder = new OtcOrder();
+        otcOrder.setOrderNo(commonService.generateOrderNo(member.getId()));
+        otcOrder.setUnitPrice(entrustOrder.getUnitPrice());
+        otcOrder.setEntrustOrderId(entrustOrder.getId());
+        otcOrder.setCoinAmount(orderAddDto.getUsdtAmount());
+        otcOrder.setTotalAmount(orderAddDto.getCnyAmount());
+        otcOrder.setMemberId(member.getId());
+        otcOrder.setStatus(OtcOrder.STATUS_SUBMIT);
+        otcOrder.setPayTime(new Date());
+        otcOrder.setEntrustMemberId(entrustOrder.getMemberId());
+        otcOrder.setOppositeMemberId(entrustOrder.getMemberId());
+        otcOrder.setOrderType(OtcEntrustOrder.ORDER_TYPE_S);
+
+        OtcOrder buy = new OtcOrder();
+        BeanUtil.copyProperties(otcOrder, buy);
+        buy.setMemberId(entrustOrder.getMemberId());
+        buy.setOppositeMemberId(member.getId());
+        buy.setOrderType(OtcEntrustOrder.ORDER_TYPE_B);
+
+        MemberPaymentMethodEntity defualtMethod = memberPaymentMethodDao.selectDefualtMethod(member.getId(), null, "1");
+        if (defualtMethod == null) {
+            throw new GlobalException("未设置默认支付方式");
+        }
+
+        if (MemberPaymentMethodEntity.PAYMENTTYPE_CARD.toString().equals(defualtMethod.getPaymentType())) {
+            buy.setBankName(defualtMethod.getBank());
+        } else {
+            buy.setBankName(defualtMethod.getPaymentQrcode());
+        }
+        buy.setBankNo(defualtMethod.getAccount());
+        buy.setCardName(defualtMethod.getName());
+        buy.setPayType(defualtMethod.getPaymentType());
+
+        otcEntrustOrderDao.updateRemainAmount(entrustOrder.getId(), orderAddDto.getUsdtAmount().negate());
+        this.baseMapper.insert(otcOrder);
+        this.baseMapper.insert(buy);
+
+        memberWalletCoinDao.updateFrozenBalance(member.getId(), wallet.getId(), orderAddDto.getUsdtAmount());
+
+        ThreadPoolUtils.sendOrderMsg();
+        return Result.ok("出售成功", otcOrder.getId());
+    }
+
+    @Override
+    public IPage<OrderListVo> findOrderListInPage(OrderListDto orderListDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Page<OrderListVo> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize());
+
+        OtcOrder order = new OtcOrder();
+        order.setStatus(orderListDto.getStatus());
+        order.setMemberId(member.getId());
+        return this.baseMapper.selectOrdderListInPage(order, page);
+    }
+
+    @Override
+    public void hasPay(HasPayDto hasPayDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcOrder otcOrder = this.baseMapper.selectById(hasPayDto.getId());
+
+        if (otcOrder == null) {
+            throw new GlobalException("订单不存在");
+        }
+
+        if (!OtcOrder.STATUS_SUBMIT.equals(otcOrder.getStatus())) {
+            throw new GlobalException("状态不正确");
+        }
+
+        if (!OtcEntrustOrder.ORDER_TYPE_B.equals(otcOrder.getOrderType())) {
+            throw new GlobalException("不是购买单");
+        }
+
+        if (StrUtil.isBlank(hasPayDto.getName())) {
+            MemberPaymentMethodEntity defualtMethod = memberPaymentMethodDao.selectDefualtMethod(member.getId(), null, "1");
+            hasPayDto.setName(defualtMethod.getName());
+        }
+
+        this.baseMapper.updateOrderStatusByOrderNo(OtcOrder.STATUS_PAY, hasPayDto.getName(), otcOrder.getOrderNo());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void finishOrder(Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcOrder otcOrder = this.baseMapper.selectById(id);
+
+        if (otcOrder == null) {
+            throw new GlobalException("订单不存在");
+        }
+
+        if (!OtcOrder.STATUS_PAY.equals(otcOrder.getStatus())) {
+            throw new GlobalException("状态不正确");
+        }
+
+        if (!OtcEntrustOrder.ORDER_TYPE_S.equals(otcOrder.getOrderType())) {
+            throw new GlobalException("不是出售单");
+        }
+
+        OtcOrder buyOrder = this.baseMapper.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_B);
+        OtcOrder saleOrder = this.baseMapper.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_S);
+        MemberWalletCoinEntity buyWallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(buyOrder.getMemberId(), "USDT");
+        MemberWalletCoinEntity saleWallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(saleOrder.getMemberId(), "USDT");
+
+        // 购买者钱包可用新增币
+        memberWalletCoinDao.updateBlockBalance(buyWallet.getId(), buyOrder.getCoinAmount(), BigDecimal.ZERO, 0);
+
+        // 出售者钱包冻结减少币
+        memberWalletCoinDao.reduceFrozenBalance(saleWallet.getId(), buyOrder.getCoinAmount());
+
+        this.baseMapper.updateOrderStatusByOrderNo(OtcOrder.STATUS_FINISH, null, otcOrder.getOrderNo());
+        otcProducter.sendMarketBussinessMsg(otcOrder.getEntrustOrderId(), OtcOrder.STATUS_FINISH);
+//        otcProducter.sendOrderReturn(buyOrder.getOrderNo());
+    }
+
+    @Override
+    public Result findBuyOrderDetail(Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        member = memberDao.selectById(member.getId());
+        OtcOrder otcOrder = this.baseMapper.selectById(id);
+        if (otcOrder == null) {
+            return Result.fail("订单不存在");
+        }
+
+        OtcOrder buyOrder = this.baseMapper.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_B);
+        if (buyOrder == null) {
+            return Result.fail("参数错误");
+        }
+
+        BuyOrderDetailVo buyDetail = new BuyOrderDetailVo();
+        buyDetail.setOrderNo(buyOrder.getOrderNo());
+        buyDetail.setUsdtAmount(buyOrder.getCoinAmount());
+        buyDetail.setStatus(buyOrder.getStatus());
+        buyDetail.setTotalAmount(buyOrder.getTotalAmount());
+        buyDetail.setUnitPrice(buyOrder.getUnitPrice());
+        buyDetail.setCreateTime(buyOrder.getCreateTime());
+        buyDetail.setIsMb(member.getAccountType() == 1 ? 2 : 1);
+        buyDetail.setPayName(buyOrder.getPayName());
+        buyDetail.setIsOwnEntrust(member.getId().equals(buyOrder.getEntrustMemberId()) ? 1 : 2);
+
+        OtcOrder saleOrder = this.baseMapper.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_S);
+        MemberEntity saleMember = memberDao.selectById(saleOrder.getMemberId());
+
+        OtcBlackList otcBlackList = otcBlackListDao.selectByMemberIdAndBlackMemberId(member.getId(), buyOrder.getEntrustMemberId());
+        if (otcBlackList != null) {
+            buyDetail.setIsBlack(1);
+        } else {
+            buyDetail.setIsBlack(2);
+        }
+
+        buyDetail.setSaleName(saleMember.getName());
+
+        buyDetail.setSaleMemberId(saleMember.getId());
+        buyDetail.setMemberId(member.getId());
+
+        buyDetail.setBankName(buyOrder.getBankName());
+        buyDetail.setBankNo(buyOrder.getBankNo());
+        buyDetail.setCardName(buyOrder.getCardName());
+        buyDetail.setPayType(buyOrder.getPayType());
+        buyDetail.setPayTime(buyOrder.getPayTime());
+
+        if (!buyOrder.getMemberId().equals(buyOrder.getEntrustMemberId())) {
+            OtcMarketBussiness otcMb = otcMarketBussinessDao.selectMarketBussinessByMemberId(buyOrder.getEntrustMemberId());
+            buyDetail.setMbId(otcMb.getId());
+            buyDetail.setFinishRatio(otcMb.getFinishRatio());
+            buyDetail.setOrderCnt(otcMb.getBuyCnt());
+        }
+
+        if (OtcOrder.STATUS_SUBMIT.equals(buyOrder.getStatus())) {
+            long between = DateUtil.between(new Date(), DateUtil.offsetMinute(buyOrder.getCreateTime(), 30), DateUnit.SECOND, false);
+            buyDetail.setTimes(between);
+        }
+
+        return Result.ok(buyDetail);
+    }
+
+    @Override
+    public Result findSaleOrderDetail(Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcOrder otcOrder = this.baseMapper.selectById(id);
+        if (otcOrder == null) {
+            return Result.fail("订单不存在");
+        }
+
+        OtcOrder saleOrder = this.baseMapper.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_S);
+        if (saleOrder == null) {
+            return Result.fail("参数错误");
+        }
+        MemberEntity buyMember = memberDao.selectById(saleOrder.getOppositeMemberId());
+
+        SaleOrderDetailVo saleDetail = new SaleOrderDetailVo();
+        saleDetail.setOrderNo(saleOrder.getOrderNo());
+        saleDetail.setUsdtAmount(saleOrder.getCoinAmount());
+        saleDetail.setStatus(saleOrder.getStatus());
+        saleDetail.setTotalAmount(saleOrder.getTotalAmount());
+        saleDetail.setUnitPrice(saleOrder.getUnitPrice());
+        saleDetail.setCreateTime(saleOrder.getCreateTime());
+        saleDetail.setIsMb(member.getAccountType() == 1 ? 2 : 1);
+        saleDetail.setPayName(saleOrder.getPayName());
+
+        saleDetail.setSaleName(buyMember.getName());
+        saleDetail.setSaleMemberId(buyMember.getId());
+        saleDetail.setMemberId(member.getId());
+
+        saleDetail.setPayType(saleOrder.getPayType());
+        saleDetail.setIsOwnEntrust(member.getId().equals(saleOrder.getEntrustMemberId()) ? 1 : 2);
+
+        OtcBlackList otcBlackList = otcBlackListDao.selectByMemberIdAndBlackMemberId(member.getId(), saleOrder.getEntrustMemberId());
+        if (otcBlackList != null) {
+            saleDetail.setIsBlack(1);
+        } else {
+            saleDetail.setIsBlack(2);
+        }
+        if (!saleOrder.getMemberId().equals(saleOrder.getEntrustMemberId())) {
+            OtcMarketBussiness otcMb = otcMarketBussinessDao.selectMarketBussinessByMemberId(saleOrder.getEntrustMemberId());
+            saleDetail.setMbId(otcMb.getId());
+            saleDetail.setFinishRatio(otcMb.getFinishRatio());
+            saleDetail.setOrderCnt(otcMb.getBuyCnt());
+        }
+
+        if (OtcOrder.STATUS_SUBMIT.equals(saleOrder.getStatus())) {
+            long between = DateUtil.between(new Date(), DateUtil.offsetMinute(saleOrder.getCreateTime(), 30), DateUnit.SECOND, false);
+            saleDetail.setTimes(between);
+        }
+
+        return Result.ok(saleDetail);
+    }
+
+    @Override
+    public void cancelOrder(Long id) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        OtcOrder otcOrder = this.baseMapper.selectById(id);
+        if (otcOrder == null) {
+            throw new GlobalException("订单不存在");
+        }
+
+        if (!OtcOrder.STATUS_SUBMIT.equals(otcOrder.getStatus())) {
+            throw new GlobalException("不能取消");
+        }
+
+        OtcOrder saleOrder = this.baseMapper.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_S);
+        if (!saleOrder.getMemberId().equals(saleOrder.getEntrustMemberId())) {
+            MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(saleOrder.getMemberId(), "USDT");
+            memberWalletCoinDao.subFrozenBalance(saleOrder.getMemberId(), wallet.getId(), saleOrder.getCoinAmount());
+        }
+
+        OtcSetting setting = otcSettingDao.selectById(1L);
+        String times = redisUtils.getString(AppContants.OTC_ORDER_CANCEL_TIMES + member.getId());
+        if (StrUtil.isNotBlank(times)) {
+            int i = Integer.parseInt(times);
+            i++;
+            if (i >= setting.getCancellNum()) {
+                redisUtils.set(AppContants.OTC_ORDER_CANCEL_TIMES + member.getId(), i, 86400);
+            } else {
+                redisUtils.set(AppContants.OTC_ORDER_CANCEL_TIMES + member.getId(), i);
+            }
+        } else {
+            redisUtils.set(AppContants.OTC_ORDER_CANCEL_TIMES + member.getId(), 1, 86400);
+        }
+
+        otcEntrustOrderDao.updateRemainAmount(otcOrder.getEntrustOrderId(), otcOrder.getCoinAmount());
+        this.baseMapper.updateOrderStatusByOrderNo(OtcOrder.STATUS_CANCEL, null, otcOrder.getOrderNo());
+
+        otcProducter.sendMarketBussinessMsg(otcOrder.getEntrustOrderId(), OtcOrder.STATUS_CANCEL);
+    }
+
+    @Override
+    public Result orderApeal(OrderApealDto orderApealDto) {
+        MemberEntity member = LoginUserUtils.getAppLoginUser();
+        Long memberId = member.getId();
+//        long memberId = 446L;
+        Long orderId = orderApealDto.getOrderId();
+        OtcOrder otcOrder = this.baseMapper.selectById(orderId);
+        if(ObjectUtil.isEmpty(otcOrder)){
+            return Result.fail("订单不存在");
+        }
+        String reason = orderApealDto.getReason();
+        if(StrUtil.isEmpty(reason)){
+            return Result.fail("请填写申诉原因");
+        }
+        List<String> content = orderApealDto.getContent();
+        OtcOrderAppeal otcOrderAppeal = new OtcOrderAppeal();
+        otcOrderAppeal.setMemberId(memberId);
+        otcOrderAppeal.setOrderId(orderId);
+        otcOrderAppeal.setReason(reason);
+        otcOrderAppeal.setContent(content.toString());
+        otcOrderAppeal.setStatus(OtcOrderAppeal.STATUS_ONE);
+        otcOrderAppealDao.insert(otcOrderAppeal);
+        return Result.ok("成功");
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/ApplyConditionsVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/ApplyConditionsVo.java
new file mode 100644
index 0000000..a554624
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/ApplyConditionsVo.java
@@ -0,0 +1,37 @@
+package com.xcong.excoin.modules.otc.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "ApplyConditionsVo", description = "接口返回类")
+public class ApplyConditionsVo {
+
+    @ApiModelProperty(value = "商家入驻总单数1:满足 2:不满足")
+    private Integer orderNumStatus;
+
+    @ApiModelProperty(value = "商家入驻完成率1:满足 2:不满足")
+    private Integer completionRateStatus;
+
+    @ApiModelProperty(value = "商家入驻总金额1:满足 2:不满足")
+    private Integer totalAmountStatus;
+
+    @ApiModelProperty(value = "实名认证1:满足 2:不满足")
+    private Integer memberAuthStatus;
+
+    @ApiModelProperty(value = "总单数")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "完成率")
+    private BigDecimal completionRate;
+
+    @ApiModelProperty(value = "总金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "今日取消次数")
+    private Integer cancellNum;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/BlackListVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/BlackListVo.java
new file mode 100644
index 0000000..5b5ee26
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/BlackListVo.java
@@ -0,0 +1,24 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "BlackListVo", description = "黑名单列表接口返回类")
+public class BlackListVo {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "昵称")
+    private String name;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "拉黑时间")
+    private Date time;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/BuyOrderDetailVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/BuyOrderDetailVo.java
new file mode 100644
index 0000000..33b0fdb
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/BuyOrderDetailVo.java
@@ -0,0 +1,82 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "OtcOrderDetailVo", description = "otc订单详情")
+public class BuyOrderDetailVo {
+
+    @ApiModelProperty(value = "交易总额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "交易数量")
+    private BigDecimal usdtAmount;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNo;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("下单时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "银行名称")
+    private String bankName;
+
+    @ApiModelProperty(value = "银行卡号")
+    private String bankNo;
+
+    @ApiModelProperty(value = "银行卡姓名")
+    private String cardName;
+
+    @ApiModelProperty(value = "支付方式 1-微信 2-支付宝 3-银行卡")
+    private String payType;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "支付时间")
+    private Date payTime;
+
+    @ApiModelProperty(value = "姓名")
+    private String payName;
+
+    @ApiModelProperty(value = "商家昵称")
+    private String saleName;
+
+    @ApiModelProperty(value = "商家MemberId")
+    private Long saleMemberId;
+    @ApiModelProperty(value = "memberId")
+    private Long memberId;
+
+    @ApiModelProperty(value = "商家ID")
+    private Long mbId;
+
+    @ApiModelProperty(value = "订单数量")
+    private Integer orderCnt;
+
+    @ApiModelProperty(value = "完成率")
+    private BigDecimal finishRatio;
+
+    @ApiModelProperty(value = "是否市商 1是 2否")
+    private Integer isMb;
+
+    @ApiModelProperty(value = "订单状态 1-已提交 2-已付款 3-完成")
+    private Integer status;
+
+    @ApiModelProperty(value = "剩余秒数")
+    private Long times;
+
+    @ApiModelProperty(value = "是否已拉黑 1-是 2-否")
+    private Integer isBlack;
+
+    @ApiModelProperty(value = "是否自己的委托单 1-是 2-否")
+    private Integer isOwnEntrust;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/ChatBoxVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/ChatBoxVo.java
new file mode 100644
index 0000000..25318f3
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/ChatBoxVo.java
@@ -0,0 +1,38 @@
+package com.xcong.excoin.modules.otc.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "ChatBoxVo", description = "返回参数类")
+public class ChatBoxVo {
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "接受ID")
+    private long targetId;
+
+    @ApiModelProperty(value = "发送ID")
+    private long fromMemberId;
+
+    @ApiModelProperty(value = "用户ID")
+    private long memberId;
+
+    //消息
+    @ApiModelProperty(value = "消息")
+    private String msg;
+
+    //消息类型 1-文本2-图片
+    @ApiModelProperty(value = "消息类型 1-文本2-图片")
+    private Integer msgType;
+
+    @ApiModelProperty(value = "是否是自己 1:是 2:否")
+    private Integer isSelf;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/ChatOrderVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/ChatOrderVo.java
new file mode 100644
index 0000000..54acbb7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/ChatOrderVo.java
@@ -0,0 +1,62 @@
+package com.xcong.excoin.modules.otc.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "ChatOrderVo", description = "返回参数类")
+public class ChatOrderVo {
+
+    /**
+     * 订单编号
+     */
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNo;
+
+    private Long memberId;
+
+    /**
+     * 单价
+     */
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    /**
+     * 数量
+     */
+
+    @ApiModelProperty(value = "数量")
+    private BigDecimal usdtAmount;
+
+    /**
+     * 总额
+     */
+
+    @ApiModelProperty(value = "总额")
+    private BigDecimal totalAmount;
+
+    /**
+     * 订单状态 1-已提交未付款2-已付款3-已完成
+     */
+
+    @ApiModelProperty(value = "订单状态 1-已提交未付款2-已付款3-已完成4-已取消")
+    private Integer status;
+    public static final Integer STATUS_SUBMIT = 1;
+    public static final Integer STATUS_PAY = 2;
+    public static final Integer STATUS_FINISH = 3;
+    public static final Integer STATUS_CANCEL = 4;
+
+
+    /**
+     * 订单类型 B-买 S-卖
+     */
+
+    @ApiModelProperty(value = "订单类型 B-买 S-卖")
+    private String orderType;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListInfoVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListInfoVo.java
new file mode 100644
index 0000000..cba9a05
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListInfoVo.java
@@ -0,0 +1,66 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "EntrustListInfoVo", description = "委托单列表返回参数类")
+public class EntrustListInfoVo {
+
+    @ApiModelProperty(value= "委托单ID")
+    private Long id;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "限额 最小值")
+    private BigDecimal min;
+
+    @ApiModelProperty(value = "限额 最大值")
+    private BigDecimal max;
+
+    @ApiModelProperty(value = "数量")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "剩余数量")
+    private BigDecimal remainAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "上/下线 1-上线 2-下线")
+    private Integer status;
+
+    @ApiModelProperty(value = "订单类型 B/购买 S/出售")
+    private String orderType;
+
+    @ApiModelProperty(value = "类型 1-支付宝2-微信3-银行卡")
+    private String payType;
+
+    public BigDecimal getUnitPrice() {
+        return unitPrice.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getMin() {
+        return min.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getMax() {
+        return max.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getAmount() {
+        return amount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getRemainAmount() {
+        return remainAmount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListVo.java
new file mode 100644
index 0000000..153079a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustListVo.java
@@ -0,0 +1,63 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "EntrustListVo", description = "委托单列表接口返回参数类")
+public class EntrustListVo {
+
+    @ApiModelProperty(value = "订单ID")
+    private Long id;
+
+    @ApiModelProperty(value = "市商ID")
+    private Long mbId;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "市商昵称")
+    private String nickname;
+
+    @ApiModelProperty(value = "数量")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "限额 最小值")
+    private BigDecimal min;
+
+    @ApiModelProperty(value = "限额 最大值")
+    private BigDecimal max;
+
+    @ApiModelProperty(value = "订单数量")
+    private Integer orderCnt;
+
+    @ApiModelProperty(value = "完成率")
+    private BigDecimal finishRatio;
+
+    @ApiModelProperty(value = "支付方式 1-支付宝 2-微信 3-银行卡")
+    private String payType;
+
+    public BigDecimal getUnitPrice() {
+        return unitPrice.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getAmount() {
+        return amount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getMin() {
+        return min.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getMax() {
+        return max.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getFinishRatio() {
+        return finishRatio.multiply(BigDecimal.valueOf(100)).setScale(2, BigDecimal.ROUND_DOWN);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustOrderDetailVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustOrderDetailVo.java
new file mode 100644
index 0000000..f0db3f5
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/EntrustOrderDetailVo.java
@@ -0,0 +1,82 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "EntrustOrderDetailVo", description = "获取委托单详情接口返回参数类")
+public class EntrustOrderDetailVo {
+
+    @ApiModelProperty(value = "委托单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "委托数量")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "剩余数量")
+    private BigDecimal remainAmount;
+
+    @ApiModelProperty(value = "委托金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "限额 下限")
+    private BigDecimal min;
+
+    @ApiModelProperty(value = "限额 上限")
+    private BigDecimal max;
+
+    @ApiModelProperty(value = "类型 B-购买 S-出售")
+    private String orderType;
+
+    @ApiModelProperty(value = "上/下线 1-上线 2-下线")
+    private Integer status;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "商家昵称")
+    private String name;
+
+    @ApiModelProperty(value = "订单数量")
+    private Integer orderCnt;
+
+    @ApiModelProperty(value = "完成率")
+    private BigDecimal finishRatio;
+
+    @ApiModelProperty(value = "支付方式")
+    private String payType;
+
+    public BigDecimal getUnitPrice() {
+        return unitPrice.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getAmount() {
+        return amount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getRemainAmount() {
+        return remainAmount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getMin() {
+        return min.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public BigDecimal getMax() {
+        return max.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/MarketBussinessInfoVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/MarketBussinessInfoVo.java
new file mode 100644
index 0000000..a85e25e
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/MarketBussinessInfoVo.java
@@ -0,0 +1,51 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "MarketBussinessInfoVo", description = "获取市商信息接口返回参数类")
+public class MarketBussinessInfoVo {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "会员ID")
+    private Long memberId;
+
+    @ApiModelProperty(value = "昵称")
+    private String nikename;
+
+    @ApiModelProperty(value = "审核状态", example = "1-待审核2-审核通过3-审核拒绝")
+    private Integer status;
+
+    @ApiModelProperty(value = "服务人数")
+    private Integer buyCnt;
+
+    @ApiModelProperty(value = "总单数")
+    private Integer totalOrderCnt;
+
+    @ApiModelProperty(value = "完成率")
+    private BigDecimal finishRatio;
+
+    @ApiModelProperty(value = "平均付款时间")
+    private Integer avgPayTime;
+
+    @ApiModelProperty(value = "平均放币时间")
+    private Integer avgCoinTime;
+
+    @ApiModelProperty(value = "卖单")
+    private List<EntrustListInfoVo> sales;
+
+    @ApiModelProperty(value = "买单")
+    private List<EntrustListInfoVo> buys;
+
+    public BigDecimal getFinishRatio() {
+        return finishRatio.multiply(BigDecimal.valueOf(100)).setScale(2, BigDecimal.ROUND_DOWN);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/MsgListVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/MsgListVo.java
new file mode 100644
index 0000000..fd5317c
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/MsgListVo.java
@@ -0,0 +1,39 @@
+package com.xcong.excoin.modules.otc.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "MsgListVo", description = "返回参数类")
+public class MsgListVo {
+
+    //用户ID
+    @ApiModelProperty(value = "用户ID")
+    private long id;
+
+    @ApiModelProperty(value = "昵称")
+    private String nickname;
+
+    @ApiModelProperty(value = "对方用户ID")
+    private long targetId;
+
+    @ApiModelProperty(value = "用户ID")
+    private long memberId;
+
+    //是否已读 1:未读 2:已读
+    @ApiModelProperty(value = "是否已读 1:未读 2:已读")
+    private Integer isRead;
+
+    //最后聊天时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "最后聊天时间")
+    private Date lastMsgTime;
+
+    @ApiModelProperty(value = "最新的订单")
+    private ChatOrderVo chatOrderVo;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/OrderListVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/OrderListVo.java
new file mode 100644
index 0000000..43a791a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/OrderListVo.java
@@ -0,0 +1,43 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "OtcOrderListVo", description = "订单列表返回参数类")
+public class OrderListVo {
+
+    @ApiModelProperty(value = "订单ID")
+    private Long id;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "usdt数量")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "总金额")
+    private BigDecimal totalAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "状态 1-已提交 2-已付款 3-已完成 4-已取消")
+    private Integer status;
+
+    @ApiModelProperty(value = "订单类型 B-买/S-卖")
+    private String orderType;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/SaleOrderDetailVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/SaleOrderDetailVo.java
new file mode 100644
index 0000000..f1ad32a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/SaleOrderDetailVo.java
@@ -0,0 +1,73 @@
+package com.xcong.excoin.modules.otc.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "OtcOrderDetailVo", description = "otc订单详情")
+public class SaleOrderDetailVo {
+
+    @ApiModelProperty(value = "交易总额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "交易数量")
+    private BigDecimal usdtAmount;
+
+    @ApiModelProperty(value = "单价")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderNo;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("下单时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "订单状态 1-已提交 2-已付款 3-完成")
+    private Integer status;
+
+    @ApiModelProperty(value = "姓名")
+    private String payName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "支付时间")
+    private Date payTime;
+
+    @ApiModelProperty(value = "支付方式")
+    private String payType;
+
+    @ApiModelProperty(value = "商家昵称")
+    private String saleName;
+
+    @ApiModelProperty(value = "商家MemberId")
+    private Long saleMemberId;
+    @ApiModelProperty(value = "memberId")
+    private Long memberId;
+
+    @ApiModelProperty(value = "商家ID")
+    private Long mbId;
+
+    @ApiModelProperty(value = "订单数量")
+    private Integer orderCnt;
+
+    @ApiModelProperty(value = "完成率")
+    private BigDecimal finishRatio;
+
+    @ApiModelProperty(value = "是否市商 1是 2否")
+    private Integer isMb;
+
+    @ApiModelProperty(value = "剩余秒数")
+    private Long times;
+
+    @ApiModelProperty(value = "是否已拉黑")
+    private Integer isBlack;
+
+    @ApiModelProperty(value = "是否自己的委托单 1-是 2-否")
+    private Integer isOwnEntrust;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/TeamVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/TeamVo.java
new file mode 100644
index 0000000..53d51b7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/TeamVo.java
@@ -0,0 +1,28 @@
+package com.xcong.excoin.modules.otc.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "TeamVo", description = "我的团队接口返回参数类")
+public class TeamVo {
+
+    @ApiModelProperty(value = "邀请码")
+    private String inviteId;
+
+    @ApiModelProperty(value = "级别")
+    private int level;
+
+    @ApiModelProperty(value = "金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "团队人数")
+    private Integer cnt;
+
+    public BigDecimal getAmount() {
+        return amount == null ? BigDecimal.ZERO : amount.setScale(4, BigDecimal.ROUND_DOWN);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/netty/bean/AuthRequest.java b/src/main/java/com/xcong/excoin/netty/bean/AuthRequest.java
new file mode 100644
index 0000000..9366538
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/netty/bean/AuthRequest.java
@@ -0,0 +1,29 @@
+package com.xcong.excoin.netty.bean;
+
+
+import java.io.Serializable;
+
+public class AuthRequest implements Serializable {
+
+    private static final long serialVersionUID = 5557983797622950620L;
+
+    private Integer cmd;
+
+    private String token;
+
+    public Integer getCmd() {
+        return cmd;
+    }
+
+    public void setCmd(Integer cmd) {
+        this.cmd = cmd;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/netty/bean/ChatRequest.java b/src/main/java/com/xcong/excoin/netty/bean/ChatRequest.java
new file mode 100644
index 0000000..ef23959
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/netty/bean/ChatRequest.java
@@ -0,0 +1,31 @@
+package com.xcong.excoin.netty.bean;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *  {"data": {"fromMemberId": 443, "isSelf": 1, "memberId": 443, "msg": "w shi shei ", "msgType": 1, "targetId": 444}, "type": 2}
+ */
+@Data
+public class ChatRequest implements Serializable {
+    private static final long serialVersionUID = 3079080008111369136L;
+
+    private Long fromMemberId;
+
+    private Long targetId;
+
+    private Long memberId;
+
+    private Integer msgType;
+
+    private String msg;
+
+    private Integer isSelf;
+
+    private Integer cmd;
+
+    private Long timestamp;
+}
diff --git a/src/main/java/com/xcong/excoin/netty/bean/RequestBean.java b/src/main/java/com/xcong/excoin/netty/bean/RequestBean.java
index 289b4ae..7ec536a 100644
--- a/src/main/java/com/xcong/excoin/netty/bean/RequestBean.java
+++ b/src/main/java/com/xcong/excoin/netty/bean/RequestBean.java
@@ -3,47 +3,19 @@
 
 import java.io.Serializable;
 
-/**
- * @author wzy
- * @email wangdoubleone@gmail.com
- * @date 2019-05-09
- */
+
 public class RequestBean implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
     /**
-     * 请求类型
+     * 请求类型 1-鉴权 2-发送消息
      */
-    private String type;
+    private Integer type;
 
-    /**
-     * 当前通道id
-     */
+    private Object data;
+
     private String channelId;
-
-    /**
-     * web端通道ID
-     */
-    private String reqId;
-
-    /**
-     * 请求参数
-     */
-    private String params;
-
-    /**
-     * 手持端是否同意连接 0-否 1-是
-     */
-    private String tag;
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
 
     public String getChannelId() {
         return channelId;
@@ -53,38 +25,19 @@
         this.channelId = channelId;
     }
 
-    public String getParams() {
-        return params;
+    public Object getData() {
+        return data;
     }
 
-    public void setParams(String params) {
-        this.params = params;
+    public void setData(Object data) {
+        this.data = data;
     }
 
-    public String getReqId() {
-        return reqId;
+    public Integer getType() {
+        return type;
     }
 
-    public void setReqId(String reqId) {
-        this.reqId = reqId;
-    }
-
-    public String getTag() {
-        return tag;
-    }
-
-    public void setTag(String tag) {
-        this.tag = tag;
-    }
-
-    @Override
-    public String toString() {
-        return "RequestBean{" +
-                "type='" + type + '\'' +
-                ", channelId='" + channelId + '\'' +
-                ", reqId='" + reqId + '\'' +
-                ", params='" + params + '\'' +
-                ", tag='" + tag + '\'' +
-                '}';
+    public void setType(Integer type) {
+        this.type = type;
     }
 }
diff --git a/src/main/java/com/xcong/excoin/netty/bean/ResponseBean.java b/src/main/java/com/xcong/excoin/netty/bean/ResponseBean.java
index b595122..68dbd7f 100644
--- a/src/main/java/com/xcong/excoin/netty/bean/ResponseBean.java
+++ b/src/main/java/com/xcong/excoin/netty/bean/ResponseBean.java
@@ -5,85 +5,54 @@
 import java.util.List;
 import java.util.Map;
 
-/**
- * @author wzy
- * @date 2020-04-18 16:17
- **/
+
 public class ResponseBean implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    public static final String SUCCESS = "200";
+    /**
+     *  1-鉴权 2-发送消息 3-新消息提醒
+     */
+    private Integer type;
 
-    private String status;
+    private Integer status;
 
-    private String type;
+    private Object data;
 
-    private String info;
-
-    private String channelId;
-
-    private Map<Object, Object> mapInfo = new HashMap<>();
-
-    private List<?> row;
-
-    public static ResponseBean ok(String type, String info) {
-        ResponseBean responseBean = new ResponseBean();
-        responseBean.status = SUCCESS;
-        responseBean.type = type;
-        responseBean.info = info;
-        return responseBean;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getType() {
+    public Integer getType() {
         return type;
     }
 
-    public void setType(String type) {
+    public void setType(Integer type) {
         this.type = type;
     }
 
-    public String getInfo() {
-        return info;
+    public Integer getStatus() {
+        return status;
     }
 
-    public void setInfo(String info) {
-        this.info = info;
+    public void setStatus(Integer status) {
+        this.status = status;
     }
 
-    public String getChannelId() {
-        return channelId;
+    public Object getData() {
+        return data;
     }
 
-    public void setChannelId(String channelId) {
-        this.channelId = channelId;
+    public void setData(Object data) {
+        this.data = data;
     }
 
-    public Map<Object, Object> getMapInfo() {
-        return mapInfo;
+    public static ResponseBean fail(){
+        ResponseBean res = new ResponseBean();
+        res.setStatus(0);
+        return res;
     }
 
-    public void setMapInfo(Map<Object, Object> mapInfo) {
-        this.mapInfo = mapInfo;
-    }
-
-    public void putInfo(Object key, Object value) {
-        this.mapInfo.put(key, value);
-    }
-
-    public List<?> getRow() {
-        return row;
-    }
-
-    public void setRow(List<?> row) {
-        this.row = row;
+    public static ResponseBean ok(Object data) {
+        ResponseBean res = new ResponseBean();
+        res.setStatus(1);
+        res.setData(data);
+        return res;
     }
 }
diff --git a/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java b/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java
index 5d158f6..6e16771 100644
--- a/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java
+++ b/src/main/java/com/xcong/excoin/netty/common/ChannelManager.java
@@ -23,9 +23,20 @@
     // 当前连接到服务器的通道(tcp和websocket)
     private static final ConcurrentMap<String, ChannelId> CHANNEL_MAP = new ConcurrentHashMap<>();
 
+    // key - 用户ID value - 通道ID
+    private static final ConcurrentMap<String, ChannelId> MEMBER_CHANNEL = new ConcurrentHashMap<>();
+
+    // key - 通道 value - 用户
+    private static final ConcurrentMap<ChannelId, String> CHANNEL_MEMBER = new ConcurrentHashMap<>();
+
     public static void addWebSocketChannel(Channel channel) {
         WEBSOCKET_GROUP.add(channel);
         CHANNEL_MAP.put(channel.id().asShortText(), channel.id());
+    }
+
+    public static void addWsChannel(Channel channel, Long memberId) {
+        MEMBER_CHANNEL.put(memberId.toString(), channel.id());
+        CHANNEL_MEMBER.put(channel.id(), memberId.toString());
     }
 
     public static void removeWebSocketChannel(Channel channel) {
@@ -33,9 +44,27 @@
         CHANNEL_MAP.remove(channel.id().asShortText());
     }
 
+    public static void removeWsChannel(Channel channel, Long memberId) {
+        MEMBER_CHANNEL.remove(memberId.toString());
+        CHANNEL_MEMBER.remove(channel.id());
+    }
+
     public static Channel findWebSocketChannel(String id){
         ChannelId channelId = CHANNEL_MAP.get(id);
         return WEBSOCKET_GROUP.find(channelId);
+    }
+
+    public static Channel findWsChannel(Long id){
+        ChannelId channelId = MEMBER_CHANNEL.get(id.toString());
+        if (channelId == null) {
+            return null;
+        }
+
+        return WEBSOCKET_GROUP.find(channelId);
+    }
+
+    public static String findWsMemberId(Channel channel) {
+        return CHANNEL_MEMBER.get(channel.id());
     }
 
     public static ChannelGroup getWebSocketGroup() {
@@ -46,10 +75,10 @@
         if (WEBSOCKET_GROUP.size() == 0) {
             return;
         }
-        ResponseBean responseBean = ResponseBean.ok(type, null);
-        responseBean.putInfo("data", object);
-        String msg = JSONObject.toJSONString(responseBean);
-        WEBSOCKET_GROUP.writeAndFlush(NettyTools.webSocketBytes(msg));
+//        ResponseBean responseBean = ResponseBean.ok(type, null);
+//        responseBean.putInfo("data", object);
+//        String msg = JSONObject.toJSONString(responseBean);
+//        WEBSOCKET_GROUP.writeAndFlush(NettyTools.webSocketBytes(msg));
     }
 
 
diff --git a/src/main/java/com/xcong/excoin/netty/common/Contans.java b/src/main/java/com/xcong/excoin/netty/common/Contans.java
index 1a64913..17bc2c2 100644
--- a/src/main/java/com/xcong/excoin/netty/common/Contans.java
+++ b/src/main/java/com/xcong/excoin/netty/common/Contans.java
@@ -8,16 +8,8 @@
 
     public static final String HEART_BEAT = "ping pong pang";
 
-    public static final String WEB_REQ_CONNECTION = "000_000";
+    public static final int AUTH_CHECK = 1;
 
-    public static final String HOME_SYMBOLS = "001_001";
-
-    public static final String ORDER_COIN_PRE_ORDER_DATA = "002_001";
-
-    public static final String ORDER_COIN_FIND_TRUST_ORDER = "002_002";
-
-    public static final String ORDER_PRE_ORDER_DATA = "003_001";
-
-    public static final String ORDER_FIND_TRUST_ORDER = "003_002";
+    public static final int MESSAGE = 2;
 
 }
diff --git a/src/main/java/com/xcong/excoin/netty/common/NettyTools.java b/src/main/java/com/xcong/excoin/netty/common/NettyTools.java
index ead90db..dd13d4e 100644
--- a/src/main/java/com/xcong/excoin/netty/common/NettyTools.java
+++ b/src/main/java/com/xcong/excoin/netty/common/NettyTools.java
@@ -1,5 +1,7 @@
 package com.xcong.excoin.netty.common;
 
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.netty.bean.ResponseBean;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
@@ -21,7 +23,16 @@
         return Unpooled.copiedBuffer((msg + "_split").getBytes());
     }
 
+    public static TextWebSocketFrame wsSendMsg(ResponseBean responseBean) {
+        String res = JSONObject.toJSONString(responseBean);
+        return new TextWebSocketFrame(res);
+    }
+
     public static TextWebSocketFrame webSocketBytes(String msg) {
         return new TextWebSocketFrame(msg);
     }
+
+    public static TextWebSocketFrame webSocketJson(Object object) {
+        return webSocketBytes(JSONObject.toJSONString(object));
+    }
 }
diff --git a/src/main/java/com/xcong/excoin/netty/dispatch/MsgDispatch.java b/src/main/java/com/xcong/excoin/netty/dispatch/MsgDispatch.java
index 540fd36..2b4be56 100644
--- a/src/main/java/com/xcong/excoin/netty/dispatch/MsgDispatch.java
+++ b/src/main/java/com/xcong/excoin/netty/dispatch/MsgDispatch.java
@@ -1,9 +1,14 @@
 package com.xcong.excoin.netty.dispatch;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.xcong.excoin.netty.bean.RequestBean;
+import com.xcong.excoin.netty.bean.ResponseBean;
+import com.xcong.excoin.netty.common.ChannelManager;
+import com.xcong.excoin.netty.common.Contans;
 import com.xcong.excoin.netty.common.NettyTools;
 import com.xcong.excoin.netty.logic.MsgLogic;
+import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeansException;
@@ -19,28 +24,28 @@
  */
 @Slf4j
 @Component("msgDispatch")
-public class MsgDispatch implements ApplicationContextAware {
-
-    private ApplicationContext applicationContext;
+public class MsgDispatch {
 
     @Autowired
     private MsgLogic msgLogic;
 
     public void webSocketDispatch(ChannelHandlerContext ctx, String msg) {
-        RequestBean requestBean = null;
+        RequestBean requestBean = JSONObject.parseObject(msg, RequestBean.class);
+
+        // 判断当前通道用户是否已经登陆
+        if (StrUtil.isEmpty(ChannelManager.findWsMemberId(ctx.channel())) && requestBean.getType() != Contans.AUTH_CHECK) {
+            ResponseBean res = ResponseBean.fail();
+            res.setType(requestBean.getType());
+            ctx.channel().writeAndFlush(NettyTools.webSocketBytes(JSONObject.toJSONString(res)));
+            return;
+        }
+
         try {
-            requestBean = JSONObject.parseObject(msg, RequestBean.class);
             requestBean.setChannelId(ctx.channel().id().asShortText());
             msgLogic.webSocketMsgLogic(requestBean);
         } catch (Exception e) {
-            log.info("#websocket json error:{}#", e);
-            ctx.channel().writeAndFlush(NettyTools.webSocketBytes("params error"));
+            log.info("#websocket json error:#", e);
+            ctx.channel().writeAndFlush(NettyTools.wsSendMsg(ResponseBean.fail()));
         }
-    }
-
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        this.applicationContext = applicationContext;
     }
 }
diff --git a/src/main/java/com/xcong/excoin/netty/handler/WebSocketServerHandler.java b/src/main/java/com/xcong/excoin/netty/handler/WebSocketServerHandler.java
index 3e57246..2a28b57 100644
--- a/src/main/java/com/xcong/excoin/netty/handler/WebSocketServerHandler.java
+++ b/src/main/java/com/xcong/excoin/netty/handler/WebSocketServerHandler.java
@@ -5,6 +5,7 @@
 import com.xcong.excoin.netty.common.Contans;
 import com.xcong.excoin.netty.common.NettyTools;
 import com.xcong.excoin.netty.dispatch.MsgDispatch;
+import com.xcong.excoin.utils.SpringContextHolder;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.*;
@@ -29,9 +30,11 @@
 import static io.netty.handler.codec.http.HttpUtil.isKeepAlive;
 
 /**
- * @author wzy
- * @email wangdoubleone@gmail.com
- * @date 2019-05-06
+ * 项目启动时,在控制台有
+ * Unable to proxy interface-implementing method [public final void io.netty.channel.ChannelInitializer.channelRegistered(io.netty.channel.ChannelHandlerContext) throws java.lang.Exception] because it is marked as final: Consider using interface-based JDK proxies instead!
+ * 输出
+ * 表明,此类将走代理enhancerbyspringcglib代理
+ * 此时,获取到此类将为null(不知道原因),从而导致netty连接在初始化时会有空指针异常
  */
 @Slf4j
 @Component
@@ -44,8 +47,8 @@
 
     private WebSocketServerHandshaker handshaker;
 
-    @Resource(name = "msgDispatch")
-    private MsgDispatch msgDispatch;
+//    @Resource(name = "msgDispatch")
+//    private MsgDispatch msgDispatch;
 
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
@@ -75,8 +78,9 @@
                 content = ((TextWebSocketFrame) frame).text();
                 if (content.contains(Contans.HEART_BEAT)) {
                     resetTimes(ctx.channel());
+//                    ctx.channel().writeAndFlush(NettyTools.webSocketBytes(Contans.HEART_BEAT));
                 } else {
-                    this.msgDispatch.webSocketDispatch(ctx, content);
+                    SpringContextHolder.getBean(MsgDispatch.class).webSocketDispatch(ctx, content);
                 }
             } catch (ClassCastException e) {
                 content = ((CloseWebSocketFrame) frame).reasonText();
@@ -87,12 +91,27 @@
 
     @Override
     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-        log.info("[触发器触发]");
-//        super.userEventTriggered(ctx, evt);
+//        log.info("[触发器触发]");
         if (evt instanceof IdleStateEvent) {
             IdleStateEvent event = (IdleStateEvent) evt;
             if (event.state() == IdleState.READER_IDLE) {
-
+                Integer times = pingTimes.get(ctx.channel().id().asShortText());
+                if (times == null) {
+                    times = 0;
+                }
+                /*读超时*/
+//                log.info("===服务端===({}读超时, {})", ctx.channel().id().asShortText(), times);
+                // 失败计数器次数大于等于3次的时候,关闭链接,等待client重连
+                if (times >= MAX_UN_REC_PING_TIMES) {
+                    log.info("===服务端===(读超时,关闭chanel)");
+                    // 连续超过N次未收到client的ping消息,那么关闭该通道,等待client重连
+                    ctx.channel().close();
+                } else {
+                    // 失败计数器加1
+                    times++;
+                    pingTimes.remove(ctx.channel().id().asShortText());
+                    pingTimes.put(ctx.channel().id().asShortText(), times);
+                }
             } else if (event.state() == IdleState.WRITER_IDLE) {
                 /*写超时*/
                 ctx.channel().writeAndFlush(NettyTools.webSocketBytes(Contans.HEART_BEAT));
diff --git a/src/main/java/com/xcong/excoin/netty/initalizer/WebSocketServerInitializer.java b/src/main/java/com/xcong/excoin/netty/initalizer/WebSocketServerInitializer.java
index 54cb224..25f3130 100644
--- a/src/main/java/com/xcong/excoin/netty/initalizer/WebSocketServerInitializer.java
+++ b/src/main/java/com/xcong/excoin/netty/initalizer/WebSocketServerInitializer.java
@@ -19,9 +19,6 @@
 @Component
 public class WebSocketServerInitializer extends ChannelInitializer<NioSocketChannel> {
 
-    @Autowired
-    private WebSocketServerHandler webSocketServerHandler;
-
     @Override
     protected void initChannel(NioSocketChannel ch) throws Exception {
         ChannelPipeline cp = ch.pipeline();
@@ -32,8 +29,8 @@
         cp.addLast(new HttpObjectAggregator(65536));
         cp.addLast(new ChunkedWriteHandler());
         // 心跳
-        ch.pipeline().addLast(new IdleStateHandler(0, 10, 0));
+        ch.pipeline().addLast(new IdleStateHandler(10, 0, 0));
         // 自定义业务handler
-        cp.addLast(webSocketServerHandler);
+        cp.addLast(new WebSocketServerHandler());
     }
 }
diff --git a/src/main/java/com/xcong/excoin/netty/logic/WebSocketLogic.java b/src/main/java/com/xcong/excoin/netty/logic/WebSocketLogic.java
index d1c9322..b2788cb 100644
--- a/src/main/java/com/xcong/excoin/netty/logic/WebSocketLogic.java
+++ b/src/main/java/com/xcong/excoin/netty/logic/WebSocketLogic.java
@@ -1,11 +1,22 @@
 package com.xcong.excoin.netty.logic;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.crypto.asymmetric.RSA;
 import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.contants.AppContants;
+import com.xcong.excoin.configurations.properties.SecurityProperties;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.netty.bean.ChatRequest;
 import com.xcong.excoin.netty.bean.RequestBean;
 import com.xcong.excoin.netty.bean.ResponseBean;
 import com.xcong.excoin.netty.common.ChannelManager;
 import com.xcong.excoin.netty.common.NettyTools;
+import com.xcong.excoin.rabbit.producer.ChatProducer;
+import com.xcong.excoin.utils.RedisUtils;
 import io.netty.channel.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 
@@ -14,28 +25,76 @@
  * @email wangdoubleone@gmail.com
  * @date 2019-05-09
  */
+@Slf4j
 @Component
 public class WebSocketLogic {
 
+    @Autowired
+    private RedisUtils redisUtils;
+    @Autowired
+    private ChatProducer chatProducer;
+    @Autowired
+    private SecurityProperties securityProperties;
 
-    public void webReqConnection(RequestBean requestBean) {
+    public void authCheck(RequestBean requestBean) {
         Channel channel = ChannelManager.findWebSocketChannel(requestBean.getChannelId());
-        channel.writeAndFlush(NettyTools.webSocketBytes("this is ok"));
-    }
+        ResponseBean responseBean = new ResponseBean();
+        responseBean.setType(requestBean.getType());
+        responseBean.setStatus(1);
 
-    public void reqHomeSymbols(RequestBean requestBean) {
-        String params = requestBean.getParams();
-        JSONObject jsonObject = JSONObject.parseObject(params);
-        String token = jsonObject.getString("token");
-        String type = jsonObject.getString("type");
-        ResponseBean responseBean = ResponseBean.ok(requestBean.getType(), null);
+        String token = requestBean.getData().toString();
+        String redisKey = AppContants.APP_LOGIN_PREFIX + token;
+        String loginStr = redisUtils.getString(redisKey);
+        if (StrUtil.isBlank(loginStr)) {
+            ResponseBean res = ResponseBean.fail();
+            res.setType(requestBean.getType());
+            channel.writeAndFlush(NettyTools.webSocketBytes(JSONObject.toJSONString(res)));
+            return;
+        }
 
-        Channel channel = ChannelManager.findWebSocketChannel(requestBean.getChannelId());
+        MemberEntity loginUser = JSONObject.parseObject(loginStr, MemberEntity.class);
+        Long memberId = loginUser.getId();
+
         channel.writeAndFlush(NettyTools.webSocketBytes(JSONObject.toJSONString(responseBean)));
+        ChannelManager.addWsChannel(channel, memberId);
+        String value = redisUtils.getString(AppContants.MSG_NOTICE + memberId);
+        if (StrUtil.isNotBlank(value)) {
+            responseBean.setType(3);
+            responseBean.setData(Integer.parseInt(value));
+            channel.writeAndFlush(NettyTools.webSocketBytes(JSONObject.toJSONString(responseBean)));
+
+            redisUtils.del(AppContants.MSG_NOTICE + memberId);
+        }
     }
 
-    public void defaultReq(RequestBean requestBean) {
+    public void sendMsg(RequestBean requestBean) {
+        String chatStr = requestBean.getData().toString();
+        log.info("接收到的消息:{}", chatStr);
+        ChatRequest chat = JSONObject.parseObject(chatStr, ChatRequest.class);
+
         Channel channel = ChannelManager.findWebSocketChannel(requestBean.getChannelId());
-        channel.writeAndFlush("this is error type");
+        ResponseBean res = ResponseBean.ok(chat);
+        chat.setTimestamp(System.currentTimeMillis());
+        res.setType(2);
+        channel.writeAndFlush(NettyTools.webSocketJson(res));
+
+        // 判断是否在线
+        Channel targetChannel = ChannelManager.findWsChannel(chat.getTargetId());
+        if (targetChannel != null) {
+            chat.setIsSelf(2);
+            ResponseBean toRes = ResponseBean.ok(chat);
+            toRes.setType(2);
+            targetChannel.writeAndFlush(NettyTools.webSocketJson(toRes));
+        } else {
+            // 在redis中保存用户未在线时,给该用户发送的消息条数
+//            String key = AppContants.MSG_NOTICE + chat.getTargetId();
+//            String value = redisUtils.getString(key);
+//            if (StrUtil.isEmpty(value)) {
+//                redisUtils.set(key , 1);
+//            } else {
+//                redisUtils.set(key, Integer.parseInt(value) + 1);
+//            }
+        }
+        chatProducer.sendMsgHistory(chat);
     }
 }
diff --git a/src/main/java/com/xcong/excoin/netty/logic/impl/MsgLogicImpl.java b/src/main/java/com/xcong/excoin/netty/logic/impl/MsgLogicImpl.java
index c1fbb4c..7e76d05 100644
--- a/src/main/java/com/xcong/excoin/netty/logic/impl/MsgLogicImpl.java
+++ b/src/main/java/com/xcong/excoin/netty/logic/impl/MsgLogicImpl.java
@@ -1,9 +1,13 @@
 package com.xcong.excoin.netty.logic.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.xcong.excoin.netty.bean.RequestBean;
+import com.xcong.excoin.netty.common.ChannelManager;
 import com.xcong.excoin.netty.common.Contans;
+import com.xcong.excoin.netty.common.NettyTools;
 import com.xcong.excoin.netty.logic.MsgLogic;
 import com.xcong.excoin.netty.logic.WebSocketLogic;
+import io.netty.channel.Channel;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -20,14 +24,14 @@
 
     @Override
     public void webSocketMsgLogic(RequestBean requestBean) {
+
         switch (requestBean.getType()) {
-            case Contans.WEB_REQ_CONNECTION :
-                webSocketLogic.webReqConnection(requestBean);
+            case Contans.AUTH_CHECK:
+                webSocketLogic.authCheck(requestBean);
                 break;
-            case Contans.HOME_SYMBOLS:
-                webSocketLogic.reqHomeSymbols(requestBean);
+            case Contans.MESSAGE:
+                webSocketLogic.sendMsg(requestBean);
             default:
-                webSocketLogic.defaultReq(requestBean);
                 break;
         }
     }
diff --git a/src/main/java/com/xcong/excoin/netty/server/WebSocketServer.java b/src/main/java/com/xcong/excoin/netty/server/WebSocketServer.java
index 84b1290..f525e59 100644
--- a/src/main/java/com/xcong/excoin/netty/server/WebSocketServer.java
+++ b/src/main/java/com/xcong/excoin/netty/server/WebSocketServer.java
@@ -19,27 +19,26 @@
 @Component("webSocketServer")
 public class WebSocketServer implements ChatServer {
 
-
     private EventLoopGroup boss = new NioEventLoopGroup();
     private EventLoopGroup work = new NioEventLoopGroup();
 
     private ChannelFuture channelFuture;
 
-    @Autowired
-    private WebSocketServerInitializer webSocketServerInitializer;
+//    @Autowired
+//    private WebSocketServerInitializer webSocketServerInitializer;
 
     @Override
     public void start() throws Exception {
-        log.info("[websocket服务器启动]");
+        log.info("[netty websocket服务器启动]");
         try {
             ServerBootstrap b = new ServerBootstrap();
             b.group(boss, work)
                     .channel(NioServerSocketChannel.class)
-                    .childHandler(webSocketServerInitializer);
+                    .childHandler(new WebSocketServerInitializer());
 
-            channelFuture = b.bind(9999).sync();
+            channelFuture = b.bind(9998).sync();
 
-            log.info("[websocket服务器启动完成]-->{}", channelFuture.channel().localAddress());
+            log.info("[netty websocket服务器启动完成 : {}]", channelFuture.channel().localAddress());
         } finally {
             Runtime.getRuntime().addShutdownHook(new Thread() {
                 @Override
diff --git a/src/main/java/com/xcong/excoin/quartz/job/NettyServerStartUp.java b/src/main/java/com/xcong/excoin/quartz/job/NettyServerStartUp.java
new file mode 100644
index 0000000..024e6c5
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/quartz/job/NettyServerStartUp.java
@@ -0,0 +1,21 @@
+package com.xcong.excoin.quartz.job;
+
+
+import com.xcong.excoin.netty.server.WebSocketServer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConditionalOnProperty(prefix = "app", name = "netty-job", havingValue = "true")
+public class NettyServerStartUp implements CommandLineRunner {
+
+    @Autowired
+    private WebSocketServer webSocketServer;
+
+    @Override
+    public void run(String... args) throws Exception {
+        webSocketServer.start();
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/quartz/job/OtcOrderJob.java b/src/main/java/com/xcong/excoin/quartz/job/OtcOrderJob.java
new file mode 100644
index 0000000..669e0d4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/quartz/job/OtcOrderJob.java
@@ -0,0 +1,131 @@
+package com.xcong.excoin.quartz.job;
+
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.xcong.excoin.common.contants.AppContants;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.otc.dao.OtcEntrustOrderDao;
+import com.xcong.excoin.modules.otc.dao.OtcMarketBussinessDao;
+import com.xcong.excoin.modules.otc.dao.OtcOrderDao;
+import com.xcong.excoin.modules.otc.dao.OtcSettingDao;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.entity.OtcSetting;
+import com.xcong.excoin.modules.otc.service.OtcOrderService;
+import com.xcong.excoin.utils.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Component
+@ConditionalOnProperty(prefix = "app", name = "otc-job", havingValue = "true")
+public class OtcOrderJob {
+
+    @Autowired
+    private OtcOrderDao otcOrderDao;
+    @Autowired
+    private OtcEntrustOrderDao otcEntrustOrderDao;
+    @Autowired
+    private OtcMarketBussinessDao otcMarketBussinessDao;
+    @Autowired
+    private MemberWalletCoinDao memberWalletCoinDao;
+    @Autowired
+    private OtcSettingDao otcSettingDao;
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @Scheduled(cron = "0/1 * * * * ? ")
+    public void autoCancelOrder() {
+        List<OtcOrder> otcOrders = otcOrderDao.selectOrderListWithStatusAndType(OtcEntrustOrder.ORDER_TYPE_B, OtcOrder.STATUS_SUBMIT);
+        if (CollUtil.isNotEmpty(otcOrders)) {
+            for (OtcOrder otcOrder : otcOrders) {
+                long between = DateUtil.between(new Date(), DateUtil.offsetMinute(otcOrder.getCreateTime(), 30), DateUnit.SECOND, false);
+
+                if (between <= 0) {
+                    OtcOrder saleOrder = otcOrderDao.selectOrderByOrderNoAndType(otcOrder.getOrderNo(), OtcEntrustOrder.ORDER_TYPE_S);
+                    if (!saleOrder.getMemberId().equals(saleOrder.getEntrustMemberId())) {
+                        MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(saleOrder.getMemberId(), "USDT");
+                        memberWalletCoinDao.subFrozenBalance(saleOrder.getMemberId(), wallet.getId(), saleOrder.getCoinAmount());
+                    }
+
+                    otcEntrustOrderDao.updateRemainAmount(otcOrder.getEntrustOrderId(), otcOrder.getCoinAmount());
+                    otcOrderDao.updateOrderStatusByOrderNo(OtcOrder.STATUS_CANCEL, null, otcOrder.getOrderNo());
+
+                    Long memberId;
+                    if (otcOrder.getMemberId().equals(otcOrder.getEntrustMemberId())) {
+                        memberId = otcOrder.getOppositeMemberId();
+                    } else {
+                        memberId = otcOrder.getMemberId();
+                    }
+
+                    OtcSetting setting = otcSettingDao.selectById(1L);
+                    String times = redisUtils.getString(AppContants.OTC_ORDER_CANCEL_TIMES + memberId);
+                    if (StrUtil.isNotBlank(times)) {
+                        int i = Integer.parseInt(times);
+                        i++;
+                        if (i >= setting.getCancellNum()) {
+                            redisUtils.set(AppContants.OTC_ORDER_CANCEL_TIMES + memberId, i, 86400);
+                        } else {
+                            redisUtils.set(AppContants.OTC_ORDER_CANCEL_TIMES + memberId, i);
+                        }
+                    } else {
+                        redisUtils.set(AppContants.OTC_ORDER_CANCEL_TIMES + memberId, 1, 86400);
+                    }
+                }
+            }
+        }
+    }
+
+//    @Scheduled(cron = "0 0/5 * * * ? ")
+    public void marketBussinessJob() {
+        List<OtcMarketBussiness> list = otcMarketBussinessDao.selectList(null);
+        if (CollUtil.isNotEmpty(list)) {
+            for (OtcMarketBussiness mb : list) {
+                // 服务人数
+                Integer buyCnt = otcOrderDao.selectMemberCntForEntrust(mb.getMemberId());
+                // 买单数
+                Integer buyTotalCnt = otcOrderDao.selectTotalOrderCount(mb.getMemberId(), null, OtcEntrustOrder.ORDER_TYPE_B);
+                // 买单完成率
+                Integer buyFinishCnt = otcOrderDao.selectTotalOrderCount(mb.getMemberId(), OtcOrder.STATUS_FINISH, OtcEntrustOrder.ORDER_TYPE_B);
+                if (buyTotalCnt != null && buyTotalCnt != 0) {
+                    BigDecimal finishRatio = BigDecimal.valueOf(buyFinishCnt).divide(BigDecimal.valueOf(buyTotalCnt), 4, BigDecimal.ROUND_DOWN);
+                    mb.setFinishRatio(finishRatio);
+                }
+
+                // 买单数
+                Integer saleTotalCnt = otcOrderDao.selectTotalOrderCount(mb.getMemberId(), null, OtcEntrustOrder.ORDER_TYPE_S);
+                // 买单完成率
+                Integer saleFinishCnt = otcOrderDao.selectTotalOrderCount(mb.getMemberId(), OtcOrder.STATUS_FINISH, OtcEntrustOrder.ORDER_TYPE_S);
+                if (saleTotalCnt != null && saleTotalCnt != 0) {
+                    BigDecimal finishRatio = BigDecimal.valueOf(saleFinishCnt).divide(BigDecimal.valueOf(saleTotalCnt), 4, BigDecimal.ROUND_DOWN);
+                    mb.setSaleFinishRatio(finishRatio);
+                }
+                // 平均付款时间
+                BigDecimal avgPayTime = otcOrderDao.selectMemberAvgPayTime(mb.getMemberId());
+                // 平均放币时间
+                BigDecimal avgCoinTime = otcOrderDao.selectMemberAvgCoinTime(mb.getMemberId());
+
+                mb.setBuyCnt(buyCnt);
+                mb.setTotalOrderCnt(buyTotalCnt);
+                mb.setSaleOrderCnt(saleTotalCnt);
+                mb.setAvgPayTime(avgPayTime.intValue());
+                mb.setAvgCoinTime(avgCoinTime.intValue());
+
+                otcMarketBussinessDao.updateById(mb);
+            }
+        }
+    }
+
+}
diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/ChatConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/ChatConsumer.java
new file mode 100644
index 0000000..554bf6b
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/rabbit/consumer/ChatConsumer.java
@@ -0,0 +1,106 @@
+package com.xcong.excoin.rabbit.consumer;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.contants.AppContants;
+import com.xcong.excoin.configurations.RabbitMqConfig;
+import com.xcong.excoin.modules.member.dao.MemberSettingDao;
+import com.xcong.excoin.modules.otc.dao.OtcMsgHistoryDao;
+import com.xcong.excoin.modules.otc.dao.OtcMsgUserListDao;
+import com.xcong.excoin.modules.otc.entity.OtcMsgHistoryEntity;
+import com.xcong.excoin.modules.otc.entity.OtcMsgUserListEntity;
+import com.xcong.excoin.netty.bean.ChatRequest;
+import com.xcong.excoin.utils.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+@Slf4j
+@Component
+@ConditionalOnProperty(prefix = "app", name = "netty-job", havingValue = "true")
+public class ChatConsumer {
+
+    @Autowired
+    private OtcMsgUserListDao otcMsgUserListDao;
+
+    @Autowired
+    private OtcMsgHistoryDao otcMsgHistoryDao;
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @Autowired
+    private MemberSettingDao memberSettingDao;
+
+    @RabbitListener(queues = RabbitMqConfig.QUEUE_MSG_HISTORY)
+    @Transactional(rollbackFor = Exception.class)
+    public void msgHistoryConsumer(String content) {
+        log.info("收到历史消息处理:{}", content);
+        ChatRequest chat = JSONObject.parseObject(content, ChatRequest.class);
+
+        Long toId = chat.getTargetId();
+        Long fromId = chat.getFromMemberId();
+
+        // 发送人是否存在聊天框
+        OtcMsgUserListEntity fromList = otcMsgUserListDao.selectChatListByToAndFrom(toId, fromId);
+        if (fromList == null) {
+            OtcMsgUserListEntity from = new OtcMsgUserListEntity();
+            from.setMemberId(fromId);
+            from.setTargetId(toId);
+            from.setIsRead(OtcMsgUserListEntity.ISREAD_TWO);
+            from.setLastMsgTime(new Date());
+            otcMsgUserListDao.insert(from);
+        } else {
+            fromList.setLastMsgTime(new Date());
+            otcMsgUserListDao.updateById(fromList);
+        }
+
+        // 收件人是否存在聊天框
+        OtcMsgUserListEntity toList = otcMsgUserListDao.selectChatListByToAndFrom(fromId, toId);
+        if (toList == null) {
+            OtcMsgUserListEntity from = new OtcMsgUserListEntity();
+            from.setMemberId(toId);
+            from.setTargetId(fromId);
+            from.setIsRead(OtcMsgUserListEntity.ISREAD_ONE);
+            from.setLastMsgTime(new Date());
+            otcMsgUserListDao.insert(from);
+        } else {
+            // 收件人正在聊的用户
+            String value = redisUtils.getString(AppContants.MSG_CHATTING + toId);
+            if (StrUtil.isNotBlank(value) && value.equals(fromId.toString())) {
+                toList.setLastMsgTime(new Date());
+                otcMsgUserListDao.updateById(toList);
+            } else {
+                toList.setIsRead(OtcMsgUserListEntity.ISREAD_ONE);
+                toList.setLastMsgTime(new Date());
+                otcMsgUserListDao.updateById(toList);
+            }
+        }
+
+
+        OtcMsgHistoryEntity toHistory = new OtcMsgHistoryEntity();
+        toHistory.setMemberId(toId);
+        toHistory.setFromMemberId(fromId);
+        toHistory.setTargetId(toId);
+        toHistory.setIsSelf(OtcMsgHistoryEntity.ISSELF_TWO);
+        toHistory.setMsgType(chat.getMsgType());
+        toHistory.setMsg(chat.getMsg());
+
+        OtcMsgHistoryEntity fromHistory = new OtcMsgHistoryEntity();
+        BeanUtil.copyProperties(toHistory, fromHistory);
+        fromHistory.setIsSelf(OtcMsgHistoryEntity.ISSELF_ONE);
+        fromHistory.setMemberId(fromId);
+
+        memberSettingDao.updateMessageReminderByMemberId(toId);
+
+        otcMsgHistoryDao.insert(fromHistory);
+        otcMsgHistoryDao.insert(toHistory);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/OtcConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/OtcConsumer.java
new file mode 100644
index 0000000..5094626
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/rabbit/consumer/OtcConsumer.java
@@ -0,0 +1,161 @@
+package com.xcong.excoin.rabbit.consumer;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.configurations.RabbitMqConfig;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.dao.MemberSettingDao;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberSettingEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.otc.dao.OtcEntrustOrderDao;
+import com.xcong.excoin.modules.otc.dao.OtcMarketBussinessDao;
+import com.xcong.excoin.modules.otc.dao.OtcOrderDao;
+import com.xcong.excoin.modules.otc.dao.OtcReturnMoneyDao;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrder;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussiness;
+import com.xcong.excoin.modules.otc.entity.OtcOrder;
+import com.xcong.excoin.modules.otc.entity.OtcReturnMoney;
+import com.xcong.excoin.utils.LogRecordUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+@ConditionalOnProperty(prefix = "app", name = "otc-job", havingValue = "true")
+public class OtcConsumer {
+
+    @Autowired
+    private OtcMarketBussinessDao otcMarketBussinessDao;
+
+    @Autowired
+    private OtcEntrustOrderDao otcEntrustOrderDao;
+
+    @Autowired
+    private OtcOrderDao otcOrderDao;
+
+    @Autowired
+    private MemberDao memberDao;
+
+    @Autowired
+    private MemberSettingDao memberSettingDao;
+
+    @Autowired
+    private MemberWalletCoinDao memberWalletCoinDao;
+
+    @Autowired
+    private OtcReturnMoneyDao otcReturnMoneyDao;
+
+    @RabbitListener(queues = RabbitMqConfig.QUEUE_MARKET_BUSSINESS)
+    public void marketBussiness(String content) {
+        log.info("收到市商消息:{}", content);
+        JSONObject jsonObject = JSONObject.parseObject(content);
+        Integer entrustOrderIdInt = jsonObject.getInteger("entrustOrderId");
+        Long entrustOrderId = entrustOrderIdInt.longValue();
+        Integer status = jsonObject.getInteger("status");
+        OtcEntrustOrder entrustOrder = otcEntrustOrderDao.selectById(entrustOrderId);
+
+        OtcMarketBussiness mb = otcMarketBussinessDao.selectMarketBussinessByMemberId(entrustOrder.getMemberId());
+
+        if (!OtcOrder.STATUS_CANCEL.equals(status)) {
+            if (OtcEntrustOrder.ORDER_TYPE_S.equals(entrustOrder.getOrderType())) {
+                mb.setSaleOrderCnt(mb.getSaleOrderCnt() + 1);
+                mb.setSaleTotalCnt(mb.getSaleTotalCnt() + 1);
+            } else {
+                mb.setBuyOrderCnt(mb.getBuyOrderCnt() + 1);
+                mb.setTotalOrderCnt(mb.getTotalOrderCnt() + 1);
+            }
+        } else {
+            if (OtcEntrustOrder.ORDER_TYPE_S.equals(entrustOrder.getOrderType())) {
+                mb.setSaleTotalCnt(mb.getSaleTotalCnt() + 1);
+            } else {
+                mb.setTotalOrderCnt(mb.getTotalOrderCnt() + 1);
+            }
+        }
+
+        if (mb.getTotalOrderCnt() != 0) {
+            BigDecimal buyFinishRatio = BigDecimal.valueOf(mb.getBuyOrderCnt()).divide(BigDecimal.valueOf(mb.getTotalOrderCnt()), 8, BigDecimal.ROUND_DOWN);
+            mb.setFinishRatio(buyFinishRatio);
+        }
+
+        if (mb.getSaleTotalCnt() != 0) {
+            BigDecimal saleFinishRatio = BigDecimal.valueOf(mb.getSaleOrderCnt()).divide(BigDecimal.valueOf(mb.getSaleTotalCnt()), 8, BigDecimal.ROUND_DOWN);
+            mb.setSaleFinishRatio(saleFinishRatio);
+        }
+
+
+        // 平均付款时间
+//        BigDecimal avgPayTime = otcOrderDao.selectMemberAvgPayTime(mb.getMemberId());
+//        // 平均放币时间
+//        BigDecimal avgCoinTime = otcOrderDao.selectMemberAvgCoinTime(mb.getMemberId());
+//
+//        mb.setAvgPayTime(avgPayTime.intValue());
+//        mb.setAvgCoinTime(avgCoinTime.intValue());
+
+        otcMarketBussinessDao.updateById(mb);
+    }
+
+
+//    @RabbitListener(queues = RabbitMqConfig.QUEUE_MARKET_BUSSINESS)
+    public void delayOrder(String content) {
+        log.info("--{}-->{}", new Date(), content);
+    }
+
+
+//    @RabbitListener(queues = RabbitMqConfig.QUEUE_ORDER_RETURN)
+//    @Transactional(rollbackFor = Exception.class)
+//    public void orderReturn(String content) {
+//        log.info("收到返佣消息:{}", content);
+//        OtcOrder order = otcOrderDao.selectOrderUnEntrust(content);
+//
+//        MemberEntity member = memberDao.selectById(order.getMemberId());
+//        List<String> refererIds = StrUtil.split(member.getRefererIds(), ',');
+//
+//        List<MemberEntity> parentMembers = memberDao.selectMemberListByReferer(refererIds);
+//
+//        if (CollUtil.isNotEmpty(parentMembers)) {
+//            int isFirst = 1;
+//            for (MemberEntity parent : parentMembers) {
+//                MemberSettingEntity memberSetting = memberSettingDao.selectMemberSettingByMemberId(parent.getId());
+//
+//                BigDecimal returnRatio = BigDecimal.ZERO;
+//                if (isFirst == 1) {
+//                    returnRatio = memberSetting.getOtcReturnFirst();
+//                } else {
+//                    returnRatio = memberSetting.getOtcReturnSecond();
+//                }
+//
+//                BigDecimal returnAmount = order.getCoinAmount().multiply(returnRatio);
+//
+//                MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(parent.getId(), "USDT");
+//                memberWalletCoinDao.updateBlockBalance(wallet.getId(), returnAmount, BigDecimal.ZERO, 0);
+//
+//                LogRecordUtils.insertMemberAccountMoneyChange(parent.getId(),"订单返利:" + content, returnAmount, "USDT", 1, 1);
+//
+//                OtcReturnMoney otcReturnMoney = new OtcReturnMoney();
+//                otcReturnMoney.setToMemberId(parent.getId());
+//                otcReturnMoney.setOrderNo(content);
+//                otcReturnMoney.setFromMemberId(member.getId());
+//                otcReturnMoney.setAmount(returnAmount);
+//                otcReturnMoneyDao.insert(otcReturnMoney);
+//
+//                isFirst = 0;
+//            }
+//        }
+//
+//        order.setIsReturn(1);
+//        otcOrderDao.updateIsReturnByOrderNo(1, content);
+//    }
+
+}
diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/ChatProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/ChatProducer.java
new file mode 100644
index 0000000..d939432
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/rabbit/producer/ChatProducer.java
@@ -0,0 +1,33 @@
+package com.xcong.excoin.rabbit.producer;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.configurations.RabbitMqConfig;
+import com.xcong.excoin.netty.bean.ChatRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+@Slf4j
+@Component
+public class ChatProducer implements RabbitTemplate.ConfirmCallback {
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    public void sendMsgHistory(ChatRequest chatRequest) {
+        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
+        log.info("消息持久化消息: {}, {}", chatRequest, correlationData.getId());
+        String str = JSONObject.toJSONString(chatRequest);
+        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_ONE, RabbitMqConfig.ROUTING_KEY_MSG_HISTORY, str, correlationData);
+    }
+
+    @Override
+    public void confirm(CorrelationData correlationData, boolean b, String s) {
+
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/OtcProducter.java b/src/main/java/com/xcong/excoin/rabbit/producer/OtcProducter.java
new file mode 100644
index 0000000..cbfb6da
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/rabbit/producer/OtcProducter.java
@@ -0,0 +1,68 @@
+package com.xcong.excoin.rabbit.producer;
+
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.configurations.RabbitMqConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.AmqpException;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageDeliveryMode;
+import org.springframework.amqp.core.MessagePostProcessor;
+import org.springframework.amqp.rabbit.connection.CorrelationData;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class OtcProducter implements RabbitTemplate.ConfirmCallback {
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    @Autowired
+    private AmqpTemplate amqpTemplate;
+
+    @Autowired
+    public OtcProducter(RabbitTemplate rabbitTemplate) {
+        this.rabbitTemplate = rabbitTemplate;
+        rabbitTemplate.setConfirmCallback(this);
+    }
+
+    public void sendMarketBussinessMsg(Long entrustOrderId, Integer status) {
+        log.info("发送市商消息");
+        CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID());
+        Map<String, Object> map = new HashMap<>();
+        map.put("entrustOrderId", entrustOrderId);
+        map.put("status", status);
+        String s = JSONObject.toJSONString(map);
+        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_ONE, RabbitMqConfig.ROUTINGKEY_MARKET_BUSSINESS, s, correlationData);
+    }
+//
+//    public void sendDelayOrderMsg(String content) {
+//        log.info("-----{}", new Date());
+//        CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID());
+//        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_DELAY, RabbitMqConfig.ROUTING_KEY_DELAY, content, message -> {
+//            message.getMessageProperties().setExpiration(6000 + "");
+//            return message;
+//        });
+//    }
+
+    public void sendOrderReturn(String content) {
+        log.info("发送返佣消息");
+        CorrelationData correlationData = new CorrelationData(IdUtil.simpleUUID());
+        rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_ONE, RabbitMqConfig.ROUTING_ORDER_RETURN, content, correlationData);
+
+    }
+
+    @Override
+    public void confirm(CorrelationData correlationData, boolean b, String s) {
+
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java b/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java
index 0835e9e..a82c9c6 100644
--- a/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java
+++ b/src/main/java/com/xcong/excoin/utils/ThreadPoolUtils.java
@@ -47,4 +47,13 @@
             }
         });
     }
+
+    public static void sendOrderMsg() {
+        EXECUTOR.execute(new Runnable() {
+            @Override
+            public void run() {
+                DingTalkUtils.sendOrderMsg();
+            }
+        });
+    }
 }
diff --git a/src/main/java/com/xcong/excoin/utils/dingtalk/DingTalkUtils.java b/src/main/java/com/xcong/excoin/utils/dingtalk/DingTalkUtils.java
index 17e428f..c510eb9 100644
--- a/src/main/java/com/xcong/excoin/utils/dingtalk/DingTalkUtils.java
+++ b/src/main/java/com/xcong/excoin/utils/dingtalk/DingTalkUtils.java
@@ -1,10 +1,13 @@
 package com.xcong.excoin.utils.dingtalk;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiRobotSendRequest;
 import com.dingtalk.api.response.OapiRobotSendResponse;
+import com.xcong.excoin.configurations.properties.ApplicationProperties;
+import com.xcong.excoin.utils.SpringContextHolder;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.binary.Base64;
 
@@ -20,23 +23,31 @@
  **/
 @Slf4j
 public class DingTalkUtils {
+    private static final String SECRET = "SECbc84fd6c2edb9f2f440f9f969981ca310ba553e7c7994cf68cf26e4607cc5943";
+    private static final String URL = "https://oapi.dingtalk.com/robot/send?access_token=54a0d627111f3667f7e98691c15becadb742c4da895e60f6d77392389e49658a";
 
-    private static final String SECRET = "SECc0b73559742b950f07eabbd050c406a6abb3b67d112d3735289e90f58884c543";
+    private static final String EXCEPTION_URL = "https://oapi.dingtalk.com/robot/send?access_token=da71769f2b21fe2004f00980a8d8e9c4b9db76a0b8025b6f4d957f55653fea39";
+    private static final String EXCEPTION_SECRET = "SECd9169511c38c3643bbda2440b1dcd1d3a57203656186fc2ceb7fcbef18c777ed";
+
+    private static DingTalkClient initClient(String url, String secret) throws Exception {
+        Long timestamp = System.currentTimeMillis();
+        String sign = generateSign(timestamp, secret);
+        url = url + "&timestamp=" + timestamp + "&sign=" + sign;
+        return new DefaultDingTalkClient(url);
+    }
 
     public static void sendActionCard(int type) {
         log.info("send dingtalk");
-        String url = "https://oapi.dingtalk.com/robot/send?access_token=161d5e5b60ae5d6b4c80f2a9c35f9f212961a7c7154aa7e94b99503eca3886b0";
-        Long timestamp = System.currentTimeMillis();
+
+        ApplicationProperties properties = SpringContextHolder.getBean(ApplicationProperties.class);
         try {
-            String sign = generateSign(timestamp);
-            url = url + "&timestamp=" + timestamp + "&sign=" + sign;
-            DingTalkClient client = new DefaultDingTalkClient(url);
+            DingTalkClient client = initClient(URL, SECRET);
             OapiRobotSendRequest request = new OapiRobotSendRequest();
             request.setMsgtype("actionCard");
             OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
-            actionCard.setTitle(DingTalkType.getName(type));
+            actionCard.setTitle(properties.getProject() + "--" + DingTalkType.getName(type));
             actionCard.setBtnOrientation("1");
-            actionCard.setText(DingTalkType.getName(type));
+            actionCard.setText(properties.getProject() + "--" + DingTalkType.getName(type));
             List<OapiRobotSendRequest.Btns> btns = new ArrayList<>();
             OapiRobotSendRequest.Btns btn1 = new OapiRobotSendRequest.Btns();
             btn1.setTitle("查看详情");
@@ -46,22 +57,70 @@
 
             request.setActionCard(actionCard);
             OapiRobotSendResponse response = client.execute(request);
-            //log.info(JSONObject.toJSONString(response));
+            log.info(JSONObject.toJSONString(response));
         } catch (Exception e) {
             log.error("#dingtalk send error#", e);
-        } finally {
-            log.error("#dingtalk finally#");
+        }
+    }
+
+    public static void sendMsg(String title, String msg, Long id) {
+        try {
+            String text = "### {} \n\n {}";
+            DingTalkClient client = initClient(EXCEPTION_URL, EXCEPTION_SECRET);
+
+            OapiRobotSendRequest request = new OapiRobotSendRequest();
+            request.setMsgtype("actionCard");
+            OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
+            actionCard.setTitle("异常消息");
+            actionCard.setBtnOrientation("0");
+            actionCard.setText(StrUtil.format(text, title, msg));
+            actionCard.setSingleURL("http://api.topclouds.cc/common/getExceptionMsg?id=" + id);
+            actionCard.setSingleTitle("查询详情");
+
+            request.setActionCard(actionCard);
+            OapiRobotSendResponse response = client.execute(request);
+            log.info(JSONObject.toJSONString(response));
+        } catch (Exception e) {
+            log.error("#dingtalk send error#", e);
+        }
+    }
+
+    public static void sendOrderMsg() {
+        ApplicationProperties properties = SpringContextHolder.getBean(ApplicationProperties.class);
+        try {
+            DingTalkClient client = initClient(URL, SECRET);
+            OapiRobotSendRequest request = new OapiRobotSendRequest();
+            request.setMsgtype("actionCard");
+            OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
+            actionCard.setTitle(properties.getProject() + "--" + "老板开门啊");
+            actionCard.setBtnOrientation("1");
+            actionCard.setText(properties.getProject() + "--" + "老板关门不好吧");
+            List<OapiRobotSendRequest.Btns> btns = new ArrayList<>();
+            OapiRobotSendRequest.Btns btn1 = new OapiRobotSendRequest.Btns();
+            btn1.setTitle("查看详情");
+            btn1.setActionURL("http://baidu.com");
+            btns.add(btn1);
+            actionCard.setBtns(btns);
+
+            request.setActionCard(actionCard);
+            client.execute(request);
+        } catch (Exception e) {
+            log.error("#dingtalk send error#", e);
         }
     }
 
 
-    private static String generateSign(Long timestamp) throws Exception {
-        String stringToToken = timestamp + "\n" + SECRET;
+    private static String generateSign(Long timestamp, String secret) throws Exception {
+        String stringToToken = timestamp + "\n" + secret;
         Mac mac = Mac.getInstance("HmacSHA256");
-        mac.init(new SecretKeySpec(SECRET.getBytes("UTF-8"), "HmacSHA256"));
+        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
         byte[] signData = mac.doFinal(stringToToken.getBytes("UTF-8"));
         String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
         return sign;
     }
 
+    public static void main(String[] args) {
+//        sendMsg("测试一下", "内容");
+    }
+
 }
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index d5cbcb8..64d6ef8 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -92,6 +92,7 @@
 
 app:
   debug: false
+  project: otc
   redis_expire: 3000
   kline-update-job: false
   newest-price-update-job: true
@@ -101,6 +102,8 @@
   loop-job: true
   rabbit-consumer: true
   block-job: true
+  netty-job: true
+  otc-job: true
 
 aliyun:
   oss:
diff --git a/src/main/resources/application-prodapp.yml b/src/main/resources/application-prodapp.yml
index 68f7197..58317c6 100644
--- a/src/main/resources/application-prodapp.yml
+++ b/src/main/resources/application-prodapp.yml
@@ -92,6 +92,7 @@
 
 app:
   debug: false
+  project: otc
   redis_expire: 3000
   kline-update-job: false
   newest-price-update-job: false
@@ -101,6 +102,8 @@
   loop-job: false
   rabbit-consumer: false
   block-job: false
+  netty-job: false
+  otc-job: false
 
 aliyun:
   oss:
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index af32131..d746fd7 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -92,6 +92,7 @@
 
 app:
   debug: true
+  project: otc
   redis_expire: 3000
   kline-update-job: false
   newest-price-update-job: false
@@ -101,6 +102,8 @@
   loop-job: false
   rabbit-consumer: false
   block-job: false
+  netty-job: false
+  otc-job: false
 
 aliyun:
   oss:
diff --git a/src/main/resources/mapper/member/MemberPaymentMethodDao.xml b/src/main/resources/mapper/member/MemberPaymentMethodDao.xml
index 84a4214..7830f44 100644
--- a/src/main/resources/mapper/member/MemberPaymentMethodDao.xml
+++ b/src/main/resources/mapper/member/MemberPaymentMethodDao.xml
@@ -5,4 +5,19 @@
 	<select id="selectByMemberId" resultType="com.xcong.excoin.modules.member.entity.MemberPaymentMethodEntity">
 		SELECT a.* FROM member_payment_method a WHERE a.member_id = #{memberId}
 	</select>
+
+	<select id="selectDefualtMethod" resultType="com.xcong.excoin.modules.member.entity.MemberPaymentMethodEntity">
+		select * from member_payment_method
+		<where>
+			<if test="memberId != null">
+				and member_id=#{memberId}
+			</if>
+			<if test="isDefault != null and isDefault != ''">
+				and is_defualt = #{isDefault}
+			</if>
+			<if test="type != null">
+				and payment_type = #{type}
+			</if>
+		</where>
+	</select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberSettingDao.xml b/src/main/resources/mapper/member/MemberSettingDao.xml
index 2a56bce..e8b89d9 100644
--- a/src/main/resources/mapper/member/MemberSettingDao.xml
+++ b/src/main/resources/mapper/member/MemberSettingDao.xml
@@ -35,4 +35,10 @@
         </foreach>
     </insert>
 
+    <update id="updateMessageReminderByMemberId">
+        UPDATE member_setting s
+        SET s.message_reminder = 1
+        WHERE
+            member_id = #{memberId}
+    </update>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberWalletCoinDao.xml b/src/main/resources/mapper/member/MemberWalletCoinDao.xml
index ff0d8b4..13be502 100644
--- a/src/main/resources/mapper/member/MemberWalletCoinDao.xml
+++ b/src/main/resources/mapper/member/MemberWalletCoinDao.xml
@@ -61,5 +61,11 @@
 		where id=#{id}
 	</update>
 
+	<update id="reduceFrozenBalance">
+		update member_wallet_coin
+		set frozen_balance = frozen_balance - #{amount},
+			total_balance = total_balance - #{amount}
+		where id=#{id}
+	</update>
 
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1