// Path: tcc-transaction-tutorial-sample/tcc-transaction-sample/tcc-transaction-order/src/main/java/org/pankai/tcctransaction/sample/order/domain/entity/Order.java
// public class Order implements Serializable {
// 
//     private long id;
// 
//     private long payerUserId;
// 
//     private long payeeUserId;
// 
//     private BigDecimal redPacketPayAmount;
// 
//     private BigDecimal capitalPayAmount;
// 
//     private String status = "DRAFT";
// 
//     private String merchantOrderNo;
// 
//     private List<OrderLine> orderLines = new ArrayList<OrderLine>();
// 
//     public Order() {
// 
//     }
// 
//     public Order(long payerUserId, long payeeUserId) {
//         this.payerUserId = payerUserId;
//         this.payeeUserId = payeeUserId;
//         this.merchantOrderNo = UUID.randomUUID().toString();
//     }
// 
//     public long getPayerUserId() {
//         return payerUserId;
//     }
// 
//     public long getPayeeUserId() {
//         return payeeUserId;
//     }
// 
//     public BigDecimal getTotalAmount() {
// 
//         BigDecimal totalAmount = BigDecimal.ZERO;
// 
//         for (OrderLine orderLine : orderLines) {
// 
//             totalAmount = totalAmount.add(orderLine.getTotalAmount());
//         }
//         return totalAmount;
//     }
// 
//     public void addOrderLine(OrderLine orderLine) {
//         this.orderLines.add(orderLine);
//     }
// 
//     public List<OrderLine> getOrderLines() {
//         return Collections.unmodifiableList(this.orderLines);
//     }
// 
//     public void pay(BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) {
//         this.redPacketPayAmount = redPacketPayAmount;
//         this.capitalPayAmount = capitalPayAmount;
//         this.status = "PAYING";
//     }
// 
//     public BigDecimal getRedPacketPayAmount() {
//         return redPacketPayAmount;
//     }
// 
//     public BigDecimal getCapitalPayAmount() {
//         return capitalPayAmount;
//     }
// 
//     public String getMerchantOrderNo() {
//         return merchantOrderNo;
//     }
// 
//     public void setMerchantOrderNo(String merchantOrderNo) {
//         this.merchantOrderNo = merchantOrderNo;
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
//     public String getStatus() {
//         return status;
//     }
// 
//     public void confirm() {
//         this.status = "CONFIRMED";
//     }
// 
//     public void cancelPayment() {
//         this.status = "PAY_FAILED";
//     }
// }
// 
// Path: tcc-transaction-tutorial-sample/tcc-transaction-sample/tcc-transaction-order/src/main/java/org/pankai/tcctransaction/sample/order/domain/entity/OrderLine.java
// public class OrderLine implements Serializable {
// 
//     private long id;
// 
//     private long productId;
// 
//     private int quantity;
// 
//     private BigDecimal unitPrice;
// 
//     public OrderLine() {
// 
//     }
// 
//     public OrderLine(Long productId, Integer quantity, BigDecimal unitPrice) {
//         this.productId = productId;
//         this.quantity = quantity;
//         this.unitPrice = unitPrice;
//     }
// 
//     public long getProductId() {
//         return productId;
//     }
// 
//     public int getQuantity() {
//         return quantity;
//     }
// 
//     public BigDecimal getUnitPrice() {
//         return unitPrice;
//     }
// 
//     public BigDecimal getTotalAmount() {
//         return unitPrice.multiply(BigDecimal.valueOf(quantity));
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
// 
// }


import org.pankai.tcctransaction.sample.order.domain.entity.Order;
import org.pankai.tcctransaction.sample.order.domain.entity.OrderLine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
package org.pankai.tcctransaction.sample.order.domain.repository;



/**
 * Created by pktczwd on 2016/12/19.
 */
@Repository
public class OrderRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void createOrder(Order order) {
        KeyHolder orderKeyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement stmt = connection.prepareStatement("insert into ord_order(payer_user_id,payee_user_id,red_packet_pay_amount,capital_pay_amount,status,merchant_order_no) values(?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
                stmt.setObject(1, order.getPayerUserId());
                stmt.setObject(2, order.getPayeeUserId());
                stmt.setObject(3, order.getRedPacketPayAmount());
                stmt.setObject(4, order.getCapitalPayAmount());
                stmt.setObject(5, order.getStatus());
                stmt.setObject(6, order.getMerchantOrderNo());
                return stmt;
            }
        }, orderKeyHolder);
        order.setId(orderKeyHolder.getKey().longValue());
