Procházet zdrojové kódy

c2c 订单消息通知

30262728@qq.com před 6 dny
rodič
revize
d45c7229ec
36 změnil soubory, kde provedl 792 přidání a 148 odebrání
  1. 5 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cAdController.java
  2. 42 21
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java
  3. 16 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cUserStatDao.java
  4. 0 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cMsgContactDTO.java
  5. 0 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cMsgRelationDTO.java
  6. 40 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderMsgContentDTO.java
  7. 74 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cUserStatDTO.java
  8. 21 38
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMerchantEntity.java
  9. 1 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMsgContentEntity.java
  10. 89 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cUserStatEntity.java
  11. 1 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/enums/MsgTypeEnum.java
  12. 14 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cMsgContactService.java
  13. 48 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cMsgContentService.java
  14. 14 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cMsgRelationService.java
  15. 14 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cUserStatService.java
  16. 2 5
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cAdServiceImpl.java
  17. 17 3
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMsgContactServiceImpl.java
  18. 236 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMsgContentServiceImpl.java
  19. 19 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMsgRelationServiceImpl.java
  20. 12 15
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java
  21. 33 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cUserStatServiceImpl.java
  22. 15 0
      qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java
  23. 4 4
      qnfhq-api/src/main/resources/i18n/messages.properties
  24. 4 4
      qnfhq-api/src/main/resources/i18n/messages_de.properties
  25. 4 4
      qnfhq-api/src/main/resources/i18n/messages_en.properties
  26. 4 4
      qnfhq-api/src/main/resources/i18n/messages_es.properties
  27. 4 4
      qnfhq-api/src/main/resources/i18n/messages_fr.properties
  28. 4 4
      qnfhq-api/src/main/resources/i18n/messages_ja.properties
  29. 4 4
      qnfhq-api/src/main/resources/i18n/messages_ko.properties
  30. 4 4
      qnfhq-api/src/main/resources/i18n/messages_th.properties
  31. 4 4
      qnfhq-api/src/main/resources/i18n/messages_tw.properties
  32. 4 4
      qnfhq-api/src/main/resources/i18n/messages_vi.properties
  33. 4 4
      qnfhq-api/src/main/resources/i18n/messages_zh.properties
  34. 6 8
      qnfhq-api/src/main/resources/mapper/c2c/C2cMerchantDao.xml
  35. 27 0
      qnfhq-api/src/main/resources/mapper/c2c/C2cUserStatDao.xml
  36. 2 2
      qnfhq-generator/src/main/resources/generator.properties

+ 5 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cAdController.java

@@ -25,6 +25,7 @@ import com.qnfhq.modules.user.enums.SettingEnum;
 import com.qnfhq.modules.user.service.SettingService;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -42,6 +43,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 @RestController
 @RequestMapping("/c2cad")
 @Tag(name="c2c商家广告")
