30262728@qq.com пре 4 дана
родитељ
комит
1dc2a37e9d
61 измењених фајлова са 1278 додато и 435 уклоњено
  1. 7 0
      qnfhq-api/pom.xml
  2. 177 104
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java
  3. 75 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/OrderReportController.java
  4. 3 3
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cOrderVoucherDao.java
  5. 16 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/OrderReportDao.java
  6. 1 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderCancelDTO.java
  7. 11 3
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainDTO.java
  8. 0 51
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainVoucherDTO.java
  9. 30 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainVoucherIDDTO.java
  10. 30 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderConfirmPayDTO.java
  11. 0 105
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderDTO.java
  12. 39 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderVoucherDTO.java
  13. 47 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/OrderReportDTO.java
  14. 12 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/setting/ComplainReasonSetting.java
  15. 14 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/setting/ReportReasonSetting.java
  16. 14 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cOrderComplainEntity.java
  17. 10 21
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cOrderVoucherEntity.java
  18. 1 4
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cPaymentVoucherEntity.java
  19. 70 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/OrderReportEntity.java
  20. 0 16
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderComplainVoucherService.java
  21. 16 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderVoucherService.java
  22. 14 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/OrderReportService.java
  23. 0 31
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderComplainVoucherServiceImpl.java
  24. 2 3
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java
  25. 31 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderVoucherServiceImpl.java
  26. 1 9
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cPaymentVoucherServiceImpl.java
  27. 31 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/OrderReportServiceImpl.java
  28. 57 0
      qnfhq-api/src/main/java/com/qnfhq/modules/common/controller/CommonController.java
  29. 31 0
      qnfhq-api/src/main/java/com/qnfhq/modules/common/dto/setting/OssSetting.java
  30. 10 0
      qnfhq-api/src/main/java/com/qnfhq/modules/common/service/FileService.java
  31. 66 0
      qnfhq-api/src/main/java/com/qnfhq/modules/common/service/impl/FileServiceImpl.java
  32. 3 0
      qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java
  33. 6 2
      qnfhq-api/src/main/java/com/qnfhq/modules/user/enums/SettingEnum.java
  34. 230 0
      qnfhq-api/src/main/java/com/qnfhq/utils/AliOssCloudUtil.java
  35. 11 5
      qnfhq-api/src/main/resources/i18n/messages.properties
  36. 13 5
      qnfhq-api/src/main/resources/i18n/messages_de.properties
  37. 12 6
      qnfhq-api/src/main/resources/i18n/messages_en.properties
  38. 13 5
      qnfhq-api/src/main/resources/i18n/messages_es.properties
  39. 13 5
      qnfhq-api/src/main/resources/i18n/messages_fr.properties
  40. 11 4
      qnfhq-api/src/main/resources/i18n/messages_ja.properties
  41. 11 3
      qnfhq-api/src/main/resources/i18n/messages_ko.properties
  42. 13 5
      qnfhq-api/src/main/resources/i18n/messages_th.properties
  43. 11 3
      qnfhq-api/src/main/resources/i18n/messages_tw.properties
  44. 13 5
      qnfhq-api/src/main/resources/i18n/messages_vi.properties
  45. 10 3
      qnfhq-api/src/main/resources/i18n/messages_zh.properties
  46. 5 2
      qnfhq-api/src/main/resources/i18n/validation.properties
  47. 4 0
      qnfhq-api/src/main/resources/i18n/validation_de.properties
  48. 4 2
      qnfhq-api/src/main/resources/i18n/validation_en.properties
  49. 4 0
      qnfhq-api/src/main/resources/i18n/validation_es.properties
  50. 4 0
      qnfhq-api/src/main/resources/i18n/validation_fr.properties
  51. 4 0
      qnfhq-api/src/main/resources/i18n/validation_ja.properties
  52. 4 0
      qnfhq-api/src/main/resources/i18n/validation_ko.properties
  53. 4 0
      qnfhq-api/src/main/resources/i18n/validation_th.properties
  54. 4 0
      qnfhq-api/src/main/resources/i18n/validation_tw.properties
  55. 5 1
      qnfhq-api/src/main/resources/i18n/validation_vi.properties
  56. 3 2
      qnfhq-api/src/main/resources/i18n/validation_zh.properties
  57. 4 1
      qnfhq-api/src/main/resources/mapper/c2c/C2cOrderComplainDao.xml
  58. 0 22
      qnfhq-api/src/main/resources/mapper/c2c/C2cOrderComplainVoucherDao.xml
  59. 19 0
      qnfhq-api/src/main/resources/mapper/c2c/C2cOrderVoucherDao.xml
  60. 1 2
      qnfhq-api/src/main/resources/mapper/c2c/C2cPaymentVoucherDao.xml
  61. 23 0
      qnfhq-api/src/main/resources/mapper/c2c/OrderReportDao.xml

+ 7 - 0
qnfhq-api/pom.xml

@@ -86,6 +86,13 @@
             <version>${aliyun.captcha.version}</version>
         </dependency>
 
+        <!-- oss存储 -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.10.2</version>
+        </dependency>
+
         <!--        <dependency>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-starter-websocket</artifactId>

+ 177 - 104
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java

@@ -19,13 +19,14 @@ import com.qnfhq.common.validator.ValidatorUtils;
 import com.qnfhq.constant.CacheConstants;
 import com.qnfhq.modules.c2c.dto.*;
 import com.qnfhq.modules.c2c.dto.setting.CancelReasonSetting;
-import com.qnfhq.modules.c2c.dto.setting.ReviewSetting;
+import com.qnfhq.modules.c2c.dto.setting.ComplainReasonSetting;
 import com.qnfhq.modules.c2c.entity.*;
 import com.qnfhq.modules.c2c.enums.AdStatusEnum;
 import com.qnfhq.modules.c2c.enums.C2cOrderFlowEnum;
 import com.qnfhq.modules.c2c.enums.C2cOrderStatusEnum;
 import com.qnfhq.modules.c2c.enums.DirectionEnum;
 import com.qnfhq.modules.c2c.service.*;
+import com.qnfhq.modules.common.service.FileService;
 import com.qnfhq.modules.user.entity.AppAssetEntity;
 import com.qnfhq.modules.user.entity.AppUserDetailEntity;
 import com.qnfhq.modules.user.entity.AppUserEntity;
@@ -41,12 +42,16 @@ import com.qnfhq.utils.DistributedRedisLock;
 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.*;
