<?php
public function task()
{
$list = M('SysTask')->where(['status' => ['neq',3]])->select();
// 通过文件锁住操作执行完再执行下一个
$fp = fopen("lock.txt", "w+");
if (!flock($fp, LOCK_EX | LOCK_NB)) {
echo "系统繁忙,请稍后再试";
return false;
}
$result_num = count($list);
$start = time();
if ($list) {
$i = 0;
$j = 0;
$sum = 0;
foreach ($list as $value) {
$sum ++;
//获取缓存,如果存在则跳过进行下一条记录操作
if (($this->getTaskCache($value['id']))) {
$i++;
continue;
}
//设置缓存,防止重复操作同一条记录
$this->setTaskCache($value['id']);
switch ($value['type'] == 1) {
case 1:
$j++;
$this->clickGiftNewPayTask($value);
break;
default:
break;
}
}
}
$end_time = time();
//执行完成解锁
flock($fp,LOCK_UN);
//关闭文件
fclose($fp);
$str = '系统任务处理记录:数量'.$result_num.',耗时'.$end_time-$start.'秒,执行'.$j.'条,跳出'.$i.'条';
write_log($str,'systemTaskLog');
p('处理总数:'.count($list));
p('耗时:'.$end_time-$start.'秒');
p('跳出:'.$i);
p('执行:'.$j);
return true;
}
public function clickGiftNewPayTask($value)
{
$task['start_time'] = time();
$params = json_decode($value['params'], true);
if ( $params['pay_user_id'] == $params['receive_user_id']) {
return false;
}
//1.查找资金日志是否存在此记录
$where = [
'user_id' =>$params['receive_user_id'],//领红包用户ID
'operation_id'=>$params['pay_user_id'],//发红包用户ID
'gift_id' =>$params['gift_id'],//主红包ID
];
$amountLog = M('account_details')->where($where)->field('id')->find();
if(empty($amountLog)) return false;
//2.领取的红包是否存在
$where2 = [
// 'id' =>$params['child_gift_id'],//子红包id
'user_id' =>$params['pay_user_id'],//发红包用户ID
'get_user_id' =>$params['receive_user_id'],//领红包用户ID
'gift_id' =>$params['gift_id'],//主红包ID
'gift_money' =>$params['gift_money'],//红包金额
];
$red_gift = M('gift_child')->where($where2)->field('status')->find();
if(empty($red_gift)) return false;
//3.查找该条记录是否成功
$where3 = [
'id' =>$value['id'],//领红包用户ID
'status' =>3, //发红包用户ID
];
$sys_task = M('sys_task')->where($where3)->field('id')->find();
if($sys_task) return false;
//进行新生商户之间转账操作
$userModel = D('User');
$payUser = $userModel->where(array('user_id' => $params['pay_user_id']))->field('mobile,nickname,uacount_user_id')->find();
$receiveUserId = $userModel->where(array('user_id' => $params['receive_user_id']))->field('uacount_user_id')->find();
//引入ncount库文件
include_once("./Plugins/Ncount/Ncount.php");
$NcountPay = new \NcountPay();
$data = array(
'tranAmount' => $params['gift_money'],//金额
'payUserId' => $payUser['uacount_user_id'],//付款方用户编号
'receiveUserId' => $receiveUserId['uacount_user_id'], //收款方用户编号
);
$result = $NcountPay->transferAccounts($data);
$task = [];
$task['status'] = 2;
if (empty($result['resultCode']) || $result['resultCode'] != '0000') {
//如果失败清除缓存,进行下一次操作
$this->delTaskCache($value['id']);
$task['status'] = 4;
$task['result'] = json_encode($result);
//生成系统任务转账日志
$logs = [];
$logs['pay_user_id'] = $where['operation_id'];//付款用户ID
$logs['receive_user_id']= $where['user_id'];//收款用户ID
$logs['gift_id'] = $params['gift_id'];
$logs['amount'] = $data['tranAmount'];
$logs['pay_code'] = $data['payUserId'];
$logs['receive_code'] = $data['receiveUserId'];
$logs['add_time'] = time();
$logs['result'] = json_encode($result);
M('task_transfer_log')->add($logs);
} else {
$task['status'] = 3;
$task['result'] = 'succeed';
//修改资金流水表的新生支付同步状态:0未同步;1已同步
//更新新生转账状态
M('account_details')->where('user_id',$amountLog['id'])->save(array('is_state'=>1));
//生成系统任务转账日志
$logs = [];
$logs['pay_user_id'] = $where['operation_id'];//付款用户ID
$logs['receive_user_id']= $where['user_id'];//收款用户ID
$logs['gift_id'] = $params['gift_id'];
$logs['amount'] = $data['tranAmount'];
$logs['pay_code'] = $data['payUserId'];
$logs['receive_code'] = $data['receiveUserId'];
$logs['add_time'] = time();
$logs['status'] = 1;
$logs['result'] = json_encode($result);
M('task_transfer_log')->add($logs);
}
$task['end_time'] = time();
$res = D('SysTask')->where(['id' => $value['id']])->save($task);
if ($res === false) {
//如果失败清除缓存,进行下一次操作
$this->delTaskCache($value['id']);
write_log($value, 'clickGiftNewPayTask', date('Y-m-d',time()));
}
//不能删除,删除的话在第二次查询的时候如果查到改id,则会进行下一次的转账执行(有可能会转多次账)
// $this->delTaskCache($value['id']);
return true;
}