对于后台订单购物流程的API开发小结

springmvc开发订单类api接口

在接手到这个项目时,我对订单只是模糊的概念,淘宝的购物流程我想在坐的各位都知道,但是具体到开发的时候,考虑的细节那是很多的,如订单状态的判断,支付前的检查等等,下面我就说说订单的业务流程:
首先声明一个订单请求类,用来从客户端传来订单的请求信息
- 订单请求类

public class AddMemberOrderPaymentItemsRequest {

    private int orderId;
    private int memberId;
    private List<PaymentData> orderPayments;

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    public int getMemberId() {
        return memberId;
    }

    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }

    public List<PaymentData> getOrderPayments() {
        return orderPayments;
    }

    public void setOrderPayments(List<PaymentData> orderPayments) {
        this.orderPayments = orderPayments;
    }

}
  • 订单的支付数据类
public class OrderPaymentData {

    private String orderSn;
    private String paymentType;
    private Integer paymentTypeValue;
    private Integer paymentTypeFee;
    private Long paymentTime;
    private String notifyId;
    private Integer status;
    private String tradeNo;
    private String password;
    private Integer paymentSourceId;
    private String remark;

    public String getOrderSn() {
        return orderSn;
    }

    public void setOrderSn(String orderSn) {
        this.orderSn = orderSn;
    }

    public String getPaymentType() {
        return paymentType;
    }

    public void setPaymentType(String paymentType) {
        this.paymentType = paymentType;
    }

    public Integer getPaymentTypeValue() {
        return paymentTypeValue;
    }

    public void setPaymentTypeValue(Integer paymentTypeValue) {
        this.paymentTypeValue = paymentTypeValue;
    }

    public Integer getPaymentTypeFee() {
        return paymentTypeFee;
    }

    public void setPaymentTypeFee(Integer paymentTypeFee) {
        this.paymentTypeFee = paymentTypeFee;
    }

    public Long getPaymentTime() {
        return paymentTime;
    }

    public void setPaymentTime(Long paymentTime) {
        this.paymentTime = paymentTime;
    }

    public String getNotifyId() {
        return notifyId;
    }