+
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * c2c订单
@@ -90,11 +95,13 @@ public class C2cOrderController extends ApiBaseController {
     private C2cOrderComplainService orderComplainService;
 
     @Resource
-    private C2cOrderComplainVoucherService orderComplainVoucherService;
+    private C2cOrderVoucherService orderComplainVoucherService;
     @Resource
     private AppUserService appUserService;
     @Resource
     private C2cUserStatService c2cUserStatService;
+    @Autowired
+    private C2cOrderVoucherService c2cOrderVoucherService;
 
 
     private String getC2cAdLockKey(String adId) {
@@ -334,7 +341,7 @@ public class C2cOrderController extends ApiBaseController {
     @Operation(summary = "我已完成付款按钮")
     @PostMapping("/confirmPay")
     @RepeatSubmit(interval = 3000, message = "请求过于频繁")
-    public Result confirmPay(@RequestBody C2cOrderIdDTO dto)
+    public Result confirmPay(@RequestBody C2cOrderConfirmPayDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
 
@@ -433,68 +440,88 @@ public class C2cOrderController extends ApiBaseController {
     @Operation(summary = "上传付款凭证")
     @PostMapping("/uploadPayment")
     @RepeatSubmit(interval = 3000, message = "请求过于频繁")
-    public Result uploadPayment(@RequestBody C2cPaymentVoucherDTO c2cPaymentVoucher) {
-        ValidatorUtils.validateEntity(c2cPaymentVoucher);
-
-        Long orderId = c2cPaymentVoucher.getOrderId();
-        String img = c2cPaymentVoucher.getImg();
-
-        C2cOrderEntity order = c2cOrderService.selectOrder(orderId);
+    public Result uploadPayment(MultipartFile file,Long orderId,Long id) {
+        if(Objects.isNull(orderId)) {
+            return error(MessageUtils.message("c2c.orderId.is.empty"));//订单编号不能空
+        }
+        C2cOrderEntity order = c2cOrderService.selectById(orderId);
         if(order == null) {
             return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
         }
         if(order!=null && order.getFlow().intValue()==C2cOrderFlowEnum.END.getCode()) {
             return error(MessageUtils.message("c2c.order.is.end"));//订单已结束
         }
-
-        if(order.getUserId().longValue() != StpUtil.getLoginIdAsLong()
-                && order.getTranUserId().longValue() != StpUtil.getLoginIdAsLong()) {
-            return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
+        if( StpUtil.getLoginIdAsLong() != order.getUserId().longValue()
+                && StpUtil.getLoginIdAsLong() != order.getTranUserId().longValue()) {
+            return error(MessageUtils.message("c2c.complain.voucher.submit.fail"));//提交失败,您不是订单交易方
         }
 
+        List<C2cPaymentVoucherEntity> list = c2cPaymentVoucherService.selectList(orderId);
+        if(list!=null && list.size()>=3) {
+            return error(MessageUtils.message("c2c.order.payment.vouchers.limit"));//付款凭证最多3张
+        }
 
-        if(c2cPaymentVoucher.getId() == null || c2cPaymentVoucher.getId().intValue() == 0) {
-            C2cPaymentVoucherEntity entity = new C2cPaymentVoucherEntity();
-            entity.setOrderId(orderId);
-            entity.setUserId(StpUtil.getLoginIdAsLong());
-            entity.setImg(img);
-            entity.setStatus(1);
-            entity.setCreateTime(new Date());
-            entity.setUpdateTime(new Date());
-            if(c2cPaymentVoucherService.save(entity)) {
-                Map data = MapUtil.of("id", entity.getId());
-                return success(data);
-            } else {
-                return error(MessageUtils.message("c2c.order.uploadPayment.fail"));//上传付款凭证失败
-            }
-
-        } else {
-            C2cPaymentVoucherEntity voucher = c2cPaymentVoucherService.getById(c2cPaymentVoucher.getId());
-            if(voucher==null) {
-                return error(MessageUtils.message("c2c.order.pay.cert.id.invalid"));//凭证编号无效
-            }
-            if(StpUtil.getLoginIdAsString().equals(voucher.getUserId().toString())) {
-
-                C2cPaymentVoucherEntity entity = new C2cPaymentVoucherEntity();
-                entity.setId(c2cPaymentVoucher.getId());
-                entity.setOrderId(orderId);
-                entity.setUserId(StpUtil.getLoginIdAsLong());
-                entity.setImg(img);
-                entity.setStatus(1);
-                entity.setUpdateTime(new Date());
-                if(c2cPaymentVoucherService.updateById(entity)) {
-                    Map data = MapUtil.of("id", entity.getId());
+        try {
+            String filename = file.getResource().getFilename();
+            //这里文件名用了uuid 防止重复,可以根据自己的需要来写
+            String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
+            name = name.replace("-", "");
+            String url = fileService.uploadFileOSS(file,name);
+
+            if(id == null || id.intValue() == 0) {
+                C2cPaymentVoucherEntity voucherEntity = new C2cPaymentVoucherEntity();
+                voucherEntity.setOrderId(orderId);
+                voucherEntity.setImg(url);
+                voucherEntity.setUserId(StpUtil.getLoginIdAsLong());
+                voucherEntity.setStatus(1);
+                voucherEntity.setCreateTime(new Date());
+                voucherEntity.setUpdateTime(new Date());
+                if (c2cPaymentVoucherService.save(voucherEntity)) {
+                    Map data = MapUtil.of("id", voucherEntity.getId());
+                    data.put("file", url);
+                    data.put("name", name);
                     return success(data);
                 } else {
                     return error(MessageUtils.message("c2c.order.uploadPayment.fail"));//上传付款凭证失败
                 }
-
-            } else {
-                return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
+            } else {//修改
+                C2cPaymentVoucherEntity voucher = c2cPaymentVoucherService.getById(id);
+                if(voucher==null) {
+                    return error(MessageUtils.message("c2c.order.pay.cert.id.invalid"));//凭证编号无效
+                }
+                if(StpUtil.getLoginIdAsString().equals(voucher.getUserId().toString())) {
+                    //删除旧的凭证
+                    String fileName = voucher.getImg().substring(voucher.getImg().lastIndexOf("/")+1);
+                    try {
+                        fileService.deleteFileOSS(fileName);
+                    } catch (IOException e) {
+                        log.error("删除付款凭证失败",e);
+                        return error(MessageUtils.message("c2c.deletePayment.voucher.fail"));//删除付款凭证失败
+                    }
+
+                    voucher.setOrderId(orderId);
+                    voucher.setImg(url);
+                    voucher.setUpdateTime(new Date());
+                    if(c2cPaymentVoucherService.updateById(voucher)) {
+                        Map data = MapUtil.of("id", voucher.getId());
+                        data.put("file", url);
+                        data.put("name", name);
+                        return success(data);
+                    } else {
+                        return error(MessageUtils.message("c2c.order.uploadPayment.fail"));//上传付款凭证失败
+                    }
+                } else {
+                    return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
+                }
             }
+        } catch (Exception e) {
+            e.getMessage();
+            return new Result().error(e.getMessage());
         }
     }
 
+    @Resource
+    private FileService fileService;
 
     @Operation(summary = "删除付款凭证")
     @PostMapping("/deletePayment")
@@ -514,6 +541,14 @@ public class C2cOrderController extends ApiBaseController {
 
         if(StpUtil.getLoginIdAsString().equals(voucher.getUserId().toString())) {
 
+            String fileName = voucher.getImg().substring(voucher.getImg().lastIndexOf("/")+1);
+            try {
+                fileService.deleteFileOSS(fileName);
+            } catch (IOException e) {
+                log.error("删除付款凭证失败",e);
+                return error(MessageUtils.message("c2c.deletePayment.voucher.fail"));//删除付款凭证失败
+            }
+
             C2cPaymentVoucherEntity entity = new C2cPaymentVoucherEntity();
             entity.setId(c2cPaymentVoucher.getId());
             entity.setStatus(-1);
@@ -629,6 +664,12 @@ public class C2cOrderController extends ApiBaseController {
     {
         ValidatorUtils.validateEntity(c2cOrderComplain);
 
+        if(c2cOrderComplain.getReasonId().intValue()==4) {//买家取消原因=其他
+            if(StrUtil.isEmpty(c2cOrderComplain.getOtherReason())) {
+                return error(MessageUtils.message("c2c.order.cancel.otherReason.NotEmpty"));//其他原因不能空
+            }
+        }
+
         C2cOrderEntity order = c2cOrderService.selectById(c2cOrderComplain.getOrderId());
         if(order == null) {
             return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
@@ -645,14 +686,17 @@ public class C2cOrderController extends ApiBaseController {
             return error(MessageUtils.message("c2c.complain.submit.fail"));//发起申诉失败,您不是买家或卖家
         }
 
-        if(c2cOrderComplain.getReason().length()>250) {
-            return error(MessageUtils.message("c2c.order.complain.remark.maxval"));//申诉原因最多250个字
+        if(c2cOrderComplain.getRemark().length()>250) {
+            return error(MessageUtils.message("c2c.order.complain.remark.maxval"));//描述最多250个字
         }
 
         try {
             C2cOrderComplainEntity c2cOrderComplainEntity = new C2cOrderComplainEntity();
             c2cOrderComplainEntity.setOrderId(c2cOrderComplain.getOrderId());
-            c2cOrderComplainEntity.setReason(c2cOrderComplain.getReason());
+            c2cOrderComplainEntity.setReasonId(c2cOrderComplain.getReasonId());
+            c2cOrderComplainEntity.setOtherReason(c2cOrderComplain.getOtherReason());
+            c2cOrderComplainEntity.setRemark(c2cOrderComplain.getRemark());
+            c2cOrderComplainEntity.setVoucherIds(c2cOrderComplain.getVoucherIds());
             return c2cOrderService.complain(order,c2cOrderComplainEntity,StpUtil.getLoginIdAsLong());
         } catch (Exception e) {
             return error(e.getMessage());
@@ -661,84 +705,102 @@ public class C2cOrderController extends ApiBaseController {
     }
 
 
-    @Operation(summary = "用户或商家提交申诉凭证")
-    @PostMapping("/complainVoucher")
+    @Operation(summary = "用户或商家上传凭证")
+    @PostMapping("/addVoucher")
     @RepeatSubmit(interval = 3000, message = "请求过于频繁")
-    public Result complainVoucher(@RequestBody C2cOrderComplainVoucherDTO dto)
+    public Result addVoucher(MultipartFile file,Integer type, Long orderId,String remark)
     {
-        ValidatorUtils.validateEntity(dto);
-
-        C2cOrderComplainEntity orderComplain = orderComplainService.getById(dto.getComplainId());
-        if(orderComplain == null) {
-            return error(MessageUtils.message("c2c.order.complain.not.exist"));//申诉编号无效
+        if(Objects.isNull(type)) {
+            return error(MessageUtils.message("c2c.voucher.type.is.empty"));//凭证类别不能空
         }
-
-        if( StpUtil.getLoginIdAsLong() != orderComplain.getFromUserId().longValue()
-                && StpUtil.getLoginIdAsLong() != orderComplain.getToUserId().longValue()) {
-            return error(MessageUtils.message("c2c.complain.voucher.submit.fail"));//提交失败,您不是申诉人或被申诉人
+        if(Objects.isNull(orderId)) {
+            return error(MessageUtils.message("c2c.orderId.is.empty"));//订单编号不能空
+        }
+        C2cOrderEntity order = c2cOrderService.selectById(orderId);
+        if(order == null) {
+            return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
         }
 
-        if(StrUtil.isEmpty(dto.getRemark())) {
-            return error(MessageUtils.message("c2c.order.complain.remark.notEmpty"));//申诉原因不能空
+        if( StpUtil.getLoginIdAsLong() != order.getUserId().longValue()
+                && StpUtil.getLoginIdAsLong() != order.getTranUserId().longValue()) {
+            return error(MessageUtils.message("c2c.complain.voucher.submit.fail"));//提交失败,您不是订单交易方
         }
-        if(dto.getRemark().length()>250) {
+
+        if(remark!=null && remark.length()>250) {
             return error(MessageUtils.message("c2c.order.complain.remark.maxval"));//描述最多250个字
         }
 
-        if(dto.getId()==null || dto.getId().intValue()==0) {
-            C2cOrderComplainVoucherEntity voucherEntity = new C2cOrderComplainVoucherEntity();
-            voucherEntity.setComplainId(dto.getComplainId());
-            voucherEntity.setRemark(dto.getRemark());
-            voucherEntity.setImg1(dto.getImg1());
-            voucherEntity.setImg2(dto.getImg2());
-            voucherEntity.setImg3(dto.getImg3());
-            voucherEntity.setImg4(dto.getImg4());
-            voucherEntity.setImg5(dto.getImg5());
+        List<C2cOrderVoucherEntity> list = c2cOrderVoucherService.selectList(orderId);
+        if(list!=null && list.size()>=5) {
+            return error(MessageUtils.message("c2c.order.complain.files.limit"));//申诉凭证最多5张
+        }
+
+        try {
+            String filename = file.getResource().getFilename();
+            //这里文件名用了uuid 防止重复,可以根据自己的需要来写
+            String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
+            name = name.replace("-", "");
+            String url = fileService.uploadFileOSS(file,name);
+
+            C2cOrderVoucherEntity voucherEntity = new C2cOrderVoucherEntity();
+            voucherEntity.setOrderId(orderId);
+            voucherEntity.setType(type);
+            voucherEntity.setRemark(remark);
+            voucherEntity.setFile(url);
             voucherEntity.setUserId(StpUtil.getLoginIdAsLong());
             voucherEntity.setStatus(1);
             voucherEntity.setCreateTime(new Date());
             voucherEntity.setUpdateTime(new Date());
             if(orderComplainVoucherService.save(voucherEntity)) {
                 Map data = MapUtil.of("id", voucherEntity.getId());
+                data.put("file", url);
+                data.put("name", name);
                 return success(data);
             } else {
                 return error(MessageUtils.message("c2c.order.complain.voucher.save.fail"));//保存申诉凭证失败
             }
+        } catch (Exception e) {
+            e.getMessage();
+            return new Result().error(e.getMessage());
+        }
 
-        } else {
-            C2cOrderComplainVoucherEntity voucherEntity = orderComplainVoucherService.getById(dto.getId());
-            if(voucherEntity==null) {
-                return error(MessageUtils.message("c2c.order.complain.voucher.id.invalid"));//申诉凭证编号无效
-            }
-            if(orderComplain.getFlow().intValue() == C2cOrderFlowEnum.END.getCode()) {
-                return error(MessageUtils.message("c2c.order.complain.voucher.is.end"));//申诉已结束
-            }
-            if(StpUtil.getLoginIdAsLong() == voucherEntity.getUserId().longValue()) {
-                voucherEntity.setComplainId(dto.getComplainId());
-                voucherEntity.setRemark(dto.getRemark());
-                voucherEntity.setImg1(dto.getImg1());
-                voucherEntity.setImg2(dto.getImg2());
-                voucherEntity.setImg3(dto.getImg3());
-                voucherEntity.setImg4(dto.getImg4());
-                voucherEntity.setImg5(dto.getImg5());
-                voucherEntity.setUserId(StpUtil.getLoginIdAsLong());
-                voucherEntity.setStatus(1);
-                voucherEntity.setUpdateTime(new Date());
-                if(orderComplainVoucherService.updateById(voucherEntity)) {
-                    Map data = MapUtil.of("id", voucherEntity.getId());
-                    return success(data);
-                } else {
-                    return error(MessageUtils.message("c2c.order.complain.voucher.update.fail"));//修改申诉凭证失败
-                }
-            } else {
-                return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
-            }
+    }
 
+    @Operation(summary = "删除申诉凭证")
+    @PostMapping("/deleteVoucher")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    public Result deleteVoucher(@RequestBody C2cOrderComplainVoucherIDDTO dto) {
+        ValidatorUtils.validateEntity(dto);
+
+        C2cOrderVoucherEntity voucher = c2cOrderVoucherService.getById(dto.getId());
+        if(voucher==null) {
+            return error(MessageUtils.message("c2c.order.pay.cert.id.invalid"));//凭证编号无效
+        }
+
+        //订单已完成不能删除
+        C2cOrderEntity order = c2cOrderService.selectOrder(voucher.getOrderId());
+        if(order!=null && order.getFlow().intValue()==C2cOrderFlowEnum.END.getCode()) {
+            return error(MessageUtils.message("c2c.order.is.end"));//订单已结束
         }
 
+        if(StpUtil.getLoginIdAsString().equals(voucher.getUserId().toString())) {
 
+            String fileName = voucher.getFile().substring(voucher.getFile().lastIndexOf("/")+1);
+            try {
+                fileService.deleteFileOSS(fileName);
+            } catch (IOException e) {
+                log.error("删除凭证失败",e);
+                return error(MessageUtils.message("c2c.deleteVoucher.voucher.fail"));//删除凭证失败
+            }
+            voucher.setStatus(-1);
+            voucher.setUpdateTime(new Date());
+            return toAjax(c2cOrderVoucherService.updateById(voucher));
+        } else {
+            return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
+        }
     }
 
+
     @Operation(summary = "用户或商家查询申诉历史")
     @PostMapping("/complainHis")
     public Result complainHis(@RequestBody C2cOrderComplainOidDTO orderComplain)
@@ -788,7 +850,7 @@ public class C2cOrderController extends ApiBaseController {
             return error(MessageUtils.message("c2c.order.no.permission.view"));//您无权查看
         }
 
-        List<C2cOrderComplainVoucherEntity> complainList = new ArrayList<>();
+        List<C2cOrderVoucherEntity> complainList = new ArrayList<>();
         C2cOrderEntity order = c2cOrderService.selectOrder(orderComplain.getOrderId());
 
         if(c2cOrderService.checkOrderTranUser(order)) {
@@ -866,4 +928,15 @@ public class C2cOrderController extends ApiBaseController {
         return new Result().ok(settingsList);
     }
 
+    @PostMapping("/complainReason")
+    @Operation(summary = "申诉理由查询列表")
+    public Result complainReason(){
+        SettingEntity setting = settingService.getSetting(SettingEnum.COMPLAIN_REASON_SETTING.name());
+        List<ComplainReasonSetting> settingsList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), ComplainReasonSetting.class);
+        if (CollectionUtils.isEmpty(settingsList)) {
+            return new Result().error(MessageUtils.message("c2c.order.complain.reason.notset"));//"未配置申诉原因"
+        }
+        return new Result().ok(settingsList);
+    }
+
 }

+ 75 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/OrderReportController.java

@@ -0,0 +1,75 @@
+package com.qnfhq.modules.c2c.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.json.JSONUtil;
+import com.qnfhq.common.utils.MessageUtils;
+import com.qnfhq.common.utils.Result;
+import com.qnfhq.common.validator.ValidatorUtils;
+import com.qnfhq.modules.c2c.dto.OrderReportDTO;
+import com.qnfhq.modules.c2c.dto.setting.ReportReasonSetting;
+import com.qnfhq.modules.c2c.entity.OrderReportEntity;
+import com.qnfhq.modules.c2c.service.OrderReportService;
+import com.qnfhq.modules.user.entity.SettingEntity;
+import com.qnfhq.modules.user.enums.SettingEnum;
+import com.qnfhq.modules.user.service.SettingService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * c2c订单举报表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-12-01
+ */
+@RestController
+@RequestMapping("/c2creport")
+@Tag(name="c2c订单举报表")
+public class OrderReportController {
+    @Resource
+    private OrderReportService orderReportService;
+
+    @Resource
+    private SettingService settingService;
+
+
+    @PostMapping("/save")
+    @Operation(summary = "提交")
+    public Result save(@RequestBody OrderReportDTO dto){
+        //效验数据
+        ValidatorUtils.validateEntity(dto);
+
+        OrderReportEntity reportEntity = new OrderReportEntity();
+        reportEntity.setOrderId(dto.getOrderId());
+        reportEntity.setReasonId(dto.getReasonId());
+        reportEntity.setOtherReason(dto.getOtherReason());
+        reportEntity.setEmail(dto.getEmail());
+        reportEntity.setRemark(dto.getRemark());
+        reportEntity.setVoucherIds(dto.getVoucherIds());
+        reportEntity.setStatus(0);
+        reportEntity.setInputUserId(StpUtil.getLoginIdAsLong());
+        reportEntity.setCreateTime(new Date());
+        orderReportService.save(reportEntity);
+
+        return new Result();
+    }
+
+    @PostMapping("/reason")
+    @Operation(summary = "举报理由列表")
+    public Result reason(){
+        SettingEntity setting = settingService.getSetting(SettingEnum.REPORT_REASON_SETTING.name());
+        List<ReportReasonSetting> settingsList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), ReportReasonSetting.class);
+        if (CollectionUtils.isEmpty(settingsList)) {
+            return new Result().error(MessageUtils.message("c2c.order.complain.reason.notset"));//"未配置申诉原因"
+        }
+        return new Result().ok(settingsList);
+    }
+
+}

+ 3 - 3
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cOrderComplainVoucherDao.java → qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cOrderVoucherDao.java

@@ -1,16 +1,16 @@
 package com.qnfhq.modules.c2c.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.qnfhq.modules.c2c.entity.C2cOrderComplainVoucherEntity;
+import com.qnfhq.modules.c2c.entity.C2cOrderVoucherEntity;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
- * c2c申诉证明材料
+ * c2c证明材料
  *
  * @author yelz 30262728@qq.com
  * @since 1.0.0 2025-11-17
  */
 @Mapper
-public interface C2cOrderComplainVoucherDao extends BaseMapper<C2cOrderComplainVoucherEntity> {
+public interface C2cOrderVoucherDao extends BaseMapper<C2cOrderVoucherEntity> {
 	
 }

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

@@ -0,0 +1,16 @@
+package com.qnfhq.modules.c2c.dao;
+
+import com.qnfhq.common.dao.BaseDao;
+import com.qnfhq.modules.c2c.entity.OrderReportEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * c2c订单举报表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-12-01
+ */
+@Mapper
+public interface OrderReportDao extends BaseDao<OrderReportEntity> {
+	
+}

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

@@ -24,7 +24,7 @@ public class C2cOrderCancelDTO implements Serializable {
 
 
     @SchemaProperty(name = "取消原因编号")
-    @NotNull(message="{NotNull.reasonId}")//取消原因编号不能为空
+    @NotNull(message="{NotNull.reasonId}")//原因编号不能为空
     private Long reasonId;
 
     @SchemaProperty(name = "取消原因类别")

+ 11 - 3
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainDTO.java

@@ -24,9 +24,17 @@ public class C2cOrderComplainDTO implements Serializable {
     @NotNull(message="{NotNull.orderId}")//订单编号不能为空
 	private Long orderId;
 
-	@SchemaProperty(name = "申诉原因")
-    @NotBlank(message="{NotBlank.reason}")//申诉原因不能为空
-	private String reason;
+    @SchemaProperty(name = "申诉理由编号")
+    @NotNull(message="{NotNull.reasonId}")//申诉理由编号不能为空
+    private Integer reasonId;
 
+	@SchemaProperty(name = "其他理由")
+	private String otherReason;
 
+    @SchemaProperty(name = "申诉描述")
+    private String remark;
+
+    @SchemaProperty(name = "申诉凭证")
+    @NotBlank(message="{NotBlank.voucherIds}")//申诉凭证不能为空
+    private String voucherIds;
 }

+ 0 - 51
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainVoucherDTO.java

@@ -1,51 +0,0 @@
-package com.qnfhq.modules.c2c.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.media.SchemaProperty;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * c2c申诉证明材料
- *
- * @author yelz 30262728@qq.com
- * @since 1.0.0 2025-11-17
- */
-@Data
-@Schema(name = "c2c申诉证明材料")
-public class C2cOrderComplainVoucherDTO implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-	@SchemaProperty(name = "自增id")
-	private Long id;
-
-	@SchemaProperty(name = "申诉编号")
-    @NotNull(message="{NotNull.complainId}")//申诉编号不能为空
-	private Long complainId;
-
-	@SchemaProperty(name = "凭证描述")
-    @NotBlank(message="{NotBlank.remark}")//凭证描述不能为空
-	private String remark;
-
-	@SchemaProperty(name = "凭证截图1")
-    @NotBlank(message="{NotBlank.img1}")//凭证截图1不能为空
-	private String img1;
-
-	@SchemaProperty(name = "凭证截图2")
-	private String img2;
-
-	@SchemaProperty(name = "凭证截图3")
-	private String img3;
-
-	@SchemaProperty(name = "凭证截图4")
-	private String img4;
-
-	@SchemaProperty(name = "凭证截图5")
-	private String img5;
-
-
-
-}

+ 30 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainVoucherIDDTO.java

@@ -0,0 +1,30 @@
+package com.qnfhq.modules.c2c.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.media.SchemaProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * c2c申诉证明材料
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-17
+ */
+@Data
+@Schema(name = "c2c申诉证明材料")
+public class C2cOrderComplainVoucherIDDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	@SchemaProperty(name = "自增id")
+    @NotNull(message="{NotNull.id}")
+	private Long id;
+
+
+
+
+
+}

+ 30 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderConfirmPayDTO.java

@@ -0,0 +1,30 @@
+package com.qnfhq.modules.c2c.dto;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serializable;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.media.SchemaProperty;
+/**
+ * c2c订单
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-17
+ */
+@Data
+@Schema(name = "c2c订单")
+public class C2cOrderConfirmPayDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @SchemaProperty(name = "订单编号")
+    @NotNull(message="{NotNull.oId}")//订单编号不能为空
+    private Long id;
+
+//    @SchemaProperty(name = "付款凭证")
+//    @NotBlank(message="{NotBlank.voucherIds}")//凭证不能为空
+//    private String voucherIds;
+
+}

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

@@ -1,105 +0,0 @@
-package com.qnfhq.modules.c2c.dto;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.qnfhq.modules.c2c.entity.C2cPaymentVoucherEntity;
-import com.qnfhq.modules.c2c.entity.C2cUserReceiptEntity;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.media.SchemaProperty;
-/**
- * c2c订单
- *
- * @author yelz 30262728@qq.com
- * @since 1.0.0 2025-11-17
- */
-@Data
-@Schema(name = "c2c订单")
-public class C2cOrderDTO implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-	@SchemaProperty(name = "自增编号")
-	private Long id;
-
-	@SchemaProperty(name = "订单编号")
-	private String orderNo;
-
-	@SchemaProperty(name = "下单人的编号")
-	private Long userId;
-
-	@SchemaProperty(name = "下单名字")
-	private String userName;
-
-	@SchemaProperty(name = "1买入  2 卖出")
-	private Integer direction;
-
-	@SchemaProperty(name = "法定货币")
-	private String legalCoin;
-
-	@SchemaProperty(name = "交易币USDT,BTC")
-	private String symbol;
-
-	@SchemaProperty(name = "广告编号")
-	private Long c2cAdId;
-
-	@SchemaProperty(name = "交易对手编号")
-	private Long tranUserId;
-
-	@SchemaProperty(name = "交易对手名字")
-	private String tranUserName;
-
-	@SchemaProperty(name = "单价")
-	private BigDecimal tranPrice;
-
-	@SchemaProperty(name = "数量USDT")
-	private BigDecimal symbolNum;
-
-	@SchemaProperty(name = "法币的交易金额")
-	private BigDecimal tranAmount;
-
-	@SchemaProperty(name = "1微信  2支付宝 3银行借记卡")
-	private Integer payType;
-
-    @SchemaProperty(name = "付款时间")
-    private Date payTime;
-
-	@SchemaProperty(name = "0 进行中 1 已结束 ")
-	private Integer flow;
-
-	@SchemaProperty(name = "0 未付款 1 已付款(确认付款后)2 申诉 3 已完成 4 已取消 ")
-	private Integer status;
-
-	@SchemaProperty(name = "广告要求")
-	private String remark;
-
-	@SchemaProperty(name = "")
-	private Date createTime;
-
-	@SchemaProperty(name = "")
-	private Date updateTime;
-
-    @SchemaProperty(name = "支付过期时间")
-    private Date payExpireTime;
-
-    @SchemaProperty(name = "完成时间")
-    private Date finishTime;
-
-    @SchemaProperty(name = "关闭时间")
-    private Date closeTime;
-
-    @SchemaProperty(name = "卖家收款信息")
-    C2cUserReceiptEntity receiptInfo;
-
-    @SchemaProperty(name = "是否有付款凭证")
-    Integer isVoucher=0;
-
-    @SchemaProperty(name = "买家付款凭证")
-    List<C2cPaymentVoucherEntity> payVoucherList;
-
-}

+ 39 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderVoucherDTO.java

@@ -0,0 +1,39 @@
+package com.qnfhq.modules.c2c.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.media.SchemaProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * c2c凭证材料
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-17
+ */
+@Data
+@Schema(name = "c2c凭证材料")
+public class C2cOrderVoucherDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	@SchemaProperty(name = "自增id")
+	private Long id;
+
+	@SchemaProperty(name = "订单编号")
+    @NotNull(message="{NotNull.orderId}")
+	private Long orderId;
+
+	@SchemaProperty(name = "凭证描述")
+	private String remark;
+
+	@SchemaProperty(name = "凭证")
+    @NotBlank(message="{NotBlank.file}")//凭证不能为空
+	private String file;
+
+
+
+
+}

+ 47 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/OrderReportDTO.java

@@ -0,0 +1,47 @@
+package com.qnfhq.modules.c2c.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.media.SchemaProperty;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * c2c订单举报表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-12-01
+ */
+@Data
+@Schema(name = "c2c订单举报表")
+public class OrderReportDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	@SchemaProperty(name = "订单编号")
+    @NotNull(message="{NotNull.orderId}")//订单编号不能为空
+	private Long orderId;
+
+	@SchemaProperty(name = "举报理由")
+    @NotNull(message="{NotNull.reasonId}")//原因编号不能为空
+	private Long reasonId;
+
+	@SchemaProperty(name = "其他理由")
+	private String otherReason;
+
+	@SchemaProperty(name = "邮箱")
+    @Email(message = "{Email.format.err}")//邮箱格式不正确
+    @NotBlank(message="{NotBlank.email}")//邮箱不能为空
+	private String email;
+
+	@SchemaProperty(name = "描述")
+	private String remark;
+
+    @SchemaProperty(name = "凭证编号")
+    private String voucherIds;
+
+}

+ 12 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/setting/ComplainReasonSetting.java

@@ -0,0 +1,12 @@
+package com.qnfhq.modules.c2c.dto.setting;
+
+import lombok.Data;
+
+/**
+ * 取消原因配置
+ */
+@Data
+public class ComplainReasonSetting {
+    private Integer reasonId;//编号
+    private String reasonName;//名称
+}

+ 14 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/setting/ReportReasonSetting.java

@@ -0,0 +1,14 @@
+package com.qnfhq.modules.c2c.dto.setting;
+
+import lombok.Data;
+
+/**
+ * 取消原因配置
+ */
+@Data
+public class ReportReasonSetting {
+    private Integer reasonId;//编号
+    private Integer typeId;
+    private String typeName;
+    private String reasonName;//名称
+}

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

@@ -34,10 +34,23 @@ public class C2cOrderComplainEntity implements Serializable {
      * 申诉人名字
      */
 	private String fromUserName;
+
     /**
      * 申诉原因
      */
-	private String reason;
+    private Integer reasonId;
+    /**
+     * 其他原因
+     */
+	private String otherReason;
+    /**
+     * 申诉凭证编号
+     */
+    private String voucherIds;
+    /**
+     * 申诉描述
+     */
+    private String remark;
     /**
      * 被申诉人的编号
      */

+ 10 - 21
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cOrderComplainVoucherEntity.java → qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cOrderVoucherEntity.java

@@ -9,14 +9,14 @@ import java.io.Serializable;
 import java.util.Date;
 
 /**
- * c2c申诉证明材料
+ * c2c凭证证明材料
  *
  * @author yelz 30262728@qq.com
  * @since 1.0.0 2025-11-17
  */
 @Data
-@TableName("c2c_order_complain_voucher")
-public class C2cOrderComplainVoucherEntity implements Serializable {
+@TableName("c2c_order_voucher")
+public class C2cOrderVoucherEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
 
@@ -25,31 +25,20 @@ public class C2cOrderComplainVoucherEntity implements Serializable {
     /**
      * 
      */
-	private Long complainId;
+	private Long orderId;
     /**
-     * 凭证描述
-     */
-	private String remark;
-    /**
-     * 
-     */
-	private String img1;
-    /**
-     * 
+     * 凭证类型:1申诉 2举报
      */
-	private String img2;
+    private Integer type;
     /**
-     * 
-     */
-	private String img3;
-    /**
-     * 
+     * 凭证描述
      */
-	private String img4;
+	private String remark;
     /**
      * 
      */
-	private String img5;
+	private String file;
+
     /**
      * 上传人的编号
      */

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

@@ -26,10 +26,7 @@ public class C2cPaymentVoucherEntity implements Serializable {
      * 
      */
 	private Long orderId;
-    /**
-     * 订单编号
-     */
-	private String orderNo;
+
     /**
      * 
      */

+ 70 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/OrderReportEntity.java

@@ -0,0 +1,70 @@
+package com.qnfhq.modules.c2c.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * c2c订单举报表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-12-01
+ */
+@Data
+@TableName("c2c_order_report")
+public class OrderReportEntity {
+
+    /**
+     * 
+     */
+	private Long id;
+    /**
+     * 
+     */
+	private Long orderId;
+    /**
+     * 举报理由
+     */
+	private Long reasonId;
+    /**
+     * 其他理由
+     */
+	private String otherReason;
+    /**
+     * 邮箱
+     */
+	private String email;
+    /**
+     * 描述
+     */
+	private String remark;
+    /**
+     * 凭证
+     */
+    private String voucherIds;
+    /**
+     * 0 已提交 1 已受理 2已处理 
+     */
+	private Integer status;
+    /**
+     * 结果
+     */
+	private String result;
+    /**
+     * 操作人
+     */
+	private Long opUserId;
+    /**
+     * 
+     */
+	private Date opTime;
+    /**
+     * 提交人
+     */
+	private Long inputUserId;
+    /**
+     * 
+     */
+	private Date createTime;
+}

+ 0 - 16
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderComplainVoucherService.java

@@ -1,16 +0,0 @@
-package com.qnfhq.modules.c2c.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.qnfhq.modules.c2c.entity.C2cOrderComplainVoucherEntity;
-
-import java.util.List;
-
-/**
- * c2c申诉证明材料
- *
- * @author yelz 30262728@qq.com
- * @since 1.0.0 2025-11-17
- */
-public interface C2cOrderComplainVoucherService extends IService<C2cOrderComplainVoucherEntity> {
-    List<C2cOrderComplainVoucherEntity> selectList(Long complainId);
-}

+ 16 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderVoucherService.java

@@ -0,0 +1,16 @@
+package com.qnfhq.modules.c2c.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qnfhq.modules.c2c.entity.C2cOrderVoucherEntity;
+
+import java.util.List;
+
+/**
+ * c2c申诉证明材料
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-17
+ */
+public interface C2cOrderVoucherService extends IService<C2cOrderVoucherEntity> {
+    List<C2cOrderVoucherEntity> selectList(Long orderId);
+}

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

@@ -0,0 +1,14 @@
+package com.qnfhq.modules.c2c.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qnfhq.modules.c2c.entity.OrderReportEntity;
+
+/**
+ * c2c订单举报表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-12-01
+ */
+public interface OrderReportService extends IService<OrderReportEntity> {
+
+}

+ 0 - 31
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderComplainVoucherServiceImpl.java

@@ -1,31 +0,0 @@
-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.C2cOrderComplainVoucherDao;
-import com.qnfhq.modules.c2c.entity.C2cOrderComplainVoucherEntity;
-import com.qnfhq.modules.c2c.service.C2cOrderComplainVoucherService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * c2c申诉证明材料
- *
- * @author yelz 30262728@qq.com
- * @since 1.0.0 2025-11-17
- */
-@Service
-public class C2cOrderComplainVoucherServiceImpl extends ServiceImpl<C2cOrderComplainVoucherDao, C2cOrderComplainVoucherEntity> implements C2cOrderComplainVoucherService {
-
-
-    @Override
-    public List<C2cOrderComplainVoucherEntity> selectList(Long complainId) {
-        return list(new QueryWrapper<C2cOrderComplainVoucherEntity>()
-                .eq(Objects.nonNull(complainId),"complain_id", complainId)
-                .eq("status", 1)
-                .orderByDesc("id")
-        );
-    }
-}

+ 2 - 3
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java

@@ -708,7 +708,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
             return result;
         }
 
-        insertC2cOrderLog(order.getId(), order.getStatus(), C2cOrderStatusEnum.COMPLAIN.getCode(), c2cOrderComplain.getReason(),StpUtil.getLoginIdAsLong(),"app");
+        insertC2cOrderLog(order.getId(), order.getStatus(), C2cOrderStatusEnum.COMPLAIN.getCode(), c2cOrderComplain.getReasonId().toString(),StpUtil.getLoginIdAsLong(),"app");
 
         order.setStatus(C2cOrderStatusEnum.COMPLAIN.getCode());
         if(!updateById(order)) {
@@ -734,6 +734,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
 
         //设置订单状态
         setOrderStatusCache(order);
+        releaseCounts(order, sellUserId);
 
         //邮件通知被申诉人
 //        TAppUser appUser = appUserService.getById(c2cOrderComplain.getToUserId());
@@ -743,8 +744,6 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
 //            EmailUtils.sendComplainMail(appUser.getEmail(), emailText);
 //        }
 
-        releaseCounts(order, sellUserId);
-
         return result.ok(c2cOrderComplain.getId());
     }
 

+ 31 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderVoucherServiceImpl.java

@@ -0,0 +1,31 @@
+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.C2cOrderVoucherDao;
+import com.qnfhq.modules.c2c.entity.C2cOrderVoucherEntity;
+import com.qnfhq.modules.c2c.service.C2cOrderVoucherService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * c2c申诉证明材料
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-11-17
+ */
+@Service
+public class C2cOrderVoucherServiceImpl extends ServiceImpl<C2cOrderVoucherDao, C2cOrderVoucherEntity> implements C2cOrderVoucherService {
+
+
+    @Override
+    public List<C2cOrderVoucherEntity> selectList(Long orderId) {
+        return list(new QueryWrapper<C2cOrderVoucherEntity>()
+                .eq(Objects.nonNull(orderId),"order_id", orderId)
+                .eq("status", 1)
+                .orderByDesc("id")
+        );
+    }
+}

+ 1 - 9
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cPaymentVoucherServiceImpl.java

@@ -28,15 +28,7 @@ public class C2cPaymentVoucherServiceImpl extends ServiceImpl<C2cPaymentVoucherD
         this.c2cPaymentVoucherDao = c2cPaymentVoucherDao;
     }
 
-//    @Override
-//    public QueryWrapper<C2cPaymentVoucherEntity> getWrapper(Map<String, Object> params){
-//        String id = (String)params.get("id");
-//
-//        QueryWrapper<C2cPaymentVoucherEntity> wrapper = new QueryWrapper<>();
-//        wrapper.eq(StrUtil.isNotBlank(id), "id", id);
-//
-//        return wrapper;
-//    }
+
 
     @Override
     public List<C2cPaymentVoucherEntity> selectList(Long orderId) {

+ 31 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/OrderReportServiceImpl.java

@@ -0,0 +1,31 @@
+package com.qnfhq.modules.c2c.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qnfhq.modules.c2c.dao.OrderReportDao;
+import com.qnfhq.modules.c2c.entity.OrderReportEntity;
+import com.qnfhq.modules.c2c.service.OrderReportService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * c2c订单举报表
+ *
+ * @author yelz 30262728@qq.com
+ * @since 1.0.0 2025-12-01
+ */
+@Service
+public class OrderReportServiceImpl extends ServiceImpl<OrderReportDao, OrderReportEntity> implements OrderReportService {
+
+//    @Override
+//    public QueryWrapper<OrderReportEntity> getWrapper(Map<String, Object> params){
+//        String id = (String)params.get("id");
+//
+//        QueryWrapper<OrderReportEntity> wrapper = new QueryWrapper<>();
+//        wrapper.eq(StrUtil.isNotBlank(id), "id", id);
+//
+//        return wrapper;
+//    }
+
+
+}

+ 57 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/common/controller/CommonController.java

@@ -0,0 +1,57 @@
+package com.qnfhq.modules.common.controller;
+
+import com.qnfhq.common.ApiBaseController;
+import com.qnfhq.common.redis.RedisUtils;
+import com.qnfhq.common.utils.Result;
+import com.qnfhq.modules.common.service.FileService;
+import com.qnfhq.modules.user.service.SettingService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import jakarta.annotation.Resource;
+import java.util.*;
+
+/**
+ * 通用请求处理
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/home")
+public class CommonController extends ApiBaseController
+{
+    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
+
+    @Resource
+    private RedisUtils redisUtils;
+    @Resource
+    private FileService fileService;
+    @Resource
+    private SettingService settingService;
+
+
+    /**
+     * oss通用上传请求
+     */
+    @PostMapping("/upload/OSS")
+    public Result uploadFileOSS(MultipartFile file, String remark) {
+        try {
+            String filename = file.getResource().getFilename();
+            //这里文件名用了uuid 防止重复,可以根据自己的需要来写
+            String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
+            name = name.replace("-", "");
+            String url = fileService.uploadFileOSS(file,name);
+            Map ajax =new  HashMap();
+            ajax.put("fileName", name);
+            ajax.put("url", url);
+            return new Result().ok(ajax);
+        } catch (Exception e) {
+            e.getMessage();
+            return new Result().error(e.getMessage());
+        }
+    }
+
+
+
+}

+ 31 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/common/dto/setting/OssSetting.java

@@ -0,0 +1,31 @@
+package com.qnfhq.modules.common.dto.setting;
+
+import lombok.Data;
+
+/**
+ * 阿里文件服务器
+ */
+@Data
+public class OssSetting {
+
+    /**
+     * 存放路径路径
+     */
+    private String picLocation;
+
+    private String endPoint;
+    /**
+     * 储存空间
+     */
+    private String bucketName;
+    /**
+     * 密钥id
+     */
+    private String accessKeyId;
+    /**
+     * 密钥
+     */
+    private String accessKeySecret;
+
+
+}

+ 10 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/common/service/FileService.java

@@ -0,0 +1,10 @@
+package com.qnfhq.modules.common.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+public interface FileService {
+    String uploadFileOSS(MultipartFile file, String name) throws IOException;
+    void deleteFileOSS(String fileName) throws IOException;
+}

+ 66 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/common/service/impl/FileServiceImpl.java

@@ -0,0 +1,66 @@
+package com.qnfhq.modules.common.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.qnfhq.modules.common.dto.setting.OssSetting;
+import com.qnfhq.modules.common.service.FileService;
+import com.qnfhq.modules.user.entity.SettingEntity;
+import com.qnfhq.modules.user.enums.SettingEnum;
+import com.qnfhq.modules.user.service.SettingService;
+import com.qnfhq.utils.AliOssCloudUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+
+@Service
+public class FileServiceImpl implements FileService {
+
+
+    @Resource
+    private SettingService settingService;
+
+
+    @Override
+    public String uploadFileOSS(MultipartFile file, String name) throws IOException {
+        SettingEntity setting = settingService.getSetting(SettingEnum.OSS_SETTING.name());
+        OssSetting ossSetting = JSONUtil.toBean(setting.getSettingValue(), OssSetting.class);
+        InputStream inputStream = null;
+        inputStream = file.getInputStream();
+        //阿里云的endpoint
+        String endpoint =  ossSetting.getEndPoint();
+        //阿里云的accessKeyId
+        String accessKeyId = ossSetting.getAccessKeyId();
+        //阿里云的accessKeySecret
+        String accessKeySecret = ossSetting.getAccessKeySecret();
+        //空间
+        String bucketName =ossSetting.getBucketName();
+        //文件存储目录
+        String filedir = ossSetting.getPicLocation();
+
+        AliOssCloudUtil util = new AliOssCloudUtil(endpoint,accessKeyId,accessKeySecret,bucketName,filedir);
+        //上传成功返回完整路径的url
+        return util.uploadFile2OSS(inputStream, name);
+    }
+
+    @Override
+    public void deleteFileOSS(String fileName) throws IOException {
+        SettingEntity setting = settingService.getSetting(SettingEnum.OSS_SETTING.name());
+        OssSetting ossSetting = JSONUtil.toBean(setting.getSettingValue(), OssSetting.class);
+
+        //阿里云的endpoint
+        String endpoint =  ossSetting.getEndPoint();
+        //阿里云的accessKeyId
+        String accessKeyId = ossSetting.getAccessKeyId();
+        //阿里云的accessKeySecret
+        String accessKeySecret = ossSetting.getAccessKeySecret();
+        //空间
+        String bucketName =ossSetting.getBucketName();
+        //文件存储目录
+        String filedir = ossSetting.getPicLocation();
+
+        AliOssCloudUtil util = new AliOssCloudUtil(endpoint,accessKeyId,accessKeySecret,bucketName,filedir);
+        util.delete(filedir+fileName);
+    }
+}

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

@@ -175,4 +175,7 @@ public class ApiAppUserController {
         result.setData(MapUtil.of(StpUtil.getTokenName(), StpUtil.getTokenValue()));
         return result;
     }
+
+
+
 }

+ 6 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/user/enums/SettingEnum.java

@@ -99,11 +99,15 @@ public enum SettingEnum {
     REFUSE_SUBMIT,
     //广告配置
     AD_SETTING,
-    //验证码配置
+    //阿里智能验证码配置
     CAPTCHA_SETTING,
     //评论标签设置
     REVIEW_SETTING,
     //c2c取消原因设置
-    CANCEL_REASON_SETTING
+    CANCEL_REASON_SETTING,
+    //c2c申诉原因设置
+    COMPLAIN_REASON_SETTING,
+    //c2c举报原因设置
+    REPORT_REASON_SETTING
     ;
 }

+ 230 - 0
qnfhq-api/src/main/java/com/qnfhq/utils/AliOssCloudUtil.java

@@ -0,0 +1,230 @@
+package com.qnfhq.utils;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.*;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+@Slf4j
+public class AliOssCloudUtil {
+    private String endpoint =  "";
+
+    //阿里云的accessKeyId
+    private String accessKeyId = "";
+
+    //阿里云的accessKeySecret
+    private String accessKeySecret = "";
+
+    //空间
+    private String bucketName = "";
+
+    //文件存储目录
+    private String filedir = "";
+
+    private OSSClient ossClient;
+
+    public AliOssCloudUtil(String endpoint, String accessKeyId, String accessKeySecret, String bucketName, String filedir) {
+        this.endpoint = endpoint;
+        this.accessKeyId = accessKeyId;
+        this.accessKeySecret = accessKeySecret;
+        this.bucketName = bucketName;
+        this.filedir = filedir;
+        this.ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
+    }
+
+    public AliOssCloudUtil() {
+        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
+    }
+
+    public String getFiledir() {
+        return this.filedir;
+    }
+
+    //自定义上传文件夹
+    public AliOssCloudUtil(String filedir) {
+        this.filedir = filedir;
+        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
+    }
+
+
+    /**
+     * 初始化
+     */
+    public void init() {
+        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
+    }
+
+    /**
+     * 销毁
+     */
+    public void destory() {
+        ossClient.shutdown();
+    }
+
+
+    /**
+     * 上传到OSS服务器
+     *
+     * @param instream 文件流
+     * @param fileName 文件名称 包括后缀名
+     * @return 出错返回"" ,唯一MD5数字签名
+     */
+    public String uploadFile2OSS(InputStream instream, String fileName) {
+        String ret = "";
+        // 判断bucket是否已经存在,不存在进行创建
+        if (!doesBucketExist()) {
+            createBucket();
+        }
+        try {
+            //创建上传Object的Metadata
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setContentLength(instream.available());
+            objectMetadata.setCacheControl("no-cache");
+            objectMetadata.setHeader("Pragma", "no-cache");
+            objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")+1)));
+            objectMetadata.setContentDisposition("inline;filename=" + fileName);
+
+            // 指定上传文件操作时是否覆盖同名Object。
+            // 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
+            // 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
+            // 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
+            objectMetadata.setHeader("x-oss-forbid-overwrite", "false");
+
+            String objectName = filedir + fileName;
+
+            //上传文件
+            ossClient.putObject(bucketName, objectName, instream, objectMetadata);
+            // 封装  url 路径
+            String url = "https://" + bucketName + "." + endpoint + "/" + objectName;
+            System.out.println(objectName);
+            ret = url;
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            ossClient.shutdown();
+            try {
+                if (instream != null) {
+                    instream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return ret;
+    }
+
+
+    /**
+     * 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,
+     * 如果为true则忽略302重定向或镜像;如果为false,则考虑302重定向或镜像。
+     * yourObjectName 表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+     *
+     * @return 存在返回true
+     */
+    public boolean doesObjectExist(String objectName) {
+        boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName);
+        return exists;
+    }
+
+    /**
+     * 判断Bucket是否存在
+     *
+     * @return 存在返回true
+     */
+    public boolean doesBucketExist() {
+        boolean exists = ossClient.doesBucketExist(bucketName);
+        return exists;
+    }
+
+    /**
+     * 创建Bucket
+     */
+    public void createBucket() {
+        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
+        // 设置bucket权限为公共读,默认是私有读写
+        createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
+        // 设置bucket存储类型为低频访问类型,默认是标准类型
+        createBucketRequest.setStorageClass(StorageClass.IA);
+        boolean exists = ossClient.doesBucketExist(bucketName);
+        if (!exists) {
+            try {
+                ossClient.createBucket(createBucketRequest);
+                // 关闭client
+                ossClient.shutdown();
+            } catch (Exception e) {
+                log.error(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Description: 判断OSS服务文件上传时文件的contentType
+     *
+     * @param FilenameExtension 文件后缀
+     * @return String
+     */
+    public static String getcontentType(String FilenameExtension) {
+        if ("bmp".equalsIgnoreCase(FilenameExtension)) {
+            return "image/bmp";
+        }
+        if ("gif".equalsIgnoreCase(FilenameExtension)) {
+            return "image/gif";
+        }
+        if ("jpeg".equalsIgnoreCase(FilenameExtension) ||
+                "jpg".equalsIgnoreCase(FilenameExtension) ||
+                "png".equalsIgnoreCase(FilenameExtension)) {
+            return "image/jpeg";
+        }
+        if ("html".equalsIgnoreCase(FilenameExtension)) {
+            return "text/html";
+        }
+        if ("txt".equalsIgnoreCase(FilenameExtension)) {
+            return "text/plain";
+        }
+        if ("vsd".equalsIgnoreCase(FilenameExtension)) {
+            return "application/vnd.visio";
+        }
+        if ("pptx".equalsIgnoreCase(FilenameExtension) ||
+                "ppt".equalsIgnoreCase(FilenameExtension)) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if ("docx".equalsIgnoreCase(FilenameExtension) ||
+                "doc".equalsIgnoreCase(FilenameExtension)) {
+            return "application/msword";
+        }
+        if ("xml".equalsIgnoreCase(FilenameExtension)) {
+            return "text/xml";
+        }
+        if ("pdf".equalsIgnoreCase(FilenameExtension)) {
+            return "application/pdf";
+        }
+        return "image/jpeg";
+    }
+
+
+    /**
+     * @param fileName
+     * @return
+     * @Title: getInputStreamByFileUrl
+     * @Description: 根据文件路径获取InputStream流
+     * @return: InputStream
+     */
+    public InputStream getInputStreamByFileUrl(String fileName) {
+        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
+        OSSObject ossObject = ossClient.getObject(bucketName, fileName);
+        return ossObject.getObjectContent();
+    }
+
+
+    /**
+     * @desc 删除文件
+     * @date 2022-10-12
+     */
+    public  void delete(String objectName) {
+        // 根据BucketName,objectName删除文件
+        ossClient.deleteObject(bucketName, objectName);
+        ossClient.shutdown();
+    }
+}

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

@@ -112,11 +112,8 @@ c2c.order.not.buyer.seller=Anda bukan pengguna transaksi, tidak boleh memulakan
 c2c.order.pay.update.fail=Gagal mengemas kini pesanan
 c2c.order.complain.submit.fail=Gagal menghantar aduan
 c2c.order.complain.not.exist=Nombor aduan tidak sah
-c2c.complain.voucher.submit.fail=Gagal menghantar, anda bukan pengadu atau yang diadukan
 c2c.order.complain.remark.notEmpty=Sebab aduan tidak boleh kosong
-c2c.order.complain.remark.maxval=Penerangan maksimum 250 aksara
 c2c.order.complain.voucher.id.invalid=Nombor bukti aduan tidak sah
-
 c2c.order.complain.voucher.is.end=Rayuan telah berakhir
 c2c.order.complain.voucher.save.fail=Gagal menyimpan bukti rayuan
 c2c.order.complain.voucher.update.fail=Gagal mengemas kini bukti rayuan
@@ -145,5 +142,14 @@ c2c.order.reviews.not.complete=Status pesanan "Selesai" diperlukan untuk memberi
 c2c.order.reviews.create.fail=Gagal membuat ulasan
 c2c.reviews.save.fail=Gagal menyimpan ulasan
 c2c.order.you.reviewed=Anda telah memberikan ulasan untuk pesanan ini
-c2c.order.cancel.otherReason.NotEmpty=Sebab lain tidak boleh kosong
-c2c.order.cancel.reason.notset=Sebab pembatalan belum ditetapkan
+c2c.order.cancel.otherReason.NotEmpty=Alasan lain tidak boleh kosong
+c2c.order.cancel.reason.notset=Alasan pembatalan belum dikonfigurasi
+c2c.order.complain.reason.notset=Alasan aduan belum dikonfigurasi
+c2c.deletePayment.voucher.fail=Gagal menghapus bukti pembayaran
+c2c.order.complain.remark.maxval=Deskripsi maksimum 250 aksara
+c2c.order.complain.files.limit=Maksimum 5 bukti aduan
+c2c.complain.voucher.submit.fail=Penghantaran gagal, anda bukan pihak transaksi pesanan
+c2c.orderId.is.empty=Nombor pesanan tidak boleh kosong
+c2c.voucher.type.is.empty=Jenis bukti tidak boleh kosong
+c2c.deleteVoucher.voucher.fail=Gagal menghapus bukti
+c2c.order.payment.vouchers.limit = Maksimum 3 voucher pembayaran

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

@@ -111,12 +111,9 @@ c2c.complain.submit.fail=Beschwerde konnte nicht eingereicht werden, Sie sind we
 c2c.order.not.buyer.seller=Sie sind kein Handelsteilnehmer und k\u00f6nnen keine Beschwerde einreichen  
 c2c.order.pay.update.fail=Fehler beim Aktualisieren der Bestellung  
 c2c.order.complain.submit.fail=Fehler beim Einreichen der Beschwerde  
-c2c.order.complain.not.exist=Ung\u00fcltige Beschwerde-ID  
-c2c.complain.voucher.submit.fail=Einreichung fehlgeschlagen, Sie sind weder Beschwerdef\u00fchrer noch Beschwerdegegner  
-c2c.order.complain.remark.notEmpty=Beschwerdegrund darf nicht leer sein  
-c2c.order.complain.remark.maxval=Beschreibung darf maximal 250 Zeichen enthalten  
+c2c.order.complain.not.exist=Ung\u00fcltige Beschwerde-ID
+c2c.order.complain.remark.notEmpty=Beschwerdegrund darf nicht leer sein
 c2c.order.complain.voucher.id.invalid=Ung\u00fcltige Beschwerdenachweis-ID
-
 c2c.order.complain.voucher.is.end=Die Beschwerde ist abgeschlossen
 c2c.order.complain.voucher.save.fail=Speichern des Beschwerdebelegs fehlgeschlagen
 c2c.order.complain.voucher.update.fail=Aktualisierung des Beschwerdebelegs fehlgeschlagen
@@ -145,3 +142,14 @@ c2c.order.reviews.not.complete=Nur bei Bestellstatus "Abgeschlossen" kann eine B
 c2c.order.reviews.create.fail=Bewertung abgeben fehlgeschlagen  
 c2c.reviews.save.fail=Bewertung konnte nicht gespeichert werden  
 c2c.order.you.reviewed=Sie haben diese Bestellung bereits bewertet
+c2c.order.cancel.otherReason.NotEmpty=Andere Gr\u00fcnde d\u00fcrfen nicht leer sein  
+c2c.order.cancel.reason.notset=Stornierungsgrund nicht konfiguriert  
+c2c.order.complain.reason.notset=Beschwerdegrund nicht konfiguriert  
+c2c.deletePayment.voucher.fail=Zahlungsbeleg konnte nicht gel\u00f6scht werden  
+c2c.order.complain.remark.maxval=Beschreibung maximal 250 Zeichen  
+c2c.order.complain.files.limit=Maximal 5 Beschwerdebelege  
+c2c.complain.voucher.submit.fail=\u00dcbermittlung fehlgeschlagen, Sie sind keine Vertragspartei der Bestellung  
+c2c.orderId.is.empty=Bestellnummer darf nicht leer sein  
+c2c.voucher.type.is.empty=Belegtyp darf nicht leer sein  
+c2c.deleteVoucher.voucher.fail=L\u00f6schen des Belegs fehlgeschlagen
+c2c.order.payment.vouchers.limit=Maximal 3 Zahlungsscheine

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

@@ -111,12 +111,9 @@ c2c.complain.submit.fail=Failed to initiate complaint, you are not the buyer or
 c2c.order.not.buyer.seller=You are not a transaction user and cannot initiate a complaint  
 c2c.order.pay.update.fail=Failed to update order  
 c2c.order.complain.submit.fail=Failed to submit complaint  
-c2c.order.complain.not.exist=Invalid complaint ID  
-c2c.complain.voucher.submit.fail=Submission failed, you are not the complainant or respondent  
-c2c.order.complain.remark.notEmpty=Complaint reason cannot be empty  
-c2c.order.complain.remark.maxval=Description up to 250 characters  
+c2c.order.complain.not.exist=Invalid complaint ID
+c2c.order.complain.remark.notEmpty=Complaint reason cannot be empty   
 c2c.order.complain.voucher.id.invalid=Invalid complaint proof ID
-
 c2c.order.complain.voucher.is.end=The complaint has ended
 c2c.order.complain.voucher.save.fail=Failed to save complaint voucher
 c2c.order.complain.voucher.update.fail=Failed to update complaint voucher
@@ -146,4 +143,13 @@ c2c.order.reviews.create.fail=Failed to post review
 c2c.reviews.save.fail=Failed to save review
 c2c.order.you.reviewed=You have already reviewed this order
 c2c.order.cancel.otherReason.NotEmpty=Other reasons cannot be empty  
-c2c.order.cancel.reason.notset=Cancellation reason not set
+c2c.order.cancel.reason.notset=Cancel reason not configured  
+c2c.order.complain.reason.notset=Complaint reason not configured  
+c2c.deletePayment.voucher.fail=Failed to delete payment voucher  
+c2c.order.complain.remark.maxval=Description can be up to 250 characters  
+c2c.order.complain.files.limit=Up to 5 complaint vouchers allowed  
+c2c.complain.voucher.submit.fail=Submission failed, you are not a party to the order transaction  
+c2c.orderId.is.empty=Order number cannot be empty  
+c2c.voucher.type.is.empty=Voucher type cannot be empty  
+c2c.deleteVoucher.voucher.fail=Failed to delete voucher
+c2c.order.payment.vouchers.limit=Up to 3 payment vouchers allowed

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

@@ -111,12 +111,9 @@ c2c.complain.submit.fail=Error al iniciar la disputa, usted no es comprador ni v
 c2c.order.not.buyer.seller=Usted no es parte de la transacci\u00f3n, no puede iniciar una disputa  
 c2c.order.pay.update.fail=Error al actualizar la orden  
 c2c.order.complain.submit.fail=Error al enviar la disputa  
-c2c.order.complain.not.exist=El n\u00famero de disputa no es v\u00e1lido  
-c2c.complain.voucher.submit.fail=Error al enviar, usted no es el reclamante ni el reclamado  
-c2c.order.complain.remark.notEmpty=La raz\u00f3n de la disputa no puede estar vac\u00eda  
-c2c.order.complain.remark.maxval=La descripci\u00f3n puede tener un m\u00e1ximo de 250 caracteres  
+c2c.order.complain.not.exist=El n\u00famero de disputa no es v\u00e1lido
+c2c.order.complain.remark.notEmpty=La raz\u00f3n de la disputa no puede estar vac\u00eda
 c2c.order.complain.voucher.id.invalid=El n\u00famero del comprobante de disputa no es v\u00e1lido
-
 c2c.order.complain.voucher.is.end=La apelaci\u00f3n ha terminado  
 c2c.order.complain.voucher.save.fail=Error al guardar el comprobante de apelaci\u00f3n  
 c2c.order.complain.voucher.update.fail=Error al modificar el comprobante de apelaci\u00f3n  
@@ -145,3 +142,14 @@ c2c.order.reviews.not.complete=El estado del pedido debe ser "Completado" para p
 c2c.order.reviews.create.fail=Error al publicar la evaluaci\u00f3n
 c2c.reviews.save.fail=Error al guardar la evaluaci\u00f3n
 c2c.order.you.reviewed=Ya has publicado una evaluaci\u00f3n para este pedido
+c2c.order.cancel.otherReason.NotEmpty=Otras razones no pueden estar vacías
+c2c.order.cancel.reason.notset=Razón de cancelación no configurada
+c2c.order.complain.reason.notset=Razón de apelación no configurada
+c2c.deletePayment.voucher.fail=Error al eliminar el comprobante de pago
+c2c.order.complain.remark.maxval=La descripción puede tener un máximo de 250 caracteres
+c2c.order.complain.files.limit=Máximo 5 comprobantes de apelación
+c2c.complain.voucher.submit.fail=Error al enviar, usted no es parte de la transacción del pedido
+c2c.orderId.is.empty=El número de pedido no puede estar vacío
+c2c.voucher.type.is.empty=El tipo de comprobante no puede estar vacío
+c2c.deleteVoucher.voucher.fail=Error al eliminar el comprobante
+c2c.order.payment.vouchers.limit=Se permiten hasta 3 comprobantes de pago

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

@@ -111,12 +111,9 @@ c2c.complain.submit.fail=\u00c9chec de l'initiation de la r\u00e9clamation, vous
 c2c.order.not.buyer.seller=Vous n'\u00eates pas un utilisateur de la transaction, vous ne pouvez pas initier une r\u00e9clamation  
 c2c.order.pay.update.fail=\u00c9chec de la mise \u00e0 jour de la commande  
 c2c.order.complain.submit.fail=\u00c9chec de la soumission de la r\u00e9clamation  
-c2c.order.complain.not.exist=Num\u00e9ro de r\u00e9clamation invalide  
-c2c.complain.voucher.submit.fail=\u00c9chec de la soumission, vous n'\u00eates ni le plaignant ni le d\u00e9fendeur  
-c2c.order.complain.remark.notEmpty=La raison de la r\u00e9clamation ne peut pas \u00eatre vide  
-c2c.order.complain.remark.maxval=La description ne peut pas d\u00e9passer 250 caract\u00e8res  
+c2c.order.complain.not.exist=Num\u00e9ro de r\u00e9clamation invalide
+c2c.order.complain.remark.notEmpty=La raison de la r\u00e9clamation ne peut pas \u00eatre vide
 c2c.order.complain.voucher.id.invalid=Num\u00e9ro de justificatif de r\u00e9clamation invalide
-
 c2c.order.complain.voucher.is.end=La r\u00e9clamation est termin\u00e9e  
 c2c.order.complain.voucher.save.fail=\u00c9chec de la sauvegarde du justificatif de r\u00e9clamation  
 c2c.order.complain.voucher.update.fail=\u00c9chec de la modification du justificatif de r\u00e9clamation  
@@ -145,3 +142,14 @@ c2c.order.reviews.not.complete=Le statut de la commande doit \u00eatre "Termin\u
 c2c.order.reviews.create.fail=\u00c9chec de la publication de l'\u00e9valuation
 c2c.reviews.save.fail=\u00c9chec de l'enregistrement de l'\u00e9valuation
 c2c.order.you.reviewed=Vous avez d\u00e9j\u00e0 laiss\u00e9 un commentaire pour cette commande
+c2c.order.cancel.otherReason.NotEmpty=Autre raison ne peut pas \u00eatre vide  
+c2c.order.cancel.reason.notset=Raison d'annulation non configur\u00e9e  
+c2c.order.complain.reason.notset=Raison de r\u00e9clamation non configur\u00e9e  
+c2c.deletePayment.voucher.fail=\u00c9chec de la suppression du justificatif de paiement  
+c2c.order.complain.remark.maxval=Description jusqu'\u00e0 250 caract\u00e8res maximum  
+c2c.order.complain.files.limit=Maximum 5 justificatifs pour la r\u00e9clamation  
+c2c.complain.voucher.submit.fail=\u00c9chec de la soumission, vous n'\u00eates pas une partie de la transaction  
+c2c.orderId.is.empty=Le num\u00e9ro de commande ne peut pas \u00eatre vide  
+c2c.voucher.type.is.empty=Le type de justificatif ne peut pas \u00eatre vide  
+c2c.deleteVoucher.voucher.fail=\u00c9chec de la suppression du justificatif
+c2c.order.payment.vouchers.limit=Maximum 3 bons de paiement

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

@@ -112,11 +112,8 @@ c2c.order.not.buyer.seller=\u3042\u306a\u305f\u306f\u53d6\u5f15\u30e6\u30fc\u30b
 c2c.order.pay.update.fail=\u6ce8\u6587\u306e\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 c2c.order.complain.submit.fail=\u7533\u7acb\u3066\u306e\u63d0\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 c2c.order.complain.not.exist=\u7533\u7acb\u3066\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
-c2c.complain.voucher.submit.fail=\u63d0\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3042\u306a\u305f\u306f\u7533\u7acb\u3066\u4eba\u307e\u305f\u306f\u88ab\u7533\u7acb\u3066\u4eba\u3067\u306f\u3042\u308a\u307e\u305b\u3093
 c2c.order.complain.remark.notEmpty=\u7533\u7acb\u3066\u7406\u7531\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
-c2c.order.complain.remark.maxval=\u8aac\u660e\u306f\u6700\u5927250\u6587\u5b57\u307e\u3067\u3067\u3059
 c2c.order.complain.voucher.id.invalid=\u7533\u7acb\u3066\u8a3c\u660e\u66f8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
-
 c2c.order.complain.voucher.is.end=\u7533\u8a34\u306f\u7d42\u4e86\u3057\u307e\u3057\u305f
 c2c.order.complain.voucher.save.fail=\u7533\u8a34\u8a3c\u660e\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 c2c.order.complain.voucher.update.fail=\u7533\u8a34\u8a3c\u660e\u306e\u5909\u66f4\u306b\u5931\u6557\u3057\u307e\u3057\u305f
@@ -145,4 +142,14 @@ c2c.order.reviews.not.complete=\u6ce8\u6587\u306e\u72b6\u614b\u304c\u300c\u5b8c\
 c2c.order.reviews.create.fail=\u8a55\u4fa1\u306e\u6295\u7a3f\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 c2c.reviews.save.fail=\u8a55\u4fa1\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 c2c.order.you.reviewed=\u3053\u306e\u6ce8\u6587\u306b\u306f\u3059\u3067\u306b\u8a55\u4fa1\u3092\u6295\u7a3f\u3057\u3066\u3044\u307e\u3059
-
+c2c.order.cancel.otherReason.NotEmpty=\u305d\u306e\u4ed6\u306e\u7406\u7531\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+c2c.order.cancel.reason.notset=\u30ad\u30e3\u30f3\u30bb\u30eb\u7406\u7531\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+c2c.order.complain.reason.notset=\u7533\u7acb\u3066\u7406\u7531\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+c2c.deletePayment.voucher.fail=\u652f\u6255\u3044\u8a3c\u660e\u66f8\u306e\u524a\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.complain.remark.maxval=\u8aac\u660e\u306f\u6700\u5927250\u6587\u5b57\u3067\u3059
+c2c.order.complain.files.limit=\u7533\u7acb\u3066\u8a3c\u62e0\u306f\u6700\u59275\u679a\u307e\u3067\u3067\u3059
+c2c.complain.voucher.submit.fail=\u63d0\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3042\u306a\u305f\u306f\u6ce8\u6587\u306e\u53d6\u5f15\u76f8\u624b\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+c2c.orderId.is.empty=\u6ce8\u6587\u756a\u53f7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+c2c.voucher.type.is.empty=\u8a3c\u660e\u66f8\u306e\u7a2e\u985e\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+c2c.deleteVoucher.voucher.fail=\u8a3c\u660e\u66f8\u306e\u524a\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.payment.vouchers.limit=\u652f\u6255\u3044\u8a3c\u660e\u66f8\u306f\u6700\u59273\u679a\u307e\u3067

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

@@ -112,11 +112,8 @@ c2c.order.not.buyer.seller=\uac70\ub798 \uc0ac\uc6a9\uc790\uac00 \uc544\ub2c8\ub
 c2c.order.pay.update.fail=\uc8fc\ubb38 \uc5c5\ub370\uc774\ud2b8 \uc2e4\ud328
 c2c.order.complain.submit.fail=\ubd84\uc7c1 \uc81c\ucd9c \uc2e4\ud328
 c2c.order.complain.not.exist=\ubd84\uc7c1 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
-c2c.complain.voucher.submit.fail=\uc81c\ucd9c \uc2e4\ud328, \ub2f9\uc2e0\uc740 \ubd84\uc7c1 \ub2f9\uc0ac\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4
 c2c.order.complain.remark.notEmpty=\ubd84\uc7c1 \uc0ac\uc720\ub97c \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
-c2c.order.complain.remark.maxval=\uc124\uba85\uc740 \ucd5c\ub300 250\uc790\uae4c\uc9c0 \uac00\ub2a5\ud569\ub2c8\ub2e4
 c2c.order.complain.voucher.id.invalid=\ubd84\uc7c1 \uc99d\ube59 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
-
 c2c.order.complain.voucher.is.end=\uc2e0\uccad\uc774 \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4
 c2c.order.complain.voucher.save.fail=\uc2e0\uccad \uc99d\ube59 \uc800\uc7a5 \uc2e4\ud328
 c2c.order.complain.voucher.update.fail=\uc2e0\uccad \uc99d\ube59 \uc218\uc815 \uc2e4\ud328
@@ -145,3 +142,14 @@ c2c.order.reviews.not.complete=\uc8fc\ubb38 \uc0c1\ud0dc\uac00 "\uc644\ub8cc"\uc
 c2c.order.reviews.create.fail=\ud3c9\uac00 \uc791\uc131 \uc2e4\ud328
 c2c.reviews.save.fail=\ud3c9\uac00 \uc800\uc7a5 \uc2e4\ud328
 c2c.order.you.reviewed=\ud574\ub2f9 \uc8fc\ubb38\uc5d0 \uc774\ubbf8 \ud3c9\uac00\ub97c \uc791\uc131\ud558\uc168\uc2b5\ub2c8\ub2e4
+c2c.order.cancel.otherReason.NotEmpty=\uae30\ud0c0 \uc0ac\uc720\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
+c2c.order.cancel.reason.notset=\ucde8\uc18c \uc0ac\uc720\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4  
+c2c.order.complain.reason.notset=\uc2e0\uace0 \uc0ac\uc720\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4  
+c2c.deletePayment.voucher.fail=\uacb0\uc81c \uc99d\ube59\uc11c \uc0ad\uc81c \uc2e4\ud328  
+c2c.order.complain.remark.maxval=\uc124\uba85\uc740 \ucd5c\ub300 250\uc790\uae4c\uc9c0 \uc785\ub825\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4  
+c2c.order.complain.files.limit=\uc2e0\uace0 \uc99d\ube59\uc11c\ub294 \ucd5c\ub300 5\uc7a5\uae4c\uc9c0 \uac00\ub2a5\ud569\ub2c8\ub2e4  
+c2c.complain.voucher.submit.fail=\uc81c\ucd9c \uc2e4\ud328, \uadc0\ud558\ub294 \uc8fc\ubb38 \uac70\ub798 \ub2f9\uc0ac\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4  
+c2c.orderId.is.empty=\uc8fc\ubb38 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
+c2c.voucher.type.is.empty=\uc99d\ube59\uc11c \uc885\ub958\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
+c2c.deleteVoucher.voucher.fail=\uc99d\ube59\uc11c \uc0ad\uc81c \uc2e4\ud328
+c2c.order.payment.vouchers.limit=\uacb0\uc81c \uc99d\ube59\uc740 \ucd5c\ub300 3\uc7a5\uae4c\uc9c0 \uac00\ub2a5\ud569\ub2c8\ub2e4

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

@@ -111,12 +111,9 @@ c2c.complain.submit.fail=\u0e40\u0e23\u0e34\u0e48\u0e21\u0e23\u0e49\u0e2d\u0e07\
 c2c.order.not.buyer.seller=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e34\u0e48\u0e21\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e14\u0e49  
 c2c.order.pay.update.fail=\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
 c2c.order.complain.submit.fail=\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
-c2c.order.complain.not.exist=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
-c2c.complain.voucher.submit.fail=\u0e2a\u0e48\u0e07\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e2b\u0e23\u0e37\u0e2d\u0e1c\u0e39\u0e49\u0e16\u0e39\u0e01\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19  
-c2c.order.complain.remark.notEmpty=\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e43\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07  
-c2c.order.complain.remark.maxval=\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 250 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23  
+c2c.order.complain.not.exist=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+c2c.order.complain.remark.notEmpty=\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e43\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 c2c.order.complain.voucher.id.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
-
 c2c.order.complain.voucher.is.end=\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27
 c2c.order.complain.voucher.save.fail=\u0e01\u0e32\u0e23\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
 c2c.order.complain.voucher.update.fail=\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
@@ -145,3 +142,14 @@ c2c.order.reviews.not.complete=\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e04\u0e33\u0e2a\
 c2c.order.reviews.create.fail=\u0e01\u0e32\u0e23\u0e42\u0e1e\u0e2a\u0e15\u0e4c\u0e23\u0e35\u0e27\u0e34\u0e27\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
 c2c.reviews.save.fail=\u0e01\u0e32\u0e23\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e23\u0e35\u0e27\u0e34\u0e27\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
 c2c.order.you.reviewed=\u0e04\u0e38\u0e13\u0e44\u0e14\u0e49\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e27\u0e32\u0e21\u0e04\u0e34\u0e14\u0e40\u0e2b\u0e47\u0e19\u0e43\u0e19\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e19\u0e35\u0e49\u0e41\u0e25\u0e49\u0e27
+c2c.order.cancel.otherReason.NotEmpty=\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e2d\u0e37\u0e48\u0e19 \u0e46 \u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07  
+c2c.order.cancel.reason.notset=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e01\u0e32\u0e23\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01  
+c2c.order.complain.reason.notset=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19  
+c2c.deletePayment.voucher.fail=\u0e25\u0e1a\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.complain.remark.maxval=\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 250 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23  
+c2c.order.complain.files.limit=\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 5 \u0e23\u0e39\u0e1b  
+c2c.complain.voucher.submit.fail=\u0e2a\u0e48\u0e07\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e04\u0e39\u0e48\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d  
+c2c.orderId.is.empty=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2b\u0e49\u0e32\u0e21\u0e27\u0e48\u0e32\u0e07  
+c2c.voucher.type.is.empty=\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e2b\u0e49\u0e32\u0e21\u0e27\u0e48\u0e32\u0e07  
+c2c.deleteVoucher.voucher.fail=\u0e25\u0e1a\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+c2c.order.payment.vouchers.limit=\u0e43\u0e1a\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e23\u0e31\u0e1a\u0e40\u0e07\u0e34\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 3 \u0e43\u0e1a

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

@@ -112,11 +112,8 @@ c2c.order.not.buyer.seller=\u60a8\u4e0d\u662f\u4ea4\u6613\u7528\u6236\uff0c\u4e0
 c2c.order.pay.update.fail=\u8a02\u55ae\u66f4\u65b0\u5931\u6557
 c2c.order.complain.submit.fail=\u63d0\u4ea4\u7533\u8a34\u5931\u6557
 c2c.order.complain.not.exist=\u7533\u8a34\u7de8\u865f\u7121\u6548
-c2c.complain.voucher.submit.fail=\u63d0\u4ea4\u5931\u6557\uff0c\u60a8\u4e0d\u662f\u7533\u8a34\u4eba\u6216\u88ab\u7533\u8a34\u4eba
 c2c.order.complain.remark.notEmpty=\u7533\u8a34\u539f\u56e0\u4e0d\u80fd\u7a7a
-c2c.order.complain.remark.maxval=\u63cf\u8ff0\u6700\u591a250\u500b\u5b57
 c2c.order.complain.voucher.id.invalid=\u7533\u8a34\u6191\u8b49\u7de8\u865f\u7121\u6548
-
 c2c.order.complain.voucher.is.end=\u7533\u8a34\u5df2\u7d50\u675f
 c2c.order.complain.voucher.save.fail=\u4fdd\u5b58\u7533\u8a34\u6191\u8b49\u5931\u6557
 c2c.order.complain.voucher.update.fail=\u4fee\u6539\u7533\u8a34\u6191\u8b49\u5931\u6557
@@ -145,3 +142,14 @@ c2c.order.reviews.not.complete=\u8a02\u55ae\u72c0\u614b"\u5df2\u5b8c\u6210"\u624
 c2c.order.reviews.create.fail=\u767c\u8868\u8a55\u50f9\u5931\u6557
 c2c.reviews.save.fail=\u8a55\u50f9\u4fdd\u5b58\u5931\u6557
 c2c.order.you.reviewed=\u8a72\u8a02\u55ae\u60a8\u5df2\u767c\u8868\u8a55\u50f9
+c2c.order.cancel.otherReason.NotEmpty=\u5176\u4ed6\u539f\u56e0\u4e0d\u80fd\u7a7a  
+c2c.order.cancel.reason.notset=\u672a\u914d\u7f6e\u53d6\u6d88\u539f\u56e0  
+c2c.order.complain.reason.notset=\u672a\u914d\u7f6e\u7533\u8a34\u539f\u56e0  
+c2c.deletePayment.voucher.fail=\u522a\u9664\u4ed8\u6b3e\u6191\u8b49\u5931\u6557  
+c2c.order.complain.remark.maxval=\u63cf\u8ff0\u6700\u591a250\u500b\u5b57  
+c2c.order.complain.files.limit=\u7533\u8a34\u6191\u8b49\u6700\u591a5\u5f35  
+c2c.complain.voucher.submit.fail=\u63d0\u4ea4\u5931\u6557\uff0c\u60a8\u4e0d\u662f\u8a02\u55ae\u4ea4\u6613\u65b9  
+c2c.orderId.is.empty=\u8a02\u55ae\u7de8\u865f\u4e0d\u80fd\u7a7a  
+c2c.voucher.type.is.empty=\u6191\u8b49\u985e\u5225\u4e0d\u80fd\u7a7a  
+c2c.deleteVoucher.voucher.fail=\u522a\u9664\u6191\u8b49\u5931\u6557
+c2c.order.payment.vouchers.limit=\u4ed8\u6b3e\u6191\u8b49\u6700\u591a3\u5f35

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

@@ -110,12 +110,9 @@ c2c.complain.submit.fail=Kh\u1edfi ki\u1ec7n th\u1ea5t b\u1ea1i, b\u1ea1n kh\u00
 c2c.order.not.buyer.seller=B\u1ea1n kh\u00f4ng ph\u1ea3i ng\u01b0\u1eddi tham gia giao d\u1ecbch, kh\u00f4ng th\u1ec3 kh\u1edfi ki\u1ec7n  
 c2c.order.pay.update.fail=C\u1eadp nh\u1eadt \u0111\u01a1n h\u00e0ng th\u1ea5t b\u1ea1i  
 c2c.order.complain.submit.fail=G\u1eedi kh\u1edfi ki\u1ec7n th\u1ea5t b\u1ea1i  
-c2c.order.complain.not.exist=M\u00e3 khi\u1ebfu n\u1ea1i kh\u00f4ng h\u1ee3p l\u1ec7  
-c2c.complain.voucher.submit.fail=G\u1eedi th\u1ea5t b\u1ea1i, b\u1ea1n kh\u00f4ng ph\u1ea3i ng\u01b0\u1eddi khi\u1ebfu n\u1ea1i ho\u1eb7c b\u1ecb khi\u1ebfu n\u1ea1i  
-c2c.order.complain.remark.notEmpty=L\u00fd do khi\u1ebfu n\u1ea1i kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng  
-c2c.order.complain.remark.maxval=M\u00f4 t\u1ea3 t\u1ed1i \u0111a 250 k\u00fd t\u1ef1  
+c2c.order.complain.not.exist=M\u00e3 khi\u1ebfu n\u1ea1i kh\u00f4ng h\u1ee3p l\u1ec7
+c2c.order.complain.remark.notEmpty=L\u00fd do khi\u1ebfu n\u1ea1i kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 c2c.order.complain.voucher.id.invalid=M\u00e3 ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i kh\u00f4ng h\u1ee3p l\u1ec7
-
 c2c.order.complain.voucher.is.end=Khi\u1ebfu n\u1ea1i \u0111\u00e3 k\u1ebft th\u00fac  
 c2c.order.complain.voucher.save.fail=L\u01b0u ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i th\u1ea5t b\u1ea1i  
 c2c.order.complain.voucher.update.fail=C\u1eadp nh\u1eadt ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i th\u1ea5t b\u1ea1i  
@@ -144,3 +141,14 @@ c2c.order.reviews.not.complete=Tr\u1ea1ng th\u00e1i \u0111\u01a1n h\u00e0ng ph\u
 c2c.order.reviews.create.fail=\u0110\u0103ng \u0111\u00e1nh gi\u00e1 th\u1ea5t b\u1ea1i
 c2c.reviews.save.fail=L\u01b0u \u0111\u00e1nh gi\u00e1 th\u1ea5t b\u1ea1i
 c2c.order.you.reviewed=B\u1ea1n \u0111\u00e3 \u0111\u00e1nh gi\u00e1 \u0111\u01a1n h\u00e0ng n\u00e0y r\u1ed3i
+c2c.order.cancel.otherReason.NotEmpty=L\u00fd do kh\u00e1c kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+c2c.order.cancel.reason.notset=Ch\u01b0a c\u1ea5u h\u00ecnh l\u00fd do h\u1ee7y
+c2c.order.complain.reason.notset=Ch\u01b0a c\u1ea5u h\u00ecnh l\u00fd do khi\u1ebfu n\u1ea1i
+c2c.deletePayment.voucher.fail=X\u00f3a ch\u1ee9ng t\u1eeb thanh to\u00e1n th\u1ea5t b\u1ea1i
+c2c.order.complain.remark.maxval=M\u00f4 t\u1ea3 t\u1ed1i \u0111a 250 k\u00fd t\u1ef1
+c2c.order.complain.files.limit=T\u1ed1i \u0111a 5 ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i
+c2c.complain.voucher.submit.fail=G\u1eedi th\u1ea5t b\u1ea1i, b\u1ea1n kh\u00f4ng ph\u1ea3i b\u00ean giao d\u1ecbch \u0111\u01a1n h\u00e0ng
+c2c.orderId.is.empty=M\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+c2c.voucher.type.is.empty=Lo\u1ea1i ch\u1ee9ng t\u1eeb kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+c2c.deleteVoucher.voucher.fail=X\u00f3a ch\u1ee9ng t\u1eeb th\u1ea5t b\u1ea1i
+c2c.order.payment.vouchers.limit=Gi\u1ea5y ch\u1ee9ng nh\u1eadn thanh to\u00e1n t\u1ed1i \u0111a 3 t\u1ea5m

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

@@ -113,9 +113,7 @@ c2c.order.not.buyer.seller=\u60a8\u4e0d\u662f\u4ea4\u6613\u7528\u6237\uff0c\u4e0
 c2c.order.pay.update.fail=\u8ba2\u5355\u66f4\u65b0\u5931\u8d25
 c2c.order.complain.submit.fail=\u63d0\u4ea4\u7533\u8bc9\u5931\u8d25
 c2c.order.complain.not.exist=\u7533\u8bc9\u7f16\u53f7\u65e0\u6548
-c2c.complain.voucher.submit.fail=\u63d0\u4ea4\u5931\u8d25\uff0c\u60a8\u4e0d\u662f\u7533\u8bc9\u4eba\u6216\u88ab\u7533\u8bc9\u4eba
 c2c.order.complain.remark.notEmpty=\u7533\u8bc9\u539f\u56e0\u4e0d\u80fd\u7a7a
-c2c.order.complain.remark.maxval=\u63cf\u8ff0\u6700\u591a250\u4e2a\u5b57
 c2c.order.complain.voucher.id.invalid=\u7533\u8bc9\u51ed\u8bc1\u7f16\u53f7\u65e0\u6548
 
 c2c.order.complain.voucher.is.end=\u7533\u8bc9\u5df2\u7ed3\u675f
@@ -149,4 +147,13 @@ c2c.reviews.save.fail=\u8bc4\u4ef7\u4fdd\u5b58\u5931\u8d25
 c2c.order.you.reviewed=\u8be5\u8ba2\u5355\u60a8\u5df2\u53d1\u8868\u8bc4\u4ef7
 
 c2c.order.cancel.otherReason.NotEmpty=\u5176\u4ed6\u539f\u56e0\u4e0d\u80fd\u7a7a
-c2c.order.cancel.reason.notset=\u672a\u914d\u7f6e\u53d6\u6d88\u539f\u56e0
+c2c.order.cancel.reason.notset=\u672a\u914d\u7f6e\u53d6\u6d88\u539f\u56e0
+c2c.order.complain.reason.notset=\u672a\u914d\u7f6e\u7533\u8bc9\u539f\u56e0
+c2c.deletePayment.voucher.fail=\u5220\u9664\u4ed8\u6b3e\u51ed\u8bc1\u5931\u8d25
+c2c.order.complain.remark.maxval=\u63cf\u8ff0\u6700\u591a250\u4e2a\u5b57
+c2c.order.complain.files.limit=\u7533\u8bc9\u51ed\u8bc1\u6700\u591a5\u5f20
+c2c.complain.voucher.submit.fail=\u63d0\u4ea4\u5931\u8d25\uff0c\u60a8\u4e0d\u662f\u8ba2\u5355\u4ea4\u6613\u65b9
+c2c.orderId.is.empty=\u8ba2\u5355\u7f16\u53f7\u4e0d\u80fd\u7a7a
+c2c.voucher.type.is.empty=\u51ed\u8bc1\u7c7b\u522b\u4e0d\u80fd\u7a7a
+c2c.deleteVoucher.voucher.fail=\u5220\u9664\u51ed\u8bc1\u5931\u8d25
+c2c.order.payment.vouchers.limit=\u4ed8\u6b3e\u51ed\u8bc1\u6700\u591a3\u5f20

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

@@ -50,5 +50,8 @@ NotNull.rating=Penilaian tidak boleh kosong
 NotBlank.lables=Label tidak boleh kosong
 NotNull.isAnonymous=Adakah anonim tidak boleh kosong
 NotBlank.content=Kandungan tidak boleh kosong
-NotNull.reasonId=Nombor sebab pembatalan tidak boleh kosong  
-NotNull.reasonType=Jenis sebab pembatalan tidak boleh kosong
+NotNull.reasonType=Kategori sebab pembatalan tidak boleh kosong  
+NotNull.reasonId=Nombor sebab tidak boleh kosong  
+NotBlank.file=Bukti tidak boleh kosong  
+NotBlank.voucherIds=Bukti rayuan tidak boleh kosong
+

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

@@ -50,3 +50,7 @@ NotNull.rating=Die Bewertung darf nicht leer sein
 NotBlank.lables=Die Labels d\u00fcrfen nicht leer sein  
 NotNull.isAnonymous=Die Angabe, ob anonym, darf nicht leer sein  
 NotBlank.content=Der Inhalt darf nicht leer sein
+NotNull.reasonType=Der Stornierungsgrundtyp darf nicht leer sein  
+NotNull.reasonId=Die Grundnummer darf nicht leer sein  
+NotBlank.file=Der Nachweis darf nicht leer sein  
+NotBlank.voucherIds=Der Beschwerdenachweis darf nicht leer sein

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

@@ -50,5 +50,7 @@ NotNull.rating=Rating cannot be empty
 NotBlank.lables=Labels cannot be empty  
 NotNull.isAnonymous=Anonymous status cannot be empty  
 NotBlank.content=Content cannot be empty
-NotNull.reasonId=Cancellation reason ID cannot be empty  
-NotNull.reasonType=Cancellation reason category cannot be empty
+NotNull.reasonType=Cancellation reason category cannot be empty
+NotNull.reasonId=Reason ID cannot be empty
+NotBlank.file=Voucher cannot be empty
+NotBlank.voucherIds=Appeal voucher cannot be empty

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

@@ -50,3 +50,7 @@ NotNull.rating=La calificaci\u00f3n no puede estar vac\u00eda
 NotBlank.lables=Las etiquetas no pueden estar vac\u00edas  
 NotNull.isAnonymous=No puede estar vac\u00edo si es an\u00f3nimo  
 NotBlank.content=El contenido no puede estar vac\u00edo
+NotNull.reasonType=La categor\u00eda de motivo de cancelaci\u00f3n no puede estar vac\u00eda  
+NotNull.reasonId=El n\u00famero de motivo no puede estar vac\u00edo  
+NotBlank.file=El comprobante no puede estar vac\u00edo  
+NotBlank.voucherIds=Los comprobantes de apelaci\u00f3n no pueden estar vac\u00edos

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

@@ -50,3 +50,7 @@ NotNull.rating=La note ne peut pas \u00eatre vide
 NotBlank.lables=Les \u00e9tiquettes ne peuvent pas \u00eatre vides  
 NotNull.isAnonymous=Le statut anonyme ne peut pas \u00eatre vide  
 NotBlank.content=Le contenu ne peut pas \u00eatre vide
+NotNull.reasonType=La cat\u00e9gorie de raison d'annulation ne peut pas \u00eatre vide  
+NotNull.reasonId=Le num\u00e9ro de raison ne peut pas \u00eatre vide  
+NotBlank.file=Le justificatif ne peut pas \u00eatre vide  
+NotBlank.voucherIds=Les justificatifs de r\u00e9clamation ne peuvent pas \u00eatre vides

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

@@ -50,3 +50,7 @@ NotNull.rating=\u8a55\u4fa1\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotBlank.lables=\u30e9\u30d9\u30eb\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotNull.isAnonymous=\u533f\u540d\u304b\u3069\u3046\u304b\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotBlank.content=\u5185\u5bb9\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+NotNull.reasonType=\u53d6\u6d88\u539f\u56e0\u306e\u7a2e\u985e\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+NotNull.reasonId=\u539f\u56e0\u756a\u53f7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+NotBlank.file=\u8a3c\u660e\u66f8\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+NotBlank.voucherIds=\u7533\u7acb\u3066\u8a3c\u660e\u66f8\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093

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

@@ -50,3 +50,7 @@ NotNull.rating=\ud3c9\uc810\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\u
 NotBlank.lables=\ub77c\ubca8\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
 NotNull.isAnonymous=\uc775\uba85 \uc5ec\ubd80\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
 NotBlank.content=\ub0b4\uc6a9\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+NotNull.reasonType=\ucde8\uc18c \uc0ac\uc720 \uc720\ud615\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+NotNull.reasonId=\uc0ac\uc720 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+NotBlank.file=\uc99d\ube59 \uc11c\ub958\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+NotBlank.voucherIds=\uc774\uc758 \uc81c\uae30 \uc99d\ube59\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4

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

@@ -50,3 +50,7 @@ NotNull.rating=\u0e04\u0e30\u0e41\u0e19\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e2
 NotBlank.lables=\u0e1b\u0e49\u0e32\u0e22\u0e01\u0e33\u0e01\u0e31\u0e1a\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotNull.isAnonymous=\u0e15\u0e49\u0e2d\u0e07\u0e23\u0e30\u0e1a\u0e38\u0e27\u0e48\u0e32\u0e0b\u0e48\u0e2d\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48
 NotBlank.content=\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
+NotNull.reasonType=\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49  
+NotNull.reasonId=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49  
+NotBlank.file=\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49  
+NotBlank.voucherIds=\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49

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

@@ -50,3 +50,7 @@ NotNull.rating=\u8a55\u5206\u4e0d\u80fd\u7a7a
 NotBlank.lables=\u6a19\u7c64\u4e0d\u80fd\u7a7a
 NotNull.isAnonymous=\u662f\u5426\u533f\u540d\u4e0d\u80fd\u7a7a
 NotBlank.content=\u5167\u5bb9\u4e0d\u80fd\u7a7a
+NotNull.reasonType=\u53d6\u6d88\u539f\u56e0\u985e\u5225\u4e0d\u80fd\u70ba\u7a7a
+NotNull.reasonId=\u539f\u56e0\u7de8\u865f\u4e0d\u80fd\u70ba\u7a7a
+NotBlank.file=\u6191\u8b49\u4e0d\u80fd\u70ba\u7a7a
+NotBlank.voucherIds=\u7533\u8a34\u6191\u8b49\u4e0d\u80fd\u70ba\u7a7a

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

@@ -49,4 +49,8 @@ NotNull.followingId=ID ng\u01b0\u1eddi \u0111\u01b0\u1ee3c theo d\u00f5i kh\u00f
 NotNull.rating=\u0110\u00e1nh gi\u00e1 kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotBlank.lables=Nh\u00e3n kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotNull.isAnonymous=Kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng vi\u1ec7c c\u00f3 \u1ea9n danh hay kh\u00f4ng
-NotBlank.content=N\u1ed9i dung kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+NotBlank.content=N\u1ed9i dung kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+NotNull.reasonType=Lo\u1ea1i l\u00fd do h\u1ee7y kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng  
+NotNull.reasonId=M\u00e3 l\u00fd do kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng  
+NotBlank.file=Ch\u1ee9ng t\u1eeb kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng  
+NotBlank.voucherIds=Ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng

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

@@ -50,6 +50,7 @@ NotNull.rating=\u8bc4\u5206\u4e0d\u80fd\u4e3a\u7a7a
 NotBlank.lables=\u6807\u7b7e\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.isAnonymous=\u662f\u5426\u533f\u540d\u4e0d\u80fd\u4e3a\u7a7a
 NotBlank.content=\u5185\u5bb9\u4e0d\u80fd\u7a7a
-
-NotNull.reasonId=\u53d6\u6d88\u539f\u56e0\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.reasonType=\u53d6\u6d88\u539f\u56e0\u7c7b\u522b\u4e0d\u80fd\u4e3a\u7a7a
+NotNull.reasonId=\u539f\u56e0\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
+NotBlank.file=\u51ed\u8bc1\u4e0d\u80fd\u4e3a\u7a7a
+NotBlank.voucherIds=\u7533\u8bc9\u51ed\u8bc1\u4e0d\u80fd\u4e3a\u7a7a

+ 4 - 1
qnfhq-api/src/main/resources/mapper/c2c/C2cOrderComplainDao.xml

@@ -8,7 +8,10 @@
         <result property="orderId" column="order_id"/>
         <result property="fromUserId" column="from_user_id"/>
         <result property="fromUserName" column="from_user_name"/>
-        <result property="reason" column="reason"/>
+        <result property="reasonId" column="reason_id"/>
+        <result property="otherReason" column="other_reason"/>
+        <result property="remark" column="remark"/>
+        <result property="voucherIds" column="voucher_ids"/>
         <result property="toUserId" column="to_user_id"/>
         <result property="toUserName" column="to_user_name"/>
         <result property="flow" column="flow"/>

+ 0 - 22
qnfhq-api/src/main/resources/mapper/c2c/C2cOrderComplainVoucherDao.xml

@@ -1,22 +0,0 @@
-<?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.C2cOrderComplainVoucherDao">
-
-    <resultMap type="com.qnfhq.modules.c2c.entity.C2cOrderComplainVoucherEntity" id="c2cOrderComplainVoucherMap">
-        <result property="id" column="id"/>
-        <result property="complainId" column="complain_id"/>
-        <result property="remark" column="remark"/>
-        <result property="img1" column="img1"/>
-        <result property="img2" column="img2"/>
-        <result property="img3" column="img3"/>
-        <result property="img4" column="img4"/>
-        <result property="img5" column="img5"/>
-        <result property="userId" column="user_id"/>
-        <result property="status" column="status"/>
-        <result property="createTime" column="create_time"/>
-        <result property="updateTime" column="update_time"/>
-    </resultMap>
-
-
-</mapper>

+ 19 - 0
qnfhq-api/src/main/resources/mapper/c2c/C2cOrderVoucherDao.xml

@@ -0,0 +1,19 @@
+<?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.C2cOrderVoucherDao">
+
+    <resultMap type="com.qnfhq.modules.c2c.entity.C2cOrderVoucherEntity" id="c2cOrderComplainVoucherMap">
+        <result property="id" column="id"/>
+        <result property="orderId" column="order_id"/>
+        <result property="type" column="type"/>
+        <result property="remark" column="remark"/>
+        <result property="file" column="file"/>
+        <result property="userId" column="user_id"/>
+        <result property="status" column="status"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+
+</mapper>

+ 1 - 2
qnfhq-api/src/main/resources/mapper/c2c/C2cPaymentVoucherDao.xml

@@ -6,7 +6,6 @@
     <resultMap type="com.qnfhq.modules.c2c.entity.C2cPaymentVoucherEntity" id="c2cPaymentVoucherMap">
         <result property="id" column="id"/>
         <result property="orderId" column="order_id"/>
-        <result property="orderNo" column="order_no"/>
         <result property="img" column="img"/>
         <result property="userId" column="user_id"/>
         <result property="status" column="status"/>
@@ -16,7 +15,7 @@
 
 
     <sql id="selectC2cPaymentVoucherVo">
-        select id, order_id, order_no, img, user_id,status, create_time, update_time from c2c_payment_voucher
+        select id, order_id, img, user_id,status, create_time, update_time from c2c_payment_voucher
     </sql>
 
     <select id="selectC2cPaymentVoucherByIds" parameterType="String" resultMap="c2cPaymentVoucherMap">

+ 23 - 0
qnfhq-api/src/main/resources/mapper/c2c/OrderReportDao.xml

@@ -0,0 +1,23 @@
+<?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.OrderReportDao">
+
+    <resultMap type="com.qnfhq.modules.c2c.entity.OrderReportEntity" id="orderReportMap">
+        <result property="id" column="id"/>
+        <result property="orderId" column="order_id"/>
+        <result property="reasonId" column="reason_id"/>
+        <result property="otherReason" column="other_reason"/>
+        <result property="email" column="email"/>
+        <result property="remark" column="remark"/>
+        <result property="voucherIds" column="voucher_ids"/>
+        <result property="status" column="status"/>
+        <result property="result" column="result"/>
+        <result property="opUserId" column="op_user_id"/>
+        <result property="opTime" column="op_time"/>
+        <result property="inputUserId" column="input_user_id"/>
+        <result property="createTime" column="create_time"/>
+    </resultMap>
+
+
+</mapper>