<?php
|
|
namespace app\operations\model\takeout;
|
|
use app\common\model\order\Order as OrderModel;
|
use app\common\library\helper;
|
use app\common\enum\order\OrderTypeEnum;
|
use app\common\service\message\MessageService;
|
use app\common\service\order\OrderRefundService;
|
use app\common\enum\order\OrderPayStatusEnum;
|
use app\common\service\product\factory\ProductFactory;
|
use app\common\model\plus\coupon\UserCoupon as UserCouponModel;
|
use app\common\model\user\User as UserModel;
|
use app\common\enum\settings\DeliveryTypeEnum;
|
use app\operations\service\order\ExportService;
|
use app\common\model\settings\Setting as SettingModel;
|
use app\common\model\order\OrderProduct as OrderProductModel; // by lyzflash
|
use app\common\service\order\OrderPrinterService;
|
use app\common\service\order\OrderCompleteService;
|
use app\api\model\order\OrderFinance as OrderFinanceModel;//BY YJ
|
|
/**
|
* 订单模型
|
*/
|
class Order extends OrderModel
|
{
|
// 定义全局的查询范围
|
protected $globalScope = ['status'];
|
public function scopeStatus($query)
|
{
|
$shop_supplier_ids = \app\operations\model\supplier\Supplier::getSupplierIdsByUser(session('jjjshop_operations')['user']);
|
if (empty($shop_supplier_ids)){
|
$query->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;
|
}
|
|
|
}
|