rayson 11 месяцев назад
Родитель
Сommit
1e9b89fa81
31 измененных файлов с 935 добавлено и 153 удалено
  1. 66 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/appadmin/AppAdminPayOrderController.java
  2. 1 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  3. 17 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/TradeOrderTypeMq.java
  4. 48 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/job/JobStatusEnum.java
  5. 1 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/order/TradeOrderStatusEnum.java
  6. 16 16
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/order/TradeOrderTypeEnum.java
  7. 4 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/order/TradeOrderController.java
  8. 36 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/order/AppTradeOrderController.java
  9. 11 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/order/vo/AppTradeOrderPageReqVO.java
  10. 11 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/order/vo/AppTradeOrderRespVO.java
  11. 2 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java
  12. 57 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/AppAdminTradeOrderController.java
  13. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderCreateReqVO.java
  14. 18 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderGetReqVO.java
  15. 11 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderPageReqVO.java
  16. 19 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderRespVO.java
  17. 4 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderCreateReqVO.java
  18. 59 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderPageReqVO.java
  19. 43 14
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderRespVO.java
  20. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderSimplePageReqVO.java
  21. 40 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeSimpleRespVO.java
  22. 85 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/order/TradeOrderMapper.java
  23. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/PublishJobHireConsumer.java
  24. 35 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/OrderProducer.java
  25. 30 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/scheduled/TradeOrderAutoCancelScheduled.java
  26. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  27. 50 95
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  28. 53 9
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/order/TradeOrderService.java
  29. 117 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/order/TradeOrderServiceImpl.java
  30. 2 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  31. 2 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

+ 66 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/appadmin/AppAdminPayOrderController.java

@@ -0,0 +1,66 @@
+package com.citu.module.pay.controller.appadmin;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.pay.core.enums.channel.PayChannelEnum;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.pay.controller.admin.order.vo.PayOrderRespVO;
+import com.citu.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
+import com.citu.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO;
+import com.citu.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO;
+import com.citu.module.pay.convert.order.PayOrderConvert;
+import com.citu.module.pay.framework.pay.core.WalletPayClient;
+import com.citu.module.pay.service.order.PayOrderService;
+import com.google.common.collect.Maps;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.Objects;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
+import static com.citu.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
+import static com.citu.framework.web.core.util.WebFrameworkUtils.getLoginUserType;
+
+@Tag(name = "App 管理端 - 支付订单")
+@RestController
+@RequestMapping("/pay/order")
+@Validated
+@Slf4j
+public class AppAdminPayOrderController {
+
+    @Resource
+    private PayOrderService payOrderService;
+
+    @GetMapping("/get")
+    @Operation(summary = "获得支付订单")
+    @PreAuthenticated
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<PayOrderRespVO> getOrder(@RequestParam("id") Long id) {
+        return success(PayOrderConvert.INSTANCE.convert(payOrderService.getOrder(id)));
+    }
+
+    @PostMapping("/submit")
+    @PreAuthenticated
+    @Operation(summary = "提交支付订单")
+    public CommonResult<AppPayOrderSubmitRespVO> submitPayOrder(@RequestBody AppPayOrderSubmitReqVO reqVO) {
+        // 1. 钱包支付事,需要额外传 user_id 和 user_type
+        if (Objects.equals(reqVO.getChannelCode(), PayChannelEnum.WALLET.getCode())) {
+            Map<String, String> channelExtras = reqVO.getChannelExtras() == null ?
+                    Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras();
+            channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(getLoginUserId()));
+            channelExtras.put(WalletPayClient.USER_TYPE_KEY, String.valueOf(getLoginUserType()));
+            reqVO.setChannelExtras(channelExtras);
+        }
+
+        // 2. 提交支付
+        PayOrderSubmitRespVO respVO = payOrderService.submitOrder(reqVO, getClientIP());
+        return success(PayOrderConvert.INSTANCE.convert3(respVO));
+    }
+
+}

+ 1 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -442,4 +442,5 @@ public interface ErrorCodeConstants {
     ErrorCode ORDER_GOODS_NAME_NOT_NULL = new ErrorCode(1_100_046_012, "商品名称不能为空");
     ErrorCode ORDER_GOODS_PRICE_NOT_NULL = new ErrorCode(1_100_046_013, "商品金额不能为空");
 
+    ErrorCode ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID = new ErrorCode(1_100_046_014, "交易订单取消失败,订单不是【待支付】状态");
 }

+ 17 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/TradeOrderTypeMq.java

@@ -0,0 +1,17 @@
+package com.citu.module.menduner.system.enums;
+
+/**
+ * @author Rayson
+ * 交易订单类型mq主题
+ **/
+public class TradeOrderTypeMq {
+
+    /** 平台订单 **/
+    public static final String PLATFORM_ORDER_TOPIC = "PLATFORM_ORDER_TOPIC";
+
+    /** 发布职位订单 **/
+    public static final String PUBLISH_JOB_ORDER_TOPIC = "PUBLISH_JOB_ORDER_TOPIC";
+
+    /** 发布众聘职位订单 **/
+    public static final String PUBLISH_JOB_HIRE_ORDER_TOPIC = "PUBLISH_JOB_HIRE_ORDER_TOPIC";
+}

+ 48 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/job/JobStatusEnum.java

@@ -0,0 +1,48 @@
+package com.citu.module.menduner.system.enums.job;
+
+import cn.hutool.core.util.ObjUtil;
+import com.citu.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * 职位状态(0开启|1关闭|99待开启)
+ **/
+@Getter
+@AllArgsConstructor
+public enum JobStatusEnum implements IntArrayValuable {
+    ENABLE("0", "开启"),
+    DISABLE("1", "关闭"),
+    WAIT_ENABLE("99", "待开启"),
+    ;
+
+    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(c->Integer.parseInt(c.status)).toArray();
+
+    /**
+     * 状态值
+     */
+    private final String status;
+    /**
+     * 状态名
+     */
+    private final String name;
+
+    @Override
+    public int[] array() {
+        return ARRAYS;
+    }
+
+    public static boolean isEnable(Integer status) {
+        return ObjUtil.equal(ENABLE.status, status);
+    }
+
+    public static boolean isDisable(Integer status) {
+        return ObjUtil.equal(DISABLE.status, status);
+    }
+    public static boolean isWaitEnable(Integer status) {
+        return ObjUtil.equal(WAIT_ENABLE.status, status);
+    }
+}
+

+ 1 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/order/TradeOrderStatusEnum.java

