225 lines
9.0 KiB
PHP
225 lines
9.0 KiB
PHP
<?php
|
||
|
||
|
||
namespace addons\xilufitness\controller;
|
||
|
||
|
||
use addons\xilufitness\model\TimesCardShare;
|
||
use addons\xilufitness\model\UserCard;
|
||
use addons\xilufitness\services\pay\PayService;
|
||
use think\Config;
|
||
use think\Db;
|
||
use think\Log;
|
||
/**
|
||
* @ApiSector(定时任务)
|
||
* @ApiWeigh(1)
|
||
* @package addons\xilufitness\controller
|
||
*/
|
||
class Autotask extends \think\addons\Controller
|
||
{
|
||
protected $noNeedLogin = ["*"];
|
||
|
||
protected $layout = '';
|
||
|
||
|
||
public function _initialize()
|
||
{
|
||
parent::_initialize();
|
||
|
||
if (!$this->request->isCli()) {
|
||
$this->error('只允许在终端进行操作!');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取 配置信息
|
||
* @param int $brand_id 品牌商id
|
||
* @return array
|
||
*/
|
||
private function getConfig(int $brand_id = 0){
|
||
$brandConfig = Config::get('xilubrand')[$brand_id] ?? '';
|
||
return [
|
||
'appid' => $brandConfig['mini_appid'] ?? '',
|
||
'appsecret' => $brandConfig['mini_appsecret'] ?? '',
|
||
'encodingaeskey' => '',
|
||
// 配置商户支付参数
|
||
'mch_id' => $brandConfig['mini_mch_id'] ?? '',
|
||
'mch_key' => $brandConfig['mini_mch_key'] ?? '',
|
||
// 配置商户支付双向证书目录 (p12 | key,cert 二选一,两者都配置时p12优先)
|
||
'ssl_p12' => ROOT_PATH.'public'.$brandConfig['mini_mch_p12'] ?? '',
|
||
'ssl_key' => ROOT_PATH.'public'.$brandConfig['mini_mch_pem_key'] ?? '',
|
||
'ssl_cer' => ROOT_PATH.'public'.$brandConfig['mini_mch_pem_cert'] ?? '',
|
||
// 配置缓存目录,需要拥有写权限
|
||
'cache_path' => RUNTIME_PATH.'wechat',
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 计划任务入口
|
||
*/
|
||
public function cron(){
|
||
Log::log("[".date('Y-m-d H:i:s'."]"." - 开始执行定时任务"));
|
||
$this->change_work_course();
|
||
$this->change_work_camp();
|
||
$this->cancel_wait();
|
||
$msg = $this->change_invalid_share();
|
||
Log::log("[".date('Y-m-d H:i:s'."]"." - 执行定时任务结束"));
|
||
return $msg;
|
||
}
|
||
|
||
/**
|
||
* 清理失效的次卡分享
|
||
*/
|
||
public function change_invalid_share()
|
||
{
|
||
Log::log("[".date('Y-m-d H:i:s'."]"." - 开始清理失效的次卡分享"));
|
||
$share_card = new TimesCardShare();
|
||
$user_card = new UserCard();
|
||
//查询失效的次卡分享
|
||
$share_list = $share_card
|
||
->where('status',0)
|
||
->where('share_expire_time', '<', date('Y-m-d H:i:s'))
|
||
->select();
|
||
foreach ($share_list as $k => $v) {
|
||
try {
|
||
Db::startTrans();
|
||
$share_id = xilufitness_get_id_value($v->id);
|
||
Log::log($share_id);
|
||
$data['status'] = 2;
|
||
$result = Db::name('xilufitness_times_card_share')->where('id', $share_id)->update($data);
|
||
Log::log($result);
|
||
// 判断更新是否成功
|
||
if ($result) {
|
||
$user_card_id = $v->user_card_id;
|
||
$card_info = $user_card::get($user_card_id);
|
||
$card_info['left_times_count'] = $card_info['left_times_count'] + 1;
|
||
$card_info['already_share_times'] = $card_info['already_share_times'] - 1;
|
||
$card_info['left_share_times'] = $card_info['left_share_times'] + 1;
|
||
$card_info->save();
|
||
Log::log("清理失效的次卡分享成功");
|
||
}
|
||
Db::commit();
|
||
} catch (\Exception $e) {
|
||
Log::log("清理失效的次卡分享失败");
|
||
Log::log($e);
|
||
Db::rollback();
|
||
}
|
||
}
|
||
Log::log( "清理失效的次卡分享" . count($share_list) . "条");
|
||
Log::log("[".date('Y-m-d H:i:s'."]"." - 清理失效的次卡分享结束"));
|
||
return "清理失效的次卡分享" . count($share_list) . "条";
|
||
}
|
||
|
||
|
||
/**
|
||
* 开课前五分钟 排队取消 排队失效
|
||
*/
|
||
public function cancel_wait(){
|
||
$model = new \addons\xilufitness\model\Order;
|
||
$time = time() - 300;
|
||
$i = 1;
|
||
do {
|
||
try {
|
||
$total_count = $model->where(['order_status' => 10, 'starttime' => ['egt',$time]])->count('*');
|
||
$list = $model
|
||
->where(['order_status' => 10, 'starttime' => ['egt',$time]])
|
||
->order("pay_time asc")
|
||
->page($i,100)
|
||
->select();
|
||
$current_count = ($i-1)*100 + count($list);
|
||
foreach ($list as $key => $val){
|
||
Db::startTrans();
|
||
$cancelResult = $val->save(['order_status' => 4]);
|
||
if(false !== $cancelResult){
|
||
PayService::getInstance(['mini_config' => $this->getConfig($val['brand_id'])])->refundOrder(xilufitness_get_id_value($val['id']),($val['brand_id'] ?? 0));
|
||
}
|
||
Db::commit();
|
||
unset($cancelResult);
|
||
}
|
||
} catch (\Exception $e){
|
||
Db::rollback();
|
||
Log::record("取消排队失败:".$e->getMessage());
|
||
}
|
||
} while($total_count > $current_count && ++$i);
|
||
}
|
||
|
||
/**
|
||
* 检测课程排课到了开课时间,状态还在待预约 只要有人报名改为 开课成功
|
||
*/
|
||
|
||
public function change_work_course(){
|
||
$model = new \addons\xilufitness\model\WorkCourse;
|
||
$orderModel = new \addons\xilufitness\model\Order;
|
||
$i = 1;
|
||
$page_size = 100;
|
||
do {
|
||
$total_count = $model->where(['status' => 'normal', 'start_at' => ['elt',time()]])->count('*');
|
||
$list = $model
|
||
->where(['status' => 'normal', 'start_at' => ['elt',time()]])
|
||
->order("start_at asc")
|
||
->page($i,$page_size)
|
||
->select();
|
||
array_walk($list,function (&$item,$key) use($orderModel){
|
||
$order_count = $orderModel->where(['brand_id' => $item->brand_id ?? 0, 'data_id' => xilufitness_get_id_value($item->id ?? 0), 'order_type' => $item->course_type ?? -1,
|
||
'order_status' => ['notin',[0,4,10]]])->count('*');
|
||
if($order_count > 0){
|
||
$item->allowField(true)->save(['status' => 'complete']);
|
||
} else {
|
||
$item->allowField(true)->save(['status' => 'failed']);
|
||
}
|
||
});
|
||
$current_count = ($i - 1)*$page_size + count($list);
|
||
|
||
} while($total_count > $current_count && ++$i);
|
||
}
|
||
|
||
/**
|
||
* 检测活动排课到期情况
|
||
*/
|
||
public function change_work_camp(){
|
||
$model = new \addons\xilufitness\model\WorkCamp;
|
||
$orderModel = new \addons\xilufitness\model\Order;
|
||
$i = 1;
|
||
$page_size = 100;
|
||
do {
|
||
$total_count = $model->where(['status' => 'normal', 'start_at' => ['elt',time()]])->count('*');
|
||
$list = $model
|
||
->where(['status' => 'normal', 'start_at' => ['elt',time()]])
|
||
->order("start_at asc")
|
||
->page($i,$page_size)
|
||
->select();
|
||
array_walk($list,function (&$item,$key) use($orderModel){
|
||
$order_count = $orderModel->where(['brand_id' => $item->brand_id ?? 0, 'data_id' => xilufitness_get_id_value($item->id ?? 0), 'order_type' => 3,
|
||
'order_status' => ['notin',[0,4]]])->count('*');
|
||
if($order_count >= $item['camp_count']){
|
||
$item->allowField(true)->save(['status' => 'complete']);
|
||
} else {
|
||
//开营失败 自动退款
|
||
try {
|
||
Db::startTrans();
|
||
$result = $item->allowField(true)->save(['status' => 'failed']);
|
||
if(false !== $result){
|
||
$orderList = $orderModel->where(['brand_id' => $item->brand_id ?? 0, 'data_id' => xilufitness_get_id_value($item->id ?? 0), 'order_type' => 3,
|
||
'pay_status' => 1, 'order_status' => 1])->select();
|
||
foreach ($orderList as $key => $val){
|
||
$orderResult = $val->save(['order_status' => 4]);
|
||
if(false !== $orderResult){
|
||
PayService::getInstance(['mini_config' => $this->getConfig($val['brand_id'])])->refundOrder(xilufitness_get_id_value($val['id']),($val['brand_id'] ?? 0));
|
||
}
|
||
unset($orderResult);
|
||
}
|
||
}
|
||
Db::commit();
|
||
} catch (\Exception $e){
|
||
Db::rollback();
|
||
Log::record("活动开营失败:".$e->getMessage());
|
||
}
|
||
}
|
||
});
|
||
$current_count = ($i - 1)*$page_size + count($list);
|
||
} while($total_count > $current_count && ++$i);
|
||
}
|
||
|
||
|
||
|
||
} |