//TODO这个函数写的比较拥挤,我现在也没有什么办法,把事务当作参数传递时出错,目前还没有什么好的解决办法。?????
func EntrusteSuccess(main_coin_id, trade_coin_id string) []string {
var save []string
buyPrice, orderBuySn, _ := TakeBuyPriceList(main_coin_id, trade_coin_id)
sellPrice, orderSellSn, _ := TakeSellPriceList(main_coin_id, trade_coin_id)
fmt.Println(orderBuySn)
fmt.Println(orderSellSn)
// 使用循环一直处理买卖问题??
var i int = 0
var j int = 0
//开启事务
//tx, _ := model.Db.Begin()
//defer tx.Rollback()
//在这开启事务后果导致不进入else分支
//《三角形》 有异常怎么设置回滚
for i < len(orderBuySn) && j < len(orderSellSn) {
//查询买方的信息(交易数量) 和 卖方的信息(交易数量)//什么时候提出无用元素
entrustBuy, _ := GetEntrusteOrdersInfoByOrderSn(orderBuySn[i])
entrustSell, _ := GetEntrusteOrdersInfoByOrderSn(orderSellSn[j])
//假如以买家为基准,买方中最高的>卖方中最低的交易成功
if buyPrice[i] >= sellPrice[j] {
//比较买方和卖方交易剩余数量
//买家交易完成
if (entrustBuy.Quantity - entrustBuy.Done_quantity) <= (entrustSell.Quantity - entrustSell.Done_quantity) {
//交易成功, 更新数据库
tx, _ := model.Db.Begin()
defer clearTransaction(tx)
rs, err := tx.Prepare(`UPDATE ww_entrusted_orders SET done_quantity = ? WHERE order_sn = ?`)
model.CheckErr(err)
rows, err := rs.Exec(entrustBuy.Quantity, entrustBuy.Order_sn)
if err != nil {
log.Fatalln(err)
}
rowAffected, err := rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
rs.Close()
//买的数据写入record表
re := WriteRecordByBuyOrSell(entrustBuy)
rows1, err := tx.Exec(`INSERT INTO ww_entrusted_record(order_sn, member_id,
goods_id, main_coin_id, trade_coin_id, entrusted_type, price_type, price,
quantity, done_trade_fee, create_time)VALUES(?,?,?,?,?,?,?,?,?,?,?)`, re.Order_sn, re.Member_id, re.Goods_id, re.Main_coin_id, re.Trade_coin_id, re.Entrusted_type, re.Price_type, re.Price, re.Quantity, re.Done_trade_fee, re.Create_time)
if err != nil {
log.Fatalln(err)
}
rowAffected, err = rows1.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
rs, err = tx.Prepare(`UPDATE ww_entrusted_orders SET done_quantity = done_quantity + ? WHERE order_sn = ?`)
model.CheckErr(err)
_, err = rs.Exec(entrustBuy.Quantity-entrustBuy.Done_quantity, entrustSell.Order_sn)
if err != nil {
log.Fatalln(err)
}
rowAffected, err = rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
rs.Close()
//卖的数据写入record表
//WriteRecordByBuyOrSell(&entrustSell)
re1 := WriteRecordByBuyOrSell(entrustSell)
rows, err = tx.Exec(`INSERT INTO ww_entrusted_record(order_sn, member_id,
goods_id, main_coin_id, trade_coin_id, entrusted_type, price_type, price,
quantity, done_trade_fee, create_time)VALUES(?,?,?,?,?,?,?,?,?,?,?)`, re1.Order_sn, re1.Member_id, re1.Goods_id, re1.Main_coin_id, re1.Trade_coin_id, re1.Entrusted_type, re1.Price_type, re1.Price, re1.Quantity, re1.Done_trade_fee, re1.Create_time)
if err != nil {
log.Fatalln(err)
}
rowAffected, err = rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
save = append(save, entrustBuy.Order_sn)
i++
//提交事务
if err = tx.Commit(); err != nil {
log.Fatalln(err)
}
} else { //卖家交易完成
tx, _ := model.Db.Begin()
defer clearTransaction(tx)
//交易成功, 更新数据库
rs, err := tx.Prepare(`UPDATE ww_entrusted_orders SET done_quantity = done_quantity + ? WHERE order_sn = ?`)
model.CheckErr(err)
rows, err := rs.Exec(entrustSell.Quantity-entrustSell.Done_quantity, entrustBuy.Order_sn)
if err != nil {
log.Fatalln(err)
}
rowAffected, err := rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
rs.Close()
re := WriteRecordByBuyOrSell(entrustBuy)
rows, err = tx.Exec(`INSERT INTO ww_entrusted_record(order_sn, member_id,
goods_id, main_coin_id, trade_coin_id, entrusted_type, price_type, price,
quantity, done_trade_fee, create_time)VALUES(?,?,?,?,?,?,?,?,?,?,?)`, re.Order_sn, re.Member_id, re.Goods_id, re.Main_coin_id, re.Trade_coin_id, re.Entrusted_type, re.Price_type, re.Price, re.Quantity, re.Done_trade_fee, re.Create_time)
if err != nil {
log.Fatalln(err)
}
rowAffected, err = rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
rs, err = tx.Prepare(`UPDATE ww_entrusted_orders SET done_quantity = ? WHERE order_sn = ?`)
model.CheckErr(err)
rows, err = rs.Exec(entrustSell.Quantity, entrustSell.Order_sn)
if err != nil {
log.Fatalln(err)
}
rowAffected, err = rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
rs.Close()
//卖的数据写入record表
//都是指针惹的祸
//WriteRecordByBuyOrSell(&entrustSell)
re1 := WriteRecordByBuyOrSell(entrustSell)
rows, err = tx.Exec(`INSERT INTO ww_entrusted_record(order_sn, member_id,
goods_id, main_coin_id, trade_coin_id, entrusted_type, price_type, price,
quantity, done_trade_fee, create_time)VALUES(?,?,?,?,?,?,?,?,?,?,?)`, re1.Order_sn, re1.Member_id, re1.Goods_id, re1.Main_coin_id, re1.Trade_coin_id, re1.Entrusted_type, re1.Price_type, re1.Price, re1.Quantity, re.Done_trade_fee, re1.Create_time)
if err != nil {
log.Fatalln(err)
}
rowAffected, err = rows.RowsAffected()
if err != nil {
log.Fatalln(err)
}
fmt.Println(rowAffected)
save = append(save, entrustSell.Order_sn)
j++
//提交事务
if err = tx.Commit(); err != nil {
log.Fatalln(err)
}
}
} else {
j++
}
}
return save
}