@@ -14,6 +14,7 @@ import lombok.RequiredArgsConstructor;
 public enum TradeOrderStatusEnum {
 
     UNPAID("0", "待支付"),
+    COMPLETED("10", "已完成"),
     CANCELED("99", "已取消");
 
     /**

+ 16 - 16
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/order/TradeOrderTypeEnum.java

@@ -1,6 +1,6 @@
 package com.citu.module.menduner.system.enums.order;
 
-import cn.hutool.core.util.ObjectUtil;
+import com.citu.module.menduner.system.enums.TradeOrderTypeMq;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
@@ -13,9 +13,9 @@ import lombok.RequiredArgsConstructor;
 @Getter
 public enum TradeOrderTypeEnum {
 
-    PLATFORM_ORDER("0", "平台订单"),
-    USER_ORDER("10", "求职端订单"),
-    ENTERPRISE_USER_ORDER("20", "招聘端订单"),
+    PLATFORM_ORDER("0", "平台", TradeOrderTypeMq.PLATFORM_ORDER_TOPIC),
+    PUBLISH_JOB_ORDER("1", "发布职位", TradeOrderTypeMq.PUBLISH_JOB_ORDER_TOPIC),
+    PUBLISH_JOB_HIRE_ORDER("2", "发布众聘职位", TradeOrderTypeMq.PUBLISH_JOB_HIRE_ORDER_TOPIC),
 
     ;
 
@@ -27,18 +27,18 @@ public enum TradeOrderTypeEnum {
      * 类型名
      */
     private final String name;
-
-
-    public static boolean isPlatformOrder(Integer type) {
-        return ObjectUtil.equal(type, PLATFORM_ORDER.getType());
-    }
-
-    public static boolean isUserOrder(Integer type) {
-        return ObjectUtil.equal(type, USER_ORDER.getType());
-    }
-
-    public static boolean isEnterpriseUserOrder(Integer type) {
-        return ObjectUtil.equal(type, ENTERPRISE_USER_ORDER.getType());
+    /**
+     * topic
+     */
+    private final String topic;
+
+    public static TradeOrderTypeEnum getByType(String type) {
+        for (TradeOrderTypeEnum tradeOrderTypeEnum : TradeOrderTypeEnum.values()) {
+            if (tradeOrderTypeEnum.getType().equals(type)) {
+                return tradeOrderTypeEnum;
+            }
+        }
+        return TradeOrderTypeEnum.PLATFORM_ORDER;
     }
 
 

+ 4 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/order/TradeOrderController.java

@@ -4,6 +4,7 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.base.order.TradeOrderCreateReqVO;
+import com.citu.module.menduner.system.controller.base.order.TradeOrderPageReqVO;
 import com.citu.module.menduner.system.controller.base.order.TradeOrderRespVO;
 import com.citu.module.menduner.system.convert.TradeOrderConvert;
 import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
@@ -24,7 +25,7 @@ import javax.validation.Valid;
 import static com.citu.framework.common.pojo.CommonResult.success;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
 
-@Tag(name = "管理后台 - 订单")
+@Tag(name = "管理后台 - 交易订单")
 @RestController
 @RequestMapping("/menduner/system/trade/order")
 @Validated
@@ -43,8 +44,8 @@ public class TradeOrderController {
     @GetMapping("/page")
     @Operation(summary = "获得订单分页")
     @PreAuthorize("@ss.hasPermission('menduner:system:trade-order:query')")
-    public CommonResult<PageResult<TradeOrderRespVO>> getOrderPage(@Valid PageParam pageVO) {
-        PageResult<TradeOrderDO> pageResult = tradeOrderService.getOrderPage(pageVO);
+    public CommonResult<PageResult<TradeOrderRespVO>> getOrderPage(@Valid TradeOrderPageReqVO reqVO) {
+        PageResult<TradeOrderDO> pageResult = tradeOrderService.getOrderPage(reqVO);
         return success(TradeOrderConvert.INSTANCE.convertPage(pageResult));
     }
 

+ 36 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/order/AppTradeOrderController.java

@@ -0,0 +1,36 @@
+package com.citu.module.menduner.system.controller.app.order;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderRespVO;
+import com.citu.module.menduner.system.service.order.TradeOrderService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "求职端 - 交易订单")
+@RestController
+@RequestMapping("/menduner/system/trade/order")
+@Validated
+public class AppTradeOrderController {
+
+    @Resource
+    private TradeOrderService tradeOrderService;
+    
+    @GetMapping("/page")
+    @Operation(summary = "获得订单分页")
+    @PreAuthenticated
+    public CommonResult<PageResult<AppTradeOrderRespVO>> page(@Valid AppTradeOrderPageReqVO reqVO) {
+        return success(tradeOrderService.page(reqVO));
+    }
+}

+ 11 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/order/vo/AppTradeOrderPageReqVO.java

@@ -0,0 +1,11 @@
+package com.citu.module.menduner.system.controller.app.order.vo;
+
+import com.citu.module.menduner.system.controller.base.order.TradeOrderSimplePageReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "求职端 - 交易订单分页查询 Request VO")
+@Data
+public class AppTradeOrderPageReqVO extends TradeOrderSimplePageReqVO {
+
+}

+ 11 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/order/vo/AppTradeOrderRespVO.java

@@ -0,0 +1,11 @@
+package com.citu.module.menduner.system.controller.app.order.vo;
+
+import com.citu.module.menduner.system.controller.base.order.TradeSimpleRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "求职端 - 交易订单分页 Response VO")
+public class AppTradeOrderRespVO extends TradeSimpleRespVO {
+
+}

+ 2 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java

@@ -58,9 +58,8 @@ public class AppAdminJobAdvertisedController {
     @PreAuthenticated
     @PostMapping("/save")
     @Operation(summary = "保存职位(发布/编辑)")
-    public CommonResult<Boolean> save(@RequestBody @Valid AppAdminJobSaveReqVO pageReqVO) {
-        jobAdvertisedService.save(pageReqVO);
-        return success(true);
+    public CommonResult<Long> save(@RequestBody @Valid AppAdminJobSaveReqVO pageReqVO) {
+        return success(jobAdvertisedService.save(pageReqVO));
     }
 
     @PreAuthenticated

+ 57 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/AppAdminTradeOrderController.java

@@ -0,0 +1,57 @@
+package com.citu.module.menduner.system.controller.appadmin.order;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderCreateReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderGetReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderRespVO;
+import com.citu.module.menduner.system.convert.TradeOrderConvert;
+import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
+import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
+import com.citu.module.menduner.system.service.order.TradeOrderService;
+import com.citu.module.pay.api.order.dto.PayOrderRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "招聘端 - 交易订单")
+@RestController
+@RequestMapping("/menduner/system/trade/order")
+@Validated
+public class AppAdminTradeOrderController {
+
+    @Resource
+    private TradeOrderService tradeOrderService;
+
+    @GetMapping("/page")
+    @Operation(summary = "获得订单分页")
+    @PreAuthenticated
+    public CommonResult<PageResult<AppAdminTradeOrderRespVO>> page(@Valid AppAdminTradeOrderPageReqVO reqVO) {
+        return success(tradeOrderService.page(reqVO));
+    }
+
+    @PostMapping("/create")
+    @Operation(summary = "创建订单")
+    @PreAuthenticated
+    public CommonResult<Long> create(@RequestBody @Valid AppAdminTradeOrderCreateReqVO reqVO) {
+        return success(tradeOrderService.create(reqVO));
+    }
+
+    @GetMapping("/get/unpaid")
+    @Operation(summary = "获取待支付的订单")
+    @PreAuthenticated
+    public CommonResult<AppAdminTradeOrderRespVO> getOrderByUnpaid(@Valid AppAdminTradeOrderGetReqVO reqVO) {
+        AppAdminTradeOrderRespVO order = tradeOrderService.getOrderByUnpaid(reqVO);
+        return success(order);
+    }
+
+}

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderCreateReqVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.controller.appadmin.order.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Schema(description = "招聘端 - 交易订单创建 Request VO")
+@Data
+public class AppAdminTradeOrderCreateReqVO {
+
+
+    @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682")
+    @NotNull(message = "商品编号不能为空")
+    private Long spuId;
+
+    @Schema(description = "商品名称", example = "李四")
+    @NotBlank(message = "{1_100_046_012}")
+    private String spuName;
+
+    @Schema(description = "价格", example = "30381")
+    @NotNull(message = "{1_100_046_013}")
+    private BigDecimal price;
+
+    @Schema(description = "订单类型 0平台订单|1发布职位订单|2发布众聘职位订单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private String type;
+
+
+}

+ 18 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderGetReqVO.java

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.system.controller.appadmin.order.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "招聘端 - 交易订单获取 Request VO")
+@Data
+public class AppAdminTradeOrderGetReqVO {
+
+    @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682")
+    @NotNull(message = "商品编号不能为空")
+    private Long spuId;
+
+    @Schema(description = "订单类型 0平台订单|1发布职位订单|2发布众聘职位订单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private String type;
+}

+ 11 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderPageReqVO.java

@@ -0,0 +1,11 @@
+package com.citu.module.menduner.system.controller.appadmin.order.vo;
+
+import com.citu.module.menduner.system.controller.base.order.TradeOrderPageReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "招聘端 - 交易订单分页查询 Request VO")
+@Data
+public class AppAdminTradeOrderPageReqVO extends TradeOrderPageReqVO {
+
+}

+ 19 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/order/vo/AppAdminTradeOrderRespVO.java

@@ -0,0 +1,19 @@
+package com.citu.module.menduner.system.controller.appadmin.order.vo;
+
+import com.citu.module.menduner.system.controller.base.order.TradeSimpleRespVO;
+import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
+import com.citu.module.pay.api.order.dto.PayOrderRespDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "招聘端 - 交易订单分页 Response VO")
+public class AppAdminTradeOrderRespVO  {
+
+    @Schema(description = "业务订单")
+    private TradeOrderDO order;
+
+    @Schema(description = "支付订单")
+    private PayOrderRespDTO payOrder;
+
+}

+ 4 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderCreateReqVO.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.controller.base.order;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
@@ -8,8 +9,9 @@ import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 
-@Schema(description = "管理后台 - 订单创建 Request VO")
+@Schema(description = "管理后台 - 交易订单创建 Request VO")
 @Data
+@Builder
 public class TradeOrderCreateReqVO {
 
 
@@ -24,12 +26,11 @@ public class TradeOrderCreateReqVO {
     @NotNull(message = "商品编号不能为空")
     private Long spuId;
 
-    @Schema(description = "商家备注", example = "李四")
+    @Schema(description = "商品名称", example = "李四")
     @NotBlank(message = "{1_100_046_012}")
     private String spuName;
 
     @Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381")
-    @NotNull(message = "{1_100_046_013}")
     private BigDecimal price;
 
 }

+ 59 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderPageReqVO.java

@@ -0,0 +1,59 @@
+package com.citu.module.menduner.system.controller.base.order;
+
+import com.citu.framework.common.enums.TerminalEnum;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.module.menduner.system.enums.order.TradeOrderStatusEnum;
+import com.citu.module.menduner.system.enums.order.TradeOrderTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 交易订单分页查询 Request VO")
+@Data
+public class TradeOrderPageReqVO extends PageParam {
+
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long id;
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long userId;
+
+    @Schema(description = "订单类型 0平台订单|1求职端订单|2招聘端订单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private String type;
+
+    @Schema(description = "订单来源")
+    private String terminal;
+
+    @Schema(description = "用户 IP")
+    private String userIp;
+
+    @Schema(description = "订单状态")
+    private String status;
+
+    @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682")
+    private Long spuId;
+
+    @Schema(description = "商品名称", example = "李四")
+    private String spuName;
+
+    @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Boolean payStatus;
+
+    @Schema(description = "支付订单编号", example = "16863")
+    private Long payOrderId;
+
+    @Schema(description = "订单支付时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] payTime;
+
+    @Schema(description = "支付渠道")
+    private String payChannelCode;
+
+}

+ 43 - 14
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderRespVO.java

@@ -1,5 +1,10 @@
 package com.citu.module.menduner.system.controller.base.order;
 
+import com.citu.framework.common.enums.TerminalEnum;
+import com.citu.module.menduner.system.enums.order.TradeOrderCancelTypeEnum;
+import com.citu.module.menduner.system.enums.order.TradeOrderRefundStatusEnum;
+import com.citu.module.menduner.system.enums.order.TradeOrderStatusEnum;
+import com.citu.module.menduner.system.enums.order.TradeOrderTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -16,40 +21,64 @@ public class TradeOrderRespVO {
     @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long id;
 
-    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23199")
+    @Schema(description = "用户编号")
     private Long userId;
 
-    @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682")
+    // ========== 订单基本信息 ==========
+
+    @Schema(description = "订单类型")
+    private String type;
+
+    @Schema(description = "订单来源")
+    private String terminal;
+
+    @Schema(description = "用户 IP")
+    private String userIp;
+
+    @Schema(description = "订单状态")
+    private String status;
+
+    @Schema(description = "商品编号")
     private Long spuId;
 
-    @Schema(description = "商家备注", example = "李四")
+    @Schema(description = "商品名称")
     private String spuName;
 
-    @Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381")
+    @Schema(description = "价格")
     private BigDecimal price;
 
-    @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "订单取消时间")
+    private LocalDateTime cancelTime;
+
+    @Schema(description = "取消类型")
+    private String cancelType;
+
+    // ========== 支付相关字段 ==========
+
+    @Schema(description = "是否支付")
     private Boolean payStatus;
 
-    @Schema(description = "支付订单编号", example = "16863")
+    @Schema(description = "支付订单编号")
     private Long payOrderId;
 
-    @Schema(description = "订单支付时间")
+    @Schema(description = "付时间")
     private LocalDateTime payTime;
 
-    @Schema(description = "支付渠道", example = "alipay_qr")
+    @Schema(description = "支付渠道")
     private String payChannelCode;
 
-    @Schema(description = "支付退款编号", example = "23366")
+    // ========== 退款相关字段 ==========
+
+    @Schema(description = "退款状态")
+    private String refundStatus;
+
+    @Schema(description = "支付退款单号")
     private Long payRefundId;
 
-    @Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "14039")
+    @Schema(description = "退款金额")
     private BigDecimal refundPrice;
 
-    @Schema(description = "退款时间")
+    @Schema(description = "退款完成时间")
     private LocalDateTime refundTime;
 
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    private LocalDateTime createTime;
-
 }

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeOrderSimplePageReqVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.controller.base.order;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "求职端 - 交易订单分页查询 Request VO")
+@Data
+public class TradeOrderSimplePageReqVO extends PageParam {
+
+    @Schema(description = "商品名称", example = "李四")
+    private String spuName;
+
+    @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Boolean payStatus;
+
+    @Schema(description = "支付订单编号", example = "16863")
+    private Long payOrderId;
+
+    @Schema(description = "订单支付时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] payTime;
+
+    @Schema(description = "支付渠道")
+    private String payChannelCode;
+}

+ 40 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/order/TradeSimpleRespVO.java

@@ -0,0 +1,40 @@
+package com.citu.module.menduner.system.controller.base.order;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@Schema(description = "交易订单分页 Response VO")
+public class TradeSimpleRespVO extends TradeOrderRespVO {
+
+    @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long id;
+
+    @Schema(description = "商家备注", example = "李四")
+    private String spuName;
+
+    @Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381")
+    private BigDecimal price;
+
+    @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Boolean payStatus;
+
+    @Schema(description = "订单支付时间")
+    private LocalDateTime payTime;
+
+    @Schema(description = "支付渠道", example = "alipay_qr")
+    private String payChannelCode;
+
+    @Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "14039")
+    private BigDecimal refundPrice;
+
+    @Schema(description = "退款时间")
+    private LocalDateTime refundTime;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+}

+ 85 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/order/TradeOrderMapper.java

@@ -1,12 +1,22 @@
 package com.citu.module.menduner.system.dal.mysql.order;
 
-import com.citu.framework.common.pojo.PageParam;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.framework.mybatis.core.query.MPJLambdaWrapperX;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderRespVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderRespVO;
+import com.citu.module.menduner.system.controller.base.order.TradeOrderPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
+import com.citu.module.menduner.system.enums.order.TradeOrderStatusEnum;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * 订单 Mapper
  *
@@ -15,9 +25,20 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
 
-    default PageResult<TradeOrderDO> selectPage(PageParam reqVO) {
+    default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
-                .orderByDesc(TradeOrderDO::getId));
+                .eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(TradeOrderDO::getType, reqVO.getType())
+                .eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
+                .eqIfPresent(TradeOrderDO::getUserIp, reqVO.getUserIp())
+                .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(TradeOrderDO::getSpuId, reqVO.getSpuId())
+                .likeIfPresent(TradeOrderDO::getSpuName, reqVO.getSpuName())
+                .eqIfPresent(TradeOrderDO::getPayStatus, reqVO.getPayStatus())
+                .eqIfPresent(TradeOrderDO::getPayOrderId, reqVO.getPayOrderId())
+                .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
+                .betweenIfPresent(TradeOrderDO::getPayTime, reqVO.getPayTime())
+                .orderByDesc(TradeOrderDO::getCreateTime));
     }
 
     default int updateByIdAndPayed(Long id, boolean wherePayed, TradeOrderDO updateObj) {
@@ -25,4 +46,65 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eq(TradeOrderDO::getId, id).eq(TradeOrderDO::getPayStatus, wherePayed));
     }
 