+@Slf4j
 public class C2cAdController extends ApiBaseController {
     @Resource
     private C2cAdService c2cAdService;
@@ -101,7 +103,7 @@ public class C2cAdController extends ApiBaseController {
             return result.error(MessageUtils.message("merchant.maxAmount.smaller.price.num"));//最大限额必须小于价格和数量之积
         }
 
-        //广告配置
+        //广告配置: 限制价格范围、金额范围
         SettingEntity setting = settingService.getSetting(SettingEnum.AD_SETTING.name());
         List<AdSetting> adSettingsList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AdSetting.class);
         if (!CollectionUtils.isEmpty(adSettingsList)) {
@@ -120,7 +122,7 @@ public class C2cAdController extends ApiBaseController {
                 } else if (price.compareTo(adSet.getMaxPrice())==1) {
                     return result.error(MessageUtils.message("c2cAd.price.must.small.set",adSet.getMaxPrice()));//价格必须小于{}
                 }
-                if(minAmount.compareTo(adSet.getMinAmount())==1) {
+                if(minAmount.compareTo(adSet.getMinAmount())==-1) {
                     return result.error(MessageUtils.message("c2cAd.minAmount.must.bigger.set",adSet.getMinAmount()));//最小限额必须大于{}
                 }
                 if(maxAmount.compareTo(adSet.getMaxAmount())==1) {
@@ -133,6 +135,7 @@ public class C2cAdController extends ApiBaseController {
             long loginId = StpUtil.getLoginIdAsLong();
             return c2cAdService.createAd(request,loginId);
         } catch (Exception e) {
+            logger.error("创建广告失败",e);
             return result.error(e.getMessage());
         }
     }

+ 42 - 21
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java

@@ -87,7 +87,7 @@ public class C2cOrderController extends ApiBaseController {
     @Resource
     private AppUserService appUserService;
     @Resource
-    private C2cMerchantService c2cMerchantService;
+    private C2cUserStatService c2cUserStatService;
 
 
     private String getC2cAdLockKey(String adId) {
@@ -109,7 +109,7 @@ public class C2cOrderController extends ApiBaseController {
         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));
+            C2cOrderEntity order = c2cOrderService.selectById(Long.valueOf(orderId));
             if(order == null) {//订单编号无效
                 c2cOrderService.deleteOrderCache(orderId, StpUtil.getLoginIdAsString());
             } else {
@@ -174,18 +174,19 @@ public class C2cOrderController extends ApiBaseController {
         BigDecimal availableNum = c2cAd.getAvailableNum();
         BigDecimal minAmount = c2cAd.getMinAmount();
         BigDecimal maxAmount = c2cAd.getMaxAmount();
-        BigDecimal price = c2cAd.getPrice();
+        BigDecimal price = c2cAd.getPrice().setScale(2, RoundingMode.DOWN);
 
-        //数币金额
         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);
+            symbolAmount = c2cOrder.getTranAmount().divide(price,8, RoundingMode.DOWN);
             legalCoinAmount = c2cOrder.getTranAmount().setScale(2, RoundingMode.DOWN);
         }
         //卖出检查资产
@@ -212,9 +213,6 @@ public class C2cOrderController extends ApiBaseController {
             return error(MessageUtils.message("c2c.order.param.adid.invalid"));//广告已不可用
         }
 
-//        if(c2cAdService.selectAdFromRedis(c2cOrder.getC2cAdId())==null) {
-//            c2cAdService.setAdCache(c2cAd);
-//        }
         //买入对应广告卖出
         if(direction.intValue() == c2cAd.getDirection().intValue()) {
             return error(MessageUtils.message("c2c.order.direction.invalid"));//参数direction值不正确
@@ -281,7 +279,7 @@ public class C2cOrderController extends ApiBaseController {
     {
         ValidatorUtils.validateEntity(dto);
 
-        C2cOrderEntity order = c2cOrderService.selectOrder(dto.getId());
+        C2cOrderEntity order = c2cOrderService.selectById(dto.getId());
         if(order == null) {
             return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
         }
@@ -790,31 +788,54 @@ public class C2cOrderController extends ApiBaseController {
 
 
     /**
-     * c2c我的信息
-     *
+     * c2c我的-详情
+     * 用户信息 
+     * 资金看板
+     * 详情
      */
-    @Operation(summary = "c2c我的")
+    @Operation(summary = "c2c我的-详情")
     @PostMapping("/myInfo")
     public Result myInfo()
     {
         AppUserEntity user = appUserService.getById(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());
+        AppUserDetailEntity detail = appUserDetailService.selectAppUserDetailByUserId(StpUtil.getLoginIdAsLong());
+        AppAssetEntity asset = appAssetService.getAppAssetEntity(StpUtil.getLoginIdAsLong(), "usdt",AssetEnum.PLATFORM_ASSETS.getCode());
+        C2cUserStatEntity userStat = c2cUserStatService.getById(StpUtil.getLoginIdAsLong());
 
+        if(user == null || detail == null || asset == null || userStat == null) {
+            return error(MessageUtils.message("user.not.exist"));//用户不存在
+        }
+
+        //邮箱 手机 国家 实名认证时间 注册日期
         Map data = MapUtil.of("email", user.getEmail());
+        data.put("userId", user.getId());
         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("avatar", user.getAvatar());
+        data.put("registerTime", DateUtils.format(user.getCreateTime(),"yyyy/MM/dd"));
+        data.put("authTime", 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());
 
+        //总成交单数 总成交率 平均付款时间 平均放币时间
+        data.put("finishNum",userStat.getFinishNum());
+        data.put("finishRate",userStat.getFinishRate());
+        data.put("averagePayTime",userStat.getAveragePayTime());
+        data.put("averagePassTime",userStat.getAveragePassTime());
+        //近30天:购买 出售  近30天 成交单数
+        data.put("day30Num",userStat.getDay30Num());
+        data.put("day30BuyNum",userStat.getDay30BuyNum());
+        data.put("day30SellNum",userStat.getDay30SellNum());
+        // 近30天:成交率 购买率 出售率 交易对手数
+        data.put("day30TranRate",userStat.getDay30TranRate());
+        data.put("day30BuyRate",userStat.getDay30BuyRate());
+        data.put("day30SellRate",userStat.getDay30SellRate());
+        data.put("day30TranUserNum",userStat.getDay30TranUserNum());
+        // 粉丝数
+        data.put("fanNum",userStat.getFanNum());
         return success(data);
     }
 

+ 16 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cUserStatDao.java

@@ -0,0 +1,16 @@
+package com.qnfhq.modules.c2c.dao;
+
+import com.qnfhq.common.dao.BaseDao;
+import com.qnfhq.modules.c2c.entity.C2cUserStatEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * C2C用户统计表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-27
+ */
+@Mapper
+public interface C2cUserStatDao extends BaseDao<C2cUserStatEntity> {
+	
+}

+ 0 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cMsgContactDTO.java

@@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.media.SchemaProperty;
 import lombok.Data;
 
 import java.io.Serializable;
-import java.util.Date;
 
 
 /**

+ 0 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cMsgRelationDTO.java

@@ -6,7 +6,6 @@ import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serializable;
-import java.util.Date;
 
 
 /**

+ 40 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderMsgContentDTO.java

@@ -0,0 +1,40 @@
+package com.qnfhq.modules.c2c.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.media.SchemaProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * c2c消息内容格式
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-25
+ */
+@Data
+@Schema(name = "c2c消息内容格式")
+public class C2cOrderMsgContentDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	@SchemaProperty(name = "标题")
+	private String title;
+
+	@SchemaProperty(name = "描述")
+	private String description;
+
+	@SchemaProperty(name = "链接文字")
+	private String linkName;
+
+    @SchemaProperty(name = "链接类别")
+    private String linkCode;
+
+    @SchemaProperty(name = "订单自增编号")
+    private Long orderId;
+
+    @SchemaProperty(name = "订单号")
+    private String orderNo;
+
+
+}

+ 74 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cUserStatDTO.java

@@ -0,0 +1,74 @@
+package com.qnfhq.modules.c2c.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.media.SchemaProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * C2C用户统计表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-27
+ */
+@Data
+@Schema(name = "C2C用户统计表")
+public class C2cUserStatDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	@SchemaProperty(name = "用户编号")
+	private Long userId;
+
+	@SchemaProperty(name = "")
+	private Date createTime;
+
+	@SchemaProperty(name = "")
+	private Date updateTime;
+
+	@SchemaProperty(name = "成交单数")
+	private Integer finishNum;
+
+	@SchemaProperty(name = "买入完成单数")
+	private Integer buyFinishNum;
+
+	@SchemaProperty(name = "卖出完成单数")
+	private Integer sellFinishNum;
+
+	@SchemaProperty(name = "成交率")
+	private String finishRate;
+
+	@SchemaProperty(name = "平均付款用时(分钟秒)")
+	private Integer averagePayTime;
+
+	@SchemaProperty(name = "平均放币用时(分钟秒)")
+	private Integer averagePassTime;
+
+	@SchemaProperty(name = "30日成单数")
+	private Integer day30Num;
+
+	@SchemaProperty(name = "30日购买单数")
+	private Integer day30BuyNum;
+
+	@SchemaProperty(name = "30日出售单数")
+	private Integer day30SellNum;
+
+	@SchemaProperty(name = "近30天成交率")
+	private String day30TranRate;
+
+	@SchemaProperty(name = "近30天购买率")
+	private String day30BuyRate;
+
+	@SchemaProperty(name = "近30天出售率")
+	private String day30SellRate;
+
+	@SchemaProperty(name = "30日交易对手数")
+	private Integer day30TranUserNum;
+
+	@SchemaProperty(name = "粉丝数")
+	private Integer fanNum;
+
+
+}

+ 21 - 38
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMerchantEntity.java

@@ -12,7 +12,7 @@ import java.util.Date;
  * C2C认证商家表
  *
  * @author yelz 30262728@qq.com
- * @since 1.0.0 2025-11-17
+ * @since 1.0.0 2025-11-27
  */
 @Data
 @TableName("c2c_merchant")
@@ -47,7 +47,7 @@ public class C2cMerchantEntity implements Serializable {
      */
 	private Integer margin;
     /**
-     * 状态 0 申请审批中  1 审批通过 -1 审批不通过 2锁定 -2已删除
+     * 状态 0 审批中  1通过 -1不通过 2锁定 -2已删除
      */
 	private Integer status;
     /**
@@ -87,21 +87,33 @@ public class C2cMerchantEntity implements Serializable {
      */
 	private Integer day30Num;
     /**
-     * 平均用时分钟
+     * 30日购买单数
+     */
+	private Integer day30BuyNum;
+    /**
+     * 30日出售单数
      */
-	private Integer averageTime;
+	private Integer day30SellNum;
     /**
-     * 平均用时分钟
+     * 30日平均付款用时(分钟)
      */
-	private Integer averageCancelTime;
+	private Integer day30AvgPayTime;
     /**
-     * 创建时长天
+     * 30日平均放币用时(分钟)
+     */
+	private Integer day30AvgPassTime;
+    /**
+     * 创建时长(天)
      */
 	private Integer createNum;
     /**
-     * 首次交易
+     * 首次交易至今
      */
 	private Integer firstTranNum;
+    /**
+     * 交易对手数
+     */
+	private Integer tranUserNum;
     /**
      * 首次交易时间
      */
@@ -110,37 +122,8 @@ 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;
-
-
+	private Integer tag;
 }

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

@@ -35,7 +35,7 @@ public class C2cMsgContentEntity implements Serializable {
      */
 	private String content;
     /**
-     * 消息类型: text 文本 image 图片 voice 语音 video 视频 location位置 链接link
+     * 消息类型: text 文本, image 图片, voice 语音, video 视频, location位置, c2corder订单
      */
 	private String msgType;
     /**

+ 89 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cUserStatEntity.java

@@ -0,0 +1,89 @@
+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 lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * C2C用户统计表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-27
+ */
+@Data
+@TableName("c2c_user_stat")
+public class C2cUserStatEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    @TableId(value = "user_id", type = IdType.NONE)
+	private Long userId;
+    /**
+     * 
+     */
+	private Date createTime;
+    /**
+     * 
+     */
+	private Date updateTime;
+    /**
+     * 成交单数
+     */
+	private Integer finishNum;
+    /**
+     * 买入完成单数
+     */
+	private Integer buyFinishNum;
+    /**
+     * 卖出完成单数
+     */
+	private Integer sellFinishNum;
+    /**
+     * 成交率
+     */
+	private String finishRate;
+    /**
+     * 平均付款用时(分钟秒)
+     */
+	private Integer averagePayTime;
+    /**
+     * 平均放币用时(分钟秒)
+     */
+	private Integer averagePassTime;
+    /**
+     * 30日成单数
+     */
+	private Integer day30Num;
+    /**
+     * 30日购买单数
+     */
+	private Integer day30BuyNum;
+    /**
+     * 30日出售单数
+     */
+	private Integer day30SellNum;
+    /**
+     * 近30天成交率
+     */
+	private String day30TranRate;
+    /**
+     * 近30天购买率
+     */
+	private String day30BuyRate;
+    /**
+     * 近30天出售率
+     */
+	private String day30SellRate;
+    /**
+     * 30日交易对手数
+     */
+	private Integer day30TranUserNum;
+    /**
+     * 粉丝数
+     */
+	private Integer fanNum;
+}

+ 1 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/enums/MsgTypeEnum.java

@@ -7,6 +7,7 @@ public enum MsgTypeEnum {
     IMAGE,
     VOICE,
     VIDEO,
+    C2CORDER,
     LOCATION;
 
     public static boolean isValid(String name) {

+ 14 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cMsgContactService.java

@@ -2,8 +2,6 @@ package com.qnfhq.modules.c2c.service;
 
 import com.qnfhq.common.page.PageData;
 import com.qnfhq.common.service.BaseService;
-import com.qnfhq.common.service.CrudService;
-import com.qnfhq.modules.c2c.dto.C2cMsgContactDTO;
 import com.qnfhq.modules.c2c.entity.C2cMsgContactEntity;
 import com.qnfhq.modules.c2c.entity.C2cMsgContentEntity;
 import java.util.Map;
@@ -35,4 +33,18 @@ public interface C2cMsgContactService extends BaseService<C2cMsgContactEntity> {
      * @param msgEntity
      */
     void saveByMsgContact(C2cMsgContentEntity msgEntity) throws Exception;
+
+    /**
+     * 更新发件人的最近联系人
+     * @param msgEntity
+     * @throws Exception
+     */
+    void saveSenderUserMsgContact(C2cMsgContentEntity msgEntity) throws Exception;
+
+    /**
+     * 更新收件人的最近联系人
+     * @param msgEntity
+     * @throws Exception
+     */
+    void saveReceiptUserMsgContact(C2cMsgContentEntity msgEntity) throws Exception;
 }

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

@@ -14,10 +14,57 @@ import com.qnfhq.modules.c2c.entity.C2cMsgContentEntity;
 public interface C2cMsgContentService extends IService<C2cMsgContentEntity> {
 
     /**
-     * 保存消息
+     * 保存普通消息
      * @param dto
      * @return
      * @throws Exception
      */
     Result saveMsg(C2cMsgContentDTO dto) throws Exception;
+
+    /**
+     * 保存C2c订单消息
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    Result saveC2cOrderMsg(C2cMsgContentDTO dto) throws Exception;
+
+    /**
+     * 发送创建c2c订单消息
+     * @param buyId
+     * @param sellId
+     * @param orderId
+     * @param orderNo
+     */
+    void sendOrderCreateMsg(Long buyId, Long sellId, Long orderId,String orderNo) throws Exception;
+
+
+    /**
+     * 发送取消c2c订单消息
+     * @param buyId
+     * @param sellId
+     * @param orderId
+     * @param orderNo
+     */
+    void sendOrderCancelMsg(Long buyId, Long sellId, Long orderId,String orderNo);
+
+
+    /**
+     * 订单支付成功消息
+     * @param buyId
+     * @param sellId
+     * @param orderId
+     * @param orderNo
+     */
+    void sendOrderPayMsg(Long buyId, Long sellId, Long orderId,String orderNo);
+
+
+    /**
+     * 订单完成消息
+     * @param buyId
+     * @param sellId
+     * @param orderId
+     * @param orderNo
+     */
+    void sendOrderCompleteMsg(Long buyId, Long sellId, Long orderId,String orderNo);
 }

+ 14 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cMsgRelationService.java

@@ -2,8 +2,6 @@ package com.qnfhq.modules.c2c.service;
 
 import com.qnfhq.common.page.PageData;
 import com.qnfhq.common.service.BaseService;
-import com.qnfhq.common.service.CrudService;
-import com.qnfhq.modules.c2c.dto.C2cMsgRelationDTO;
 import com.qnfhq.modules.c2c.entity.C2cMsgContentEntity;
 import com.qnfhq.modules.c2c.entity.C2cMsgRelationEntity;
 
@@ -28,4 +26,18 @@ public interface C2cMsgRelationService extends BaseService<C2cMsgRelationEntity>
      * @param msgEntity
      */
     void saveMsgRelation(C2cMsgContentEntity msgEntity) throws Exception;
+
+    /**
+     * 存发件人的发件箱
+     * @param msgEntity
+     * @throws Exception
+     */
+    void saveSenderMsg(C2cMsgContentEntity msgEntity) throws Exception;
+
+    /**
+     *  存收件人的收件箱
+     * @param msgEntity
+     * @throws Exception
+     */
+    void saveRecipientMsg(C2cMsgContentEntity msgEntity) throws Exception;
 }

+ 14 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cUserStatService.java

@@ -0,0 +1,14 @@
+package com.qnfhq.modules.c2c.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qnfhq.modules.c2c.entity.C2cUserStatEntity;
+
+/**
+ * C2C用户统计表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-27
+ */
+public interface C2cUserStatService extends IService<C2cUserStatEntity> {
+
+}

+ 2 - 5
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cAdServiceImpl.java

@@ -129,11 +129,8 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         c2cAd.setPayway(new StringBuilder(",").append(payway).append(",").toString());
         c2cAd.setRemark(remark);
         c2cAd.setStatus(AdStatusEnum.PASS.getCode());
-        //成交量
-//        c2cAd.setFinishNum(merchant.getFinishNum());
-        //成单率
-//        c2cAd.setFinishRate(merchant.getFinishRate());
-        if(!updateById(c2cAd)) {
+        c2cAd.setTag(merchant.getTag());
+        if(!insert(c2cAd)) {
             throw new Exception(MessageUtils.message("c2c.order.save.fail"));//保存广告失败
         }
         if (direction.intValue() == DirectionEnum.SELL.getCode().intValue()) {

+ 17 - 3
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMsgContactServiceImpl.java

@@ -61,9 +61,17 @@ public class C2cMsgContactServiceImpl extends BaseServiceImpl<C2cMsgContactDao,
 
     @Override
     public void saveByMsgContact(C2cMsgContentEntity msgEntity) throws Exception{
-        AppUserEntity receiptUser = appUserService.getById(msgEntity.getRecipientId());
-        AppUserEntity senderUser = appUserService.getById(msgEntity.getSenderId());
         // 更新发件人的最近联系人
+        saveSenderUserMsgContact(msgEntity);
+
+        // 更新收件人的最近联系人
+        saveReceiptUserMsgContact(msgEntity);
+    }
+
+    // 更新发件人的最近联系人
+    @Override
+    public void saveSenderUserMsgContact(C2cMsgContentEntity msgEntity) throws Exception{
+        AppUserEntity receiptUser = appUserService.getById(msgEntity.getRecipientId());
         C2cMsgContactEntity senderContact = selectByOwnerUidOtherUid(msgEntity.getSenderId(), msgEntity.getRecipientId());
         if(senderContact!=null) {
             senderContact.setMid(msgEntity.getMid());
@@ -81,8 +89,12 @@ public class C2cMsgContactServiceImpl extends BaseServiceImpl<C2cMsgContactDao,
             senderContact.setCreateTime(new Date());
             insert(senderContact);
         }
+    }
 
-        // 更新收件人的最近联系人
+    // 更新收件人的最近联系人
+    @Override
+    public void saveReceiptUserMsgContact(C2cMsgContentEntity msgEntity) throws Exception{
+        AppUserEntity senderUser = appUserService.getById(msgEntity.getSenderId());
         C2cMsgContactEntity receipterContact = selectByOwnerUidOtherUid(msgEntity.getRecipientId(),msgEntity.getSenderId());
         if(receipterContact!=null) {
             receipterContact.setMid(msgEntity.getMid());
@@ -101,4 +113,6 @@ public class C2cMsgContactServiceImpl extends BaseServiceImpl<C2cMsgContactDao,
             insert(receipterContact);
         }
     }
+
+
 }

+ 236 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMsgContentServiceImpl.java

@@ -1,21 +1,28 @@
 package com.qnfhq.modules.c2c.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qnfhq.common.redis.RedisUtils;
 import com.qnfhq.common.utils.Result;
 import com.qnfhq.constant.CacheConstants;
 import com.qnfhq.modules.c2c.dao.C2cMsgContentDao;
 import com.qnfhq.modules.c2c.dto.C2cMsgContentDTO;
+import com.qnfhq.modules.c2c.dto.C2cOrderMsgContentDTO;
 import com.qnfhq.modules.c2c.entity.C2cMsgContentEntity;
+import com.qnfhq.modules.c2c.entity.C2cPaymentVoucherEntity;
 import com.qnfhq.modules.c2c.enums.MsgStatusEnum;
+import com.qnfhq.modules.c2c.enums.MsgTypeEnum;
 import com.qnfhq.modules.c2c.service.C2cMsgContactService;
 import com.qnfhq.modules.c2c.service.C2cMsgContentService;
 import com.qnfhq.modules.c2c.service.C2cMsgRelationService;
+import com.qnfhq.modules.c2c.service.C2cPaymentVoucherService;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * 聊天消息表
@@ -31,14 +38,22 @@ public class C2cMsgContentServiceImpl extends ServiceImpl<C2cMsgContentDao, C2cM
     @Resource
     private C2cMsgContactService c2cMsgContactService;
     @Resource
+    private C2cPaymentVoucherService c2cPaymentVoucherService;
+    @Resource
     private RedisUtils redisUtils;
 
 
+    /**
+     *  发送普通消息
+     * @param dto
+     * @return
+     * @throws Exception
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Result saveMsg(C2cMsgContentDTO dto) throws Exception{
         C2cMsgContentEntity msgEntity = new C2cMsgContentEntity();
-        msgEntity.setSenderId(StpUtil.getLoginIdAsLong());
+        msgEntity.setSenderId(dto.getSenderId());
         msgEntity.setRecipientId(dto.getRecipientId());
         msgEntity.setContent(dto.getContent());
         msgEntity.setMsgType(dto.getMsgType().toLowerCase());
@@ -59,4 +74,224 @@ public class C2cMsgContentServiceImpl extends ServiceImpl<C2cMsgContentDao, C2cM
         return new Result().ok(msgEntity);
     }
 
+
+    /**
+     * 保存c2c订单消息
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result saveC2cOrderMsg(C2cMsgContentDTO dto) throws Exception{
+        C2cMsgContentEntity msgEntity = new C2cMsgContentEntity();
+        msgEntity.setSenderId(dto.getSenderId());
+        msgEntity.setRecipientId(dto.getRecipientId());
+        msgEntity.setContent(dto.getContent());
+        msgEntity.setMsgType(MsgTypeEnum.C2CORDER.name().toLowerCase());
+        msgEntity.setStatus(MsgStatusEnum.SEND.getCode());
+        msgEntity.setSendTime(new Date());
+        if(save(msgEntity)) {
+            // 存收件人的收件箱
+            c2cMsgRelationService.saveRecipientMsg(msgEntity);
+
+            // 保存收件人的最近联系人
+            c2cMsgContactService.saveReceiptUserMsgContact(msgEntity);
+
+            //总未读数更新 2001534_UNREAD_T
+            redisUtils.increment(CacheConstants.getTotalUnreadKey(msgEntity.getRecipientId()), 1L,-1L);
+            //聊天用户未读数更新
+            redisUtils.increment(CacheConstants.getChatUnreadKey(msgEntity.getRecipientId()), msgEntity.getSenderId().toString(), 1L, -1L);
+        }
+        return new Result().ok(msgEntity);
+    }
+
+    @Override
+    public void sendOrderCreateMsg(Long buyId, Long sellId, Long orderId,String orderNo) {
+        // 买家收到消息
+        C2cMsgContentDTO dto = new C2cMsgContentDTO();
+        dto.setSenderId(sellId);
+        dto.setRecipientId(buyId);
+        C2cOrderMsgContentDTO msgContent = new C2cOrderMsgContentDTO();
+        msgContent.setTitle("您有一笔待支付的订单,请及时支付");
+        msgContent.setDescription("");
+        msgContent.setOrderId(orderId);
+        msgContent.setOrderNo(orderNo);
+        msgContent.setLinkName("去付款");
+        msgContent.setLinkCode("Pay");
+        dto.setContent(JSON.toJSONString(msgContent));
+        try {
+            saveC2cOrderMsg(dto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+
+        // 卖家收到消息
+        C2cMsgContentDTO sellDto = new C2cMsgContentDTO();
+        sellDto.setSenderId(buyId);
+        sellDto.setRecipientId(sellId);
+        C2cOrderMsgContentDTO sellMsgContent = new C2cOrderMsgContentDTO();
+        sellMsgContent.setTitle("您有一笔出售订单,等待对方支付");
+        sellMsgContent.setDescription("买家正在向您转账,请注意查收");
+        sellMsgContent.setOrderId(orderId);
+        sellMsgContent.setOrderNo(orderNo);
+        sellMsgContent.setLinkName("");
+        sellMsgContent.setLinkCode("");
+        sellDto.setContent(JSON.toJSONString(sellMsgContent));
+        try {
+            saveC2cOrderMsg(sellDto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+
+    @Override
+    public void sendOrderCancelMsg(Long buyId, Long sellId, Long orderId,String orderNo) {
+        // 买家收到消息
+        C2cMsgContentDTO dto = new C2cMsgContentDTO();
+        dto.setSenderId(sellId);
+        dto.setRecipientId(buyId);
+        C2cOrderMsgContentDTO msgContent = new C2cOrderMsgContentDTO();
+        msgContent.setTitle(new StringBuilder("订单(").append(orderNo).append(")已取消").toString());
+        msgContent.setDescription("如已付款,请联系对方要求退款,或联系客服求助");
+        msgContent.setOrderId(orderId);
+        msgContent.setOrderNo(orderNo);
+        msgContent.setLinkName("获得帮助");
+        msgContent.setLinkCode("Help");
+        dto.setContent(JSON.toJSONString(msgContent));
+        try {
+            saveC2cOrderMsg(dto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+
+        // 卖家收到消息
+        C2cMsgContentDTO sellDto = new C2cMsgContentDTO();
+        sellDto.setSenderId(buyId);
+        sellDto.setRecipientId(sellId);
+        C2cOrderMsgContentDTO sellMsgContent = new C2cOrderMsgContentDTO();
+        sellMsgContent.setTitle("您有一笔出售订单,等待对方支付");
+        sellMsgContent.setDescription("买家正在向您转账,请注意查收");
+        sellMsgContent.setOrderId(orderId);
+        sellMsgContent.setOrderNo(orderNo);
+        sellMsgContent.setLinkName("");
+        sellMsgContent.setLinkCode("");
+        sellDto.setContent(JSON.toJSONString(sellMsgContent));
+        try {
+            saveC2cOrderMsg(sellDto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+
+    @Override
+    public void sendOrderPayMsg(Long buyId, Long sellId, Long orderId,String orderNo) {
+        // 买家收到消息
+        C2cMsgContentDTO dto = new C2cMsgContentDTO();
+        dto.setSenderId(sellId);
+        dto.setRecipientId(buyId);
+        C2cOrderMsgContentDTO msgContent = new C2cOrderMsgContentDTO();
+        msgContent.setTitle("已付款,等待卖家确认收款");
+        msgContent.setDescription("");
+        msgContent.setOrderId(orderId);
+        msgContent.setOrderNo(orderNo);
+        msgContent.setLinkName("查看详情");
+        msgContent.setLinkCode("OrderDetail");
+        dto.setContent(JSON.toJSONString(msgContent));
+        try {
+            saveC2cOrderMsg(dto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+
+        // 卖家收到消息
+        C2cMsgContentDTO sellDto = new C2cMsgContentDTO();
+        sellDto.setSenderId(buyId);
+        sellDto.setRecipientId(sellId);
+        C2cOrderMsgContentDTO sellMsgContent = new C2cOrderMsgContentDTO();
+        sellMsgContent.setTitle("买家已付款,请确认收款");
+        sellMsgContent.setDescription("");
+        sellMsgContent.setOrderId(orderId);
+        sellMsgContent.setOrderNo(orderNo);
+        sellMsgContent.setLinkName("确认");
+        sellMsgContent.setLinkCode("verifyReceipt");
+        sellDto.setContent(JSON.toJSONString(sellMsgContent));
+        try {
+            saveC2cOrderMsg(sellDto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+        //发送付款凭证
+        sendPayVoucherMsg(buyId, sellId, orderId, orderNo);
+
+    }
+
+    //发送付款凭证
+    private void sendPayVoucherMsg(Long buyId, Long sellId, Long orderId,String orderNo) {
+        List<C2cPaymentVoucherEntity> list = c2cPaymentVoucherService.selectList(orderId);
+        if(list!=null && list.size()>0) {
+            C2cMsgContentDTO payVDto = new C2cMsgContentDTO();
+            payVDto.setSenderId(buyId);
+            payVDto.setRecipientId(sellId);
+            payVDto.setContent("请查看支付凭证");
+            payVDto.setMsgType(MsgTypeEnum.TEXT.name());
+            try {
+                saveMsg(payVDto);
+            } catch (Exception e) {
+                log.error(e.getMessage());
+            }
+
+            for(C2cPaymentVoucherEntity pv:list) {
+                C2cMsgContentDTO payVImageDto = new C2cMsgContentDTO();
+                payVImageDto.setSenderId(buyId);
+                payVImageDto.setRecipientId(sellId);
+                payVImageDto.setContent(pv.getImg());
+                payVImageDto.setMsgType(MsgTypeEnum.IMAGE.name());
+                try {
+                    saveMsg(payVImageDto);
+                } catch (Exception e) {
+                    log.error(e.getMessage());
+                }
+            }
+        }
+    }
+
+    @Override
+    public void sendOrderCompleteMsg(Long buyId, Long sellId, Long orderId,String orderNo) {
+        // 买家收到消息
+        C2cMsgContentDTO dto = new C2cMsgContentDTO();
+        dto.setSenderId(sellId);
+        dto.setRecipientId(buyId);
+        C2cOrderMsgContentDTO msgContent = new C2cOrderMsgContentDTO();
+        msgContent.setTitle("卖家已确认收款,交易完成");
+        msgContent.setDescription("资产已经存入您的资金账户");
+        msgContent.setOrderId(orderId);
+        msgContent.setOrderNo(orderNo);
+        msgContent.setLinkName("查看资产");
+        msgContent.setLinkCode("UserAsset");
+        dto.setContent(JSON.toJSONString(msgContent));
+        try {
+            saveC2cOrderMsg(dto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+
+        // 卖家收到消息
+        C2cMsgContentDTO sellDto = new C2cMsgContentDTO();
+        sellDto.setSenderId(buyId);
+        sellDto.setRecipientId(sellId);
+        C2cOrderMsgContentDTO sellMsgContent = new C2cOrderMsgContentDTO();
+        sellMsgContent.setTitle("交易完成");
+        sellMsgContent.setDescription(new StringBuilder("订单(").append(orderNo).append(")已完成交易").toString());
+        sellMsgContent.setOrderId(orderId);
+        sellMsgContent.setOrderNo(orderNo);
+        sellMsgContent.setLinkName("");
+        sellMsgContent.setLinkCode("");
+        sellDto.setContent(JSON.toJSONString(sellMsgContent));
+        try {
+            saveC2cOrderMsg(sellDto);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+
 }

+ 19 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMsgRelationServiceImpl.java

@@ -44,6 +44,17 @@ public class C2cMsgRelationServiceImpl extends BaseServiceImpl<C2cMsgRelationDao
     @Override
     public void saveMsgRelation(C2cMsgContentEntity msgEntity) throws Exception{
         /**存发件人的发件箱*/
+        saveSenderMsg(msgEntity);
+
+        /**存收件人的收件箱*/
+        saveRecipientMsg(msgEntity);
+    }
+
+    /**
+     * 存发件人的发件箱
+     */
+    @Override
+    public void saveSenderMsg(C2cMsgContentEntity msgEntity) throws Exception{
         C2cMsgRelationEntity messageRelationSender = new C2cMsgRelationEntity();
         messageRelationSender.setMid(msgEntity.getMid());
         messageRelationSender.setOwnerUid(msgEntity.getSenderId());
@@ -51,8 +62,13 @@ public class C2cMsgRelationServiceImpl extends BaseServiceImpl<C2cMsgRelationDao
         messageRelationSender.setType(MsgRelationEnum.SEND_BOX.getCode());
         messageRelationSender.setCreateTime(new Date());
         insert(messageRelationSender);
+    }
 
-        /**存收件人的收件箱*/
+    /**
+     * 存收件人的收件箱
+     */
+    @Override
+    public void saveRecipientMsg(C2cMsgContentEntity msgEntity) throws Exception{
         C2cMsgRelationEntity messageRelationRecipient = new C2cMsgRelationEntity();
         messageRelationRecipient.setMid(msgEntity.getMid());
         messageRelationRecipient.setOwnerUid(msgEntity.getRecipientId());
@@ -61,4 +77,6 @@ public class C2cMsgRelationServiceImpl extends BaseServiceImpl<C2cMsgRelationDao
         messageRelationRecipient.setCreateTime(new Date());
         insert(messageRelationRecipient);
     }
+
+
 }

+ 12 - 15
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java

@@ -19,6 +19,7 @@ import com.qnfhq.modules.c2c.entity.*;
 import com.qnfhq.modules.c2c.enums.*;
 import com.qnfhq.modules.c2c.service.*;
 import cn.hutool.core.util.StrUtil;
+import com.qnfhq.modules.c2c.service.C2cMsgContentService;
 import com.qnfhq.modules.user.entity.AppAssetEntity;
 import com.qnfhq.modules.user.entity.AppUserEntity;
 import com.qnfhq.modules.user.enums.AssetEnum;
@@ -77,6 +78,9 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
     @Resource
     private C2cOrderDao c2cOrderDao;
 
+    @Resource
+    private C2cMsgContentService c2cMsgContentService;
+
 
     @Override
     public PageData<C2cOrderEntity> page(Map<String, Object> params) {
@@ -333,14 +337,10 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
             redisUtils.increment(unpayCountsKey, 1L, RedisUtils.NOT_EXPIRE);
         }
 
-
-        //发消息通知交易对手
-//        HashMap<String, Object> object = new HashMap<>();
-//        object.put("c2c_create",c2cOrder.getTranUserId().toString());
-//        redisUtils.addStream(redisStreamNamesApi,object);
+        //发消息通知
+        c2cMsgContentService.sendOrderCreateMsg(getBuyUserId(c2cOrder),getSellUserId(c2cOrder), c2cOrder.getId(),c2cOrder.getOrderNo());
 
         return new Result().ok(c2cOrder.getId());
-
     }
 
 
@@ -396,11 +396,6 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
             }
         }
 
-
-        //发消息
-//        HashMap<String, Object> object = new HashMap<>();
-//        object.put("c2c_cancel",order.getTranUserId().toString());
-//        redisUtil.addStream(redisStreamNamesApi,object);
         return 1;
     }
 
@@ -457,6 +452,8 @@ 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(),"c2c订单取消,恢复广告可用数量");
+        //消息通知
+        c2cMsgContentService.sendOrderCancelMsg(getBuyUserId(order),sellUserId,order.getId(),order.getOrderNo());
         return 1;
     }
 
