Merge branch 'star' of git.kingsome.cn:server/game2006api into star

This commit is contained in:
hujiabin 2023-07-07 17:14:14 +08:00
commit 83af3a1812
9 changed files with 205 additions and 12 deletions

View File

@ -346,7 +346,8 @@ class Market(object):
['lv_filter', 0, '等级过滤'],
['quality_filter', 0, '品阶顾虑'],
['durability_filter', 0, '能量过滤'],
['price_filter', '', '价格过滤(用|分割)']
['price_filter', '', '价格过滤(用|分割)'],
['amount_filter', '', '数量过滤(低|高)']
],
'response': [
_common.RspHead(),

View File

@ -117,6 +117,20 @@ class Shop(object):
['goods_chg', _common.NewGoods(), '购买后更新商品的最新信息(可能为null客户端需要做容错处理)'],
]
},
{
'name': 'buyDiamond',
'desc': '购买钻石',
'group': 'Shop',
'url': 'webapp/index.php?c=Shop&a=buyDiamond',
'params': [
_common.ReqHead(),
['num', 0, '购买数量'],
],
'response': [
_common.RspHead(),
['block_chain', _common.ShopTrans(), '链上购买订单信息'],
]
},
{
'name': 'buyGoodsDirect',
'desc': '直接购买(充值,gold)',

View File

@ -1197,6 +1197,7 @@ CREATE TABLE `t_bc_order` (
`ext_data` mediumblob COMMENT '扩展数据自定义',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`price` varchar(60) COLLATE utf8_bin NOT NULL COMMENT '价格',
PRIMARY KEY (`idx`),
UNIQUE KEY `order_id` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

View File

@ -0,0 +1,5 @@
begin;
alter table t_bc_order add column `price` varchar(60) COMMENT '价格';
commit;

View File

@ -24,6 +24,8 @@ require_once('services/BlockChainService.php');
require_once('phpcommon/bchelper.php');
// use phpcommon as phpcommon;
use models\BcOrder;
use phpcommon\SqlHelper;
use models\BoxOrder;
use models\Nft;
@ -765,6 +767,8 @@ class MarketController extends BaseAuthedController
$lv_filter = getReqVal('lv_filter', 0);
$quality_filter = getReqVal('quality_filter', 0);
$durability_filter = getReqVal('durability_filter', 0);
$amount_filter = getReqVal('amount_filter', 0);
$amount_filter_array = explode('|', $amount_filter);
$price_filter = getReqVal('price_filter', '');
$price_filter_array = explode('|', $price_filter);
@ -790,6 +794,14 @@ class MarketController extends BaseAuthedController
}
return '';
};
$amount_filter_fn = function ($f) {
if (count($f) == 2) {
$low = $f[0];
$top = $f[1];
return 'AND amount>=' . $low . ' AND amount<=' . $top . ' ';
}
return '';
};
$lv_filter_fn = function ($f) {
$f = (int) $f;
return 'AND c_lv>=' . $f . ' ';
@ -851,6 +863,7 @@ class MarketController extends BaseAuthedController
$quality_filter_fn($quality_filter) .
$durability_filter_fn($durability_filter) .
$price_filter_fn($price_filter_array) .
$amount_filter_fn($amount_filter_array) .
$search_filter_fn($search_filter_array) .
$order_fn($order_method, $order_asc),
array(
@ -875,6 +888,7 @@ class MarketController extends BaseAuthedController
$quality_filter_fn($quality_filter) .
$durability_filter_fn($durability_filter) .
$price_filter_fn($price_filter_array) .
$amount_filter_fn($amount_filter_array) .
$search_filter_fn($search_filter_array) .
$order_fn($order_method, $order_asc) .
'LIMIT ' . $start . ',' . $page_size,
@ -1164,6 +1178,23 @@ class MarketController extends BaseAuthedController
return;
}
if (!$this->markOrderBuyStatus($idx)) {
$this->_rspErr(1, 'buy failed, update order status failed, idx:' . $idx);
return;
}
$item_id = $goods['item_id'];
$item_count = $goods['amount'];
BcOrder::upsert($response['trans_id'], array(
'item_id' => $item_id,
'item_num' => $item_count,
'order_type' => 1,
'ext_data' => json_encode(array(
'mode' => SHOP_BUY_MODE_NORMAL,
)),
));
$this->_rspData(array(
'block_chain' => $response,
));
@ -1885,4 +1916,29 @@ class MarketController extends BaseAuthedController
}
return $row;
}
private function markOrderBuyStatus($idx)
{
$self = myself();
if (!$self) {
return false;
}
$r = SqlHelper::update(
$self->_getMarketMysql(''),
't_market_store',
array(
'idx' => $idx,
),
array(
'status' => 3,
'buytime' => $self->_getNowTime(),
)
);
if (!$r) {
return false;
}
return true;
}
}