+
+    /**
+     * 求职端分页查询
+     */
+    default PageResult<AppTradeOrderRespVO> page(Long userId,AppTradeOrderPageReqVO reqVO) {
+        MPJLambdaWrapperX<TradeOrderDO> query = new MPJLambdaWrapperX<>();
+        query.selectAll(TradeOrderDO.class);
+        query.eq(TradeOrderDO::getUserId, userId);
+        query.likeIfPresent(TradeOrderDO::getSpuName, reqVO.getSpuName())
+                .eqIfPresent(TradeOrderDO::getPayStatus, reqVO.getPayStatus())
+                .eqIfPresent(TradeOrderDO::getPayOrderId, reqVO.getPayOrderId())
+                .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
+                .betweenIfPresent(TradeOrderDO::getPayTime, reqVO.getPayTime());
+        query.orderByDesc(TradeOrderDO::getCreateTime);
+        return selectJoinPage(reqVO, AppTradeOrderRespVO.class, query);
+    }
+
+    /**
+     * 求职端分页查询
+     */
+    default PageResult<AppAdminTradeOrderRespVO> page(AppAdminTradeOrderPageReqVO reqVO) {
+        MPJLambdaWrapperX<TradeOrderDO> query = new MPJLambdaWrapperX<>();
+        query.selectAll(TradeOrderDO.class);
+        query.eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(TradeOrderDO::getType, reqVO.getType())
+                .eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
+                .eqIfPresent(TradeOrderDO::getUserIp, reqVO.getUserIp())
+                .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(TradeOrderDO::getSpuId, reqVO.getSpuId())
+                .likeIfPresent(TradeOrderDO::getSpuName, reqVO.getSpuName())
+                .eqIfPresent(TradeOrderDO::getPayStatus, reqVO.getPayStatus())
+                .eqIfPresent(TradeOrderDO::getPayOrderId, reqVO.getPayOrderId())
+                .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
+                .betweenIfPresent(TradeOrderDO::getPayTime, reqVO.getPayTime());
+        query.orderByDesc(TradeOrderDO::getCreateTime);
+        return selectJoinPage(reqVO, AppAdminTradeOrderRespVO.class, query);
+    }
+
+
+    /** 获取待支付的订单 */
+    default TradeOrderDO getOrderByUnpaid(Long userId,String type,Long spu_id) {
+        return selectOne(new LambdaQueryWrapperX<TradeOrderDO>()
+                .eq(TradeOrderDO::getUserId, userId)
+                .eq(TradeOrderDO::getType, type)
+                .eq(TradeOrderDO::getSpuId, spu_id)
+                .eq(TradeOrderDO::getStatus, TradeOrderStatusEnum.UNPAID.getStatus())
+                .orderByDesc(TradeOrderDO::getCreateTime)
+        );
+
+    }
+
+    default List<TradeOrderDO> selectListByStatusAndCreateTimeLt(String status, LocalDateTime createTime) {
+        return selectList(new LambdaUpdateWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getStatus, status)
+                .lt(TradeOrderDO::getCreateTime, createTime));
+    }
+
+    default int updateByIdAndStatus(Long id, String status, TradeOrderDO update) {
+        return update(update, new LambdaUpdateWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getId, id).eq(TradeOrderDO::getStatus, status));
+    }
 }

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/PublishJobHireConsumer.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.mq.consumer;
+
+
+import com.citu.module.menduner.system.enums.TradeOrderTypeMq;
+import com.citu.module.menduner.system.service.job.JobAdvertisedService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+
+/**
+ * 众聘职位完成支付 消费
+ **/
+@Slf4j
+@Component
+@RocketMQMessageListener(
+        topic = TradeOrderTypeMq.PUBLISH_JOB_HIRE_ORDER_TOPIC,
+        consumerGroup = TradeOrderTypeMq.PUBLISH_JOB_HIRE_ORDER_TOPIC + "_CONSUMER"
+)
+public class PublishJobHireConsumer implements RocketMQListener<Long> {
+
+    @Resource
+    private JobAdvertisedService service;
+
+    @Override
+    public void onMessage(Long jobId) {
+        log.info("接收到队列消息[{}]", jobId);
+        service.enable(Collections.singletonList(jobId));
+    }
+}