@@ -522,10 +519,8 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
             }
         }
 
-        //发消息通知卖家
-//        HashMap<String, Object> object = new HashMap<>();
-//        object.put("c2c_pay",sellUserId.toString());
-//        redisUtil.addStream(redisStreamNamesApi,object);
+        //发消息通知
+        c2cMsgContentService.sendOrderPayMsg(buyUserId,sellUserId,order.getId(),order.getOrderNo());
         return new Result();
     }
 
@@ -557,6 +552,8 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         }
         passCoin(order, sellUserId, buyUserId, loginId, "app");
         releaseCounts(order, sellUserId);
+        //发消息通知
+        c2cMsgContentService.sendOrderCompleteMsg(buyUserId,sellUserId, order.getId(),order.getOrderNo());
         return 1;
     }
 

+ 33 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cUserStatServiceImpl.java

@@ -0,0 +1,33 @@
+package com.qnfhq.modules.c2c.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qnfhq.modules.c2c.dao.C2cUserStatDao;
+import com.qnfhq.modules.c2c.entity.C2cUserStatEntity;
+import com.qnfhq.modules.c2c.service.C2cUserStatService;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * C2C用户统计表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-27
+ */
+@Service
+public class C2cUserStatServiceImpl extends ServiceImpl<C2cUserStatDao, C2cUserStatEntity> implements C2cUserStatService {
+
+
+    public QueryWrapper<C2cUserStatEntity> getWrapper(Map<String, Object> params){
+        String id = (String)params.get("id");
+
+        QueryWrapper<C2cUserStatEntity> wrapper = new QueryWrapper<>();
+        wrapper.eq(StrUtil.isNotBlank(id), "id", id);
+
+        return wrapper;
+    }
+
+
+}

