From 4b95f906abd287452324c39bcfa114617720eab1 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 03 Jul 2025 11:50:45 +0800
Subject: [PATCH] feat(mall): 添加设计衣服订单功能

---
 src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderPayTypeEnum.java         |   22 
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java                    |    7 
 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java                     |   17 
 src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java                        |    2 
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderDraftDto.java          |   16 
 src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderItem.java                      |   31 +
 src/main/java/cc/mrbird/febs/mall/entity/ClothesOrder.java                          |   68 ++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderDraft.java                     |   35 +
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderDraftMapper.java               |   12 
 src/main/resources/mapper/modules/ClothesOrderMapper.xml                            |    7 
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftPageDto.java                |   24 
 src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java                  |   34 +
 src/main/java/cc/mrbird/febs/mall/service/ApiClothesOrderService.java               |   28 +
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderInfoVo.java             |   15 
 src/main/java/cc/mrbird/febs/mall/dto/OrderListDto.java                             |    4 
 src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java                |   36 +
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java      |  680 ++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java                   |    3 
 src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java                    |   11 
 src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderStatusEnum.java          |   35 +
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderPayVo.java              |   15 
 src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java                              |    2 
 src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java                 |    3 
 src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesController.java      |   10 
 src/main/java/cc/mrbird/febs/mall/service/ApiClothesService.java                    |    2 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesServiceImpl.java           |   81 ++
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderItemMapper.java                |    7 
 src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderItemEnum.java            |   23 
 src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java |   95 +++
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftVo.java                      |   68 ++
 src/main/java/cc/mrbird/febs/pay/service/IPayService.java                           |    2 
 src/main/resources/application-test.yml                                             |    4 
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderItemInfoDto.java       |   27 
 src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java                              |   56 +-
 src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java                   |   38 +
 src/main/resources/mapper/modules/ClothesOrderDraftMapper.xml                       |   16 
 src/main/resources/mapper/modules/ClothesOrderItemMapper.xml                        |    7 
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderInfoDto.java           |   39 +
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftSaveDto.java                |   49 +
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftSaveVo.java                  |   14 
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderPayDto.java            |   25 
 41 files changed, 1,625 insertions(+), 45 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
index 89f0eaf..2061436 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
+++ b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -46,6 +46,40 @@
         return BindingBuilder.bind(defaultQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT);
     }
 
+
+
+    @Bean
+    public DirectExchange delayTtlExchangeClothes() {
+        return new DirectExchange(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getExchange());
+    }
+    @Bean
+    public Queue orderDelayQueueTtlClothes() {
+        return QueueBuilder.durable(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getQueue())
+                //到期后转发的交换机
+                .withArgument("x-dead-letter-exchange", RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getExchange())
+                //到期后转发的路由键
+                .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getRoute())
+                .build();
+    }
+    @Bean
+    public Binding orderDelayBindTtlClothes() {
+        return BindingBuilder.bind(orderDelayQueueTtlClothes()).to(delayTtlExchangeClothes()).with(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getRoute());
+    }
+
+    @Bean
+    public DirectExchange orderDelayExchangeClothes() {
+        return new DirectExchange(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getExchange());
+    }
+    @Bean
+    public Queue orderDelayQueueClothes() {
+        return new Queue(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getQueue());
+    }
+    @Bean
+    public Binding orderDelayBindClothes() {
+        return BindingBuilder.bind(orderDelayQueueClothes()).to(orderDelayExchangeClothes()).with(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getRoute());
+    }
+
+
     @Bean
     public DirectExchange delayTtlExchange() {
         return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange());
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderItemEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderItemEnum.java
new file mode 100644
index 0000000..0ecce9c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderItemEnum.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.common.enumerates;
+
+import lombok.Getter;
+
+@Getter
+public enum ClothesOrderItemEnum {
+
+    /**
+     *   类型 1图案 2图案位置 3工艺 4布料 5尺码 6尺码自定义
+     */
+    CUSTOMIZE(6),
+    SIZE(5),
+    CLOTH(4),
+    ART(3),
+    LOCATION(2),
+    PATTERN(1);
+
+    private final int code;
+
+    ClothesOrderItemEnum(int code) {
+        this.code = code;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderPayTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderPayTypeEnum.java
new file mode 100644
index 0000000..650d4e0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderPayTypeEnum.java
@@ -0,0 +1,22 @@
+package cc.mrbird.febs.common.enumerates;
+
+import lombok.Getter;
+
+@Getter
+public enum ClothesOrderPayTypeEnum {
+
+    WECHAT(1,"微信支付"),
+    ALIPAY(2,"支付宝支付"),
+    BALANCE(3,"余额支付")
+    ;
+
+
+    private Integer code;
+    private String name;
+
+    ClothesOrderPayTypeEnum(Integer code,String name) {
+
+        this.code = code;
+        this.name = name;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderStatusEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderStatusEnum.java
new file mode 100644
index 0000000..6d6d254
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/ClothesOrderStatusEnum.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.common.enumerates;
+
+import lombok.Getter;
+
+@Getter
+public enum ClothesOrderStatusEnum {
+
+    /**
+     * 状态;1-待支付 2-待发货 3-待收货 4-已完成 5-已取消
+     */
+    WAIT_PAY(1),
+    /**
+     * 待发货
+     */
+    WAIT_SHIPPING(2),
+    /**
+     * 待收货
+     */
+    WAIT_FINISH(3),
+    /**
+     * 已完成
+     */
+    FINISH(4),
+    /**
+     * 已取消
+     */
+    CANCEL(5)
+    ;
+
+    private final int value;
+
+    ClothesOrderStatusEnum(int value) {
+        this.value = value;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesController.java
index c00d98d..83595a3 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesController.java
@@ -136,4 +136,14 @@
 
         return clothesService.statureDel(dto);
     }
+
+    @ApiOperation(value = "预览效果-保存至草稿", notes = "预览效果-保存至草稿")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMyDraftSaveVo.class)
+    })
+    @PostMapping(value = "/draftSave")
+    public FebsResponse draftSave(@RequestBody @Validated ApiMyDraftSaveDto dto) {
+
+        return clothesService.draftSave(dto);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java
new file mode 100644
index 0000000..f68f950
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesOrderController.java
@@ -0,0 +1,95 @@
+package cc.mrbird.febs.mall.controller.clothes;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.OrderListDto;
+import cc.mrbird.febs.mall.dto.PayOrderDto;
+import cc.mrbird.febs.mall.dto.clothes.*;
+import cc.mrbird.febs.mall.service.ApiClothesOrderService;
+import cc.mrbird.febs.mall.service.ApiClothesService;
+import cc.mrbird.febs.mall.vo.OrderListVo;
+import cc.mrbird.febs.mall.vo.clothes.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/clothes/order")
+@Api(value = "ApiClothesOrderController", tags = "设计衣服订单")
+public class ApiClothesOrderController {
+
+    private final ApiClothesOrderService apiClothesOrderService;
+
+    @ApiOperation(value = "我的草稿", notes = "我的草稿")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMyDraftVo.class)
+    })
+    @PostMapping(value = "/myDraft")
+    public FebsResponse myDraft(@RequestBody @Validated ApiMyDraftPageDto dto) {
+
+        return apiClothesOrderService.myDraft(dto);
+    }
+
+    @ApiOperation(value = "我的草稿-跳转到开始设计", notes = "我的草稿-跳转到开始设计")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMyDraftVo.class)
+    })
+    @PostMapping(value = "/draftToDesign")
+    public FebsResponse draftToDesign(@RequestBody @Validated ApiClothesOrderDraftDto dto) {
+
+        return apiClothesOrderService.draftToDesign(dto);
+    }
+
+    @ApiOperation(value = "我的草稿-删除", notes = "我的草稿-删除")
+    @PostMapping(value = "/draftDel")
+    public FebsResponse draftDel(@RequestBody @Validated ApiClothesOrderDraftDto dto) {
+
+        return apiClothesOrderService.draftDel(dto);
+    }
+
+    @ApiOperation(value = "创建订单", notes = "创建订单")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiClothesOrderInfoVo.class)
+    })
+    @PostMapping(value = "/createOrder")
+    public FebsResponse createOrder(@RequestBody @Validated ApiClothesOrderInfoDto dto) {
+
+        return apiClothesOrderService.createOrder(dto);
+    }
+
+    @ApiOperation(value = "取消订单", notes = "取消订单")
+    @PostMapping(value = "/cancelOrder/{id}")
+    public FebsResponse cancelOrder(@PathVariable("id") Long id) {
+
+        return apiClothesOrderService.cancelOrder(id);
+    }
+
+    @ApiOperation(value = "删除订单", notes = "删除订单")
+    @PostMapping(value = "/delOrder/{id}")
+    public FebsResponse delOrder(@PathVariable("id") Long id) {
+
+        return apiClothesOrderService.delOrder(id);
+    }
+
+    @ApiOperation(value = "支付订单", notes = "支付订单")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiClothesOrderPayVo.class)
+    })
+    @PostMapping(value = "/payOrder")
+    public FebsResponse payOrder(@RequestBody ApiClothesOrderPayDto dto) {
+
+        return apiClothesOrderService.payOrder(dto);
+    }
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/OrderListDto.java b/src/main/java/cc/mrbird/febs/mall/dto/OrderListDto.java
index 054cbb5..45fb9aa 100644
--- a/src/main/java/cc/mrbird/febs/mall/dto/OrderListDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/OrderListDto.java
@@ -18,7 +18,7 @@
     @ApiModelProperty(value = "第几页", example = "1")
     private Integer pageNum;
 