+ 35 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/OrderProducer.java

@@ -0,0 +1,35 @@
+package com.citu.module.menduner.system.mq.producer;
+
+import com.citu.module.menduner.system.enums.order.TradeOrderTypeEnum;
+import com.citu.module.menduner.system.mq.message.ESJobAdvertisedMergeSendMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 订单 Producer
+ *
+ * @author Rayson
+ */
+@Slf4j
+@Component
+public class OrderProducer {
+
+    @Resource
+    private RocketMQTemplate rocketMQTemplate;
+
+    public void send(Long spuId, TradeOrderTypeEnum type) {
+        Message<?> message = MessageBuilder.withPayload(spuId).build();
+        rocketMQTemplate.syncSend(
+                type.getTopic(),
+                message,
+                10000,
+                // 1s
+                1
+        );
+    }
+}

+ 30 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/scheduled/TradeOrderAutoCancelScheduled.java

@@ -0,0 +1,30 @@
+package com.citu.module.menduner.system.scheduled;
+
+import com.citu.framework.tenant.core.aop.TenantIgnore;
+import com.citu.module.menduner.system.service.order.TradeOrderService;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 交易订单的自动过期 Job
+ *
+ * @author Rayson
+ */
+@Component
+public class TradeOrderAutoCancelScheduled {
+
+    @Resource
+    private TradeOrderService service;
+
+    @Async
+    @TenantIgnore
+    @Scheduled(cron = "*/5 * * * * *")
+    public String execute() {
+        int count = service.cancelOrderBySystem();
+        return String.format("过期订单 %s 个", count);
+    }
+
+}

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java