// Path: tcc-transaction-tutorial-sample/tcc-transaction-sample/tcc-transaction-order/src/main/java/org/pankai/tcctransaction/sample/order/domain/entity/Order.java
// public class Order implements Serializable {
// 
//     private long id;
// 
//     private long payerUserId;
// 
//     private long payeeUserId;
// 
//     private BigDecimal redPacketPayAmount;
// 
//     private BigDecimal capitalPayAmount;
// 
//     private String status = "DRAFT";
// 
//     private String merchantOrderNo;
// 
//     private List<OrderLine> orderLines = new ArrayList<OrderLine>();
// 
//     public Order() {
// 
//     }
// 
//     public Order(long payerUserId, long payeeUserId) {
//         this.payerUserId = payerUserId;
//         this.payeeUserId = payeeUserId;
//         this.merchantOrderNo = UUID.randomUUID().toString();
//     }
// 
//     public long getPayerUserId() {
//         return payerUserId;
//     }
// 
//     public long getPayeeUserId() {
//         return payeeUserId;
//     }
// 
//     public BigDecimal getTotalAmount() {
// 
//         BigDecimal totalAmount = BigDecimal.ZERO;
// 
//         for (OrderLine orderLine : orderLines) {
// 
//             totalAmount = totalAmount.add(orderLine.getTotalAmount());
//         }
//         return totalAmount;
//     }
// 
//     public void addOrderLine(OrderLine orderLine) {
//         this.orderLines.add(orderLine);
//     }
// 
//     public List<OrderLine> getOrderLines() {
//         return Collections.unmodifiableList(this.orderLines);
//     }
// 
//     public void pay(BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) {
//         this.redPacketPayAmount = redPacketPayAmount;
//         this.capitalPayAmount = capitalPayAmount;
//         this.status = "PAYING";
//     }
// 
//     public BigDecimal getRedPacketPayAmount() {
//         return redPacketPayAmount;
//     }
// 
//     public BigDecimal getCapitalPayAmount() {
//         return capitalPayAmount;
//     }
// 
//     public String getMerchantOrderNo() {
//         return merchantOrderNo;
//     }
// 
//     public void setMerchantOrderNo(String merchantOrderNo) {
//         this.merchantOrderNo = merchantOrderNo;
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
//     public String getStatus() {
//         return status;
//     }
// 
//     public void confirm() {
//         this.status = "CONFIRMED";
//     }
// 
//     public void cancelPayment() {
//         this.status = "PAY_FAILED";
//     }
// }
// 
// Path: tcc-transaction-tutorial-sample/tcc-transaction-sample/tcc-transaction-order/src/main/java/org/pankai/tcctransaction/sample/order/domain/entity/OrderLine.java
// public class OrderLine implements Serializable {
// 
//     private long id;
// 
//     private long productId;
// 
//     private int quantity;
// 
//     private BigDecimal unitPrice;
// 
//     public OrderLine() {
// 
//     }
// 
//     public OrderLine(Long productId, Integer quantity, BigDecimal unitPrice) {
//         this.productId = productId;
//         this.quantity = quantity;
//         this.unitPrice = unitPrice;
//     }
// 
//     public long getProductId() {
//         return productId;
//     }
// 
//     public int getQuantity() {
//         return quantity;
//     }
// 
//     public BigDecimal getUnitPrice() {
//         return unitPrice;
//     }
// 
//     public BigDecimal getTotalAmount() {
//         return unitPrice.multiply(BigDecimal.valueOf(quantity));
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
// 
// }


// Path: tcc-transaction-tutorial-sample/tcc-transaction-sample/tcc-transaction-order/src/main/java/org/pankai/tcctransaction/sample/order/domain/repository/OrderRepository.java
import org.pankai.tcctransaction.sample.order.domain.entity.Order;
import org.pankai.tcctransaction.sample.order.domain.entity.OrderLine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

package org.pankai.tcctransaction.sample.order.domain.repository;



/**
 * Created by pktczwd on 2016/12/19.
 */
@Repository
public class OrderRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void createOrder(Order order) {
        KeyHolder orderKeyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement stmt = connection.prepareStatement("insert into ord_order(payer_user_id,payee_user_id,red_packet_pay_amount,capital_pay_amount,status,merchant_order_no) values(?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
                stmt.setObject(1, order.getPayerUserId());
                stmt.setObject(2, order.getPayeeUserId());
                stmt.setObject(3, order.getRedPacketPayAmount());
                stmt.setObject(4, order.getCapitalPayAmount());
                stmt.setObject(5, order.getStatus());
                stmt.setObject(6, order.getMerchantOrderNo());
                return stmt;
            }
        }, orderKeyHolder);
        order.setId(orderKeyHolder.getKey().longValue());
        for (OrderLine orderLine : order.getOrderLines()) {