Files
shopxo/app/service/CrontabService.php

315 lines
11 KiB
PHP
Raw Permalink Normal View History

2019-08-18 18:46:49 +08:00
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
2021-03-16 10:34:52 +08:00
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
2019-08-18 18:46:49 +08:00
// +----------------------------------------------------------------------
2021-03-16 10:34:52 +08:00
// | Licensed ( https://opensource.org/licenses/mit-license.php )
2019-08-18 18:46:49 +08:00
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;
2021-07-18 23:42:10 +08:00
use think\facade\Db;
2019-08-18 18:46:49 +08:00
use app\service\OrderService;
use app\service\BuyService;
use app\service\MessageService;
2020-06-28 22:50:10 +08:00
use app\service\IntegralService;
2026-06-03 10:43:16 +08:00
use app\service\OtherHandleService;
2019-08-18 18:46:49 +08:00
/**
* 定时任务服务层
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2019-08-18T17:19:33+0800
*/
class CrontabService
{
/**
* 订单自动关闭
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-08-18T17:22:29+0800
* @desc 从订单创建时间开始计算周期
* @param [array] $params [输入参数]
*/
public static function OrderClose($params = [])
{
// 获取可关闭订单
2019-08-20 13:16:42 +08:00
$time = time()-(intval(MyC('common_order_close_limit_time', 30, true))*60);
2019-08-18 18:46:49 +08:00
$where = [
['add_time', '<', $time],
['status', '=', 1],
];
2021-07-18 23:42:10 +08:00
$order = Db::name('Order')->where($where)->field('id,status,user_id')->select()->toArray();
2019-08-18 18:46:49 +08:00
// 状态
$sucs = 0;
$fail = 0;
if(!empty($order))
{
2023-02-08 21:20:04 +08:00
// 语言
$lang = MyLang('common_service.crontab');
$message = $lang['order_close_message'];
$status_history = $lang['order_close_status_history'];
2019-08-18 18:46:49 +08:00
// 订单更新数据
$upd_data = [
'status' => 6,
'close_time' => time(),
'upd_time' => time(),
];
foreach($order as $v)
{
// 开启事务
Db::startTrans();
2019-08-18 19:46:32 +08:00
if(Db::name('Order')->where(['id'=>$v['id'], 'status'=>1])->update($upd_data))
2019-08-18 18:46:49 +08:00
{
// 库存回滚
$ret = BuyService::OrderInventoryRollback(['order_id'=>$v['id'], 'order_data'=>$upd_data]);
if($ret['code'] == 0)
{
// 用户消息
2023-02-08 21:20:04 +08:00
MessageService::MessageAdd($v['user_id'], $message['title'], $message['desc'], $message['type'], $v['id']);
2019-08-18 18:46:49 +08:00
// 订单状态日志
2023-02-08 21:20:04 +08:00
OrderService::OrderHistoryAdd($v['id'], $upd_data['status'], $v['status'], $status_history['desc'], 0, $status_history['type']);
2019-08-18 18:46:49 +08:00
// 提交事务
Db::commit();
$sucs++;
continue;
}
}
// 事务回滚
Db::rollback();
$fail++;
}
}
2023-01-19 17:44:03 +08:00
return DataReturn(MyLang('operate_success'), 0, ['sucs'=>$sucs, 'fail'=>$fail]);
2019-08-18 18:46:49 +08:00
}
/**
* 订单自动收货
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-08-18T17:24:05+0800
* @desc 从发货时间开始计算周期
* @param [array] $params [输入参数]
*/
public static function OrderSuccess($params = [])
{
// 获取可收货订单
2019-08-20 13:16:42 +08:00
$time = time()-(intval(MyC('common_order_success_limit_time', 21600, true))*60);
2019-08-18 18:46:49 +08:00
$where = [
['delivery_time', '<', $time],
['status', '=', 3],
];
2021-07-18 23:42:10 +08:00
$order = Db::name('Order')->where($where)->field('id,status,user_id')->select()->toArray();
2019-08-18 18:46:49 +08:00
// 状态
$sucs = 0;
$fail = 0;
if(!empty($order))
{
2023-02-08 21:20:04 +08:00
// 语言
$lang = MyLang('common_service.crontab');
$message = $lang['order_collect_message'];
$status_history = $lang['order_collect_status_history'];
2019-08-18 18:46:49 +08:00
// 更新订单状态
$upd_data = [
'status' => 4,
'collect_time' => time(),
'upd_time' => time(),
];
foreach($order as $v)
{
// 开启事务
Db::startTrans();
2019-08-18 19:46:32 +08:00
if(Db::name('Order')->where(['id'=>$v['id'], 'status'=>3])->update($upd_data))
2019-08-18 18:46:49 +08:00
{
2020-06-28 22:50:10 +08:00
// 订单商品积分赠送
$ret = IntegralService::OrderGoodsIntegralGiving(['order_id'=>$v['id']]);
2019-08-18 18:46:49 +08:00
if($ret['code'] == 0)
{
2020-06-28 22:50:10 +08:00
// 订单商品销量增加
2021-11-30 14:57:22 +08:00
$ret = OrderService::GoodsSalesCountInc(['order_id'=>$v['id'], 'opt_type'=>'collect']);
2020-06-28 22:50:10 +08:00
if($ret['code'] == 0)
{
// 用户消息
2023-02-08 21:20:04 +08:00
MessageService::MessageAdd($v['user_id'], $message['title'], $message['desc'], $message['type'], $v['id']);
2019-08-18 18:46:49 +08:00
2020-06-28 22:50:10 +08:00
// 订单状态日志
2023-02-08 21:20:04 +08:00
OrderService::OrderHistoryAdd($v['id'], $upd_data['status'], $v['status'], $status_history['desc'], 0, $status_history['type']);
2019-08-18 18:46:49 +08:00
2020-06-28 22:50:10 +08:00
// 提交事务
Db::commit();
$sucs++;
continue;
}
2019-08-18 18:46:49 +08:00
}
}
// 事务回滚
Db::rollback();
$fail++;
}
}
2023-01-19 17:44:03 +08:00
return DataReturn(MyLang('operate_success'), 0, ['sucs'=>$sucs, 'fail'=>$fail]);
2019-08-18 18:46:49 +08:00
}
2020-07-28 23:28:06 +08:00
/**
* 支付日志订单关闭
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-28
* @desc description
* @param [array] $params [输入参数]
*/
public static function PayLogOrderClose($params = [])
{
// 时长
$time = time()-(intval(MyC('common_pay_log_order_close_limit_time', 30, true))*60);
// 更新关闭
$where = [
['add_time', '<', $time],
['status', '=', 0],
];
$data = [
'status' => 2,
'close_time' => time(),
];
$res = Db::name('PayLog')->where($where)->update($data);
2023-01-19 17:44:03 +08:00
return DataReturn(MyLang('operate_success'), 0, $res);
2020-07-28 23:28:06 +08:00
}
2022-03-07 12:30:10 +08:00
/**
* 商品积分赠送
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-28
* @desc description
* @param [array] $params [输入参数]
*/
public static function GoodsGiveIntegral($params = [])
{
// 获取可赠送的日志数据
$time = time()-(intval(MyC('common_goods_give_integral_limit_time', 21600, true))*60);
$where = [
['add_time', '<', $time],
['status', '=', 0],
];
$data = Db::name('GoodsGiveIntegralLog')->where($where)->field('id,status,user_id,integral')->select()->toArray();
// 状态
$sucs = 0;
$fail = 0;
if(!empty($data))
{
2023-02-08 21:20:04 +08:00
// 语言
$lang = MyLang('common_service.crontab.goods_give_integral');
2022-03-07 12:30:10 +08:00
// 更新状态
$upd_data = [
'status' => 1,
'upd_time' => time(),
];
foreach($data as $v)
{
// 开启事务
Db::startTrans();
if(Db::name('GoodsGiveIntegralLog')->where(['id'=>$v['id'], 'status'=>0])->update($upd_data))
{
2022-03-27 23:32:17 +08:00
// 用户是否存在
$count = (int) Db::name('User')->where(['id'=>$v['user_id']])->count();
if($count > 0)
2022-03-07 12:30:10 +08:00
{
2022-03-27 23:32:17 +08:00
// 扣减用户锁定积分
if(!Db::name('User')->where(['id'=>$v['user_id']])->dec('locking_integral', $v['integral'])->update())
{
2023-02-08 21:20:04 +08:00
return DataReturn($lang['user_lock_integral_dec_fail'].'['.$v['id'].'-'.$v['user_id'].']', -2);
2022-03-27 23:32:17 +08:00
}
2022-03-07 12:30:10 +08:00
2022-03-27 23:32:17 +08:00
// 增加用户有效积分
$user_integral = Db::name('User')->where(['id'=>$v['user_id']])->value('integral');
if(!Db::name('User')->where(['id'=>$v['user_id']])->inc('integral', $v['integral'])->update())
{
2023-02-08 21:20:04 +08:00
return DataReturn($lang['user_valid_integral_inc_fail'].'['.$v['id'].'-'.$v['user_id'].']', -3);
2022-03-27 23:32:17 +08:00
}
2022-03-07 12:30:10 +08:00
2022-03-27 23:32:17 +08:00
// 积分日志
2023-02-08 21:20:04 +08:00
IntegralService::UserIntegralLogAdd($v['user_id'], $user_integral, $v['integral'], $lang['integral_log_desc'], 1);
2022-03-27 23:32:17 +08:00
}
2022-03-07 12:30:10 +08:00
// 提交事务
Db::commit();
$sucs++;
continue;
}
// 事务回滚
Db::rollback();
$fail++;
}
}
2023-01-19 17:44:03 +08:00
return DataReturn(MyLang('operate_success'), 0, ['sucs'=>$sucs, 'fail'=>$fail]);
2022-03-07 12:30:10 +08:00
}
2026-06-03 10:43:16 +08:00
/**
* 微信发货同步队列处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2026-05-26
* @desc description
* @param [array] $params [输入参数]
*/
public static function OrderDeliverySyncWeixin($params = [])
{
$limit = empty($params['limit']) ? 100 : intval($params['limit']);
$time = time()-intval(MyC('common_order_delivery_sync_weixin_limit_time', 30, true));
$data = Db::name('OrderDeliverySyncWeixin')->where(function($query) use ($time)
{
$query->where([
['status', '=', 0],
['add_time', '<=', $time],
])->whereOr([
['status', '=', 2],
]);
})->order('id asc')->limit($limit)->select()->toArray();
$sucs = 0;
$fail = 0;
if(!empty($data))
{
foreach($data as $v)
{
$handle_params = OtherHandleService::OrderDeliverySyncWeixinQueueParams($v);
$ret = OtherHandleService::OrderDeliverySyncWeixinHandle($handle_params);
if(isset($ret['code']) && $ret['code'] == 0)
{
Db::name('OrderDeliverySyncWeixin')->where(['id'=>$v['id']])->update([
'status' => 1,
'fail_reason' => '',
'upd_time' => time(),
]);
$sucs++;
} else {
Db::name('OrderDeliverySyncWeixin')->where(['id'=>$v['id']])->update([
'status' => 2,
'fail_reason' => empty($ret['msg']) ? MyLang('handle_fail') : $ret['msg'],
'upd_time' => time(),
]);
$fail++;
}
}
}
return DataReturn(MyLang('operate_success'), 0, ['sucs'=>$sucs, 'fail'=>$fail]);
}
2019-08-18 18:46:49 +08:00
}
?>