@@ -13,6 +13,7 @@ import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedPageReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.job.JobStatusEnum;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -134,7 +135,7 @@ public interface JobAdvertisedService {
     /**
      * 保存职位
      **/
-    boolean save(AppAdminJobSaveReqVO reqVO);
+    Long save(AppAdminJobSaveReqVO reqVO);
 
     /**
      * 开启职位

+ 50 - 95
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java

@@ -25,9 +25,9 @@ import com.citu.module.menduner.system.dal.dataobject.job.JobInterestedDO;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import com.citu.module.menduner.system.dal.mysql.job.JobInterestedMapper;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.enums.account.BalanceBizTypeEnum;
 import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.system.enums.job.JobStatusEnum;
 import com.citu.module.menduner.system.mq.producer.ESProducer;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
@@ -40,7 +40,10 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -209,18 +212,6 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
     @Override
     public PageResult<AppEnterpriseJobHomeRespVO> getHotEnterpriseJobPage(PageParam pageParam) {
-//        PageResult<AppEnterpriseJobHomeRespVO> result = new PageResult<>();
-//        PageResult<AppEnterpriseSimpleRespVO> enterpriseSimplePage = enterpriseService.getEnterpriseSimplePage(pageParam);
-//        result.setTotal(enterpriseSimplePage.getTotal());
-//        List<AppEnterpriseJobHomeRespVO> list = new ArrayList<>();
-//        enterpriseSimplePage.getList().forEach(enterprise -> {
-//            AppEnterpriseJobHomeRespVO respVO = new AppEnterpriseJobHomeRespVO();
-//            respVO.setEnterprise(enterprise);
-//            List<JobAdvertisedDO> jobList = jobAdvertisedMapper.selectByEnterpriseId(enterprise.getId());
-//            respVO.setJobList(JobAdvertisedConvert.INSTANCE.convertListSimple(jobList));
-//            list.add(respVO);
-//        });
-//        result.setList(list);
         PageResult<AppEnterpriseJobHomeRespVO> result =
                 jobAdvertisedMapper.getEnterpriseJobPage(pageParam);
         if (result.getList().isEmpty()) {
@@ -314,7 +305,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
     @Override
     @DSTransactional
-    public boolean save(AppAdminJobSaveReqVO reqVO) {
+    public Long save(AppAdminJobSaveReqVO reqVO) {
         LoginUser loginUser = LoginUserContext.get();
         JobAdvertisedDO job = JobAdvertisedConvert.INSTANCE.convert3(reqVO);
         Long enterpriseId = LoginUserContext.getEnterpriseId(loginUser);
@@ -322,11 +313,12 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             // 新增
             job.setUserId(loginUser.getId());
             job.setEnterpriseId(enterpriseId);
-            job.setStatus(MendunerStatusEnum.ENABLE.getStatus());
+            job.setStatus(JobStatusEnum.ENABLE.getStatus());
             job.setTop(false);
             if (!job.getHire()) {
                 job.setHirePoint(0);
                 job.setHirePrice(BigDecimal.ZERO);
+                job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
             }
             // 后置处理
             jobOperateAfter(enterpriseId, loginUser.getId(), job, ESOperateEnum.ADD);
@@ -336,40 +328,18 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             JobAdvertisedDO entity = get(reqVO.getId());
             // 效验
             validUpdate(enterpriseId, loginUser.getId(), entity, reqVO);
-
+            // 是否是平台职位切换成众聘的职位
+            if (reqVO.getHire() && !entity.getHire()) {
+                // 普通职位切换众聘职位则进入判断,众聘切普通不进入判断
+                job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
+            }
             job.setId(entity.getId());
             // 后置处理
             jobOperateAfter(enterpriseId, loginUser.getId(), job, ESOperateEnum.UPDATE);
         }
-        return true;
+        return job.getId();
     }
 
-    /**
-     * 效验职位发布的编辑
-     *
-     * @param enterpriseId 当前操作账户所在的企业
-     * @param userId       操作的用户
-     * @param reqVO        发布的职位信息
-     **/
-    public void validAdd(Long enterpriseId,
-                         Long userId,
-                         AppAdminJobSaveReqVO reqVO) {
-        if (reqVO.getHire()) {
-            if (null != reqVO.getHirePrice()) {
-                //                // 计算需要支付的额外费用(如果是新职位,就是全额;如果是修改,就是差额)
-                //                boolean result = enterpriseAccountService
-                //                        .checkBalance(enterpriseId, userId, reqVO.getHirePrice());
-                //                if (!result) {
-                //                    // 余额不足
-                //                    throw exception(MDE_ENTERPRISE_ACCOUNT_BALANCE_NOT_ENOUGH);
-                //                }
-            }
-            if (null != reqVO.getHirePoint()) {
-                // 积分
-            }
-        }
-
-    }
 
     /**
      * 效验职位发布的编辑
@@ -384,40 +354,23 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
                             JobAdvertisedDO entity,
                             AppAdminJobSaveReqVO reqVO) {
 
-        if (!Objects.equals(userId, entity.getUserId())
-                || !Objects.equals(enterpriseId, entity.getEnterpriseId())) {
-            // TODO 不是自己的数据 (企业管理员更改企业其他用户发布的职位信息)
-            // throw exception(FORBIDDEN);
-        }
-
         if (reqVO.getHire()) {
-//            if (null != reqVO.getHirePrice()) {
-//                // 计算需要支付的额外费用(如果是新职位,就是全额;如果是修改,就是差额)
-//                BigDecimal extraCost = reqVO.getId() == null ? reqVO.getHirePrice()
-//                        : reqVO.getHirePrice().subtract(entity.getHirePrice());
-//
-//                boolean result = enterpriseAccountService
-//                        .checkBalance(enterpriseId, userId, extraCost);
-//                if (!result) {
-//                    // 余额不足
-//                    throw exception(MDE_ENTERPRISE_ACCOUNT_BALANCE_NOT_ENOUGH);
-//                }
-//            }
-            // TODO 暂时不给改,不清楚逻辑
-            if (null != reqVO.getHirePrice()) {
+            // price 不为空 && 之前是众聘的职位(防止平台职位切换成众聘职位这种情况)
+            if (null != reqVO.getHirePrice() && entity.getHire()) {
                 if (entity.getHirePrice().compareTo(reqVO.getHirePrice()) != 0) {
                     throw exception(MDE_JOB_ADVERTISED_BALANCE_UPDATE);
                 }
             }
-            if (null != reqVO.getHirePoint()) {
+            // price 不为空 && 之前是众聘的职位(防止平台职位切换成众聘职位这种情况)
+            if (null != reqVO.getHirePoint() && entity.getHire()) {
                 // 积分
                 if (!entity.getHirePoint().equals(reqVO.getHirePoint())) {
                     throw exception(MDE_JOB_ADVERTISED_POINT_UPDATE);
                 }
             }
-
         }
 
+
     }
 
     public JobAdvertisedDO get(Long id) {
@@ -433,11 +386,11 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     public boolean enable(List<Long> ids) {
         for (Long id : ids) {
             JobAdvertisedDO job = get(id);
-            if (MendunerStatusEnum.ENABLE.getStatus().equals(job.getStatus())) {
+            if (JobStatusEnum.ENABLE.getStatus().equals(job.getStatus())) {
                 // 已经是开启状态
                 return true;
             }
-            job.setStatus(MendunerStatusEnum.ENABLE.getStatus());
+            job.setStatus(JobStatusEnum.ENABLE.getStatus());
             jobAdvertisedMapper.updateById(job);
             jobDataSync(job, ESOperateEnum.UPDATE);
         }
@@ -449,11 +402,11 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     public boolean disable(List<Long> ids) {
         for (Long id : ids) {
             JobAdvertisedDO job = get(id);
-            if (MendunerStatusEnum.DISABLE.getStatus().equals(job.getStatus())) {
+            if (JobStatusEnum.DISABLE.getStatus().equals(job.getStatus())) {
                 // 已经是关闭状态
                 return true;
             }
-            job.setStatus(MendunerStatusEnum.DISABLE.getStatus());
+            job.setStatus(JobStatusEnum.DISABLE.getStatus());
             jobAdvertisedMapper.updateById(job);
             jobDataSync(job, ESOperateEnum.UPDATE);
         }
@@ -513,31 +466,33 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         }
 
         // ========== 众聘处理 ==========
-        if (job.getHire()) {
-            if (null != job.getHirePrice()) {
-                // 创建记录 并扣除余额
-                accountRecordService.createBalanceRecord(
-                        userId,
-                        BalanceBizTypeEnum.PUBLISH.getName(),
-                        MathOperationEnum.SUBTRACT,
-                        job.getHirePrice(),
-                        BalanceBizTypeEnum.PUBLISH,
-                        String.valueOf(job.getId()));
-            }
-            if (null != job.getHirePoint()) {
-                // 创建记录 并扣除积分
-                accountRecordService.createPointRecord(
-                        userId,
-                        "",
-                        PointBizTypeEnum.PUBLISH.getName(),
-                        MathOperationEnum.SUBTRACT,
-                        job.getHirePoint(),
-                        PointBizTypeEnum.PUBLISH,
-                        String.valueOf(job.getId()));
-
-            }
-
-        }
+        // TODO 待改
+
+        //        if (job.getHire()) {
+        //            if (null != job.getHirePrice()) {
+        //                // 创建记录 并扣除余额
+        //                accountRecordService.createBalanceRecord(
+        //                        userId,
+        //                        BalanceBizTypeEnum.PUBLISH.getName(),
+        //                        MathOperationEnum.SUBTRACT,
+        //                        job.getHirePrice(),
+        //                        BalanceBizTypeEnum.PUBLISH,
+        //                        String.valueOf(job.getId()));
+        //            }
+        //            if (null != job.getHirePoint()) {
+        //                // 创建记录 并扣除积分
+        //                accountRecordService.createPointRecord(
+        //                        userId,
+        //                        "",
+        //                        PointBizTypeEnum.PUBLISH.getName(),
+        //                        MathOperationEnum.SUBTRACT,
+        //                        job.getHirePoint(),
+        //                        PointBizTypeEnum.PUBLISH,
+        //                        String.valueOf(job.getId()));
+        //
+        //            }
+        //
+        //        }
 
 
         // ========== ES数据同步处理 ==========

+ 53 - 9
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/order/TradeOrderService.java

@@ -1,11 +1,16 @@
 package com.citu.module.menduner.system.service.order;
 
-import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderRespVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderCreateReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderGetReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderRespVO;
 import com.citu.module.menduner.system.controller.base.order.TradeOrderCreateReqVO;
+import com.citu.module.menduner.system.controller.base.order.TradeOrderPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
-
-import javax.validation.Valid;
+import com.citu.module.pay.api.order.dto.PayOrderRespDTO;
 
 /**
  * 订单 Service 接口
@@ -33,15 +38,15 @@ public interface TradeOrderService {
     /**
      * 获得订单分页
      *
-     * @param pageReqVO 分页查询
+     * @param reqVO 分页查询
      * @return 订单分页
      */
-    PageResult<TradeOrderDO> getOrderPage(PageParam pageReqVO);
+    PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO);
 
     /**
      * 更新订单为已支付
      *
-     * @param id 编号
+     * @param id         编号
      * @param payOrderId 支付订单号
      */
     void updateOrderPaid(Long id, Long payOrderId);
