From 030e1cca0b8103662a182a4dbe801c063b342630 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Thu, 10 Mar 2022 14:44:33 +0800
Subject: [PATCH] 20211201  fish

---
 src/main/java/com/xcong/excoin/modules/documentary/controller/ViewController.java           |   82 +
 src/main/resources/mapper/modules/FollowFollowerProfitMapper.xml                            |    9 
 src/main/resources/mapper/modules/FollowTraderInfoMapper.xml                                |   30 
 src/main/resources/mapper/modules/FollowTraderProfitInfoMapper.xml                          |   15 
 src/main/resources/mapper/modules/FollowTraderLabelMapper.xml                               |    9 
 src/main/java/com/xcong/excoin/modules/member/mapper/MemberWalletCoinMapper.java            |    4 
 src/main/resources/mapper/modules/MemberMapper.xml                                          |   10 
 src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java                      |    7 
 src/main/resources/mapper/modules/OtcOrderAppealMapper.xml                                  |   27 
 src/main/resources/templates/febs/views/modules/otc/otcEntrustListUpdate.html               |  126 +
 src/main/java/com/xcong/excoin/modules/documentary/controller/DocumentaryController.java    |  122 +
 src/main/resources/templates/febs/views/modules/documentary/traderProfit.html               |  209 ++
 src/main/resources/templates/febs/views/modules/otc/otcAppealList.html                      |  173 ++
 src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderInfoMapper.java       |    6 
 src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderLabelEntity.java      |   26 
 src/main/resources/templates/febs/views/modules/otc/otcSettingUpdate.html                   |  109 +
 src/main/resources/templates/febs/views/modules/otc/otcShopList.html                        |  177 ++
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppealEntity.java                 |   46 
 src/main/java/com/xcong/excoin/common/utils/BigDecimalSerialize.java                        |   31 
 src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderInfoEntity.java       |   41 
 src/main/java/com/xcong/excoin/modules/otc/controller/ViewController.java                   |  132 +
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderAppealMapper.java                 |   15 
 src/main/java/com/xcong/excoin/modules/otc/service/OtcService.java                          |   49 
 src/main/resources/templates/febs/views/modules/documentary/seeFollowerInfo.html            |   58 
 src/main/java/com/xcong/excoin/modules/documentary/dto/FollowTraderInfoDto.java             |    6 
 src/main/resources/templates/febs/views/modules/documentary/modifyProfitRatio.html          |  122 +
 src/main/resources/templates/febs/views/modules/otc/otcOrderInfo.html                       |  109 +
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcEntrustOrderMapper.java                |   14 
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcSettingMapper.java                     |   14 
 src/main/java/com/xcong/excoin/modules/documentary/entity/FollowFollowerProfitEntity.java   |   48 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrderEntity.java                |   70 
 src/main/resources/mapper/modules/OtcMarketBussinessMapper.xml                              |   26 
 src/main/resources/templates/febs/views/modules/otc/otcSettingList.html                     |  126 +
 src/main/resources/templates/febs/views/modules/documentary/followLabelSet.html             |  127 +
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderEntity.java                       |   81 +
 src/main/resources/templates/febs/views/modules/otc/otcOrderList.html                       |  175 ++
 src/main/resources/mapper/modules/OtcEntrustOrderMapper.xml                                 |   29 
 src/main/resources/templates/febs/views/modules/documentary/traderUpdate.html               |  104 +
 src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowFollowerProfitMapper.java   |   17 
 src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderProfitInfoMapper.java |    7 
 src/main/resources/templates/febs/views/modules/otc/otcAppealInfo.html                      |  140 +
 src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderLabelMapper.java      |   15 
 src/main/resources/templates/febs/views/modules/documentary/followLabelSetDetail.html       |   77 +
 src/main/java/com/xcong/excoin/modules/documentary/service/impl/DocumentaryServiceImpl.java |  264 +++
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderMapper.java                       |   15 
 src/main/java/com/xcong/excoin/modules/documentary/vo/SeeFollowerInfoVo.java                |   30 
 src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java                      |    2 
 src/main/java/com/xcong/excoin/modules/otc/mapper/OtcMarketBussinessMapper.java             |   14 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussinessEntity.java             |   69 
 src/main/java/com/xcong/excoin/modules/otc/entity/OtcSettingEntity.java                     |   28 
 src/main/resources/mapper/modules/OtcSettingMapper.xml                                      |   12 
 src/main/resources/templates/febs/views/modules/documentary/followLabelSetAdd.html          |   67 
 src/main/resources/templates/febs/views/modules/otc/otcEntrustList.html                     |  211 ++
 src/main/resources/templates/febs/views/modules/otc/otcHuiKuan.html                         |   93 +
 src/main/java/com/xcong/excoin/modules/documentary/dto/ModifyProfitRatioDto.java            |   16 
 src/main/resources/mapper/modules/MemberWalletCoinMapper.xml                                |   16 
 src/main/java/com/xcong/excoin/modules/documentary/service/DocumentaryService.java          |   22 
 src/main/java/com/xcong/excoin/modules/otc/vo/OtcAppealInfoVo.java                          |   59 
 src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcServiceImpl.java                 |  360 ++++
 src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderProfitInfoEntity.java |   62 
 src/main/resources/mapper/modules/OtcOrderMapper.xml                                        |   31 
 src/main/java/com/xcong/excoin/modules/otc/controller/OtcController.java                    |  163 ++
 src/main/resources/templates/febs/views/modules/documentary/traderDetail.html               |    9 
 63 files changed, 4,271 insertions(+), 92 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/common/utils/BigDecimalSerialize.java b/src/main/java/com/xcong/excoin/common/utils/BigDecimalSerialize.java
new file mode 100644
index 0000000..b322163
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/common/utils/BigDecimalSerialize.java
@@ -0,0 +1,31 @@
+package com.xcong.excoin.common.utils;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+
+import com.fasterxml.jackson.databind.JsonSerializer;
+
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+
+import java.math.BigDecimal;
+
+/**
+ * BigDecimal保留两位小数
+ * 
+ */
+public class BigDecimalSerialize extends JsonSerializer<BigDecimal> {
+
+	@Override
+	public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+		if (value != null && !"".equals(value)) {
+			gen.writeString(((BigDecimal) value).setScale(2, BigDecimal.ROUND_HALF_DOWN) + "");
+
+		} else {
+			gen.writeString(value + "");
+
+		}
+
+	}
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/controller/DocumentaryController.java b/src/main/java/com/xcong/excoin/modules/documentary/controller/DocumentaryController.java
index 0a2028b..4540ff2 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/controller/DocumentaryController.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/controller/DocumentaryController.java
@@ -5,20 +5,24 @@
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 
+import com.xcong.excoin.modules.documentary.entity.FollowTraderProfitInfoEntity;
+import com.xcong.excoin.modules.trademanage.entity.ContractOrderEntity;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.xcong.excoin.common.annotation.ControllerEndpoint;
 import com.xcong.excoin.common.controller.BaseController;
 import com.xcong.excoin.common.entity.FebsResponse;
 import com.xcong.excoin.common.entity.QueryRequest;
 import com.xcong.excoin.modules.documentary.dto.FollowTraderInfoDto;
+import com.xcong.excoin.modules.documentary.dto.ModifyProfitRatioDto;
 import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
+import com.xcong.excoin.modules.documentary.entity.FollowTraderLabelEntity;
 import com.xcong.excoin.modules.documentary.service.DocumentaryService;
