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);
}
对于订单业务的理解,还需要多结合业务场景需求去完成,这儿只是订单支付的一个小程序
希望对你们有所帮助!