    public void setNotifyId(String notifyId) {
        this.notifyId = notifyId;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getTradeNo() {
        return tradeNo;
    }

    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getPaymentSourceId() {
        return paymentSourceId;
    }

    public void setPaymentSourceId(Integer paymentSourceId) {
        this.paymentSourceId = paymentSourceId;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}
  • 支付数据类
public class PaymentData {

    private String paymentType;
    private String paymentValue;
    private String paymentFee;
    private String password;
    private Integer paymentSourceId;
    private String remark;
    private Integer orderItemId;

    public String getPaymentType() {
        return paymentType;
    }

    public void setPaymentType(String paymentType) {
        this.paymentType = paymentType;
    }

    public String getPaymentValue() {
        return paymentValue;
    }

    public void setPaymentValue(String paymentValue) {
        this.paymentValue = paymentValue;
    }

    public String getPaymentFee() {
        return paymentFee;
    }

    public void setPaymentFee(String paymentFee) {
        this.paymentFee = paymentFee;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getPaymentSourceId() {
        return paymentSourceId;
    }

    public void setPaymentSourceId(Integer paymentSourceId) {
        this.paymentSourceId = paymentSourceId;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public Integer getOrderItemId() {
        return orderItemId;
    }

    public void setOrderItemId(Integer orderItemId) {
        this.orderItemId = orderItemId;
    }
}
  • 订单记录类
public class MemberOrderRecord extends BaseEntity implements
        java.io.Serializable {

    private static final long serialVersionUID = 5245312106507078315L;
    private String orderSn;
    private String pickMethod;
    private ConfigOrderType orderType;
    private Integer memberId;
    private Integer checkStatus;
    private Integer orderStatus;
    private Integer paymentStatus;
    private Integer managerId;
    private Long orderTime;
    private Long paymentTime;
    private String description;
    private String remark;
    private Integer mallId;
    private List<MemberOrderItem> orderItems;
    private List<MemberOrderPaymentList> orderPaymentLists;
    private MemberOrderDelivery orderDelivery;
    private Long invalidTime;
    private Integer isRefund = 0;
    private Integer invoiced = 0;
    private String clientSource;
    private String outSerialNo;// 外部交易序列号,目前用在erp中
    private String orderHelperType;
    private String orderUndoSn;// 交易撤销编号
    private String tradeFlag; // 交易标记,判断是否成功
    private String tradeMessage;// 交易消息
    private String auditMessage; // 审核消息
    private Integer auditManagerId; // 审核管理员
    private MallInfo pickMallInfo;  //提货门店

    @Column(name = "order_sn", unique = true, nullable = false, length = 100)
    public String getOrderSn() {
        return this.orderSn;
    }

    public void setOrderSn(String orderSn) {
        this.orderSn = orderSn;
    }

    @Column(name = "pick_method", nullable = false, length = 25)
    public String getPickMethod() {
        return this.pickMethod;
    }

    public void setPickMethod(String pickMethod) {
        this.pickMethod = pickMethod;
    }

    @Column(name = "member_id", nullable = false)
    public Integer getMemberId() {
        return this.memberId;
    }

    public void setMemberId(Integer memberId) {
        this.memberId = memberId;
    }

    @Column(name = "order_status", nullable = false)
    public Integer getOrderStatus() {
        return orderStatus;
    }

    public void setOrderStatus(Integer orderStatus) {
        this.orderStatus = orderStatus;
    }

    @Column(name = "payment_status", nullable = false)
    public Integer getPaymentStatus() {
        if (paymentStatus != OrderConstants.ORDER_PAYMENT_STATUS_PAYED
                && paymentStatus != OrderConstants.ORDER_PAYMENT_STATUS_CLOSED) {
            // 未支付的情况下根据各个支付方式的支付记录得到支付状态
            int status = OrderConstants.ORDER_PAYMENT_STATUS_WAIT_PAY;
            boolean hasPayed = false;
            boolean hasWaitpay = false;
            boolean hasVerify = false;
            int closeCount = 0;
            List<MemberOrderPaymentList> paymentLists = getOrderPaymentLists();
            if (paymentLists != null && !paymentLists.isEmpty()) {

                for (MemberOrderPaymentList memberOrderPaymentList : paymentLists) {
                    if (memberOrderPaymentList.getStatus() == OrderConstants.ORDER_PAYMENT_STATUS_WAIT_PAY) {
                        hasWaitpay = true;
                    } else if (memberOrderPaymentList.getStatus() == OrderConstants.ORDER_PAYMENT_STATUS_PAYED
                            || memberOrderPaymentList.getStatus() == OrderConstants.ORDER_PAYMENT_STATUS_FINISHED) {
                        hasPayed = true;
                    } else if (memberOrderPaymentList.getStatus() == OrderConstants.ORDER_PAYMENT_STATUS_CLOSED) {
                        closeCount++;
                    } else if (memberOrderPaymentList.getStatus()
                            == OrderConstants.ORDER_PAYMENT_STATUS_PAY_VERIFYING) {
                        hasVerify = true;
                    }
                }
                if (hasWaitpay) {
                    // 在未支付状态下,有支付或支付确认中,则为部分支付
                    if (hasPayed || hasVerify) {
                        status = OrderConstants.ORDER_PAYMENT_STATUS_PARTIAL_PAYED;
                    }

                } else if (hasPayed) {
                    // 有支付完成,有关闭,则为取消中,非退款,退款处理时,订单状态不变
                    if (closeCount > 0) {
                        status = OrderConstants.ORDER_PAYMENT_STATUS_PARTIAL_CLOSED;
                    } else {
                        // 在有支付完成的状态下,有支付确认中,且没有取消,则为支付确认中。
                        if (hasVerify) {
                            status = OrderConstants.ORDER_PAYMENT_STATUS_PAY_VERIFYING;
                        } else {
                            status = OrderConstants.ORDER_PAYMENT_STATUS_PAYED;
                        }
                    }
                } else if (closeCount == paymentLists.size()) {
                    // 订单关闭
                    status = OrderConstants.ORDER_PAYMENT_STATUS_CLOSED;
                } else if (hasVerify) {
                    // 仅剩支付确认中
                    status = OrderConstants.ORDER_PAYMENT_STATUS_PAY_VERIFYING;
                }

                paymentStatus = status;
            } else {
                paymentStatus = OrderConstants.ORDER_PAYMENT_STATUS_WAIT_PAY;
            }
        }
        return paymentStatus;
    }

    public void setPaymentStatus(Integer paymentStatus) {
        this.paymentStatus = paymentStatus;
    }

    @Column(name = "manager_id")
    public Integer getManagerId() {
        return this.managerId;
    }

    public void setManagerId(Integer managerId) {
        this.managerId = managerId;
    }

    @Column(name = "order_time", nullable = false)
    public Long getOrderTime() {
        return this.orderTime;
    }

    public void setOrderTime(Long orderTime) {
        this.orderTime = orderTime;
    }

    @Column(name = "payment_time")
    public Long getPaymentTime() {
        return this.paymentTime;
    }

    public void setPaymentTime(Long paymentTime) {
        this.paymentTime = paymentTime;
    }

    @Column(name = "description")
    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Column(name = "remark")
    public String getRemark() {
        return this.remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @ManyToOne
    @JoinColumn(name = "order_type")
    public ConfigOrderType getOrderType() {
        return orderType;
    }

    public void setOrderType(ConfigOrderType orderType) {
        this.orderType = orderType;
    }

    @Column(name = "check_status")
    public Integer getCheckStatus() {
        return checkStatus;
    }

    public void setCheckStatus(Integer checkStatus) {
        this.checkStatus = checkStatus;
    }

    public Integer getMallId() {
        return mallId;
    }

    public void setMallId(Integer mallId) {
        this.mallId = mallId;
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "orderRecord", fetch = FetchType.LAZY)
    public List<MemberOrderItem> getOrderItems() {
        return orderItems;
    }

    public void setOrderItems(List<MemberOrderItem> orderItems) {
        this.orderItems = orderItems;
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "orderRecord", fetch = FetchType.LAZY)
    public List<MemberOrderPaymentList> getOrderPaymentLists() {
        return orderPaymentLists;
    }

    public void setOrderPaymentLists(
            List<MemberOrderPaymentList> orderPaymentLists) {
        this.orderPaymentLists = orderPaymentLists;
    }

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "orderRecord", fetch = FetchType.LAZY)
    public MemberOrderDelivery getOrderDelivery() {
        return orderDelivery;
    }

    public void setOrderDelivery(MemberOrderDelivery orderDelivery) {
        this.orderDelivery = orderDelivery;
    }

    public Long getInvalidTime() {
        return invalidTime;
    }

    public void setInvalidTime(Long invalidTime) {
        this.invalidTime = invalidTime;
    }

    public Integer getIsRefund() {
        return isRefund;
    }

    public void setIsRefund(Integer isRefund) {
        this.isRefund = isRefund;
    }

    public Integer getInvoiced() {
        return invoiced;
    }

    public void setInvoiced(Integer invoiced) {
        this.invoiced = invoiced;
    }

    public String getClientSource() {
        return clientSource;
    }

    public void setClientSource(String clientSource) {
        this.clientSource = clientSource;
    }

    public String getOutSerialNo() {
        return outSerialNo;
    }

    public void setOutSerialNo(String outSerialNo) {
        this.outSerialNo = outSerialNo;
    }

    public String getOrderHelperType() {
        return orderHelperType;
    }

    public void setOrderHelperType(String orderHelperType) {
        this.orderHelperType = orderHelperType;
    }

    public String getOrderUndoSn() {
        return orderUndoSn;
    }

    public void setOrderUndoSn(String orderUndoSn) {
        this.orderUndoSn = orderUndoSn;
    }

    public String getTradeFlag() {
        return tradeFlag;
    }

    public void setTradeFlag(String tradeFlag) {
        this.tradeFlag = tradeFlag;
    }

    public String getTradeMessage() {
        return tradeMessage;
    }

    public void setTradeMessage(String tradeMessage) {
        this.tradeMessage = tradeMessage;
    }

    public String getAuditMessage() {
        return auditMessage;
    }

    public void setAuditMessage(String auditMessage) {
        this.auditMessage = auditMessage;
    }

    public Integer getAuditManagerId() {
        return auditManagerId;
    }

    public void setAuditManagerId(Integer auditManagerId) {
        this.auditManagerId = auditManagerId;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "pick_mall_id")
    public MallInfo getPickMallInfo() {
        return pickMallInfo;
    }

    public void setPickMallInfo(MallInfo pickMallInfo) {
        this.pickMallInfo = pickMallInfo;
    }

    @Transient
    public Integer getTotalPaymentFee() {
        List<MemberOrderPaymentList> paymentLists = getOrderPaymentLists();
        if (paymentLists != null && !paymentLists.isEmpty()) {
            int totalFee = 0;
            boolean hasFee = false;
            for (MemberOrderPaymentList memberOrderPaymentList : paymentLists) {
                // 只有fee时按fee计算
                if (memberOrderPaymentList.getPaymentFee() != null) {
                    totalFee += memberOrderPaymentList.getPaymentFee();
                    hasFee = true;
                }
            }
            return hasFee ? totalFee : null;
        } else {
            return null;
        }
    }

    @Transient
    public Integer getTotalPaymentValue() {
        List<MemberOrderPaymentList> paymentLists = getOrderPaymentLists();
        if (paymentLists != null && !paymentLists.isEmpty()) {
            int totalValue = 0;
            boolean hasValue = false;
            for (MemberOrderPaymentList memberOrderPaymentList : paymentLists) {
                // 仅有value时才按value值累计
                if (memberOrderPaymentList.getPaymentValue() != null
                        && memberOrderPaymentList.getPaymentFee() == null) {
                    totalValue += memberOrderPaymentList.getPaymentValue();
                    hasValue = true;
                }
            }
            return hasValue ? totalValue : null;
        } else {
            return null;
        }
    }

    @Transient
    public Integer getItemsTotalFee() {
        List<MemberOrderItem> orderItems = getOrderItems();
        if (orderItems != null && !orderItems.isEmpty()) {
            int totalFee = 0;
            boolean hasFee = false;
            for (MemberOrderItem memberOrderItem : orderItems) {
                if (memberOrderItem.getTotalFee() != null) {
                    totalFee += memberOrderItem.getTotalFee();
                    hasFee = true;
                }
            }
            return hasFee ? totalFee : null;
        } else {
            return null;
        }
    }

    @Transient
    public Integer getItemsTotalValue() {
        List<MemberOrderItem> orderItems = getOrderItems();
        if (orderItems != null && !orderItems.isEmpty()) {
            int totalValue = 0;
            boolean hasValue = false;
            for (MemberOrderItem memberOrderItem : orderItems) {
                if (memberOrderItem.getTotalValue() != null) {
                    totalValue += memberOrderItem.getTotalValue();
                    hasValue = true;
                }
            }
            return hasValue ? totalValue : null;
        } else {
            return null;
        }
    }

    @Transient
    public MemberOrderPaymentList getOrderPaymentList(String paymentType) {
        List<MemberOrderPaymentList> paymentLists = getOrderPaymentLists();
        if (paymentLists != null && !paymentLists.isEmpty()) {
            for (MemberOrderPaymentList memberOrderPaymentList : paymentLists) {
                if (memberOrderPaymentList.getPaymentType().equals(paymentType)) {
                    return memberOrderPaymentList;
                }
            }
        }
        return null;
    }

    @Transient
    public int getOrderPaymentListIndex(String paymentType) {
        List<MemberOrderPaymentList> paymentLists = getOrderPaymentLists();
        if (paymentLists != null && !paymentLists.isEmpty()) {
            int index = 0;
            for (MemberOrderPaymentList memberOrderPaymentList : paymentLists) {
                if (memberOrderPaymentList.getPaymentType().equals(paymentType)) {
                    return index;
                }
                index++;
            }
        }
        return 0;
    }

    @Transient
    public boolean canInvoice() {
        // 先判断订单类型是否可以开发票,在判断支付清单中是否可以开发票
        // 已开发票后不能再开
        ConfigOrderType orderType = getOrderType();
        if (invoiced == 0 && orderType.getCanInvoice() == 1) {
            List<MemberOrderPaymentList> paymentLists = getOrderPaymentLists();
            if (paymentLists != null && !paymentLists.isEmpty()) {
                for (MemberOrderPaymentList memberOrderPaymentList : paymentLists) {
                    if (memberOrderPaymentList.getCanInvoice() == 1) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    @Transient
    public boolean canRefund() {
        ConfigOrderType orderType = getOrderType();
        return orderType.getCanRefund() == 1;
    }

    @Transient
    public int getCommentStatus() {
        int commentedCount = 0;
        List<MemberOrderItem> orderItems = getOrderItems();
        for (MemberOrderItem memberOrderItem : orderItems) {
            if (memberOrderItem.getCommentStatus() == OrderConstants.ORDER_ITEM_COMMENT_STATUS_WAIT_COMMENT) {
                return OrderConstants.ORDER_ITEM_COMMENT_STATUS_WAIT_COMMENT;
            } else if (memberOrderItem.getCommentStatus() == OrderConstants.ORDER_ITEM_COMMENT_STATUS_COMMENTED) {
                commentedCount++;
            }
        }
        if (commentedCount == orderItems.size()) {
            return OrderConstants.ORDER_ITEM_COMMENT_STATUS_COMMENTED;
        } else {
            return OrderConstants.ORDER_ITEM_COMMENT_STATUS_UNAVAILABLE;
        }
    }

  • 订单支付类
public class MemberOrderPaymentList extends BaseEntity implements
        java.io.Serializable {

    // Fields

    /**
     * 
     */
    private static final long serialVersionUID = -4484332339445481397L;
    private MemberOrderRecord orderRecord;
    private String orderSn;
    private String paymentType;
    private String paymentSn;
    private Integer paymentTypeValue;
    private Integer paymentTypeFee;
    private Long paymentTime;
    private String notifyId;
    private Integer status;
    private String tradeNo;
    private String appTradeStatus;
    private String remark;
    private Integer priority;
    private Integer canInvoice;
    private String password;
    private String undoTradeNo;
    private String paymentSource; // 支付类型来源
    private Integer paymentSourceId; // 支付类型的来源Id,可以用来保存优惠券、停车券等的Id

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id", nullable = false)
    public MemberOrderRecord getOrderRecord() {
        return orderRecord;
    }

    public void setOrderRecord(MemberOrderRecord orderRecord) {
        this.orderRecord = orderRecord;
    }

    @Column(name = "order_sn", nullable = false, length = 64)
    public String getOrderSn() {
        return this.orderSn;
    }

    public void setOrderSn(String orderSn) {
        this.orderSn = orderSn;
    }

    @Column(name = "payment_type", nullable = false, length = 20)
    public String getPaymentType() {
        return this.paymentType;
    }

    public void setPaymentType(String paymentType) {
        this.paymentType = paymentType;
    }

    @Column(name = "payment_sn", nullable = false, length = 64)
    public String getPaymentSn() {
        return this.paymentSn;
    }

    public void setPaymentSn(String paymentSn) {
        this.paymentSn = paymentSn;
    }

    @Column(name = "payment_type_value")
    public Integer getPaymentTypeValue() {
        return this.paymentTypeValue;
    }

    public void setPaymentTypeValue(Integer paymentTypeValue) {
        this.paymentTypeValue = paymentTypeValue;
    }

    @Column(name = "payment_type_fee")
    public Integer getPaymentTypeFee() {
        return this.paymentTypeFee;
    }

    public void setPaymentTypeFee(Integer paymentTypeFee) {
        this.paymentTypeFee = paymentTypeFee;
    }

    @Column(name = "payment_time")
    public Long getPaymentTime() {
        return this.paymentTime;
    }

    public void setPaymentTime(Long paymentTime) {
        this.paymentTime = paymentTime;
    }

    @Column(name = "notify_id", length = 100)
    public String getNotifyId() {
        return this.notifyId;
    }

    public void setNotifyId(String notifyId) {
        this.notifyId = notifyId;
    }

    @Column(name = "status", nullable = false)
    public Integer getStatus() {
        return this.status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Column(name = "trade_no", length = 100)
    public String getTradeNo() {
        return this.tradeNo;
    }

    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo;
    }

    public String getAppTradeStatus() {
        return appTradeStatus;
    }

    public void setAppTradeStatus(String appTradeStatus) {
        this.appTradeStatus = appTradeStatus;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public Integer getPriority() {
        return priority;
    }

    public void setPriority(Integer priority) {
        this.priority = priority;
    }

    public Integer getCanInvoice() {
        return canInvoice;
    }

    public void setCanInvoice(Integer canInvoice) {
        this.canInvoice = canInvoice;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUndoTradeNo() {
        return undoTradeNo;
    }

    public void setUndoTradeNo(String undoTradeNo) {
        this.undoTradeNo = undoTradeNo;
    }

    @Transient
    public Integer getPaymentFee() {
        return paymentTypeFee;
    }

    @Transient
    public Integer getPaymentValue() {
        return paymentTypeValue;
    }

    public String getPaymentSource() {
        return paymentSource;
    }

    public void setPaymentSource(String paymentSource) {
        this.paymentSource = paymentSource;
    }

    public Integer getPaymentSourceId() {
        return paymentSourceId;
    }

    public void setPaymentSourceId(Integer paymentSourceId) {
        this.paymentSourceId = paymentSourceId;
    }

}

下面开始进行业务处理
首先我们通过order的id取到数据库中的订单记录判断是否为空

   if (!memberOrderRecord.getMemberId().equals(
                addMemberOrderPaymentItemsRequest.getMemberId())
                || !memberOrderRecord.getId().equals(
                addMemberOrderPaymentItemsRequest.getOrderId())) {
            throw new OpenapiException("member order  not match",
                    OrderErrorCode.ERR_API_APP_MEMBER_ORDER_NOT_MATCH);

        }

接着我们取出订单记录中的订单支付类,然后判断支付方式是否存在,如果为空,则添加订单的支付方式,否则报出异常,订单已有支付方式

  List<MemberOrderPaymentList> memberOrderPaymentLists = memberOrderRecord
                .getOrderPaymentLists();
        if ((memberOrderPaymentLists == null || memberOrderPaymentLists
                .isEmpty())) {
            // 订单支付方式没有
            if (addMemberOrderPaymentItemsRequest == null
                    || addMemberOrderPaymentItemsRequest.getOrderPayments() == null
                    || addMemberOrderPaymentItemsRequest.getOrderPayments()
                    .isEmpty()) {
                throw new OpenapiException(
                        "member order payment items not set",
                        OrderErrorCode.ERR_API_APP_MEMBER_ORDER_PAYMENT_TYPE_NOT_SET);
            } else {
                / 添加订单支付方式
                List<OrderPaymentData> orderPaymentDatas = Lists.newArrayList();
                List<PaymentData> paymentDatas = addMemberOrderPaymentItemsRequest
                        .getOrderPayments();
                OrderDataUtils.setOrderPaymentData(orderPaymentDatas,
                        paymentDatas);
                        /**
                        public static void setOrderPaymentData(
            List<OrderPaymentData> orderPaymentDatas,
            List<PaymentData> paymentDatas) {
        for (PaymentData paymentData : paymentDatas) {
            OrderPaymentData orderPaymentData = new OrderPaymentData();
            orderPaymentData.setPaymentType(paymentData.getPaymentType());
            orderPaymentData.setPaymentTypeFee(PaymentConvertUtils
                    .convertFeeStringToInt(paymentData.getPaymentFee()));
            orderPaymentData.setPaymentTypeValue(PaymentConvertUtils
                    .convertCreditStringToInt(paymentData.getPaymentValue()));
            orderPaymentData
                    .setStatus(OrderConstants.ORDER_PAYMENT_STATUS_WAIT_PAY);
            orderPaymentData.setPassword(paymentData.getPassword());
            orderPaymentData.setPaymentSourceId(paymentData
                    .getPaymentSourceId());
            orderPaymentData.setRemark(paymentData.getRemark());
            orderPaymentDatas.add(orderPaymentData);
        }
    }
    **/

                try {
                    memberOrderRecordService.addOrderPaymentItems(
                            orderPaymentDatas, memberOrderRecord, false);
                } catch (OrderException e) {
                    logger.error("error", e);
                    throw new OpenapiException(
                            "member order add payment items failed",
                            OrderErrorCode.ERR_API_APP_MEMBER_ORDER_ADD_PAYMENT_TYPES_FAILED);
                }
            }
        } else {
            // 订单已有支付方式
            if (addMemberOrderPaymentItemsRequest != null
                    && addMemberOrderPaymentItemsRequest.getOrderPayments() != null
                    && !addMemberOrderPaymentItemsRequest.getOrderPayments()
                    .isEmpty()) {
                throw new OpenapiException(
                        "member order payment items has been set",
                        OrderErrorCode.ERR_API_APP_MEMBER_ORDER_PAYMENT_TYPE_HAS_BEEN_SET);
            }
        }

  • 其中涉及的方法在service层
    在其中,订单的值传过来后,赋值给订单支付类,订单支付类的值填充好后再加入到订单记录类中,保存订单记录类到数据库
 @Override
    @Transactional
    public boolean addOrderPaymentItems(
            List<OrderPaymentData> orderPaymentDatas,
            MemberOrderRecord orderRecord,
            boolean allowSamePaymentType) throws OrderException {
        // 订单支付
        if (orderPaymentDatas != null && !orderPaymentDatas.isEmpty()) {
            List<MemberOrderPaymentList> orderPaymentLists = createOrderPaymentItems(
                    orderPaymentDatas, orderRecord, allowSamePaymentType);
            if (orderRecord.getOrderPaymentLists() == null) {
                orderRecord.setOrderPaymentLists(orderPaymentLists);
            } else {
                orderRecord.getOrderPaymentLists().addAll(orderPaymentLists);
            }
            Integer allFee = orderRecord.getItemsTotalFee();
            Integer allValue = orderRecord.getItemsTotalValue();
            Integer paymentFee = orderRecord.getTotalPaymentFee();
            Integer paymentValue = orderRecord.getTotalPaymentValue();
            // 支付费用不能小于商品总价,可以大于。
            if ((allFee != null && (paymentFee == null || paymentFee < allFee))
                    || (allValue != null && (paymentValue == null || paymentValue < allValue))) {
                throw new OrderException("订单支付金额小于商品总价");
            }
            save(orderRecord);
            return true;
        } else {
            throw new OrderException("订单支付方式为空");
        }
    }

    private List<MemberOrderPaymentList> createOrderPaymentItems(
            List<OrderPaymentData> orderPaymentDatas,
            MemberOrderRecord orderRecord,
            boolean allowSamePaymentType) throws OrderException {
        OrderHelper orderHelper = orderHelperMap.get(orderRecord
                .getOrderHelperType());
        Set<String> orderPaymentTypes = Sets.newHashSet();
        if (orderPaymentDatas != null && !orderPaymentDatas.isEmpty()) {
            List<MemberOrderPaymentList> orderPaymentLists = Lists
                    .newArrayList();
            for (OrderPaymentData orderPaymentData : orderPaymentDatas) {
                if ((orderPaymentData.getPaymentTypeFee() == null || orderPaymentData
                        .getPaymentTypeFee() == 0)
                        && (orderPaymentData.getPaymentTypeValue() == null || orderPaymentData
                        .getPaymentTypeValue() == 0)) {
                    // 支付的fee和value都为0则忽略此支付方式的数据
                    continue;
                }
                String paymentType = orderPaymentData.getPaymentType();
                if (!allowSamePaymentType) {
                    Integer sourceId = orderPaymentData.getPaymentSourceId();
                    String key;
                    if (sourceId != null) {
                        // 使用paymentType+sourceId的方式判断是否重复
                        key = paymentType + sourceId;
                    } else {
                        key = paymentType;
                    }
                    if (orderPaymentTypes.contains(key)) {
                        throw new OrderException("订单支付方式重复", -1);
                    } else {
                        orderPaymentTypes.add(key);
                    }
                }
                MemberOrderPaymentList orderPaymentList = new MemberOrderPaymentList();
                orderPaymentList.setNotifyId(orderPaymentData.getNotifyId());
                orderPaymentList.setOrderRecord(orderRecord);
                orderPaymentList.setOrderSn(orderRecord.getOrderSn());
                orderPaymentList.setPaymentSn(orderHelper
                        .generatePaymentSn(paymentType));
                orderPaymentList.setPaymentTime(orderPaymentData
                        .getPaymentTime());
                orderPaymentList.setPaymentType(paymentType);
                // 默认情况source与type相同
                orderPaymentList.setPaymentSource(paymentType);
                orderPaymentList.setPaymentTypeFee(orderPaymentData
                        .getPaymentTypeFee());
                orderPaymentList.setPaymentTypeValue(orderPaymentData
                        .getPaymentTypeValue());
                orderPaymentList.setStatus(orderPaymentData.getStatus());
                orderPaymentList.setTradeNo(orderPaymentData.getTradeNo());
                ConfigPaymentType configPaymentType = configPaymentTypeService
                        .find(paymentType);
                orderPaymentList.setPriority(configPaymentType.getPriority());
                orderPaymentList.setCanInvoice(configPaymentType
                        .getCanInvoice());
                orderPaymentList.setPassword(orderPaymentData.getPassword());
                orderPaymentList.setPaymentSourceId(orderPaymentData
                        .getPaymentSourceId());
                orderPaymentList.setRemark(orderPaymentData.getRemark());
                checkAndExchangePaymentTypeVaueFee(orderRecord.getOrderType()
                        .getType(), orderPaymentList);
                checkPaymentItem(orderPaymentList);
                orderPaymentLists.add(orderPaymentList);
            }
            return orderPaymentLists;
        } else {
            return null;
        }
    }
  • 订单支付controller作为返回的api
    其中的bodyToObject()方法是将请求来的json数据进行转化成AddMemberOrderPaymentItemsRequest 对象
// 支付会员订单
    @RequestMapping(value = "/{orderId}/payments", method = RequestMethod.POST, produces = "application/json;charset=UTF-8, text/plain;charset=UTF-8")
    public Object addOrderPayments(@PathVariable Integer orderId,
            HttpServletRequest request, HttpServletResponse response) {
        AddMemberOrderPaymentItemsRequest addMemberOrderPaymentItemsRequest = bodyToObject(
                AddMemberOrderPaymentItemsRequest.class, request);
        if (addMemberOrderPaymentItemsRequest == null) {
            return HttpErrorObject
                    .constructHttpErrorObject(OrderErrorCode.ERR_API_APP_ORDER_ADD_PAYMENTS_REQUEST_NULL);
        }
        return orderService.addOrderPayments(orderId,
                addMemberOrderPaymentItemsRequest);
    }

对于订单业务的理解,还需要多结合业务场景需求去完成,这儿只是订单支付的一个小程序
希望对你们有所帮助!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值