+import com.xcong.excoin.modules.systemSetting.entity.PlatformBannerEntity;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -29,10 +33,50 @@
 @RequiredArgsConstructor
 @RequestMapping(value = "/documentary")
 public class DocumentaryController extends BaseController {
-	
-	private final DocumentaryService documentaryService;
-	
-	/**
+
+    private final DocumentaryService documentaryService;
+
+    /**
+     * 标签---列表
+     * @return
+     */
+    @GetMapping("traderLabelList")
+    public FebsResponse traderLabelList(FollowTraderLabelEntity followTraderLabelEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(documentaryService.traderLabelList(followTraderLabelEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 标签---删除
+     * @return
+     */
+    @GetMapping("traderLabelDelete/{id}")
+    @ControllerEndpoint(operation = "标签---删除", exceptionMessage = "删除失败")
+    public FebsResponse traderLabelDelete(@NotNull(message = "{required}") @PathVariable Long id) {
+        return documentaryService.traderLabelDelete(id);
+    }
+
+    /**
+     * 标签---新增
+     */
+    @PostMapping("followLabelSetAdd")
+    @ControllerEndpoint(operation = "标签---新增", exceptionMessage = "新增失败")
+    public FebsResponse followLabelSetAdd(@Valid FollowTraderLabelEntity followTraderLabelEntity) {
+        documentaryService.followLabelSetAdd(followTraderLabelEntity);
+        return new FebsResponse().success();
+    }
+
+    /**
+     * 标签---修改
+     */
+    @PostMapping("followLabelSetUpdate")
+    @ControllerEndpoint(operation = "标签---修改", exceptionMessage = "修改失败")
+    public FebsResponse followLabelSetUpdate(@Valid FollowTraderLabelEntity followTraderLabelEntity) {
+        documentaryService.followLabelSetUpdate(followTraderLabelEntity);
+        return new FebsResponse().success();
+    }
+
+    /**
      * 交易员申请---列表
      * @return
      */
@@ -41,7 +85,7 @@
         Map<String, Object> data = getDataTable(documentaryService.findTraderListInPage(followTraderInfoEntity, request));
         return new FebsResponse().success().data(data);
     }
-    
+
     /**
      * 交易员申请---确认
      * @return
@@ -51,7 +95,17 @@
     public FebsResponse traderConfirm(@Valid FollowTraderInfoDto followTraderInfoDto) {
         return documentaryService.traderConfirm(followTraderInfoDto);
     }
-    
+
+    /**
+     * 交易员收益率修改---确认
+     * @return
+     */
+    @PostMapping("modifyProfitRatio")
+    @ControllerEndpoint(operation = "交易员收益率修改---确认", exceptionMessage = "修改失败")
+    public FebsResponse modifyProfitRatio(@Valid ModifyProfitRatioDto modifyProfitRatioDto) {
+        return documentaryService.modifyProfitRatio(modifyProfitRatioDto);
+    }
+
     /**
      * 踢出交易员
      * @param id
@@ -62,7 +116,27 @@
     public FebsResponse traderGetOut(@NotNull(message = "{required}") @PathVariable Long id) {
         return documentaryService.traderGetOut(id);
     }
-    
+    /**
+     * 设置成首页交易员
+     * @param id
+     * @return
+     */
+    @GetMapping("traderGetOn/{id}")
+    @ControllerEndpoint(operation = "设置成首页交易员", exceptionMessage = "设置失败")
+    public FebsResponse traderGetOn(@NotNull(message = "{required}") @PathVariable Long id) {
+        return documentaryService.traderGetOn(id);
+    }
+    /**
+     * 设置成首页交易员---取消
+     * @param id
+     * @return
+     */
+    @GetMapping("traderGetOutFrist/{id}")
+    @ControllerEndpoint(operation = "设置成首页交易员", exceptionMessage = "设置失败")
+    public FebsResponse traderGetOutFrist(@NotNull(message = "{required}") @PathVariable Long id) {
+        return documentaryService.traderGetOutFrist(id);
+    }
+
     /**
      * 设置成【满员】状态
      * @param id
@@ -71,7 +145,29 @@
     @GetMapping("traderGetFull/{id}")
     @ControllerEndpoint(operation = "设置成【满员】状态", exceptionMessage = "设置失败")
     public FebsResponse traderGetFull(@NotNull(message = "{required}") @PathVariable Long id) {
-    	return documentaryService.traderGetFull(id);
+        return documentaryService.traderGetFull(id);
+    }
+
+    /**
+     * 交易员数据---列表---交易员利润分成
+     */
+    @GetMapping("traderProfitInfo")
+    public FebsResponse traderProfitInfo(FollowTraderProfitInfoEntity followTraderProfitInfoEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(documentaryService.findTraderProfitInfoInfoInPage(followTraderProfitInfoEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 交易员数据---列表---跟单数据详情
+     */
+    @GetMapping("/seeFollowerInfo")
+    public FebsResponse seeFollowerInfo(QueryRequest request, FollowTraderProfitInfoEntity followTraderProfitInfoEntity,Integer parentId) {
+        if(parentId==null){
+            ViewController.idFromMember=0;
+        }
+        followTraderProfitInfoEntity.setId(ViewController.idFromMember);
+        Map<String, Object> dataTable = getDataTable(documentaryService.findlistSeeFollowerInfo(request, followTraderProfitInfoEntity));
+        return new FebsResponse().success().data(dataTable);
     }
 
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/controller/ViewController.java b/src/main/java/com/xcong/excoin/modules/documentary/controller/ViewController.java
index df03ba8..f4983b2 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/controller/ViewController.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/controller/ViewController.java
@@ -11,18 +11,64 @@
 import com.xcong.excoin.common.entity.FebsConstant;
 import com.xcong.excoin.common.utils.FebsUtil;
 import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
+import com.xcong.excoin.modules.documentary.entity.FollowTraderLabelEntity;
+import com.xcong.excoin.modules.documentary.mapper.FollowTraderLabelMapper;
 import com.xcong.excoin.modules.documentary.service.DocumentaryService;
 import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.systemSetting.entity.PlatformTradeSettingEntity;
 
 import lombok.RequiredArgsConstructor;
 @Controller("documentaryView")
 @RequestMapping(FebsConstant.VIEW_PREFIX + "modules/documentary")
 @RequiredArgsConstructor
 public class ViewController extends BaseController{
-	
-	private final DocumentaryService documentaryService;
-	
-	/**
+
+    private final DocumentaryService documentaryService;
+
+    private final FollowTraderLabelMapper followTraderLabelMapper;
+
+    public static long idFromMember;
+
+    /**
+     *交易员利润分成---详情
+     */
+    @GetMapping("seeFollowerInfo/{id}")
+    public String seeFollowerInfo(@PathVariable long id, Model model) {
+        idFromMember = id;
+        return FebsUtil.view("modules/documentary/seeFollowerInfo");
+    }
+
+    /**
+     * 标签设置
+     * @return
+     */
+    @GetMapping("followLabelSet")
+    @RequiresPermissions("followLabelSet:view")
+    public String followLabelSet() {
+        return FebsUtil.view("modules/documentary/followLabelSet");
+    }
+
+    /**
+     * 标签设置---修改
+     */
+    @GetMapping("followLabelSetUpdate/{id}")
+    @RequiresPermissions("followLabelSetUpdate:update")
+    public String followLabelSetUpdate(@PathVariable long id, Model model) {
+        FollowTraderLabelEntity data = followTraderLabelMapper.selectById(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/documentary/followLabelSetDetail");
+    }
+
+    /**
+     * 标签设置---新增
+     */
+    @GetMapping("followLabelSetAdd")
+    @RequiresPermissions("followLabelSetAdd:add")
+    public String noticeManageAdd() {
+        return FebsUtil.view("modules/documentary/followLabelSetAdd");
+    }
+
+    /**
      * 交易员申请
      * @return
      */
@@ -31,7 +77,7 @@
     public String traderUpdate() {
         return FebsUtil.view("modules/documentary/traderUpdate");
     }
-    
+
     /**
      * 交易员申请--审核
      * @return
@@ -39,9 +85,31 @@
     @GetMapping("traderDetail/{id}")
     @RequiresPermissions("traderDetail:update")
     public String traderDetail(@PathVariable long id, Model model) {
-    	FollowTraderInfoEntity data = documentaryService.selectTraderDetailByid(id);
-    	model.addAttribute("member", data);
+        FollowTraderInfoEntity data = documentaryService.selectTraderDetailByid(id);
+        model.addAttribute("member", data);
         return FebsUtil.view("modules/documentary/traderDetail");
     }
 
+    /**
+     * 交易员收益率修改
+     * @return
+     */
+    @GetMapping("modifyProfitRatio/{id}")
+    @RequiresPermissions("modifyProfitRatio:update")
+    public String modifyProfitRatio(@PathVariable long id, Model model) {
+        FollowTraderInfoEntity data = documentaryService.selectTraderDetailByid(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/documentary/modifyProfitRatio");
+    }
+
+    /**
+     * 交易员利润分成
+     * @return
+     */
+    @GetMapping("traderProfit")
+    @RequiresPermissions("traderProfit:view")
+    public String traderProfit() {
+        return FebsUtil.view("modules/documentary/traderProfit");
+    }
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/dto/FollowTraderInfoDto.java b/src/main/java/com/xcong/excoin/modules/documentary/dto/FollowTraderInfoDto.java
index 47d3eb0..9d55936 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/dto/FollowTraderInfoDto.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/dto/FollowTraderInfoDto.java
@@ -6,11 +6,13 @@
 
 @Data
 public class FollowTraderInfoDto {
-	
+
 	@NotNull(message = "ID不能为空")
 	private Long id;
-	
+
 	@NotNull(message = "ID不能为空")
 	private String isok;
 
+	private String profitRatio;
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/dto/ModifyProfitRatioDto.java b/src/main/java/com/xcong/excoin/modules/documentary/dto/ModifyProfitRatioDto.java
new file mode 100644
index 0000000..fcb21e6
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/documentary/dto/ModifyProfitRatioDto.java
@@ -0,0 +1,16 @@
+package com.xcong.excoin.modules.documentary.dto;
+
+import javax.validation.constraints.NotNull;
+
+import lombok.Data;
+@Data
+public class ModifyProfitRatioDto {
+	
+	@NotNull(message = "ID不能为空")
+	private Long id;
+	
+	private String profitRatio;
+	
+	private String followNum;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowFollowerProfitEntity.java b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowFollowerProfitEntity.java
new file mode 100644
index 0000000..e6b0f8a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowFollowerProfitEntity.java
@@ -0,0 +1,48 @@
+package com.xcong.excoin.modules.documentary.entity;
+
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.xcong.excoin.common.entity.BaseEntity;
+import com.xcong.excoin.common.utils.BigDecimalSerialize;
+
+import lombok.Data;
+@Data
+@TableName("follow_follower_profit")
+public class FollowFollowerProfitEntity extends BaseEntity{
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final Integer IS_FOLLOW_Y = 1;
+    public static final Integer IS_FOLLOW_N = 2;
+
+    /**
+     * 跟随者ID
+     */
+    private Long memberId;
+    /**
+     * 交易员ID
+     */
+    private Long tradeId;
+    /**
+     * 交易员会员ID
+     */
+    private Long tradeMemberId;
+    /**
+     * 累计跟随本金
+     */
+    @JsonSerialize(using = BigDecimalSerialize.class)
+    private BigDecimal totalPrincipal;
+    /**
+     * 累计收益
+     */
+    @JsonSerialize(using = BigDecimalSerialize.class)
+    private BigDecimal totalProfit;
+    /**
+     * 是否跟随 1-是 2-否
+     */
+    private Integer isFollow;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderInfoEntity.java b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderInfoEntity.java
index dafa9b5..f4697bf 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderInfoEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderInfoEntity.java
@@ -1,10 +1,14 @@
 package com.xcong.excoin.modules.documentary.entity;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.xcong.excoin.common.entity.BaseEntity;
+import com.xcong.excoin.common.utils.BigDecimalSerialize;
 
 import lombok.Data;
 
@@ -14,12 +18,14 @@
 @Data
 @TableName("follow_trader_info")
 public class FollowTraderInfoEntity extends BaseEntity{
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	
-	 /**
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date entryTime;
+    /**
      * 会员ID
      */
     private Long memberId;
@@ -42,8 +48,15 @@
     public static final Integer IS_ALL_Y = 1;
     public static final Integer IS_ALL_N = 2;
     /**
+     * 设置成首页
+     */
+    private Integer isSetFrist;
+    public static final Integer IS_SETFRIST_Y = 1;
+    public static final Integer IS_SETFRIST_N = 0;
+    /**
      * 利润
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal profitRatio;
     /**
      * 审核状态 1通过2不通过3待审核
@@ -58,10 +71,15 @@
     private Integer isOpen;
     public static final Integer ISOPEN_Y = 1;
     public static final Integer ISOPEN_N = 2;
-    
+
+    /**
+     * 最大跟随人数
+     */
+    private Integer followNum;
+
     @TableField(exist = false)
     private String account;
-    
+
     @TableField(exist = false)
     private String realName;
     @TableField(exist = false)
@@ -72,7 +90,7 @@
     private String inviteId;
     @TableField(exist = false)
     private int accountType;
-    
+
     @TableField(exist = false)
     private double walletNum;
     @TableField(exist = false)
@@ -81,6 +99,9 @@
     private double agentNum;
     @TableField(exist = false)
     private String isok;
-    
+    //当前跟随人数
+    @TableField(exist = false)
+    private String followNumNow;
+
 
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderLabelEntity.java b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderLabelEntity.java
new file mode 100644
index 0000000..afa9f87
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderLabelEntity.java
@@ -0,0 +1,26 @@
+package com.xcong.excoin.modules.documentary.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.entity.BaseEntity;
+
+import lombok.Data;
+@Data
+@TableName("follow_trader_label")
+public class FollowTraderLabelEntity{
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	
+	@TableId(value = "id",type = IdType.AUTO)
+    private Long id;
+	/**
+     * 标签
+     */
+    private String labels;
+
+}
+
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderProfitInfoEntity.java b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderProfitInfoEntity.java
index 52c6d27..fc07672 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderProfitInfoEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/entity/FollowTraderProfitInfoEntity.java
@@ -1,20 +1,24 @@
 package com.xcong.excoin.modules.documentary.entity;
 
 import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.xcong.excoin.common.entity.BaseEntity;
 
+import com.xcong.excoin.common.utils.BigDecimalSerialize;
 import lombok.Data;
 
 @Data
 @TableName("follow_trader_profit_info")
 public class FollowTraderProfitInfoEntity extends BaseEntity{
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	/**
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    /**
      * 交易员ID
      */
     private Long traderId;
@@ -25,28 +29,72 @@
     /**
      * 累计收益率
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal totalProfitRatio;
     /**
      * 带单总收益
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal totalProfit;
     /**
      * 跟随者总收益
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal followerTotalProfit;
     /**
      * 胜率
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal winRate;
     /**
      * 累计跟随人数
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal totalFollowerCnt;
     /**
      * 交易笔数
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
     private BigDecimal totalOrderCnt;
-    
+
+    @TableField(exist = false)
+    private String account;
+
+    @TableField(exist = false)
+    private String realName;
+    /**
+     * 手机号(包含国际手机号)
+     */
+    @TableField(exist = false)
+    private String phone;
+    /**
+     * 邮箱
+     */
+    @TableField(exist = false)
+    private String email;
+    /**
+     * 邀请码
+     */
+    @TableField(exist = false)
+    private String inviteId;
+
+    /**
+     * 账号类型
+     */
+    @TableField(exist = false)
+    private int accountType;
+
+    /**
+     * 利润率
+     */
+    @TableField(exist = false)
+    private BigDecimal profitRatio;
+    /**
+     * 总返利
+     */
+    @TableField(exist = false)
+    private BigDecimal profitRatioTotal;
+
 
 }
 
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowFollowerProfitMapper.java b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowFollowerProfitMapper.java
new file mode 100644
index 0000000..2a49422
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowFollowerProfitMapper.java
@@ -0,0 +1,17 @@
+package com.xcong.excoin.modules.documentary.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+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.documentary.entity.FollowFollowerProfitEntity;
+import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
+import com.xcong.excoin.modules.documentary.vo.SeeFollowerInfoVo;
+
+public interface FollowFollowerProfitMapper extends BaseMapper<FollowFollowerProfitEntity> {
+
+	IPage<SeeFollowerInfoVo> findFollowFollowerProfitInfo(Page<SeeFollowerInfoVo> page,
+			@Param("record") FollowTraderInfoEntity followTraderInfo);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderInfoMapper.java b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderInfoMapper.java
index 9b785c3..394a707 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderInfoMapper.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderInfoMapper.java
@@ -12,4 +12,10 @@
 
 	IPage<FollowTraderInfoEntity> findTraderListInPage(Page<FollowTraderInfoEntity> page, @Param("record") FollowTraderInfoEntity followTraderInfoEntity);
 
+	String selectProfitRatioTotal(@Param("memberId") Long memberId);
+
+	String selectAllProfitByMemberIdAndTraderMemberId(@Param("memberId")long memberId, @Param("traderMemberId")Long traderMemberId);
+
+	String selectFollowNowBytraderId(@Param("traderId")Long traderId);
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderLabelMapper.java b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderLabelMapper.java
new file mode 100644
index 0000000..368c2eb
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderLabelMapper.java
@@ -0,0 +1,15 @@
+package com.xcong.excoin.modules.documentary.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+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.documentary.entity.FollowTraderLabelEntity;
+
+public interface FollowTraderLabelMapper extends BaseMapper<FollowTraderLabelEntity> {
+
+	IPage<FollowTraderLabelEntity> findFollowTraderLabelEntitysInPage(Page<FollowTraderLabelEntity> page,
+			@Param("record")FollowTraderLabelEntity followTraderLabelEntity);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderProfitInfoMapper.java b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderProfitInfoMapper.java
index 31eea4f..89b4909 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderProfitInfoMapper.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/mapper/FollowTraderProfitInfoMapper.java
@@ -1,8 +1,15 @@
 package com.xcong.excoin.modules.documentary.mapper;
 
+import org.apache.ibatis.annotations.Param;
+
 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.documentary.entity.FollowTraderProfitInfoEntity;
 
 public interface FollowTraderProfitInfoMapper extends BaseMapper<FollowTraderProfitInfoEntity> {
 
+    IPage<FollowTraderProfitInfoEntity> findTraderProfitInfoInfoInPage(Page<FollowTraderProfitInfoEntity> page,
+                                                                       @Param("record")FollowTraderProfitInfoEntity followTraderProfitInfoEntity);
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/service/DocumentaryService.java b/src/main/java/com/xcong/excoin/modules/documentary/service/DocumentaryService.java
index b7bb220..22812c6 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/service/DocumentaryService.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/service/DocumentaryService.java
@@ -8,7 +8,11 @@
 import com.xcong.excoin.common.entity.FebsResponse;
 import com.xcong.excoin.common.entity.QueryRequest;
 import com.xcong.excoin.modules.documentary.dto.FollowTraderInfoDto;
+import com.xcong.excoin.modules.documentary.dto.ModifyProfitRatioDto;
 import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
+import com.xcong.excoin.modules.documentary.entity.FollowTraderLabelEntity;
+import com.xcong.excoin.modules.documentary.entity.FollowTraderProfitInfoEntity;
+import com.xcong.excoin.modules.documentary.vo.SeeFollowerInfoVo;
 
 public interface DocumentaryService extends IService<FollowTraderInfoEntity> {
 
@@ -22,4 +26,22 @@
 
 	FebsResponse traderGetFull(@NotNull(message = "{required}") Long id);
 
+	IPage<FollowTraderLabelEntity> traderLabelList(FollowTraderLabelEntity followTraderLabelEntity, QueryRequest request);
+
+	FebsResponse traderLabelDelete(@NotNull(message = "{required}") Long id);
+
+	void followLabelSetAdd(@Valid FollowTraderLabelEntity followTraderLabelEntity);
+
+	void followLabelSetUpdate(@Valid FollowTraderLabelEntity followTraderLabelEntity);
+
+	FebsResponse modifyProfitRatio(@Valid ModifyProfitRatioDto modifyProfitRatioDto);
+
+	FebsResponse traderGetOn(@NotNull(message = "{required}") Long id);
+
+	FebsResponse traderGetOutFrist(@NotNull(message = "{required}")Long id);
+
+	IPage<FollowTraderProfitInfoEntity> findTraderProfitInfoInfoInPage(FollowTraderProfitInfoEntity followTraderProfitInfoEntity,
+																	   QueryRequest request);
+
+	IPage<SeeFollowerInfoVo> findlistSeeFollowerInfo(QueryRequest request, FollowTraderProfitInfoEntity followTraderProfitInfoEntity);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/DocumentaryServiceImpl.java b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/DocumentaryServiceImpl.java
index 0f1fa3b..58667bb 100644
--- a/src/main/java/com/xcong/excoin/modules/documentary/service/impl/DocumentaryServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/documentary/service/impl/DocumentaryServiceImpl.java
@@ -1,16 +1,21 @@
 package com.xcong.excoin.modules.documentary.service.impl;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 
 import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.utils.CoinTypeConvert;
 import com.xcong.excoin.common.utils.RedisUtils;
+import com.xcong.excoin.modules.documentary.vo.SeeFollowerInfoVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -20,9 +25,14 @@
 import com.xcong.excoin.common.entity.FebsResponse;
 import com.xcong.excoin.common.entity.QueryRequest;
 import com.xcong.excoin.modules.documentary.dto.FollowTraderInfoDto;
+import com.xcong.excoin.modules.documentary.dto.ModifyProfitRatioDto;
+import com.xcong.excoin.modules.documentary.entity.FollowFollowerProfitEntity;
 import com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity;
+import com.xcong.excoin.modules.documentary.entity.FollowTraderLabelEntity;
 import com.xcong.excoin.modules.documentary.entity.FollowTraderProfitInfoEntity;
+import com.xcong.excoin.modules.documentary.mapper.FollowFollowerProfitMapper;
 import com.xcong.excoin.modules.documentary.mapper.FollowTraderInfoMapper;
+import com.xcong.excoin.modules.documentary.mapper.FollowTraderLabelMapper;
 import com.xcong.excoin.modules.documentary.mapper.FollowTraderProfitInfoMapper;
 import com.xcong.excoin.modules.documentary.service.DocumentaryService;
 import com.xcong.excoin.modules.member.entity.MemberAuthenticationEntity;
@@ -32,6 +42,7 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -39,25 +50,34 @@
 @Service
 @RequiredArgsConstructor
 public class DocumentaryServiceImpl extends ServiceImpl<FollowTraderInfoMapper, FollowTraderInfoEntity> implements DocumentaryService {
-	
+
 	private final FollowTraderInfoMapper followTraderInfoMapper;
-	
+
+	private final FollowFollowerProfitMapper followFollowerProfitMapper;
+
+	private final FollowTraderLabelMapper followTraderLabelMapper;
+
 	private final MemberAuthenticationMapper memberAuthenticationMapper;
-	
+
 	private final MemberMapper memberMapper;
-	
+
 	private final FollowTraderProfitInfoMapper followTraderProfitInfoMapper;
 
 	private final RedisUtils redisUtils;
-	
+
 	@Override
 	public IPage<FollowTraderInfoEntity> findTraderListInPage(FollowTraderInfoEntity followTraderInfoEntity,
-			QueryRequest request) {
+															  QueryRequest request) {
 		Page<FollowTraderInfoEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
 		IPage<FollowTraderInfoEntity> followTraderInfoEntitys = followTraderInfoMapper.findTraderListInPage(page, followTraderInfoEntity);
 		List<FollowTraderInfoEntity> records = followTraderInfoEntitys.getRecords();
 		if(CollUtil.isNotEmpty(records)) {
 			for(FollowTraderInfoEntity followTraderInfo : records) {
+				//获取当前跟单人数
+				Long traderId = followTraderInfo.getId();
+				String followNowNumString = followTraderInfoMapper.selectFollowNowBytraderId(traderId);
+				followTraderInfo.setFollowNumNow(followNowNumString);
+
 				Long memberId = followTraderInfo.getMemberId();
 				Map<String, Object> columnMap = new HashMap<>();
 				columnMap.put("member_id", memberId);
@@ -88,7 +108,7 @@
 		Integer accountType = memberEntity.getAccountType();
 		followTraderInfoEntity.setAccountType(accountType);
 		//币币账户
-		String walletNum = memberMapper.selectBBZCForBasicRealDataBymemberId(memberId,"USDT");
+		String walletNum = memberMapper.selectBBZCForBasicRealDataBymemberId(memberId, "USDT");
 		followTraderInfoEntity.setWalletNum(walletNum == null ? 0 : Double.parseDouble(walletNum));
 		//合约账户
 		String walletCoinNum = memberMapper.selectHYZCForBasicRealDataBymemberId(memberId);
@@ -96,7 +116,7 @@
 		//代理账户
 		String agentNum = memberMapper.selectDLZCForBasicRealDataBymemberId(memberId);
 		followTraderInfoEntity.setAgentNum(agentNum == null ? 0 : Double.parseDouble(agentNum));
-		
+
 		Map<String, Object> columnMap = new HashMap<>();
 		columnMap.put("member_id", memberId);
 		List<MemberAuthenticationEntity> selectByMap = memberAuthenticationMapper.selectByMap(columnMap );
@@ -107,7 +127,7 @@
 			String realName = firstName + secondName;
 			followTraderInfoEntity.setRealName(realName);
 		}
-		
+
 		return followTraderInfoEntity;
 	}
 
@@ -118,6 +138,14 @@
 		FollowTraderInfoEntity selectById = followTraderInfoMapper.selectById(id);
 		if(ObjectUtil.isEmpty(selectById)) {
 			return new FebsResponse().fail().message("交易员信息不存在");
+		}
+		BigDecimal profitRatio = BigDecimal.ZERO;
+		String profitRatioStr = followTraderInfoDto.getProfitRatio();
+		if(StrUtil.isNotEmpty(profitRatioStr)) {
+			profitRatio = new BigDecimal(profitRatioStr);
+		}
+		if(profitRatio.compareTo(BigDecimal.ZERO) < 0 || profitRatio.compareTo(BigDecimal.ONE) >= 0){
+			return new FebsResponse().fail().message("利润率设置规则:只允许0到1之间的小数");
 		}
 		String isok = followTraderInfoDto.getIsok();
 		if("1".equals(isok)) {
@@ -130,6 +158,8 @@
 			memberEntity.setIsTrader(1);
 			memberMapper.updateById(memberEntity);
 			//更新【交易员信息表】数据
+			selectById.setProfitRatio(profitRatio);
+			selectById.setEntryTime(new Date());
 			selectById.setVerifyStatus(FollowTraderInfoEntity.VERIFYSTATUS_Y);
 			followTraderInfoMapper.updateById(selectById);
 			//新增【交易员收益信息 】数据
@@ -152,6 +182,7 @@
 			redisUtils.set("app_" + token, JSONObject.toJSONString(memberEntity), 36000);
 		}else {
 			//更新【交易员信息表】数据
+			selectById.setEntryTime(new Date());
 			selectById.setVerifyStatus(FollowTraderInfoEntity.VERIFYSTATUS_N);
 			followTraderInfoMapper.updateById(selectById);
 		}
@@ -159,12 +190,25 @@
 	}
 
 	@Override
+	@Transactional
 	public FebsResponse traderGetOut(@NotNull(message = "{required}") Long id) {
 		FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoMapper.selectById(id);
 		if(ObjectUtil.isEmpty(followTraderInfoEntity)) {
 			return new FebsResponse().fail().message("交易员信息不存在");
 		}
 		Long memberId = followTraderInfoEntity.getMemberId();
+
+		Map<String, Object> columnMap = new HashMap<>();
+		columnMap.put("trade_member_id", memberId);
+		List<FollowFollowerProfitEntity> selectByMap = followFollowerProfitMapper.selectByMap(columnMap);
+		if(CollUtil.isNotEmpty(selectByMap)) {
+			for(FollowFollowerProfitEntity FollowFollowerProfitEntity : selectByMap ) {
+				FollowFollowerProfitEntity.setIsFollow(FollowFollowerProfitEntity.IS_FOLLOW_N);
+				followFollowerProfitMapper.updateById(FollowFollowerProfitEntity);
+			}
+		}
+		followTraderInfoEntity.setVerifyStatus(FollowTraderInfoEntity.VERIFYSTATUS_N);
+		followTraderInfoMapper.updateById(followTraderInfoEntity);
 		MemberEntity memberEntity = memberMapper.selectById(memberId);
 		memberEntity.setIsTrader(2);
 		memberMapper.updateById(memberEntity);
@@ -183,4 +227,206 @@
 		return new FebsResponse().success();
 	}
 
+	@Override
+	public IPage<FollowTraderLabelEntity> traderLabelList(FollowTraderLabelEntity followTraderLabelEntity,
+														  QueryRequest request) {
+		Page<FollowTraderLabelEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+		IPage<FollowTraderLabelEntity> followTraderLabelEntitys = followTraderLabelMapper.findFollowTraderLabelEntitysInPage(page, followTraderLabelEntity);
+		return followTraderLabelEntitys;
+	}
+
+	@Override
+	public FebsResponse traderLabelDelete(@NotNull(message = "{required}") Long id) {
+		followTraderLabelMapper.deleteById(id);
+		return new FebsResponse().success();
+	}
+
+	@Override
+	public void followLabelSetAdd(@Valid FollowTraderLabelEntity followTraderLabelEntity) {
+
+		followTraderLabelMapper.insert(followTraderLabelEntity);
+	}
+
+	@Override
+	public void followLabelSetUpdate(@Valid FollowTraderLabelEntity followTraderLabelEntity) {
+		followTraderLabelMapper.updateById(followTraderLabelEntity);
+	}
+
+	@Override
+	@Transactional
+	public FebsResponse modifyProfitRatio(@Valid ModifyProfitRatioDto modifyProfitRatioDto) {
+		Long id = modifyProfitRatioDto.getId();
+		FollowTraderInfoEntity selectById = followTraderInfoMapper.selectById(id);
+		if(ObjectUtil.isEmpty(selectById)) {
+			return new FebsResponse().fail().message("交易员信息不存在");
+		}
+		BigDecimal profitRatio = BigDecimal.ZERO;
+		String profitRatioStr = modifyProfitRatioDto.getProfitRatio();
+		if(StrUtil.isNotEmpty(profitRatioStr)) {
+			profitRatio = new BigDecimal(profitRatioStr);
+		}
+		if(profitRatio.compareTo(BigDecimal.ZERO) < 0 || profitRatio.compareTo(BigDecimal.ONE) >= 0){
+			return new FebsResponse().fail().message("利润率设置规则:只允许0到1之间的小数");
+		}
+		//最大跟随人数
+		boolean matches = isMatches(modifyProfitRatioDto.getFollowNum());
+		if(!matches) {
+			return new FebsResponse().fail().message("最大跟随人数只能输入正整数");
+		}
+		Integer followNum = Integer.parseInt(modifyProfitRatioDto.getFollowNum());
+		if(ObjectUtil.isEmpty(followNum) || followNum == 0) {
+			return new FebsResponse().fail().message("最大跟随人数不能为0");
+		}
+
+		String followNumNow = followTraderInfoMapper.selectFollowNowBytraderId(id);
+		int parseInt = Integer.parseInt(followNumNow);
+		if(parseInt > followNum){
+			return new FebsResponse().fail().message("请填写大于当前跟随人数"+parseInt+"的整数");
+		}
+		//更新【交易员信息表】数据
+		selectById.setProfitRatio(profitRatio);
+		selectById.setFollowNum(followNum);
+		followTraderInfoMapper.updateById(selectById);
+		return new FebsResponse().success();
+	}
+
+	public boolean isMatches(String bot){
+		boolean flag=false;
+		try{
+			String regex="^[1-9]+[0-9]*$";
+			//^[1-9]+\\d*$
+			Pattern p=Pattern.compile(regex);
+			Matcher m=p.matcher(bot);
+			if(m.find()){
+				System.out.println("successss");
+				return true;
+			}else{
+				System.out.println("falsss");
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return flag;
+	}
+
+	@Override
+	public FebsResponse traderGetOn(@NotNull(message = "{required}") Long id) {
+		FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoMapper.selectById(id);
+		if(ObjectUtil.isEmpty(followTraderInfoEntity)) {
+			return new FebsResponse().fail().message("交易员信息不存在");
+		}
+		followTraderInfoEntity.setIsSetFrist(FollowTraderInfoEntity.IS_SETFRIST_Y);
+		followTraderInfoMapper.updateById(followTraderInfoEntity);
+		return new FebsResponse().success();
+	}
+
+	@Override
+	public FebsResponse traderGetOutFrist(@NotNull(message = "{required}") Long id) {
+		FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoMapper.selectById(id);
+		if(ObjectUtil.isEmpty(followTraderInfoEntity)) {
+			return new FebsResponse().fail().message("交易员信息不存在");
+		}
+		followTraderInfoEntity.setIsSetFrist(FollowTraderInfoEntity.IS_SETFRIST_N);
+		followTraderInfoMapper.updateById(followTraderInfoEntity);
+		return new FebsResponse().success();
+	}
+
+	@Override
+	public IPage<FollowTraderProfitInfoEntity> findTraderProfitInfoInfoInPage(
+			FollowTraderProfitInfoEntity followTraderProfitInfoEntity, QueryRequest request) {
+
+		Page<FollowTraderProfitInfoEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+		IPage<FollowTraderProfitInfoEntity> FollowTraderProfitInfoEntitys = followTraderProfitInfoMapper.findTraderProfitInfoInfoInPage(page, followTraderProfitInfoEntity);
+		List<FollowTraderProfitInfoEntity> records = FollowTraderProfitInfoEntitys.getRecords();
+
+		if(CollUtil.isNotEmpty(records)) {
+			for(FollowTraderProfitInfoEntity followTraderProfitInfo : records) {
+				Long traderId = followTraderProfitInfo.getTraderId();
+				FollowTraderInfoEntity followTraderInfoEntity = followTraderInfoMapper.selectById(traderId);
+				//利润率
+				BigDecimal profitRatio = BigDecimal.ZERO;
+				//总返利
+				BigDecimal profitRatioTotal = BigDecimal.ZERO;
+				if(ObjectUtil.isNotEmpty(followTraderInfoEntity)) {
+					profitRatio = followTraderInfoEntity.getProfitRatio();
+					profitRatioTotal = new BigDecimal(followTraderInfoMapper.selectProfitRatioTotal(followTraderInfoEntity.getMemberId())).setScale(2, RoundingMode.HALF_UP);
+				}
+				followTraderProfitInfo.setProfitRatio(profitRatio);
+				followTraderProfitInfo.setProfitRatioTotal(profitRatioTotal);
+
+				Long memberId = followTraderProfitInfo.getMemberId();
+				Map<String, Object> columnMap = new HashMap<>();
+				columnMap.put("member_id", memberId);
+				List<MemberAuthenticationEntity> selectByMap = memberAuthenticationMapper.selectByMap(columnMap );
+				if(CollUtil.isNotEmpty(selectByMap)) {
+					MemberAuthenticationEntity memberAuthenticationEntity = selectByMap.get(0);
+					String firstName = memberAuthenticationEntity.getFirstName();
+					String secondName = memberAuthenticationEntity.getSecondName();
+					String realName = firstName + secondName;
+					followTraderProfitInfo.setRealName(realName);
+				}
+			}
+		}
+		return FollowTraderProfitInfoEntitys;
+	}
+
+	@Override
+	public IPage<SeeFollowerInfoVo> findlistSeeFollowerInfo(QueryRequest request, FollowTraderProfitInfoEntity followTraderProfitInfoEntity) {
+
+		Long id = followTraderProfitInfoEntity.getId();
+		if(ObjectUtil.isEmpty(id)) {
+			return null;
+		}
+		//获取交易员信息
+		FollowTraderProfitInfoEntity FollowTraderProfitInfo = followTraderProfitInfoMapper.selectById(id);
+		if(ObjectUtil.isEmpty(FollowTraderProfitInfo)) {
+			return null;
+		}
+		Long traderId = FollowTraderProfitInfo.getTraderId();
+		Long traderMemberId = FollowTraderProfitInfo.getMemberId();
+		FollowTraderInfoEntity FollowTraderInfo = followTraderInfoMapper.selectById(traderId);
+		if(ObjectUtil.isEmpty(FollowTraderInfo)) {
+			return null;
+		}
+		//获取当前的跟随者
+		Page<SeeFollowerInfoVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+		IPage<SeeFollowerInfoVo> seeFollowerInfoVos = followFollowerProfitMapper.findFollowFollowerProfitInfo(page, FollowTraderInfo);
+		List<SeeFollowerInfoVo> records = seeFollowerInfoVos.getRecords();
+		if(CollUtil.isNotEmpty(records)) {
+			for(SeeFollowerInfoVo seeFollowerInfoVo : records) {
+				long memberId = seeFollowerInfoVo.getMemberId();
+				MemberEntity memberEntity = memberMapper.selectById(memberId);
+				if(ObjectUtil.isNotEmpty(memberEntity)) {
+					String phone = memberEntity.getPhone();
+					String email = memberEntity.getEmail();
+					String inviteId = memberEntity.getInviteId();
+					seeFollowerInfoVo.setPhone(phone);
+					seeFollowerInfoVo.setEmail(email);
+					seeFollowerInfoVo.setInviteId(inviteId);
+					//合约账户总资产
+					String totalString = memberMapper.selectMemberWalletContractByMemberId(memberId);
+					BigDecimal contractTotal = new BigDecimal(totalString);
+					seeFollowerInfoVo.setContractTotal(contractTotal);
+					//总返利
+					String totalProfitStr = followTraderInfoMapper.selectAllProfitByMemberIdAndTraderMemberId(memberId,traderMemberId);
+					BigDecimal totalProfit = new BigDecimal(totalProfitStr);
+					seeFollowerInfoVo.setProfitTotal(totalProfit);
+
+					Map<String, Object> columnMap = new HashMap<>();
+					columnMap.put("member_id", memberId);
+					List<MemberAuthenticationEntity> selectByMap = memberAuthenticationMapper.selectByMap(columnMap );
+					if(CollUtil.isNotEmpty(selectByMap)) {
+						MemberAuthenticationEntity memberAuthenticationEntity = selectByMap.get(0);
+						String firstName = memberAuthenticationEntity.getFirstName();
+						String secondName = memberAuthenticationEntity.getSecondName();
+						String realName = firstName + secondName;
+						seeFollowerInfoVo.setRealName(realName);
+					}
+				}
+			}
+		}
+
+		return seeFollowerInfoVos;
+	}
+
 }
diff --git a/src/main/java/com/xcong/excoin/modules/documentary/vo/SeeFollowerInfoVo.java b/src/main/java/com/xcong/excoin/modules/documentary/vo/SeeFollowerInfoVo.java
new file mode 100644
index 0000000..dc888e6
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/documentary/vo/SeeFollowerInfoVo.java
@@ -0,0 +1,30 @@
+package com.xcong.excoin.modules.documentary.vo;
+
+import java.math.BigDecimal;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.xcong.excoin.common.utils.BigDecimalSerialize;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "SeeFollowerInfoVo", description = "参数返回类")
+public class SeeFollowerInfoVo {
+	private long memberId;
+	//手机号
+	private String phone;
+	//邮箱
+	private String email;
+	//邀请码
+	private String inviteId;
+	//合约账户总资产
+    @JsonSerialize(using = BigDecimalSerialize.class)
+	private BigDecimal contractTotal;
+	//总返利
+    @JsonSerialize(using = BigDecimalSerialize.class)
+	private BigDecimal profitTotal;
+	//姓名
+	public String realName;
+	
+}
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 e68b96f..06cae7a 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
@@ -71,6 +71,12 @@
     public static final int IS_PROFIT_N = 0;
 
     /**
+     * 是否是商户1是2否
+     */
+    public static final int ISTRADER_Y = 1;
+    public static final int ISTRADER_N = 2;
+
+    /**
      * 手机号(包含国际手机号)
      */
     private String phone;
@@ -143,7 +149,6 @@
     /**
      * 是否是交易员1是2否
      */
-    @TableField(exist = false)
     private Integer isTrader;
 
     /**
diff --git a/src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java b/src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java
index b114500..7a4cb45 100644
--- a/src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java
+++ b/src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java
@@ -232,4 +232,6 @@
 	IPage<MemberEntity> selectDataInfoListSearchs(Page<MemberEntity> page, @Param("record")MemberEntity member);
 
 	MemberEntity selectMemberByAddress(@Param("address")String address);
+
+	String selectMemberWalletContractByMemberId(@Param("memberId")long memberId);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/mapper/MemberWalletCoinMapper.java b/src/main/java/com/xcong/excoin/modules/member/mapper/MemberWalletCoinMapper.java
index 1c61502..7374e3f 100644
--- a/src/main/java/com/xcong/excoin/modules/member/mapper/MemberWalletCoinMapper.java
+++ b/src/main/java/com/xcong/excoin/modules/member/mapper/MemberWalletCoinMapper.java
@@ -5,8 +5,12 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
 
+import java.math.BigDecimal;
+
 public interface MemberWalletCoinMapper extends BaseMapper<MemberWalletCoinEntity> {
 
 	MemberWalletCoinEntity findWalletCoinByMemberIdAndWalletCode(@Param("memberId")Long memberId, @Param("walletCode")String walletCode);
+	int updateBlockBalance(@Param("availableBalance") BigDecimal availableBalance, @Param("id") Long id);
 
+	int reduceFrozenBalance(@Param("amount") BigDecimal amount, @Param("id") Long id);
 }
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/OtcController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcController.java
new file mode 100644
index 0000000..4335613
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/OtcController.java
@@ -0,0 +1,163 @@
+package com.xcong.excoin.modules.otc.controller;
+
+import com.xcong.excoin.common.annotation.ControllerEndpoint;
+import com.xcong.excoin.common.controller.BaseController;
+import com.xcong.excoin.common.entity.FebsResponse;
+import com.xcong.excoin.common.entity.QueryRequest;
+import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.otc.entity.*;
+import com.xcong.excoin.modules.otc.service.OtcService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/otc")
+public class OtcController extends BaseController {
+
+    private final OtcService otcService;
+
+    /**
+     * 获取商户审核列表
+     */
+    @GetMapping("otcShopList")
+    public FebsResponse otcShopList(OtcMarketBussinessEntity otcMarketBussinessEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(otcService.otcShopList(otcMarketBussinessEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 商户审核---通过
+     * @return
+     */
+    @GetMapping("agreeShop/{id}")
+    @ControllerEndpoint(operation = "商户审核---通过", exceptionMessage = "通过失败")
+    public FebsResponse agreeShop(@NotNull(message = "{required}") @PathVariable Long id) {
+        return otcService.agreeShop(id);
+    }
+
+    /**
+     * 商户审核---拒绝
+     * @return
+     */
+    @GetMapping("disagreeShop/{id}")
+    @ControllerEndpoint(operation = "商户审核---通过", exceptionMessage = "通过失败")
+    public FebsResponse disagreeShop(@NotNull(message = "{required}") @PathVariable Long id) {
+        return otcService.disagreeShop(id);
+    }
+
+    /**
+     * 订单申诉列表
+     */
+    @GetMapping("otcAppealList")
+    public FebsResponse otcAppealList(OtcOrderAppealEntity otcOrderAppealEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(otcService.otcAppealList(otcOrderAppealEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 申诉---处理中
+     * @return
+     */
+    @GetMapping("dealIng/{id}")
+    @ControllerEndpoint(operation = "申诉---处理中", exceptionMessage = "失败")
+    public FebsResponse dealIng(@NotNull(message = "{required}") @PathVariable Long id) {
+        return otcService.dealIng(id);
+    }
+
+    /**
+     * 申诉---处理完
+     * @return
+     */
+    @GetMapping("dealDone/{id}")
+    @ControllerEndpoint(operation = "申诉---处理完", exceptionMessage = "失败")
+    public FebsResponse dealDone(@NotNull(message = "{required}") @PathVariable Long id) {
+        return otcService.dealDone(id);
+    }
+
+    /**
+     * 委托单列表
+     */
+    @GetMapping("otcEntrustList")
+    public FebsResponse otcEntrustList(OtcEntrustOrderEntity otcEntrustOrderEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(otcService.otcEntrustList(otcEntrustOrderEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     *委托单--更新
+     * @return
+     */
+    @PostMapping("otcEntrustConfirm")
+    @ControllerEndpoint(operation = "委托单--更新", exceptionMessage = "失败")
+    public FebsResponse otcEntrustConfirm(@Valid OtcEntrustOrderEntity otcEntrustOrderEntity) {
+        return otcService.otcEntrustConfirm(otcEntrustOrderEntity);
+    }
+
+    /**
+     * 订单列表
+     */
+    @GetMapping("otcOrderList")
+    public FebsResponse otcOrderList(OtcOrderEntity otcOrderEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(otcService.otcOrderList(otcOrderEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     *订单列表---付款人
+     * @return
+     */
+    @PostMapping("updateOrderInfo")
+    @ControllerEndpoint(operation = "订单列表---付款人", exceptionMessage = "失败")
+    public FebsResponse updateOrderInfo(@Valid OtcOrderEntity otcOrderEntity) {
+        return otcService.updateOrderInfo(otcOrderEntity);
+    }
+
+    /**
+     *回款
+     * @return
+     */
+    @PostMapping("otcHuiKuan")
+    @ControllerEndpoint(operation = "订单列表---付款人", exceptionMessage = "失败")
+    public FebsResponse otcHuiKuan(@Valid OtcMarketBussinessEntity otcMarketBussinessEntity) {
+        return otcService.otcHuiKuan(otcMarketBussinessEntity);
+    }
+
+    /**
+     * 设置列表
+     */
+    @GetMapping("otcSettingList")
+    public FebsResponse otcSettingList(OtcSettingEntity otcSettingEntity, QueryRequest request) {
+        Map<String, Object> data = getDataTable(otcService.otcSettingList(otcSettingEntity, request));
+        return new FebsResponse().success().data(data);
+    }
+    /**
+     *设置列表--更新
+     * @return
+     */
+    @PostMapping("updateOtcSetting")
+    @ControllerEndpoint(operation = "设置列表--更新", exceptionMessage = "失败")
+    public FebsResponse updateOtcSetting(@Valid OtcSettingEntity otcSettingEntity) {
+        return otcService.updateOtcSetting(otcSettingEntity);
+    }
+
+    /**
+     * 放币
+     */
+    @PostMapping("/reduceCoin/{id}")
+    @ControllerEndpoint(operation = "放币", exceptionMessage = "失败")
+    public FebsResponse reduceCoin(@PathVariable("id") Long id) {
+        otcService.reduceCoin(id);
+        return new FebsResponse().success();
+    }
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/controller/ViewController.java b/src/main/java/com/xcong/excoin/modules/otc/controller/ViewController.java
new file mode 100644
index 0000000..3b89a16
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/controller/ViewController.java
@@ -0,0 +1,132 @@
+package com.xcong.excoin.modules.otc.controller;
+
+import com.xcong.excoin.common.entity.FebsConstant;
+import com.xcong.excoin.common.utils.FebsUtil;
+import com.xcong.excoin.modules.member.vo.MemberAuthenticationVo;
+import com.xcong.excoin.modules.otc.entity.OtcEntrustOrderEntity;
+import com.xcong.excoin.modules.otc.entity.OtcMarketBussinessEntity;
+import com.xcong.excoin.modules.otc.entity.OtcOrderEntity;
+import com.xcong.excoin.modules.otc.entity.OtcSettingEntity;
+import com.xcong.excoin.modules.otc.service.OtcService;
+import com.xcong.excoin.modules.otc.vo.OtcAppealInfoVo;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller("otcView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/otc")
+@RequiredArgsConstructor
+public class ViewController {
+
+    private final OtcService otcService;
+
+    /**
+     * 获取商户审核列表
+     */
+    @GetMapping("otcShopList")
+    @RequiresPermissions("otcShopList:view")
+    public String otcShopList() {
+        return FebsUtil.view("modules/otc/otcShopList");
+    }
+
+    /**
+     * 获取委托单列表
+     */
+    @GetMapping("otcEntrustList")
+    @RequiresPermissions("otcEntrustList:view")
+    public String otcEntrustList() {
+        return FebsUtil.view("modules/otc/otcEntrustList");
+    }
+
+
+
+    /**
+     * 获取委托单列表--详情
+     */
+    @GetMapping("otcEntrustListUpdate/{id}")
+    @RequiresPermissions("otcEntrustListUpdate:update")
+    public String otcEntrustListUpdate(@PathVariable long id, Model model) {
+        OtcEntrustOrderEntity data = otcService.otcEntrustListUpdate(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/otc/otcEntrustListUpdate");
+    }
+
+
+    /**
+     * 获取订单列表
+     */
+    @GetMapping("otcOrderList")
+    @RequiresPermissions("otcOrderList:view")
+    public String otcOrderList() {
+        return FebsUtil.view("modules/otc/otcOrderList");
+    }
+
+    /**
+     * 获取订单列表--详情
+     */
+    @GetMapping("otcOrderInfo/{id}")
+    @RequiresPermissions("otcOrderInfo:update")
+    public String otcOrderInfo(@PathVariable long id, Model model) {
+        OtcOrderEntity data = otcService.otcOrderInfo(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/otc/otcOrderInfo");
+    }
+
+    /**
+     * 获取申诉列表
+     */
+    @GetMapping("otcAppealList")
+    @RequiresPermissions("otcAppealList:view")
+    public String otcAppealList() {
+        return FebsUtil.view("modules/otc/otcAppealList");
+    }
+
+    /**
+     * 获取申诉列表--详情
+     */
+    @GetMapping("otcAppealInfo/{id}")
+    @RequiresPermissions("otcAppealInfo:update")
+    public String otcAppealInfo(@PathVariable long id, Model model) {
+        OtcAppealInfoVo data = otcService.otcAppealInfo(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/otc/otcAppealInfo");
+    }
+
+    /**
+     * 商户回款
+     */
+    @GetMapping("otcHuiKuan/{id}")
+    @RequiresPermissions("otcHuiKuan:update")
+    public String otcHuiKuan(@PathVariable long id, Model model) {
+        OtcMarketBussinessEntity data = otcService.otcHuiKuan(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/otc/otcHuiKuan");
+    }
+
+    /**
+     * 获取OTC设置
+     */
+    @GetMapping("otcSettingList")
+    @RequiresPermissions("otcSettingList:view")
+    public String otcSettingList() {
+        return FebsUtil.view("modules/otc/otcSettingList");
+    }
+
+    /**
+     * OTC设置--详情
+     */
+    @GetMapping("otcSettingUpdate/{id}")
+    @RequiresPermissions("otcSettingUpdate:update")
+    public String otcSettingUpdate(@PathVariable long id, Model model) {
+        OtcSettingEntity data = otcService.otcSettingUpdate(id);
+        model.addAttribute("member", data);
+        return FebsUtil.view("modules/otc/otcSettingUpdate");
+    }
+
+
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrderEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrderEntity.java
new file mode 100644
index 0000000..21d179d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcEntrustOrderEntity.java
@@ -0,0 +1,70 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.entity.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+//otc委托单
+@Data
+@TableName("otc_entrust_order")
+public class OtcEntrustOrderEntity  extends BaseEntity {
+
+    //会员ID
+    private long memberId;
+
+    //委托单号
+    private String entrustOrderNo;
+
+    //市商ID
+    private long mbId;
+
+    //单价
+    private BigDecimal unitPrice;
+
+    //数量
+    private BigDecimal coinAmount;
+
+    //剩余数量
+    private BigDecimal remainCoinAmount;
+
+    //最小限额
+    private BigDecimal limitMinAmount;
+
+    //最大限额
+    private BigDecimal limitMaxAmount;
+
+    //委托单类型 B-买S-卖
+    private String orderType;
+    public static final String ORDERTYPE_B = "B";
+    public static final String ORDERTYPE_S = "S";
+
+    //上下线 1-上线2-下线 3-取消
+    private Integer status;
+    public static final Integer STATUS_ONE = 1;
+    public static final Integer STATUS_TWO = 2;
+
+    //是否市商 1-是 2-否
+    private Integer isMb;
+
+    //委托总金额
+    private BigDecimal totalAmount;
+
+    @TableField(exist = false)
+    private String account;
+
+    @TableField(exist = false)
+    private String phone;
+
+    @TableField(exist = false)
+    private String inviteId;
+
+    @TableField(exist = false)
+    private String realName;
+
+    @TableField(exist = false)
+    private String nikename;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussinessEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussinessEntity.java
new file mode 100644
index 0000000..ef2d9ff
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcMarketBussinessEntity.java
@@ -0,0 +1,69 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.entity.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+//市商信息表
+@Data
+@TableName("otc_market_bussiness")
+public class OtcMarketBussinessEntity extends BaseEntity {
+
+    //会员ID
+    private long memberId;
+
+    //昵称
+    private String nikename;
+
+    //宣言
+    private String declaration;
+
+    //审核状态 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;
+
+    //服务人数
+    private Integer buyCnt;
+
+    //总单数
+    private Integer totalOrderCnt;
+
+    //完成率
+    private BigDecimal finishRatio;
+
+    //待回款
+    private BigDecimal waitBackMoney;
+
+    //已回款
+    private BigDecimal hasBackMoney;
+
+    //平均付款时间
+    private Integer avgPayTime;
+
+    //平均放币时间
+    private Integer avgCoinTime;
+
+    @TableField(exist = false)
+    private String account;
+
+    @TableField(exist = false)
+    private String phone;
+
+    @TableField(exist = false)
+    private String inviteId;
+
+    @TableField(exist = false)
+    private String realName;
+    /**
+     * 本次回款
+     */
+    @TableField(exist = false)
+    private BigDecimal coinAmount;
+
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppealEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppealEntity.java
new file mode 100644
index 0000000..3077bc0
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderAppealEntity.java
@@ -0,0 +1,46 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.entity.BaseEntity;
+import lombok.Data;
+
+//订单申诉表
+@Data
+@TableName("otc_order_appeal")
+public class OtcOrderAppealEntity extends BaseEntity {
+
+    //会员ID
+    private long memberId;
+
+    //订单ID
+    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;
+
+    @TableField(exist = false)
+    private String account;
+
+    @TableField(exist = false)
+    private String phone;
+
+    @TableField(exist = false)
+    private String inviteId;
+
+    @TableField(exist = false)
+    private String realName;
+
+    @TableField(exist = false)
+    private String orderNo;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderEntity.java
new file mode 100644
index 0000000..fca7632
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcOrderEntity.java
@@ -0,0 +1,81 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.entity.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+//交易订单
+@Data
+@TableName("otc_order")
+public class OtcOrderEntity extends BaseEntity {
+
+    //会员ID
+    private long memberId;
+
+    //订单编号
+    private String orderNo;
+
+    //单价
+    private BigDecimal unitPrice;
+
+    //交易数量
+    private BigDecimal coinAmount;
+
+    //交易总额
+    private BigDecimal totalAmount;
+
+    //订单状态 1-已提交未付款2-已付款3-已完成4-已取消
+    private Integer status;
+    public static final Integer STATUS_ONE = 1;
+    public static final Integer STATUS_TWO = 2;
+    public static final Integer STATUS_THREE = 3;
+    public static final Integer STATUS_FOUR = 4;
+
+    //委托单类型 B-买S-卖
+    private String orderType;
+    public static final String ORDERTYPE_B = "B";
+    public static final String ORDERTYPE_S = "S";
+
+    //付款时间
+    private Date payTime;
+
+    //完成时间
+    private Date finishTime;
+
+    //委托单ID
+    private long entrustOrderId;
+
+    //市商ID
+    private long mbId;
+
+    //支付市商ID
+    private long payMbId;
+
+    //付款人姓名
+    private String payName;
+
+    @TableField(exist = false)
+    private String account;
+
+    @TableField(exist = false)
+    private String phone;
+
+    @TableField(exist = false)
+    private String inviteId;
+
+    @TableField(exist = false)
+    private String realName;
+
+    @TableField(exist = false)
+    private String nickname;
+
+    /**
+     * 对面的用户ID
+     */
+    private Long oppositeMemberId;
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/entity/OtcSettingEntity.java b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcSettingEntity.java
new file mode 100644
index 0000000..32bac29
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/entity/OtcSettingEntity.java
@@ -0,0 +1,28 @@
+package com.xcong.excoin.modules.otc.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.entity.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+//条件设置
+@Data
+@TableName("otc_setting")
+public class OtcSettingEntity {
+
+    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..409540e
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcEntrustOrderMapper.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.otc.mapper;
+
+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.OtcEntrustOrderEntity;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcEntrustOrderMapper extends BaseMapper<OtcEntrustOrderEntity> {
+
+    IPage<OtcEntrustOrderEntity> otcEntrustList(Page<OtcEntrustOrderEntity> page,
+                                                @Param("record")OtcEntrustOrderEntity otcEntrustOrderEntity);
+
+}
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..58df3b8
--- /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.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.OtcMarketBussinessEntity;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcMarketBussinessMapper extends BaseMapper<OtcMarketBussinessEntity> {
+
+    IPage<OtcMarketBussinessEntity> otcShopList(Page<OtcMarketBussinessEntity> page,
+                                                @Param("record")OtcMarketBussinessEntity otcMarketBussinessEntity);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderAppealMapper.java b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderAppealMapper.java
new file mode 100644
index 0000000..713c3d3
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderAppealMapper.java
@@ -0,0 +1,15 @@
+package com.xcong.excoin.modules.otc.mapper;
+
+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.OtcMarketBussinessEntity;
+import com.xcong.excoin.modules.otc.entity.OtcOrderAppealEntity;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcOrderAppealMapper extends BaseMapper<OtcOrderAppealEntity> {
+
+    IPage<OtcOrderAppealEntity> otcAppealList(Page<OtcOrderAppealEntity> page,
+                                              @Param("record")OtcOrderAppealEntity otcOrderAppealEntity);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderMapper.java b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderMapper.java
new file mode 100644
index 0000000..63948b8
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcOrderMapper.java
@@ -0,0 +1,15 @@
+package com.xcong.excoin.modules.otc.mapper;
+
+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.OtcOrderEntity;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcOrderMapper extends BaseMapper<OtcOrderEntity> {
+
+    IPage<OtcOrderEntity> otcOrderList(Page<OtcOrderEntity> page,
+                                       @Param("record")OtcOrderEntity otcOrderEntity);
+
+    int updateOrderStatusByOrderNo(@Param("status") Integer status, @Param("orderNo") String orderNo);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcSettingMapper.java b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcSettingMapper.java
new file mode 100644
index 0000000..933717c
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/mapper/OtcSettingMapper.java
@@ -0,0 +1,14 @@
+package com.xcong.excoin.modules.otc.mapper;
+
+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.OtcSettingEntity;
+import org.apache.ibatis.annotations.Param;
+
+public interface OtcSettingMapper extends BaseMapper<OtcSettingEntity> {
+
+    IPage<OtcSettingEntity> otcSettingList(Page<OtcSettingEntity> page,
+                                           @Param("record")OtcSettingEntity otcSettingEntity);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/OtcService.java b/src/main/java/com/xcong/excoin/modules/otc/service/OtcService.java
new file mode 100644
index 0000000..7bfb197
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/OtcService.java
@@ -0,0 +1,49 @@
+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.entity.FebsResponse;
+import com.xcong.excoin.common.entity.QueryRequest;
+import com.xcong.excoin.modules.otc.entity.*;
+import com.xcong.excoin.modules.otc.vo.OtcAppealInfoVo;
+
+public interface OtcService extends IService<OtcMarketBussinessEntity> {
+
+    IPage<OtcMarketBussinessEntity> otcShopList(OtcMarketBussinessEntity otcMarketBussinessEntity, QueryRequest request);
+
+    FebsResponse agreeShop(Long id);
+
+    FebsResponse disagreeShop(Long id);
+
+    IPage<OtcOrderAppealEntity> otcAppealList(OtcOrderAppealEntity otcOrderAppealEntity, QueryRequest request);
+
+    FebsResponse dealDone(Long id);
+
+    FebsResponse dealIng(Long id);
+
+    IPage<OtcEntrustOrderEntity> otcEntrustList(OtcEntrustOrderEntity otcEntrustOrderEntity, QueryRequest request);
+
+    IPage<OtcOrderEntity> otcOrderList(OtcOrderEntity otcOrderEntity, QueryRequest request);
+
+    OtcAppealInfoVo otcAppealInfo(long id);
+
+    OtcOrderEntity otcOrderInfo(long id);
+
+    FebsResponse updateOrderInfo(OtcOrderEntity otcOrderEntity);
+
+    OtcMarketBussinessEntity otcHuiKuan(long id);
+
+    FebsResponse otcHuiKuan(OtcMarketBussinessEntity otcMarketBussinessEntity);
+
+    IPage<OtcSettingEntity> otcSettingList(OtcSettingEntity otcSettingEntity, QueryRequest request);
+
+    OtcSettingEntity otcSettingUpdate(long id);
+
+    FebsResponse updateOtcSetting(OtcSettingEntity otcSettingEntity);
+
+    int reduceCoin(Long id);
+
+    OtcEntrustOrderEntity otcEntrustListUpdate(long id);
+
+    FebsResponse otcEntrustConfirm(OtcEntrustOrderEntity otcEntrustOrderEntity);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcServiceImpl.java b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcServiceImpl.java
new file mode 100644
index 0000000..a90136b
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/service/impl/OtcServiceImpl.java
@@ -0,0 +1,360 @@
+package com.xcong.excoin.modules.otc.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+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.entity.FebsResponse;
+import com.xcong.excoin.common.entity.QueryRequest;
+import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.modules.member.mapper.MemberMapper;
+import com.xcong.excoin.modules.member.mapper.MemberWalletCoinMapper;
+import com.xcong.excoin.modules.otc.entity.*;
+import com.xcong.excoin.modules.otc.mapper.*;
+import com.xcong.excoin.modules.otc.service.OtcService;
+import com.xcong.excoin.modules.otc.vo.OtcAppealInfoVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class OtcServiceImpl extends ServiceImpl<OtcMarketBussinessMapper, OtcMarketBussinessEntity> implements OtcService {
+
+    @Resource
+    private OtcMarketBussinessMapper otcMarketBussinessMapper;
+    @Resource
+    private OtcOrderAppealMapper otcOrderAppealMapper;
+    @Resource
+    private OtcEntrustOrderMapper otcEntrustOrderMapper;
+    @Resource
+    private OtcOrderMapper otcOrderMapper;
+    @Resource
+    private OtcSettingMapper otcSettingMapper;
+    @Resource
+    private MemberWalletCoinMapper memberWalletCoinMapper;
+    @Resource
+    private MemberMapper memberMapper;
+
+    @Override
+    public IPage<OtcMarketBussinessEntity> otcShopList(OtcMarketBussinessEntity otcMarketBussinessEntity, QueryRequest request) {
+        Page<OtcMarketBussinessEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<OtcMarketBussinessEntity> otcMarketBussinessEntitys = otcMarketBussinessMapper.otcShopList(page, otcMarketBussinessEntity);
+        return otcMarketBussinessEntitys;
+    }
+
+    @Override
+    @Transactional
+    public FebsResponse agreeShop(Long id) {
+        OtcMarketBussinessEntity otcMarketBussinessEntity = otcMarketBussinessMapper.selectById(id);
+        Integer status = otcMarketBussinessEntity.getStatus();
+        if(OtcMarketBussinessEntity.STATUS_ONE != status){
+            return new FebsResponse().fail().message("当前状态不是待审核");
+        }
+        otcMarketBussinessEntity.setStatus(OtcMarketBussinessEntity.STATUS_TWO);
+        otcMarketBussinessMapper.updateById(otcMarketBussinessEntity);
+
+        long memberId = otcMarketBussinessEntity.getMemberId();
+        MemberEntity memberEntity = memberMapper.selectById(memberId);
+        memberEntity.setIsTrader(MemberEntity.ISTRADER_Y);
+        memberMapper.updateById(memberEntity);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    @Transactional
+    public FebsResponse disagreeShop(Long id) {
+        OtcMarketBussinessEntity otcMarketBussinessEntity = otcMarketBussinessMapper.selectById(id);
+        Integer status = otcMarketBussinessEntity.getStatus();
+        if(OtcMarketBussinessEntity.STATUS_ONE != status){
+            return new FebsResponse().fail().message("当前状态不是待审核");
+        }
+        otcMarketBussinessEntity.setStatus(OtcMarketBussinessEntity.STATUS_THREE);
+        otcMarketBussinessMapper.updateById(otcMarketBussinessEntity);
+
+        long memberId = otcMarketBussinessEntity.getMemberId();
+        MemberEntity memberEntity = memberMapper.selectById(memberId);
+        memberEntity.setIsTrader(MemberEntity.ISTRADER_Y);
+        memberMapper.updateById(memberEntity);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public IPage<OtcOrderAppealEntity> otcAppealList(OtcOrderAppealEntity otcOrderAppealEntity, QueryRequest request) {
+        Page<OtcOrderAppealEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<OtcOrderAppealEntity> otcOrderAppealEntitys = otcOrderAppealMapper.otcAppealList(page, otcOrderAppealEntity);
+        return otcOrderAppealEntitys;
+    }
+
+    @Override
+    @Transactional
+    public FebsResponse dealDone(Long id) {
+        OtcOrderAppealEntity otcOrderAppealEntity = otcOrderAppealMapper.selectById(id);
+        Integer status = otcOrderAppealEntity.getStatus();
+        if(OtcOrderAppealEntity.STATUS_TWO != status){
+            return new FebsResponse().fail().message("当前状态不是处理中");
+        }
+
+        otcOrderAppealEntity.setStatus(OtcOrderAppealEntity.STATUS_THREE);
+        otcOrderAppealMapper.updateById(otcOrderAppealEntity);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    @Transactional
+    public FebsResponse dealIng(Long id) {
+        OtcOrderAppealEntity otcOrderAppealEntity = otcOrderAppealMapper.selectById(id);
+        Integer status = otcOrderAppealEntity.getStatus();
+        if(OtcOrderAppealEntity.STATUS_ONE != status){
+            return new FebsResponse().fail().message("当前状态不是待处理");
+        }
+
+        otcOrderAppealEntity.setStatus(OtcOrderAppealEntity.STATUS_TWO);
+        otcOrderAppealMapper.updateById(otcOrderAppealEntity);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public IPage<OtcEntrustOrderEntity> otcEntrustList(OtcEntrustOrderEntity otcEntrustOrderEntity, QueryRequest request) {
+        Page<OtcEntrustOrderEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<OtcEntrustOrderEntity> otcEntrustOrderEntitys = otcEntrustOrderMapper.otcEntrustList(page, otcEntrustOrderEntity);
+        return otcEntrustOrderEntitys;
+    }
+
+    @Override
+    public IPage<OtcOrderEntity> otcOrderList(OtcOrderEntity otcOrderEntity, QueryRequest request) {
+        Page<OtcOrderEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<OtcOrderEntity> otcOrderEntitys = otcOrderMapper.otcOrderList(page, otcOrderEntity);
+        return otcOrderEntitys;
+    }
+
+    @Override
+    public OtcAppealInfoVo otcAppealInfo(long id) {
+        OtcAppealInfoVo otcAppealInfoVo = new OtcAppealInfoVo();
+
+        OtcOrderAppealEntity otcOrderAppealEntity = otcOrderAppealMapper.selectById(id);
+        otcAppealInfoVo.setId(id);
+        if(ObjectUtil.isNotEmpty(otcOrderAppealEntity)){
+            String reason = otcOrderAppealEntity.getReason();
+            otcAppealInfoVo.setReason(reason);
+            String content = otcOrderAppealEntity.getContent();
+            List arr = Arrays.asList(content.split(","));
+            otcAppealInfoVo.setContent(arr);
+        }
+        //获取对应的订单详情
+        long orderId = otcOrderAppealEntity.getOrderId();
+        OtcOrderEntity otcOrderEntity = otcOrderMapper.selectById(orderId);
+        if(ObjectUtil.isNotEmpty(otcOrderEntity)){
+            String orderNo = otcOrderEntity.getOrderNo();
+            otcAppealInfoVo.setOrderNo(orderNo);
+            BigDecimal unitPrice = otcOrderEntity.getUnitPrice();
+            otcAppealInfoVo.setUnitPrice(unitPrice);
+            BigDecimal coinAmount = otcOrderEntity.getCoinAmount();
+            otcAppealInfoVo.setCoinAmount(coinAmount);
+            BigDecimal totalAmount = otcOrderEntity.getTotalAmount();
+            otcAppealInfoVo.setTotalAmount(totalAmount);
+            Integer status = otcOrderEntity.getStatus();
+            otcAppealInfoVo.setStatus(status);
+            Date payTime = otcOrderEntity.getPayTime();
+            otcAppealInfoVo.setPayTime(payTime);
+            Date finishTime = otcOrderEntity.getFinishTime();
+            otcAppealInfoVo.setFinishTime(finishTime);
+        }
+        //获取对应的商户信息
+        long payMdId = otcOrderEntity.getPayMbId();
+        OtcMarketBussinessEntity otcMarketBussinessEntity = otcMarketBussinessMapper.selectById(payMdId);
+        if(ObjectUtil.isNotEmpty(otcMarketBussinessEntity)){
+            String nikename = otcMarketBussinessEntity.getNikename();
+            otcAppealInfoVo.setNikename(nikename);
+        }
+        return otcAppealInfoVo;
+    }
+
+    @Override
+    public OtcOrderEntity otcOrderInfo(long id) {
+        OtcOrderEntity otcOrderEntity = otcOrderMapper.selectById(id);
+        return otcOrderEntity;
+    }
+
+    @Override
+    @Transactional
+    public FebsResponse updateOrderInfo(OtcOrderEntity otcOrderEntity) {
+        Long id = otcOrderEntity.getId();
+        OtcOrderEntity otcOrder = otcOrderMapper.selectById(id);
+        if(ObjectUtil.isEmpty(otcOrder)){
+            return new FebsResponse().fail().message("连接超时,请刷新页面重试");
+        }
+        Integer status = otcOrder.getStatus();
+        if(OtcOrderEntity.STATUS_ONE != status){
+            return new FebsResponse().fail().message("当前订单不是待付款状态");
+        }
+        String payName = otcOrderEntity.getPayName();
+        if(StrUtil.isEmpty(payName)){
+            return new FebsResponse().fail().message("请输入付款人");
+        }
+        BigDecimal coinAmount = otcOrderEntity.getCoinAmount();
+        /**
+         * 获取订单信息--订单编号
+         *      获取买单和买单
+         *      更新payName字段
+         *      更新订单状态
+         */
+        QueryWrapper<OtcOrderEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("order_no",otcOrder.getOrderNo());
+        List<OtcOrderEntity> list = otcOrderMapper.selectList(queryWrapper);
+        if(CollUtil.isNotEmpty(list)){
+            for(OtcOrderEntity order : list){
+                order.setStatus(OtcOrderEntity.STATUS_TWO);
+                order.setPayName(payName);
+                order.setPayTime(DateUtil.date());
+                otcOrderMapper.updateById(order);
+            }
+        }
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public OtcMarketBussinessEntity otcHuiKuan(long id) {
+        return otcMarketBussinessMapper.selectById(id);
+    }
+
+    @Override
+    @Transactional
+    public FebsResponse otcHuiKuan(OtcMarketBussinessEntity otcMarketBussinessEntity) {
+        Long id = otcMarketBussinessEntity.getId();
+        OtcMarketBussinessEntity otcMarketBussiness = otcMarketBussinessMapper.selectById(id);
+        if(ObjectUtil.isNotEmpty(otcMarketBussiness)){
+            return new FebsResponse().fail().message("连接超时,请刷新页面重试");
+        }
+        BigDecimal coinAmount = otcMarketBussinessEntity.getCoinAmount();
+        if(coinAmount.compareTo(BigDecimal.ZERO) <= 0){
+            return new FebsResponse().fail().message("请输入正确的回款金额");
+        }
+        BigDecimal waitBackMoney = otcMarketBussiness.getWaitBackMoney();
+        if(coinAmount.compareTo(waitBackMoney) > 0){
+            return new FebsResponse().fail().message("请输入正确的回款金额");
+        }
+        /**
+         * 增加已回款金额
+         * 减少待回款金额
+         * 增加汇款记录
+         */
+        BigDecimal hasBackMoney = otcMarketBussiness.getHasBackMoney();
+        BigDecimal add = hasBackMoney.add(coinAmount);
+        otcMarketBussiness.setHasBackMoney(add);
+
+        BigDecimal subtract = waitBackMoney.subtract(coinAmount);
+        otcMarketBussiness.setWaitBackMoney(subtract);
+        otcMarketBussinessMapper.updateById(otcMarketBussiness);
+
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public IPage<OtcSettingEntity> otcSettingList(OtcSettingEntity otcSettingEntity, QueryRequest request) {
+        Page<OtcSettingEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<OtcSettingEntity> otcSettingEntitys = otcSettingMapper.otcSettingList(page, otcSettingEntity);
+        return otcSettingEntitys;
+    }
+
+    @Override
+    public OtcSettingEntity otcSettingUpdate(long id) {
+        return otcSettingMapper.selectById(id);
+    }
+
+    @Override
+    public FebsResponse updateOtcSetting(OtcSettingEntity otcSettingEntity) {
+        Integer orderNum = otcSettingEntity.getOrderNum();
+        if(ObjectUtil.isEmpty(orderNum) || orderNum < 0){
+            return new FebsResponse().fail().message("请设置正确的总单数");
+        }
+        BigDecimal completionRate = otcSettingEntity.getCompletionRate();
+        if(ObjectUtil.isEmpty(completionRate) || completionRate.compareTo(BigDecimal.ZERO) < 0){
+            return new FebsResponse().fail().message("请设置正确的完成率");
+        }
+        BigDecimal totalAmount = otcSettingEntity.getTotalAmount();
+        if(ObjectUtil.isEmpty(totalAmount) || totalAmount.compareTo(BigDecimal.ZERO) < 0){
+            return new FebsResponse().fail().message("请设置正确的总金额");
+        }
+
+        Integer cancellNum = otcSettingEntity.getCancellNum();
+        if(ObjectUtil.isEmpty(cancellNum) || cancellNum < 0){
+            return new FebsResponse().fail().message("请设置正确的取消次数");
+        }
+        otcSettingMapper.updateById(otcSettingEntity);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int reduceCoin(Long id) {
+        OtcOrderEntity order = otcOrderMapper.selectById(id);
+
+        MemberWalletCoinEntity saleWallet = memberWalletCoinMapper.findWalletCoinByMemberIdAndWalletCode(order.getMemberId(), "USDT");
+        MemberWalletCoinEntity buyWallet = memberWalletCoinMapper.findWalletCoinByMemberIdAndWalletCode(order.getOppositeMemberId(), "USDT");
+
+        memberWalletCoinMapper.updateBlockBalance(order.getCoinAmount(), buyWallet.getId());
+        memberWalletCoinMapper.reduceFrozenBalance(order.getCoinAmount(), saleWallet.getId());
+
+        otcOrderMapper.updateOrderStatusByOrderNo(OtcOrderEntity.STATUS_THREE, order.getOrderNo());
+        return 1;
+    }
+
+    @Override
+    public OtcEntrustOrderEntity otcEntrustListUpdate(long id) {
+        return otcEntrustOrderMapper.selectById(id);
+    }
+
+    @Override
+    public FebsResponse otcEntrustConfirm(OtcEntrustOrderEntity otcEntrustOrderEntity) {
+        Long id = otcEntrustOrderEntity.getId();
+        OtcEntrustOrderEntity otcEntrustOrder = otcEntrustOrderMapper.selectById(id);
+        BigDecimal unitPrice = otcEntrustOrderEntity.getUnitPrice();
+        if(ObjectUtil.isEmpty(unitPrice) || unitPrice.compareTo(BigDecimal.ZERO) < 0){
+            return new FebsResponse().fail().message("请设置正确的单价");
+        }
+        otcEntrustOrder.setUnitPrice(unitPrice);
+        BigDecimal coinAmount = otcEntrustOrderEntity.getCoinAmount();
+        if(ObjectUtil.isEmpty(coinAmount) || coinAmount.compareTo(BigDecimal.ZERO) < 0){
+            return new FebsResponse().fail().message("请设置正确的数量");
+        }
+        otcEntrustOrder.setCoinAmount(coinAmount);
+        BigDecimal totalAmount = coinAmount.multiply(unitPrice);
+        otcEntrustOrder.setTotalAmount(totalAmount);
+
+        BigDecimal remainCoinAmount = otcEntrustOrderEntity.getRemainCoinAmount();
+        if(ObjectUtil.isEmpty(remainCoinAmount) || remainCoinAmount.compareTo(BigDecimal.ZERO) < 0
+                || totalAmount.compareTo(remainCoinAmount) < 0){
+            return new FebsResponse().fail().message("请设置正确的剩余数量");
+        }
+        otcEntrustOrder.setRemainCoinAmount(remainCoinAmount);
+        BigDecimal limitMinAmount = otcEntrustOrderEntity.getLimitMinAmount();
+        if(ObjectUtil.isEmpty(limitMinAmount) || limitMinAmount.compareTo(BigDecimal.ZERO) < 0){
+            return new FebsResponse().fail().message("请设置正确的最小限额");
+        }
+        otcEntrustOrder.setLimitMinAmount(limitMinAmount);
+        BigDecimal limitMaxAmount = otcEntrustOrderEntity.getLimitMaxAmount();
+        if(ObjectUtil.isEmpty(limitMaxAmount) || limitMaxAmount.compareTo(BigDecimal.ZERO) < 0
+                || limitMaxAmount.compareTo(limitMinAmount) < 0 || totalAmount.compareTo(limitMaxAmount) < 0){
+            return new FebsResponse().fail().message("请设置正确的最大限额");
+        }
+        otcEntrustOrder.setLimitMaxAmount(limitMaxAmount);
+        otcEntrustOrder.setStatus(otcEntrustOrderEntity.getStatus());
+        otcEntrustOrderMapper.updateById(otcEntrustOrder);
+
+        return new FebsResponse().success();
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/otc/vo/OtcAppealInfoVo.java b/src/main/java/com/xcong/excoin/modules/otc/vo/OtcAppealInfoVo.java
new file mode 100644
index 0000000..b8520f4
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/otc/vo/OtcAppealInfoVo.java
@@ -0,0 +1,59 @@
+package com.xcong.excoin.modules.otc.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel(value = "OtcAppealInfoVo", description = "参数返回类")
+public class OtcAppealInfoVo {
+
+    private long id;
+
+    //订单编号
+    private String orderNo;
+
+    //单价
+    private BigDecimal unitPrice;
+
+    //交易数量
+    private BigDecimal coinAmount;
+
+    //交易总额
+    private BigDecimal totalAmount;
+
+    //订单状态 1-已提交未付款2-已付款3-已完成4-已取消
+    private Integer status;
+    public static final Integer STATUS_ONE = 1;
+    public static final Integer STATUS_TWO = 2;
+    public static final Integer STATUS_THREE = 3;
+    public static final Integer STATUS_FOUR = 4;
+
+    //付款时间
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date payTime;
+
+    //完成时间
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date finishTime;
+
+
+    //昵称
+    private String nikename;
+
+
+
+    //申诉原因
+    private String reason;
+
+    //申诉图片
+    private List<String> content;
+
+
+}
diff --git a/src/main/resources/mapper/modules/FollowFollowerProfitMapper.xml b/src/main/resources/mapper/modules/FollowFollowerProfitMapper.xml
new file mode 100644
index 0000000..148f975
--- /dev/null
+++ b/src/main/resources/mapper/modules/FollowFollowerProfitMapper.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.documentary.mapper.FollowFollowerProfitMapper">
+    <select id="findFollowFollowerProfitInfo" resultType="com.xcong.excoin.modules.documentary.vo.SeeFollowerInfoVo">
+        select * from follow_follower_profit s left join member m on m.id = s.member_id
+        where s.trade_id = #{record.id} and s.trade_member_id = #{record.memberId}
+        order by s.create_time desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/FollowTraderInfoMapper.xml b/src/main/resources/mapper/modules/FollowTraderInfoMapper.xml
index aaffab4..0c7e880 100644
--- a/src/main/resources/mapper/modules/FollowTraderInfoMapper.xml
+++ b/src/main/resources/mapper/modules/FollowTraderInfoMapper.xml
@@ -2,19 +2,31 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xcong.excoin.modules.documentary.mapper.FollowTraderInfoMapper">
 
-	<select id="findTraderListInPage" resultType="com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity">
-         select * from follow_trader_info s left join member m on m.id = s.member_id
-		 <where>
-			<if test="record != null" >
+    <select id="findTraderListInPage" resultType="com.xcong.excoin.modules.documentary.entity.FollowTraderInfoEntity">
+        select * from follow_trader_info s left join member m on m.id = s.member_id
+        <where>
+            <if test="record != null" >
                 <if test="record.account!=null and record.account!=''">
-                     and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
+                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                 </if>
                 <if test="record.verifyStatus!=null and record.verifyStatus!=''">
                     and s.verify_status= #{record.verifyStatus}
                 </if>
             </if>
-		</where>
-		order by s.create_time desc	
-	</select>
-    
+        </where>
+        order by s.create_time desc
+    </select>
+
+    <select id="selectFollowNowBytraderId" resultType="java.lang.String">
+        select COUNT(a.id) from follow_follower_setting a where a.trader_id = #{traderId}
+    </select>
+
+    <select id="selectProfitRatioTotal" resultType="java.lang.String">
+        select IFNULL(SUM(f.amount),'0') as amount from follow_trader_profit_detail f where f.member_id = #{memberId}
+    </select>
+
+    <select id="selectAllProfitByMemberIdAndTraderMemberId" resultType="java.lang.String">
+        select IFNULL(SUM(f.amount),'0') as amount from follow_trader_profit_detail f where f.member_id = #{traderMemberId} and f.follow_member_id = #{memberId}
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/FollowTraderLabelMapper.xml b/src/main/resources/mapper/modules/FollowTraderLabelMapper.xml
new file mode 100644
index 0000000..04b1142
--- /dev/null
+++ b/src/main/resources/mapper/modules/FollowTraderLabelMapper.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.documentary.mapper.FollowTraderLabelMapper">
+
+	<select id="findFollowTraderLabelEntitysInPage" resultType="com.xcong.excoin.modules.documentary.entity.FollowTraderLabelEntity">
+         select * from follow_trader_label s
+	</select>
+    
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/FollowTraderProfitInfoMapper.xml b/src/main/resources/mapper/modules/FollowTraderProfitInfoMapper.xml
index 6047e9b..8ec5c96 100644
--- a/src/main/resources/mapper/modules/FollowTraderProfitInfoMapper.xml
+++ b/src/main/resources/mapper/modules/FollowTraderProfitInfoMapper.xml
@@ -2,5 +2,18 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xcong.excoin.modules.documentary.mapper.FollowTraderProfitInfoMapper">
 
-    
+    <select id="findTraderProfitInfoInfoInPage" resultType="com.xcong.excoin.modules.documentary.entity.FollowTraderProfitInfoEntity">
+        select * from follow_trader_profit_info t
+        left join follow_trader_info s on s.id = t.trader_id
+        left join member m on m.id = t.member_id
+        <where>
+            <if test="record != null" >
+                <if test="record.account!=null and record.account!=''">
+                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
+                </if>
+            </if>
+        </where>
+        order by s.create_time desc
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MemberMapper.xml b/src/main/resources/mapper/modules/MemberMapper.xml
index 09f23da..5bd1daa 100644
--- a/src/main/resources/mapper/modules/MemberMapper.xml
+++ b/src/main/resources/mapper/modules/MemberMapper.xml
@@ -1512,5 +1512,13 @@
 						or m.phone = #{address}
 						or m.email = #{address}
 	</select>
-	
+
+	<select id="selectMemberWalletContractByMemberId" resultType="java.lang.String">
+		SELECT
+			total_balance
+		FROM
+			member_wallet_contract where member_id = #{memberId}
+	</select>
+
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MemberWalletCoinMapper.xml b/src/main/resources/mapper/modules/MemberWalletCoinMapper.xml
index 5980ed9..64fcaaa 100644
--- a/src/main/resources/mapper/modules/MemberWalletCoinMapper.xml
+++ b/src/main/resources/mapper/modules/MemberWalletCoinMapper.xml
@@ -7,4 +7,20 @@
         select * from member_wallet_coin where member_id = #{memberId} and wallet_code = #{walletCode}
     </select>
 
+
+    <update id="updateBlockBalance">
+        update member_wallet_coin
+        set
+            available_balance = IFNULL(available_balance, 0) + #{availableBalance},
+            total_balance = IFNULL(total_balance, 0) + #{availableBalance}
+        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
diff --git a/src/main/resources/mapper/modules/OtcEntrustOrderMapper.xml b/src/main/resources/mapper/modules/OtcEntrustOrderMapper.xml
new file mode 100644
index 0000000..203aa55
--- /dev/null
+++ b/src/main/resources/mapper/modules/OtcEntrustOrderMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.otc.mapper.OtcEntrustOrderMapper">
+
+    <select id="otcEntrustList" resultType="com.xcong.excoin.modules.otc.entity.OtcEntrustOrderEntity">
+        SELECT
+        *,
+        concat(b.first_name,b.second_name) realName
+        FROM
+        otc_entrust_order a
+        LEFT JOIN member m ON m.id = a.member_id
+        LEFT JOIN member_authentication b ON b.member_id = a.member_id
+        <where>
+            <if test="record != null" >
+                <if test="record.account!=null and record.account!=''">
+                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
+                </if>
+                <if test="record.orderType!=null and record.orderType!=''">
+                    and a.order_type= #{record.orderType}
+                </if>
+                <if test="record.status!=null and record.status!=''">
+                    and a.status= #{record.status}
+                </if>
+            </if>
+        </where>
+        order by m.create_time desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/OtcMarketBussinessMapper.xml b/src/main/resources/mapper/modules/OtcMarketBussinessMapper.xml
new file mode 100644
index 0000000..a965248
--- /dev/null
+++ b/src/main/resources/mapper/modules/OtcMarketBussinessMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.otc.mapper.OtcMarketBussinessMapper">
+
+    <select id="otcShopList" resultType="com.xcong.excoin.modules.otc.entity.OtcMarketBussinessEntity">
+        SELECT
+        *,
+        concat(b.first_name,b.second_name) realName
+        FROM
+        otc_market_bussiness a
+        LEFT JOIN member m ON m.id = a.member_id
+        LEFT JOIN member_authentication b ON b.member_id = a.member_id
+        <where>
+            <if test="record != null" >
+                <if test="record.account!=null and record.account!=''">
+                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
+                </if>
+                <if test="record.status!=null and record.status!=''">
+                    and a.status= #{record.status}
+                </if>
+            </if>
+        </where>
+        order by m.create_time desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/OtcOrderAppealMapper.xml b/src/main/resources/mapper/modules/OtcOrderAppealMapper.xml
new file mode 100644
index 0000000..53c6158
--- /dev/null
+++ b/src/main/resources/mapper/modules/OtcOrderAppealMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.otc.mapper.OtcOrderAppealMapper">
+
+    <select id="otcAppealList" resultType="com.xcong.excoin.modules.otc.entity.OtcOrderAppealEntity">
+        SELECT
+        *,
+        concat(b.first_name,b.second_name) realName
+        FROM
+        otc_order_appeal a
+        LEFT JOIN member m ON m.id = a.member_id
+        LEFT JOIN member_authentication b ON b.member_id = a.member_id
+        LEFT JOIN otc_order c ON c.id = a.order_id
+        <where>
+            <if test="record != null" >
+                <if test="record.account!=null and record.account!=''">
+                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
+                </if>
+                <if test="record.status!=null and record.status!=''">
+                    and a.status= #{record.status}
+                </if>
+            </if>
+        </where>
+        order by m.create_time desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/OtcOrderMapper.xml b/src/main/resources/mapper/modules/OtcOrderMapper.xml
new file mode 100644
index 0000000..4b9b5b6
--- /dev/null
+++ b/src/main/resources/mapper/modules/OtcOrderMapper.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.otc.mapper.OtcOrderMapper">
+
+    <select id="otcOrderList" resultType="com.xcong.excoin.modules.otc.entity.OtcOrderEntity">
+        SELECT
+        *,
+        concat(b.first_name,b.second_name) realName
+        FROM
+        otc_order a
+        LEFT JOIN member m ON m.id = a.member_id
+        LEFT JOIN member_authentication b ON b.member_id = a.member_id
+        <where>
+            <if test="record != null" >
+                <if test="record.account!=null and record.account!=''">
+                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
+                </if>
+                <if test="record.status!=null and record.status!=''">
+                    and a.status= #{record.status}
+                </if>
+            </if>
+        </where>
+        order by a.create_time desc
+    </select>
+
+    <update id="updateOrderStatusByOrderNo">
+        update otc_order
+            set status=#{status}
+        where order_no=#{orderNo}
+    </update>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/OtcSettingMapper.xml b/src/main/resources/mapper/modules/OtcSettingMapper.xml
new file mode 100644
index 0000000..e9a517e
--- /dev/null
+++ b/src/main/resources/mapper/modules/OtcSettingMapper.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xcong.excoin.modules.otc.mapper.OtcSettingMapper">
+
+    <select id="otcSettingList" resultType="com.xcong.excoin.modules.otc.entity.OtcSettingEntity">
+        SELECT
+        *
+        FROM
+        otc_setting
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/followLabelSet.html b/src/main/resources/templates/febs/views/modules/documentary/followLabelSet.html
new file mode 100644
index 0000000..3becc3a
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/documentary/followLabelSet.html
@@ -0,0 +1,127 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-user" lay-title="交易员标签">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+	                <form class="layui-form layui-table-form" lay-filter="user-table-form">
+	                        <div class="layui-row">
+	                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+	                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="add">
+	                                	新增
+	                                </div>
+	                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+	                                	<i class="layui-icon">&#xe79b;</i>
+	                                </div>
+	                            </div>
+	                        </div>
+	                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+	<span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+	<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit" shiro:hasPermission="user:update">编辑
+		<i class="layui-icon febs-edit-area febs-blue"></i>
+	</button>
+	<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="delete" shiro:hasPermission="user:update">删除
+		<i class="layui-icon febs-edit-area febs-blue"></i>
+	</button>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            laydate = layui.laydate,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            dropdown = layui.dropdown,
+            $view = $('#febs-user'),
+            $reset = $view.find('#reset'),
+            $add = $view.find('#add'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'title', type: null},
+            tableIns
+            ;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            
+            if (layEvent === 'edit') {
+                febs.modal.open('修改', 'modules/documentary/followLabelSetUpdate/' + data.id, {
+                    btn: ['提交', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+            if (layEvent === 'delete') {
+                febs.modal.confirm('删除', '您是否确认删除?', function () {
+                	deleteUsers(data.id);
+                });
+            }
+        });
+        
+        function deleteUsers(id) {
+            febs.get(ctx + 'documentary/traderLabelDelete/' + id, null, function () {
+            	febs.alert.success('确认删除');
+                $reset.click();
+            });
+        }
+        
+     	// 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+     	
+        $add.on('click', function () {
+        	febs.modal.open('新增', 'modules/documentary/followLabelSetAdd/', {
+                btn: ['提交', '取消'],
+                yes: function (index, layero) {
+                    $('#user-add').find('#submit').trigger('click');
+                },
+                btn2: function () {
+                    layer.closeAll();
+                }
+            });
+        });
+
+     	
+     	// 获取查询参数
+        function getQueryParams() {
+            return {};
+        }
+        
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'documentary/traderLabelList',
+                cols: [[
+                	{field: 'id', title: '', minWidth: 10,align:'center'},
+                	{field: 'labels', title: '更新内容', minWidth: 120,align:'center'},
+                    {title: '操作', toolbar: '#user-option', minWidth: 140, fixed : 'right'}
+                ]]
+            });
+        }
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/followLabelSetAdd.html b/src/main/resources/templates/febs/views/modules/documentary/followLabelSetAdd.html
new file mode 100644
index 0000000..5fbf557
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/documentary/followLabelSetAdd.html
@@ -0,0 +1,67 @@
+<style>
+    #user-add {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-add .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-add #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-add">
+    <form class="layui-form" action="" lay-filter="user-add-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">标签内容:</label>
+            <div class="layui-input-block">
+                <input type="text" name="labels" lay-verify="range|labels" 
+                		autocomplete="off" class="layui-input" >
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-add-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            $view = $('#user-add'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        formSelects.render();
+
+        form.on('submit(user-add-form-submit)', function (data) {
+            febs.post(ctx + 'documentary/followLabelSetAdd', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('新增成功');
+                $('#febs-user').find('#reset').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/followLabelSetDetail.html b/src/main/resources/templates/febs/views/modules/documentary/followLabelSetDetail.html
new file mode 100644
index 0000000..dffec7a
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/documentary/followLabelSetDetail.html
@@ -0,0 +1,77 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                 <input type="text" name="id" data-th-value="${member.id}" >
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">标签内容:</label>
+            <div class="layui-input-block">
+                <input type="text" name="labels" data-th-id="${member.labels}"  lay-verify="range|labels" 
+                		autocomplete="off" class="layui-input" >
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "labels": member.labels,
+                "id": member.id
+            });
+        }
+
+        form.on('submit(user-update-form-submit)', function (data) {
+            febs.post(ctx + 'documentary/followLabelSetUpdate', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('设置成功');
+                $('#febs-user').find('#reset').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/modifyProfitRatio.html b/src/main/resources/templates/febs/views/modules/documentary/modifyProfitRatio.html
new file mode 100644
index 0000000..0f99626
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/documentary/modifyProfitRatio.html
@@ -0,0 +1,122 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item">
+            <div style="text-align: center;color:red">
+                利润率设置规则:只允许0到1之间的小数
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">用户id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id" data-th-value="${member.id}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">利润率:</label>
+            <div class="layui-input-block">
+                <input type="text" name="profitRatio" data-th-id="${member.profitRatio}"
+                       lay-verify="range|profitRatio" autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <div style="text-align: center;color:red">
+                最大跟随人数规则:请填写大于0的整数
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">跟随人数:</label>
+            <div class="layui-input-block">
+                <input type="text" name="followNum" data-th-id="${member.followNum}"
+                       lay-verify="range|followNum" autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">币币账户总余额:</label>
+            <div class="layui-input-block">
+                <input type="text" name="walletNum" minlength="4" maxlength="10" data-th-id="${member.walletNum}"
+                       lay-verify="range|walletNum" autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">合约账户总余额:</label>
+            <div class="layui-input-block">
+                <input type="text" name="walletCoinNum" minlength="4" maxlength="10" data-th-id="${member.walletCoinNum}"
+                       lay-verify="range|walletCoinNum" autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">币币账户总余额:</label>
+            <div class="layui-input-block">
+                <input type="text" name="agentNum" minlength="4" maxlength="10" data-th-id="${member.agentNum}"
+                       lay-verify="range|agentNum" autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "id": member.id,
+                "profitRatio": member.profitRatio,
+                "realName": member.realName,
+                "phone": member.phone,
+                "email": member.email,
+                "agentNum": member.agentNum,
+                "walletCoinNum": member.walletCoinNum,
+                "walletNum": member.walletNum,
+                "followNum": member.followNum
+            });
+        }
+
+        form.on('submit(user-update-form-submit)', function (data) {
+            febs.post(ctx + 'documentary/modifyProfitRatio', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('修改成功');
+                $('#febs-user').find('#query').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/seeFollowerInfo.html b/src/main/resources/templates/febs/views/modules/documentary/seeFollowerInfo.html
new file mode 100644
index 0000000..28d12ed
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/documentary/seeFollowerInfo.html
@@ -0,0 +1,58 @@
+
+<div class="layui-fluid layui-anim febs-anim" id="febs-user-child" lay-title="跟单数据详情">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <table lay-filter="userTableChild" lay-data="{id: 'userTableChild'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script data-th-inline="none" type="text/javascript">
+    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect' ,'eleTree'], function () {
+        var $ = layui.jquery,
+            laydate = layui.laydate,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            treeSelect = layui.treeSelect,
+            dropdown = layui.dropdown,
+            $view = $('#febs-user-child'),
+            $query = $view.find('#queryChild'),
+            $searchForm = $view.find('formChild'),
+            sortObject = {field: 'createTime', type: null},
+            tableIns,
+            createTimeFrom,
+            createTimeTo;
+
+        form.render();
+
+        initTable();
+
+        laydate.render({
+            elem: '#user-createTime',
+            range: true,
+            trigger: 'click'
+        });
+
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'documentary/seeFollowerInfo?parentId=1',
+                cols: [[
+                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
+                    {field: 'email', title: '邮箱', minWidth: 100,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
+                    {field: 'contractTotal', title: '合约账户总资产', minWidth: 150,align:'left'},
+                    {field: 'profitTotal', title: '总返利金额', minWidth: 150,align:'center'},
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/traderDetail.html b/src/main/resources/templates/febs/views/modules/documentary/traderDetail.html
index a8af392..cd059e7 100644
--- a/src/main/resources/templates/febs/views/modules/documentary/traderDetail.html
+++ b/src/main/resources/templates/febs/views/modules/documentary/traderDetail.html
@@ -19,6 +19,11 @@
 </style>
 <div class="layui-fluid" id="user-update">
     <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item">
+            <div style="text-align: center;color:red">
+                利润率设置规则:只允许0到1之间的小数
+            </div>
+        </div>
         <div class="layui-form-item febs-hide">
             <label class="layui-form-label febs-form-item-require">用户id:</label>
             <div class="layui-input-block">
@@ -28,8 +33,8 @@
         <div class="layui-form-item">
             <label class="layui-form-label">利润率:</label>
             <div class="layui-input-block">
-                <input type="text" name="profitRatio" minlength="4" maxlength="10" data-th-id="${member.profitRatio}"
-                       lay-verify="range|profitRatio" autocomplete="off" class="layui-input" readonly>
+                <input type="text" name="profitRatio" data-th-id="${member.profitRatio}"
+                       lay-verify="range|profitRatio" autocomplete="off" class="layui-input">
             </div>
         </div>
         <div class="layui-form-item">
diff --git a/src/main/resources/templates/febs/views/modules/documentary/traderProfit.html b/src/main/resources/templates/febs/views/modules/documentary/traderProfit.html
new file mode 100644
index 0000000..aa7f12d
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/documentary/traderProfit.html
@@ -0,0 +1,209 @@
+<div class="layui-fluid layui-anim febs-anim" id="trader-profit" lay-title="交易员利润分成">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="手机号/邮箱/邀请码" name="account" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#trader-profit'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+
+            if (layEvent === 'edit') {
+                febs.modal.open('交易员审核', 'modules/documentary/traderDetail/' + data.id, {
+                    btn: ['确认', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'seeFollowerInfo') {
+                febs.modal.open('跟随者详情', 'modules/documentary/seeFollowerInfo/' + data.id, {
+                    area: $(window).width() <= 750 ? '90%' : '80%',
+                    offset: '30px',
+                    btn2: function () {
+                        layer.closeAll();
+                    },
+                    cancel: function(){
+                        var index=parent.layer.getFrameIndex(window.name); //获取当前窗口的name
+                        parent.layer.close(index);//关闭当前窗口
+                        window.parent.location.reload();//刷新
+                    }
+                });
+                $query.click();
+            }
+            if (layEvent === 'modifyProfitRatio') {
+                febs.modal.open('收益率修改', 'modules/documentary/modifyProfitRatio/' + data.id, {
+                    btn: ['确认', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+                $query.click();
+            }
+            if (layEvent === 'getOut') {
+                febs.modal.confirm('确认', '您是否要踢出该交易员?', function () {
+                    confirmUsers(data.id);
+                });
+            }
+            if (layEvent === 'getOn') {
+                febs.modal.confirm('确认', '您是否推荐当前交易员?', function () {
+                    confirmUsersGetOn(data.id);
+                });
+            }
+            if (layEvent === 'getOutFrist') {
+                febs.modal.confirm('确认', '您是否取消推荐当前交易员?', function () {
+                    confirmUsersGetOutFrist(data.id);
+                });
+            }
+            if (layEvent === 'getFull') {
+                febs.modal.confirm('确认', '您是否要设置成【满员】状态?', function () {
+                    cancelUsers(data.id);
+                });
+            }
+        });
+
+        function confirmUsers(id) {
+            febs.get(ctx + 'documentary/traderGetOut/' + id, null, function () {
+                febs.alert.success('踢出成功');
+                $query.click();
+            });
+        }
+        function confirmUsersGetOn(id) {
+            febs.get(ctx + 'documentary/traderGetOn/' + id, null, function () {
+                febs.alert.success('设置成功');
+                $query.click();
+            });
+        }
+        function confirmUsersGetOutFrist(id) {
+            febs.get(ctx + 'documentary/traderGetOutFrist/' + id, null, function () {
+                febs.alert.success('设置成功');
+                $query.click();
+            });
+        }
+        function cancelUsers(id) {
+            febs.get(ctx + 'documentary/traderGetFull/' + id, null, function () {
+                febs.alert.success('设置成功');
+                $query.click();
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'documentary/traderProfitInfo',
+                cols: [[
+                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
+                    {field: 'profitRatio', title: '利润率', minWidth: 80,align:'center'},
+                    {field: 'profitRatioTotal', title: '总返利润', minWidth: 80,align:'center'},
+                    {title: '利润详情',
+                        templet: function (d) {
+                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeFollowerInfo" shiro:hasPermission="user:update">查看</button>'
+                        }, minWidth: 100,align:'center'},
+                    {field: 'totalProfitRatio', title: '累计收益率', minWidth: 80,align:'center'},
+                    {field: 'totalProfit', title: '带单总收益', minWidth: 80,align:'center'},
+                    {field: 'followerTotalProfit', title: '跟随者总收益', minWidth: 80,align:'center'},
+                    {field: 'winRate', title: '胜率', minWidth: 80,align:'center'},
+                    {field: 'totalFollowerCnt', title: '累计跟随人数', minWidth: 80,align:'center'},
+                    {field: 'totalOrderCnt', title: '交易笔数', minWidth: 80,align:'center'},
+                    {field: 'accountType', title: '账号类型',
+                        templet: function (d) {
+                            if (d.accountType === 2) {
+                                return '<span style="color:green;">测试账号</span>'
+                            } else if (d.accountType === 1) {
+                                return '<span style="color:red;">正常账号</span>'
+                            }else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {field: 'email', title: '邮箱', minWidth: 100,align:'left'},
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                account: $searchForm.find('input[name="account"]').val().trim(),
+            };
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/documentary/traderUpdate.html b/src/main/resources/templates/febs/views/modules/documentary/traderUpdate.html
index 5ed47b1..5cd48cd 100644
--- a/src/main/resources/templates/febs/views/modules/documentary/traderUpdate.html
+++ b/src/main/resources/templates/febs/views/modules/documentary/traderUpdate.html
@@ -17,8 +17,9 @@
                                         <div class="layui-input-inline">
                                             <select name="verifyStatus">
                                                 <option value="">请选择</option>
-                                                <option value="1">待审核</option>
-                                                <option value="2">审核通过</option>
+                                                <option value="1">审核通过</option>
+                                                <option value="2">审核不通过</option>
+                                                <option value="3">待审核</option>
                                             </select>
                                         </div>
                                     </div>
@@ -72,7 +73,7 @@
         table.on('tool(userTable)', function (obj) {
             var data = obj.data,
                 layEvent = obj.event;
-            
+
             if (layEvent === 'edit') {
                 febs.modal.open('交易员审核', 'modules/documentary/traderDetail/' + data.id, {
                     btn: ['确认', '取消'],
@@ -84,31 +85,64 @@
                     }
                 });
             }
+            if (layEvent === 'modifyProfitRatio') {
+                febs.modal.open('修改', 'modules/documentary/modifyProfitRatio/' + data.id, {
+                    btn: ['确认', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
             if (layEvent === 'getOut') {
                 febs.modal.confirm('确认', '您是否要踢出该交易员?', function () {
-                	confirmUsers(data.id);
+                    confirmUsers(data.id);
+                });
+            }
+            if (layEvent === 'getOn') {
+                febs.modal.confirm('确认', '您是否推荐当前交易员?', function () {
+                    confirmUsersGetOn(data.id);
+                });
+            }
+            if (layEvent === 'getOutFrist') {
+                febs.modal.confirm('确认', '您是否取消推荐当前交易员?', function () {
+                    confirmUsersGetOutFrist(data.id);
                 });
             }
             if (layEvent === 'getFull') {
                 febs.modal.confirm('确认', '您是否要设置成【满员】状态?', function () {
-                	cancelUsers(data.id);
+                    cancelUsers(data.id);
                 });
             }
         });
-        
+
         function confirmUsers(id) {
             febs.get(ctx + 'documentary/traderGetOut/' + id, null, function () {
-            	febs.alert.success('踢出成功');
+                febs.alert.success('踢出成功');
+                $query.click();
+            });
+        }
+        function confirmUsersGetOn(id) {
+            febs.get(ctx + 'documentary/traderGetOn/' + id, null, function () {
+                febs.alert.success('设置成功');
+                $query.click();
+            });
+        }
+        function confirmUsersGetOutFrist(id) {
+            febs.get(ctx + 'documentary/traderGetOutFrist/' + id, null, function () {
+                febs.alert.success('设置成功');
                 $query.click();
             });
         }
         function cancelUsers(id) {
             febs.get(ctx + 'documentary/traderGetFull/' + id, null, function () {
-            	febs.alert.success('设置成功');
+                febs.alert.success('设置成功');
                 $query.click();
             });
         }
-        
+
 
         // 查询按钮
         $query.on('click', function () {
@@ -129,12 +163,15 @@
                 url: ctx + 'documentary/traderList',
                 cols: [[
                     {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
-                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
-                    {field: 'realName', title: '姓名', minWidth: 200,align:'left'},
+                    {field: 'email', title: '邮箱', minWidth: 100,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'nickname', title: '昵称', minWidth: 100,align:'left'},
                     {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                     {field: 'profitRatio', title: '利润率', minWidth: 80,align:'center'},
+                    {field: 'followNumNow', title: '当前跟随人数', minWidth: 120,align:'center'},
+                    {field: 'followNum', title: '最大跟随人数', minWidth: 120,align:'center'},
                     {field: 'accountType', title: '账号类型',
-                    	templet: function (d) {
+                        templet: function (d) {
                             if (d.accountType === 2) {
                                 return '<span style="color:green;">测试账号</span>'
                             } else if (d.accountType === 1) {
@@ -144,29 +181,36 @@
                             }
                         }, minWidth: 80,align:'center'},
                     {field: 'verifyStatus', title: '审核状态',
-                            	templet: function (d) {
-                                    if (d.verifyStatus === 1) {
-                                        return '<span style="color:blue;">审核通过</span>'
-                                    } else if (d.verifyStatus === 2) {
-                                        return '<span style="color:green;">不通过</span>'
-                                    } else if (d.verifyStatus === 3) {
-                                        return '<span>待审核</span>'
-                                    }else{
-                                        return ''
-                                    }
-                                }, minWidth: 80,align:'center'},
+                        templet: function (d) {
+                            if (d.verifyStatus === 1) {
+                                return '<span style="color:blue;">审核通过</span>'
+                            } else if (d.verifyStatus === 2) {
+                                return '<span style="color:green;">不通过</span>'
+                            } else if (d.verifyStatus === 3) {
+                                return '<span>待审核</span>'
+                            }else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
                     {field: 'createTime', title: '注册时间', minWidth: 180,align:'center'},
-                    {title: '操作', 
-                    	templet: function (d) {
+                    {title: '操作',
+                        templet: function (d) {
                             if (d.verifyStatus === 3) {
-                            	return '<a lay-event="edit" shiro:hasPermission="user:update">审核</a>'
-                            }else if(d.verifyStatus === 1){
-                            	return '<a lay-event="getOut" shiro:hasPermission="user:update">踢出</a>'
-                            	return '<a lay-event="getFull" shiro:hasPermission="user:update">满员</a>'
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit" shiro:hasPermission="user:update">审核</button>'
+                            }else if(d.verifyStatus === 1 && d.isSetFrist ===1){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="modifyProfitRatio" shiro:hasPermission="user:update">修改</button>'
+                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="getOut" shiro:hasPermission="user:update">踢出</button>'
+                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="getFull" shiro:hasPermission="user:update">满员</button>'
+                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="getOutFrist" shiro:hasPermission="user:update">取消推荐</button>'
+                            }else if(d.verifyStatus === 1 && d.isSetFrist !=1){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="modifyProfitRatio" shiro:hasPermission="user:update">修改</button>'
+                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="getOut" shiro:hasPermission="user:update">踢出</button>'
+                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="getFull" shiro:hasPermission="user:update">满员</button>'
+                                    + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="getOn" shiro:hasPermission="user:update">推荐首页</button>'
                             }else {
                                 return ''
                             }
-                        },minWidth: 200,align:'center'}
+                        },minWidth: 300,align:'center'}
                 ]]
             });
         }
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcAppealInfo.html b/src/main/resources/templates/febs/views/modules/otc/otcAppealInfo.html
new file mode 100644
index 0000000..2e8d25a
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcAppealInfo.html
@@ -0,0 +1,140 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id" data-th-value="${member.id}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">订单编号:</label>
+            <div class="layui-input-block">
+                <input type="text" name="orderNo"data-th-id="${member.orderNo}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">单价:</label>
+            <div class="layui-input-block">
+                <input type="number" name="unitPrice"data-th-id="${member.unitPrice}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">交易数量:</label>
+            <div class="layui-input-block">
+                <input type="number" name="coinAmount"data-th-id="${member.coinAmount}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">交易总额:</label>
+            <div class="layui-input-block">
+                <input type="number" name="totalAmount"data-th-id="${member.totalAmount}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">订单状态:</label>
+            <div class="layui-input-block">
+                <input type="radio" name="status" value="1" title="未付款" readonly>
+                <input type="radio" name="status" value="2" title="已付款" readonly>
+                <input type="radio" name="status" value="3" title="已完成" readonly>
+                <input type="radio" name="status" value="4" title="已取消" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">付款时间:</label>
+            <div class="layui-input-block">
+                <input type="text" name="payTime"data-th-id="${member.payTime}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">完成时间:</label>
+            <div class="layui-input-block">
+                <input type="text" name="finishTime"data-th-id="${member.finishTime}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">商户昵称:</label>
+            <div class="layui-input-block">
+                <input type="text" name="nikename"data-th-id="${member.nikename}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">申诉原因:</label>
+            <div class="layui-input-block">
+                <input type="text" name="reason"data-th-id="${member.reason}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+<!--        <div class="layui-form-item">-->
+<!--            <label class="layui-form-label febs-form-item-require">申诉图片:</label>-->
+<!--            <div style="padding: 10px;">-->
+<!--            @foreach($member.content as $content)-->
+<!--            <img layer-src={{$content}} src={{$content}}-->
+<!--                 width="400px" height="224px" style="margin: 3px; border: black 2px"  ;/>-->
+<!--            @endforeach-->
+<!--        </div>-->
+<!--        </div>-->
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "orderNo": member.orderNo,
+                "unitPrice": member.unitPrice,
+                "coinAmount": member.coinAmount,
+                "totalAmount": member.totalAmount,
+                "status": member.status,
+                "payTime": member.payTime,
+                "finishTime": member.finishTime,
+                "nikename": member.nikename,
+                "reason": member.reason,
+                "content": member.content
+            });
+        }
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcAppealList.html b/src/main/resources/templates/febs/views/modules/otc/otcAppealList.html
new file mode 100644
index 0000000..8e2e7e0
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcAppealList.html
@@ -0,0 +1,173 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-user" lay-title="OTC订单申诉">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="手机号/邀请码" name="account" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label layui-form-label-sm">状态</label>
+                                        <div class="layui-input-inline">
+                                            <select name="status">
+                                                <option value="">请选择</option>
+                                                <option value="1">待处理</option>
+                                                <option value="2">处理中</option>
+                                                <option value="3">已处理</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<script id="showScreenhost" type="text/html">
+    {{# var srr=d.content.split(",");
+    for(var j in srr) { srr[j] }}
+    <div style="margin:0 10px; display:inline-block !important; display:inline;  max-width:70px; max-height:50px;">
+        <img style=" max-width:70px; max-height:50px;" src="{{srr[j]}}" />
+    </div>
+    {{# } }}
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-user'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'dealIng') {
+                // febs.modal.confirm('处理', '开始处理申诉?', function () {
+                //     dealIng(data.id);
+                // });
+                febs.modal.open( '详情', 'modules/otc/otcAppealInfo/' + data.id, {
+                    maxmin: true,
+                });
+            }
+            if (layEvent === 'dealDone') {
+                febs.modal.confirm('处理结束', '确认已处理结束?', function () {
+                    dealDone(data.id);
+                });
+            }
+        });
+        function dealIng(id) {
+            febs.get(ctx + 'otc/dealIng/' + id, null, function () {
+                febs.alert.success('成功');
+                $query.click();
+            });
+        }
+        function dealDone(id) {
+            febs.get(ctx + 'otc/dealDone/' + id, null, function () {
+                febs.alert.success('成功');
+                $query.click();
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'otc/otcAppealList',
+                cols: [[
+                    {field: 'phone', title: '手机号', minWidth: 150,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'inviteId', title: '邀请码', minWidth: 80,align:'center'},
+                    {field: 'reason', title: '申诉原因', minWidth: 80,align:'center'},
+                    {field: 'content', title: '申诉内容', minWidth: 80,templet: '#showScreenhost',align:'center'},
+                    {field: 'status', title: '状态',
+                        templet: function (d) {
+                            if (d.status === 1) {
+                                return '<span style="color:red;">待处理</span>'
+                            } else if (d.status === 2) {
+                                return '<span style="color:blue;">处理中</span>'
+                            }  else if (d.status === 3) {
+                                return '<span>已处理</span>'
+                            }else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {field: 'orderNo', title: '订单编号',minWidth: 100,align:'center'},
+                    // {field: 'nikename', title: '商户昵称',minWidth: 100,align:'center'},
+                    {title: '操作',templet: function (d) {
+                            if(d.status === 1){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealIng" shiro:hasPermission="user:update">查看详情</button>'
+                            }else if(d.status === 2){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealIng" shiro:hasPermission="user:update">查看详情</button>'
+                                +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealDone" shiro:hasPermission="user:update">已处理</button>'
+                            }else{
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealIng" shiro:hasPermission="user:update">查看详情</button>'
+                            }
+                        },minWidth: 200,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                account: $searchForm.find('input[name="account"]').val().trim(),
+                status: $searchForm.find("select[name='status']").val(),
+            };
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcEntrustList.html b/src/main/resources/templates/febs/views/modules/otc/otcEntrustList.html
new file mode 100644
index 0000000..32c82e6
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcEntrustList.html
@@ -0,0 +1,211 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-user" lay-title="委托单">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="手机号/邀请码" name="account" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label layui-form-label-sm">类型</label>
+                                        <div class="layui-input-inline">
+                                            <select name="orderType">
+                                                <option value="">请选择</option>
+                                                <option value="B">买入</option>
+                                                <option value="S">卖出</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label layui-form-label-sm">状态</label>
+                                        <div class="layui-input-inline">
+                                            <select name="status">
+                                                <option value="">请选择</option>
+                                                <option value="1">上线</option>
+                                                <option value="2">下线</option>
+                                                <option value="3">取消</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-user'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'dealIng') {
+                febs.modal.confirm('处理', '开始处理申诉?', function () {
+                    dealIng(data.id);
+                });
+            }
+            if (layEvent === 'dealDone') {
+                febs.modal.confirm('处理结束', '确认已处理结束?', function () {
+                    dealDone(data.id);
+                });
+            }
+            if (layEvent === 'editOrder') {
+                febs.modal.open('详情修改', 'modules/otc/otcEntrustListUpdate/' + data.id, {
+                    btn: ['提交', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+        function dealIng(id) {
+            febs.get(ctx + 'otc/dealIng/' + id, null, function () {
+                febs.alert.success('成功');
+                $query.click();
+            });
+        }
+        function dealDone(id) {
+            febs.get(ctx + 'otc/dealDone/' + id, null, function () {
+                febs.alert.success('成功');
+                $query.click();
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'otc/otcEntrustList',
+                cols: [[
+                    {field: 'phone', title: '手机号', minWidth: 150,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'inviteId', title: '邀请码', minWidth: 80,align:'center'},
+                    {field: 'entrustOrderNo', title: '编号', minWidth: 80,align:'center'},
+                    {field: 'orderType', title: '类型',
+                        templet: function (d) {
+                            if (d.orderType === 'B') {
+                                return '<span style="color:blue;">买入</span>'
+                            } else if (d.orderType === 'S') {
+                                return '<span style="color:green;">卖出</span>'
+                            } else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {field: 'unitPrice', title: '单价',minWidth: 100,align:'center'},
+                    {field: 'coinAmount', title: '数量',minWidth: 100,align:'center'},
+                    {field: 'totalAmount', title: '委托总金额',minWidth: 100,align:'center'},
+                    {field: 'nikename', title: '商户昵称',minWidth: 100,align:'center'},
+                    {field: 'remainCoinAmount', title: '剩余数量',minWidth: 100,align:'center'},
+                    {field: 'limitMinAmount', title: '最小限额',minWidth: 100,align:'center'},
+                    {field: 'limitMaxAmount', title: '最大限额',minWidth: 100,align:'center'},
+                    {field: 'status', title: '状态',
+                        templet: function (d) {
+                            if (d.status === 1) {
+                                return '<span style="color:blue;">上线</span>'
+                            } else if (d.status === 2) {
+                                return '<span style="color:green;">下线</span>'
+                            }else if (d.status === 3) {
+                                return '<span>取消</span>'
+                            } else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+
+                    {field: 'isMb', title: '是否市商',
+                        templet: function (d) {
+                            if (d.isMb === 1) {
+                                return '<span style="color:blue;">是</span>'
+                            } else if (d.isMb === 2) {
+                                return '<span style="color:green;">否</span>'
+                            } else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {title: '操作',templet: function (d) {
+                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="editOrder" shiro:hasPermission="user:update">详情</button>'
+                        },minWidth: 200,align:'center'}
+                    // {title: '操作',templet: function (d) {
+                    //         if(d.status === 1){
+                    //             return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealIng" shiro:hasPermission="user:update">马上处理</button>'
+                    //         }else if(d.status === 2){
+                    //             return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealDone" shiro:hasPermission="user:update">已处理</button>'
+                    //         }else{
+                    //             return ''
+                    //         }
+                    //     },minWidth: 200,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                account: $searchForm.find('input[name="account"]').val().trim(),
+                orderType: $searchForm.find("select[name='orderType']").val(),
+                status: $searchForm.find("select[name='status']").val(),
+            };
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcEntrustListUpdate.html b/src/main/resources/templates/febs/views/modules/otc/otcEntrustListUpdate.html
new file mode 100644
index 0000000..a3bd9a0
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcEntrustListUpdate.html
@@ -0,0 +1,126 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id" data-th-value="${member.id}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">单价:</label>
+            <div class="layui-input-block">
+                <input type="number" name="unitPrice" data-th-id="${member.unitPrice}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">数量:</label>
+            <div class="layui-input-block">
+                <input type="number" name="coinAmount" data-th-id="${member.coinAmount}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">剩余数量:</label>
+            <div class="layui-input-block">
+                <input type="number" name="remainCoinAmount" data-th-id="${member.remainCoinAmount}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+<!--        <div class="layui-form-item">-->
+<!--            <label class="layui-form-label febs-form-item-require">委托总金额:</label>-->
+<!--            <div class="layui-input-block">-->
+<!--                <input type="number" name="totalAmount" data-th-id="${member.totalAmount}"-->
+<!--                       autocomplete="off" class="layui-input">-->
+<!--            </div>-->
+<!--        </div>-->
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">最小限额:</label>
+            <div class="layui-input-block">
+                <input type="number" name="limitMinAmount" data-th-id="${member.limitMinAmount}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">最大限额:</label>
+            <div class="layui-input-block">
+                <input type="number" name="limitMaxAmount" data-th-id="${member.limitMaxAmount}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">状态:</label>
+            <div class="layui-input-block">
+                <input type="radio" name="status" value="1" title="上线" checked="">
+                <input type="radio" name="status" value="2" title="下线" >
+                <input type="radio" name="status" value="3" title="取消" >
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "id": member.id,
+                "unitPrice": member.unitPrice,
+                "coinAmount": member.coinAmount,
+                "remainCoinAmount": member.remainCoinAmount,
+                // "totalAmount": member.totalAmount,
+                "limitMinAmount": member.limitMinAmount,
+                "status": member.status,
+                "limitMaxAmount": member.limitMaxAmount
+            });
+        }
+
+        form.on('submit(user-update-form-submit)', function (data) {
+            febs.post(ctx + 'otc/otcEntrustConfirm', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('成功');
+                $('#febs-user').find('#query').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcHuiKuan.html b/src/main/resources/templates/febs/views/modules/otc/otcHuiKuan.html
new file mode 100644
index 0000000..6268fc5
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcHuiKuan.html
@@ -0,0 +1,93 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id" data-th-value="${member.id}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">待回款:</label>
+            <div class="layui-input-block">
+                <input type="number" name="waitBackMoney"data-th-id="${member.waitBackMoney}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">已回款:</label>
+            <div class="layui-input-block">
+                <input type="number" name="hasBackMoney"data-th-id="${member.hasBackMoney}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">交易数量:</label>
+            <div class="layui-input-block">
+                <input type="number" name="coinAmount"data-th-id="${member.coinAmount}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "id": member.id,
+                "waitBackMoney": member.waitBackMoney,
+                "hasBackMoney": member.hasBackMoney,
+                "coinAmount": member.coinAmount
+            });
+        }
+
+        form.on('submit(user-update-form-submit)', function (data) {
+            febs.post(ctx + 'otc/otcHuiKuan', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('成功');
+                $('#febs-user-shop').find('#reset').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcOrderInfo.html b/src/main/resources/templates/febs/views/modules/otc/otcOrderInfo.html
new file mode 100644
index 0000000..e68c468
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcOrderInfo.html
@@ -0,0 +1,109 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id" data-th-value="${member.id}">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">订单编号:</label>
+            <div class="layui-input-block">
+                <input type="text" name="orderNo"data-th-id="${member.orderNo}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">单价:</label>
+            <div class="layui-input-block">
+                <input type="number" name="unitPrice"data-th-id="${member.unitPrice}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">交易数量:</label>
+            <div class="layui-input-block">
+                <input type="number" name="coinAmount"data-th-id="${member.coinAmount}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">交易总额:</label>
+            <div class="layui-input-block">
+                <input type="number" name="totalAmount"data-th-id="${member.totalAmount}"
+                       autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">商户昵称:</label>
+            <div class="layui-input-block">
+                <input type="text" name="payName"data-th-id="${member.payName}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "id": member.id,
+                "orderNo": member.orderNo,
+                "unitPrice": member.unitPrice,
+                "coinAmount": member.coinAmount,
+                "totalAmount": member.totalAmount,
+                "payName": member.payName
+            });
+        }
+
+        form.on('submit(user-update-form-submit)', function (data) {
+            febs.post(ctx + 'otc/updateOrderInfo', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('成功');
+                $('#febs-user-order').find('#reset').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcOrderList.html b/src/main/resources/templates/febs/views/modules/otc/otcOrderList.html
new file mode 100644
index 0000000..395e639
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcOrderList.html
@@ -0,0 +1,175 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-user-order" lay-title="订单">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="手机号/邀请码" name="account" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label layui-form-label-sm">订单状态</label>
+                                        <div class="layui-input-inline">
+                                            <select name="status">
+                                                <option value="">请选择</option>
+                                                <option value="1">未付款</option>
+                                                <option value="2">已付款</option>
+                                                <option value="3">已完成</option>
+                                                <option value="4">已取消</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-user-order'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'dealIng') {
+                febs.modal.open('付款', 'modules/otc/otcOrderInfo/' + data.id, {
+                    btn: ['提交', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+
+            if (layEvent === 'reduceCoin') {
+                febs.modal.confirm('放币', '确定直接放币?', function () {
+                    febs.post(ctx + 'otc/reduceCoin/' + data.id, null, function () {
+                        febs.alert.success('放币成功');
+                        $query.click();
+                    });
+                });
+            }
+        });
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'otc/otcOrderList',
+                cols: [[
+                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'inviteId', title: '邀请码', minWidth: 80,align:'center'},
+                    {field: 'orderNo', title: '订单编号', minWidth: 150,align:'center'},
+                    {field: 'unitPrice', title: '单价',minWidth: 80,align:'center'},
+                    {field: 'coinAmount', title: '数量',minWidth: 80,align:'center'},
+                    {field: 'totalAmount', title: '委托总金额',minWidth: 100,align:'center'},
+                    {field: 'orderType', title: '类型',
+                        templet: function (d) {
+                            if (d.orderType === 'B') {
+                                return '<span style="color:green;">买入</span>'
+                            } else if (d.orderType === 'S') {
+                                return '<span style="color:blue;">卖出</span>'
+                            } else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {field: 'status', title: '订单状态',
+                        templet: function (d) {
+                            if (d.status === 1) {
+                                return '<span style="color:red;">未付款</span>'
+                            } else if (d.status === 2) {
+                                return '<span style="color:blue;">已付款</span>'
+                            }else if (d.status === 3) {
+                                return '<span style="color:green;">已完成</span>'
+                            } else if (d.status === 4) {
+                                return '<span>已取消</span>'
+                            }  else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    {field: 'payName', title: '付款人姓名',minWidth: 100,align:'center'},
+                    {field: 'payTime', title: '付款时间',minWidth: 150,align:'center'},
+                    {field: 'finishTime', title: '完成时间',minWidth: 150,align:'center'},
+                    {title: '操作',templet: function (d) {
+                            // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealIng" shiro:hasPermission="user:update">付款</button>'
+                            if(d.status === 1){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="dealIng" shiro:hasPermission="user:update">付款</button>'
+                            }else if (d.status === 2 && d.orderType === 'S'){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="reduceCoin">放币</button>'
+                            } else {
+                                return '';
+                            }
+                        },minWidth: 100,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                account: $searchForm.find('input[name="account"]').val().trim(),
+                status: $searchForm.find("select[name='status']").val(),
+            };
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcSettingList.html b/src/main/resources/templates/febs/views/modules/otc/otcSettingList.html
new file mode 100644
index 0000000..205b013
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcSettingList.html
@@ -0,0 +1,126 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-user-set" lay-title="基础设置">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+<!--                                    <div class="layui-inline">-->
+<!--                                        <div class="layui-input-inline">-->
+<!--                                            <input type="text" placeholder="手机号/邀请码" name="account" autocomplete="off" class="layui-input">-->
+<!--                                        </div>-->
+<!--                                    </div>-->
+<!--                                    <div class="layui-inline">-->
+<!--                                        <label class="layui-form-label layui-form-label-sm">订单状态</label>-->
+<!--                                        <div class="layui-input-inline">-->
+<!--                                            <select name="status">-->
+<!--                                                <option value="">请选择</option>-->
+<!--                                                <option value="1">未付款</option>-->
+<!--                                                <option value="2">已付款</option>-->
+<!--                                                <option value="3">已完成</option>-->
+<!--                                                <option value="4">已取消</option>-->
+<!--                                            </select>-->
+<!--                                        </div>-->
+<!--                                    </div>-->
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-user-set'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'otcSettingUpdate') {
+                febs.modal.open('付款', 'modules/otc/otcSettingUpdate/' + data.id, {
+                    btn: ['提交', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'otc/otcSettingList',
+                cols: [[
+                    {field: 'orderNum', title: '商家入驻总单数', minWidth: 100,align:'left'},
+                    {field: 'completionRate', title: '商家入驻完成率', minWidth: 100,align:'left'},
+                    {field: 'totalAmount', title: '商家入驻总金额', minWidth: 80,align:'center'},
+                    {field: 'cancellNum', title: '今日累计取消次数', minWidth: 150,align:'center'},
+                    {title: '操作',templet: function (d) {
+                            return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="otcSettingUpdate" shiro:hasPermission="user:update">修改</button>'
+                        },minWidth: 100,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {};
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcSettingUpdate.html b/src/main/resources/templates/febs/views/modules/otc/otcSettingUpdate.html
new file mode 100644
index 0000000..5a03b09
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcSettingUpdate.html
@@ -0,0 +1,109 @@
+<style>
+    #user-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #user-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #user-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #user-add .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+
+</style>
+<div class="layui-fluid" id="user-update">
+    <form class="layui-form" action="" lay-filter="user-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id" data-th-value="${member.id}">
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">商家入驻:</label>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">总单数:</label>
+            <div class="layui-input-block">
+                <input type="number" name="orderNum"data-th-id="${member.orderNum}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">完成率:</label>
+            <div class="layui-input-block">
+                <input type="number" name="completionRate"data-th-id="${member.completionRate}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">总金额:</label>
+            <div class="layui-input-block">
+                <input type="number" name="totalAmount"data-th-id="${member.totalAmount}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">今日累计:</label>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">取消次数:</label>
+            <div class="layui-input-block">
+                <input type="number" name="cancellNum"data-th-id="${member.cancellNum}"
+                       autocomplete="off" class="layui-input">
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="user-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            eleTree = layui.eleTree,
+            member = [[${member}]],
+            $view = $('#user-update'),
+            validate = layui.validate,
+            _deptTree;
+
+        form.render();
+
+        initUserValue();
+
+        formSelects.render();
+
+        function initUserValue() {
+            form.val("user-update-form", {
+                "id": member.id,
+                "orderNum": member.orderNum,
+                "completionRate": member.completionRate,
+                "totalAmount": member.totalAmount,
+                "cancellNum": member.cancellNum
+            });
+        }
+
+        form.on('submit(user-update-form-submit)', function (data) {
+            febs.post(ctx + 'otc/updateOtcSetting', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('成功');
+                $('#febs-user-set').find('#reset').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/otc/otcShopList.html b/src/main/resources/templates/febs/views/modules/otc/otcShopList.html
new file mode 100644
index 0000000..e85cb32
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/otc/otcShopList.html
@@ -0,0 +1,177 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-user-shop" lay-title="OTC商户">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="手机号/邀请码" name="account" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label layui-form-label-sm">审核状态</label>
+                                        <div class="layui-input-inline">
+                                            <select name="status">
+                                                <option value="">请选择</option>
+                                                <option value="1">待审核</option>
+                                                <option value="2">审核通过</option>
+                                                <option value="3">审核拒绝</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-user-shop'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 初始化表格操作栏各个按钮功能
+        table.on('tool(userTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'agreeShop') {
+                febs.modal.confirm('通过', '确认通过该商户的审核?', function () {
+                    agreeShop(data.id);
+                });
+            }
+            if (layEvent === 'disagreeShop') {
+                febs.modal.confirm('拒绝', '确认拒绝该商户的审核?', function () {
+                    disagreeShop(data.id);
+                });
+            }
+            if (layEvent === 'huikuan') {
+                febs.modal.open('回款', 'modules/otc/huikuan/' + data.id, {
+                    btn: ['提交', '取消'],
+                    yes: function (index, layero) {
+                        $('#user-update').find('#submit').trigger('click');
+                    },
+                    btn2: function () {
+                        layer.closeAll();
+                    }
+                });
+            }
+        });
+        function agreeShop(id) {
+            febs.get(ctx + 'otc/agreeShop/' + id, null, function () {
+                febs.alert.success('通过成功');
+                $query.click();
+            });
+        }
+        function disagreeShop(id) {
+            febs.get(ctx + 'otc/disagreeShop/' + id, null, function () {
+                febs.alert.success('拒绝成功');
+                $query.click();
+            });
+        }
+
+
+        // 查询按钮
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        // 刷新按钮
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userTable',
+                url: ctx + 'otc/otcShopList',
+                cols: [[
+                    {field: 'phone', title: '手机号', minWidth: 150,align:'left'},
+                    {field: 'realName', title: '姓名', minWidth: 100,align:'left'},
+                    {field: 'inviteId', title: '邀请码', minWidth: 80,align:'center'},
+                    {field: 'nikename', title: '昵称', minWidth: 80,align:'center'},
+                    {field: 'status', title: '审核状态',
+                        templet: function (d) {
+                            if (d.status === 1) {
+                                return '<span style="color:blue;">待审核</span>'
+                            } else if (d.status === 2) {
+                                return '<span style="color:green;">审核通过</span>'
+                            } else if (d.status === 3) {
+                                return '<span>拒绝</span>'
+                            }else{
+                                return ''
+                            }
+                        }, minWidth: 80,align:'center'},
+                    // {field: 'waitBackMoney', title: '待回款',minWidth: 100,align:'center'},
+                    // {field: 'hasBackMoney', title: '已回款',minWidth: 100,align:'center'},
+                    {field: 'buyCnt', title: '服务人数',minWidth: 100,align:'center'},
+                    {field: 'totalOrderCnt', title: '总单数',minWidth: 100,align:'center'},
+                    {field: 'finishRatio', title: '完成率',minWidth: 100,align:'center'},
+                    {field: 'avgPayTime', title: '平均付款时间',minWidth: 100,align:'center'},
+                    {field: 'avgCoinTime', title: '平均放币时间',minWidth: 100,align:'center'},
+                    {field: 'createTime', title: '注册时间', minWidth: 180,align:'center'},
+                    {title: '操作',templet: function (d) {
+                            // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="huikuan" shiro:hasPermission="user:update">回款</button>'
+                            if(d.status === 1){
+                                return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="agreeShop" shiro:hasPermission="user:update">同意</button>'
+                                        +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="disagreeShop" shiro:hasPermission="user:update">拒绝</button>'
+                            }else{
+                                return ''
+                            }
+                        },minWidth: 200,align:'center'}
+                ]]
+            });
+        }
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                account: $searchForm.find('input[name="account"]').val().trim(),
+                status: $searchForm.find("select[name='status']").val(),
+            };
+        }
+
+    })
+</script>
\ No newline at end of file

--
Gitblit v1.9.1