Browse Source

c2c修改

30262728@qq.com 1 tuần trước cách đây
mục cha
commit
0cae44ea78
32 tập tin đã thay đổi với 344 bổ sung252 xóa
  1. 5 0
      qnfhq-api/pom.xml
  2. 28 0
      qnfhq-api/src/main/java/com/qnfhq/common/BigDecimalSerialize.java
  3. 29 0
      qnfhq-api/src/main/java/com/qnfhq/common/BigDecimalSerialize2.java
  4. 2 1
      qnfhq-api/src/main/java/com/qnfhq/config/SaTokenConfigure.java
  5. 1 1
      qnfhq-api/src/main/java/com/qnfhq/config/SwaggerConfig.java
  6. 77 45
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java
  7. 5 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cAdViewDTO.java
  8. 5 5
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderCreateDTO.java
  9. 0 5
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderDTO.java
  10. 14 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cAdEntity.java
  11. 33 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMerchantEntity.java
  12. 22 11
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cOrderEntity.java
  13. 1 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderService.java
  14. 68 112
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cAdServiceImpl.java
  15. 16 26
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java
  16. 1 9
      qnfhq-api/src/main/resources/application.yml
  17. 4 3
      qnfhq-api/src/main/resources/i18n/messages_en.properties
  18. 4 4
      qnfhq-api/src/main/resources/i18n/messages_zh.properties
  19. 1 2
      qnfhq-api/src/main/resources/i18n/validation.properties
  20. 1 2
      qnfhq-api/src/main/resources/i18n/validation_de.properties
  21. 4 2
      qnfhq-api/src/main/resources/i18n/validation_en.properties
  22. 1 2
      qnfhq-api/src/main/resources/i18n/validation_es.properties
  23. 1 2
      qnfhq-api/src/main/resources/i18n/validation_fr.properties
  24. 0 1
      qnfhq-api/src/main/resources/i18n/validation_ja.properties
  25. 1 2
      qnfhq-api/src/main/resources/i18n/validation_ko.properties
  26. 0 1
      qnfhq-api/src/main/resources/i18n/validation_th.properties
  27. 0 1
      qnfhq-api/src/main/resources/i18n/validation_tw.properties
  28. 0 1
      qnfhq-api/src/main/resources/i18n/validation_vi.properties
  29. 4 2
      qnfhq-api/src/main/resources/i18n/validation_zh.properties
  30. 2 0
      qnfhq-api/src/main/resources/mapper/c2c/C2cAdDao.xml
  31. 6 0
      qnfhq-api/src/main/resources/mapper/c2c/C2cMerchantDao.xml
  32. 8 8
      qnfhq-api/src/main/resources/mapper/c2c/C2cOrderDao.xml

+ 5 - 0
qnfhq-api/pom.xml

@@ -72,6 +72,11 @@
             <artifactId>fastjson</artifactId>
             <version>2.0.60</version>
         </dependency>
+
+<!--        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>-->
 	</dependencies>
 
 	<build>

+ 28 - 0
qnfhq-api/src/main/java/com/qnfhq/common/BigDecimalSerialize.java

@@ -0,0 +1,28 @@
+package com.qnfhq.common;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import lombok.SneakyThrows;
+
+import java.math.BigDecimal;
+
+/**
+ * 一句话描述
+ *
+ * @Author: Yelz 30262728@qq.com
+ * @Date: 2025/11/24 14:21
+ * @Description:
+ */
+public class BigDecimalSerialize extends JsonSerializer<BigDecimal> {
+    @SneakyThrows
+    @Override
+    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) {
+        if (value != null) {
+            String plainStr = value.stripTrailingZeros().toPlainString();
+            gen.writeString(plainStr);
+        } else {
+            gen.writeString(BigDecimal.ZERO.toPlainString());
+        }
+    }
+}

+ 29 - 0
qnfhq-api/src/main/java/com/qnfhq/common/BigDecimalSerialize2.java

@@ -0,0 +1,29 @@
+package com.qnfhq.common;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import lombok.SneakyThrows;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * 一句话描述
+ *
+ * @Author: Yelz 30262728@qq.com
+ * @Date: 2025/11/24 14:21
+ * @Description:
+ */
+public class BigDecimalSerialize2 extends JsonSerializer<BigDecimal> {
+    @SneakyThrows
+    @Override
+    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializerProvider) {
+        if (value != null) {
+            String plainStr = value.setScale(2, RoundingMode.DOWN).toPlainString();
+            gen.writeString(plainStr);
+        } else {
+            gen.writeString(BigDecimal.ZERO.toPlainString());
+        }
+    }
+}

+ 2 - 1
qnfhq-api/src/main/java/com/qnfhq/config/SaTokenConfigure.java

@@ -40,7 +40,8 @@ public class SaTokenConfigure {
                         "/user/resetPwdPhone",
                         "/user/resetPwdEmail",
                         "/user/checkPhoneCode",
-                        "/user/checkEmailCode"
+                        "/user/checkEmailCode",
+                        "/swagger-ui.html","/swagger-ui/**","/v3/api-docs/**"
 
                 )
                 // 认证函数: 每次请求执行

+ 1 - 1
qnfhq-api/src/main/java/com/qnfhq/config/SwaggerConfig.java

