Files
oil/server-tp6/app/store/model/Order.php
T
vipnub fafd3e2c16 1、合作商余额查询
2、分油账户司机可用额度
2026-10-20 23:21:10 +08:00

906 lines
32 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\store\model;
use app\common\enum\order\PayType as OrderPayTypeEnum;
use app\common\service\goods\source\Factory as StockFactory;
use app\store\controller\Controller;
use app\store\model\store\User;
use think\facade\Db;
use think\facade\Request;
use app\common\model\Goods as GoodsModel;
use app\common\model\Order as OrderModel;
use app\common\service\Order as OrderService;
use app\common\service\QytOil;
use app\common\service\Message as MessageService;
use app\common\service\order\Refund as RefundService;
use app\common\enum\order\OrderStatus as OrderStatusEnum;
use app\common\enum\order\PayStatus as PayStatusEnum;
use app\common\enum\order\DeliveryType as DeliveryTypeEnum;
use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum;
use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum;
use app\common\library\helper;
/**
* 订单管理
* Class Order
* @package app\store\model
*/
class Order extends OrderModel
{
// 全部订单
const LIST_TYPE_ALL = 'all';
// 待发货订单
const LIST_TYPE_DELIVERY = 'delivery';
// 待收货订单
const LIST_TYPE_RECEIPT = 'receipt';
// 待付款订单
const LIST_TYPE_PAY = 'pay';
// 已完成订单
const LIST_TYPE_COMPLETE = 'complete';
// 已取消
const LIST_TYPE_CANCEL = 'cancel';
// 油券
const LIST_TYPE_OIL = 'oil';
// 优惠券
const LIST_TYPE_COUPON = 'coupon';
/**
* 订单详情页数据
* @param int $orderId
* @return Order|array|false|null
*/
public function getDetail(int $orderId)
{
return static::detail($orderId, [
'user',
'address',
'goods' => ['image'],
'express',
]) ?: false;
}
/**
* 订单列表
* @param string $dataType 订单类型
* @param array $param
* @param array $user
* @return mixed
*/
public function getList(string $dataType = self::LIST_TYPE_ALL, array $param = [], $user = [])
{
if(!isset($param['merchantId']) && isset($user['is_super']) && $user['is_super'] == 0){
$param['merchantId'] = $user['merchant_id'];
}
// 检索查询条件
$filter = $this->getQueryFilter($param);
// 设置订单类型条件
$dataTypeFilter = $this->getFilterDataType($dataType);
$keyword = $param['goods_no'] ?? '';
// 先查询总金额
$totalPayPrice = $this->alias('order')
->leftJoin('user', 'user.user_id = order.user_id')
->leftJoin('order_address address', 'address.order_id = order.order_id')
->leftJoin('order_goods og', 'og.order_id = order.order_id')
->where($dataTypeFilter)
->where($filter)
->where('order.is_delete', '=', 0)
->when(!empty($keyword), function ($query) use ($keyword) {
$query->whereLike('og.goods_no', "%{$keyword}%");
})
->sum('order.pay_price');
// 再查分页列表
$list = $this->with(['goods.image', 'user.avatar', 'spreadOne', 'spreadTwo'])
->alias('order')
->field('order.*')
->leftJoin('user', 'user.user_id = order.user_id')
->leftJoin('order_address address', 'address.order_id = order.order_id')
->leftJoin('order_goods og', 'og.order_id = order.order_id')
->where($dataTypeFilter)
->where($filter)
->where('order.is_delete', '=', 0)
->when(!empty($keyword), function ($query) use ($keyword) {
$query->whereLike('og.goods_no', "%{$keyword}%");
})
->order(['order.create_time' => 'desc'])
->paginate(10);
// 给每个油券商品行挂上对应的企油通发放单(后台订单页的企油通列与操作按钮用)
$this->setQytData($list);
// 获取数据列表
return [
'list' => $list,
'total_money' => $totalPayPrice,
];
}
/**
* 给订单商品行挂上企油通发放单数据(字段名 qyt)
*
* 小程序订单在支付成功后由 MallOil::create 为每个油券商品行建了一条
* yoshop_partners_order(source='mall',mall_order_goods_id 指回商品行),
* 企油通的发放/加油/退款/发票全挂在那张表上。后台订单页要展示这些信息、
* 并复用 /partners.order/* 的操作接口,所以这里按商品行把发放单带出来。
*
* @param \think\Paginator|\think\Collection $list
*/
public function setQytData($list): void
{
$goodsIds = [];
foreach ($list as $order) {
foreach ($order['goods'] as $goods) {
$goodsIds[] = (int)$goods['order_goods_id'];
}
}
if (!$goodsIds) {
return;
}
$rows = Db::name('partners_order')
->where('source', '=', 'mall')
->whereIn('mall_order_goods_id', $goodsIds)
->select()->toArray();
$map = [];
foreach ($rows as $row) {
// 身份证号脱敏(后台展示层)
$row['id_card_mask'] = QytOil::maskIdCard((string)$row['id_card']);
unset($row['id_card']);
// 前端用的是严格相等(item.oil_status_zsy !== 2),这里显式转型,
// 不依赖 PDO 是否把 int 列取成字符串
foreach (['order_id', 'oil_status', 'oil_status_zsy', 'use_status', 'refund_status',
'used_num', 'oil_callback', 'use_callback', 'qyt_enterprise_id',
'mall_order_id', 'mall_order_goods_id', 'user_id'] as $k) {
$row[$k] = (int)$row[$k];
}
// 剩余可退金额 = 发放金额 - 已加油 - 已退款
$row['remain_amount'] = number_format(max(0, (float)$row['total_price']
- (float)$row['used_amount'] - (float)$row['refund_amount']), 2, '.', '');
$map[(int)$row['mall_order_goods_id']] = $row;
}
foreach ($list as $order) {
foreach ($order['goods'] as $goods) {
$goods['qyt'] = $map[(int)$goods['order_goods_id']] ?? null;
}
}
}
/**
* 订单列表(全部)
* @param string $dataType 订单类型
* @param array $query
* @return mixed
*/
public function getListAll(string $dataType = self::LIST_TYPE_ALL, array $query = [])
{
// 检索查询条件
$queryFilter = $this->getQueryFilter($query);
// 设置订单类型条件
$dataTypeFilter = $this->getFilterDataType($dataType);
// 获取数据列表
return $this->with(['goods.image', 'address', 'user.avatar', 'express'])
->alias('order')
->field('order.*')
->join('user', 'user.user_id = order.user_id')
->where($dataTypeFilter)
->where($queryFilter)
->where('order.is_delete', '=', 0)
->order(['order.create_time' => 'desc'])
->select();
}
/**
* 设置检索查询条件
* @param array $param
* @return array
*/
private function getQueryFilter(array $param): array
{
// 默认参数
$params = $this->setQueryDefaultValue($param, [
'searchType' => '', // 关键词类型 (10订单号 20会员昵称 30会员ID 40收货人姓名 50收货人电话)
'searchValue' => '', // 关键词内容
'goods_no' => '', // 商品编码
'oilCardNo' => '', // 油卡编号
'shareNo' => '', // 分油记录编号
'orderSource' => -1, // 订单来源
'payType' => -1, // 支付方式
'spread_uid' => -1, // 一级代理商
'pay_status' => -1, // 支付状态
'oil_status' => -1, // 分油状态
'use_status' => -1, // 使用状态
'oil_status_zsy' => -1, // 企油通发放态 0未提交 1发放中 2成功 3失败
'refund_status' => -1, // 退款状态 0未退款 1退款中 2已退款 3退款失败 4待人工确认
'deliveryType' => -1, // 配送方式
'betweenTime' => [], // 起止时间
'userId' => 0, // 会员ID
'merchantId' => 0, // 代理商
]);
// 检索查询条件
$filter = [];
// 关键词
if (!empty($params['searchValue'])) {
$searchWhere = [
10 => ['order.order_no', 'like', "%{$params['searchValue']}%"],
20 => ['user.nick_name', 'like', "%{$params['searchValue']}%"],
30 => ['order.user_id', '=', (int)$params['searchValue']],
40 => ['address.name', 'like', "%{$params['searchValue']}%"],
50 => ['address.phone', 'like', "%{$params['searchValue']}%"],
];
array_key_exists($params['searchType'], $searchWhere) && $filter[] = $searchWhere[$params['searchType']];
}
// 起止时间
if (!empty($params['betweenTime'])) {
$times = between_time($params['betweenTime']);
$filter[] = ['order.create_time', '>=', strtotime(date('Y-m-d',$times['start_time']))];
$filter[] = ['order.create_time', '<', strtotime(date('Y-m-d',$times['end_time'])) + 86400];
}
// 订单来源
$params['orderSource'] > -1 && $filter[] = ['order_source', '=', (int)$params['orderSource']];
// 支付方式
$params['payType'] > -1 && $filter[] = ['pay_type', '=', (int)$params['payType']];
// 一级代理商
$params['spread_uid'] > -1 && $filter[] = ['spread_uid', '=', (int)$params['spread_uid']];
// 支付状态
$params['pay_status'] > -1 && $filter[] = ['pay_status', '=', (int)$params['pay_status']];
// 分油状态
if($params['oil_status'] > -1){
$subQuery = Db::name('order_goods')
->where('oil_status', (int)$params['oil_status'])
->column('order_id'); // 获取所有符合条件的 order_id 数组
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 使用状态
if($params['use_status'] > -1){
$subQuery = Db::name('order_goods')
->where('use_status', (int)$params['use_status'])
->column('order_id'); // 获取所有符合条件的 order_id 数组
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 油卡编号
if($params['oilCardNo']){
$subQuery = Db::name('order_goods')
->where('oilCardNo', 'like', "%{$params['oilCardNo']}%")
->column('order_id'); // 获取所有符合条件的 order_id 数组
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 分油记录编号
if($params['shareNo']){
$subQuery = Db::name('order_goods')
->where('shareNo', 'like', "%{$params['shareNo']}%")
->column('order_id'); // 获取所有符合条件的 order_id 数组
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 企油通发放态(挂在 partners_order 上,按 mall_order_id 反查)
if($params['oil_status_zsy'] > -1){
$subQuery = Db::name('partners_order')
->where('source', '=', 'mall')
->where('oil_status_zsy', '=', (int)$params['oil_status_zsy'])
->column('mall_order_id');
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 退款状态(同上)
if($params['refund_status'] > -1){
$subQuery = Db::name('partners_order')
->where('source', '=', 'mall')
->where('refund_status', '=', (int)$params['refund_status'])
->column('mall_order_id');
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 配送方式
$params['deliveryType'] > -1 && $filter[] = ['delivery_type', '=', (int)$params['deliveryType']];
// 用户id
$params['userId'] > 0 && $filter[] = ['order.user_id', '=', (int)$params['userId']];
// 推广人ID
if($params['merchantId'] > 0) {
$filter[] = function ($query) use ($params) {
$query->where('order.spread_uid', '=', $params['merchantId'])
->whereOr('order.spread_two_uid', '=', $params['merchantId']);
};
}
return $filter;
}
/**
* 设置检索查询条件
* @param $query
*/
private function setWhere($query): array
{
$filter = [];
// $query['start_time'] = isset($query['start_time'])?$query['start_time']:strtotime(date("Y-m-d"));
// $query['end_time'] = isset($query['end_time'])?$query['end_time']:strtotime(date("Y-m-d"));
if (isset($query['start_time'])) {
!empty($query['start_time']) && $filter[] = ['create_time', '>=', $query['start_time']];
}
if (isset($query['end_time'])) {
!empty($query['end_time']) && $filter[] = ['create_time', '<', $query['end_time']+86400];
}
if (isset($query['order_status'])) {
!empty($query['order_status']) && $query['order_status'] != -1 && $filter[] = ['order_status', '=', $query['order_status']];
}
if (isset($query['merchant_id']) && !empty($query['merchant_id']) && $query['merchant_id'] != -1) {
$merchantId = $query['merchant_id'];
$filter[] = function ($query) use ($merchantId) {
$query->where('spread_uid', '=', $merchantId)
->whereOr('spread_two_uid', '=', $merchantId);
};
}
if (isset($query['oilCardType'])) {
!empty($query['oilCardType']) && $query['oilCardType'] != -1 && $filter[] = ['oilCardType', '=', $query['oilCardType']];
}
if (isset($query['saleOrderNo'])) {
!empty($query['saleOrderNo']) && $filter[] = ['saleOrderNo', 'like', '%' . trim($query['saleOrderNo']) . '%'];
}
if (isset($query['goodsNo'])) {
!empty($query['goodsNo']) && $filter[] = ['goodsNo', 'like', '%' . trim($query['goodsNo']) . '%'];
}
if (isset($query['userNo'])) {
!empty($query['userNo']) && $filter[] = ['userNo', 'like', '%' . trim($query['userNo']) . '%'];
}
if (isset($query['mobile'])) {
!empty($query['mobile']) && $filter[] = ['mobile', 'like', '%' . trim($query['mobile']) . '%'];
}
if (isset($query['oilCardNo'])) {
!empty($query['oilCardNo']) && $filter[] = ['oilCardNo', 'like', '%' . trim($query['oilCardNo']) . '%'];
}
if (isset($query['shareNo'])) {
!empty($query['shareNo']) && $filter[] = ['shareNo', 'like', '%' . trim($query['shareNo']) . '%'];
}
return $filter;
}
/**
* 设置订单类型条件
* @param string $dataType
* @return array
*/
private function getFilterDataType(string $dataType = self::LIST_TYPE_ALL): array
{
// 数据类型
$filter = [];
switch ($dataType) {
case self::LIST_TYPE_ALL:
$filter = [];
break;
case self::LIST_TYPE_DELIVERY:
$filter = [
['pay_status', '=', PayStatusEnum::SUCCESS],
['delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED],
['order_status', 'in', [OrderStatusEnum::NORMAL]]
];
break;
case self::LIST_TYPE_RECEIPT:
$filter = [
['pay_status', '=', PayStatusEnum::SUCCESS],
['delivery_status', '=', DeliveryStatusEnum::DELIVERED],
['receipt_status', '=', ReceiptStatusEnum::NOT_RECEIVED]
];
break;
case self::LIST_TYPE_PAY:
$filter[] = ['pay_status', '=', PayStatusEnum::PENDING];
$filter[] = ['order_status', '=', OrderStatusEnum::NORMAL];
break;
case self::LIST_TYPE_COMPLETE:
$filter[] = ['order_status', '=', OrderStatusEnum::COMPLETED];
break;
case self::LIST_TYPE_CANCEL:
$filter[] = ['order_status', '=', OrderStatusEnum::CANCELLED];
break;
case self::LIST_TYPE_OIL:
$filter[] = ['order_type', '=', 'zsy_ticket'];
break;
case self::LIST_TYPE_COUPON:
$filter[] = ['order_type', '=', 'coupon'];
break;
}
return $filter;
}
/**
* 确认发货(单独订单)
* @param $data
* @return bool|false
* @throws \Exception
*/
public function delivery($data): bool
{
// 转义为订单列表
$orderList = [$this];
// 验证订单是否满足发货条件
if (!$this->verifyDelivery($orderList)) {
return false;
}
// 整理更新的数据
$updateList = [[
'order_id' => $this['order_id'],
'express_id' => $data['express_id'],
'express_no' => $data['express_no']
]];
// 更新订单发货状态
$this->updateToDelivery($updateList);
// 获取已发货的订单
$completed = self::detail($this['order_id'], ['user', 'address', 'goods', 'express']);
// 发送消息通知
$this->sendDeliveryMessage([$completed]);
return true;
}
/**
* 确认发货后发送消息通知
* @param $orderList
* @return bool
*/
private function sendDeliveryMessage($orderList): bool
{
// 发送消息通知
foreach ($orderList as $item) {
MessageService::send('order.delivery', ['order' => $item], self::$storeId);
}
return true;
}
/**
* 更新订单发货状态(批量)
* @param $orderList
* @return bool
*/
private function updateToDelivery($orderList): bool
{
// 整理更新的数据
$data = [];
foreach ($orderList as $item) {
$data[] = [
'data' => [
'express_no' => $item['express_no'],
'express_id' => $item['express_id'],
'delivery_status' => 20,
'delivery_time' => time(),
],
'where' => ['order_id' => $item['order_id']]
];
}
// 批量更新
$this->updateAll($data);
return true;
}
/**
* 验证订单是否满足发货条件
* @param $orderList
* @return bool
*/
private function verifyDelivery($orderList): bool
{
foreach ($orderList as $order) {
if (
$order['pay_status'] != PayStatusEnum::SUCCESS
|| $order['delivery_type'] != DeliveryTypeEnum::EXPRESS
|| $order['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED
) {
$this->error = "订单号[{$order['order_no']}] 不满足发货条件!";
return false;
}
}
return true;
}
/**
* 修改订单价格
* @param array $data
* @return bool
*/
public function updatePrice(array $data): bool
{
if ($this['pay_status'] != PayStatusEnum::PENDING) {
$this->error = '该订单不合法';
return false;
}
// 实际付款金额
$payPrice = helper::bcadd($data['order_price'], $data['express_price']);
if ($payPrice <= 0) {
$this->error = '订单实付款价格不能为0.00元';
return false;
}
// 改价的金额差价
$updatePrice = helper::bcsub($data['order_price'], $this['order_price']);
// 更新订单记录
return $this->save([
'order_no' => $this->orderNo(), // 修改订单号, 否则微信支付提示重复
'pay_price' => $payPrice,
'update_price' => $updatePrice,
'express_price' => $data['express_price']
]) !== false;
}
/**
* 撤销分油,回收
* @param array $data
* @return bool
*/
public function cancelShare(array $data): bool
{
// 更新订单记录
return $this->save([
'order_status' => OrderStatusEnum::RECOVER
]) !== false;
}
/**
* 审核:用户取消订单
* @param array $data
* @return bool|mixed
*/
public function confirmCancel(array $data)
{
// 判断订单是否有效
if (
$this['pay_status'] != PayStatusEnum::SUCCESS
) {
$this->error = '该订单不合法';
return false;
}
// 订单取消事件
return $this->transaction(function () use ($data) {
if ($data['status']) {
// 执行退款操作
(new RefundService)->execute($this);
// 订单取消事件
OrderService::cancelEvent($this);
}
// 更新订单状态
return $this->save(['order_status' => $data['status'] ? OrderStatusEnum::CANCELLED : OrderStatusEnum::NORMAL]);
});
}
/**
* 将订单记录设置为已删除
* @return bool
*/
public function setDelete(): bool
{
return $this->save(['is_delete' => 1]) !== false;
}
/**
* 获取已付款订单总数 (可指定某天)
* @param null $startDate
* @param null $endDate
* @param array $user
* @return int
*/
public function getPayOrderTotal($startDate = null, $endDate = null, $user = []): int
{
$filter = [];
$filter[] = ['pay_status', '=', 20];
if (!is_null($startDate) && !is_null($endDate)) {
$filter[] = ['create_time', '>=', strtotime($startDate)];
$filter[] = ['create_time', '<', strtotime($endDate) + 86400];
}
if(!empty($user)) {
if(isset($user['is_super']) && $user['is_super'] == 0){
$filter[] = function ($query) use ($user) {
$query->where('spread_uid', '=', $user['merchant_id'])
->whereOr('spread_two_uid', '=', $user['merchant_id']);
};
}
}
return $this->getOrderTotal($filter);
}
/**
* 获取未发货订单数量
* @return int
*/
public function getNotDeliveredOrderTotal(): int
{
$filter = [
['pay_status', '=', PayStatusEnum::SUCCESS],
['delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED],
['order_status', 'in', [OrderStatusEnum::NORMAL]]
];
return $this->getOrderTotal($filter);
}
/**
* 获取未付款订单数量
* @return int
*/
public function getNotPayOrderTotal(): int
{
$filter = [
['pay_status', '=', PayStatusEnum::PENDING],
['order_status', '=', OrderStatusEnum::NORMAL]
];
return $this->getOrderTotal($filter);
}
/**
* 获取订单总数
* @param array $filter
* @return int
*/
public function getOrderTotal(array $filter = [], $query = []): int
{
// 获取订单总数量
// 检索查询
$search = $this->setWhere($query);
return $this->where(array_merge($filter,$search))
->count();
}
/**
* 获取总金额
* @param array $filter
* @param array $query
* @return float|int
*/
public function getOrderTotalMoney($filter=[], $query = [])
{
// 检索查询
$search = $this->setWhere($query);
return $this->where(array_merge($filter,$search))
->sum('pay_price');
}
/**
* 获取某天的总销售额
* @param null $startDate
* @param null $endDate
* @param array $user
* @return float
*/
public function getOrderTotalPrice($startDate = null, $endDate = null,$user=[]): float
{
// 查询对象
$query = $this->getNewQuery();
$filter = [];
// 设置查询条件
if (!is_null($startDate) && !is_null($endDate)) {
$filter[] = ['create_time', '>=', strtotime($startDate)];
$filter[] = ['create_time', '<', strtotime($endDate) + 86400];
}
if(!empty($user)) {
if(isset($user['is_super']) && $user['is_super'] == 0){
$filter[] = function ($query) use ($user) {
$query->where('spread_uid', '=', $user['merchant_id'])
->whereOr('spread_two_uid', '=', $user['merchant_id']);
};
}
}
// 总销售额
return $query->where('pay_status', '=', 20)
->where($filter)
->sum('pay_price');
}
/**
* 获取某天的下单用户数
* @param string $day
* @return float|int
*/
public function getPayOrderUserTotal(string $day)
{
$startTime = strtotime($day);
return $this->field('user_id')
->where('pay_time', '>=', $startTime)
->where('pay_time', '<', $startTime + 86400)
->where('pay_status', '=', PayStatusEnum::SUCCESS)
->where('is_delete', '=', '0')
->group('user_id')
->count();
}
/**
* 修改订单状态
* @param $data
* @return bool
*/
public function updateStatus($data)
{
if ($this['order_status'] == $data['status']) {
$this->error = '状态未做改变';
return false;
}
$field = [
'order_status' => $data['status'],
'buyer_remark' => $data['buyer_remark']
];
if($data['status'] == 20){
$field['pay_status'] = 20;
$field['pay_time'] = time();
}
return $this->save($field) !== false;
}
/**
* 订单超时修改
* @param $where
* @return bool
* @throws \app\common\exception\BaseException
* @throws \think\exception\DbException
*/
public function overtimeUpdate($where)
{
if (empty($where) || !is_array($where)) {
$this->error = '条件不合法';
return false;
}
return $this->where($where)->update(['order_status' => 30]) !== false;
}
/**
* 创建新订单
* @param array $order 订单信息
* @return bool
*/
public function addOil(array $order): bool
{
// 创建新的订单
$status = $this->transaction(function () use ($order) {
// 创建订单事件
return $this->createOrderEvent($order);
});
return $status;
}
/**
* 创建订单事件
* @param $order
* @return bool
* @throws BaseException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
private function createOrderEvent($order): bool
{
// 新增订单记录
$status = $this->add($order);
// 保存订单商品信息
$this->saveOrderGoods($order);
return true;
}
/**
* 更新商品库存 (针对下单减库存的商品)
* @param $orderSource
* @param $goodsList
* @return void
*/
private function updateGoodsStockNum($orderSource, $goodsList): void
{
StockFactory::getFactory($orderSource)->updateGoodsStock($goodsList);
}
/**
* 新增订单记录
* @param $order
* @return bool|false
*/
private function add($order): bool
{
// 订单数据
$data = [
'user_id' => $order['user_id'],
'order_no' => $order['saleOrderNo'],
'total_price' => $order['amount'],
'order_price' => $order['amount'],
'coupon_id' => '',
'coupon_money' => '',
'points_money' => 0.00,
'points_num' => 0,
'pay_price' => $order['amount'],
'delivery_type' => 10,
'pay_type' => $order['payType'],
'buyer_remark' => $order['buyer_remark'],
'order_source' => 10,
'order_source_id' => '',
'points_bonus' => '',
'order_status' => OrderStatusEnum::NORMAL,
'platform' => '后台',
'store_id' => $order['store_id'],
'pay_status' => PayStatusEnum::SUCCESS,
'pay_time' => time()
];
// 保存订单记录
return $this->save($data);
}
/**
* 保存订单商品信息
* @param $order
* @return void
*/
private function saveOrderGoods($order): void
{
// 查找一个未被调用的用户
$goods = Db::name('goods')
->alias('goods')
->field('goods.*,yoshop_goods_image.image_id')
->where('goods.goods_id', '=', $order['goods_id'])
->join('yoshop_goods_image', 'goods.goods_id = yoshop_goods_image.goods_id')
->limit(1)
->find();
// 订单商品列表
$list[] = [
'province' => $order['province'],
'user_id' => $order['user_id'],
'account_id' => $order['account_id'],
'userNo' => $order['userNo'],
'mobile' => $order['mobile'],
'store_id' => $order['store_id'],
'goods_id' => $goods['goods_id'],
'goods_name' => $goods['goods_name'],
'oilCardType' => $order['oilCardType'],
'company_id' => $order['company_id'],
'oilCardNo' => $order['oilCardNo'],
'shareNo' => $order['shareNo'],
'goods_no' => $order['goodsNo'],
'image_id' => $goods['image_id'],
'deduct_stock_type' => 10,
'spec_type' => 10,
'goods_sku_id' => '',
'goods_props' => '',
'content' => '',
'goods_sku_no' => '',
'goods_price' => $order['amount'],
'line_price' => 0,
'goods_weight' => 0,
'is_user_grade' => 0,
'grade_ratio' => 0,
'grade_goods_price' => 0,
'grade_total_money' => 0,
'coupon_money' => 0,
'points_money' => 0.00,
'points_num' => 0,
'points_bonus' => 0,
'total_num' => 1,
'total_price' => $order['amount'],
'total_pay_price' => $order['amount']
];
$this->goods()->saveAll($list) !== false;
// 更新商品库存 (针对下单减库存的商品)
$this->updateGoodsStockNum(10, $list);
}
/**
* 修改订单状态
* @param $where
* @param $field
* @return false|int
*/
public static function orderUpdate($where, $field)
{
return (new static())->where($where)->update($field) !== false;
}
/**
* 获取一条记录
* @param array $filter
* @return array|null
*/
public static function getSingle(array $filter): ?array
{
$model = new static;
$data = $model->where($filter)->order(['order_id' => 'asc'])->find();
return $data ? $data->toArray() : null;
}
}