View File

@ -700,6 +700,41 @@ class ShopController extends BaseAuthedController
}
}
public function buyDiamond()
{
$num = getReqVal('num', 0);
$price = $this->normalizeWeb3Price($num);
$item_id = V_ITEM_DIAMOND;
$item_count = $num;
$response = services\BlockChainService::gameItemMallBuy(
Transaction::BUY_GOODS_ACTION_TYPE,
$price,
$item_id,
$item_count
);
BcOrder::upsert($response['trans_id'], array(
'item_id' => $item_id,
'item_num' => $item_count,
'order_type' => 1,
'ext_data' => json_encode(array(
'mode' => SHOP_BUY_MODE_NORMAL,
)),
));
$response['item_id'] = $item_id;
$response['item_num'] = $item_count;
error_log("buy diamond, item_id = " . $item_id . " item_count = " . $item_count . " num = " . $num . " price = " . $price . " response = " . json_encode($response));
$this->_rspData(
array(
"block_chain" => $response
)
);
}
public function buyGoodsDS()
{
$idx = getReqVal('idx', 0);

View File

@ -83,6 +83,79 @@ class BlockChainService {
}
}
/*
注意!!!
调用方调用前需要校验actionType和myself()->_getAddress,
非法的参数,或者签名服挂了,该函数直接中断请求,不会运行到调用方后续逻辑
trans_id订单id
gameItemMallBuy
setv
a
b
c
*/
public static function gameItemMarketBuy($actionType, $price, $itemId, $itemNum)
{
if (!($actionType > Transaction::BUY_BEGIN_ACTION_TYPE &&
$actionType < Transaction::BUY_END_ACTION_TYPE)) {
error_log('gameItemMarketBuy action_type error:' . $actionType);
myself()->_rspErr(500, 'server internal error 1');
die();
return;
}
$account = myself()->_getAddress();
if (empty($account)) {
error_log('gameItemMarketBuy address is emtpy:' . myself()->_getAccountId());
myself()->_rspErr(500, 'server internal error 2');
die();
return;
}
$params = array(
'c' => 'GameItemMarket',
'a' => 'buy',
'account' => $account,
'price' => $price,
);
{
$url = self::getWeb3ServiceUrl();
$response = '';
if (!phpcommon\HttpClient::get
($url,
$params,
$response)) {
myself()->_rspErr(500, 'server internal error 3, url:' . $url);
die();
return;
}
error_log("gameItemMarketBuy:" . $response . "url:" . $url);
$rspObj = json_decode($response, true);
if ($rspObj['errcode'] == 0) {
$transId = $rspObj['trans_id'];
Transaction::add(
$transId,
$actionType,
'', //$tokenId,
'', //$tokenType,
0, //$itemUniId,
$itemId, //$itemId,
$itemNum,
1
);
return array(
'trans_id' => $transId,
'params' => $rspObj['params']
);
} else {
myself()->_rspErr(500, 'server internal error 4');
die();
return;
}
}
}
/*
$price 是一个小数精确到小数点后5位
*/

View File

@ -146,10 +146,11 @@ class BuyShopGoodsCbService
}
}
private function getAccountId($address){
private function getAccountId($address)
{
$row = SqlHelper::ormSelectOne
(myself()->_getMysql($address),
$row = SqlHelper::ormSelectOne(
myself()->_getMysql($address),
't_user',
array(
'address' => $address
@ -158,5 +159,4 @@ class BuyShopGoodsCbService
return $row['account_id'];
}
}

View File

@ -239,6 +239,14 @@ class ShopAddItemService
));
}
break;
case V_ITEM_DIAMOND:
{
$this->_updateUserInfo($conn,$accountId,array(
'diamond' => function () use($itemNum) {
return "diamond + ${itemNum}";
}
));
}
default:
{
}