where($query->getTable() . '.shop_supplier_id', -1); }else{ $query->where($query->getTable() . '.shop_supplier_id', 'in', $shop_supplier_ids); } } /** * 订单列表 */ public function getList($dataType, $data = null) { $model = $this; // 检索查询条件 $model = $model->setWhere($model, $data); // 获取数据列表 return $model->with(['product' => ['image'], 'user', 'supplier']) ->order(['create_time' => 'desc']) ->where($this->transferDataType($dataType)) ->paginate($data); } /** * 获取订单总数 */ public function getCount($type = 'all', $data) { $model = $this; // 检索查询条件 $model = $model->setWhere($model, $data); // 获取数据列表 return $model->alias('order') ->where($this->transferDataType($type)) ->count(); } /** * 订单列表(全部) */ public function getListAll($dataType, $query = []) { $model = $this; // 检索查询条件 $model = $model->setWhere($model, $query); // 获取数据列表 return $model->with(['product.image', 'address', 'user', 'extract']) ->alias('order') ->field('order.*') ->where($this->transferDataType($dataType)) ->where('order.is_delete', '=', 0) ->order(['order.create_time' => 'desc']) ->select(); } /** * 订单导出 */ public function exportList($dataType, $query) { // 获取订单列表 $list = $this->getListAll($dataType, $query); // 导出excel文件 return (new Exportservice)->orderList($list); } /** * 设置检索查询条件 */ private function setWhere($model, $data) { //搜索订单号 if (isset($data['order_no']) && $data['order_no'] != '') { $model = $model->where('order_no', 'like', '%' . trim($data['order_no']) . '%'); } //搜索配送方式 if (isset($data['style_id']) && $data['style_id'] != '') { $model = $model->where('delivery_type', '=', $data['style_id']); } //搜索配送方式 if (isset($data['order_type'])) { $model = $model->where('order_type', '=', $data['order_type']); } //搜索配送方式 if (isset($data['shop_supplier_id']) && $data['shop_supplier_id']) { $model = $model->where('shop_supplier_id', '=', $data['shop_supplier_id']); } //搜索时间段 if (isset($data['create_time']) && $data['create_time'] != '') { $model = $model->where('create_time', 'between', [strtotime($data['create_time'][0]), strtotime($data['create_time'][1]) + 86399]); } return $model; } /** * 转义数据类型条件 */ private function transferDataType($dataType) { $filter = []; // 订单数据类型 switch ($dataType) { case 'all': break; case 'payment'; $filter['pay_status'] = OrderPayStatusEnum::PENDING; $filter['order_status'] = 10; break; case 'process'; $filter['pay_status'] = OrderPayStatusEnum::SUCCESS; // $filter['delivery_status'] = 10; $filter['order_status'] = 10; break; case 'complete'; $filter['pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['order_status'] = 30; break; case 'cancel'; // $filter['pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['order_status'] = 20; break; } return $filter; } /** * 确认发货(单独订单) */ public function delivery($data) { // 转义为订单列表 $orderList = [$this]; // 验证订单是否满足发货条件 if (!$this->verifyDelivery($orderList)) { return false; } // 整理更新的数据 $updateList = [[ 'order_id' => $this['order_id'], 'express_id' => $data['express_id'], 'express_no' => $data['express_no'] ]]; // 更新订单发货状态 if ($status = $this->updateToDelivery($updateList)) { // 获取已发货的订单 $completed = self::detail($this['order_id'], ['user', 'address', 'product', 'express']); // 发送消息通知 $this->sendDeliveryMessage([$completed]); } return $status; } /** * 确认发货后发送消息通知 */ private function sendDeliveryMessage($orderList) { // 实例化消息通知服务类 $Service = new MessageService; foreach ($orderList as $item) { // 发送消息通知 $Service->delivery($item, OrderTypeEnum::MASTER); } return true; } /** * 发送订单 * @return bool */ public function sendOrder($order_id) { $deliver = SettingModel::getSupplierItem('deliver', $this['supplier']['shop_supplier_id']); if ($this['order_status']['value'] != 10 || $this['deliver_status'] != 0) { $this->error = '订单已发送或已完成'; return false; } // 开启事务 $this->startTrans(); try { $this->addOrder($deliver); // 实例化消息通知服务类 $Service = new MessageService; // 发送消息通知 $Service->delivery($this, OrderTypeEnum::MASTER); $this->commit(); return true; } catch (\Exception $e) { $this->error = $e->getMessage(); $this->rollback(); return false; } } /** * 更新订单发货状态(批量) */ private function updateToDelivery($orderList) { $data = []; foreach ($orderList as $item) { $data[] = [ 'order_id' => $item['order_id'], 'express_no' => $item['express_no'], 'express_id' => $item['express_id'], 'delivery_status' => 20, 'delivery_time' => time(), ]; } return $this->saveAll($data); } /** * 验证订单是否满足发货条件 */ private function verifyDelivery($orderList) { foreach ($orderList as $order) { if ( $order['pay_status']['value'] != 20 || $order['delivery_type']['value'] != DeliveryTypeEnum::EXPRESS || $order['delivery_status']['value'] != 10 ) { $this->error = "订单号[{$order['order_no']}] 不满足发货条件!"; return false; } } return true; } /** * 修改订单价格 */ public function updatePrice($data) { if ($this['pay_status']['value'] != 10) { $this->error = '该订单不合法'; return false; } if ($this['order_source'] != 10) { $this->error = '该订单不合法'; return false; } // 实际付款金额 $payPrice = bcadd($data['update_price'], $data['update_express_price'], 2); if ($payPrice <= 0) { $this->error = '订单实付款价格不能为0.00元'; return false; } return $this->save([ 'order_no' => $this->orderNo(), // 修改订单号, 否则微信支付提示重复 'order_price' => $data['update_price'], 'pay_price' => $payPrice, 'update_price' => helper::bcsub($data['update_price'], helper::bcsub($this['total_price'], $this['coupon_money'])), 'express_price' => $data['update_express_price'] ]) !== false; } /** * 取消订单 */ public function orderCancel($data) { // 判断订单是否有效 if ($this['delivery_status']['value'] == 20 || $this['order_status']['value'] != 10 || $this['pay_status']['value'] != 20) { $this->error = "订单不允许取消"; return false; } // 订单取消事件 return $this->transaction(function () use ($data) { // 执行退款操作 $this['pay_type']['value'] < 40 && (new OrderRefundService)->execute($this); // 回退商品库存 ProductFactory::getFactory($this['order_source'])->backProductStock($this['product'], true); // 回退用户优惠券 $this['coupon_id'] > 0 && UserCouponModel::setIsUse($this['coupon_id'], false); // 返还用户兑换券 by lyzflash $this->backUserCoupon($this['product']); // 回退用户积分 //$user = UserModel::detail($this['user_id']); //$describe = "订单取消:{$this['order_no']}"; //$this['points_num'] > 0 && $user->setIncPoints($this['points_num'], $describe); // 更新订单状态 return $this->save(['order_status' => 20, 'cancel_remark' => $data['cancel_remark']]); }); } /** * 审核:用户取消订单 * 增加参数操作员$storeUserName by lyzflash 2024.05.22 */ public function refund($data, $storeUserName = '') { // 判断订单是否有效 // 堂食订单完成了也可以退款 by lyzflash if ($this['pay_status']['value'] != 20 || ($this['order_type'] == 0 && $this['order_status']['value'] != 10) || ($this['order_type'] == 1 && $this['order_status']['value'] == 20)) { $this->error = '该订单不合法'; return false; } if ($data['refund_money'] + $this['refund_money'] > $this['pay_price']) { $this->error = '退款金额不能超过支付金额'; return false; } if(empty($data['product_ids'])){ $this->error = '部分退款,请选择需要退款的商品'; return false; } $orderRefund = $this; // 订单取消事件 $status = $this->transaction(function () use ($data, $orderRefund, $storeUserName) { // 执行退款操作 $this['pay_type']['value'] < 40 && (new OrderRefundService)->execute($this, $data['refund_money']); $update['refund_type'] = $data['refund_type']; $update['refund_money'] = $this['refund_money'] + $data['refund_money']; // 如果总退款金额等于订单支付金额,设置为整单退 by lyzflash if ($update['refund_money'] == $this['pay_price']) { $update['refund_type'] = 10; } if ($update['refund_type'] == 10 || $update['refund_money'] == $this['pay_price']) { // 如果整单退,更新配送状态为完成 $deliver = (new OrderDeliver())::detail(['order_id' => $this['order_id'], 'status' => 10]); if ($deliver) { $deliver->updateDeliver(); } $update['delivery_status'] = 20; $update['delivery_time'] = time(); $update['receipt_status'] = 20; $update['receipt_time'] = time(); $update['order_status'] = 30; } // 更新订单状态 $this->save($update); //如果下面不执行订单完成后的操作,则在此添加财务对账信息 (new OrderFinanceModel)->refund($orderRefund, $data['refund_money']); // 更新退款商品状态 by lyzflash if (!empty($data['product_ids']) && is_array($data['product_ids'])) { (new OrderProductModel)->where('order_id', '=', $data['order_id']) ->where('product_id', 'IN', $data['product_ids']) ->update(['is_refund' => 1]); // 打印退单小票 $order = [ 'shop_supplier_id' => $this['shop_supplier_id'], 'app_id' => $this['app_id'], 'refund_type' => $update['refund_type'], 'callNo' => $this['callNo'], 'order_no' => $this['order_no'], 'delivery_type' => $this['delivery_type'], 'table_id' => $this['table_id'], 'cashier_user_name' => $storeUserName, // 操作人 by lzyflash 2024.05.22 ]; foreach ($this['product'] as $product) { if (in_array($product['product_id'], $data['product_ids'])) { $order['product'][] = $product; } } // 返还用户兑换券 by lyzflash $this->backUserCoupon($order['product']); // 打印小票 (new OrderPrinterService)->printRefundTicket($order); } // 执行订单完成后的操作 // $OrderCompleteService = new OrderCompleteService(OrderTypeEnum::MASTER); // $OrderCompleteService->complete([$this], static::$app_id); return true; }); return $status; } /** * 返还用户兑换券 by lyzflash */ private function backUserCoupon($productList) { foreach ($productList as $product) { if ($product['product_coupon_id']) { UserCouponModel::backUseNum($product['product_coupon_id'], $product['user_id'], $product['total_num']); } } return true; } /** * 获取待处理订单 */ public function getReviewOrderTotal($shop_supplier_id = 0) { $model = $this; $filter['pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['delivery_status'] = 10; $filter['order_status'] = 10; if ($shop_supplier_id) { $model = $model->where('shop_supplier_id', '=', $shop_supplier_id); } return $model->where($filter)->count(); } /** * 获取某天的总销售额 * 结束时间不传则查一天 */ public function getOrderTotalPrice($startDate = null, $endDate = null, $shop_supplier_id = 0) { $model = $this; $startDate && $model = $model->where('pay_time', '>=', strtotime($startDate)); if (is_null($endDate) && $startDate) { $model = $model->where('pay_time', '<', strtotime($startDate) + 86400); } else if ($endDate) { $model = $model->where('pay_time', '<', strtotime($endDate) + 86400); } if ($shop_supplier_id) { $model = $model->where('shop_supplier_id', '=', $shop_supplier_id); } return $model->where('pay_status', '=', 20) ->where('order_status', '<>', 20) ->where('is_delete', '=', 0) ->sum('pay_price'); } /** * 获取某天的客单价 * 结束时间不传则查一天 */ public function getOrderPerPrice($startDate = null, $endDate = null) { $model = $this; $model = $model->where('pay_time', '>=', strtotime($startDate)); if (is_null($endDate)) { $model = $model->where('pay_time', '<', strtotime($startDate) + 86400); } else { $model = $model->where('pay_time', '<', strtotime($endDate) + 86400); } return $model->where('pay_status', '=', 20) ->where('order_status', '<>', 20) ->where('is_delete', '=', 0) ->avg('pay_price'); } /** * 获取某天的下单用户数 */ public function getPayOrderUserTotal($day, $shop_supplier_id = 0) { $model = $this; $startTime = strtotime($day); if ($shop_supplier_id) { $model = $model->where('shop_supplier_id', '=', $shop_supplier_id); } $userIds = $model->distinct(true) ->where('pay_time', '>=', $startTime) ->where('pay_time', '<', $startTime + 86400) ->where('pay_status', '=', 20) ->where('is_delete', '=', 0) ->column('user_id'); return count($userIds); } /** * 获取平台的总销售额 */ public function getTotalMoney($type = 'all', $is_settled = -1) { $model = $this; $model = $model->where('pay_status', '=', 20) ->where('order_status', '<>', 20) ->where('is_delete', '=', 0); if ($is_settled == 0) { $model = $model->where('is_settled', '=', 0); } if ($type == 'all') { return $model->sum('pay_price'); } else if ($type == 'supplier') { return ($model->sum('pay_price')) - ($model->sum('refund_money')); } else if ($type == 'sys') { return $model->sum('sys_money'); } return 0; } }