+ 15 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java

@@ -1,6 +1,7 @@
 package com.qnfhq.modules.user.controller;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.map.MapUtil;
 import com.qnfhq.common.exception.ErrorCode;
 import com.qnfhq.common.utils.MessageUtils;
 import com.qnfhq.common.utils.Result;
@@ -160,4 +161,18 @@ public class ApiAppUserController {
         return appUserService.verifyIntelligentCaptcha(dto.getVerifyParam());
     }
 
+
+    @PostMapping("/logintest")
+    @Operation(summary = "登录测试")
+    public Result logintest(@RequestBody AppLoginDTO dto, HttpServletRequest request) {
+        ValidatorUtils.validateEntity(dto);
+        AppUserEntity appUser = appUserService.getUserByEmail(dto.getLoginName());
+        StpUtil.login(appUser.getId());
+        appuserLoginLogService.insertAppActionLog(appUser, "用户登录", "0", request);
+
+        Result result = new Result();
+        result.setMsg(MessageUtils.message("appUser.login.success"));//登陆成功
+        result.setData(MapUtil.of(StpUtil.getTokenName(), StpUtil.getTokenValue()));
+        return result;
+    }
 }

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=Had minimum mesti lebih kecil daripada had
 merchant.num.bigger.zero=Jumlah mesti lebih besar daripada 0
 merchant.price.bigger.zero=Harga mesti lebih besar daripada 0
 merchant.maxAmount.smaller.price.num=Had maksimum mesti lebih kecil daripada hasil darab harga dan jumlah