-    @ApiModelProperty(value = "搜索参数(姓名,电话,提货码)", example = "1")
+    @ApiModelProperty(value = "搜索参数(姓名,电话)", example = "1")
     private String query;
 
     @ApiModelProperty(value = "订单状态", example = "0-全部 1-待付款 2-待发货(待确认) 3-待收货(待提货) 4-已完成 5-已取消")
@@ -27,6 +27,4 @@
     @ApiModelProperty(hidden = true)
     private Long memberId;
 
-    @ApiModelProperty(value = "1-普通订单, 2-积分订单", example = "1")
-    private Integer orderType;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java
index 9d2094f..622769f 100644
--- a/src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/PayOrderDto.java
@@ -20,7 +20,7 @@
     private Long id;
 
     @NotBlank(message = "参数不能为空")
-    @ApiModelProperty(value = "支付类型", example = "1微信2支付宝3余额4积分")
+    @ApiModelProperty(value = "支付类型", example = "1微信2支付宝3余额")
     private String type;
 
     @ApiModelProperty(value = "支付密码", example = "如果选择余额支付需要输入")
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderDraftDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderDraftDto.java
new file mode 100644
index 0000000..4bec278
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderDraftDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiClothesOrderDraftDto", description = "参数")
+public class ApiClothesOrderDraftDto {
+
+    @NotNull(message = "草稿不能为空")
+    @ApiModelProperty(value = "草稿ID")
+    private Long id;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderInfoDto.java
new file mode 100644
index 0000000..5af4a65
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderInfoDto.java
@@ -0,0 +1,39 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "ApiClothesOrderInfoDto", description = "参数")
+public class ApiClothesOrderInfoDto {
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "地址ID", example = "1")
+    private Long addressId;
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "类型ID", example = "1")
+    private Long typeId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "快递费")
+    private BigDecimal deliveryAmount;
+
+    @ApiModelProperty(value = "会员优惠卷ID")
+    private Long memberCouponId;
+
+    @NotNull(message = "数量不能为空")
+    @ApiModelProperty(value = "数量", example = "2")
+    private Integer cnt;
+
+    @ApiModelProperty(value = "商品明细")
+    private List<ApiClothesOrderItemInfoDto> items;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderItemInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderItemInfoDto.java
new file mode 100644
index 0000000..8fa0f47
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderItemInfoDto.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiClothesOrderItemInfoDto", description = "参数")
+public class ApiClothesOrderItemInfoDto {
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "id", example = "1")
+    private Long skuId;
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "数量", example = "2")
+    private Integer cnt;
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "类型 1图案 2图案位置 3工艺 4布料 5尺码 6尺码自定义", example = "2")
+    private Integer type;
+
+    @ApiModelProperty(value = "自定义图案内容", example = "2")
+    private String patternRemark;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderPayDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderPayDto.java
new file mode 100644
index 0000000..71ba600
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesOrderPayDto.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiClothesOrderPayDto", description = "参数")
+public class ApiClothesOrderPayDto {
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "订单ID")
+    private Long id;
+
+    @NotBlank(message = "参数不能为空")
+    @ApiModelProperty(value = "支付类型", example = "1微信2支付宝3余额")
+    private Integer type;
+
+    @ApiModelProperty(value = "支付密码", example = "如果选择余额支付需要输入")
+    private String tradePwd;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftPageDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftPageDto.java
new file mode 100644
index 0000000..bf79be7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftPageDto.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiMyDraftPageDto", description = "参数")
+public class ApiMyDraftPageDto {
+
+    @NotNull(message = "页码不能为空")
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNow;
+
+    @NotNull(message = "每页数量不能为空")
+    @ApiModelProperty(value = "每页数量", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(hidden = true)
+    private Long memberId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftSaveDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftSaveDto.java
new file mode 100644
index 0000000..f585ff9
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiMyDraftSaveDto.java
@@ -0,0 +1,49 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiMyDraftSaveDto", description = "参数")
+public class ApiMyDraftSaveDto {
+
+
+    @NotNull(message = "类型不能为空")
+    @ApiModelProperty(value = "类型ID")
+    private Long typeId;
+
+
+    @NotNull(message = "工艺不能为空")
+    @ApiModelProperty(value = "工艺ID")
+    private Long artId;
+
+
+    @NotNull(message = "尺码不能为空")
+    @ApiModelProperty(value = "尺码ID")
+    private Long sizeId;
+
+
+    @NotNull(message = "图案不能为空")
+    @ApiModelProperty(value = "图案ID")
+    private Long patternId;
+
+    @ApiModelProperty(value = "自定义内容")
+    private String patternRemark;
+
+
+    @NotNull(message = "图案位置不能为空")
+    @ApiModelProperty(value = "图案位置ID")
+    private Long locationId;
+
+
+    @NotNull(message = "布料不能为空")
+    @ApiModelProperty(value = "布料ID")
+    private Long clothId;
+
+    @ApiModelProperty(value = "身材数据ID")
+    private Long statureId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrder.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrder.java
new file mode 100644
index 0000000..6b56495
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrder.java
@@ -0,0 +1,68 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("clothes_order_graft")
+public class ClothesOrder extends BaseEntity {
+    /**
+     *
+     `member_id` bigint(20) DEFAULT NULL,
+     `order_no` varchar(32) DEFAULT NULL COMMENT '订单号',
+     `order_time` datetime DEFAULT NULL COMMENT '下单时间',
+     `goods_cnt` int(11) DEFAULT NULL COMMENT '数量',
+     `amount` decimal(20,2) DEFAULT NULL COMMENT '订单金额',
+     `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
+     `pay_method` varchar(32) DEFAULT NULL COMMENT '支付方式',
+     `pay_order_no` text COMMENT '支付订单号',
+     `pay_result` int(11) DEFAULT NULL COMMENT '支付结果 1-成功 0-未成功',
+     `status` int(11) DEFAULT NULL COMMENT '状态;1-待支付 2-待发货 3-待收货 4-已完成 5-已取消',
+     `name` varchar(32) DEFAULT NULL COMMENT '联系人',
+     `phone` varchar(32) DEFAULT NULL COMMENT '联系方式',
+     `address_id` bigint(20) DEFAULT NULL COMMENT '地址ID',
+     `address` text COMMENT '收货地址',
+     `longitude` varchar(255) DEFAULT NULL COMMENT '经度',
+     `latitude` varchar(255) DEFAULT NULL COMMENT '纬度',
+     `carriage` decimal(4,2) DEFAULT '0.00' COMMENT '运费',
+     `comment_state` int(11) DEFAULT '1' COMMENT '评价状态 1:待评价 2:已评价',
+     `remark` text COMMENT '备注',
+     `member_coupon_id` bigint(20) DEFAULT NULL COMMENT '会员优惠卷ID',
+     */
+    private Long memberId;
+    private Long memberCouponId;
+    private Long typeId;
+    private String orderNo;
+    private Date orderTime;
+    private Integer goodsCnt;
+    private Integer status;
+    private String remark;
+
+
+    private Date payTime;
+    private String payMethod;
+    private String payOrderNo;
+    private Integer payResult;
+
+    private Long addressId;
+    private Integer deliveryState;
+    private String name;
+    private String phone;
+    private String address;
+    private String longitude;
+    private String latitude;
+
+    private BigDecimal amount;
+    private BigDecimal discountAmount;
+    private BigDecimal carriage;
+    private BigDecimal realAmount;
+
+    private Integer commentState;
+    private Integer delFlag;
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderDraft.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderDraft.java
new file mode 100644
index 0000000..ab2f511
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderDraft.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_order_draft")
+public class ClothesOrderDraft extends BaseEntity {
+    /**
+     *
+     `member_id` bigint(20) DEFAULT NULL,
+     `type_id` bigint(20) DEFAULT NULL COMMENT '类别',
+     `art_id` bigint(20) DEFAULT NULL,
+     `stature_id` bigint(20) DEFAULT NULL,
+     `size_id` bigint(20) DEFAULT NULL,
+     `pattern_id` bigint(20) DEFAULT NULL,
+     `location_id` bigint(20) DEFAULT NULL,
+     `cloth_id` bigint(20) DEFAULT NULL,
+     `pattern_remark` varchar(200) DEFAULT NULL,
+     */
+    private Long memberId;
+    private Long typeId;
+    private Long artId;
+    private Long statureId;
+    private Long sizeId;
+    private Long patternId;
+    private Long locationId;
+    private Long clothId;
+    private Integer delFlag;
+    private String patternRemark;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderItem.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderItem.java
new file mode 100644
index 0000000..5f3b7db
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesOrderItem.java
@@ -0,0 +1,31 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("clothes_order_item")
+public class ClothesOrderItem  extends BaseEntity {
+    /**
+     *
+     `member_id` bigint(20) DEFAULT NULL,
+     `order_id` bigint(20) DEFAULT NULL,
+     `name` varchar(200) DEFAULT NULL,
+     `price` decimal(20,2) DEFAULT NULL,
+     `item_cnt` int(11) DEFAULT NULL,
+     `amount` decimal(20,2) DEFAULT NULL,
+     `type` int(11) DEFAULT NULL COMMENT '类型 1图案 2图案位置 3工艺 4布料 5尺码',
+     `remark` varchar(200) DEFAULT NULL,
+     */
+    private Long memberId;
+    private Long orderId;
+    private String name;
+    private BigDecimal price;
+    private Integer itemCnt;
+    private BigDecimal amount;
+    private Integer type;
+    private String remark;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderDraftMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderDraftMapper.java
new file mode 100644
index 0000000..a9e187a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderDraftMapper.java
@@ -0,0 +1,12 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.dto.clothes.ApiMyDraftPageDto;
+import cc.mrbird.febs.mall.entity.ClothesOrderDraft;
+import cc.mrbird.febs.mall.vo.clothes.ApiMyDraftVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+public interface ClothesOrderDraftMapper  extends BaseMapper<ClothesOrderDraft> {
+    Page<ApiMyDraftVo> selectPageInDraft(Page<ApiMyDraftVo> page, @Param("record")ApiMyDraftPageDto dto);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderItemMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderItemMapper.java
new file mode 100644
index 0000000..26cde7f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderItemMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesOrderItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesOrderItemMapper extends BaseMapper<ClothesOrderItem> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java
new file mode 100644
index 0000000..1219d6f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesOrderMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ClothesOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ClothesOrderMapper extends BaseMapper<ClothesOrder> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
index 083d5f9..fc4cb16 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
@@ -48,34 +48,34 @@
      * 获取access_token
      * 有效期两小时
      */
-//    @Scheduled(cron = "0 0 0/1 * * ? ")
-//    public void getAccessToken() throws IOException {
-//        log.info("执行access_token刷新");
-//        String appId = xcxProperties.getXcxAppid();
-//        String appSecret = xcxProperties.getXcxSecret();
-//        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
-//        String jsonStr = restTemplate.getForObject(url, String.class);
-//
-//        /**
-//         * 返回结果
-//         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
-//         */
-//        if (!jsonStr.contains("access_token")) {
-//            System.out.println("获取微信access_token失败");
-//        }
-//
-//        String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY;
-//        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
-//        String accessToken = jsonObject.getString(accessTokenKey);
-//        if (StrUtil.isEmpty(accessToken)) {
-//            log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
-//            throw new ApiException("获取access token失败");
-//        } else {
-//            log.info("wx access_token : {}",accessToken);
-//            redisUtils.set(accessTokenKey,accessToken);
-//        }
-//
-//    }
+    @Scheduled(cron = "0 0 0/1 * * ? ")
+    public void getAccessToken() throws IOException {
+        log.info("执行access_token刷新");
+        String appId = xcxProperties.getXcxAppid();
+        String appSecret = xcxProperties.getXcxSecret();
+        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
+        String jsonStr = restTemplate.getForObject(url, String.class);
+
+        /**
+         * 返回结果
+         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
+         */
+        if (!jsonStr.contains("access_token")) {
+            System.out.println("获取微信access_token失败");
+        }
+
+        String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY;
+        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+        String accessToken = jsonObject.getString(accessTokenKey);
+        if (StrUtil.isEmpty(accessToken)) {
+            log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
+            throw new ApiException("获取access token失败");
+        } else {
+            log.info("wx access_token : {}",accessToken);
+            redisUtils.set(accessTokenKey,accessToken);
+        }
+
+    }
 
     @Scheduled(cron = "0 0 0/1 * * ? ")
     public void expireCoupon() {
diff --git a/src/main/java/cc/mrbird/febs/mall/service/ApiClothesOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/ApiClothesOrderService.java
new file mode 100644
index 0000000..dc4bb2c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/ApiClothesOrderService.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.mall.service;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.clothes.ApiClothesOrderDraftDto;
+import cc.mrbird.febs.mall.dto.clothes.ApiClothesOrderInfoDto;
+import cc.mrbird.febs.mall.dto.clothes.ApiClothesOrderPayDto;
+import cc.mrbird.febs.mall.dto.clothes.ApiMyDraftPageDto;
+import cc.mrbird.febs.mall.entity.ClothesOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface ApiClothesOrderService extends IService<ClothesOrder> {
+
+    FebsResponse myDraft(ApiMyDraftPageDto dto);
+
+    FebsResponse draftToDesign(ApiClothesOrderDraftDto dto);
+
+    FebsResponse draftDel(ApiClothesOrderDraftDto dto);
+
+    FebsResponse createOrder(ApiClothesOrderInfoDto dto);
+
+    void orderCancelDelayClothes(long parseLong);
+
+    FebsResponse cancelOrder(Long id);
+
+    FebsResponse delOrder(Long id);
+
+    FebsResponse payOrder(ApiClothesOrderPayDto dto);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/ApiClothesService.java b/src/main/java/cc/mrbird/febs/mall/service/ApiClothesService.java
index f369726..ebfb6e2 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/ApiClothesService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/ApiClothesService.java
@@ -30,4 +30,6 @@
     FebsResponse statureUpdate(ApiClothesMemberStatureUpdateDto dto);
 
     FebsResponse statureDel(ApiClothesMemberStatureInfoDto dto);
+
+    FebsResponse draftSave(ApiMyDraftSaveDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java
new file mode 100644
index 0000000..59d82e7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java
@@ -0,0 +1,680 @@
+package cc.mrbird.febs.mall.service.impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.enumerates.*;
+import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.utils.AppContants;
+import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.common.utils.MallUtils;
+import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.mall.dto.AddOrderItemDto;
+import cc.mrbird.febs.mall.dto.clothes.*;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.*;
+import cc.mrbird.febs.mall.service.ApiClothesOrderService;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
+import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
+import cc.mrbird.febs.mall.vo.clothes.ApiClothesOrderInfoVo;
+import cc.mrbird.febs.mall.vo.clothes.ApiClothesOrderPayVo;
+import cc.mrbird.febs.mall.vo.clothes.ApiMyDraftVo;
+import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
+import cc.mrbird.febs.pay.service.IPayService;
+import cc.mrbird.febs.pay.service.IXcxPayService;
+import cc.mrbird.febs.rabbit.producter.AgentProducer;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ApiClothesOrderServiceImpl extends ServiceImpl<ClothesOrderMapper, ClothesOrder> implements ApiClothesOrderService {
+
+    private final ClothesOrderMapper clothesOrderMapper;
+    private final ClothesOrderItemMapper clothesOrderItemMapper;
+    private final ClothesOrderDraftMapper clothesOrderDraftMapper;
+
+    private final ClothesTypeMapper clothesTypeMapper;
+    private final ClothesTypeClothMapper clothesTypeClothMapper;
+    private final ClothesTypePatternMapper clothesTypePatternMapper;
+    private final ClothesTypeSizeMapper clothesTypeSizeMapper;
+    private final ClothesSizeMapper clothesSizeMapper;
+    private final ClothesTypeLocationMapper clothesTypeLocationMapper;
+    private final ClothesTypeArtMapper clothesTypeArtMapper;
+    private final ClothesMemberStatureMapper clothesMemberStatureMapper;
+
+    private final ClothesPatternMapper clothesPatternMapper;
+    private final ClothesLocationMapper clothesLocationMapper;
+    private final ClothesClothMapper clothesClothMapper;
+    private final ClothesArtMapper clothesArtMapper;
+    private final MallAddressInfoMapper mallAddressInfoMapper;
+    private final MallMemberCouponMapper mallMemberCouponMapper;
+    private final MallGoodsCouponMapper mallGoodsCouponMapper;
+
+    private final AgentProducer agentProducer;
+    private final IXcxPayService iXcxPayService;
+    private final IPayService payService;
+    private final MallMemberMapper mallMemberMapper;
+    private final IApiMallMemberWalletService apiMallMemberWalletService;
+    private final IMallMoneyFlowService mallMoneyFlowService;
+
+    @Override
+    public FebsResponse myDraft(ApiMyDraftPageDto dto) {
+
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        dto.setMemberId(memberId);
+
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiMyDraftVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        // 调用Mapper方法获取活动分页数据
+        Page<ApiMyDraftVo> voPage = clothesOrderDraftMapper.selectPageInDraft(page, dto);
+        if (CollUtil.isNotEmpty(voPage.getRecords())){
+            List<ApiMyDraftVo> records = voPage.getRecords();
+            for (ApiMyDraftVo record : records){
+
+                Long typeId = record.getTypeId();
+                ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+                record.setTypeName(clothesType.getName());
+                record.setTypeImage(clothesType.getImage());
+
+                Long sizeId = ObjectUtil.defaultIfNull(record.getSizeId(),0L);
+                List<ClothesTypeSize> clothesTypeSizes = clothesTypeSizeMapper.selectList(Wrappers.<ClothesTypeSize>lambdaQuery().eq(ClothesTypeSize::getTypeId, typeId));
+                if (CollUtil.isNotEmpty(clothesTypeSizes)){
+                    Set<Long> collect = clothesTypeSizes.stream().map(ClothesTypeSize::getSizeId).collect(Collectors.toSet());
+                    if(CollUtil.isNotEmpty( collect) && collect.contains(sizeId)){
+                        ClothesSize clothesSize = clothesSizeMapper.selectById(sizeId);
+                        if (ObjectUtil.isNotNull(clothesSize)){
+                            record.setSizeName(clothesSize.getName());
+                            record.setSizePrice(clothesSize.getPrice());
+                        }
+                    }
+                }
+
+                Long statureId = ObjectUtil.defaultIfNull(record.getStatureId(),0L);
+                ClothesMemberStature clothesMemberStature = clothesMemberStatureMapper.selectById(statureId);
+                if (ObjectUtil.isNotEmpty(clothesMemberStature)){
+                    record.setStatureName(clothesMemberStature.getName());
+                }
+
+                Long patternId = ObjectUtil.defaultIfNull(record.getPatternId(),0L);
+                List<ClothesTypePattern> clothesTypePatterns = clothesTypePatternMapper.selectList(Wrappers.<ClothesTypePattern>lambdaQuery().eq(ClothesTypePattern::getTypeId, typeId));
+                if (CollUtil.isNotEmpty(clothesTypePatterns)){
+                    Set<Long> patternIds = clothesTypePatterns.stream().map(ClothesTypePattern::getPatternId).collect(Collectors.toSet());
+                    if(CollUtil.isNotEmpty( patternIds) && patternIds.contains(patternId)){
+                        ClothesPattern clothesPattern = clothesPatternMapper.selectById(patternId);
+                        if (ObjectUtil.isNotNull(clothesPattern)){
+                            record.setPatternName(clothesPattern.getName());
+                            record.setPatternPrice(clothesPattern.getPrice());
+                        }
+                    }
+                }
+
+                Long locationId = ObjectUtil.defaultIfNull(record.getLocationId(),0L);
+                List<ClothesTypeLocation> clothesTypeLocations = clothesTypeLocationMapper.selectList(Wrappers.<ClothesTypeLocation>lambdaQuery().eq(ClothesTypeLocation::getTypeId, typeId));
+                if (CollUtil.isNotEmpty(clothesTypeLocations)){
+                    Set<Long> locationIds = clothesTypeLocations.stream().map(ClothesTypeLocation::getLocationId).collect(Collectors.toSet());
+                    if(CollUtil.isNotEmpty( locationIds) && locationIds.contains(locationId)){
+                        ClothesLocation clothesLocation = clothesLocationMapper.selectById(locationId);
+                        if (ObjectUtil.isNotNull(clothesLocation)){
+                            record.setLocationName(clothesLocation.getName());
+                            record.setLocationPrice(clothesLocation.getPrice());
+                        }
+                    }
+                }
+
+                Long artId = ObjectUtil.defaultIfNull(record.getArtId(),0L);
+                List<ClothesTypeArt> clothesTypeArts = clothesTypeArtMapper.selectList(Wrappers.lambdaQuery(ClothesTypeArt.class).eq(ClothesTypeArt::getTypeId, typeId));
+                if(CollUtil.isNotEmpty(clothesTypeArts)){
+                    Set<Long> artIds = clothesTypeArts.stream().map(ClothesTypeArt::getArtId).collect(Collectors.toSet());
+                    if (CollUtil.isNotEmpty(artIds) && artIds.contains(artId)){
+                        ClothesArt clothesArt = clothesArtMapper.selectById(artId);
+                        if (ObjectUtil.isNotNull(clothesArt)){
+                            record.setArtName(clothesArt.getName());
+                            record.setArtPrice(clothesArt.getPrice());
+                        }
+                    }
+                }
+
+                Long clothId = ObjectUtil.defaultIfNull(record.getClothId(),0L);
+                List<ClothesTypeCloth> clothesTypeCloths = clothesTypeClothMapper.selectList(Wrappers.lambdaQuery(ClothesTypeCloth.class).eq(ClothesTypeCloth::getTypeId, typeId));
+                if(CollUtil.isNotEmpty(clothesTypeCloths)){
+                    Set<Long> clothIds = clothesTypeCloths.stream().map(ClothesTypeCloth::getClothId).collect(Collectors.toSet());
+                    if (CollUtil.isNotEmpty(clothIds) && clothIds.contains(clothId)){
+                        ClothesCloth clothesCloth = clothesClothMapper.selectById(clothId);
+                        if (ObjectUtil.isNotNull(clothesCloth)){
+                            record.setClothName(clothesCloth.getName());
+                            record.setClothPrice(clothesCloth.getPrice());
+                        }
+                    }
+                }
+
+                BigDecimal amount =
+                        record.getClothPrice()
+                                .add(record.getLocationPrice())
+                                .add(record.getArtPrice())
+                                .add(record.getSizePrice())
+                                .add(record.getPatternPrice()).setScale(2, RoundingMode.DOWN);
+                record.setAmount(amount);
+            }
+        }
+
+        return new FebsResponse().success().data(voPage);
+    }
+
+    @Override
+    public FebsResponse draftToDesign(ApiClothesOrderDraftDto dto) {
+
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        ApiMyDraftVo record = new ApiMyDraftVo();
+
+        Long id = dto.getId();
+        ClothesOrderDraft clothesOrderDraft = clothesOrderDraftMapper.selectById(id);
+
+        if (ObjectUtil.isNotNull(clothesOrderDraft)){
+            Long typeId = clothesOrderDraft.getTypeId();
+            ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+            record.setTypeId(typeId);
+            record.setTypeName(clothesType.getName());
+            record.setTypeImage(clothesType.getImage());
+            record.setPatternRemark(clothesOrderDraft.getPatternRemark());
+
+            Long sizeId = ObjectUtil.defaultIfNull(clothesOrderDraft.getSizeId(),0L);
+            List<ClothesTypeSize> clothesTypeSizes = clothesTypeSizeMapper.selectList(Wrappers.<ClothesTypeSize>lambdaQuery().eq(ClothesTypeSize::getTypeId, typeId));
+            if (CollUtil.isNotEmpty(clothesTypeSizes)){
+                Set<Long> collect = clothesTypeSizes.stream().map(ClothesTypeSize::getSizeId).collect(Collectors.toSet());
+                if(CollUtil.isNotEmpty( collect) && collect.contains(sizeId)){
+                    ClothesSize clothesSize = clothesSizeMapper.selectById(sizeId);
+                    if(ObjectUtil.isNotNull(clothesSize)){
+                        record.setSizeId(sizeId);
+                        record.setSizeName(clothesSize.getName());
+                        record.setSizePrice(clothesSize.getPrice());
+                    }
+                }
+            }
+
+            Long statureId = ObjectUtil.defaultIfNull(clothesOrderDraft.getStatureId(),0L);
+            ClothesMemberStature clothesMemberStature = clothesMemberStatureMapper.selectById(statureId);
+            if (ObjectUtil.isNotNull(clothesMemberStature)){
+                record.setStatureId(clothesMemberStature.getId());
+                record.setStatureName(clothesMemberStature.getName());
+            }
+
+            Long patternId = ObjectUtil.defaultIfNull(clothesOrderDraft.getPatternId(),0L);
+            List<ClothesTypePattern> clothesTypePatterns = clothesTypePatternMapper.selectList(Wrappers.<ClothesTypePattern>lambdaQuery().eq(ClothesTypePattern::getTypeId, typeId));
+            if (CollUtil.isNotEmpty(clothesTypePatterns)){
+                Set<Long> patternIds = clothesTypePatterns.stream().map(ClothesTypePattern::getPatternId).collect(Collectors.toSet());
+                if(CollUtil.isNotEmpty( patternIds) && patternIds.contains(patternId)){
+                    ClothesPattern clothesPattern = clothesPatternMapper.selectById(patternId);
+                    if (ObjectUtil.isNotNull(clothesPattern)){
+                        record.setPatternId(patternId);
+                        record.setPatternName(clothesPattern.getName());
+                        record.setPatternPrice(clothesPattern.getPrice());
+                    }
+                }
+            }
+
+            Long locationId = ObjectUtil.defaultIfNull(clothesOrderDraft.getLocationId(),0L);
+            List<ClothesTypeLocation> clothesTypeLocations = clothesTypeLocationMapper.selectList(Wrappers.<ClothesTypeLocation>lambdaQuery().eq(ClothesTypeLocation::getTypeId, typeId));
+            if (CollUtil.isNotEmpty(clothesTypeLocations)){
+                Set<Long> locationIds = clothesTypeLocations.stream().map(ClothesTypeLocation::getLocationId).collect(Collectors.toSet());
+                if(CollUtil.isNotEmpty( locationIds) && locationIds.contains(locationId)){
+                    ClothesLocation clothesLocation = clothesLocationMapper.selectById(locationId);
+                    if (ObjectUtil.isNotNull(clothesLocation)){
+                        record.setLocationId(locationId);
+                        record.setLocationName(clothesLocation.getName());
+                        record.setLocationPrice(clothesLocation.getPrice());
+                    }
+                }
+            }
+
+            Long artId = ObjectUtil.defaultIfNull(clothesOrderDraft.getArtId(),0L);
+            List<ClothesTypeArt> clothesTypeArts = clothesTypeArtMapper.selectList(Wrappers.lambdaQuery(ClothesTypeArt.class).eq(ClothesTypeArt::getTypeId, typeId));
+            if(CollUtil.isNotEmpty(clothesTypeArts)){
+                Set<Long> artIds = clothesTypeArts.stream().map(ClothesTypeArt::getArtId).collect(Collectors.toSet());
+                if (CollUtil.isNotEmpty(artIds) && artIds.contains(artId)){
+                    ClothesArt clothesArt = clothesArtMapper.selectById(artId);
+                    if (ObjectUtil.isNotNull(clothesArt)){
+                        record.setArtId(artId);
+                        record.setArtName(clothesArt.getName());
+                        record.setArtPrice(clothesArt.getPrice());
+                    }
+                }
+            }
+
+            Long clothId = ObjectUtil.defaultIfNull(clothesOrderDraft.getClothId(),0L);
+            List<ClothesTypeCloth> clothesTypeCloths = clothesTypeClothMapper.selectList(Wrappers.lambdaQuery(ClothesTypeCloth.class).eq(ClothesTypeCloth::getTypeId, typeId));
+            if(CollUtil.isNotEmpty(clothesTypeCloths)){
+                Set<Long> clothIds = clothesTypeCloths.stream().map(ClothesTypeCloth::getClothId).collect(Collectors.toSet());
+                if (CollUtil.isNotEmpty(clothIds) && clothIds.contains(clothId)){
+                    ClothesCloth clothesCloth = clothesClothMapper.selectById(clothId);
+                    if (ObjectUtil.isNotNull(clothesCloth)){
+                        record.setClothId(clothId);
+                        record.setClothName(clothesCloth.getName());
+                        record.setClothPrice(clothesCloth.getPrice());
+                    }
+                }
+            }
+
+            BigDecimal amount =
+                    record.getClothPrice()
+                            .add(record.getLocationPrice())
+                            .add(record.getArtPrice())
+                            .add(record.getSizePrice())
+                            .add(record.getPatternPrice()).setScale(2, RoundingMode.DOWN);
+            record.setAmount(amount);
+        }
+
+        return new FebsResponse().success().data(record);
+    }
+
+    @Override
+    public FebsResponse draftDel(ApiClothesOrderDraftDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        clothesOrderDraftMapper.update(null,
+                Wrappers.lambdaUpdate(ClothesOrderDraft.class)
+                        .set(ClothesOrderDraft::getDelFlag, ClothesEnum.UP.getCode())
+                        .eq(ClothesOrderDraft::getId, dto.getId())
+                        .eq(ClothesOrderDraft::getMemberId, memberId)
+        );
+
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    private BigDecimal getCouponAmountReduce(BigDecimal totalAmount, Long memberCouponId) {
+
+        BigDecimal reduceAmount = BigDecimal.ZERO;
+        HashMap<Long, BigDecimal> couponAmountMap = new HashMap<>();
+
+        // 获取优惠券信息
+        Optional<MallMemberCoupon> optionalMallMemberCoupon = Optional.ofNullable(mallMemberCouponMapper.selectById(memberCouponId));
+        MallMemberCoupon mallMemberCoupon = optionalMallMemberCoupon.orElse(null);
+        if (ObjectUtil.isNull(mallMemberCoupon) || mallMemberCoupon.getState() != 1) {
+            return reduceAmount;
+        }
+
+        Optional<MallGoodsCoupon> optionalMallGoodsCoupon = Optional.ofNullable(mallGoodsCouponMapper.selectById(mallMemberCoupon.getCouponId()));
+        MallGoodsCoupon mallGoodsCoupon = optionalMallGoodsCoupon.orElse(null);
+        if (ObjectUtil.isNull(mallGoodsCoupon)) {
+            return reduceAmount;
+        }
+
+        BigDecimal costAmount = mallGoodsCoupon.getCostAmount();
+        BigDecimal realAmount = mallGoodsCoupon.getRealAmount();
+        Integer type = mallGoodsCoupon.getType();
+        if (MallGoodsCoupon.TYPE_ONE == type) {
+            reduceAmount = mallGoodsCoupon.getRealAmount();
+        } else if (MallGoodsCoupon.TYPE_TWO == type) {
+            BigDecimal divideTime = totalAmount.divide(costAmount, 0, RoundingMode.DOWN); // 累计减免次数
+            reduceAmount = divideTime.multiply(realAmount); // 实际减免金额
+        }
+
+        return reduceAmount;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public FebsResponse createOrder(ApiClothesOrderInfoDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        if (CollUtil.isEmpty(dto.getItems())) {
+            throw new FebsException("参数错误");
+        }
+        //选择了地址才允许下单
+        Long addressId = dto.getAddressId();
+        MallAddressInfo address = mallAddressInfoMapper.selectAddressInfoByMemberIdAndId(memberId, addressId);
+        if(ObjectUtil.isNull( address)){
+            throw new FebsException("请选择收货地址");
+        }
+        if (StrUtil.isBlank(address.getLatitude())||StrUtil.isBlank(address.getLongitude())) {
+            throw new FebsException("请添加地址");
+        }
+        Long typeId = dto.getTypeId();
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if(ObjectUtil.isNull( clothesType)){
+            throw new FebsException("请选择商品");
+        }
+        if(ClothesEnum.UP.getCode() != clothesType.getState()){
+            throw new FebsException("商品已下架");
+        }
+
+        String orderNo = MallUtils.getOrderNum("CL");
+        ClothesOrder orderInfo = new ClothesOrder();
+        orderInfo.setMemberId(memberId);
+        orderInfo.setTypeId(typeId);
+        orderInfo.setOrderNo(orderNo);
+        orderInfo.setOrderTime(new Date());
+        orderInfo.setGoodsCnt(dto.getCnt());
+        orderInfo.setStatus(ClothesOrderStatusEnum.WAIT_PAY.getValue());
+        orderInfo.setRemark(dto.getRemark());
+
+        orderInfo.setAddressId(addressId);
+        orderInfo.setName(address.getName());
+        orderInfo.setPhone(address.getPhone());
+        orderInfo.setAddress(address.getProvince() + address.getCity() + address.getArea() + address.getAddress());
+        orderInfo.setLatitude(address.getLatitude());
+        orderInfo.setLongitude(address.getLongitude());
+        clothesOrderMapper.insert(orderInfo);
+
+        Long orderId = orderInfo.getId();
+        /**
+         * 创建订单子表
+         */
+        BigDecimal total = BigDecimal.ZERO;
+        for (ApiClothesOrderItemInfoDto item : dto.getItems()) {
+            ClothesOrderItem orderItem = new ClothesOrderItem();
+            orderItem.setMemberId(memberId);
+            orderItem.setOrderId(orderId);
+            orderItem.setType(item.getType());
+            if (ClothesOrderItemEnum.CLOTH.getCode() == item.getType()) {
+                ClothesCloth cloth = clothesClothMapper.selectById(item.getSkuId());
+                if (ObjectUtil.isNull(cloth)) {
+                    throw new FebsException("请选择布料");
+                }
+                orderItem.setName(cloth.getName());
+                orderItem.setPrice(cloth.getPrice());
+                orderItem.setItemCnt(item.getCnt());
+                orderItem.setAmount(cloth.getPrice().multiply(new BigDecimal(item.getCnt())).setScale(2, RoundingMode.DOWN));
+                clothesOrderItemMapper.insert(orderItem);
+
+                total = total.add(orderItem.getAmount());
+                continue;
+            } else if (ClothesOrderItemEnum.SIZE.getCode() == item.getType()) {
+                ClothesSize size = clothesSizeMapper.selectById(item.getSkuId());
+                if (ObjectUtil.isNull(size)) {
+                    throw new FebsException("请选择尺寸");
+                }
+                orderItem.setName(size.getName());
+                orderItem.setPrice(size.getPrice());
+                orderItem.setItemCnt(item.getCnt());
+                orderItem.setAmount(orderItem.getPrice().multiply(new BigDecimal(orderItem.getItemCnt())).setScale(2, RoundingMode.DOWN));
+                clothesOrderItemMapper.insert(orderItem);
+
+                total = total.add(orderItem.getAmount());
+                continue;
+            } else if (ClothesOrderItemEnum.LOCATION.getCode() == item.getType()) {
+                ClothesLocation location = clothesLocationMapper.selectById(item.getSkuId());
+                if (ObjectUtil.isNull(location)) {
+                    throw new FebsException("请选择图案位置");
+                }
+                orderItem.setName(location.getName());
+                orderItem.setPrice(location.getPrice());
+                orderItem.setItemCnt(item.getCnt());
+                orderItem.setAmount(orderItem.getPrice().multiply(new BigDecimal(orderItem.getItemCnt())).setScale(2, RoundingMode.DOWN));
+                clothesOrderItemMapper.insert(orderItem);
+
+                total = total.add(orderItem.getAmount());
+                continue;
+            } else if (ClothesOrderItemEnum.PATTERN.getCode() == item.getType()) {
+                ClothesPattern pattern = clothesPatternMapper.selectById(item.getSkuId());
+                if (ObjectUtil.isNull(pattern)) {
+                    throw new FebsException("请选择图案");
+                }
+                orderItem.setRemark(item.getPatternRemark());
+                orderItem.setName(pattern.getName());
+                orderItem.setPrice(pattern.getPrice());
+                orderItem.setItemCnt(item.getCnt());
+                orderItem.setAmount(orderItem.getPrice().multiply(new BigDecimal(orderItem.getItemCnt())).setScale(2, RoundingMode.DOWN));
+                clothesOrderItemMapper.insert(orderItem);
+
+                total = total.add(orderItem.getAmount());
+                continue;
+            } else if (ClothesOrderItemEnum.ART.getCode() == item.getType()) {
+                ClothesArt art = clothesArtMapper.selectById(item.getSkuId());
+                if (ObjectUtil.isNull(art)) {
+                    throw new FebsException("请选择工艺");
+                }
+                orderItem.setName(art.getName());
+                orderItem.setPrice(art.getPrice());
+                orderItem.setItemCnt(item.getCnt());
+                orderItem.setAmount(orderItem.getPrice().multiply(new BigDecimal(orderItem.getItemCnt())).setScale(2, RoundingMode.DOWN));
+                clothesOrderItemMapper.insert(orderItem);
+
+                total = total.add(orderItem.getAmount());
+                continue;
+            } else if (ClothesOrderItemEnum.CUSTOMIZE.getCode() == item.getType()) {
+                ClothesMemberStature clothesMemberStature = clothesMemberStatureMapper.selectById(item.getSkuId());
+                orderItem.setName(clothesMemberStature.getName());
+                orderItem.setPrice(BigDecimal.ZERO);
+                orderItem.setItemCnt(item.getCnt());
+                orderItem.setAmount(orderItem.getPrice().multiply(new BigDecimal(orderItem.getItemCnt())).setScale(2, RoundingMode.DOWN));
+                clothesOrderItemMapper.insert(orderItem);
+
+                total = total.add(orderItem.getAmount());
+                continue;
+            } else {
+                throw new FebsException("详情参数错误");
+            }
+        }
+        /**
+         *  计算优惠金额、运费和实际支付金额
+         */
+        BigDecimal discountAmount = BigDecimal.ZERO;
+        MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
+        if(ObjectUtil.isNotEmpty(dto.getMemberCouponId())){
+            Long memberCouponId = dto.getMemberCouponId();
+            mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+            if(ObjectUtil.isEmpty(mallMemberCoupon)){
+                throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
+            }
+            Integer state = mallMemberCoupon.getState();
+            if(1 != state){
+                throw new FebsException(mallMemberCoupon.getCouponName()+"无法使用");
+            }
+            List<ApiClothesOrderItemInfoDto> items = dto.getItems();
+            discountAmount = getCouponAmountReduce(total, memberCouponId);
+            // 优惠金额大于0,则更新优惠卷
+            if(discountAmount.compareTo(BigDecimal.ZERO) > 0){
+                mallMemberCoupon.setState(2);
+                mallMemberCouponMapper.updateById(mallMemberCoupon);
+                orderInfo.setMemberCouponId(memberCouponId);
+            }
+        }
+        BigDecimal deliveryAmount = dto.getDeliveryAmount() == null ? BigDecimal.ZERO : dto.getDeliveryAmount();
+
+        orderInfo.setAmount(total);
+        orderInfo.setDiscountAmount(discountAmount);
+        orderInfo.setCarriage(deliveryAmount);
+
+        BigDecimal realAmount = total.subtract(discountAmount).add(deliveryAmount);
+        orderInfo.setRealAmount(realAmount);
+        clothesOrderMapper.updateById(orderInfo);
+
+        //过期时间修改成24小时
+        agentProducer.sendClothesOrderCancelDelayMsg(orderInfo.getId(),  24 * 60 * 60 * 1000L);
+
+        ApiClothesOrderInfoVo apiClothesOrderInfoVo = new ApiClothesOrderInfoVo();
+        apiClothesOrderInfoVo.setOrderId(orderInfo.getId());
+        return new FebsResponse().success().data(apiClothesOrderInfoVo);
+    }
+
+    @Override
+    public void orderCancelDelayClothes(long id) {
+        ClothesOrder orderInfo = clothesOrderMapper.selectById(id);
+        if (ObjectUtil.isNull(orderInfo)) {
+            log.error("自动取消订单参数错误:{}", id);
+            return;
+        }
+        if (orderInfo.getStatus() == ClothesOrderStatusEnum.WAIT_PAY.getValue()) {
+            log.info("自动取消订单:{},{}", orderInfo.getMemberId(), id);
+            clothesOrderMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesOrder.class)
+                    .set(ClothesOrder::getStatus, ClothesOrderStatusEnum.CANCEL.getValue())
+                    .set(ClothesOrder::getUpdatedTime, new Date())
+                    .eq(ClothesOrder::getId, id)
+            );
+        }
+    }
+
+    @Override
+    public FebsResponse cancelOrder(Long id) {
+        ClothesOrder clothesOrder = clothesOrderMapper.selectById(id);
+        if(
+                ObjectUtil.isNotNull(clothesOrder)
+                        && ClothesEnum.DOWN.getCode() == clothesOrder.getDelFlag()
+                        && ClothesOrderStatusEnum.WAIT_PAY.getValue() == clothesOrder.getStatus()
+        ){
+            clothesOrderMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesOrder.class)
+                            .set(ClothesOrder::getStatus, ClothesOrderStatusEnum.CANCEL.getValue())
+                            .set(ClothesOrder::getUpdatedTime, new Date())
+                            .eq(ClothesOrder::getId, id)
+            );
+            Long memberCouponId = ObjectUtil.defaultIfNull(clothesOrder.getMemberCouponId(), 0L);
+            MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+            if(ObjectUtil.isNotNull(mallMemberCoupon)){
+                mallMemberCoupon.setState(1);
+                mallMemberCouponMapper.updateById(mallMemberCoupon);
+            }
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse delOrder(Long id) {
+        ClothesOrder clothesOrder = clothesOrderMapper.selectById(id);
+        if(
+                ObjectUtil.isNotNull(clothesOrder)
+                && ClothesEnum.DOWN.getCode() == clothesOrder.getDelFlag()
+        ){
+            clothesOrderMapper.update(null,
+                    Wrappers.lambdaUpdate(ClothesOrder.class)
+                            .set(ClothesOrder::getDelFlag, ClothesEnum.UP.getCode())
+                            .set(ClothesOrder::getUpdatedTime, new Date())
+                            .eq(ClothesOrder::getId, id)
+            );
+        }
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    private String balancePay(ClothesOrder orderInfo, String tradePwd, String field) {
+        if (StrUtil.isBlank(tradePwd)) {
+            throw new FebsException("支付密码错误");
+        }
+
+        MallMember mallMember = mallMemberMapper.selectById(orderInfo.getMemberId());
+        if (StrUtil.isBlank(mallMember.getTradePassword())) {
+            throw new FebsException("未设置支付密码");
+        }
+
+        if (!SecureUtil.md5(tradePwd).equals(mallMember.getTradePassword())) {
+            throw new FebsException("支付密码错误");
+        }
+
+        int reduce = apiMallMemberWalletService.reduce(orderInfo.getAmount(), mallMember.getId(), field);
+        if (reduce == 2) {
+            throw new FebsException("余额不足");
+        }
+        return orderInfo.getOrderNo();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public FebsResponse payOrder(ApiClothesOrderPayDto dto) {
+        MallMember member = LoginUserUtil.getLoginUser();
+        ClothesOrder clothesOrder = clothesOrderMapper.selectById(dto.getId());
+        if (ObjectUtil.isNull(clothesOrder)){
+            throw new FebsException("订单不存在");
+        }
+        if (ClothesEnum.DOWN.getCode() != clothesOrder.getDelFlag()) {
+            throw new FebsException("订单不存在");
+        }
+
+        if (ClothesOrderStatusEnum.WAIT_PAY.getValue() != clothesOrder.getStatus()) {
+            throw new FebsException("订单不是待支付状态");
+        }
+        if(
+                ClothesOrderPayTypeEnum.WECHAT.getCode() != dto.getType()
+                && ClothesOrderPayTypeEnum.ALIPAY.getCode() != dto.getType()
+                && ClothesOrderPayTypeEnum.BALANCE.getCode() != dto.getType()
+        ){
+
+            throw new FebsException("支付方式不支持");
+        }
+
+        String payResultStr = "";
+        String wxResultStr = "";
+        switch (dto.getType()) {
+            case 1:
+                BrandWCPayRequestData brandWCPayRequestData = null;
+                try {
+                    brandWCPayRequestData = iXcxPayService.startPayment(clothesOrder);
+                } catch (Exception e) {
+                    throw new FebsException("支付失败");
+                }
+                wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData);
+                payResultStr = brandWCPayRequestData.getPrepay_id();
+                clothesOrder.setPayMethod(ClothesOrderPayTypeEnum.WECHAT.getName());
+                break;
+            case 2:
+                if (StrUtil.isNotBlank(clothesOrder.getPayOrderNo())) {
+                    payResultStr = clothesOrder.getPayOrderNo();
+                } else {
+                    payResultStr = payService.aliPay(clothesOrder);
+                }
+
+                clothesOrder.setPayOrderNo(payResultStr);
+                clothesOrder.setPayMethod(ClothesOrderPayTypeEnum.ALIPAY.getName());
+                break;
+            case 3:
+
+                Date date = new Date();
+                payResultStr = balancePay(clothesOrder, dto.getTradePwd(), "balance");
+
+                clothesOrder.setPayOrderNo(clothesOrder.getOrderNo());
+                clothesOrder.setPayMethod(ClothesOrderPayTypeEnum.BALANCE.getName());
+                clothesOrder.setStatus(ClothesOrderStatusEnum.WAIT_SHIPPING.getValue());
+                clothesOrder.setPayTime(date);
+                clothesOrder.setPayResult(1);
+                clothesOrder.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_WAIT.getValue());
+
+                mallMoneyFlowService.addMoneyFlow(
+                        member.getId(),
+                        clothesOrder.getRealAmount().negate(),
+                        ScoreFlowTypeEnum.PAY_BALANCE.getValue(),
+                        clothesOrder.getOrderNo(),
+                        FlowTypeEnum.BALANCE.getValue(),
+                        StrUtil.format(ScoreFlowTypeEnum.PAY_BALANCE.getDesc(),clothesOrder.getRealAmount()),
+                        2
+                );
+                Long memberCouponId = ObjectUtil.defaultIfNull(clothesOrder.getMemberCouponId(), 0L);
+                MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+                if(ObjectUtil.isNotNull(mallMemberCoupon)){
+                    mallMemberCoupon.setState(2);
+                    mallMemberCouponMapper.updateById(mallMemberCoupon);
+                }
+                break;
+            default:
+
+        }
+        clothesOrderMapper.updateById(clothesOrder);
+
+
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderInfo", payResultStr);
+        map.put("orderNo", clothesOrder.getOrderNo());
+        map.put("orderId", clothesOrder.getId());
+        map.put("wxResultStr", wxResultStr);
+
+        ApiClothesOrderPayVo apiClothesOrderPayVo = new ApiClothesOrderPayVo();
+        apiClothesOrderPayVo.setOrder(map);
+        apiClothesOrderPayVo.setType(dto.getType());
+        return new FebsResponse().success().data(apiClothesOrderPayVo).message("支付成功");
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesServiceImpl.java
index 725044a..0459e9a 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesServiceImpl.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.enumerates.ClothesEnum;
 import cc.mrbird.febs.common.enumerates.StateUpDownEnum;
+import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
 import cc.mrbird.febs.mall.dto.clothes.*;
 import cc.mrbird.febs.mall.entity.*;
@@ -12,6 +13,7 @@
 import cc.mrbird.febs.mall.vo.clothes.*;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -19,6 +21,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -35,9 +38,14 @@
     private final ClothesTypePatternMapper clothesTypePatternMapper;
     private final ClothesTypeSizeMapper clothesTypeSizeMapper;
     private final ClothesSizeMapper clothesSizeMapper;
+    private final ClothesPatternMapper clothesPatternMapper;
+    private final ClothesLocationMapper clothesLocationMapper;
+    private final ClothesClothMapper clothesClothMapper;
+    private final ClothesArtMapper clothesArtMapper;
     private final ClothesTypeLocationMapper clothesTypeLocationMapper;
     private final ClothesTypeArtMapper clothesTypeArtMapper;
     private final ClothesMemberStatureMapper clothesMemberStatureMapper;
+    private final ClothesOrderDraftMapper clothesOrderDraftMapper;
 
     @Override
     public FebsResponse clothesType() {
@@ -254,15 +262,82 @@
 
     @Override
     public FebsResponse statureDel(ApiClothesMemberStatureInfoDto dto) {
-
         Long memberId = LoginUserUtil.getLoginUser().getId();
-        clothesMemberStatureMapper.delete(
+        clothesMemberStatureMapper.update(null,
                 Wrappers.lambdaUpdate(ClothesMemberStature.class)
+                        .set(ClothesMemberStature::getDelFlag, ClothesEnum.UP.getCode())
                         .eq(ClothesMemberStature::getId, dto.getId())
                         .eq(ClothesMemberStature::getMemberId, memberId)
-                        .eq(ClothesMemberStature::getDelFlag, ClothesEnum.DOWN.getCode())
         );
 
         return new FebsResponse().success().message("操作成功");
     }
+
+    @Override
+    @Transactional
+    public FebsResponse draftSave(ApiMyDraftSaveDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        ClothesOrderDraft clothesOrderDraft = new ClothesOrderDraft();
+        clothesOrderDraft.setMemberId(memberId);
+
+        Long typeId = ObjectUtil.defaultIfNull(dto.getTypeId(),0L);
+        ClothesType clothesType = clothesTypeMapper.selectById(typeId);
+        if (ObjectUtil.isNull(clothesType)){
+            throw new FebsException("请选择商品");
+        }
+        if (ClothesEnum.UP.getCode() != clothesType.getState()){
+            throw new FebsException("商品已下架");
+        }
+        clothesOrderDraft.setTypeId(typeId);
+
+        Long sizeId = ObjectUtil.defaultIfNull(dto.getSizeId(),0L);
+        ClothesSize clothesSize = clothesSizeMapper.selectById(sizeId);
+        if (ObjectUtil.isNull(clothesSize)){
+            throw new FebsException("请选择尺码");
+        }
+        clothesOrderDraft.setSizeId(sizeId);
+
+        Long patternId = ObjectUtil.defaultIfNull(dto.getPatternId(),0L);
+        ClothesPattern pattern = clothesPatternMapper.selectById(patternId);
+        if (ObjectUtil.isNull(pattern)){
+            throw new FebsException("请选择图案");
+        }
+        clothesOrderDraft.setPatternId(patternId);
+        if(StrUtil.isNotBlank(dto.getPatternRemark())){
+            clothesOrderDraft.setPatternRemark(dto.getPatternRemark());
+        }
+
+        Long locationId = ObjectUtil.defaultIfNull(dto.getLocationId(),0L);
+        ClothesLocation clothesLocation = clothesLocationMapper.selectById(locationId);
+        if (ObjectUtil.isNull(clothesLocation)){
+            throw new FebsException("请选择图案位置");
+        }
+        clothesOrderDraft.setLocationId(locationId);
+
+        Long clothId = ObjectUtil.defaultIfNull(dto.getClothId(),0L);
+        ClothesCloth clothesCloth = clothesClothMapper.selectById(clothId);
+        if (ObjectUtil.isNull(clothesCloth)){
+            throw new FebsException("请选择布料");
+        }
+        clothesOrderDraft.setClothId(clothId);
+
+        Long artId = ObjectUtil.defaultIfNull(dto.getArtId(),0L);
+        ClothesArt clothesArt = clothesArtMapper.selectById(artId);
+        if (ObjectUtil.isNull(clothesArt)){
+            throw new FebsException("请选择工艺");
+        }
+        clothesOrderDraft.setArtId(artId);
+
+        Long statureId = ObjectUtil.defaultIfNull(dto.getStatureId(),0L);
+        ClothesMemberStature clothesMemberStature = clothesMemberStatureMapper.selectById(statureId);
+        if (ObjectUtil.isNull(clothesMemberStature)){
+            throw new FebsException("请选择身材数据");
+        }
+        clothesOrderDraft.setStatureId(clothesMemberStature.getId());
+
+        clothesOrderDraftMapper.insert(clothesOrderDraft);
+
+        return new FebsResponse().success().message("操作成功");
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderInfoVo.java
new file mode 100644
index 0000000..3491737
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderInfoVo.java
@@ -0,0 +1,15 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel(value = "ApiMyDraftVo", description = "参数")
+public class ApiClothesOrderInfoVo {
+
+    @ApiModelProperty(value = "订单ID")
+    private Long orderId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderPayVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderPayVo.java
new file mode 100644
index 0000000..cb429cf
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiClothesOrderPayVo.java
@@ -0,0 +1,15 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+@ApiModel(value = "ApiClothesOrderPayVo", description = "参数")
+public class ApiClothesOrderPayVo {
+
+    private Map<String, Object> order;
+    private Integer type;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftSaveVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftSaveVo.java
new file mode 100644
index 0000000..2e4dceb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftSaveVo.java
@@ -0,0 +1,14 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiMyDraftSaveVo", description = "参数")
+public class ApiMyDraftSaveVo {
+
+    @ApiModelProperty(value = "草稿ID")
+    private Long id;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftVo.java
new file mode 100644
index 0000000..f25e914
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiMyDraftVo.java
@@ -0,0 +1,68 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "ApiMyDraftVo", description = "参数")
+public class ApiMyDraftVo {
+
+    @ApiModelProperty(value = "草稿ID")
+    private Long id;
+
+    @ApiModelProperty(value = "总价")
+    private BigDecimal amount = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "类型ID")
+    private Long typeId;
+    @ApiModelProperty(value = "类型名称")
+    private String typeName;
+    @ApiModelProperty(value = "类型图片")
+    private String typeImage;
+
+    @ApiModelProperty(value = "工艺ID")
+    private Long artId;
+    @ApiModelProperty(value = "工艺名称")
+    private String artName;
+    @ApiModelProperty(value = "工艺价格")
+    private BigDecimal artPrice = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "尺码ID")
+    private Long sizeId;
+    @ApiModelProperty(value = "尺码名称")
+    private String sizeName;
+    @ApiModelProperty(value = "尺码价格")
+    private BigDecimal sizePrice = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "图案ID")
+    private Long patternId;
+    @ApiModelProperty(value = "图案名称")
+    private String patternName;
+    @ApiModelProperty(value = "图案价格")
+    private BigDecimal patternPrice = BigDecimal.ZERO;
+    @ApiModelProperty(value = "自定义内容")
+    private String patternRemark;
+
+    @ApiModelProperty(value = "图案位置ID")
+    private Long locationId;
+    @ApiModelProperty(value = "图案位置")
+    private String locationName;
+    @ApiModelProperty(value = "图案位置价格")
+    private BigDecimal locationPrice = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "布料ID")
+    private Long clothId;
+    @ApiModelProperty(value = "布料名称")
+    private String clothName;
+    @ApiModelProperty(value = "布料价格")
+    private BigDecimal clothPrice = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "身材数据ID")
+    private Long statureId;
+    @ApiModelProperty(value = "身材数据")
+    private String statureName;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IPayService.java
index 155cfb7..89593c9 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/IPayService.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/IPayService.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.pay.service;
 
+import cc.mrbird.febs.mall.entity.ClothesOrder;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
 
 import java.util.Map;
@@ -11,6 +12,7 @@
 public interface IPayService {
 
     String aliPay(MallOrderInfo orderInfo);
+    String aliPay(ClothesOrder orderInfo);
 
     void aliCallback(Map<String, String> params);
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
index dd7fe9c..ff46a48 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto;
 import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto;
+import cc.mrbird.febs.mall.entity.ClothesOrder;
 import cc.mrbird.febs.mall.entity.HappyActivityOrder;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
 import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
@@ -20,6 +21,7 @@
      * 发起支付(创建预付订单)
      */
     BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception;
+    BrandWCPayRequestData startPayment(ClothesOrder orderInfo) throws Exception;
 
     /**
      * 发起支付(创建预付订单)
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
index 242d20f..033e393 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
@@ -5,8 +5,12 @@
 import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
 import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
 import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.mall.entity.ClothesOrder;
+import cc.mrbird.febs.mall.entity.ClothesType;
 import cc.mrbird.febs.mall.entity.MallMember;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.mall.mapper.ClothesOrderMapper;
+import cc.mrbird.febs.mall.mapper.ClothesTypeMapper;
 import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
 import cc.mrbird.febs.mall.service.IApiMallMemberService;
 import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
@@ -46,6 +50,8 @@
     @Autowired
     private MallOrderInfoMapper orderInfoMapper;
     @Autowired
+    private ClothesTypeMapper clothesTypeMapper;
+    @Autowired
     private AgentProducer agentProducer;
 
     @Value("${spring.profiles.active}")
@@ -82,6 +88,38 @@
     }
 
     @Override
+    public String aliPay(ClothesOrder orderInfo) {
+        ClothesType clothesType = clothesTypeMapper.selectById(orderInfo.getTypeId());
+
+        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+        model.setSubject(clothesType.getName());
+        model.setBody(orderInfo.getName());
+        model.setOutTradeNo(orderInfo.getOrderNo());
+        model.setTimeoutExpress("15m");
+
+        if ("dev".equals(active) || "test".equals(active)) {
+            model.setTotalAmount("0.01");
+        } else {
+            model.setTotalAmount(orderInfo.getRealAmount().toString());
+        }
+
+        AliPayPassbackModel passbackModel = new AliPayPassbackModel();
+        passbackModel.setOrderId(orderInfo.getId());
+        passbackModel.setMemberId(orderInfo.getMemberId());
+        model.setPassbackParams(JSONObject.toJSONString(passbackModel));
+
+        model.setProductCode("QUICK_MSECURITY_PAY");
+        AlipayTradeAppPayResponse resp = null;
+        try {
+            resp = AliPayApi.appPayToResponse(model, aliPayProperties.getNoticeUrl());
+        } catch (AlipayApiException e) {
+            log.error("支付宝支付异常", e);
+            throw new FebsException("支付宝支付异常");
+        }
+        return resp.getBody();
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public void aliCallback(Map<String, String> params) {
         String modelStr = params.get("passback_params");
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
index eabf307..95c77c8 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
@@ -23,6 +23,7 @@
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -41,10 +42,7 @@
 import java.io.*;
 import java.math.BigDecimal;
 import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -70,6 +68,8 @@
     @Autowired
     private MallMemberWithdrawMapper mallMemberWithdrawMapper;
     private final IMallMoneyFlowService mallMoneyFlowService;
+    private final ClothesTypeMapper clothesTypeMapper;
+    private final ClothesOrderMapper clothesOrderMapper;
     @Autowired
     RedisUtils redisUtils;
 
@@ -212,6 +212,34 @@
     }
 
     @Override
+    public BrandWCPayRequestData startPayment(ClothesOrder orderInfo) throws Exception {
+        BigDecimal unit = new BigDecimal("100");
+        BigDecimal money = new BigDecimal(orderInfo.getRealAmount().toString());
+        BrandWCPayRequestData payData;
+
+        ClothesType clothesType = clothesTypeMapper.selectById(orderInfo.getTypeId());
+        String productNames = clothesType.getName();
+        MallMember mallMember = mallMemberMapper.selectById(orderInfo.getMemberId());
+        Boolean debug = xcxProperties.getDebug();
+        if (debug) {
+            payData = weixinServiceUtil.createOrder("[测试]" + productNames, orderInfo.getOrderNo(),
+                    1, mallMember.getOpenId(), String.valueOf(orderInfo.getId()));
+        } else {
+            payData = weixinServiceUtil.createOrder(productNames, orderInfo.getOrderNo(),
+                    unit.multiply(money).intValue(),mallMember.getOpenId(), String.valueOf(orderInfo.getId()));
+        }
+        orderInfo.setPayOrderNo(payData.getPrepay_id());
+
+        clothesOrderMapper.update(null,
+                Wrappers.lambdaUpdate(ClothesOrder.class)
+                .set(ClothesOrder::getPayOrderNo, payData.getPrepay_id())
+                .set(ClothesOrder::getUpdatedTime, new Date())
+                .eq(ClothesOrder::getId, orderInfo.getId())
+                );
+        return payData;
+    }
+
+    @Override
     public BrandWCPayRequestData startPaymentActivity(HappyActivityOrder dto) throws Exception {
         BigDecimal unit = new BigDecimal("100");
         BigDecimal money = new BigDecimal(dto.getAmount().toString());
diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
index b0c04f2..d14f5ab 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -17,4 +17,7 @@
     public static final String GET_SCORE_MSG = "queue_get_score_msg";
     public static final String VIP_LEVEL_UP = "queue_vip_level_up";
     public static final String SALE_LEVEL_UP = "queue_sale_level_up";
+
+    ;
+    public static final String CLOTHES_ORDER_CANCEL_DELAY = "queue_order_delay_qay_clothes";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
index e7b9d19..306ae07 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -1,9 +1,6 @@
 package cc.mrbird.febs.rabbit.consumer;
 
-import cc.mrbird.febs.mall.service.HappyActivityService;
-import cc.mrbird.febs.mall.service.IAgentService;
-import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
-import cc.mrbird.febs.mall.service.IMemberProfitService;
+import cc.mrbird.febs.mall.service.*;
 import cc.mrbird.febs.rabbit.constants.QueueConstants;
 import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum;
 import cc.mrbird.febs.vip.service.IVipCommonService;
@@ -26,6 +23,9 @@
 
     @Autowired
     private IApiMallOrderInfoService orderInfoService;
+
+    @Autowired
+    private ApiClothesOrderService apiClothesOrderService;
     @Autowired
     private IAgentService agentService;
     @Autowired
@@ -38,6 +38,15 @@
         log.info("消费者:{}", new String(message.getBody()));
     }
 
+    @RabbitListener(queues = QueueConstants.CLOTHES_ORDER_CANCEL_DELAY)
+    public void orderCancelDelayClothes(String id) {
+        try {
+            apiClothesOrderService.orderCancelDelayClothes(Long.parseLong(id));
+        } catch (Exception e) {
+            log.error("订单超时支付异常", e);
+        }
+    }
+
     @RabbitListener(queues = "queue_order_delay_qay")
     public void orderCancelDelay(String id) {
         try {
diff --git a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
index f79e51c..4432255 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -14,6 +14,9 @@
     ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay", "route_key_order_delay_ttl_qay", "queue_order_delay_ttl_qay"),
     ORDER_CANCEL_DELAY("exchange_order_delay_qay", "route_key_order_delay_qay", "queue_order_delay_qay"),
 
+    CLOTHES_ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay_clothes", "route_key_order_delay_ttl_qay_clothes", "queue_order_delay_ttl_qay_clothes"),
+    CLOTHES_ORDER_CANCEL_DELAY("exchange_order_delay_qay_clothes", "route_key_order_delay_qay_clothes", QueueConstants.CLOTHES_ORDER_CANCEL_DELAY),
+
     AGENT_REUTRN_MONEY("exchange_agent_return_money_qay", "route_key_agent_return_money_qay", "queue_agent_return_money_qay"),
 
     ORDER_RETURN_MONEY("exchange_order_return_money_qay", "route_key_order_return_money_qay", "queue_order_return_money_qay"),
diff --git a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
index d40c39d..ddceb98 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -62,6 +62,17 @@
         });
     }
 
+    public void sendClothesOrderCancelDelayMsg(Long id, Long times) {
+        log.info("发送自动取消订单消息:{}, {}", id, times);
+        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() {
+            @Override
+            public Message postProcessMessage(Message message) throws AmqpException {
+                message.getMessageProperties().setExpiration(String.valueOf(times));
+                return message;
+            }
+        });
+    }
+
     /**
      * 发送代理自动升级消息
      *
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index d7fa3b1..00abd87 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -70,8 +70,8 @@
 #  wecharpaySecret: CSxc168888CSxc168888CSxc168888xc
 xcx:
   wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-  xcx_appid: wxe8454293f5c4c143
-  xcx_secret: 33c3ad513344cf6c16904e5d528b70ea
+  xcx_appid: wx5cc58f796224af61
+  xcx_secret: 0c2715d0c23c6b9959edd2b2eac81b80
   debug: true
   wecharPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/wxpayCallback
   wecharActivityPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/activityOrderCallback
diff --git a/src/main/resources/mapper/modules/ClothesOrderDraftMapper.xml b/src/main/resources/mapper/modules/ClothesOrderDraftMapper.xml
new file mode 100644
index 0000000..e17e850
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesOrderDraftMapper.xml
@@ -0,0 +1,16 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesOrderDraftMapper">
+
+    <select id="selectPageInDraft" resultType="cc.mrbird.febs.mall.vo.clothes.ApiMyDraftVo">
+        select
+            a.*
+        from clothes_order_draft a
+        left join clothes_type b on a.type_id = b.id
+        where a.member_id = #{record.memberId}
+        and a.del_flag = 0
+        and b.state = 1
+        order by a.CREATED_TIME asc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesOrderItemMapper.xml b/src/main/resources/mapper/modules/ClothesOrderItemMapper.xml
new file mode 100644
index 0000000..40e62bf
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesOrderItemMapper.xml
@@ -0,0 +1,7 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesOrderItemMapper">
+
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesOrderMapper.xml b/src/main/resources/mapper/modules/ClothesOrderMapper.xml
new file mode 100644
index 0000000..4edd12c
--- /dev/null
+++ b/src/main/resources/mapper/modules/ClothesOrderMapper.xml
@@ -0,0 +1,7 @@
+<?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="cc.mrbird.febs.mall.mapper.ClothesOrderMapper">
+
+
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1