<?php
namespace app\task\behavior;
use think\Cache;
use app\task\model\Setting;
use app\task\model\Order as OrderModel;
use app\task\service\Order as OrderService;
use app\common\enum\OrderType as OrderTypeEnum;
use app\common\service\order\Complete as OrderCompleteService;
use app\common\library\helper;
class Order
{
private $model;
private $service;
private $wxappId;
public function run($model)
{
if (!$model instanceof OrderModel)
return new OrderModel and false;
if (!$model::$wxapp_id) return false;
$this->model = $model;
$this->wxappId = $model::$wxapp_id;
$this->master();
return true;
}
private function master()
{
$key = "__task_space__order__{$this->wxappId}";
if (Cache::has($key)) return true;
$this->service = new OrderService;
$config = Setting::getItem('trade');
$this->model->transaction(function () use ($config) {
$this->close($config['order']['close_days']);
$this->receive($config['order']['receive_days']);
$this->settled($config['order']['refund_days']);
});
Cache::set($key, time(), 3600);
return true;
}
private function close($closeDays)
{
if ($closeDays < 1) return false;
$deadlineTime = time() - ((int)$closeDays * 86400);
$this->service->close($deadlineTime);
$this->dologs('close', [
'close_days' => (int)$closeDays,
'deadline_time' => $deadlineTime,
'orderIds' => json_encode($this->service->getCloseOrderIds()),
]);
return true;
}
private function receive($receiveDays)
{
if ($receiveDays < 1) return false;
$deadlineTime = time() - ((int)$receiveDays * 86400);
$filter = [
'pay_status' => 20,
'delivery_status' => 20,
'receipt_status' => 10,
'delivery_time' => ['<=', $deadlineTime]
];
$orderIds = $this->model->where($filter)->column('order_id');
if (!empty($orderIds)) {
$this->model->onBatchUpdate($orderIds, [
'receipt_status' => 20,
'receipt_time' => time(),
'order_status' => 30
]);
$this->onReceiveCompleted($orderIds);
}
$this->dologs('receive', [
'receive_days' => (int)$receiveDays,
'deadline_time' => $deadlineTime,
'orderIds' => json_encode($orderIds),
]);
return true;
}
private function settled($refundDays)
{
$deadlineTime = time() - ((int)$refundDays * 86400);
$filter = [
'order_status' => 30,
'receipt_time' => ['<=', $deadlineTime], 'is_settled' => 0
];
$orderList = $this->model->getList($filter, [
'goods' => ['refund'], ]);
$orderIds = helper::getArrayColumn($orderList, 'order_id');
!empty($orderIds) && (new OrderCompleteService)->settled($orderList);
$this->dologs('settled', [
'refund_days' => (int)$refundDays,
'deadline_time' => $deadlineTime,
'orderIds' => json_encode($orderIds),
]);
}
private function onReceiveCompleted($orderIds)
{
$list = $this->model->getList(['order_id' => ['in', $orderIds]], [
'goods' => ['refund'], 'user', 'address', 'goods', 'express', ]);
if ($list->isEmpty()) return false;
(new OrderCompleteService)->complete($list, OrderTypeEnum::MASTER, $this->wxappId);
return true;
}
private function dologs($method, $params = [])
{
$value = 'behavior Order --' . $method;
foreach ($params as $key => $val)
$value .= ' --' . $key . ' ' . $val;
return log_write($value);
}
}