-c2cAd.price.must.bigger.set=Harga mesti lebih besar daripada {}
-c2cAd.price.must.small.set=Harga mesti lebih kecil daripada {}
-c2cAd.minAmount.must.bigger.set=Had minimum mesti lebih besar daripada {}
-c2cAd.maxAmount.must.small.set=Had maksimum mesti lebih kecil daripada {}
+c2cAd.price.must.bigger.set=Harga mesti lebih besar daripada {0}
+c2cAd.price.must.small.set=Harga mesti lebih kecil daripada {0}
+c2cAd.minAmount.must.bigger.set=Had minimum mesti lebih besar daripada {0}
+c2cAd.maxAmount.must.small.set=Had maksimum mesti lebih kecil daripada {0}
 merchant.complete.merchant.apply=Sila lengkapkan permohonan peniaga yang disahkan
 merchant.under.review=Peniaga yang disahkan sedang dalam proses semakan
 merchant.under.lock=Peniaga yang disahkan sedang dikunci

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=Der Mindestbetrag muss kleiner als der H\u0
 merchant.num.bigger.zero=Die Menge muss gr\u00f6\u00dfer als 0 sein  
 merchant.price.bigger.zero=Der Preis muss gr\u00f6\u00dfer als 0 sein  
 merchant.maxAmount.smaller.price.num=Der H\u00f6chstbetrag muss kleiner als das Produkt aus Preis und Menge sein  
-c2cAd.price.must.bigger.set=Der Preis muss gr\u00f6\u00dfer als {} sein  
-c2cAd.price.must.small.set=Der Preis muss kleiner als {} sein  
-c2cAd.minAmount.must.bigger.set=Der Mindestbetrag muss gr\u00f6\u00dfer als {} sein  
-c2cAd.maxAmount.must.small.set=Der H\u00f6chstbetrag muss kleiner als {} sein  
+c2cAd.price.must.bigger.set=Der Preis muss gr\u00f6\u00dfer als {0} sein  
+c2cAd.price.must.small.set=Der Preis muss kleiner als {0} sein  
+c2cAd.minAmount.must.bigger.set=Der Mindestbetrag muss gr\u00f6\u00dfer als {0} sein  
+c2cAd.maxAmount.must.small.set=Der H\u00f6chstbetrag muss kleiner als {0} sein  
 merchant.complete.merchant.apply=Bitte schlie\u00dfen Sie die H\u00e4ndler-Zertifizierung ab  
 merchant.under.review=H\u00e4ndler-Zertifizierung wird gepr\u00fcft  
 merchant.under.lock=H\u00e4ndler-Zertifizierung ist gesperrt  

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=Minimum limit must be less than maximum lim
 merchant.num.bigger.zero=Quantity must be greater than 0
 merchant.price.bigger.zero=Price must be greater than 0
 merchant.maxAmount.smaller.price.num=Maximum limit must be less than the product of price and quantity
-c2cAd.price.must.bigger.set=Price must be greater than {}
-c2cAd.price.must.small.set=Price must be less than {}
-c2cAd.minAmount.must.bigger.set=Minimum limit must be greater than {}
-c2cAd.maxAmount.must.small.set=Maximum limit must be less than {}
+c2cAd.price.must.bigger.set=Price must be greater than {0}
+c2cAd.price.must.small.set=Price must be less than {0}
+c2cAd.minAmount.must.bigger.set=Minimum limit must be greater than {0}
+c2cAd.maxAmount.must.small.set=Maximum limit must be less than {0}
 merchant.complete.merchant.apply=Please complete certified merchant application
 merchant.under.review=Certified merchant under review
 merchant.under.lock=Certified merchant locked

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=El monto m\u00ednimo debe ser menor que el
 merchant.num.bigger.zero=La cantidad debe ser mayor que 0
 merchant.price.bigger.zero=El precio debe ser mayor que 0
 merchant.maxAmount.smaller.price.num=El monto m\u00e1ximo debe ser menor que el producto del precio y la cantidad