@@ -22,7 +22,7 @@ public class SwaggerConfig {
 
     private Info apiInfo() {
         return new Info()
-                .title("区块链改造")
+                .title("交易所改造")
                 .description("接口文档")
                 .version("v1.0.0");
     }

+ 77 - 45
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java

@@ -12,6 +12,7 @@ import com.qnfhq.common.constant.Constant;
 import com.qnfhq.common.exception.ErrorCode;
 import com.qnfhq.common.page.PageData;
 import com.qnfhq.common.redis.RedisUtils;
+import com.qnfhq.common.utils.DateUtils;
 import com.qnfhq.common.utils.MessageUtils;
 import com.qnfhq.common.utils.Result;
 import com.qnfhq.common.validator.ValidatorUtils;
@@ -85,8 +86,11 @@ public class C2cOrderController extends ApiBaseController {
 
     @Resource
     private C2cOrderComplainVoucherService orderComplainVoucherService;
-    @Autowired
+    @Resource
     private AppUserService appUserService;
+    @Resource
+    private C2cMerchantService c2cMerchantService;
+
 
     private String getC2cAdLockKey(String adId) {
         return new StringBuilder(LOCK_C2C_AD).append(adId).toString();
@@ -103,10 +107,10 @@ public class C2cOrderController extends ApiBaseController {
         Result result = new Result();
         ValidatorUtils.validateEntity(c2cOrder);
 
+        //进行中的订单
         String odUserKey = c2cOrderService.getC2cOrderKeyByUid(StpUtil.getLoginIdAsString());//c2c_order_uid:1
         String orderId = (String)redisUtils.get(odUserKey);
         if(StrUtil.isNotBlank(orderId)) {
-            //判断订单状态
             C2cOrderEntity order = c2cOrderService.selectOrder(Long.valueOf(orderId));
             if(order == null) {//订单编号无效
                 c2cOrderService.deleteOrderCache(orderId, StpUtil.getLoginIdAsString());
@@ -132,24 +136,6 @@ public class C2cOrderController extends ApiBaseController {
             return result.error(ErrorCode.SHIMING_VERIFY,MessageUtils.message("user.authentication.not.certified"));//请先进行实名认证
         }
 
-        //卖出检查资产
-        if(direction.intValue() == DirectionEnum.SELL.getCode().intValue()) {
-            AppAssetEntity tAppAsset = new AppAssetEntity();
-            tAppAsset.setUserId(loginUserId);
-            tAppAsset.setSymbol(c2cOrder.getSymbol());
-            tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode());
-            List<AppAssetEntity> assetList = appAssetService.selectList(tAppAsset);
-            if(assetList==null || assetList.size()==0) {
-                AppUserEntity user = appUserService.getUserByUserId(loginUserId);
-                appUserService.initAppUserAsset(user);
-                return error(MessageUtils.message("c2c.order.availableAmount.buzu"));//您的可用资产不足
-            }
-            AppAssetEntity sellerAsset = assetList.get(0);
-            if(sellerAsset.getAvailable().compareTo(c2cOrder.getTranAmount())==-1) {
-                return error(MessageUtils.message("c2c.order.availableAmount.insufficient"));//您的可用资产必须大于卖出数量
-            }
-        }
-
         C2cAdEntity c2cAd = c2cAdService.selectById(c2cOrder.getC2cAdId());
         if(c2cAd==null) {
             //清除缓存
@@ -172,15 +158,45 @@ public class C2cOrderController extends ApiBaseController {
         BigDecimal maxAmount = c2cAd.getMaxAmount();
         BigDecimal price = c2cAd.getPrice();
 
+        //数币金额
+        String unit = c2cOrder.getUnit().toLowerCase();
+        String symbol = c2cOrder.getSymbol().toLowerCase();
+        BigDecimal symbolAmount = BigDecimal.ZERO;
+        BigDecimal legalCoinAmount = BigDecimal.ZERO;
+        if(unit.equals(symbol)) {
+            symbolAmount = c2cOrder.getTranAmount();
+            legalCoinAmount = symbolAmount.multiply(price).setScale(2, RoundingMode.DOWN);
+        } else {
+            symbolAmount = c2cOrder.getTranAmount().divide(price).setScale(8, RoundingMode.DOWN);
+            legalCoinAmount = c2cOrder.getTranAmount().setScale(2, RoundingMode.DOWN);
+        }
+        //卖出检查资产
+        if(direction.intValue() == DirectionEnum.SELL.getCode().intValue()) {
+            AppAssetEntity tAppAsset = new AppAssetEntity();
+            tAppAsset.setUserId(loginUserId);
+            tAppAsset.setSymbol(c2cOrder.getSymbol());
+            tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode());
+            List<AppAssetEntity> assetList = appAssetService.selectList(tAppAsset);
+            if(assetList==null || assetList.size()==0) {
+                AppUserEntity user = appUserService.getUserByUserId(loginUserId);
+                appUserService.initAppUserAsset(user);
+                return error(MessageUtils.message("c2c.order.availableAmount.buzu"));//您的可用资产不足
+            }
+            AppAssetEntity sellerAsset = assetList.get(0);
+            if (sellerAsset.getAvailable().compareTo(symbolAmount) == -1) {
+                return error(MessageUtils.message("c2c.order.availableAmount.insufficient"));//您的可用资产必须大于卖出数量
+            }
+        }
+
         BigDecimal adMinBuyNum = minAmount.divide(price,2,BigDecimal.ROUND_DOWN);
         if(availableNum.compareTo(adMinBuyNum)==-1) {
             c2cAdService.updateC2cAdDisabled(c2cAd);
             return error(MessageUtils.message("c2c.order.param.adid.invalid"));//广告已不可用
         }
 
-        if(c2cAdService.selectAdFromRedis(c2cOrder.getC2cAdId())==null) {
-            c2cAdService.setAdCache(c2cAd);
-        }
+//        if(c2cAdService.selectAdFromRedis(c2cOrder.getC2cAdId())==null) {
+//            c2cAdService.setAdCache(c2cAd);
+//        }
         //买入对应广告卖出
         if(direction.intValue() == c2cAd.getDirection().intValue()) {
             return error(MessageUtils.message("c2c.order.direction.invalid"));//参数direction值不正确
@@ -189,34 +205,21 @@ public class C2cOrderController extends ApiBaseController {
             return error(MessageUtils.message("c2c.order.buyer.seller.must.different"));//买家和卖家不能是同一个用户
         }
 
-        //交易币的数量 保留8位
-        String tranBy = c2cOrder.getTranBy();
-        BigDecimal tranAmount = c2cOrder.getTranAmount();
-        BigDecimal symbolNum = BigDecimal.ZERO;
-        if("amt".equals(tranBy)) {//按金额
-            symbolNum = tranAmount.divide(price,8, RoundingMode.DOWN);
-            tranAmount = tranAmount.setScale(2, RoundingMode.DOWN);
-        } else {//按数量
-            //用户卖出
-            symbolNum = tranAmount.setScale(8, RoundingMode.DOWN);
-            tranAmount = symbolNum.multiply(price).setScale(2, RoundingMode.DOWN);
+        if (legalCoinAmount.compareTo(minAmount) == -1) {
+            return error(MessageUtils.message("c2c.order.param.tranAmt.min"));//金额必须大于广告最小限额
         }
-
-        if (tranAmount.compareTo(minAmount) == -1) {
-            return error(MessageUtils.message("c2c.order.param.tranAmt.min"));//金额必须大于最小限额
-        }
-        if (tranAmount.compareTo(maxAmount) == 1) {
-            return error(MessageUtils.message("c2c.order.param.tranAmt.max"));//金额必须小于最大限额
+        if (legalCoinAmount.compareTo(maxAmount) == 1) {
+            return error(MessageUtils.message("c2c.order.param.tranAmt.max"));//金额必须小于广告最大限额
         }
-        if(symbolNum.compareTo(availableNum)==1) {
-            return error(MessageUtils.message("c2c.order.param.tranAmt.max"));//交易金额超过最大限额
+        if(symbolAmount.compareTo(availableNum)==1) {
+            return error(MessageUtils.message("c2c.order.param.tranAmt.over.avail"));//交易金额超过广告可用数量
         }
 
         //获取锁对象
         String lockKey = getC2cAdLockKey(c2cOrder.getC2cAdId().toString());
         if (distributedRedisLock.lock(lockKey)) {
             try {
-                return c2cOrderService.createC2cOrder(c2cOrder, c2cAd, symbolNum, loginUserId, appUserDetail.getRealName());
+                return c2cOrderService.createC2cOrder(c2cOrder, c2cAd, legalCoinAmount,symbolAmount, loginUserId, appUserDetail.getRealName());
             } catch (Exception e) {
                 log.error("createC2cOrder,{},{},{}",loginUserId,c2cOrder.getC2cAdId(),e.getMessage());
                 return error(e.getMessage());
@@ -568,7 +571,6 @@ public class C2cOrderController extends ApiBaseController {
 
         //待放币的订单数量
         String releaseCountsKey = CacheConstants.getC2cMertUnReleaseKey(StpUtil.getLoginIdAsString());
-log.info("商户待处理Key:"+unpayCountsKey+":"+releaseCountsKey);
 
         Integer unpayCounts = 0;
         Integer releaseCounts = 0;
@@ -582,7 +584,6 @@ log.info("商户待处理Key:"+unpayCountsKey+":"+releaseCountsKey);
         } else {
             releaseCounts = Convert.toInt(redisUtils.get(releaseCountsKey),0);
         }
-log.info("商户待处理数Count:"+unpayCounts+":"+releaseCounts);
 
         if(unpayCounts<0 || releaseCounts<0) {
             unpayCounts = c2cOrderService.setMtUnPayCount(unpayCountsKey);
@@ -771,4 +772,35 @@ log.info("商户待处理数Count:"+unpayCounts+":"+releaseCounts);
         return success(data);
     }
 
+
+    /**
+     * c2c我的信息
+     *
+     */
+    @Operation(summary = "c2c我的")
+    @PostMapping("/myInfo")
+    public Result myInfo()
+    {
+        AppUserEntity user = appUserService.selectById(StpUtil.getLoginIdAsLong());
+        AppUserDetailEntity detail = appUserDetailService.selectAppUserDetailByUserId(user.getId());
+        AppAssetEntity asset = appAssetService.getAppAssetEntity(user.getId(), "usdt",AssetEnum.PLATFORM_ASSETS.getCode());
+        C2cMerchantEntity merchant = c2cMerchantService.getMerchantEntity(user.getId());
+
+        Map data = MapUtil.of("email", user.getEmail());
+        data.put("loginName",user.getLoginName());
+        data.put("country", user.getCountry());
+        data.put("phone", user.getPhone());
+        data.put("register_time", DateUtils.format(user.getCreateTime(),"yyyy/MM/dd"));
+        data.put("auth_time", DateUtils.format(detail.getOperateTime(),"yyyy/MM/dd"));
+        data.put("avail",asset.getAvailable().setScale(8, RoundingMode.DOWN).stripTrailingZeros().toPlainString());
+        data.put("frozen",asset.getFrozen().setScale(8, RoundingMode.DOWN).stripTrailingZeros().toPlainString());
+        data.put("finishNum",merchant.getFinishNum());
+        data.put("finishRate",merchant.getFinishRate());
+        data.put("averagePayTime",merchant.getAveragePayTime());
+        data.put("averagePassTime",merchant.getAveragePassTime());
+
+        return success(data);
+    }
+
+
 }

+ 5 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cAdViewDTO.java

@@ -43,10 +43,13 @@ public class C2cAdViewDTO implements Serializable {
 	private String payway;
 
 	@SchemaProperty(name = "页码")
-	private Integer pageNum;
+	private String pageNum;
 
 	@SchemaProperty(name = "每页条数")
-	private Integer pageSize;
+	private String pageSize;
 
+    @SchemaProperty(name = "标签")
+    @NotNull(message="{NotNull.tag}")//标签不能为空
+    private Integer tag;
 
 }

+ 5 - 5
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderCreateDTO.java

@@ -29,7 +29,7 @@ public class C2cOrderCreateDTO implements Serializable {
     @NotBlank(message="{NotBlank.legalCoin}")//法币不能为空
 	private String legalCoin;
 
-	@SchemaProperty(name = "交易币种USDT,BTC")
+	@SchemaProperty(name = "交易币种")
     @NotBlank(message="{NotBlank.symbol}")//交易币种不能为空
 	private String symbol;
 
@@ -37,13 +37,13 @@ public class C2cOrderCreateDTO implements Serializable {
     @NotNull(message="{NotNull.c2cAdId}")//广告编号不能为空
 	private Long c2cAdId;
 
-	@SchemaProperty(name = "交易金额/数量")
+	@SchemaProperty(name = "法币/数币金额")
     @NotNull(message="{NotNull.tranAmount}")//交易金额/数量不能为空
 	private BigDecimal tranAmount;
 
-    @SchemaProperty(name = "交易方式amt/qty")
-    @NotBlank(message="{NotNull.tranBy}")//交易方式不能为空
-    private String tranBy;
+    @SchemaProperty(name = "单位cny/usdt")
+    @NotBlank(message="{NotNull.unit}")//交易单位不能为空
+    private String unit;
 
 	@SchemaProperty(name = "支付方式比如1微信 2支付宝 3银行借记卡")
     @NotNull(message="{NotNull.payType}")//支付方式不能为空

+ 0 - 5
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderDTO.java

@@ -76,11 +76,6 @@ public class C2cOrderDTO implements Serializable {
 	@SchemaProperty(name = "")
 	private Date updateTime;
 
-	@SchemaProperty(name = "")
-	private Date endTime;
-
-	@SchemaProperty(name = "")
-	private Integer expireTime;
 
 
 }

+ 14 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cAdEntity.java

@@ -3,6 +3,9 @@ package com.qnfhq.modules.c2c.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.qnfhq.common.BigDecimalSerialize;
+import com.qnfhq.common.BigDecimalSerialize2;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -54,26 +57,31 @@ public class C2cAdEntity implements Serializable {
     /**
      * 数币的总数量
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
 	private BigDecimal num;
     /**
      * 剩余可用数币的数量
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
 	private BigDecimal availableNum;
     /**
      * 价格类型:1固定
      */
 	private Integer priceType;
     /**
-     * 法币单价
+     * 法币单价 保留2位小数
      */
+    @JsonSerialize(using = BigDecimalSerialize2.class)
 	private BigDecimal price;
     /**
      * 限量最小法币金额
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
 	private BigDecimal minAmount;
     /**
      * 限量最大法币金额
      */
+    @JsonSerialize(using = BigDecimalSerialize.class)
 	private BigDecimal maxAmount;
     /**
      * 支付方式
@@ -103,4 +111,9 @@ public class C2cAdEntity implements Serializable {
      * 
      */
 	private Long version;
+
+    /**
+     *  标签 0 默认 1新手友好
+     */
+    private Integer tag;
 }

+ 33 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMerchantEntity.java

@@ -110,4 +110,37 @@ public class C2cMerchantEntity implements Serializable {
      * 审核通过时间
      */
 	private Date operateTime;
+
+    /**
+     * 标签 0 默认 1新手友好
+     */
+    private Integer tag;
+
+
+    /**
+     * 30日购买单数
+     */
+    private Integer day30BuyNum;
+
+    /**
+     * 30日出售单数
+     */
+    private Integer day30SellNum;
+
+    /**
+     * 30日交易对手数
+     */
+    private Integer day30TranUserNum;
+
+    /**
+     * 平均付款用时分钟
+     */
+    private Integer averagePayTime;
+
+    /**
+     * 平均放币用时分钟
+     */
+    private Integer averagePassTime;
+
+
 }

+ 22 - 11
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cOrderEntity.java

@@ -38,15 +38,15 @@ public class C2cOrderEntity implements Serializable {
      */
 	private String userName;
     /**
-     * 1买入  2 卖出
+     * 方向:1买入  2 卖出
      */
 	private Integer direction;
     /**
-     * 法定货
+     * 法币
      */
 	private String legalCoin;
     /**
-     * 交易币USDT,BTC
+     * 数币
      */
 	private String symbol;
     /**
@@ -66,7 +66,7 @@ public class C2cOrderEntity implements Serializable {
      */
 	private BigDecimal tranPrice;
     /**
-     * 数量USDT
+     * 数币数
      */
 	private BigDecimal symbolNum;
     /**
@@ -74,15 +74,19 @@ public class C2cOrderEntity implements Serializable {
      */
 	private BigDecimal tranAmount;
     /**
-     * 1微信  2支付宝 3银行借记卡
+     * 支付方式:1微信  2支付宝 3银行借记卡
      */
 	private Integer payType;
     /**
-     * 0 进行中 1 已结束 
+     * 付款时间
+     */
+    private Date payTime;
+    /**
+     * 流程:0 进行中 1 已结束
      */
 	private Integer flow;
     /**
-     * 0 未付款 1 已付款(确认付款后)2 申诉 3 已完成 4 已取消 
+     * 订单状态:0 未付款 1 已付款(确认付款后)2 申诉 3 已完成 4 已取消
      */
 	private Integer status;
     /**
@@ -97,14 +101,20 @@ public class C2cOrderEntity implements Serializable {
      * 
      */
 	private Date updateTime;
+
     /**
-     * 
+     * 支付过期时间
      */
-	private Date endTime;
+	private Date payExpireTime;
     /**
-     * 
+     * 完成时间
      */
-	private Integer expireTime;
+    private Date finishTime;
+    /**
+     * 关闭时间 订单取消
+     */
+    private Date closeTime;
+
 
     /**
      * 卖家收款信息
@@ -115,6 +125,7 @@ public class C2cOrderEntity implements Serializable {
     //是否有付款凭证
     @TableField(exist = false)
     Integer isVoucher=0;
+
     //买家付款凭证
     @TableField(exist = false)
     List<C2cPaymentVoucherEntity> payVoucherList;

+ 1 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderService.java

@@ -60,7 +60,7 @@ public interface C2cOrderService extends BaseService<C2cOrderEntity> {
      * @return
      * @throws Exception
      */
-    public Result createC2cOrder(C2cOrderCreateDTO c2cOrder, C2cAdEntity c2cAd, BigDecimal symbolNum,
+    public Result createC2cOrder(C2cOrderCreateDTO c2cOrder, C2cAdEntity c2cAd,BigDecimal legalCoinAmount, BigDecimal symbolNum,
                                  Long loginUserId, String realName) throws Exception;
 
 

+ 68 - 112
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cAdServiceImpl.java

@@ -3,10 +3,7 @@ package com.qnfhq.modules.c2c.service.impl;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.map.MapUtil;
-import cn.hutool.json.JSONArray;
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.Query;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qnfhq.common.constant.Constant;
@@ -14,7 +11,6 @@ import com.qnfhq.common.exception.ErrorCode;
 import com.qnfhq.common.page.PageData;
 import com.qnfhq.common.redis.RedisUtils;
 import com.qnfhq.common.service.impl.BaseServiceImpl;
-import com.qnfhq.common.service.impl.CrudServiceImpl;
 import com.qnfhq.common.utils.MessageUtils;
 import com.qnfhq.common.utils.Result;
 import com.qnfhq.modules.c2c.dao.C2cAdDao;
@@ -29,6 +25,7 @@ import com.qnfhq.modules.user.entity.AppAssetEntity;
 import com.qnfhq.modules.user.enums.AssetEnum;
 import com.qnfhq.modules.user.service.AppAssetService;
 import com.qnfhq.utils.OrderUtils;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -193,15 +190,15 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         String adHKey = getAdHKey(c2cAdId);
         redisUtils.delete(adHKey);
 
-        //2 按价格排序,用于浏览广告
-        String zsetKey = getViewAdKey(direction, legalCoin, symbol);
-        redisUtils.removeZset(zsetKey, c2cAdId.toString());
-
-        //3 按支付方式、按最小数量排序,用于快捷交易 c2c_ad_payId_buy_cnyusdt
-        String[] paywayAr = payway.split(",");
-        for (String paywayId : paywayAr) {
-            redisUtils.removeZset(getQuickAdKey(zsetKey, paywayId), c2cAdId.toString());
-        }
+//        //2 按价格排序,用于浏览广告
+//        String zsetKey = getViewAdKey(direction, legalCoin, symbol);
+//        redisUtils.removeZset(zsetKey, c2cAdId.toString());
+//
+//        //3 按支付方式、按最小数量排序,用于快捷交易 c2c_ad_payId_buy_cnyusdt
+//        String[] paywayAr = payway.split(",");
+//        for (String paywayId : paywayAr) {
+//            redisUtils.removeZset(getQuickAdKey(zsetKey, paywayId), c2cAdId.toString());
+//        }
     }
 
     @Override
@@ -234,14 +231,14 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         redisUtils.hMSet(adHKey, adMap, randomHour*3600L);
 
         //2 按价格排序,用于浏览广告
-        String zsetKey = getViewAdKey(c2cAd.getDirection(), c2cAd.getLegalCoin(), c2cAd.getSymbol());
-        redisUtils.addZSet(zsetKey, c2cAd.getId().toString(), c2cAd.getPrice().doubleValue(), c2cAd.getDirection());
+//        String zsetKey = getViewAdKey(c2cAd.getDirection(), c2cAd.getLegalCoin(), c2cAd.getSymbol());
+//        redisUtils.addZSet(zsetKey, c2cAd.getId().toString(), c2cAd.getPrice().doubleValue(), c2cAd.getDirection());
 
         //3 按支付方式、按最小数量排序,用于快捷交易
-        String[] paywayAr = payway.split(",");
-        for (String paywayId : paywayAr) {
-            redisUtils.addZSet(getQuickAdKey(zsetKey, paywayId), c2cAd.getId().toString(), c2cAd.getMinAmount().doubleValue(), c2cAd.getDirection());
-        }
+//        String[] paywayAr = payway.split(",");
+//        for (String paywayId : paywayAr) {
+//            redisUtils.addZSet(getQuickAdKey(zsetKey, paywayId), c2cAd.getId().toString(), c2cAd.getMinAmount().doubleValue(), c2cAd.getDirection());
+//        }
     }
 
 
@@ -272,17 +269,17 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
 
     /**
      * 快捷交易查询
+     * 优先匹配“新手友好”商家
      * @param tranDTO
      * @return
      */
     @Override
     public Result queryTranAd(C2cAdTranDTO tranDTO) {
         Result result = new Result();
-        long loginId = StpUtil.getLoginIdAsLong();
         String tranSymbol = tranDTO.getSymbol().toLowerCase();
         String tranLegalCoin = tranDTO.getLegalCoin().toUpperCase();
         Integer tranDirection = tranDTO.getDirection();
-        //所有支付方式
+        //支付方式
         List<C2cPayWayEntity> paywayList = c2cPayWayService.selectListByLegalCoin(tranLegalCoin);
         if(CollectionUtils.isEmpty(paywayList)) {
             return result.error(MessageUtils.message("c2c.ad.current.payway.empty"));//当前法币未设置支付方式
@@ -292,37 +289,48 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         if(Objects.isNull(tLegalCoin)) {
             return result.error(MessageUtils.message("c2c.ad.legalCoin.notset"));//当前法币未设置
         }
+        //买入法币金额,卖出是数币
         BigDecimal maxAmount = BigDecimal.ZERO;
         if (tranDTO.getDirection().intValue() == DirectionEnum.BUY.getCode().intValue()) {
-            maxAmount = tranDTO.getAmount();//法币cny的金额
+            maxAmount = tranDTO.getAmount();
         } else {
-            //卖出是usdt币的数量
             maxAmount = tranDTO.getAmount().multiply(tLegalCoin.getExchangeRate());
         }
 
 
-        boolean flag = true;
-        //1从redis取数
+        Integer direction = 0;
+        if (tranDTO.getDirection().intValue() == DirectionEnum.BUY.getCode().intValue()) {
+            direction = DirectionEnum.SELL.getCode();
+        } else {
+            direction = DirectionEnum.BUY.getCode();
+        }
+        //先查新手友好的商行
+        List<C2cAdEntity> queryAdList = selectC2cAdTranList(tranSymbol,direction,tranLegalCoin,maxAmount,1);
+        setPaywayList(paywayList, queryAdList,tranDirection);
+
+        int total = 0;
         for(C2cPayWayEntity payway : paywayList) {
-            String zsetKey = getViewAdKey(tranDirection, tranLegalCoin, tranSymbol);
-            String zQuickKey = getQuickAdKey(zsetKey,payway.getId().toString());
-
-            ArrayList<Object> adidList = null;
-            //配置 最小买入金额
-            adidList = redisUtils.getRangeByScore(zQuickKey, 10.0, maxAmount.doubleValue());
-            if (adidList != null) {
-                List<C2cAdEntity> adList = new ArrayList<>();
-                for (Object adId : adidList) {
-                    Long adIdLong = Long.valueOf((String)adId);
-                    C2cAdEntity ad = selectAdFromRedis(adIdLong);
-                    if(ad == null) {
-                        ad = selectById(adIdLong);
-                        if(ad==null) {
-                            redisUtils.removeZset(zQuickKey, adIdLong.toString());
-                        }
-                        delSetAdCache(ad);
-                    }
-                    if (ad!=null && ad.getMaxAmount().compareTo(maxAmount) != -1) {
+            if(payway.getAdList()!=null) {
+                total += payway.getAdList().size();
+            }
+        }
+
+        if(total<3) {
+            //查其他的商行
+            queryAdList = selectC2cAdTranList(tranSymbol,direction,tranLegalCoin,maxAmount,0);
+            setPaywayList(paywayList, queryAdList,tranDirection);
+        }
+
+        return result.ok(paywayList);
+    }
+
+    private List<C2cPayWayEntity> setPaywayList(List<C2cPayWayEntity> paywayList,List<C2cAdEntity> queryAdList,Integer direction) {
+        if (!CollectionUtils.isEmpty(queryAdList)) {
+            for(C2cPayWayEntity payway : paywayList) {
+                List<C2cAdEntity> adList = payway.getAdList()==null ? new ArrayList<>() : payway.getAdList();
+                for(C2cAdEntity ad : queryAdList) {
+                    String[] payIds = ad.getPayway().split(",");
+                    if(Arrays.asList(payIds).contains(payway.getId().toString())) {
                         adList.add(ad);
                         if (adList.size() > 2) {
                             break;
@@ -330,47 +338,17 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
                     }
                 }
                 if(adList.size()>0) {
-                    flag = false;
-                    sortAdList(adList,tranDTO.getDirection());
+                    sortAdList(adList,direction);
                     payway.setAdList(adList);
                 }
             }
         }
-
-        if(flag) {
-            //2从数据库查询
-            Integer direction = 0;
-            if (tranDTO.getDirection().intValue() == DirectionEnum.BUY.getCode().intValue()) {
-                direction = DirectionEnum.SELL.getCode();
-            } else {
-                direction = DirectionEnum.BUY.getCode();
-            }
-            List<C2cAdEntity> queryAdList = selectC2cAdTranList(tranSymbol,direction,tranLegalCoin,maxAmount);
-            if (!CollectionUtils.isEmpty(queryAdList)) {
-                for(C2cPayWayEntity payway : paywayList) {
-                    List<C2cAdEntity> adList = new ArrayList<>();
-                    for(C2cAdEntity ad : queryAdList) {
-                        String[] payIds = ad.getPayway().split(",");
-                        if(Arrays.asList(payIds).contains(payway.getId().toString())
-                                && ad.getUserId().longValue()!=loginId) {
-                            adList.add(ad);
-                            if (adList.size() > 2) {
-                                break;
-                            }
-                        }
-                    }
-                    if(adList.size()>0) {
-                        sortAdList(adList,tranDTO.getDirection());
-                        payway.setAdList(adList);
-                    }
-                }
-            }
-        }
-        return result.ok(paywayList);
+        return paywayList;
     }
 
     /**
      * 查询快捷交易广告
+     *
      * @param symbol
      * @param direction
      * @param legalCoin
@@ -378,15 +356,15 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
      * @return
      */
     private List<C2cAdEntity> selectC2cAdTranList(String symbol,Integer direction,
-                                                  String legalCoin,BigDecimal tranAmount) {
+                                                  String legalCoin,BigDecimal tranAmount,Integer tag) {
         return baseDao.selectList(new LambdaQueryWrapper<C2cAdEntity>()
-                    .eq(C2cAdEntity::getDirection,direction)
-                    .eq(C2cAdEntity::getLegalCoin,legalCoin)
-                    .eq(C2cAdEntity::getSymbol,symbol)
+                    .ne(C2cAdEntity::getUserId, StpUtil.getLoginIdAsLong())
+                    .eq(Objects.nonNull(direction),C2cAdEntity::getDirection, direction)
+                    .eq(StrUtil.isNotBlank(legalCoin),C2cAdEntity::getLegalCoin, legalCoin)
+                    .eq(StrUtil.isNotBlank(symbol),C2cAdEntity::getSymbol, symbol)
                     .eq(C2cAdEntity::getStatus,AdStatusEnum.PASS.getCode())
-                    .ge(C2cAdEntity::getMaxAmount,tranAmount)
-                    .le(C2cAdEntity::getMinAmount,tranAmount)
-                    .last(" limit 50")
+                    .eq(Objects.nonNull(tag),C2cAdEntity::getTag,tag)
+                    .last(" limit 100")
                 );
     }
 
@@ -417,6 +395,8 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         BigDecimal amount = viewDTO.getAmount();
         //设置支付方式
         String payway = viewDTO.getPayway();
+        //标签
+        Integer tag = viewDTO.getTag();
 
         Map<String, Object> params = new HashMap<>();
         //买入\卖出广告
@@ -430,36 +410,11 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
             direction = DirectionEnum.BUY.getCode();
             params.put("direction", DirectionEnum.BUY.getCode());
         }
-        Integer pageNum = Convert.toInt(viewDTO.getPageNum(), 1);
-        Integer pageSize = Convert.toInt(viewDTO.getPageSize(), 10);
-        params.put(Constant.PAGE,pageNum.toString());
-        params.put(Constant.LIMIT,pageSize.toString());
+        params.put(Constant.PAGE,viewDTO.getPageNum());
+        params.put(Constant.LIMIT,viewDTO.getPageSize());
         String inputSymbol = viewDTO.getSymbol().toLowerCase();
         String inputLegalCoin = viewDTO.getLegalCoin().toUpperCase();
 
-        //1从redis查询
-        if(amount == null && StrUtil.isEmpty(payway)) {
-            long start = (pageNum - 1) * pageSize;
-            long end = pageNum * pageSize-1;
-            String zsetKey = getViewAdKey(direction, inputLegalCoin, inputSymbol);
-            ArrayList<Object> adList = redisUtils.getRange(zsetKey, type, start, end);
-            if (adList != null) {
-                for(Object adId : adList) {
-                    Long adIdLong = Long.valueOf((String)adId);
-                    C2cAdEntity ad = selectAdFromRedis(adIdLong);
-                    if(ad == null) {
-                        ad = selectById(adIdLong);
-                        delSetAdCache(ad);
-                    }
-                    if(ad!=null && ad.getUserId().longValue()!=StpUtil.getLoginIdAsLong()) {
-                        resList.add(ad);
-                    }
-                }
-                PageData<C2cAdEntity> data = new PageData<C2cAdEntity>(resList,resList.size());
-                return result.ok(data);
-            }
-        }
-
         //2 查数据库
         List paywayList = new ArrayList();
         if (StrUtil.isNotEmpty(payway)) {
@@ -471,6 +426,7 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
                 .eq(StrUtil.isNotBlank(inputLegalCoin),C2cAdEntity::getLegalCoin, inputLegalCoin)
                 .eq(StrUtil.isNotBlank(inputSymbol),C2cAdEntity::getSymbol, inputSymbol)
                 .eq(C2cAdEntity::getStatus,AdStatusEnum.PASS.getCode())
+                .eq(Objects.nonNull(tag) && tag != -1,C2cAdEntity::getTag,tag)
                 .le(Objects.nonNull(amount),C2cAdEntity::getMinAmount,amount)
                 .ge(Objects.nonNull(amount),C2cAdEntity::getMaxAmount,amount);
         if(paywayList.size()>0) {
@@ -478,7 +434,7 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
             wrapper.and(qw -> createQw(qw, finalPaywayList));
         }
 
-
+        // 按价格排序
         IPage<C2cAdEntity> page = baseDao.selectPage(
                 getPage(params, "price", "asc".equals(type) ? true : false),
                 wrapper

+ 16 - 26
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java

@@ -200,7 +200,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         order.setStatus(Convert.toInt(odMap.get("status")));
         order.setCreateTime(DateUtils.strForDate(Convert.toStr(odMap.get("createTime"))));
         order.setUpdateTime(DateUtils.strForDate(Convert.toStr(odMap.get("updateTime"))));
-        order.setEndTime(DateUtils.strForDate(Convert.toStr(odMap.get("endTime"))));
+        order.setPayExpireTime(DateUtils.strForDate(Convert.toStr(odMap.get("payExpireTime"))));
         return order;
     }
 
@@ -226,10 +226,8 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         odMap.put("status", c2cOrder.getStatus());
         odMap.put("createTime", DateUtils.format(c2cOrder.getCreateTime(),DateUtils.DATE_TIME_PATTERN));
         odMap.put("updateTime", DateUtils.format(c2cOrder.getUpdateTime(),DateUtils.DATE_TIME_PATTERN));
-        odMap.put("endTime", DateUtils.format(c2cOrder.getEndTime(),DateUtils.DATE_TIME_PATTERN));
-        Random random = new Random();
-        long randomSecond = random.nextLong(3600L)+3600L; // 生成1到2小时的随机数
-        redisUtils.hMSet(odHKey, odMap, randomSecond);
+        odMap.put("payExpireTime", DateUtils.format(c2cOrder.getPayExpireTime(),DateUtils.DATE_TIME_PATTERN));
+        redisUtils.hMSet(odHKey, odMap, RandomNumberGenerator.getRandomNumber(3600,3*3600));
     }
     private void setOrderUserIdCache(C2cOrderEntity c2cOrder) {
         //c2c_order_uid:1
@@ -267,7 +265,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Result createC2cOrder(C2cOrderCreateDTO c2cOrderDTO, C2cAdEntity c2cAd, BigDecimal symbolNum,
+    public Result createC2cOrder(C2cOrderCreateDTO c2cOrderDTO, C2cAdEntity c2cAd,BigDecimal legalCoinAmount, BigDecimal symbolNum,
                                  Long loginUserId, String realName) throws Exception {
         /** 1买入  2 卖出 */
         Integer direction = c2cOrderDTO.getDirection();
@@ -275,14 +273,10 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         String symbol = c2cOrderDTO.getSymbol().toLowerCase();
         /** 法定货币 */
         String legalCoin = c2cOrderDTO.getLegalCoin().toLowerCase();
-        /** 交易金额 */
-        BigDecimal tranAmount = c2cOrderDTO.getTranAmount();
         /** 广告编号 */
         Long c2cAdId = c2cOrderDTO.getC2cAdId();
         /** 支付方式 */
         Integer payType = c2cOrderDTO.getPayType();
-
-
         String adUserName = c2cAd.getUserName();
         BigDecimal price = c2cAd.getPrice();
         Long tranUserId = c2cAd.getUserId();
@@ -299,13 +293,12 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         c2cOrder.setTranUserName(adUserName);
         c2cOrder.setTranPrice(price);
         c2cOrder.setSymbolNum(symbolNum);
-        c2cOrder.setTranAmount(tranAmount);
+        c2cOrder.setTranAmount(legalCoinAmount);
         c2cOrder.setPayType(payType);
         c2cOrder.setFlow(C2cOrderFlowEnum.PROGRESS.getCode());
         c2cOrder.setStatus(C2cOrderStatusEnum.CREATE.getCode());
         c2cOrder.setCreateTime(new Date());
         c2cOrder.setUpdateTime(new Date());
-        c2cOrder.setEndTime(DateUtils.getNowDateAddMins(CacheConstants.C2C_ORDER_EXPIRE_MIN));
 
         String adHKey = CacheConstants.getC2cAdHKey(c2cAd.getId().toString());
         if(c2cOrderDao.insertC2cOrder(c2cOrder)<=0) {
@@ -331,12 +324,11 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         // 更新广告的可用数量
         BigDecimal newMaxAmount = null;
         Integer newStatus = null;
-        BigDecimal avaiAmount = c2cAd.getAvailableNum().subtract(symbolNum).multiply(price);
-        if(c2cAd.getMaxAmount().compareTo(avaiAmount)==1) {
-            newMaxAmount = avaiAmount;
-            redisUtils.hSet(adHKey, "maxAmount", newMaxAmount);
+        BigDecimal maxAvail = c2cAd.getAvailableNum().subtract(symbolNum).multiply(price);
+        if(c2cAd.getMaxAmount().compareTo(maxAvail)==1) {
+            newMaxAmount = maxAvail;
         }
-        if(avaiAmount.compareTo(c2cAd.getMinAmount())==-1) {
+        if(maxAvail.compareTo(c2cAd.getMinAmount())==-1) {
             newStatus = AdStatusEnum.NOPASS.getCode();
             c2cAdService.deleteC2cAdCache(c2cAd);
         }
@@ -353,10 +345,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         setOrderCache(c2cOrder);
         setOrderUserIdCache(c2cOrder);
 
-        if(c2cOrder.getDirection().intValue() == DirectionEnum.BUY.getCode().intValue()) {
-            //用户待支付数+1
-//                unpayCountsKey = StringUtils.format(CacheConstants.C2C_UNPAY_COUNTS, c2cOrder.getUserId());
-        } else {
+        if(c2cOrder.getDirection().intValue() == DirectionEnum.SELL.getCode().intValue()) {
             //如果是卖出,商家待支付数统计
             String unpayCountsKey = CacheConstants.getC2cMertUnPayKey(c2cOrder.getTranUserId().toString());
             redisUtils.increment(unpayCountsKey, 1L, RedisUtils.NOT_EXPIRE);
@@ -459,7 +448,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         order.setFlow(C2cOrderFlowEnum.END.getCode());
         order.setStatus(C2cOrderStatusEnum.CANCEL.getCode());
         order.setUpdateTime(new Date());
-        order.setEndTime(new Date());
+        order.setCloseTime(new Date());
         if(!updateById(order)) {
             throw new Exception(MessageUtils.message("c2c.order.update.fail"));//更新订单失败
         }
@@ -472,7 +461,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
             appAssetLogService.insertAssetLog(order.getId(),order.getUserId(),order.getSymbol(),AssetEnum.PLATFORM_ASSETS.getCode(),
                     info.getTotal(),info.getTotal(),
                     info.getAvailable(),info.getAvailable().add(order.getSymbolNum()),
-                    info.getFrozen(),info.getFrozen().subtract(order.getSymbolNum()),"用户卖出订单取消解冻资产");
+                    info.getFrozen(),info.getFrozen().subtract(order.getSymbolNum()),"c2c订单取消解冻资产");
         }
         //广告可用数量恢复
         C2cAdEntity c2cAd = c2cAdService.selectById(order.getC2cAdId());
@@ -485,7 +474,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         }
         c2cAdLogService.insertC2cAdLog(order.getC2cAdId(),order.getId(),order.getSymbolNum(),
                 c2cAd.getAvailableNum(),c2cAd.getAvailableNum().add(order.getSymbolNum()),
-                c2cAd.getMaxAmount(),c2cAd.getMaxAmount(),"用户取消订单恢复广告可用数量");
+                c2cAd.getMaxAmount(),c2cAd.getMaxAmount(),"c2c订单取消,恢复广告可用数量");
         return 1;
     }
 
@@ -532,13 +521,14 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
                 order.getRemark(),loginId,"app");
 
         order.setStatus(C2cOrderStatusEnum.PAY.getCode());
+        order.setPayTime(new Date());
         if(!updateById(order)) {
             throw new Exception(MessageUtils.message("c2c.order.update.fail"));//更新订单失败
         }
         //设置订单状态
         setOrderStatusCache(order);
 
-        //用户买入,用户未支付数减1 商家放币订单数+1
+        //用户买入,用户未支付数减1 商家放币订单数+1
         if(order.getDirection().intValue() == DirectionEnum.BUY.getCode().intValue()) {
             String releaseCountsKey = CacheConstants.getC2cMertUnReleaseKey(sellUserId.toString());
             redisUtils.increment(releaseCountsKey, 1L, RedisUtils.NOT_EXPIRE);
@@ -620,7 +610,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         order.setFlow(C2cOrderFlowEnum.END.getCode());
         order.setStatus(C2cOrderStatusEnum.COMPLETE.getCode());
         order.setUpdateTime(new Date());
-        order.setEndTime(new Date());
+        order.setFinishTime(new Date());
         //1 更新订单状态已完成
         if(!updateById(order)) {
             throw new Exception(MessageUtils.message("c2c.order.update.fail"));//更新订单失败

+ 1 - 9
qnfhq-api/src/main/resources/application.yml

@@ -64,7 +64,7 @@ renren:
 mybatis-plus:
   mapper-locations: classpath*:/mapper/**/*.xml
   #实体扫描,多个package用逗号或者分号分隔
-  typeAliasesPackage: com.qnfhq.entity
+  typeAliasesPackage: com.qnfhq.modules.**.entity
   global-config:
     #数据库相关配置
     db-config:
@@ -113,11 +113,3 @@ sa-token:
   max-login-count: 2
 
 
-#springdoc:
-#  api-docs:
-#    enabled: true                  # 启用/禁用API文档的访问
-#    path: /v3/api-docs            # 设置API文档的访问路径
-#  swagger-ui:
-#    path: /swagger-ui.html        # 设置Swagger UI的访问路径
-#    enabled: true
-#  default-flat-param-object: false

+ 4 - 3
qnfhq-api/src/main/resources/i18n/messages_en.properties

@@ -91,9 +91,7 @@ c2c.order.availableAmount.insufficient=Your available assets must be greater tha
 c2c.order.param.adid=Invalid advertisement ID  
 c2c.order.param.adid.invalid=Advertisement is no longer available  
 c2c.order.direction.invalid=Invalid value for parameter direction  
-c2c.order.buyer.seller.must.different=Buyer and seller cannot be the same user  
-c2c.order.param.tranAmt.min=Transaction amount must be greater than the minimum limit  
-c2c.order.param.tranAmt.max=Transaction amount must be less than the maximum limit  
+c2c.order.buyer.seller.must.different=Buyer and seller cannot be the same user
 c2c.order.update.asset.fail=Failed to update seller?s assets  
 c2c.order.not.exist=Invalid order number  
 c2c.order.status.end.not.cancel=Order has ended and cannot be canceled  
@@ -131,3 +129,6 @@ c2c.order.availableAmount.buzu=Your available assets are insufficient
 c2c.order.not.seller=You are not the seller
 c2c.userReceipt.id.invalid=Invalid ID
 c2c.order.complainId.orderId.all.empty=Complaint ID and order ID cannot both be empty
+c2c.order.param.tranAmt.min=The amount must be greater than the advertisement minimum limit  
+c2c.order.param.tranAmt.max=The amount must be less than the advertisement maximum limit  
+c2c.order.param.tranAmt.over.avail=The transaction amount exceeds the available quantity of the advertisement

+ 4 - 4
qnfhq-api/src/main/resources/i18n/messages_zh.properties

@@ -93,8 +93,6 @@ c2c.order.param.adid=\u5e7f\u544a\u7f16\u53f7\u65e0\u6548
 c2c.order.param.adid.invalid=\u5e7f\u544a\u5df2\u4e0d\u53ef\u7528
 c2c.order.direction.invalid=\u53c2\u6570direction\u503c\u4e0d\u6b63\u786e
 c2c.order.buyer.seller.must.different=\u4e70\u5bb6\u548c\u5356\u5bb6\u4e0d\u80fd\u662f\u540c\u4e00\u4e2a\u7528\u6237
-c2c.order.param.tranAmt.min=\u4ea4\u6613\u91d1\u989d\u5fc5\u987b\u5927\u4e8e\u6700\u5c0f\u9650\u989d
-c2c.order.param.tranAmt.max=\u4ea4\u6613\u91d1\u989d\u5fc5\u987b\u5c0f\u4e8e\u6700\u5927\u9650\u989d
 c2c.order.update.asset.fail=\u66f4\u65b0\u5356\u5bb6\u8d44\u4ea7\u5931\u8d25
 c2c.order.not.exist=\u8ba2\u5355\u7f16\u53f7\u65e0\u6548
 c2c.order.status.end.not.cancel=\u8ba2\u5355\u5df2\u7ed3\u675f\u4e0d\u80fd\u53d6\u6d88
@@ -132,5 +130,7 @@ c2c.order.availableAmount.buzu=\u60a8\u7684\u53ef\u7528\u8d44\u4ea7\u4e0d\u8db3
 c2c.order.not.seller=\u60a8\u4e0d\u662f\u5356\u5bb6
 c2c.userReceipt.id.invalid=\u7f16\u53f7\u65e0\u6548
 c2c.order.complainId.orderId.all.empty=\u7533\u8bc9\u7f16\u53f7\u3001\u8ba2\u5355\u7f16\u53f7\u4e0d\u80fd\u90fd\u4e3a\u7a7a
-
-
+#new
+c2c.order.param.tranAmt.min=\u91d1\u989d\u5fc5\u987b\u5927\u4e8e\u5e7f\u544a\u6700\u5c0f\u9650\u989d
+c2c.order.param.tranAmt.max=\u91d1\u989d\u5fc5\u987b\u5c0f\u4e8e\u5e7f\u544a\u6700\u5927\u9650\u989d
+c2c.order.param.tranAmt.over.avail=\u4ea4\u6613\u91d1\u989d\u8d85\u8fc7\u5e7f\u544a\u53ef\u7528\u6570\u91cf

+ 1 - 2
qnfhq-api/src/main/resources/i18n/validation.properties

@@ -24,8 +24,7 @@ NotNull.status=Status tidak boleh kosong
 NotNull.payType=Cara pembayaran tidak boleh kosong  
 NotBlank.receiptInfo=Maklumat penerimaan tidak boleh kosong  
 NotNull.c2cAdId=Nombor iklan tidak boleh kosong  
-NotNull.tranAmount=Jumlah transaksi tidak boleh kosong  
-NotNull.tranBy=Cara transaksi tidak boleh kosong  
+NotNull.tranAmount=Jumlah transaksi tidak boleh kosong
 NotNull.oId=Nombor pesanan tidak boleh kosong  
 NotBlank.img=Bukti pembayaran tidak boleh kosong  
 NotNull.id=Nombor tidak boleh kosong  

+ 1 - 2
qnfhq-api/src/main/resources/i18n/validation_de.properties

@@ -24,8 +24,7 @@ NotNull.status=Status darf nicht leer sein
 NotNull.payType=Zahlungsart darf nicht leer sein  
 NotBlank.receiptInfo=Empfangsinformationen d\u00fcrfen nicht leer sein  
 NotNull.c2cAdId=Anzeige-ID darf nicht leer sein  
-NotNull.tranAmount=Transaktionsbetrag darf nicht leer sein  
-NotNull.tranBy=Transaktionsart darf nicht leer sein  
+NotNull.tranAmount=Transaktionsbetrag darf nicht leer sein
 NotNull.oId=Bestellnummer darf nicht leer sein  
 NotBlank.img=Zahlungsnachweis darf nicht leer sein  
 NotNull.id=ID darf nicht leer sein  

+ 4 - 2
qnfhq-api/src/main/resources/i18n/validation_en.properties

@@ -25,7 +25,6 @@ NotNull.payType=Payment method cannot be empty
 NotBlank.receiptInfo=Receipt information cannot be empty
 NotNull.c2cAdId=Advertisement ID cannot be empty
 NotNull.tranAmount=Transaction amount cannot be empty
-NotNull.tranBy=Transaction method cannot be empty
 NotNull.oId=Order ID cannot be empty
 NotBlank.img=Payment voucher cannot be empty
 NotNull.id=ID cannot be empty
@@ -36,4 +35,7 @@ NotBlank.reason=Appeal reason cannot be empty
 NotBlank.remark=Voucher description cannot be empty
 NotBlank.img1=Voucher screenshot 1 cannot be empty
 NotNull.complainId=Appeal ID cannot be empty
-NotBlank.country=Country cannot be empty
+NotBlank.country=Country cannot be empty
+
+NotNull.tag=Tag cannot be empty
+NotNull.unit

+ 1 - 2
qnfhq-api/src/main/resources/i18n/validation_es.properties

@@ -24,8 +24,7 @@ NotNull.status=El estado no puede estar vac\u00edo
 NotNull.payType=El tipo de pago no puede estar vac\u00edo  
 NotBlank.receiptInfo=La informaci\u00f3n de recibo no puede estar vac\u00eda  
 NotNull.c2cAdId=El n\u00famero de anuncio no puede estar vac\u00edo  
-NotNull.tranAmount=El monto de la transacci\u00f3n no puede estar vac\u00edo  
-NotNull.tranBy=El m\u00e9todo de transacci\u00f3n no puede estar vac\u00edo  
+NotNull.tranAmount=El monto de la transacci\u00f3n no puede estar vac\u00edo
 NotNull.oId=El n\u00famero de orden no puede estar vac\u00edo  
 NotBlank.img=El comprobante de pago no puede estar vac\u00edo  
 NotNull.id=El n\u00famero no puede estar vac\u00edo  

+ 1 - 2
qnfhq-api/src/main/resources/i18n/validation_fr.properties

@@ -24,8 +24,7 @@ NotNull.status=Le statut ne peut pas \u00eatre vide
 NotNull.payType=Le mode de paiement ne peut pas \u00eatre vide  
 NotBlank.receiptInfo=Les informations de r\u00e9ception ne peuvent pas \u00eatre vides  
 NotNull.c2cAdId=Le num\u00e9ro de l'annonce ne peut pas \u00eatre vide  
-NotNull.tranAmount=Le montant de la transaction ne peut pas \u00eatre vide  
-NotNull.tranBy=Le mode de transaction ne peut pas \u00eatre vide  
+NotNull.tranAmount=Le montant de la transaction ne peut pas \u00eatre vide
 NotNull.oId=Le num\u00e9ro de commande ne peut pas \u00eatre vide  
 NotBlank.img=La preuve de paiement ne peut pas \u00eatre vide  
 NotNull.id=Le num\u00e9ro ne peut pas \u00eatre vide  

+ 0 - 1
qnfhq-api/src/main/resources/i18n/validation_ja.properties

@@ -25,7 +25,6 @@ NotNull.payType=\u652f\u6255\u3044\u30bf\u30a4\u30d7\u3092\u7a7a\u306b\u3067\u30
 NotBlank.receiptInfo=\u53d7\u53d6\u60c5\u5831\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotNull.c2cAdId=\u5e83\u544a\u756a\u53f7\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotNull.tranAmount=\u53d6\u5f15\u91d1\u984d\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
-NotNull.tranBy=\u53d6\u5f15\u65b9\u6cd5\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotNull.oId=\u6ce8\u6587\u756a\u53f7\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotBlank.img=\u652f\u6255\u3044\u8a3c\u660e\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotNull.id=\u756a\u53f7\u3092\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093

+ 1 - 2
qnfhq-api/src/main/resources/i18n/validation_ko.properties

@@ -24,8 +24,7 @@ NotNull.status=\uc0c1\ud0dc\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\u
 NotNull.payType=\uacb0\uc81c \ubc29\uc2dd\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
 NotBlank.receiptInfo=\uc218\ucde8 \uc815\ubcf4\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
 NotNull.c2cAdId=\uad11\uace0 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
-NotNull.tranAmount=\uac70\ub798 \uae08\uc561\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
-NotNull.tranBy=\uac70\ub798 \ubc29\uc2dd\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
+NotNull.tranAmount=\uac70\ub798 \uae08\uc561\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
 NotNull.oId=\uc8fc\ubb38 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
 NotBlank.img=\uacb0\uc81c \uc99d\uba85\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
 NotNull.id=\ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  

+ 0 - 1
qnfhq-api/src/main/resources/i18n/validation_th.properties

@@ -25,7 +25,6 @@ NotNull.payType=\u0e27\u0e34\u0e18\u0e35\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e
 NotBlank.receiptInfo=\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e01\u0e32\u0e23\u0e23\u0e31\u0e1a\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotNull.c2cAdId=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e06\u0e29\u0e13\u0e32 C2C \u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotNull.tranAmount=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e17\u0e35\u0e48\u0e17\u0e33\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
-NotNull.tranBy=\u0e27\u0e34\u0e18\u0e35\u0e01\u0e32\u0e23\u0e17\u0e33\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotNull.oId=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49
 NotBlank.img=\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotNull.id=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07

+ 0 - 1
qnfhq-api/src/main/resources/i18n/validation_tw.properties

@@ -25,7 +25,6 @@ NotNull.payType=\u652f\u4ed8\u65b9\u5f0f\u4e0d\u80fd\u70ba\u7a7a
 NotBlank.receiptInfo=\u6536\u6b3e\u4fe1\u606f\u4e0d\u80fd\u7a7a
 NotNull.c2cAdId=\u5ee3\u544a\u7de8\u865f\u4e0d\u80fd\u70ba\u7a7a
 NotNull.tranAmount=\u4ea4\u6613\u91d1\u984d\u4e0d\u80fd\u70ba\u7a7a
-NotNull.tranBy=\u4ea4\u6613\u65b9\u5f0f\u4e0d\u80fd\u70ba\u7a7a
 NotNull.oId=\u8a02\u55ae\u7de8\u865f\u4e0d\u80fd\u70ba\u7a7a
 NotBlank.img=\u652f\u4ed8\u6191\u8b49\u4e0d\u80fd\u70ba\u7a7a
 NotNull.id=\u7de8\u865f\u4e0d\u80fd\u70ba\u7a7a

+ 0 - 1
qnfhq-api/src/main/resources/i18n/validation_vi.properties

@@ -25,7 +25,6 @@ NotNull.payType=Ph\u01b0\u01a1ng th\u1ee9c thanh to\u00e1n kh\u00f4ng \u0111\u01
 NotBlank.receiptInfo=Th\u00f4ng tin nh\u1eadn ti\u1ec1n kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotNull.c2cAdId=M\u00e3 qu\u1ea3ng c\u00e1o kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotNull.tranAmount=S\u1ed1 ti\u1ec1n giao d\u1ecbch kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
-NotNull.tranBy=Ph\u01b0\u01a1ng th\u1ee9c giao d\u1ecbch kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotNull.oId=M\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotBlank.img=B\u1eb1ng ch\u1ee9ng thanh to\u00e1n kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotNull.id=M\u00e3 s\u1ed1 kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng

+ 4 - 2
qnfhq-api/src/main/resources/i18n/validation_zh.properties

@@ -25,7 +25,6 @@ NotNull.payType=\u652f\u4ed8\u65b9\u5f0f\u4e0d\u80fd\u4e3a\u7a7a
 NotBlank.receiptInfo=\u6536\u6b3e\u4fe1\u606f\u4e0d\u80fd\u7a7a
 NotNull.c2cAdId=\u5e7f\u544a\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.tranAmount=\u4ea4\u6613\u91d1\u989d\u4e0d\u80fd\u4e3a\u7a7a
-NotNull.tranBy=\u4ea4\u6613\u65b9\u5f0f\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.oId=\u8ba2\u5355\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
 NotBlank.img=\u652f\u4ed8\u51ed\u8bc1\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.id=\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
@@ -36,4 +35,7 @@ NotBlank.reason=\u7533\u8bc9\u539f\u56e0\u4e0d\u80fd\u4e3a\u7a7a
 NotBlank.remark=\u51ed\u8bc1\u63cf\u8ff0\u4e0d\u80fd\u4e3a\u7a7a
 NotBlank.img1=\u51ed\u8bc1\u622a\u56fe1\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.complainId=\u7533\u8bc9\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
-NotBlank.country=\u56fd\u5bb6\u4e0d\u80fd\u4e3a\u7a7a
+NotBlank.country=\u56fd\u5bb6\u4e0d\u80fd\u4e3a\u7a7a
+
+NotNull.tag=\u6807\u7b7e\u4e0d\u80fd\u4e3a\u7a7a
+NotNull.unit

+ 2 - 0
qnfhq-api/src/main/resources/mapper/c2c/C2cAdDao.xml

@@ -25,6 +25,8 @@
         <result property="updateTime" column="update_time"/>
         <result property="reason" column="reason"/>
         <result property="version" column="version"/>
+        <result property="tag" column="tag"/>
+
     </resultMap>
 
     <update id="updateC2cAdAvailableNumById" parameterType="java.util.Map">

+ 6 - 0
qnfhq-api/src/main/resources/mapper/c2c/C2cMerchantDao.xml

@@ -27,6 +27,12 @@
         <result property="firstTranNum" column="first_tran_num"/>
         <result property="firstTranTime" column="first_tran_time"/>
         <result property="operateTime" column="operate_time"/>
+        <result property="tag" column="tag"/>
+        <result property="day30BuyNum" column="day30_buy_num"/>
+        <result property="day30SellNum" column="day30_sell_num"/>
+        <result property="day30TranUserNum" column="day30_tran_user_num"/>
+        <result property="averagePayTime" column="average_pay_time"/>
+        <result property="averagePassTime" column="average_pass_time"/>
     </resultMap>
 
 

+ 8 - 8
qnfhq-api/src/main/resources/mapper/c2c/C2cOrderDao.xml

@@ -18,13 +18,15 @@
         <result property="symbolNum" column="symbol_num"/>
         <result property="tranAmount" column="tran_amount"/>
         <result property="payType" column="pay_type"/>
+        <result property="payTime" column="pay_time"/>
         <result property="flow" column="flow"/>
         <result property="status" column="status"/>
         <result property="remark" column="remark"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
-        <result property="endTime" column="end_time"/>
-        <result property="expireTime" column="expire_time"/>
+        <result property="payExpireTime" column="pay_expire_time"/>
+        <result property="finishTime" column="finish_time"/>
+        <result property="closeTime" column="close_time"/>
     </resultMap>
 
     <insert id="insertC2cOrder" parameterType="com.qnfhq.modules.c2c.entity.C2cOrderEntity" useGeneratedKeys="true" keyProperty="id">
@@ -48,8 +50,7 @@
             <if test="remark != null">remark,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateTime != null">update_time,</if>
-            <if test="endTime != null">end_time,</if>
-            expire_time,
+            pay_expire_time,
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderNo != null">#{orderNo},</if>
@@ -68,10 +69,9 @@
             <if test="flow != null">#{flow},</if>
             <if test="status != null">#{status},</if>
             <if test="remark != null">#{remark},</if>
-            <if test="createTime != null">#{createTime},</if>
-            <if test="updateTime != null">#{updateTime},</if>
-            <if test="endTime != null">#{endTime},</if>
-            UNIX_TIMESTAMP()+1800
+            <if test="createTime != null">NOW(),</if>
+            <if test="updateTime != null">NOW(),</if>
+             DATE_ADD(NOW(), INTERVAL 30 MINUTE)
         </trim>
     </insert>
 </mapper>