Commit 7b8dfc0b authored by wanjilong's avatar wanjilong

add: 提交守护进程

parent 2867ef0b
<?php <?php
use Yaf\Dispatcher;
class Bootstrap extends Yaf\Bootstrap_Abstract{ class Bootstrap extends Yaf\Bootstrap_Abstract{
/**
* 项目基本初始化操作.
*/
public function _initProject()
{
date_default_timezone_set('PRC');
}
/** /**
* 初始化配置文件 * 初始化配置文件
* 全局配置文件 ,环境配置文件 错误码配置文件等 * 全局配置文件 ,环境配置文件 错误码配置文件等
...@@ -12,10 +22,17 @@ class Bootstrap extends Yaf\Bootstrap_Abstract{ ...@@ -12,10 +22,17 @@ class Bootstrap extends Yaf\Bootstrap_Abstract{
Yaf\Registry::set('cliConfig', $globalConfig); Yaf\Registry::set('cliConfig', $globalConfig);
} }
/** /**
* 禁用视图 * autoload.
*
* @param Dispatcher $dispatcher
*/ */
public function _initView(\Yaf\Dispatcher $dispatcher) { public function _initLoader(Dispatcher $dispatcher)
$dispatcher->disableView(); {
$loader = Yaf\Loader::getInstance();
$loader->import(ROOT_PATH.'/vendor/autoload.php');
$loader->import(APP_PATH.'/library/helper.php');
} }
} }
...@@ -18,5 +18,6 @@ class RefundException extends BaseException ...@@ -18,5 +18,6 @@ class RefundException extends BaseException
4 => '目前仅支持支付后的订单退款,请核对', 4 => '目前仅支持支付后的订单退款,请核对',
5 => '该订单不允许退款,请核对', 5 => '该订单不允许退款,请核对',
6 => '该退款单核对ping++状态为未支付,请稍后重试!', 6 => '该退款单核对ping++状态为未支付,请稍后重试!',
7 => '已核销计算订单不支持退款!',
]; ];
} }
...@@ -27,7 +27,7 @@ class DaemonController extends Cli ...@@ -27,7 +27,7 @@ class DaemonController extends Cli
if(empty($task_name)){ if(empty($task_name)){
echo <<<EOD echo <<<EOD
usage: php cli.php daemon run "t=[string]&n=[int|default:4]&j=[string]" usage: php cli.php daemon run "t=wallet&n=2&j=sync_wallet"
t daemo 脚本类名 t daemo 脚本类名
n 进程数 n 进程数
j 进程别名,默认同脚本类名 j 进程别名,默认同脚本类名
......
...@@ -34,7 +34,6 @@ class PayService ...@@ -34,7 +34,6 @@ class PayService
public function do_pay($order_id, $user_id) public function do_pay($order_id, $user_id)
{ {
// 获取订单信息 // 获取订单信息
$data = OrderService::getFullOrderData($order_id, $user_id); $data = OrderService::getFullOrderData($order_id, $user_id);
if (empty($data['result'])) { if (empty($data['result'])) {
...@@ -56,7 +55,8 @@ class PayService ...@@ -56,7 +55,8 @@ class PayService
} }
// 判断是否存在有效订单 // 判断是否存在有效订单
$expire_time = time() + 30 * 60; $max_expire_time = config('pay','pay.expire_time') ?? 1800;
$expire_time = time() + $max_expire_time;
$pay_order_id = $this->gen_pay_order_id($user_id); $pay_order_id = $this->gen_pay_order_id($user_id);
$pay_order = [ $pay_order = [
'pay_order_id' => $pay_order_id, 'pay_order_id' => $pay_order_id,
...@@ -155,13 +155,13 @@ class PayService ...@@ -155,13 +155,13 @@ class PayService
throw new PayException(['cus' => 5]); throw new PayException(['cus' => 5]);
} }
//保持幂等返回成功
if($cnt == 0 && $pay_order['pay_order_status'] == Dictionary::O_PAY_STATUS_PAYED) { if($cnt == 0 && $pay_order['pay_order_status'] == Dictionary::O_PAY_STATUS_PAYED) {
//保持幂等返回成功
return ['pay_order_id' => $pay_order_id]; return ['pay_order_id' => $pay_order_id];
} }
//获取订单 + 子单 + 分销信息 //获取订单 + 子单 + 分销信息
$ret = OrderService::getFullOrderData($this->pay_order['order_id'], $this->pay_order['user_id']); $ret = OrderService::getFullOrderData($pay_order['order_id'], $pay_order['user_id']);
if (empty($ret['result']['order_info'])) { if (empty($ret['result']['order_info'])) {
throw new PayException(['cus' => 1]); throw new PayException(['cus' => 1]);
} }
...@@ -170,6 +170,8 @@ class PayService ...@@ -170,6 +170,8 @@ class PayService
// 生成支付清分单 // 生成支付清分单
$this->make_order_clearing($ret['result']); $this->make_order_clearing($ret['result']);
return ['pay_order_id' => $pay_order_id];
} }
/** /**
...@@ -184,8 +186,10 @@ class PayService ...@@ -184,8 +186,10 @@ class PayService
try{ try{
PayOrderItem::beginTransaction(); PayOrderItem::beginTransaction();
$cnt = PayOrderItem::update([ $cnt = PayOrderItem::update([
'notify_account_status' => 1, 'notify_account_status' => 0,
], ['order_item_id' => $order_item_id, 'notify_account_status' => 0]); 'can_notify_account' => 1,
'can_notify_account_time' => date('Y-m-d H:i:s'),
], ['order_item_id' => $order_item_id, 'can_notify_account'=>0]);
$refund = RefundOrder::getMaster('*', ['order_item_id'=>$order_item_id]); $refund = RefundOrder::getMaster('*', ['order_item_id'=>$order_item_id]);
if(!empty($refund)) { if(!empty($refund)) {
...@@ -212,12 +216,35 @@ class PayService ...@@ -212,12 +216,35 @@ class PayService
return ['order_item_id' => $order_item_id]; return ['order_item_id' => $order_item_id];
} }
return ['order_item_id' => $order_item_id];
}
/**
* @param $order_item_id
* @throws \App\Exception\custom\CodeSpecialException
* 同步钱包处理
*/
public function sync_account_wallet($order_item_id) {
$cnt = PayOrderItem::update([
'notify_account_status' => 1,
'notify_account_success_time' => date('Y-m-d H:i:s')
], ['order_item_id' => $order_item_id, 'can_notify_account' => 1, 'notify_account_status'=>0]);
if($cnt ==0) {//乐观锁,不满足条件不处理
return true;
}
$clearing_items = PayOrderClearingItem::select('*', $clearing_items = PayOrderClearingItem::select('*',
['order_item_id' => $item['order_item_id']] ['order_item_id' => $order_item_id]
); );
$wallet_list = []; $wallet_list = [];
foreach ($clearing_items as $row) { foreach ($clearing_items as $row) {
if($row['pay_amount'] <= 0) {
continue;
}
$wallet_list[] = [ $wallet_list[] = [
'user_id' => $row['account_id'], 'user_id' => $row['account_id'],
'service_name' => 10, 'service_name' => 10,
...@@ -225,24 +252,30 @@ class PayService ...@@ -225,24 +252,30 @@ class PayService
'amount' => $row['pay_amount'], 'amount' => $row['pay_amount'],
'third_order_id' => $row['pay_order_clearing_item_id'], 'third_order_id' => $row['pay_order_clearing_item_id'],
'third_order_id_type' => 1, 'third_order_id_type' => 1,
'third_order_desc' => '核销收入', 'third_order_desc' => '订单收入',
]; ];
} }
if ($wallet_list) { if ($wallet_list) {
$ret = WalletService::send($wallet_list); $ret = WalletService::send($wallet_list);
if($ret) { if($ret) {//同步成功,返回结果
PayOrderItem::update([ PayOrderItem::update([
'notify_account_status' => 2, 'notify_account_status' => 2,
'notify_account_success_time' => date('Y-m-d H:i:s') 'notify_account_success_time' => date('Y-m-d H:i:s')
], ['order_item_id' => $order_item_id, 'notify_account_status' => 1]); ], ['order_item_id' => $order_item_id, 'can_notify_account' => 1]);
} else { } else {
//补偿处理 //补偿处理
PayOrderItem::update([
'notify_account_status' => 0,
], ['order_item_id' => $order_item_id, 'can_notify_account' => 1]);
} }
} else { //没有需要同步的,显示处理
PayOrderItem::update([
'notify_account_status' => 2,
'notify_account_success_time' => date('Y-m-d H:i:s')
], ['order_item_id' => $order_item_id, 'can_notify_account' => 1]);
} }
return ['order_item_id' => $order_item_id];
} }
/** /**
...@@ -292,15 +325,14 @@ class PayService ...@@ -292,15 +325,14 @@ class PayService
throw new PayException(['cut' => 5]); throw new PayException(['cut' => 5]);
} }
if ($this->wallet_list) { //如果是分销子单,则需进入结算队列
$ret = WalletService::send($this->wallet_list); foreach ($this->order_items as $r) {
if($ret) { // 收集直接到账信息
if($r['marketing_type'] == 1 ) {
PayOrderItem::update([ PayOrderItem::update([
'notify_account_status' => 2, 'can_notify_account'=>1,
'notify_account_success_time' => date('Y-m-d H:i:s') 'can_notify_account_time'=>date('Y-m-d H:i:s')
], ['pay_order_id' => $this->pay_order['order_id'], 'notify_account_status' => 1]); ], ['order_item_id'=>$r['order_item_id']]);
} else {
//todo 补偿处理
} }
} }
} }
...@@ -333,49 +365,6 @@ class PayService ...@@ -333,49 +365,6 @@ class PayService
return $total_tip; return $total_tip;
} }
/**
* 计算平台运营补贴
*/
private function make_platform_subsidy_clearing()
{
return 0; //本期不做平台补贴
$account = $this->get_marketing_subsidy();
$total_tip = $account['amount'];
if (empty($total_tip)) {
return 0;
}
$account['account_type'] = Dictionary::ACCOUNT_TYPE_SS;
$account['pay_type'] = Dictionary::PAY_TYPE_OUT;
$account['pay_sub_type'] = Dictionary::PAY_SUB_TYPE_SYS_OUT;
$account['need_recorded'] = Dictionary::NO;
$this->do_clearing_data($account, $total_tip, false);
return $total_tip;
}
/**
* 计算商户运营补贴
*/
private function make_merchant_subsidy_clearing()
{
return 0; // 本期不做商户补贴
$account = $this->get_marketing_subsidy();
$total_tip = $account['amount'];
if (empty($total_tip)) {
return 0;
}
$account['account_type'] = Dictionary::ACCOUNT_TYPE_M;
$account['pay_type'] = Dictionary::PAY_TYPE_OUT;
$account['pay_sub_type'] = Dictionary::PAY_SUB_TYPE_M_OUT;
$account['need_recorded'] = Dictionary::NO;
$this->do_clearing_data($account, $total_tip, false);
return $total_tip;
}
/** /**
* @param $total * @param $total
* @return false|float * @return false|float
...@@ -534,19 +523,6 @@ class PayService ...@@ -534,19 +523,6 @@ class PayService
'need_recorded' => $account['need_recorded'], 'need_recorded' => $account['need_recorded'],
]; ];
// 收集直接到账信息
if($r['marketing_type'] == 1 && $current_tip > 0) {
$this->wallet_list[] = [
'user_id' => $account['account_id'],
'service_name' => 10,
'source_name' => 1,
'amount' => $current_tip,
'third_order_id' => $id,
'third_order_id_type' => 1,
'third_order_desc' => '订单收入',
];
}
$cleared_amount += $r['payment']; $cleared_amount += $r['payment'];
$cleared_tip += $current_tip; $cleared_tip += $current_tip;
} }
......
...@@ -56,10 +56,9 @@ class PingxxService ...@@ -56,10 +56,9 @@ class PingxxService
'refund_mode' => 'to_source', //退款模式。原路退回:to_source,退至余额:to_balance。默认为原路返回。 'refund_mode' => 'to_source', //退款模式。原路退回:to_source,退至余额:to_balance。默认为原路返回。
] ]
); );
FileLog::info('ping++:' . '退款订单返回', json_encode(['res'=>$ret])); FileLog::info('ping++:' . '退款订单返回', json_encode(['res'=>$ret]));
$response = json_decode($ret, true); $response = json_decode($ret, true);
return $response['data']; return $response;
/* /*
{ {
...@@ -91,12 +90,16 @@ class PingxxService ...@@ -91,12 +90,16 @@ class PingxxService
*/ */
} catch (\Pingpp\Error\Base $e) { } catch (\Pingpp\Error\Base $e) {
//throw new $e;
if ($e->getHttpStatus() != null) { if ($e->getHttpStatus() != null) {
header('Status: ' . $e->getHttpStatus()); $msg = $e->getHttpBody();
echo $e->getHttpBody();
} else { } else {
echo $e->getMessage(); $msg = $e->getMessage();
} }
exit($msg);
throw new \Exception($msg, '2001');
} }
} }
......
...@@ -8,6 +8,7 @@ use App\Models\Dictionary; ...@@ -8,6 +8,7 @@ use App\Models\Dictionary;
use App\Models\order\mysql\PayOrder; use App\Models\order\mysql\PayOrder;
use App\Models\order\mysql\PayOrderClearing; use App\Models\order\mysql\PayOrderClearing;
use App\Models\order\mysql\PayOrderClearingItem; use App\Models\order\mysql\PayOrderClearingItem;
use App\Models\order\mysql\PayOrderItem;
use App\Models\order\mysql\RefundOrder; use App\Models\order\mysql\RefundOrder;
use App\Services\order\OrderService; use App\Services\order\OrderService;
...@@ -105,21 +106,6 @@ class RefundService ...@@ -105,21 +106,6 @@ class RefundService
//不用搞清分核算,是否需要平台记账? //不用搞清分核算,是否需要平台记账?
$this->make_refund_clear($refund_order_id); $this->make_refund_clear($refund_order_id);
/*
try{
$ret = $this->send_wallet();
if($ret) {
$edit = ['notify_account_success_time'=>date('Y-m-d H:i:s')];
} else {
$edit = ['notify_account_status'=>Dictionary::SEND_ACCOUNT_STATUS_UNDO];
}
}catch (WalletException $e) {
$edit = ['notify_account_status'=>Dictionary::SEND_ACCOUNT_STATUS_UNDO];
}
//状态确认或回退,回退交给补偿服务处理
RefundOrder::update($edit, $refund_order_id);
*/
} }
/** /**
...@@ -137,15 +123,13 @@ class RefundService ...@@ -137,15 +123,13 @@ class RefundService
try{ try{
RefundOrder::beginTransaction(); RefundOrder::beginTransaction();
$pay_order = PayOrder::getMaster('*', ['order_id'=>$where['order_id'], 'pay_order_status'=>Dictionary::O_PAY_STATUS_PAYED]); $pay_order_item = PayOrderItem::getMaster('*', ['order_item_id'=>$where['order_item_id']]);
if(empty($pay_order)) { if(empty($pay_order_item)) {
throw new RefundException(['cus' => 4]); throw new RefundException(['cus' => 4]);
} }
/* 子单是否已经结算分润 if($pay_order_item['can_notify_account'] == 1) {
if($pay_order['can_refund']) { throw new RefundException(['cus' => 7]);
throw new RefundException(['cus' => 5]);
} }
*/
$refund_order = RefundOrder::getMaster('*', ['order_item_id'=>$where['order_item_id']]); $refund_order = RefundOrder::getMaster('*', ['order_item_id'=>$where['order_item_id']]);
if(!empty($refund_order)) { if(!empty($refund_order)) {
...@@ -170,9 +154,10 @@ class RefundService ...@@ -170,9 +154,10 @@ class RefundService
//重新计算微信手续费 //重新计算微信手续费
$cleared_amount = $cleared_tip = 0; $cleared_amount = $cleared_tip = 0;
$pay_order = PayOrder::getMaster('*', ['order_id'=>$where['order_id']]);
// 总共手续费 // 总共手续费
$wx_tip = PayOrderClearing::getMaster('*', [ $wx_tip = PayOrderClearing::getMaster('*', [
'order_id'=>$pay_order['order_id'], 'order_id'=>$where['order_id'],
'pay_order_id'=>$pay_order['pay_order_id'], 'pay_order_id'=>$pay_order['pay_order_id'],
'pay_type'=>Dictionary::PAY_TYPE_IN] 'pay_type'=>Dictionary::PAY_TYPE_IN]
); );
...@@ -251,12 +236,7 @@ class RefundService ...@@ -251,12 +236,7 @@ class RefundService
} }
private function make_refund_clear() { private function make_refund_clear() {
return true; return true;
$this->refund_order;
$pay_order = PayOrder::get('*', ['order_id'=>$this->refund_order['order_id'], 'pay_order_status'=>Dictionary::O_PAY_STATUS_PAYED]);
$list = PayOrderClearingItem::get('*', ['order_item_id'=>$this->refund_order['order_item_id'], 'pay_order_id'=>$pay_order['pay_order_id']]);
//仅处理WX手续费,平台补贴,商户补贴 //仅处理WX手续费,平台补贴,商户补贴
} }
......
<?php
namespace Daemon;
use Api\PhpServices\Daemon\DaemonServiceInterface;
use Api\PhpUtils\Log\FileLog;
use App\Models\order\mysql\PayOrderItem;
use App\Services\pay\PayService;
class Wallet implements DaemonServiceInterface
{
/**
* 核销、支付后直接到钱包补偿任务
*/
public function run()
{
FileLog::info('Daemon:', 'start');
if (!empty($data['LIMIT'])) {
$where['LIMIT'] = $data['LIMIT'];
}
if (!empty($data['ORDER'])) {
$where['ORDER'] = 'can_notify_account_time ASC';
}
$where['can_notify_account'] = 1;
$where['ORDER'] = 'can_notify_account_time ASC';
$where['LIMIT'] = [0, 10];
$list = PayOrderItem::selectMaster('*', $where);
$payService = new PayService();
foreach ($list as $row) {
$payService->sync_account_wallet($row['order_item_id']);
}
if(empty($list)) {
sleep(10);
}
}
}
\ No newline at end of file
...@@ -14,9 +14,12 @@ if( !substr(php_sapi_name(), 0, 3) == 'cli' ) { ...@@ -14,9 +14,12 @@ if( !substr(php_sapi_name(), 0, 3) == 'cli' ) {
die; die;
} }
define('ROOT_PATH', realpath(__DIR__.'/../'));
define('APPLICATION_PATH', realpath(__DIR__.'/../')); define('APPLICATION_PATH', realpath(__DIR__.'/../'));
require APPLICATION_PATH . '/vendor/autoload.php'; define('APP_PATH', realpath(__DIR__.'/../application'));
$application = new Yaf\Application( APPLICATION_PATH . "/conf/cli.ini");
require ROOT_PATH . '/vendor/autoload.php';
$application = new Yaf\Application( ROOT_PATH . "/conf/cli.ini");
/** /**
* 获取模块/控制器/方法 * 获取模块/控制器/方法
...@@ -24,21 +27,10 @@ $application = new Yaf\Application( APPLICATION_PATH . "/conf/cli.ini"); ...@@ -24,21 +27,10 @@ $application = new Yaf\Application( APPLICATION_PATH . "/conf/cli.ini");
$module = "cli"; $module = "cli";
$controller = $argv[1] ?? ""; $controller = $argv[1] ?? "";
$method = $argv[2] ?? ""; $method = $argv[2] ?? "";
$param = $argv[3] ?? []; $param = [];
if ($param) if (!empty($argv[3]))
{ {
$param = convertUrlQuery($param); parse_str($argv[3], $param);
} }
$application->bootstrap()->getDispatcher()->dispatch( new Yaf\Request\Simple("", $module, $controller,$method,$param) ); $application->bootstrap()->getDispatcher()->dispatch( new Yaf\Request\Simple("", $module, $controller,$method,$param) );
function convertUrlQuery($query)
{
$queryParts = explode('&', $query);
$params = array();
foreach ($queryParts as $param) {
$item = explode('=', $param);
$params[$item[0]] = $item[1];
}
return $params;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment