// 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/ProductRepository.java
// @Repository
// public class ProductRepository {
// 
//     @Autowired
//     private JdbcTemplate jdbcTemplate;
// 
//     public Product findById(long productId) {
//         return jdbcTemplate.queryForObject("select product_id,shop_id,product_name,price from ord_product where product_id = ?", new RowMapper<Product>() {
//             @Override
//             public Product mapRow(ResultSet rs, int i) throws SQLException {
//                 Product product = new Product();
//                 product.setProductId(rs.getLong("product_id"));
//                 product.setShopId(rs.getLong("shop_id"));
//                 product.setProductName(rs.getString("product_name"));
//                 product.setPrice(rs.getBigDecimal("price"));
//                 return product;
//             }
//         }, productId);
//     }
// }


import org.apache.commons.lang3.tuple.Pair;
import org.pankai.tcctransaction.sample.order.domain.entity.Order;
import org.pankai.tcctransaction.sample.order.domain.entity.OrderLine;
import org.pankai.tcctransaction.sample.order.domain.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
package org.pankai.tcctransaction.sample.order.factory;



/**
 * Created by pktczwd on 2016/12/19.
 */
@Component
public class OrderFactory {

    @Autowired
    private ProductRepository productRepository;

    public Order buildOrder(long payerUserId, long payeeUserId, List<Pair<Long, Integer>> productQuantities) {

        Order order = new Order(payerUserId, payeeUserId);

        for (Pair<Long, Integer> pair : productQuantities) {
            long productId = pair.getLeft();
// 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/ProductRepository.java
// @Repository
// public class ProductRepository {
// 
//     @Autowired
//     private JdbcTemplate jdbcTemplate;
// 
//     public Product findById(long productId) {
//         return jdbcTemplate.queryForObject("select product_id,shop_id,product_name,price from ord_product where product_id = ?", new RowMapper<Product>() {
//             @Override
//             public Product mapRow(ResultSet rs, int i) throws SQLException {
//                 Product product = new Product();
//                 product.setProductId(rs.getLong("product_id"));
//                 product.setShopId(rs.getLong("shop_id"));
//                 product.setProductName(rs.getString("product_name"));
//                 product.setPrice(rs.getBigDecimal("price"));
//                 return product;
//             }
//         }, productId);
//     }
// }


// Path: tcc-transaction-tutorial-sample/tcc-transaction-sample/tcc-transaction-order/src/main/java/org/pankai/tcctransaction/sample/order/factory/OrderFactory.java
import org.apache.commons.lang3.tuple.Pair;
import org.pankai.tcctransaction.sample.order.domain.entity.Order;
import org.pankai.tcctransaction.sample.order.domain.entity.OrderLine;
import org.pankai.tcctransaction.sample.order.domain.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;

package org.pankai.tcctransaction.sample.order.factory;



/**
 * Created by pktczwd on 2016/12/19.
 */
@Component
public class OrderFactory {

    @Autowired
    private ProductRepository productRepository;

    public Order buildOrder(long payerUserId, long payeeUserId, List<Pair<Long, Integer>> productQuantities) {

        Order order = new Order(payerUserId, payeeUserId);

        for (Pair<Long, Integer> pair : productQuantities) {
            long productId = pair.getLeft();
            order.addOrderLine(new OrderLine(productId, pair.getRight(), productRepository.findById(productId).getPrice()));