-c2cAd.price.must.bigger.set=El precio debe ser mayor que {}
-c2cAd.price.must.small.set=El precio debe ser menor que {}
-c2cAd.minAmount.must.bigger.set=El monto m\u00ednimo debe ser mayor que {}
-c2cAd.maxAmount.must.small.set=El monto m\u00e1ximo debe ser menor que {}
+c2cAd.price.must.bigger.set=El precio debe ser mayor que {0}
+c2cAd.price.must.small.set=El precio debe ser menor que {0}
+c2cAd.minAmount.must.bigger.set=El monto m\u00ednimo debe ser mayor que {0}
+c2cAd.maxAmount.must.small.set=El monto m\u00e1ximo debe ser menor que {0}
 merchant.complete.merchant.apply=Por favor complete la solicitud de comerciante verificado
 merchant.under.review=Comerciante verificado en revisi\u00f3n
 merchant.under.lock=Comerciante verificado bloqueado

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=Le montant minimum doit \u00eatre inf\u00e9
 merchant.num.bigger.zero=La quantit\u00e9 doit \u00eatre sup\u00e9rieure \u00e0 0
 merchant.price.bigger.zero=Le prix doit \u00eatre sup\u00e9rieur \u00e0 0
 merchant.maxAmount.smaller.price.num=Le montant maximum doit \u00eatre inf\u00e9rieur au produit du prix et de la quantit\u00e9
-c2cAd.price.must.bigger.set=Le prix doit \u00eatre sup\u00e9rieur \u00e0 {}
-c2cAd.price.must.small.set=Le prix doit \u00eatre inf\u00e9rieur \u00e0 {}
-c2cAd.minAmount.must.bigger.set=Le montant minimum doit \u00eatre sup\u00e9rieur \u00e0 {}
-c2cAd.maxAmount.must.small.set=Le montant maximum doit \u00eatre inf\u00e9rieur \u00e0 {}
+c2cAd.price.must.bigger.set=Le prix doit \u00eatre sup\u00e9rieur \u00e0 {0}
+c2cAd.price.must.small.set=Le prix doit \u00eatre inf\u00e9rieur \u00e0 {0}
+c2cAd.minAmount.must.bigger.set=Le montant minimum doit \u00eatre sup\u00e9rieur \u00e0 {0}
+c2cAd.maxAmount.must.small.set=Le montant maximum doit \u00eatre inf\u00e9rieur \u00e0 {0}
 merchant.complete.merchant.apply=Veuillez compl\u00e9ter la demande de commer\u00e7ant certifi\u00e9
 merchant.under.review=Approbation du commer\u00e7ant certifi\u00e9 en cours
 merchant.under.lock=Commer\u00e7ant certifi\u00e9 verrouill\u00e9

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=\u6700\u5c0f\u9650\u5ea6\u984d\u306f\u6700\
 merchant.num.bigger.zero=\u6570\u91cf\u306f0\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
 merchant.price.bigger.zero=\u4fa1\u683c\u306f0\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
 merchant.maxAmount.smaller.price.num=\u6700\u5927\u9650\u5ea6\u984d\u306f\u4fa1\u683c\u3068\u6570\u91cf\u306e\u7a4d\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
-c2cAd.price.must.bigger.set=\u4fa1\u683c\u306f{}\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
-c2cAd.price.must.small.set=\u4fa1\u683c\u306f{}\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
-c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u5ea6\u984d\u306f{}\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
-c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u5ea6\u984d\u306f{}\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.price.must.bigger.set=\u4fa1\u683c\u306f{0}\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.price.must.small.set=\u4fa1\u683c\u306f{0}\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u5ea6\u984d\u306f{0}\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u5ea6\u984d\u306f{0}\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
 merchant.complete.merchant.apply=\u8a8d\u8a3c\u5546\u5bb6\u7533\u8acb\u3092\u5b8c\u4e86\u3057\u3066\u304f\u3060\u3055\u3044
 merchant.under.review=\u8a8d\u8a3c\u5546\u5bb6\u5be9\u67fb\u4e2d
 merchant.under.lock=\u8a8d\u8a3c\u5546\u5bb6\u30ed\u30c3\u30af\u4e2d

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=\ucd5c\uc18c \ud55c\ub3c4\ub294 \ucd5c\ub30
 merchant.num.bigger.zero=\uc218\ub7c9\uc740 0\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
 merchant.price.bigger.zero=\uac00\uaca9\uc740 0\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
 merchant.maxAmount.smaller.price.num=\ucd5c\ub300 \ud55c\ub3c4\ub294 \uac00\uaca9\uacfc \uc218\ub7c9\uc758 \uacf1\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
-c2cAd.price.must.bigger.set=\uac00\uaca9\uc740 {}\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
-c2cAd.price.must.small.set=\uac00\uaca9\uc740 {}\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
-c2cAd.minAmount.must.bigger.set=\ucd5c\uc18c \ud55c\ub3c4\ub294 {}\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
-c2cAd.maxAmount.must.small.set=\ucd5c\ub300 \ud55c\ub3c4\ub294 {}\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+c2cAd.price.must.bigger.set=\uac00\uaca9\uc740 {0}\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2cAd.price.must.small.set=\uac00\uaca9\uc740 {0}\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+c2cAd.minAmount.must.bigger.set=\ucd5c\uc18c \ud55c\ub3c4\ub294 {0}\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2cAd.maxAmount.must.small.set=\ucd5c\ub300 \ud55c\ub3c4\ub294 {0}\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
 merchant.complete.merchant.apply=\uc778\uc99d \uc0c1\uc778 \uc2e0\uccad\uc744 \uc644\ub8cc\ud574 \uc8fc\uc138\uc694
 merchant.under.review=\uc778\uc99d \uc0c1\uc778 \uc2ec\uc0ac \uc911
 merchant.under.lock=\uc778\uc99d \uc0c1\uc778 \uc7a0\uae08 \uc911

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e02\u0e31\
 merchant.num.bigger.zero=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 0
 merchant.price.bigger.zero=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 0
 merchant.maxAmount.smaller.price.num=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32\u0e1c\u0e25\u0e04\u0e39\u0e13\u0e02\u0e2d\u0e07\u0e23\u0e32\u0e04\u0e32\u0e41\u0e25\u0e30\u0e08\u0e33\u0e19\u0e27\u0e19
-c2cAd.price.must.bigger.set=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 {}
-c2cAd.price.must.small.set=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 {}
-c2cAd.minAmount.must.bigger.set=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 {}
-c2cAd.maxAmount.must.small.set=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 {}
+c2cAd.price.must.bigger.set=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 {0}
+c2cAd.price.must.small.set=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 {0}
+c2cAd.minAmount.must.bigger.set=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 {0}
+c2cAd.maxAmount.must.small.set=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 {0}
 merchant.complete.merchant.apply=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23\u0e2a\u0e21\u0e31\u0e04\u0e23\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e21\u0e1a\u0e39\u0e23\u0e13\u0e4c
 merchant.under.review=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07
 merchant.under.lock=\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e22\u0e39\u0e48

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=\u6700\u5c0f\u9650\u984d\u5fc5\u9808\u5c0f\
 merchant.num.bigger.zero=\u6578\u91cf\u5fc5\u9808\u5927\u65bc0
 merchant.price.bigger.zero=\u50f9\u683c\u5fc5\u9808\u5927\u65bc0
 merchant.maxAmount.smaller.price.num=\u6700\u5927\u9650\u984d\u5fc5\u9808\u5c0f\u65bc\u50f9\u683c\u548c\u6578\u91cf\u4e4b\u7a4d
