chore: 添加静态资源文件和版本配置文件

添加大量图片、字体、音频等静态资源文件,包括用户界面图片、模板文件和安装界面素材
添加系统版本配置文件(.version)和常量定义文件(.constant)
更新供应商依赖文件,包括Symfony VarDumper组件和相关许可证文件
添加验证码配置文件(captcha.php)和.gitignore规则
This commit is contained in:
2026-03-06 20:14:23 +08:00
commit c9a98f342c
4485 changed files with 490986 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderCommentServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 自动执行默认好评
* Class AutoCommentOrderJob
* @package app\jobs\order
*/
class AutoCommentOrderJob extends BaseJobs
{
use QueueTrait;
/**
* @return string
*/
protected static function queueName()
{
return 'CRMEB_PRO_TASK';
}
/**
* @param $where
* @param $page
* @param $limit
* @return bool
*/
public function doJob($where, $page, $limit)
{
try {
/** @var StoreOrderCommentServices $service */
$service = app()->make(StoreOrderCommentServices::class);
$service->runAutoCommentOrder($where, $page, $limit);
} catch (\Throwable $e) {
response_log_write([
'message' => '自动默认好评,失败原因:[' . class_basename($this) . ']' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,58 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderTakeServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 自动执行确认收货
* Class AutoTakeOrderJob
* @package app\jobs\order
*/
class AutoTakeOrderJob extends BaseJobs
{
use QueueTrait;
/**
* @return string
*/
protected static function queueName()
{
return 'CRMEB_PRO_TASK';
}
/**
* @param $where
* @param $page
* @param $limit
* @return bool
*/
public function doJob($where, $page, $limit)
{
try {
/** @var StoreOrderTakeServices $service */
$service = app()->make(StoreOrderTakeServices::class);
$service->runAutoTakeOrder($where, $page, $limit);
} catch (\Throwable $e) {
response_log_write([
'message' => '自动执行确认收货,失败原因:[' . class_basename($this) . ']' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,51 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreDeliveryOrderServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 同城配送
* Class CityDeliveryJob
* @package app\jobs
*/
class CityDeliveryJob extends BaseJobs
{
use QueueTrait;
/**
* 同步创建、更新达达门店信息
* @param $id
* @param $is_new
* @return bool
*/
public function syncCityShop($id, $is_new)
{
try {
/** @var StoreDeliveryOrderServices $deliveryOrderServices */
$deliveryOrderServices = app()->make(StoreDeliveryOrderServices::class);
$deliveryOrderServices->syncCityShop((int)$id);
} catch (\Throwable $e) {
response_log_write([
'message' => '同步创建同城配送达达门店失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,53 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderInvoiceServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 支付成功创建发票信息
* Class CreateInvoiceJob
* @package app\jobs\order
*/
class CreateInvoiceJob extends BaseJobs
{
use QueueTrait;
/**
* @param $orderInfo
* @return bool
*/
public function doJob(int $uid, int $order_id, $invoice_id)
{
if (!$uid || !$order_id || !$invoice_id) {
return true;
}
try {
//创建开票数据
/** @var StoreOrderInvoiceServices $storeOrderInvoiceServices */
$storeOrderInvoiceServices = app()->make(StoreOrderInvoiceServices::class);
$storeOrderInvoiceServices->makeUp($uid, $order_id, $invoice_id);
} catch (\Throwable $e) {
response_log_write([
'message' => '创建订单发票信息失败失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace app\jobs\order;
use crmeb\basic\BaseJobs;
use crmeb\services\wechat\MiniProgram;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 小程序订单处理
*/
class MiniOrderJob extends BaseJobs
{
use QueueTrait;
/**
* @param string $out_trade_no
* @param int $logistics_type
* @param array $shipping_list
* @param string $payer_openid
* @param string $path
* @param int $delivery_mode
* @param bool $is_all_delivered
* @return bool
*/
public function doJob(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, string $path, int $delivery_mode = 1, bool $is_all_delivered = true)
{
try {
\think\facade\Log::info('小程序订单处理开始,订单号:' . $out_trade_no);
MiniProgram::shippingByTradeNo($out_trade_no, $logistics_type, $shipping_list, $payer_openid, $path, $delivery_mode, $is_all_delivered);
} catch (\Throwable $e) {
Log::error('小程序订单处理失败,原因:' . $e->getMessage());
}
return true;
}
}

View File

@@ -0,0 +1,161 @@
<?php
namespace app\jobs\order;
use app\services\order\StoreOrderCartInfoServices;
use app\services\order\StoreOrderCreateServices;
use app\services\order\StoreOrderComputedServices;
use app\services\user\UserServices;
use crmeb\basic\BaseJobs;
use crmeb\services\CacheService;
use crmeb\traits\QueueTrait;
/**
* 订单创建
* Class OrderCreateAfterJob
* @package app\jobs
*/
class OrderCreateAfterJob extends BaseJobs
{
use QueueTrait;
/**
* 清理订单确认生成缓存
* @param int $uid
* @param string $unique
* @param string $key
* @return bool
*/
public function delOrderCache(int $uid, string $unique, string $key = 'user_order_')
{
CacheService::redisHandler()->delete($key . $uid . $unique);
return true;
}
/**
* 设置默认地址、更新自提人信息
* @return bool
*/
public function updateUser($orderInfo, $group, $userInfo)
{
try {
/** @var StoreOrderCreateServices $orderCreate */
$orderCreate = app()->make(StoreOrderCreateServices::class);
$orderCreate->updateUserAddress($orderInfo, $group);
} catch (\Throwable $e) {
response_log_write([
'message' => '设置用户默认地址信息失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
try {
$uid = $orderInfo['uid'] ?? 0;
//记录自提人电话和姓名
if ($uid && ($userInfo['real_name'] != $orderInfo['real_name'] || $userInfo['record_phone'] != $orderInfo['user_phone'])) {
/** @var UserServices $userService */
$userService = app()->make(UserServices::class);
$userService->update(['uid' => $uid], ['real_name' => $orderInfo['real_name'], 'record_phone' => $orderInfo['user_phone']]);
}
} catch (\Throwable $e) {
response_log_write([
'message' => '更新用户自提人信息失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 删除购物车
* @return bool
*/
public function delCart($group)
{
try {
/** @var StoreOrderCreateServices $orderCreate */
$orderCreate = app()->make(StoreOrderCreateServices::class);
$orderCreate->delCart($group);
} catch (\Throwable $e) {
response_log_write([
'message' => '删除购物车失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 订单后置处理
* @param $userInfo
* @param $orderInfo
* @param $data
* @param $activity
* @return bool
*/
public function compute($userInfo, $orderInfo, $data, $activity)
{
if (($orderInfo['uid'] && !$userInfo) || !$orderInfo) {
return true;
}
$uid = (int)$orderInfo['uid'];
$orderId = (int)$orderInfo['id'];
try {
$spread_uid = $spread_two_uid = 0;
$cartInfo = $data['cartInfo'] ?? [];
$priceData = $data['priceData'] ?? [];
$addressId = $data['addressId'] ?? 0;
/** @var StoreOrderCreateServices $createService */
$createService = app()->make(StoreOrderCreateServices::class);
$spread_ids = [];
if ($cartInfo && $priceData) {
/** @var StoreOrderCartInfoServices $cartServices */
$cartServices = app()->make(StoreOrderCartInfoServices::class);
[$cartInfo, $spread_ids] = $createService->computeOrderProductTruePrice($orderInfo, $cartInfo, $priceData, $uid, $userInfo);
$cartServices->updateCartInfo($orderId, $cartInfo);
}
$orderData = [];
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
if ($spread_ids) {
[$spread_uid, $spread_two_uid] = $spread_ids;
$orderData['spread_uid'] = $spread_uid;
$orderData['spread_two_uid'] = $spread_two_uid;
} else {
$spread_uid = $userServices->getSpreadUid($uid);
if ($spread_uid > 0 && sys_config('brokerage_level', 2) == 2) {
$spread_two_uid = $userServices->getSpreadUid($spread_uid, [], false);
}
}
if ($spread_uid > 0) {
$orderData['spread_uid'] = $spread_uid;
}
if ($spread_two_uid > 0) {
$orderData['spread_two_uid'] = $spread_two_uid;
}
if ($cartInfo && (isset($activity['type']) && $activity['type'] == 0)) {
/** @var StoreOrderComputedServices $orderComputed */
$orderComputed = app()->make(StoreOrderComputedServices::class);
if ($userServices->checkUserPromoter($spread_uid)) $orderData['one_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'one_brokerage', false);
if ($userServices->checkUserPromoter($spread_two_uid)) $orderData['two_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'two_brokerage', false);
$orderData['division_staff_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'division_staff_brokerage', false);
$orderData['division_agent_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'division_agent_brokerage', false);
$orderData['division_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'division_brokerage', false);
}
if ($orderData) $createService->update(['id' => $orderId], $orderData);
} catch (\Throwable $e) {
response_log_write([
'message' => '计算订单实际优惠、积分、邮费、佣金失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,53 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderDeliveryServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 订单发货
* Class OrderDeliveryJob
* @package app\jobs
*/
class OrderDeliveryJob extends BaseJobs
{
use QueueTrait;
/**
* 确认收货
* @param $orderInfo
* @param $data
* @param $type
* @return bool
*/
public function doJob($orderInfo, $data, $type)
{
try {
/** @var StoreOrderDeliveryServices $storeOrderDeliveryServices */
$storeOrderDeliveryServices = app()->make(StoreOrderDeliveryServices::class);
$data['type'] = $type;
$storeOrderDeliveryServices->doDelivery((int)$orderInfo['id'], $orderInfo, $data);
} catch (\Throwable $e) {
response_log_write([
'message' => '收银台订单自动发货失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

429
app/jobs/order/OrderJob.php Normal file
View File

@@ -0,0 +1,429 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\jobs\user\UserLevelJob;
use app\services\activity\discounts\StoreDiscountsServices;
use app\services\activity\bargain\StoreBargainServices;
use app\services\activity\combination\StoreCombinationServices;
use app\services\activity\seckill\StoreSeckillServices;
use app\services\activity\coupon\StoreCouponUserServices;
use app\services\message\service\StoreServiceServices;
use app\services\message\sms\SmsSendServices;
use app\services\order\StoreOrderCartInfoServices;
use app\services\order\StoreOrderComputedServices;
use app\services\order\StoreOrderCreateServices;
use app\services\order\StoreOrderEconomizeServices;
use app\services\order\StoreOrderServices;
use app\services\product\product\StoreProductServices;
use app\services\user\member\MemberCardServices;
use app\services\user\label\UserLabelRelationServices;
use app\services\user\UserServices;
use app\services\wechat\WechatUserServices;
use app\webscoket\SocketPush;
use crmeb\basic\BaseJobs;
use crmeb\services\wechat\Messages;
use crmeb\services\wechat\OfficialAccount;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 订单消息队列
* Class OrderJob
* @package app\jobs
*/
class OrderJob extends BaseJobs
{
use QueueTrait;
/**
* 执行订单支付成功发送消息
* @param $order
* @return bool
*/
public function otherTake($order)
{
if ($order['supplier_id']) {
//向门店后台发送新订单消息
try {
SocketPush::supplier()->to($order['supplier_id'])->type('NEW_ORDER')->data(['order_id' => $order['order_id']])->push();
} catch (\Throwable $e) {
response_log_write([
'message' => '向后台发送新订单消息失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
} else {
//向后台发送新订单消息
try {
SocketPush::admin()->type('NEW_ORDER')->data(['order_id' => $order['order_id']])->push();
} catch (\Throwable $e) {
response_log_write([
'message' => '向后台发送新订单消息失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
}
return true;
}
/**
* 设置用户购买次数和检测时候成为推广人
* @param $order
*/
public function setUserPayCountAndPromoter($order)
{
try {
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$userInfo = $userServices->get($order['uid']);
if ($userInfo) {
$userInfo->pay_count = $userInfo->pay_count + 1;
if (!$userInfo->is_promoter) {
/** @var StoreOrderServices $orderServices */
$orderServices = app()->make(StoreOrderServices::class);
$price = $orderServices->sum(['pid' => 0, 'paid' => 1, 'refund_status' => 0, 'uid' => $userInfo['uid']], 'pay_price');
$status = is_brokerage_statu($price);
if ($status) {
$userInfo->is_promoter = 1;
}
}
$userInfo->save();
}
} catch (\Throwable $e) {
response_log_write([
'message' => '更新用户订单数失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 设置用户购买的标签
* @param $order
*/
public function setUserLabel($order)
{
try {
/** @var StoreOrderCartInfoServices $cartInfoServices */
$cartInfoServices = app()->make(StoreOrderCartInfoServices::class);
$cartInfos = $cartInfoServices->getCartColunm(['oid' => $order['id']], 'cart_info');
$cartInfo = [];
foreach ($cartInfos as $cart) {
$cartInfo[] = is_string($cart) ? json_decode($cart, true) : $cart;
}
$productIds = array_unique(array_column($cartInfo, 'product_id'));
/** @var StoreProductServices $productServices */
$productServices = app()->make(StoreProductServices::class);
$label = $productServices->getColumn([['id', 'in', $productIds]], 'label_id');
$labelIds = [];
if ($label) {
$labelIds = explode(',', implode(',', $label));
}
if ($order['type'] == 5 && $order['activity_id']) {
/** @var StoreDiscountsServices $storeDiscountsServices */
$storeDiscountsServices = app()->make(StoreDiscountsServices::class);
$discounts_label = $storeDiscountsServices->value(['id' => $order['activity_id']], 'link_ids');
if ($discounts_label) {
$labelIds = array_merge($labelIds, explode(',', $discounts_label));
}
}
if (!$labelIds) {
return true;
}
$store_id = $order['store_id'] ?? 0;
$type = $store_id ? 1 : 0;
$labelIds = array_unique($labelIds);
/** @var UserLabelRelationServices $labelServices */
$labelServices = app()->make(UserLabelRelationServices::class);
$labelServices->setUserLable([$order['uid']], $labelIds, $type, $store_id);
} catch (\Throwable $e) {
response_log_write([
'message' => '用户标签添加失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 发送模板消息和客服消息
* @param $order
* @return bool
*/
public function sendServicesAndTemplate($order)
{
try {
if (in_array($order['is_channel'], [1, 2])) {//小程序发送模板消息
//订单支付成功后给客服发送客服消息
$this->sendOrderPaySuccessCustomerService($order, 0);
} else {//公众号发送模板消息
//订单支付成功后给客服发送客服消息
$this->sendOrderPaySuccessCustomerService($order, 1);
}
} catch (\Exception $e) {
response_log_write([
'message' => '发送客服消息,短信消息失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 订单支付成功后给客服发送客服消息
* @param $order
* @param int $type 1 公众号 0 小程序
* @return string
*/
public function sendOrderPaySuccessCustomerService($order, $type = 0)
{
/** @var StoreServiceServices $services */
$services = app()->make(StoreServiceServices::class);
/** @var WechatUserServices $wechatUserServices */
$wechatUserServices = app()->make(WechatUserServices::class);
$serviceOrderNotice = $services->getStoreServiceOrderNotice();
if (count($serviceOrderNotice)) {
/** @var StoreProductServices $services */
$services = app()->make(StoreProductServices::class);
/** @var StoreSeckillServices $seckillServices */
$seckillServices = app()->make(StoreSeckillServices::class);
/** @var StoreCombinationServices $pinkServices */
$pinkServices = app()->make(StoreCombinationServices::class);
/** @var StoreBargainServices $bargainServices */
$bargainServices = app()->make(StoreBargainServices::class);
/** @var StoreOrderCartInfoServices $cartInfoServices */
$cartInfoServices = app()->make(StoreOrderCartInfoServices::class);
/** @var SmsSendServices $smsServices */
// $smsServices = app()->make(SmsSendServices::class);
// $switch = (bool)sys_config('admin_pay_success_switch');
$description = '';
$image = sys_config('site_logo');
switch ($order['type']) {
case 1://秒杀
$description .= '秒杀商品:' . $seckillServices->value(['id' => $order['activity_id']], 'title');
$image = $seckillServices->value(['id' => $order['activity_id']], 'image');
break;
case 2://砍价
$description .= '砍价商品:' . $bargainServices->value(['id' => $order['activity_id']], 'title');
$image = $bargainServices->value(['id' => $order['activity_id']], 'image');
break;
case 3://拼团
$description .= '拼团商品:' . $pinkServices->value(['id' => $order['activity_id']], 'title');
$image = $pinkServices->value(['id' => $order['activity_id']], 'image');
break;
default:
$productIds = $cartInfoServices->getCartIdsProduct((int)$order['id']);
$storeProduct = $services->getColumn([['id', 'in', $productIds]], 'image,store_name', 'id');
if (count($storeProduct)) {
foreach ($storeProduct as $value) {
$description .= $value['store_name'] . ' ';
$image = $value['image'];
}
}
break;
}
foreach ($serviceOrderNotice as $key => $item) {
$userInfo = $wechatUserServices->getOne(['uid' => $item['uid'], 'user_type' => 'wechat']);
if ($userInfo) {
$userInfo = $userInfo->toArray();
if ($userInfo['subscribe'] && $userInfo['openid']) {
if ($item['customer']) {
// 统计管理开启 推送图文消息
$head = '订单提醒 订单号:' . $order['order_id'];
$url = sys_config('site_url') . '/pages/admin/orderDetail/index?id=' . $order['order_id'];
$message = Messages::newsMessage($head, $description, $url, $image);
try {
OfficialAccount::staffSend($message, $userInfo['openid']);
} catch (\Exception $e) {
response_log_write([
'message' => $userInfo['nickname'] . '发送失败' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
} else {
// 推送文字消息
$head = "客服提醒:亲,您有一个新订单 \r\n订单单号:{$order['order_id']}\r\n支付金额:¥{$order['pay_price']}\r\n备注信息:{$order['mark']}\r\n订单来源:小程序";
if ($type) $head = "客服提醒:亲,您有一个新订单 \r\n订单单号:{$order['order_id']}\r\n支付金额:¥{$order['pay_price']}\r\n备注信息:{$order['mark']}\r\n订单来源:公众号";
try {
OfficialAccount::staffSend($head, $userInfo['openid']);
} catch (\Exception $e) {
response_log_write([
'message' => $userInfo['nickname'] . '发送失败' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
}
}
}
}
}
return true;
}
/**
* 计算节约金额
* @param $order
*/
public function setEconomizeMoney($order)
{
try {
/** @var UserServices $userService */
$userService = app()->make(UserServices::class);
/** @var StoreOrderCartInfoServices $cartInfoService */
$cartInfoService = app()->make(StoreOrderCartInfoServices::class);
/** @var StoreCouponUserServices $couponService */
$couponService = app()->make(StoreCouponUserServices::class);
/** @var StoreOrderEconomizeServices $economizeService */
$economizeService = app()->make(StoreOrderEconomizeServices::class);
/** @var MemberCardServices $memberCardService */
$memberCardService = app()->make(MemberCardServices::class);
$getOne = $economizeService->getOne(['order_id' => $order['order_id']]);
if ($getOne) return false;
//看是否是会员
if ($userService->checkUserIsSvip((int)$order['uid'])) {
$save = [];
$save['order_type'] = 1;
$save['add_time'] = time();
$save['pay_price'] = $order['pay_price'];
$save['order_id'] = $order['order_id'];
$save['uid'] = $order['uid'];
//计算商品节约金额
$isOpenVipPrice = $memberCardService->isOpenMemberCardCache('vip_price');
if ($isOpenVipPrice) {
$cartInfo = $cartInfoService->getOrderCartInfo($order['id']);
$memberPrice = 0.00;
if ($cartInfo) {
foreach ($cartInfo as $k => $item) {
foreach ($item as $value) {
if (isset($value['price_type']) && $value['price_type'] == 'member') $memberPrice = bcadd((string)$memberPrice, (string)bcmul((string)$value['vip_truePrice'], (string)$value['cart_num'] ?: '1', 2), 2);
}
}
}
$save['member_price'] = $memberPrice;
}
//计算邮费节约金额
$isOpenExpress = $memberCardService->isOpenMemberCardCache('express');
if ($isOpenExpress) {
$expressTotalMoney = bcdiv($order['total_postage'], bcdiv($isOpenExpress, 100, 2), 2);
$save['postage_price'] = bcsub($expressTotalMoney, $order['total_postage'], 2);
}
//计算会员券节省金额
if ($order['coupon_id'] && $order['coupon_price']) {
$coupon = $couponService->getOne(['id' => $order['coupon_id']], '*', ['issue']);
//是会员券
if ($coupon && $coupon['category'] == 2) {
$save['coupon_price'] = $order['coupon_price'];
}
}
return $economizeService->addEconomize($save);
}
} catch (\Throwable $e) {
response_log_write([
'message' => '计算节省金额,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
public function compute($uid, $oid)
{
if (!$oid) {
return true;
}
/** @var StoreOrderCreateServices $createService */
$createService = app()->make(StoreOrderCreateServices::class);
$orderInfo = $createService->get($oid);
if (!$orderInfo || $uid != $orderInfo['uid']) {
return true;
}
try {
$uid = (int)$orderInfo['uid'];
$userInfo = [];
if ($uid) {
/** @var UserServices $userService */
$userService = app()->make(UserServices::class);
$userInfo = $userService->getUserCacheInfo($uid);
}
$orderId = (int)$orderInfo['id'];
/** @var StoreOrderCartInfoServices $cartServices */
$cartServices = app()->make(StoreOrderCartInfoServices::class);
$cartInfoList = $cartServices->getColumn(['oid' => $orderId], 'cart_info');
if (!$cartInfoList) {
return true;
}
$cartInfo = [];
foreach ($cartInfoList as $cart) {
$cartInfo[] = is_string($cart) ? json_decode($cart, true) : $cart;
}
$priceData = [
'usedIntegral' => $orderInfo['use_integral'],
'deduction_price' => $orderInfo['deduction_price'],
'first_order_price' => $orderInfo['first_order_price']
];
$spread_ids = [];
$spread_uid = $spread_two_uid = 0;
if ($cartInfo && $priceData) {
[$cartInfo, $spread_ids] = $createService->computeOrderProductTruePrice($orderInfo, $cartInfo, $priceData, $uid, $userInfo);
$cartServices->updateCartInfo($orderId, $cartInfo);
}
$orderData = [];
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
if ($spread_ids) {
[$spread_uid, $spread_two_uid] = $spread_ids;
} else {
$spread_uid = $userServices->getSpreadUid($uid);
if ($spread_uid > 0 && sys_config('brokerage_level', 2) == 2) {
$spread_two_uid = $userServices->getSpreadUid($spread_uid, [], false);
}
}
if ($spread_uid > 0) {
$orderData['spread_uid'] = $spread_uid;
}
if ($spread_two_uid > 0) {
$orderData['spread_two_uid'] = $spread_two_uid;
}
if ($cartInfo && (isset($orderInfo['type']) && !in_array($orderInfo['type'], [1, 2, 3, 4, 5, 7, 8]))) {
/** @var StoreOrderComputedServices $orderComputed */
$orderComputed = app()->make(StoreOrderComputedServices::class);
if ($userServices->checkUserPromoter($spread_uid)) $orderData['one_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'one_brokerage', false);
if ($userServices->checkUserPromoter($spread_two_uid)) $orderData['two_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'two_brokerage', false);
$orderData['division_staff_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'division_staff_brokerage', false);
$orderData['division_agent_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'division_agent_brokerage', false);
$orderData['division_brokerage'] = $orderComputed->getOrderSumPrice($cartInfo, 'division_brokerage', false);
}
\think\facade\Log::error('计算订单实际优惠、积分、邮费、佣金成功:'.json_encode($orderData, JSON_UNESCAPED_UNICODE));
if ($orderData) $createService->update(['id' => $orderId], $orderData);
} catch (\Throwable $e) {
Log::error('计算订单实际优惠、积分、邮费、佣金失败,原因:' . $e->getMessage());
}
return true;
}
}

View File

@@ -0,0 +1,144 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderCartInfoServices;
use app\services\order\StoreOrderServices;
use app\services\order\StoreOrderStatusServices;
use app\services\product\sku\StoreProductAttrValueServices;
use app\services\product\sku\StoreProductVirtualServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 支付成功:自动发送卡密、处理次卡商品核销信息
* Class OrderPayHandelJob
* @package app\jobs\order
*/
class OrderPayHandelJob extends BaseJobs
{
use QueueTrait;
/**
* @param $orderInfo
* @return bool
*/
public function doJob($orderInfo)
{
if (!$orderInfo) {
return true;
}
//待发货状态
if ($orderInfo['status'] != 0) {
return true;
}
/** @var StoreOrderServices $orderService */
$orderService = app()->make(StoreOrderServices::class);
/** @var StoreOrderStatusServices $statusService */
$statusService = app()->make(StoreOrderStatusServices::class);
/** @var StoreOrderCartInfoServices $services */
$services = app()->make(StoreOrderCartInfoServices::class);
$orderInfo['cart_info'] = $cartInfoList = $services->getOrderCartInfo((int)$orderInfo['id']);
try {
switch ($orderInfo['product_type']) {
case 1://卡密商品:自动发送
$title = $content = '';
$disk_info = $orderInfo['cart_info'][$orderInfo['cart_id'][0] ?? 0]['cart_info']['productInfo']['attrInfo']['disk_info'] ?? '';
$unique = $orderInfo['cart_info'][$orderInfo['cart_id'][0]]['cart_info']['productInfo']['attrInfo']['unique'];
//活动订单共用原商品规格卡密
if ($orderInfo['type'] != 0 && $orderInfo['activity_id']) {
/** @var StoreProductAttrValueServices $skuValueServices */
$skuValueServices = app()->make(StoreProductAttrValueServices::class);
$attrValue = $skuValueServices->getUniqueByActivityUnique($unique, (int)$orderInfo['activity_id'], (int)$orderInfo['type'], ['unique', 'disk_info']);
if ($attrValue) {
$disk_info = $attrValue['disk_info'] ?? '';
$unique = $attrValue['unique'] ?? '';
}
}
if ($disk_info) {
$title = '虚拟密钥发放';
$content = '您购买的密钥商品已支付成功,支付金额' . $orderInfo['pay_price'] . '元,订单号:' . $orderInfo['order_id'] . ',密钥:' . $disk_info . ',感谢您的光临!';
$virtual_info = '密钥自动发放:' . $disk_info;
$value = '密钥:' . $disk_info;
// $remark = '密钥自动发放:' . $disk_info;
} else {
/** @var StoreProductVirtualServices $virtualService */
$virtualService = app()->make(StoreProductVirtualServices::class);
$cardList = $virtualService->getOrderCardList(['store_id' => $orderInfo['store_id'], 'attr_unique' => $unique, 'uid' => 0], (int)$orderInfo['total_num']);
$title = '虚拟卡密发放';
$virtual_info = [];
// $remark = '卡密已自动发放';
$value = '';
if ($cardList) {
$content = '您购买的卡密商品已支付成功,支付金额' . $orderInfo['pay_price'] . '元,订单号:' . $orderInfo['order_id'] . ',';
$update = [];
$update['order_id'] = $orderInfo['order_id'];
$update['uid'] = $orderInfo['uid'];
foreach ($cardList as $virtual) {
$virtualService->update($virtual['id'], $update);
$content .= '卡号:' . $virtual['card_no'] . ';密码:' . $virtual['card_pwd'] . "\n";
$virtual_info[] = ['card_no' => $virtual['card_no'], 'card_pwd' => $virtual['card_pwd']];
$value .= '卡号:' . $virtual['card_no'] . ';密码:' . $virtual['card_pwd'];
// $remark .= ',卡号:' . $virtual['card_no'] . ';密码:' . $virtual['card_pwd'] . ';';
}
$content .= ',感谢您的光临!';
}
}
//修改订单虚拟备注
$orderService->update(['id' => $orderInfo['id']], ['status' => 1, 'delivery_type' => 'fictitious', 'virtual_info' => json_encode($virtual_info)]);
$data['id'] = $orderInfo['id'];
$data['uid'] = $orderInfo['uid'];
$data['order_id'] = $orderInfo['order_id'];
$data['title'] = $title;
$data['value'] = $value;
$data['content'] = $content;
$data['is_integral'] = 0;
event('notice.notice', [$data, 'kami_deliver_goods_code']);
//记录订单状态
OrderStatusJob::dispatch([$orderInfo['id'], 'delivery_fictitious', ['change_message' => '卡密自动发货', 'change_manager_type' => 'system']]);
break;
case 4://次卡商品:处理核销数据
foreach ($cartInfoList as $cart_id => $cartInfo) {
$info = $cartInfo['cart_info'] ?? [];
$attrInfo = $info['productInfo']['attrInfo'] ?? [];
$data = ['write_start' => 0, 'write_end' => 0];
if ($attrInfo) {
switch ($attrInfo['write_valid'] ?? 1) {
case 1://永久
break;
case 2://购买后n天
if (isset($attrInfo['write_days']) && $attrInfo['write_days']) {
$data['write_start'] = time();
$data['write_end'] = bcadd((string)$data['write_start'], (string)bcmul((string)$attrInfo['write_days'], '86400'));
}
break;
case 3://具体时间段
if ((isset($attrInfo['write_start']) && $attrInfo['write_start']) || (isset($attrInfo['write_end']) && $attrInfo['write_end'])) {
$data['write_start'] = $attrInfo['write_start'] ?? 0;
$data['write_end'] = $attrInfo['write_end'] ?? 0;
}
break;
}
}
$services->update(['oid' => $orderInfo['id'], 'cart_id' => $cart_id], $data);
}
break;
}
} catch (\Throwable $e) {
Log::error('订单虚拟商品自动发放失败,原因:' . $e->getMessage());
}
return true;
}
}

View File

@@ -0,0 +1,149 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 订单支付类型处理队列
* Class OrderPayTypeJob
* @package app\jobs\order
*/
class OrderPayTypeJob extends BaseJobs
{
use QueueTrait;
/**
* 直接执行订单支付类型处理
* 不需要传参数,直接处理所有需要处理的订单
* @return bool
*/
public function doJob()
{
try {
/** @var StoreOrderServices $storeOrderServices */
$storeOrderServices = app()->make(StoreOrderServices::class);
Log::info('开始执行订单支付类型处理任务');
// 查询所有已支付的订单
$where = [
'paid' => 1,
'is_del' => 0,
'is_system_del' => 0
];
// 分批处理,避免内存溢出
$limit = 100;
$page = 1;
$totalProcessed = 0;
$successCount = 0;
$failCount = 0;
do {
Log::info('开始执行订单支付类型处理任务111');
$orders = $storeOrderServices->getList($where, ['id', 'pay_type', 'pay_price', 'yue_price', 'online_price'], $page, $limit);
if (empty($orders)) {
break;
}
foreach ($orders as $order) {
if ($this->processOrder($order)) {
$successCount++;
} else {
$failCount++;
}
$totalProcessed++;
}
$page++;
Log::info("已处理第 {$page} 页,当前批次处理 " . count($orders) . " 条订单");
} while (count($orders) === $limit);
Log::info("订单支付类型处理任务完成,共处理:{$totalProcessed}条订单,成功:{$successCount},失败:{$failCount}");
return $failCount === 0;
} catch (\Exception $e) {
Log::error('订单支付类型处理任务异常:' . $e->getMessage());
return false;
}
}
/**
* 处理单个订单
* @param array $order 订单数据
* @return bool
*/
private function processOrder($order)
{
try {
/** @var StoreOrderServices $storeOrderServices */
$storeOrderServices = app()->make(StoreOrderServices::class);
$orderId = $order['id'];
$payType = $order['pay_type'] ?? '';
$payPrice = $order['pay_price'] ?? 0;
$currentYuePrice = $order['yue_price'] ?? 0;
$currentOnlinePrice = $order['online_price'] ?? 0;
// 准备更新数据
$updateData = [];
$needUpdate = false;
// 根据支付类型设置相应字段
if ($payType === 'yue') {
// 余额支付:yue_price = pay_price, online_price = 0
if ($currentYuePrice != $payPrice || $currentOnlinePrice != 0) {
$updateData['yue_price'] = $payPrice;
$updateData['online_price'] = 0;
$needUpdate = true;
Log::info("订单ID:{$orderId},余额支付,需要更新 yue_price:{$payPrice},online_price:0");
}
} else {
// 其他支付方式:online_price = pay_price, yue_price = 0
if ($currentOnlinePrice != $payPrice || $currentYuePrice != 0) {
$updateData['online_price'] = $payPrice;
$updateData['yue_price'] = 0;
$needUpdate = true;
Log::info("订单ID:{$orderId},线上支付({$payType}),需要更新 online_price:{$payPrice},yue_price:0");
}
}
// 如果需要更新则执行更新
if ($needUpdate) {
$result = $storeOrderServices->update($orderId, $updateData);
if ($result) {
Log::info("订单支付类型处理成功,订单ID:{$orderId},支付类型:{$payType}");
return true;
} else {
Log::error("订单支付类型处理失败,订单ID:{$orderId}");
return false;
}
} else {
// 数据已经正确,无需更新
Log::debug("订单ID:{$orderId} 数据已正确,无需更新");
return true;
}
} catch (\Exception $e) {
Log::error("处理订单ID:{$order['id']} 时发生异常:" . $e->getMessage());
return false;
}
}
}

View File

@@ -0,0 +1,57 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderStatusServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* Class OrderStatusJob
* @package app\jobs\order
*/
class OrderStatusJob extends BaseJobs
{
use QueueTrait;
/**
* 写入订单记录
* @param $orderId
* @param $changeType
* @param $data
* @return bool
*/
public function doJob($orderId, $changeType = '', $data = [])
{
if (!$orderId || !$data) {
return true;
}
try {
/** @var StoreOrderStatusServices $statusService */
$statusService = app()->make(StoreOrderStatusServices::class);
$changeManagerId = $data['change_manager_id'] ?? 0;
$changeManagerType = $data['change_manager_type'] ?? '';
$statusService->saveStatus((int)$orderId, (string)$changeType, (array)$data, (int)$changeManagerId, (string)$changeManagerType);
} catch (\Throwable $e) {
response_log_write([
'message' => '写入订单【'.$changeType.'】记录失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,122 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\erp\OrderServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* Class OrderSyncJob
* @package app\jobs\order
*/
class OrderSyncJob extends BaseJobs
{
use QueueTrait;
/**
* @return mixed
*/
public static function queueName()
{
return 'CRMEB_PRO_ERP';
}
/**
* 同步订单
* @param int $oid
* @return bool
*/
public function syncOrder(int $oid): bool
{
try {
/** @var OrderServices $orderServices */
$orderServices = app()->make(OrderServices::class);
$orderServices->upload($oid);
} catch (\Exception $e) {
response_log_write([
'message' => '订单信息同步失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 更新订单信息
* @param string $orderId
* @param string $erpOrderId
* @param int $oid
* @return bool
*/
public function reorderOrder(string $orderId, array $erpOrderId = [], int $oid = 0): bool
{
try {
/** @var OrderServices $orderServices */
$orderServices = app()->make(OrderServices::class);
$cancelRes = $orderServices->cancelOrder($orderId, $erpOrderId);
if ($cancelRes && $oid > 0) {
$orderServices->upload($oid);
}
} catch (\Exception $e) {
response_log_write([
'message' => '订单信息更新失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 回调取消
* @param array $data
* @return bool
*/
public function refundOrder(array $data): bool
{
try {
/** @var OrderServices $orderServices */
$orderServices = app()->make(OrderServices::class);
$orderServices->refundOrder($data);
} catch (\Exception $e) {
response_log_write([
'message' => '回调订单取消同步失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 同步退货单
* @param int $refundId
* @return bool
*/
public function refundOrderUpload(int $refundId): bool
{
try {
/** @var OrderServices $orderServices */
$orderServices = app()->make(OrderServices::class);
$orderServices->refundOrderUpload([$refundId]);
} catch (\Exception $e) {
response_log_write([
'message' => '同步退货单信息失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,53 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderStatusServices;
use app\services\order\StoreOrderTakeServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 订单收货任务
* Class OrderTakeJob
* @package app\jobs
*/
class OrderTakeJob extends BaseJobs
{
use QueueTrait;
/**
* @return string
*/
protected static function queueName()
{
return 'CRMEB_PRO_TASK';
}
public function doJob($order)
{
if (!$order) return true;
/** @var StoreOrderTakeServices $service */
$service = app()->make(StoreOrderTakeServices::class);
$res = $service->update($order['id'], ['status' => 2]);
$order = $service->get((int)$order['id']);
$res = $res && $service->storeProductOrderUserTakeDelivery($order);
if (!$res) {
Log::error('收货失败:' . $order['order_id']);
}
OrderStatusJob::dispatch([$order['id'], 'user_take_delivery', ['change_message' => '用户已收货', 'change_manager_type' => 'user', 'change_manager_id' => $order['uid']]]);
return true;
}
}

View File

@@ -0,0 +1,52 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderDeliveryServices;
use app\services\order\StoreOrderWriteOffServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 订单核销
* Class OrderWriteoffJob
* @package app\jobs
*/
class OrderWriteoffJob extends BaseJobs
{
use QueueTrait;
/**
* 写入核销记录
* @param int $oid
* @param array $cartIds
* @param array $data
* @param array $orderInfo
* @param array $cartInfo
* @return bool
*/
public function doJob(int $oid, array $cartIds, array $data, array $orderInfo = [], array $cartInfo = [])
{
try {
/** @var StoreOrderWriteOffServices $storeOrderWriteoffServices */
$storeOrderWriteoffServices = app()->make(StoreOrderWriteOffServices::class);
$storeOrderWriteoffServices->saveWriteOff($oid, $cartIds, $data, $orderInfo, $cartInfo);
} catch (\Throwable $e) {
Log::error('写入订单核销记录失败失败,原因:' . $e->getMessage());
}
return true;
}
}

View File

@@ -0,0 +1,203 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\message\sms\SmsSendServices;
use app\services\order\OtherOrderServices;
use app\services\order\StoreOrderEconomizeServices;
use app\services\user\member\MemberCardServices;
use app\services\user\UserBillServices;
use app\services\user\UserServices;
use app\services\wechat\WechatUserServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 订单消息队列
* Class OtherOrderJob
* @package app\jobs
*/
class OtherOrderJob extends BaseJobs
{
use QueueTrait;
/**
* 执行订单支付成功发送消息
* @param $order
* @return bool
*/
public function doJob($order)
{
//更新用户支付订单数量
try {
$this->setUserPayCountAndPromoter($order);
} catch (\Throwable $e) {
response_log_write([
'message' => '更新用户订单数失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
// 计算用户节省金额
try {
$this->setEconomizeMoney($order);
} catch (\Throwable $e) {
response_log_write([
'message' => '计算节省金额,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
try {
$this->sendMemberIntegral($order);
} catch (\Throwable $e) {
response_log_write([
'message' => '消费积分返还失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 设置用户购买次数和检测时候成为推广人
* @param $order
*/
public function setUserPayCountAndPromoter($order)
{
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$userInfo = $userServices->get($order['uid']);
if ($userInfo) {
if (!$userInfo->is_promoter) {
/** @var OtherOrderServices $orderServices */
$orderServices = app()->make(OtherOrderServices::class);
$price = $orderServices->sum(['paid' => 1, 'uid' => $userInfo['uid']], 'pay_price');
$status = is_brokerage_statu($price);
if ($status) {
$userInfo->is_promoter = 1;
}
}
$userInfo->save();
}
return true;
}
/**
* 发送模板消息和客服消息
* @param $order
* @return bool
*/
public function sendServicesAndTemplate($order)
{
try {
/** @var WechatUserServices $wechatUserServices */
$wechatUserServices = app()->make(WechatUserServices::class);
if ($order['is_channel'] == "wechat") {//公众号发送模板消息
$openid = $wechatUserServices->uidToOpenid($order['uid'], 'wechat');
if (!$openid) {
return true;
}
$wechatTemplate = new WechatTemplateJob();
$wechatTemplate->sendOrderPaySuccess($openid, $order);
} else if ($order['is_channel'] == "routine") {//小程序发送模板消息
$openid = $wechatUserServices->uidToOpenid($order['uid'], 'routine');
if (!$openid) {
return true;
}
$tempJob = new RoutineTemplateJob();
$tempJob->sendMemberOrderSuccess($openid, $order['pay_price'], $order['order_id']);
}
} catch (\Exception $e) {
}
return true;
}
/**
* 购买会员赠送优惠券
* @param $uid
*/
public function setCoupon($uid)
{
// /** @var StoreCouponIssueServices $couponService */
// $couponService = app()->make(StoreCouponIssueServices::class);
// $couponInfo = $couponService->sendMemberCoupon($uid);
// if (!$couponInfo) Log::error('优惠券发送失败,失败原因:没发现会员优惠券或者优惠券数量为0');
}
/**
* 线下付款奖励积分
* @param $order
* @return bool
*/
public function sendMemberIntegral($order)
{
//只有线下付款才奖励
if ($order['type'] == 3) {
$order_give_integral = sys_config('order_give_integral');
$order_integral = bcmul($order_give_integral, (string)$order['pay_price'], 0);
/** @var UserServices $userService */
$userService = app()->make(UserServices::class);
$userInfo = $userService->getUserCacheInfo($order['uid']);
if (!$userInfo) return false;
if ($userService->checkUserIsSvip((int)$order['uid'])) {
//看是否开启消费返积分翻倍奖励
/** @var MemberCardServices $memberCardService */
$memberCardService = app()->make(MemberCardServices::class);
$integral_rule_number = $memberCardService->isOpenMemberCardCache('integral');
if ($integral_rule_number) {
$order_integral = bcadd($order_integral, $integral_rule_number, 2);
}
}
if ($order_integral > 0) {
$balance = bcadd(abs($userInfo['integral']), abs($order_integral), 0);
$userService->update(['uid' => $order['uid']], ['integral' => $balance]);
/** @var UserBillServices $userBillServices */
$userBillServices = app()->make(UserBillServices::class);
$userBillServices->income('order_give_integral', $order['uid'], $order_integral, $balance, $order['id']);
}
}
return true;
}
/**
* @param $order
*/
public function setEconomizeMoney($order)
{
//只有线下付款才计算节省
if ($order['type'] == 3) {
/** @var StoreOrderEconomizeServices $economizeService */
$economizeService = app()->make(StoreOrderEconomizeServices::class);
/** @var MemberCardServices $memberRightService */
$memberRightService = app()->make(MemberCardServices::class);
$isOpenOfflin = $memberRightService->isOpenMemberCardCache('offline');
if ($isOpenOfflin) {
$save = [
'uid' => $order['uid'],
'order_id' => $order['order_id'],
'order_type' => 2,
'pay_price' => $order['pay_price'],
'offline_price' => bcsub($order['money'], $order['pay_price'], 2)
];
$economizeService->addEconomize($save);
}
}
return true;
}
}

View File

@@ -0,0 +1,140 @@
<?php
namespace app\jobs\order;
use app\jobs\supplier\SupplierFinanceJob;use app\services\order\StoreOrderCartInfoServices;
use app\services\order\StoreOrderServices;
use app\services\order\StoreOrderSplitServices;
use app\services\supplier\SystemSupplierServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 分配订单
* Class ShareOrderJob
* @package app\jobs
*/
class ShareOrderJob extends BaseJobs
{
use QueueTrait;
/**
* 门店分配订单
* @param $orderInfo
* @return bool
*/
public function doJob($orderInfo)
{
if (!$orderInfo) {
return true;
}
//整单分给门店
/** @var StoreOrderServices $storeOrderServices */
$storeOrderServices = app()->make(StoreOrderServices::class);
$order = $storeOrderServices->get($orderInfo['id']);
if (!$order) {
return true;
}
$orderInfo = $order->toArray();
try {
$id = (int)$orderInfo['id'];
/** @var StoreOrderCartInfoServices $storeOrderCartInfoServices */
$storeOrderCartInfoServices = app()->make(StoreOrderCartInfoServices::class);
//订单下原商品信息
$cartInfo = $storeOrderCartInfoServices->getCartColunm(['oid' => $id, 'split_status' => [0, 1]], 'cart_id,type,relation_id,is_gift,cart_num,split_surplus_num', 'cart_id');
if (!$cartInfo) {
return true;
}
$suppplierIds = $storeIds = [];
foreach ($cartInfo as $cart) {
$type = $cart['type'] ?? 0;
switch ($type) {
case 0://兼容之前供应商商品
if ($cart['relation_id']) {
$suppplierIds[] = $cart['relation_id'];
}
break;
case 1:
$storeIds[] = $cart['relation_id'];
break;
case 2:
$suppplierIds[] = $cart['relation_id'];
break;
}
}
if ($suppplierIds) {//验证供应商状态(关闭|删除不分配)
/** @var SystemSupplierServices $supplierServices */
$supplierServices = app()->make(SystemSupplierServices::class);
$suppplierIds = $supplierServices->getColumn([['id', 'in', $suppplierIds], ['is_show', '=', 1], ['is_del', '=', 0]], 'id');
}
$cart_ids = [];
$other_cart_ids = [];
//分配给供应商、门店
if ($suppplierIds) {
$suppplier_id = $suppplierIds[0] ?? 0;
$updateData = [];
//先拆分供应商
if ($suppplier_id) {
foreach ($cartInfo as $cart_id => $cart) {
if ($cart['type'] == 2 && $cart['relation_id'] == $suppplier_id) {//拆分
$cart_ids[] = ['cart_id' => $cart_id, 'cart_num' => $cart['cart_num']];
} else {
$other_cart_ids[] = ['cart_id' => $cart_id, 'cart_num' => $cart['cart_num']];
}
}
$updateData['supplier_id'] = $suppplier_id;
}
//下单商品都是某一个供应商|| 门店商品,不用拆分
if (!$other_cart_ids && count($suppplierIds) == 1) {
$storeOrderServices->update(['id' => $id], ['supplier_id' => $suppplier_id]);
if (isset($updateData['supplier_id'])) {
//供应商账单流水
SupplierFinanceJob::dispatch([$id, 1]);
SpliteStoreOrderJob::dispatchDo('splitAfter', [$orderInfo]);
}
} else {
//分配订单
/** @var StoreOrderSplitServices $storeOrderSplitServices */
$storeOrderSplitServices = app()->make(StoreOrderSplitServices::class);
$splitResult = $storeOrderSplitServices->equalSplit($id, $cart_ids);
$otherOrder = [];
if ($splitResult) {//拆分供应商订单
[$orderInfo, $otherOrder] = $splitResult;
}
$storeOrderServices->update(['id' => $orderInfo['id']], $updateData);
if (isset($updateData['store_id'])) {//拆分门店订单
SpliteStoreOrderJob::dispatchDo('splitAfter', [$orderInfo]);
} elseif (isset($updateData['supplier_id'])) {
//供应商账单流水
SupplierFinanceJob::dispatch([$orderInfo['id'], 1]);
SpliteStoreOrderJob::dispatchDo('splitAfter', [$orderInfo]);
}
//还有商品
if ($other_cart_ids && $otherOrder) {
//还有其他供应商 || 门店 继续分配
if (count($suppplierIds) >= 1) {
ShareOrderJob::dispatch([$otherOrder]);
}
}
}
} else {//平台配送
SpliteStoreOrderJob::dispatchDo('splitAfter', [$orderInfo]);
}
} catch (\Throwable $e) {
response_log_write([
'message' => '自动拆分供应商订单失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace app\jobs\order;
use app\services\order\StoreOrderStatusServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 拆分订单后置队列
* Class SpliteOrderAfterJob
* @package app\jobs\order
*/
class SpliteOrderAfterJob extends BaseJobs
{
use QueueTrait;
/**
* 门店分配订单
* @param $orderInfo
* @return bool
*/
public function doJob($oid, $orderData)
{
if (!$oid || !$orderData || count($orderData) != 2) {
return true;
}
[$orderInfo, $otherOrder] = $orderData;
try {
/** @var StoreOrderStatusServices $statusService */
$statusService = app()->make(StoreOrderStatusServices::class);
$statusData = $statusService->getColumn(['oid' => $oid], '*');
if (!$statusData) {
return true;
}
$ids = [];
if ($orderInfo['id'] != $oid) {
$ids[] = $orderInfo['id'];
}
if ($otherOrder['id'] != $oid) {
$ids[] = $otherOrder['id'];
}
if ($ids) {
$allData = [];
foreach ($ids as $id) {
foreach ($statusData as $data) {
$data['oid'] = $id;
$allData[] = $data;
}
}
if ($allData) {
$statusService->saveAll($allData);
}
}
} catch (\Throwable $e) {
response_log_write([
'message' => '处理拆分订单记录失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace app\jobs\order;
use app\services\message\NoticeService;
use app\services\order\StoreOrderCartInfoServices;use app\webscoket\SocketPush;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
use think\facade\Log;
/**
* 门店分配订单
* Class SpliteStoreOrderJob
* @package app\jobs
*/
class SpliteStoreOrderJob extends BaseJobs
{
use QueueTrait;
/**
* 订单分配完成后置方法
* @param $orderInfo
*/
public function splitAfter($orderInfo, bool $only_print = false)
{
//分配好向用户设置标签
OrderJob::dispatchDo('setUserLabel', [$orderInfo]);
if ($only_print) {
/** @var NoticeService $NoticeService */
$NoticeService = app()->make(NoticeService::class);
$NoticeService->orderPrint($orderInfo);
} else {
$orderInfoServices = app()->make(StoreOrderCartInfoServices::class);
$storeName = $orderInfoServices->getCarIdByProductTitle((int)$orderInfo['id']);
$orderInfo['storeName'] = substrUTf8($storeName, 20, 'UTF-8', '');
$orderInfo['send_name'] = $orderInfo['real_name'];
//分配完成用户推送消息事件(门店小票打印)
event('notice.notice', [$orderInfo, 'order_pay_success']);
}
return true;
}
}

View File

@@ -0,0 +1,37 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 未支付订单队列
* Class UnpaidOrderSend
* @package app\jobs
*/
class UnpaidOrderCancelJob extends BaseJobs
{
use QueueTrait;
/**
* 未支付订单取消任务执行
* @return bool
*/
public function doJob()
{
return true;
}
}

View File

@@ -0,0 +1,111 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\jobs\order;
use app\services\order\StoreOrderServices;
use crmeb\basic\BaseJobs;
use crmeb\traits\QueueTrait;
/**
* 未支付订单队列
* Class UnpaidOrderSend
* @package app\jobs
*/
class UnpaidOrderJob extends BaseJobs
{
use QueueTrait;
/**
* 提醒付款给用户通知
* @param $id
* @return bool
*/
public function sendNotice($id)
{
try {
/** @var StoreOrderServices $services */
$services = app()->make(StoreOrderServices::class);
$orderInfo = $services->get($id);
if (!$orderInfo) {
return true;
}
if ($orderInfo->paid) {
return true;
}
if ($orderInfo->is_del) {
return true;
}
//未支付用户发送消息
event('notice.notice', [['order' => $orderInfo], 'order_pay_false']);
} catch (\Throwable $e) {
response_log_write([
'message' => '未支付订单发送短信失败,原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 取消未支付订单
* @param $orderId
* @return bool
*/
public function cancelOrder($orderId)
{
/** @var StoreOrderServices $services */
$services = app()->make(StoreOrderServices::class);
$orderInfo = $services->get($orderId);
if (!$orderInfo) {
return true;
}
if ($orderInfo->paid) {
return true;
}
if ($orderInfo->is_del) {
return true;
}
if ($orderInfo->pay_type == 'offline') {
return true;
}
try {
$services->cancelOrder((int)$orderId, 0, '订单未支付已超过系统预设时间');
} catch (\Throwable $e) {
response_log_write([
'message' => '自动取消订单失败,失败原因:' . $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
]);
}
return true;
}
/**
* 自动取消未支付订单
* @param $page
* @param $limit
* @return bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function autoCancelOrder($page, $limit)
{
/** @var StoreOrderServices $service */
$service = app()->make(StoreOrderServices::class);
$service->runOrderUnpaidCancel($page, $limit);
return true;
}
}