123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- <?php
- // +----------------------------------------------------------------------
- // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
- // +----------------------------------------------------------------------
- // | Author: 萤火科技 <admin@yiovo.com>
- // +----------------------------------------------------------------------
- declare (strict_types=1);
- namespace app\console\service;
- use app\common\model\member\GoldRice;
- use app\common\service\commission\GiveOutCommission;
- use app\console\model\Order as OrderModel;
- use app\common\service\BaseService;
- use app\common\service\Order as OrderService;
- use app\common\service\order\Complete as OrderCompleteService;
- use app\common\enum\order\OrderStatus as OrderStatusEnum;
- use app\common\library\helper;
- use app\console\library\Tools;
- use app\api\model\OrderRefund as OrderRefundModel;
- use app\common\service\order\Refund as RefundService;
- use app\common\model\OrderGoods as OrderGoodsModel;
- use app\api\model\user\CommissionsDetail;
- use app\api\model\card\UserRiceCard as UserRiceCardModel;
- use app\api\model\card\UserRiceCard;
- use app\api\model\card\UserRiceCardConsume;
- use app\common\model\order\RefundHis;
- use app\common\service\goods\source\Factory as FactoryStock;
- use think\facade\Db;
- /**
- * 服务类:订单模块
- * Class Order
- * @package app\console\service
- */
- class Order extends BaseService
- {
- /**
- * 未支付订单自动关闭
- * @param int $storeId
- * @param int $closeMinutes 自定关闭订单分钟数
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function closeEvent(int $storeId, int $closeMinutes)
- {
- // 截止时间
- $deadlineTime = time() - ((int)$closeMinutes * 60);
- // 查询截止时间未支付的订单
- $model = new OrderModel;
- $list = $model->getListByClose($storeId, $deadlineTime);
- // 订单ID集
- $orderIds = helper::getArrayColumn($list, 'order_id');
- if (!empty($orderIds)) {
- // 取消订单事件
- foreach ($list as $order) {
- OrderService::cancelEvent($order);
- }
- // 批量更新订单状态为已取消
- $model->onBatchUpdate($orderIds, ['order_status' => OrderStatusEnum::CANCELLED]);
- }
- // 记录日志
- Tools::taskLogs('OrderCancel', 'closeEvent', [
- 'storeId' => $storeId,
- 'closeMinutes' => $closeMinutes,
- 'deadlineTime' => $deadlineTime,
- 'orderIds' => helper::jsonEncode($orderIds)
- ]);
- }
- /**
- * 超时未自提订单自动退款
- */
- public function refundPickupEvent(int $storeId, int $closeMinutes)
- {
- // 截止时间
- $deadlineTime = time() - ((int)$closeMinutes * 60);
- // 查询截止时间未自提的订单
- $model = new OrderModel;
- $list = $model->getListByUnPickup($storeId, $deadlineTime);
- // 订单ID集
- $orderIds = helper::getArrayColumn($list, 'order_id');
- log_record([
- 'name' => '超时未自提订单自动退款',
- 'data' => $orderIds
- ]);
- if (!empty($orderIds)) {
- Db::transaction(function() use ($model, $list, $orderIds) {
-
- // 关闭订单事件
- foreach ($list as $order) {
- // 1.未发生手动退款,则整单退款
- if ($order['delivery_type'] != 20 || $order['hx_status'] != 10 || $order['pay_status'] != 20) {
- // 不满足门店自提订单条件
- continue;
- }
- if (empty($order['goods'])) { // 订单商品信息不存在
- continue;
- }
- $refund = OrderRefundModel::where(['order_id'=>$order['order_id']])->where('status','in',[0,10,20])->find();
- if (!empty($refund)) { // 当前订单已申请售后
- continue;
- }
- $riceCard = UserRiceCardModel::getValidRiceCardDetail($order['rice_card_id']);
- if ($order['rice_card_id']) { // 订单商品有使用现金卡
- // 验证余额
- if ($order['rice_card_money'] + $riceCard['balance'] > $riceCard['face_value']) {
- // 现金卡退还金额异常
- continue;
- }
- // 写入现金卡流水明细
- UserRiceCardConsume::add($riceCard, $order['order_no'], $order['pay_price'], $order['rice_card_money'], 1, '商品退款');
- // 退还现金卡金额
- UserRiceCard::setIncByField($order['rice_card_id'], 'balance', (float)$order['rice_card_money']);
- $riceCard->effect_state = 1; // 改为 生效
- $riceCard->save();
- }
- $refundMoney = helper::bcsub($order['pay_price'] + $order['rice_card_money'], 0, 2); // 退款金额 = 实付金额 + 现金卡抵扣金额
-
- $goods_images = [];
- foreach ($order['goods'] as $arr){ //获取图片url
- $goods_images[] = $arr['good_image'];
- }
- $param['order_id'] = $order['order_id'];
- $param['refund_money'] = $refundMoney;
- $param['pay_money'] = $order['pay_price'];
- $param['gold_rice_amount'] = $order['gold_rice_amount'];
- $param['gold_rice_amount_output'] = $order['gold_rice_amount_input'];
- $param['rice_card_money'] = $order['rice_card_money'];
- $param['rice_card_id'] = $order['rice_card_id'];
- $param['express_price'] = $order['express_price'];
- $param['goods_type'] = 1; // 未收到货
- $param['apply_desc'] = '';
- $param['type'] = 30;// 30 未发货退款
- $param['refund_number'] = OrderService::createOrderNoPrefix('TKSQ'); //申请单编号
- // $param['out_refund_no'] = OrderService::createOrderNoPrefix('TK');//生成退款编号
- $param['user_id'] = $order['user_id'];
- // $param['goods_images'] = $goods_images;
- $param['order_goods_id'] = 0;
- $param['store_id'] = 10001;
- $param['is_sys_refund'] = 1; //系统退款
- $param['goods_num'] = helper::getArrayColumnSum($order['goods'], 'total_num');
-
- $param['finance_refund'] = 10;// 10已退款
- $param['out_refund_time'] = time(); //退款时间
- $param['refund_succ_time'] = time(); //退款成功时间
- $param['refund_close_time'] = time(); //退款关闭时间
- $param['status'] = 20;//售后单直接完成
- $param['delivery_type'] = $order['delivery_type'];
- $param['hx_status'] = $order['hx_status'];
- $param['shop_id'] = $order['shop_id'];
- if($order['delivery_type']==20){
- $param['audit_status'] = 10;//自提单直接门店审核通过
- }
- if ($param['pay_money'] > 0) {
- //直接退款逻辑处理 直接退款
- $RefundService = new RefundService();
- $refund_ret = $RefundService->execute($order,$param['refund_number'], $param['pay_money']);
- if ($refund_ret['status'] == 200) {
- $param['transaction_id'] = $refund_ret['data']['transaction_id']; // 微信退款交易号
- }
- }
-
- //订单商品修改成全额退款状态
- OrderGoodsModel::updateBase(['has_refund_full' => 1], ['order_id' => $order['order_id']]);
- //全部退款变更不结算
- CommissionsDetail::updateAllDetails($order['order_id']);
- // 回退商品库存
- FactoryStock::getFactory($order['order_source'])->backGoodsStock($order, true);
- // 回退多个活动的活动库存
- FactoryStock::getFactory($order['order_source'])->backActivityStock($order, true);
-
- $refund_res = OrderRefundModel::create($param);
-
- //关闭订单状态
- $RefundService = new OrderService();
- $RefundService->closeOrder($param['order_id']);
- //写入金米粒记录
- GoldRice::refundGoldRiceRoad($order,$refund_res);
-
- //门店自提
- $his_type = 11;
- $name = $order['user']['nick_name'] ?? '';
- $json_str = json_encode(["用户超时未核销,系统自动退款"]);
- (new RefundHis())->add($refund_res['order_refund_id'],$name,$his_type,$json_str,[],'系统','用户超时未核销,系统自动退款');
- }
- });
- }
- // 记录日志
- Tools::taskLogs('PickupOrderRefund', 'refundPickupEvent', [
- 'storeId' => $storeId,
- 'closeMinutes' => $closeMinutes,
- 'deadlineTime' => $deadlineTime,
- 'orderIds' => helper::jsonEncode($orderIds)
- ]);
- }
- /**
- * 已发货订单自动确认收货
- * @param int $storeId
- * @param int $receiveDays 自动收货天数
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function receiveEvent(int $storeId, int $receiveDays)
- {
- // 截止时间
- $deadlineTime = time() - ((int)$receiveDays * 86400);
- // 查询截止时间未确认收货的订单ID集
- $model = new OrderModel;
- $orderIds = $model->getOrderIdsByReceive($storeId, $deadlineTime);
- // 更新订单收货状态
- if (!empty($orderIds)) {
- // 批量更新订单状态为已收货
- $model->onUpdateReceived($orderIds);
- // 批量处理已完成的订单
- $this->onReceiveCompleted($storeId, $orderIds);
- //分佣结算逻辑
- /* foreach ($orderIds as $orderId){
- //分佣结算逻辑
- $cm = new GiveOutCommission();
- $flag = $cm->confirmGoodsCommission($orderId);
- if ($flag == false){
- log_record('订单分佣结算失败:'.$orderId);
- }
- //order_goods的财务结算状态变更
- OrderGoods::where('order_id',$orderId)->update(['finance_clearing_status'=>OrderGoods::FINANCE_CLEARING_WAIT]);
- }*/
- }
- // 记录日志
- Tools::taskLogs('Order', 'receiveEvent', [
- 'storeId' => $storeId,
- 'receiveDays' => $receiveDays,
- 'deadlineTime' => $deadlineTime,
- 'orderIds' => helper::jsonEncode($orderIds)
- ]);
- }
- /**
- * 已完成订单自动结算
- * @param int $storeId
- * @param int $refundDays 售后期限天数
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function settledEvent(int $storeId, int $refundDays)
- {
- // 截止时间
- $deadlineTime = time() - ((int)$refundDays * 86400);
- // 查询截止时间确认收货的订单ID集
- $model = new OrderModel;
- $list = $model->getOrderListBySettled($storeId, $deadlineTime);
- // 订单ID集
- $orderIds = helper::getArrayColumn($list, 'order_id');
- // 订单结算服务
- if (!empty($orderIds)) {
- $OrderCompleteService = new OrderCompleteService();
- $OrderCompleteService->settled($list);
- }
- // 记录日志
- Tools::taskLogs('Order', 'settledEvent', [
- 'storeId' => $storeId,
- 'refundDays' => $refundDays,
- 'deadlineTime' => $deadlineTime,
- 'orderIds' => helper::jsonEncode($orderIds)
- ]);
- }
- /**
- * 已确认收货订单自动评价
- * @param int $storeId
- * @param int $commentDays 评价期限天数
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function commentEvent(int $storeId, int $commentDays)
- {
- // 截止时间
- $deadlineTime = time() - ((int)$commentDays * 86400);
- // 查询截止时间确认收货的订单ID集
- $model = new OrderModel;
- $list = $model->getOrderListByComment($storeId, $deadlineTime);
- // 订单ID集
- $orderIds = helper::getArrayColumn($list, 'order_id');
- // 订单评价服务
- if (!empty($orderIds)) {
- $OrderCompleteService = new OrderCompleteService();
- $OrderCompleteService->comment($list);
- }
- // 记录日志
- Tools::taskLogs('Order', 'commentEvent', [
- 'storeId' => $storeId,
- 'commentDays' => $commentDays,
- 'deadlineTime' => $deadlineTime,
- 'orderIds' => helper::jsonEncode($orderIds),
- ]);
- }
- /**
- * 批量处理已完成的订单
- * @param int $storeId 商城ID
- * @param array $orderIds 订单ID集
- * @return bool
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- private function onReceiveCompleted(int $storeId, array $orderIds)
- {
- // 获取已完成的订单列表
- $model = new OrderModel;
- $list = $model->getListByOrderIds($storeId, $orderIds);
- // 执行订单完成后的操作
- if (!$list->isEmpty()) {
- $OrderCompleteService = new OrderCompleteService();
- $OrderCompleteService->complete($list, $storeId);
- }
- return true;
- }
- }
|