OrderService.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/2/24
  6. * Time: 下午4:35
  7. */
  8. namespace app\frontend\modules\order\services;
  9. use app\backend\modules\goods\models\GoodsTradeSet;
  10. use app\backend\modules\order\services\OrderPackageService;
  11. use app\common\events\order\AfterOrderPackageSentEvent;
  12. use app\common\exceptions\AppException;
  13. use app\common\facades\Setting;
  14. use app\common\models\DispatchType;
  15. use app\common\models\Order;
  16. use app\common\models\order\Express;
  17. use app\common\models\order\OrderGoodsChangePriceLog;
  18. use app\common\models\order\OrderPackage;
  19. use app\common\modules\orderGoods\OrderGoodsCollection;
  20. use \app\common\models\MemberCart;
  21. use app\common\repositories\ExpressCompany;
  22. use app\common\services\CreateRandomNumber;
  23. use app\frontend\models\OrderGoods;
  24. use app\frontend\modules\order\services\behavior\OrderCancelPay;
  25. use app\frontend\modules\order\services\behavior\OrderCancelSend;
  26. use app\frontend\modules\order\services\behavior\OrderChangePrice;
  27. use app\frontend\modules\order\services\behavior\OrderClose;
  28. use app\frontend\modules\order\services\behavior\OrderDelete;
  29. use app\frontend\modules\order\services\behavior\OrderForceClose;
  30. use app\frontend\modules\order\services\behavior\OrderOperation;
  31. use app\frontend\modules\order\services\behavior\OrderPay;
  32. use app\frontend\modules\order\services\behavior\OrderReceive;
  33. use app\frontend\modules\order\services\behavior\OrderSend;
  34. use app\frontend\modules\orderGoods\models\PreOrderGoods;
  35. use app\frontend\modules\orderGoods\models\PreOrderGoodsCollection;
  36. use Carbon\Carbon;
  37. use Illuminate\Support\Collection;
  38. use Illuminate\Support\Facades\DB;
  39. use Illuminate\Support\Facades\Redis;
  40. class OrderService
  41. {
  42. /**
  43. * 获取订单商品对象数组
  44. * @param Collection $memberCarts
  45. * @return OrderGoodsCollection
  46. * @throws \Exception
  47. */
  48. public static function getOrderGoods(Collection $memberCarts)
  49. {
  50. if ($memberCarts->isEmpty()) {
  51. throw new AppException("购物车记录为空");
  52. }
  53. $result = $memberCarts->map(function ($memberCart) {
  54. if (!($memberCart instanceof MemberCart)) {
  55. throw new \Exception("请传入" . MemberCart::class . "的实例");
  56. }
  57. /**
  58. * @var $memberCart MemberCart
  59. */
  60. $data = [
  61. 'goods_id' => (int)$memberCart->goods_id,
  62. 'goods_option_id' => (int)$memberCart->option_id,
  63. 'total' => (int)$memberCart->total,
  64. ];
  65. $orderGoods = app('OrderManager')->make('PreOrderGoods', $data);
  66. /**
  67. * @var PreOrderGoods $orderGoods
  68. */
  69. $orderGoods->setRelation('goods', $memberCart->goods);
  70. $orderGoods->setRelation('goodsOption', $memberCart->goodsOption);
  71. return $orderGoods;
  72. });
  73. return new PreOrderGoodsCollection($result);
  74. }
  75. /**
  76. * 获取订单号
  77. * @return string
  78. */
  79. public static function createOrderSN()
  80. {
  81. // //集合总数
  82. // $count = Redis::sCard('order_sn');
  83. //
  84. // if ($count) {
  85. // //随机返回集合中的一个元素
  86. // $orderSN = Redis::sPop('order_sn');
  87. // if ($orderSN) {
  88. // return $orderSN;
  89. // }
  90. // }
  91. $orderSN = CreateRandomNumber::sn('SN');
  92. while (1) {
  93. if (!Order::where('order_sn', $orderSN)->first()) {
  94. break;
  95. }
  96. $orderSN = CreateRandomNumber::sn('SN');
  97. }
  98. return $orderSN;
  99. // $orderSN = createNo('SN', true);
  100. // while (1) {
  101. // if (!Order::where('order_sn', $orderSN)->first()) {
  102. // break;
  103. // }
  104. // $orderSN = createNo('SN', true);
  105. // }
  106. // return $orderSN;
  107. }
  108. /**
  109. * 获取支付流水号
  110. * @return string
  111. */
  112. public static function createPaySN()
  113. {
  114. $paySN = CreateRandomNumber::sn('PN');
  115. while (1) {
  116. if (!\app\common\models\OrderPay::where('pay_sn', $paySN)->first()) {
  117. break;
  118. }
  119. $paySN = CreateRandomNumber::sn('PN');
  120. }
  121. return $paySN;
  122. // $paySN = createNo('PN', true);
  123. // while (1) {
  124. // if (!\app\common\models\OrderPay::where('pay_sn', $paySN)->first()) {
  125. // break;
  126. // }
  127. // $paySN = createNo('PN', true);
  128. // }
  129. // return $paySN;
  130. }
  131. /**
  132. * 订单操作类
  133. * @param OrderOperation $orderOperation
  134. * @return string
  135. * @throws AppException
  136. */
  137. private static function OrderOperate(OrderOperation $orderOperation)
  138. {
  139. if (!isset($orderOperation)) {
  140. throw new AppException('未找到该订单');
  141. }
  142. DB::transaction(function () use ($orderOperation) {
  143. $orderOperation->handle();
  144. });
  145. }
  146. /**
  147. * 取消付款
  148. * @param $param
  149. * @return string
  150. * @throws AppException
  151. */
  152. public static function orderCancelPay($param)
  153. {
  154. $orderOperation = OrderCancelPay::find($param['order_id']);
  155. return self::OrderOperate($orderOperation);
  156. }
  157. /**
  158. * 取消发货
  159. * @param $param
  160. * @return string
  161. * @throws AppException
  162. */
  163. public static function orderCancelSend($param)
  164. {
  165. $orderOperation = OrderCancelSend::find($param['order_id']);
  166. //取消订单逻辑 因为多包裹发货需要清楚快递信息
  167. $where[] = ['order_id', '=', $param['order_id']];
  168. //清楚商品标记包裹
  169. OrderGoods::where($where)->update(['order_express_id' => null]);
  170. $where[] = ['deleted_at', '=', 0];
  171. //清除快递信息
  172. $data = Express::where($where)->delete();
  173. // 清除包裹
  174. OrderPackage::where('order_id',$param['order_id'])->delete();
  175. //修改订单部分发货状态
  176. //Order::where('id',$param['order_id'])->update(['is_all_send_goods'=>0]);
  177. $orderOperation->is_all_send_goods = 0;
  178. return self::OrderOperate($orderOperation);
  179. }
  180. /**
  181. * 关闭订单
  182. * @param $param
  183. * @return string
  184. * @throws AppException
  185. */
  186. public static function orderClose($param)
  187. {
  188. $orderOperation = OrderClose::find($param['order_id']);
  189. if (!empty(array_except($param,['order_id']))) {
  190. $orderOperation->params = $param;
  191. }
  192. return self::OrderOperate($orderOperation);
  193. }
  194. /**
  195. * 强制关闭订单
  196. * @param $param
  197. * @return string
  198. * @throws AppException
  199. */
  200. public static function orderForceClose($param)
  201. {
  202. $orderOperation = OrderForceClose::find($param['order_id']);
  203. if (!empty(array_except($param,['order_id']))) {
  204. $orderOperation->params = $param;
  205. }
  206. return self::OrderOperate($orderOperation);
  207. }
  208. /**
  209. * 用户删除(隐藏)订单
  210. * @param $param
  211. * @return string
  212. * @throws AppException
  213. */
  214. public static function orderDelete($param)
  215. {
  216. $orderOperation = OrderDelete::find($param['order_id']);
  217. return self::OrderOperate($orderOperation);
  218. }
  219. /**
  220. * 根据流水号合并支付
  221. * @param array $param
  222. * @throws AppException
  223. */
  224. public static function ordersPay(array $param)
  225. {
  226. \Log::info('---------订单支付ordersPay(order_pay_id:' . $param['order_pay_id'] . ')--------', $param);
  227. /**
  228. * @var \app\frontend\models\OrderPay $orderPay
  229. */
  230. $orderPay = \app\frontend\models\OrderPay::find($param['order_pay_id']);
  231. if (!isset($orderPay)) {
  232. throw new AppException('支付流水记录不存在');
  233. }
  234. if (isset($param['pay_type_id'])) {
  235. if ($orderPay->pay_type_id != $param['pay_type_id']) {
  236. //\Log::error("---------支付回调与与支付请求的订单支付方式不匹配(order_pay_id:{$orderPay->id},orderPay->payTypeId:{$orderPay->pay_type_id} != param[pay_type_id]:{$param['pay_type_id']})--------", []);
  237. $orderPay->pay_type_id = $param['pay_type_id'];
  238. }
  239. }
  240. $orderPay->pay();
  241. \Log::info('---------订单支付成功ordersPay(order_pay_id:' . $orderPay->id . ')--------', []);
  242. }
  243. /**
  244. * 后台支付订单
  245. * @param array $param
  246. * @return string
  247. * @throws AppException
  248. */
  249. public static function orderPay(array $param)
  250. {
  251. /**
  252. * @var OrderOperation $orderOperation
  253. */
  254. $orderOperation = OrderPay::find($param['order_id']);
  255. if (isset($param['pay_type_id'])) {
  256. $orderOperation->pay_type_id = $param['pay_type_id'];
  257. }
  258. $orderOperation->order_pay_id = (int)$param['order_pay_id'];
  259. $result = self::OrderOperate($orderOperation);
  260. //是虚拟商品或有标识直接完成
  261. if ($orderOperation->isVirtual()) {
  262. // 虚拟物品付款后直接完成
  263. $orderOperation->dispatch_type_id = 0;
  264. $orderOperation->save();
  265. self::orderSend(['order_id' => $orderOperation->id]);
  266. $result = self::orderReceive(['order_id' => $orderOperation->id]);
  267. } elseif (isset($orderOperation->hasOneDispatchType) && in_array($orderOperation->dispatch_type_id, $orderOperation->hasOneDispatchType->paidCompleted())) {
  268. //兼容配送方式支付成功就直接完成的订单
  269. self::orderSend(['order_id' => $orderOperation->id]);
  270. $result = self::orderReceive(['order_id' => $orderOperation->id]);
  271. } elseif (isset($orderOperation->hasOneDispatchType) && !$orderOperation->hasOneDispatchType->needSend()) {
  272. // 不需要发货的物品直接改为待收货
  273. self::orderSend(['order_id' => $orderOperation->id]);
  274. }
  275. return $result;
  276. }
  277. /**
  278. * 收货
  279. * @param $param
  280. * @return string
  281. * @throws AppException
  282. */
  283. public static function orderReceive($param)
  284. {
  285. $orderOperation = OrderReceive::find($param['order_id']);
  286. //新增逻辑部分发货 没有全发货无法确认收货
  287. if ($orderOperation['is_all_send_goods'] == 1) {
  288. throw new AppException('订单部分发货无法确认收货');
  289. }
  290. return self::OrderOperate($orderOperation);
  291. }
  292. /**
  293. * 填写订单快递单号
  294. * @param $param
  295. * @return string
  296. * @throws AppException
  297. */
  298. public static function addOrderExpress($param)
  299. {
  300. /**
  301. * 根据$param中的订单id和订单商品ids保存快递信息
  302. * 如果订单已发货就return
  303. * 未发货继续执行下面的订单发货
  304. */
  305. //部分发货 快递单号必填
  306. if (empty($param['express_sn'])) {
  307. throw new AppException('请输入快递单号');
  308. }
  309. //存快递信息
  310. $db_express_model = new Express();
  311. $db_express_model->order_id = $param['order_id'];
  312. $db_express_model->express_code = $param['express_code'] ?: '';
  313. //当code获取不到物流,并且 有传过来物流名称则使用传过来的(主要针对供应链)
  314. $express_company_name = array_get(ExpressCompany::create()->where('value', $param['express_code'])->first(), 'name', '其他快递');
  315. if ($express_company_name == "其他快递" && !empty($param['express_company_name'])) $express_company_name = $param['express_company_name'];
  316. $db_express_model->express_company_name = $express_company_name;
  317. $db_express_model->express_sn = $param['express_sn'] ?: '';
  318. $db_express_model->save();
  319. if (empty($param['order_goods_ids'])) {// 将所有未发货的商品全部发货
  320. // 获取剩余未发货的商品
  321. $new_order_goods = OrderPackageService::getNotDeliverGoods($param['order_id']);
  322. // 单包裹发货
  323. OrderPackageService::saveOneOrderPackage((int)$param['order_id'],(int)$db_express_model->id,$new_order_goods);
  324. //修改订单表是否全部发货 为全部发货
  325. Order::where('id', $param['order_id'])->update(['is_all_send_goods' => 2]);
  326. } else {
  327. // 新做的参数,可能有些地方没改到
  328. if(empty($param['order_package'])){// 没有此参数,则将order_goods_ids里未发货的商品全部发货
  329. // 获取剩余未发货的商品
  330. $order_goods = OrderGoods::uniacid()
  331. ->where('order_id',$param['order_id'])
  332. ->whereIn('id',$param['order_goods_ids'] ?: [])
  333. ->whereNull('order_express_id')
  334. ->get()
  335. ->makeVisible('order_id');
  336. $order_package = OrderPackage::getOrderPackage($param['order_id'])->where('order_express_id','!=',false);
  337. $new_order_goods = OrderPackageService::filterGoods($order_goods,$order_package);
  338. // 单包裹发货
  339. OrderPackageService::saveOneOrderPackage((int)$param['order_id'],(int)$db_express_model->id,$new_order_goods);
  340. }else{// order_package数据结构[['order_goods_id' => int,'total' => int],['order_goods_id' => int,'total' => int]...]
  341. // 获取剩余未发货的商品
  342. $new_order_goods = OrderPackageService::getNotDeliverGoods($param['order_id']);
  343. // 校验包裹商品
  344. $new_order_package = collect($param['order_package']);
  345. OrderPackageService::checkGoodsPackage($new_order_package,$new_order_goods);
  346. // 单包裹发货
  347. OrderPackageService::saveOneOrderPackage((int)$param['order_id'],(int)$db_express_model->id,$new_order_package);
  348. event(new AfterOrderPackageSentEvent(Order::find($param['order_id'])));
  349. }
  350. // 全部发货则改订单状态
  351. $new_order_goods = OrderPackageService::getNotDeliverGoods($param['order_id']);
  352. if($new_order_goods->isEmpty()){
  353. Order::where('id', $param['order_id'])->update(['is_all_send_goods' => 2]);
  354. }else{
  355. Order::where('id', $param['order_id'])->update(['is_all_send_goods' => 1]);
  356. }
  357. }
  358. return true;
  359. }
  360. /**
  361. * 发货
  362. * @param $param
  363. * @return string
  364. * @throws AppException
  365. */
  366. public static function orderSend($param)
  367. {
  368. // \Log::info('---param---', $param);
  369. $orderOperation = OrderSend::find($param['order_id']);
  370. $orderOperation->params = $param;
  371. // \Log::info('----1orderOperation--', $orderOperation);
  372. return self::OrderOperate($orderOperation);
  373. }
  374. /**
  375. * 改变订单价格
  376. * @param $param
  377. * @return string
  378. * @throws AppException
  379. */
  380. public static function changeOrderPrice($param)
  381. {
  382. $order = OrderChangePrice::find($param['order_id']);
  383. /**
  384. * @var $order OrderChangePrice
  385. */
  386. if (!isset($order)) {
  387. throw new AppException('(ID:' . $order->id . ')未找到订单');
  388. }
  389. $orderGoodsChangePriceLogs = self::getOrderGoodsChangePriceLogs($param);
  390. $order->setOrderGoodsChangePriceLogs($orderGoodsChangePriceLogs);//todo
  391. $order->setOrderChangePriceLog();
  392. $order->setClerkId($param['clerk_id']);
  393. $order->setClerkType($param['clerk_type']);
  394. $order->setDispatchChangePrice($param['dispatch_price']);
  395. return self::OrderOperate($order);
  396. }
  397. /**
  398. * 订单改价记录
  399. * {@inheritdoc}
  400. */
  401. private static function getOrderGoodsChangePriceLogs($param)
  402. {
  403. return collect($param['order_goods'])->map(function ($orderGoodsParams) use ($param) {
  404. $orderGoodsChangePriceLog = new OrderGoodsChangePriceLog($orderGoodsParams);
  405. if (!isset($orderGoodsChangePriceLog->belongsToOrderGoods)) {
  406. throw new AppException('(ID:' . $orderGoodsChangePriceLog->order_goods_id . ')未找到订单商品记录');
  407. }
  408. if ($orderGoodsChangePriceLog->belongsToOrderGoods->order_id != $param['order_id']) {
  409. throw new AppException('(ID:' . $orderGoodsChangePriceLog->order_goods_id . ',' . $param['order_id'] . ')未找到与商品对应的订单');
  410. }
  411. //todo 如果不清空,可能会在push时 保存未被更新的订单商品数据,此处需要重新设计
  412. $orderGoodsChangePriceLog->setRelations([]);
  413. return $orderGoodsChangePriceLog;
  414. });
  415. }
  416. public static function autoSend($accountId)
  417. {
  418. Setting::$uniqueAccountId = \YunShop::app()->uniacid = $accountId;
  419. if ($minutes = (int)Setting::get('shop.trade.send')) {
  420. \app\backend\modules\order\models\Order::waitSend()->normal()
  421. ->with('hasManyOrderGoods')
  422. ->withCount('hasManyOrderGoods as order_goods_count')
  423. ->whereIn('plugin_id', [0,92]) //只发自营商品
  424. ->where('pay_time', '<', (int)Carbon::now()->subMinutes($minutes)->timestamp)
  425. ->chunk(1000, function ($orders) {
  426. if (!$orders->isEmpty()) {
  427. foreach ($orders as $order) {
  428. if ($order->order_goods_count == 1) {
  429. $goods_trade = GoodsTradeSet::where('goods_id', $order->hasManyOrderGoods->first()->goods_id)->first();
  430. if ($goods_trade && $goods_trade->auto_send) {
  431. $auto_send_day = $goods_trade->auto_send_day;
  432. if ($auto_send_day > 1) {
  433. $auto_send_day -= 1;
  434. $auto_send_day = $order->pay_time->addDays($auto_send_day)->format('Y-m-d');
  435. } else {
  436. $auto_send_day = $order->pay_time->format('Y-m-d');
  437. }
  438. $auto_send_day .= " {$goods_trade->auto_send_time}:00";
  439. $auto_send_timestamp = strtotime($auto_send_day);
  440. if ($auto_send_timestamp < $order->pay_time->timestamp) {
  441. $auto_send_timestamp = Carbon::createFromTimestamp($auto_send_timestamp)->addDays(1)->timestamp;
  442. }
  443. if ($auto_send_timestamp > time()) {
  444. continue;
  445. }
  446. }
  447. }
  448. try {
  449. $param = [
  450. "dispatch_type_id" => 1,
  451. "order_id" => $order->id,
  452. ];
  453. OrderService::orderSend($param);
  454. } catch (\Exception $e) {
  455. \Log::error("订单:{$order->id}自动发货失败", $e->getMessage());
  456. }
  457. }
  458. }
  459. });
  460. } else {
  461. \app\backend\modules\order\models\Order::waitSend()->normal()
  462. ->with('hasManyOrderGoods')
  463. ->withCount('hasManyOrderGoods as order_goods_count')
  464. ->whereIn('plugin_id', [0,92]) //只发自营商品
  465. ->chunk(1000, function ($orders) {
  466. if (!$orders->isEmpty()) {
  467. foreach ($orders as $order) {
  468. if ($order->order_goods_count != 1) {
  469. continue;
  470. }
  471. $goods_trade = GoodsTradeSet::where('goods_id', $order->hasManyOrderGoods->first()->goods_id)->first();
  472. if (!$goods_trade || !$goods_trade->auto_send) {
  473. continue;
  474. }
  475. $auto_send_day = $goods_trade->auto_send_day;
  476. if ($auto_send_day > 1) {
  477. $auto_send_day -= 1;
  478. $auto_send_day = $order->pay_time->addDays($auto_send_day)->format('Y-m-d');
  479. } else {
  480. $auto_send_day = $order->pay_time->format('Y-m-d');
  481. }
  482. $auto_send_day .= " {$goods_trade->auto_send_time}:00";
  483. $auto_send_timestamp = strtotime($auto_send_day);
  484. if ($auto_send_timestamp < $order->pay_time->timestamp) {
  485. $auto_send_timestamp = Carbon::createFromTimestamp($auto_send_timestamp)->addDays(1)->timestamp;
  486. }
  487. if ($auto_send_timestamp > time()) {
  488. continue;
  489. }
  490. try {
  491. $param = [
  492. "dispatch_type_id" => 1,
  493. "order_id" => $order->id,
  494. ];
  495. OrderService::orderSend($param);
  496. } catch (\Exception $e) {
  497. \Log::error("订单:{$order->id}自动发货失败", $e->getMessage());
  498. }
  499. }
  500. }
  501. });
  502. }
  503. }
  504. /**
  505. * 自动收货
  506. * {@inheritdoc}
  507. */
  508. public static function autoReceive($uniacid)
  509. {
  510. \YunShop::app()->uniacid = $uniacid;
  511. \Setting::$uniqueAccountId = $uniacid;
  512. $time_type = (int)\Setting::get('shop.trade.receive_time_type');
  513. $time = (int)\Setting::get('shop.trade.receive');
  514. if (!$time) {
  515. return;
  516. }
  517. $dispatch_type_id = [
  518. DispatchType::SELF_DELIVERY, DispatchType::HOTEL_CHECK_IN, DispatchType::DELIVERY_STATION_SEND,
  519. DispatchType::DRIVER_DELIVERY, DispatchType::PACKAGE_DELIVER, DispatchType::PACKAGE_DELIVERY
  520. ];
  521. \app\backend\modules\order\models\Order::waitReceive()->where('auto_receipt', 0)
  522. ->whereNotIn('dispatch_type_id', $dispatch_type_id)
  523. ->where(function ($q) use ($time, $time_type) {
  524. if ($time_type) {
  525. $q->where('send_time', '<', (int)Carbon::now()->subMinutes($time)->timestamp);
  526. } else {
  527. $q->where('send_time', '<', (int)Carbon::now()->subDays($time)->timestamp);
  528. }
  529. })
  530. ->normal()
  531. ->chunk(1000, function ($orders) {
  532. if (!$orders->isEmpty()) {
  533. $orders->each(function ($order) {
  534. try {
  535. OrderService::orderReceive(['order_id' => $order->id]);
  536. } catch (\Exception $e) {
  537. \Log::error("订单:{$order->id}自动收货失败", $e->getMessage());
  538. }
  539. });
  540. }
  541. });
  542. }
  543. /**
  544. * 自动关闭订单
  545. * {@inheritdoc}
  546. */
  547. public static function autoClose($uniacid)
  548. {
  549. \YunShop::app()->uniacid = $uniacid;
  550. \Setting::$uniqueAccountId = $uniacid;
  551. $time_type = (int)\Setting::get('shop.trade.close_order_time_type');
  552. $time = (int)\Setting::get('shop.trade.close_order_days');
  553. if (!$time) {
  554. return;
  555. }
  556. $orders = \app\backend\modules\order\models\Order::waitPay()->whereNotIn('plugin_id', [70,158]) //淘京拼CPS(70) 抖音CPS(158)的订单不走自动关闭
  557. ->where(function ($q) use ($time, $time_type) {
  558. if ($time_type) {
  559. $q->where('create_time', '<', (int)Carbon::now()->subMinutes($time)->timestamp);
  560. } else {
  561. $q->where('create_time', '<', (int)Carbon::now()->subDays($time)->timestamp);
  562. }
  563. })->normal()->get();
  564. if (!$orders->isEmpty()) {
  565. $orders->each(function ($order) {
  566. try {
  567. OrderService::orderClose(['order_id' => $order->id]);
  568. } catch (\Exception $e) {
  569. \Log::error("订单:{$order->id}自动关闭失败", $e->getMessage());
  570. }
  571. });
  572. }
  573. }
  574. /**
  575. * @param $order
  576. * @throws AppException
  577. */
  578. public static function fixVirtualOrder($order)
  579. {
  580. \YunShop::app()->uniacid = $order['uniacid'];
  581. \Setting::$uniqueAccountId = $order['uniacid'];
  582. if ($order['status'] == 1) {
  583. OrderService::orderSend(['order_id' => $order['id']]);
  584. }
  585. if ($order['status'] == 2) {
  586. OrderService::orderReceive(['order_id' => $order['id']]);
  587. }
  588. }
  589. public static function getReceiptGoodsNotice()
  590. {
  591. $msg = Setting::get('shop.order.receipt_goods_notice');
  592. return self::verifyOrderReceipt($msg);
  593. }
  594. public static function verifyOrderReceipt($msg)
  595. {
  596. $verify_str = str_replace(' ', '', $msg);
  597. // 如果传入内容都是空格
  598. if (empty($verify_str)) {
  599. $msg = '';
  600. }
  601. return $msg;
  602. }
  603. }