@@ -49,7 +54,7 @@ public interface TradeOrderService {
     /**
      * 发起订单的退款
      *
-     * @param id 编号
+     * @param id     编号
      * @param userIp 用户编号
      */
     void refundOrder(Long id, String userIp);
@@ -57,11 +62,50 @@ public interface TradeOrderService {
     /**
      * 更新订单为已退款
      *
-     * @param id 编号
+     * @param id          编号
      * @param payRefundId 退款订单号
      */
     void updateOrderRefunded(Long id, Long payRefundId);
 
-    // TODO 取消订单
+    /**
+     * 【系统】自动取消订单
+     *
+     * @return 取消数量
+     */
+    int cancelOrderBySystem();
+
+    // ========== 求职端 ==========
+    /**
+     * 获得订单分页
+     *
+     * @param reqVO 分页查询
+     * @return 订单分页
+     */
+    PageResult<AppTradeOrderRespVO> page(AppTradeOrderPageReqVO reqVO);
+
+
+    // ========== 招聘端 ==========
+    /**
+     * 获得订单分页
+     *
+     * @param reqVO 分页查询
+     * @return 订单分页
+     */
+    PageResult<AppAdminTradeOrderRespVO> page(AppAdminTradeOrderPageReqVO reqVO);
 
+    /**
+     * 创建订单
+     *
+     * @param reqVO 创建信息
+     * @return 编号
+     */
+    Long create(AppAdminTradeOrderCreateReqVO reqVO);
+
+    /**
+     * 获得未支付的订单
+     *
+     * @param reqVO  参数
+     * @return 订单
+     */
+    AppAdminTradeOrderRespVO getOrderByUnpaid(AppAdminTradeOrderGetReqVO reqVO);
 }

+ 117 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/order/TradeOrderServiceImpl.java

@@ -1,13 +1,24 @@
 package com.citu.module.menduner.system.service.order;
 
-import com.citu.framework.common.pojo.PageParam;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.app.order.vo.AppTradeOrderRespVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderCreateReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderGetReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.order.vo.AppAdminTradeOrderRespVO;
 import com.citu.module.menduner.system.controller.base.order.TradeOrderCreateReqVO;
+import com.citu.module.menduner.system.controller.base.order.TradeOrderPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
 import com.citu.module.menduner.system.dal.mysql.order.TradeOrderMapper;
+import com.citu.module.menduner.system.enums.order.TradeOrderCancelTypeEnum;
 import com.citu.module.menduner.system.enums.order.TradeOrderRefundStatusEnum;
 import com.citu.module.menduner.system.enums.order.TradeOrderStatusEnum;
 import com.citu.module.menduner.system.enums.order.TradeOrderTypeEnum;
+import com.citu.module.menduner.system.mq.producer.OrderProducer;
 import com.citu.module.pay.api.order.PayOrderApi;
 import com.citu.module.pay.api.order.dto.PayOrderCreateReqDTO;
 import com.citu.module.pay.api.order.dto.PayOrderRespDTO;
@@ -18,6 +29,7 @@ import com.citu.module.pay.enums.order.PayOrderStatusEnum;
 import com.citu.module.pay.enums.refund.PayRefundStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
@@ -25,11 +37,13 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.Duration;
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Objects;
 
 import static cn.hutool.core.util.ObjectUtil.notEqual;
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.date.LocalDateTimeUtils.addTime;
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.minusTime;
 import static com.citu.framework.common.util.json.JsonUtils.toJsonString;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
 import static com.citu.framework.web.core.util.WebFrameworkUtils.getTerminal;
@@ -58,6 +72,17 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     private PayRefundApi payRefundApi;
     @Resource
     private TradeOrderMapper tradeOrderMapper;
+    @Resource
+    private OrderProducer orderProducer;
+
+    /**
+     * 获得自身的代理对象,解决 AOP 生效问题
+     *
+     * @return 自己
+     */
+    private TradeOrderServiceImpl getSelf() {
+        return SpringUtil.getBean(getClass());
+    }
 
     @Override
     public Long createOrder(TradeOrderCreateReqVO createReqVO) {
@@ -101,8 +126,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     }
 
     @Override
-    public PageResult<TradeOrderDO> getOrderPage(PageParam pageReqVO) {
-        return tradeOrderMapper.selectPage(pageReqVO);
+    public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) {
+        return tradeOrderMapper.selectPage(reqVO);
     }
 
     @Override
@@ -113,10 +138,16 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         // 更新 PayOrderDO 状态为已支付
         int updateCount = tradeOrderMapper.updateByIdAndPayed(id, false,
                 new TradeOrderDO().setPayStatus(true).setPayTime(LocalDateTime.now())
+                        // 支付成功就完成
+                        .setStatus(TradeOrderStatusEnum.COMPLETED.getStatus())
                         .setPayChannelCode(payOrder.getChannelCode()));
         if (updateCount == 0) {
             throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
         }
+        //发送mq做业务逻辑处理
+        TradeOrderDO order = tradeOrderMapper.selectById(id);
+        orderProducer.send(order.getSpuId(), TradeOrderTypeEnum.getByType(order.getType()));
+
     }
 
     /**
@@ -221,6 +252,47 @@ public class TradeOrderServiceImpl implements TradeOrderService {
                 .setRefundTime(payRefund.getSuccessTime()));
     }
 
+    @Override
+    public int cancelOrderBySystem() {
+        // 1. 查询过期的待支付订单
+        // 10分钟后的过期时间
+        LocalDateTime expireTime = minusTime(Duration.ofMinutes(10));
+        List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndCreateTimeLt(
+                TradeOrderStatusEnum.UNPAID.getStatus(), expireTime);
+        if (CollUtil.isEmpty(orders)) {
+            return 0;
+        }
+
+        // 2. 遍历执行,逐个取消
+        int count = 0;
+        for (TradeOrderDO order : orders) {
+            try {
+                getSelf().cancelOrderBySystem(order);
+                count++;
+            } catch (Throwable e) {
+                log.error("[cancelOrderBySystem][order({}) 过期订单异常]", order.getId(), e);
+            }
+        }
+        return count;
+    }
+
+    /**
+     * 自动取消单个订单
+     *
+     * @param order 订单
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelOrderBySystem(TradeOrderDO order) {
+        // 1. 更新 TradeOrderDO 状态为已取消
+        int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(),
+                new TradeOrderDO().setStatus(TradeOrderStatusEnum.CANCELED.getStatus())
+                        .setCancelType(TradeOrderCancelTypeEnum.PAY_TIMEOUT.getType())
+                        .setCancelTime(LocalDateTime.now()));
+        if (updateCount == 0) {
+            throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
+        }
+    }
+
     private PayRefundRespDTO validateOrderCanRefunded(Long id, Long payRefundId) {
         // 1.1 校验订单
         TradeOrderDO order = tradeOrderMapper.selectById(id);
@@ -278,10 +350,51 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         BigDecimal bigDecimalValue = new BigDecimal(price);
 
         // 创建一个表示100的BigDecimal对象
-        BigDecimal hundred = new BigDecimal("100");
+        BigDecimal hundred = new BigDecimal(100);
         // 使用divide方法进行除法
         // 设置小数位数为2,并使用RoundingMode.HALF_UP作为舍入模式
         return bigDecimalValue.divide(hundred, 2, RoundingMode.HALF_UP);
     }
 
+    @Override
+    public PageResult<AppTradeOrderRespVO> page(AppTradeOrderPageReqVO reqVO) {
+        return tradeOrderMapper.page(LoginUserContext.getUserId(), reqVO);
+    }
+
+    @Override
+    public PageResult<AppAdminTradeOrderRespVO> page(AppAdminTradeOrderPageReqVO reqVO) {
+        return tradeOrderMapper.page(reqVO);
+    }
+
+    @Override
+    public Long create(AppAdminTradeOrderCreateReqVO reqVO) {
+        Long userId = LoginUserContext.getUserId();
+        // 获取待支付的订单
+        TradeOrderTypeEnum type = TradeOrderTypeEnum.getByType(reqVO.getType());
+        TradeOrderCreateReqVO createReqVO =
+                TradeOrderCreateReqVO.builder()
+                        .userId(userId)
+                        .type(reqVO.getType())
+                        .spuId(reqVO.getSpuId())
+                        .spuName(type.getName() + ": " + reqVO.getSpuName())
+                        .price(reqVO.getPrice())
+                        .build();
+        return createOrder(createReqVO);
+    }
+
+    @Override
+    public AppAdminTradeOrderRespVO getOrderByUnpaid(AppAdminTradeOrderGetReqVO reqVO) {
+
+        TradeOrderDO order = tradeOrderMapper.getOrderByUnpaid(LoginUserContext.getUserId(),
+                reqVO.getType(), reqVO.getSpuId());
+        if (null == order) {
+            return null;
+        }
+        PayOrderRespDTO respDTO = payOrderApi.getOrder(order.getPayOrderId()).getCheckedData();
+        AppAdminTradeOrderRespVO respVO = new AppAdminTradeOrderRespVO();
+        respVO.setOrder(order);
+        respVO.setPayOrder(respDTO);
+
+        return respVO;
+    }
 }

+ 2 - 1
menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties

@@ -319,4 +319,5 @@
 1_100_046_010=Failed to initiate refund, refund order number does not match
 1_100_046_011=Failed to initiate refund, refund amount does not match
 1_100_046_012=Product name cannot be empty
-1_100_046_013=Product amount cannot be empty
+1_100_046_013=Product amount cannot be empty
+1_100_046_014=Transaction order cancellation failed, order is not in the 'Pending Payment' status

+ 2 - 1
menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -322,4 +322,5 @@
 1_100_046_010=发起退款失败,退款单编号不匹配
 1_100_046_011=发起退款失败,退款单金额不匹配
 1_100_046_012=商品名称不能为空
-1_100_046_013=商品金额不能为空
+1_100_046_013=商品金额不能为空
+1_100_046_014=交易订单取消失败,订单不是【待支付】状态