-c2cAd.price.must.bigger.set=\u50f9\u683c\u5fc5\u9808\u5927\u65bc{}
-c2cAd.price.must.small.set=\u50f9\u683c\u5fc5\u9808\u5c0f\u65bc{}
-c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u984d\u5fc5\u9808\u5927\u65bc{}
-c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u984d\u5fc5\u9808\u5c0f\u65bc{}
+c2cAd.price.must.bigger.set=\u50f9\u683c\u5fc5\u9808\u5927\u65bc{0}
+c2cAd.price.must.small.set=\u50f9\u683c\u5fc5\u9808\u5c0f\u65bc{0}
+c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u984d\u5fc5\u9808\u5927\u65bc{0}
+c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u984d\u5fc5\u9808\u5c0f\u65bc{0}
 merchant.complete.merchant.apply=\u8acb\u5b8c\u6210\u8a8d\u8b49\u5546\u5bb6\u7533\u8acb
 merchant.under.review=\u8a8d\u8b49\u5546\u5bb6\u5be9\u6279\u4e2d
 merchant.under.lock=\u8a8d\u8b49\u5546\u5bb6\u9396\u5b9a\u4e2d

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

@@ -64,10 +64,10 @@ merchant.minAmount.smaller.maxAmount=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i thi\u1ec3u
 merchant.num.bigger.zero=S\u1ed1 l\u01b0\u1ee3ng ph\u1ea3i l\u1edbn h\u01a1n 0
 merchant.price.bigger.zero=Gi\u00e1 ph\u1ea3i l\u1edbn h\u01a1n 0
 merchant.maxAmount.smaller.price.num=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i \u0111a ph\u1ea3i nh\u1ecf h\u01a1n t\u00edch c\u1ee7a gi\u00e1 v\u00e0 s\u1ed1 l\u01b0\u1ee3ng
-c2cAd.price.must.bigger.set=Gi\u00e1 ph\u1ea3i l\u1edbn h\u01a1n {}
-c2cAd.price.must.small.set=Gi\u00e1 ph\u1ea3i nh\u1ecf h\u01a1n {}
-c2cAd.minAmount.must.bigger.set=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i thi\u1ec3u ph\u1ea3i l\u1edbn h\u01a1n {}
-c2cAd.maxAmount.must.small.set=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i \u0111a ph\u1ea3i nh\u1ecf h\u01a1n {}
+c2cAd.price.must.bigger.set=Gi\u00e1 ph\u1ea3i l\u1edbn h\u01a1n {0}
+c2cAd.price.must.small.set=Gi\u00e1 ph\u1ea3i nh\u1ecf h\u01a1n {0}
+c2cAd.minAmount.must.bigger.set=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i thi\u1ec3u ph\u1ea3i l\u1edbn h\u01a1n {0}
+c2cAd.maxAmount.must.small.set=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i \u0111a ph\u1ea3i nh\u1ecf h\u01a1n {0}
 merchant.complete.merchant.apply=Vui l\u00f2ng ho\u00e0n th\u00e0nh \u0111\u01a1n \u0111\u0103ng k\u00fd th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c
 merchant.under.review=\u0110ang xem x\u00e9t ph\u00ea duy\u1ec7t th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c
 merchant.under.lock=Th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c \u0111ang b\u1ecb kh\u00f3a

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

@@ -65,10 +65,10 @@ merchant.minAmount.smaller.maxAmount=\u6700\u5c0f\u9650\u989d\u5fc5\u987b\u5c0f\
 merchant.num.bigger.zero=\u6570\u91cf\u5fc5\u987b\u5927\u4e8e0
 merchant.price.bigger.zero=\u4ef7\u683c\u5fc5\u987b\u5927\u4e8e0
 merchant.maxAmount.smaller.price.num=\u6700\u5927\u9650\u989d\u5fc5\u987b\u5c0f\u4e8e\u4ef7\u683c\u548c\u6570\u91cf\u4e4b\u79ef
-c2cAd.price.must.bigger.set=\u4ef7\u683c\u5fc5\u987b\u5927\u4e8e{}
-c2cAd.price.must.small.set=\u4ef7\u683c\u5fc5\u987b\u5c0f\u4e8e{}
-c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u989d\u5fc5\u987b\u5927\u4e8e{}
-c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u989d\u5fc5\u987b\u5c0f\u4e8e{}
+c2cAd.price.must.bigger.set=\u4ef7\u683c\u5fc5\u987b\u5927\u4e8e{0}
+c2cAd.price.must.small.set=\u4ef7\u683c\u5fc5\u987b\u5c0f\u4e8e{0}
+c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u989d\u5fc5\u987b\u5927\u4e8e{0}
+c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u989d\u5fc5\u987b\u5c0f\u4e8e{0}
 merchant.complete.merchant.apply=\u8bf7\u5b8c\u6210\u8ba4\u8bc1\u5546\u5bb6\u7533\u8bf7
 merchant.under.review=\u8ba4\u8bc1\u5546\u5bb6\u5ba1\u6279\u4e2d
 merchant.under.lock=\u8ba4\u8bc1\u5546\u5bb6\u9501\u5b9a\u4e2d

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

@@ -3,7 +3,7 @@
 
 <mapper namespace="com.qnfhq.modules.c2c.dao.C2cMerchantDao">
 
-    <resultMap type="com.qnfhq.modules.c2c.entity.C2cMerchantEntity" id="c2cMerchantMap">
+    <resultMap type="com.qnfhq.modules.c2c.entity.C2cMerchantEntity" id="merchantMap">
         <result property="id" column="id"/>
         <result property="userId" column="user_id"/>
         <result property="userName" column="user_name"/>
@@ -21,18 +21,16 @@
         <result property="finishRate" column="finish_rate"/>
         <result property="tranType" column="tran_type"/>
         <result property="day30Num" column="day30_num"/>
-        <result property="averageTime" column="average_time"/>
-        <result property="averageCancelTime" column="average_cancel_time"/>
+        <result property="day30BuyNum" column="day30_buy_num"/>
+        <result property="day30SellNum" column="day30_sell_num"/>
+        <result property="day30AvgPayTime" column="day30_avg_pay_time"/>
+        <result property="day30AvgPassTime" column="day30_avg_pass_time"/>
         <result property="createNum" column="create_num"/>
         <result property="firstTranNum" column="first_tran_num"/>
+        <result property="tranUserNum" column="tran_user_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>
 
 

+ 27 - 0
qnfhq-api/src/main/resources/mapper/c2c/C2cUserStatDao.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.qnfhq.modules.c2c.dao.C2cUserStatDao">
+
+    <resultMap type="com.qnfhq.modules.c2c.entity.C2cUserStatEntity" id="userStatMap">
+        <result property="userId" column="user_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="finishNum" column="finish_num"/>
+        <result property="buyFinishNum" column="buy_finish_num"/>
+        <result property="sellFinishNum" column="sell_finish_num"/>
+        <result property="finishRate" column="finish_rate"/>
+        <result property="averagePayTime" column="average_pay_time"/>
+        <result property="averagePassTime" column="average_pass_time"/>
+        <result property="day30Num" column="day30_num"/>
+        <result property="day30BuyNum" column="day30_buy_num"/>
+        <result property="day30SellNum" column="day30_sell_num"/>
+        <result property="day30TranRate" column="day30_tran_rate"/>
+        <result property="day30BuyRate" column="day30_buy_rate"/>
+        <result property="day30SellRate" column="day30_sell_rate"/>
+        <result property="day30TranUserNum" column="day30_tran_user_num"/>
+        <result property="fanNum" column="fan_num"/>
+    </resultMap>
+
+
+</mapper>

+ 2 - 2
qnfhq-generator/src/main/resources/generator.properties

@@ -2,13 +2,13 @@
 
 #\u5305\u540D
 package=com.qnfhq
-moduleName=user
+moduleName=c2c
 #\u4F5C\u8005
 author=yelz
 #Email
 email=30262728@qq.com
 #\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00)
-tablePrefix=t_
+tablePrefix=c2c_
 version=1.0.0