Browse Source

创建自动刮奖脚本 和接口

master
wanghongjun 2 years ago
parent
commit
e7dd3294d2
  1. 28
      app/command/Autousezone.php
  2. 28
      app/controller/Index.php
  3. 96
      app/logic/Zone.php
  4. 1
      config/console.php

28
app/command/Autousezone.php

@ -0,0 +1,28 @@
<?php
namespace app\command;
use app\logic\Zone;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class Autousezone extends Command
{
protected function configure()
{
// 配置脚本命令的名称和描述
$this->setName('Autousezone')->setDescription('自动完成刮奖脚本');
}
protected function execute(Input $input, Output $output)
{
$count = $input->getOption('limit') ?? 500;
$user_id = $input->getOption('user_id') ?? 1;
$zone_goods_id = $input->getOption('zone_goods_id') ?? 1;
// 执行脚本逻辑
$output->writeln(Zone::auto($user_id,$zone_goods_id,$count));
}
}

28
app/controller/Index.php

@ -131,4 +131,32 @@ class Index extends BaseController
return $this->renderError($validateException->getMessage());
}
}
/**
* temp controller 临时
*/
public function autoTest()
{
$param = Request::param();
try {
validate()->rule([
'limit|limit' => 'number|max:1000000',
'user_id|用户ID' => 'number|length:1,10',
'zone_goods_id|zone_goods_id' => 'number|length:1,10'
])->check($param);
$limit = $param['limit'] ?? 500;
$user_id = $param['user_id'] ?? 1;
$zone_goods_id = $param['zone_goods_id'] ?? 1;
$result = \app\logic\Zone::auto($user_id,$zone_goods_id,$limit);
if ($result != '完成') throw new ValidateException($result);
return $this->renderSuccess($result);
} catch (ValidateException $validateException) {
return $this->renderError($validateException->getMessage());
}
}
}

96
app/logic/Zone.php

@ -250,4 +250,100 @@ class Zone
'save_data' => $save_data
];
}
/**
* 自动刮奖测试机
* @param $user_id
* @param $zone_goods_id
* @param $count
* @return string|void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function auto($user_id = 1,$zone_goods_id = 1,$count = 500)
{
# 验证
$user = User::find($user_id);
if (!$user) return '用户不存在';
$zoneGoods = ZoneGoods::find($zone_goods_id);
if (!$zoneGoods) return '刮奖商品不存在';
$zoneGoodsParam = ZoneGoodsParam::where('zone_goods_id',$zone_goods_id)->where('status',1)->find();
if (!$zoneGoodsParam) return '刮奖奖项不存在';
$balance = $user->balance ?: 0;
$sumPrice = $count * $zoneGoods['price'];
if ($balance < $sumPrice) return '用户余额不足';
# 开始执行
$limit = 1;
while ($limit <= $count) {
# 获取奖项个参数
$zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $zone_goods_id]);
if (empty($zoneParamArr)) return '奖项不存在';
# 获取刮刮乐信息
$resData = Zone::getWinningPrize($zoneParamArr);
$data = $resData['data'];
$save_data = $resData['save_data'];
# 开启事务
$connection = Db::connect();
try {
$connection->startTrans();
# 扣除余额
$zoneGoodsModel = ZoneGoods::field('price')->find($zone_goods_id);
$price = $zoneGoodsModel['price'];
$balance = User::decrBalance($user_id,$price);
# 消费记录
$c_r_id = ConsumptionRecords::createRecords($user_id,$zone_goods_id,$price,$price,$balance,$save_data);
# 解析是否中奖
$awards_amount = 0;
foreach ($save_data as $key => $goodsParam) {
foreach ($goodsParam as $k => $item) {
$save_data[$key][$k]['is_awards'] = 0;
if (isset($item['id'])) {
$awardsAmountRes = ZoneGoodsParam::getAwardsAmount($item['id']);
if ($awardsAmountRes) {
$save_data[$key][$k]['is_awards'] = 1;
$awards_amount += $item['amount'];
}
}
}
}
$ConsumptionRecords = new ConsumptionRecords();
$ConsumptionRecords::awardsData($data,$c_r_id);
# 判断是否中奖
if ($awards_amount > 0) {
# 修改用户余额
$balance = User::incrWithdrawalBalance($user_id,$awards_amount);
# 中奖做记录
AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$balance);
}
# 完成订单
ConsumptionRecords::endOrder($c_r_id,$awards_amount);
$connection->commit();
# 返回刮刮乐图标、金额、订单id
} catch (\Exception $e) {
$connection->rollback();
return $e->getMessage();
}
# 循环执行
$limit++;
}
return '完成';
}
}

1
config/console.php

@ -5,5 +5,6 @@
return [
// 指令定义
'commands' => [
'app\command\Autousezone'
],
];

Loading…
Cancel
Save