Files
ZangShiQi/app/model/order/OrderCommon.php
2026-04-04 17:27:12 +08:00

1646 lines
63 KiB
PHP
Executable File
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
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace app\model\order;
use app\dict\order\OrderDict;
use app\dict\order\OrderPayDict;
use app\dict\order_refund\OrderRefundDict;
use app\model\BaseModel;
use app\model\order\event\OrderClose;
use app\model\order\event\OrderComplete;
use app\model\order\OrderRefund as OrderRefundModel;
use app\model\system\Cron;
use app\model\system\Pay;
use app\model\verify\Verify;
use Exception;
use think\db\exception\DbException;
use think\facade\Cache;
use think\facade\Log;
use think\facade\Queue;
/**
* 常规订单操作
*
* @author Administrator
*
*/
class OrderCommon extends BaseModel
{
/*****************************************************************************************订单基础状态(其他使用)********************************/
// 订单待付款
public const ORDER_CREATE = 0;
// 订单已支付
public const ORDER_PAY = 1;
// 订单已发货(配货)
public const ORDER_DELIVERY = 3;
// 订单已收货
public const ORDER_TAKE_DELIVERY = 4;
// 订单已结算完成
public const ORDER_COMPLETE = 10;
// 订单已关闭
public const ORDER_CLOSE = -1;
/*********************************************************************************订单支付状态****************************************************/
// 待支付
public const PAY_WAIT = 0;
// 支付中
public const PAY_DOING = 1;
// 已支付
public const PAY_FINISH = 2;
/**************************************************************************支付方式************************************************************/
public const OFFLINEPAY = 10;
// 订单待使用
public const ORDER_WAIT_VERIFY = 11;
//订单已使用
public const ORDER_VERIFYED = 12;
/**
* 线上收款方式
* @var array
*/
public static $online_pay_type = [ 'wechatpay', 'alipay' ];
/**
* 基础订单状态(不同类型的订单可以不使用这些状态,但是不能冲突)
* @var array
*/
public $order_status = [
self::ORDER_CREATE => [
'status' => self::ORDER_CREATE,
'name' => '待支付',
'is_allow_refund' => 0,
'icon' => 'public/uniapp/order/order-icon.png',
'action' => [
[
'action' => 'orderClose',
'title' => '关闭订单',
'color' => ''
],
[
'action' => 'orderAddressUpdate',
'title' => '修改地址',
'color' => ''
],
[
'action' => 'orderAdjustMoney',
'title' => '调整价格',
'color' => ''
],
[
'action' => 'offlinePay',
'title' => '调整价格',
'color' => ''
],
],
'member_action' => [
[
'action' => 'orderClose',
'title' => '关闭订单',
'color' => ''
],
[
'action' => 'orderPay',
'title' => '支付',
'color' => ''
],
],
'color' => ''
],
self::ORDER_PAY => [
'status' => self::ORDER_PAY,
'name' => '待发货',
'is_allow_refund' => 0,
'icon' => 'public/uniapp/order/order-icon-send.png',
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_DELIVERY => [
'status' => self::ORDER_DELIVERY,
'name' => '已发货',
'is_allow_refund' => 1,
'icon' => 'public/uniapp/order/order-icon-receive.png',
'action' => [
[
'action' => 'takeDelivery',
'title' => '确认收货',
'color' => ''
],
],
'member_action' => [
],
'color' => ''
],
self::ORDER_TAKE_DELIVERY => [
'status' => self::ORDER_TAKE_DELIVERY,
'name' => '已收货',
'is_allow_refund' => 1,
'icon' => 'public/uniapp/order/order-icon-received.png',
'action' => [
],
'member_action' => [
],
'color' => ''
],
// 新增虚拟 订单状态
self::ORDER_WAIT_VERIFY => [
'status' => self::ORDER_WAIT_VERIFY,
'name' => '待使用',
'is_allow_refund' => 1,
'icon' => 'public/uniapp/order/order-icon-close.png',
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_VERIFYED => [
'status' => self::ORDER_VERIFYED,
'name' => '已使用',
'is_allow_refund' => 1,
'icon' => 'public/uniapp/order/order-icon-close.png',
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_COMPLETE => [
'status' => self::ORDER_COMPLETE,
'name' => '已完成',
'is_allow_refund' => 1,
'icon' => 'public/uniapp/order/order-icon-received.png',
'action' => [
],
'member_action' => [
],
'color' => ''
],
self::ORDER_CLOSE => [
'status' => self::ORDER_CLOSE,
'name' => '已关闭',
'is_allow_refund' => 0,
'icon' => 'public/uniapp/order/order-icon-close.png',
'action' => [
],
'member_action' => [
],
'color' => ''
],
];
/**
* 基础支付方式(不考虑实际在线支付方式或者货到付款方式)
* @var array
*/
public $pay_type = [
'ONLINE_PAY' => '在线支付',
'BALANCE' => '余额支付',
/*'offlinepay' => '线下支付',*/
'POINT' => '积分兑换'
];
/**
* 订单类型
* @var array
*/
public $order_type = [
1 => '物流订单',
2 => '自提订单',
3 => '外卖订单',
4 => '虚拟订单',
5 => '收银订单'
];
/**
* 获取支付方式
* @param array $params
* @return array
*/
public function getPayType($params = [])
{
$order_type = $params[ 'order_type' ] ?? '';
//获取订单基础的其他支付方式
if (!empty($order_type)) {
$order_model = $this->getOrderModel([ 'order_type' => $order_type ]);
$pay_type = $order_model->pay_type;
} else {
$pay_type = $this->pay_type;
}
//获取当前所有在线支付方式
$onlinepay = event('PayType', []);
if (!empty($onlinepay)) {
foreach ($onlinepay as $v) {
$pay_type[ $v[ 'pay_type' ] ] = $v[ 'pay_type_name' ];
}
}
return $pay_type;
}
/**
* 获取订单model对象
* @param $order_info
* @return LocalOrder|Order|StoreOrder|VirtualOrder|mixed|void
*/
public function getOrderModel($order_info)
{
$order_model = event('GetOrderModel', $order_info, true);
if (empty($order_model)) {
//调用各种订单
switch ( $order_info[ 'order_type' ] ) {
case OrderDict::express:
// 普通物流订单
$order_model = new Order();
break;
case OrderDict::store:
// 门店自提订单
$order_model = new StoreOrder();
break;
case OrderDict::local:
// 本地配送订单
$order_model = new LocalOrder();
break;
case OrderDict::virtual:
// 虚拟订单
$order_model = new VirtualOrder();
break;
}
}
return $order_model;
}
/**
* 订单来源
* @param array $params
* @return array|mixed
*/
public function getOrderFromList($params = [])
{
$order_from_list = config('app_type');
$from_event_list = event('OrderFromList', $params);//没有的话就别返回值了(未来插件订单场景扩展)
foreach ($from_event_list as $v) {
$order_from_list = array_merge($order_from_list, $v);
}
return $order_from_list;
}
/**
* 订单类型(根据物流配送来区分)
* @return array
*/
public function getOrderTypeStatusList()
{
$list = [];
$all_order_list = array_column($this->order_status, 'name', 'status');
$all_order_list[ 'refunding' ] = '退款中';
$list[ 'all' ] = [
'name' => '全部',
'type' => 'all',
'status' => $all_order_list
];
if (!addon_is_exit('cashier')) {
unset($this->order_type[ OrderDict::cashier ]);
}
foreach ($this->order_type as $k => $v) {
$order_model = $this->getOrderModel([ 'order_type' => $k ]);
$temp_order_list = array_column($order_model->order_status, 'name', 'status');
$temp_order_list[ 'refunding' ] = '退款中';
$item = [
'name' => $v,
'type' => $k,
'status' => $temp_order_list
];
$list[ $k ] = $item;
}
return $list;
}
/**********************************************************************************订单操作基础方法(订单关闭,订单完成,订单调价)开始********/
/**
* 订单删除
* @param $condition
* @return array
*/
public function deleteOrder($condition)
{
$res = model('order')->update([ 'is_delete' => 1 ], $condition);
if ($res === false) {
return $this->error(null, '删除失败');
} else {
return $this->success($res);
}
}
/**
* 订单完成
* @param $order_id
* @return array
* @throws DbException
*/
public function orderComplete($order_id)
{
$cache_name = 'order_complete_execute_' . $order_id;
if(Cache::get($cache_name)) return $this->success();
Cache::set($cache_name, 1);
try{
$order_complete_status = self::ORDER_COMPLETE;
$order_condition = [ [ 'order_id', '=', $order_id ] ];
$order_info = model('order')->getInfo($order_condition, '*');
if (empty($order_info)) {
Cache::delete($cache_name);
return $this->success(['message' => '订单数据缺失']);
}
if (!in_array($order_info['order_status'], [self::ORDER_TAKE_DELIVERY, self::ORDER_VERIFYED])) {
Cache::delete($cache_name);
return $this->success(['message' => '订单不是已收货状态或已核销状态']);
}
//校验
$check_result = ( new OrderComplete() )->check([
'order_info' => $order_info,
]);
if ($check_result[ 'code' ] < 0){
Cache::delete($cache_name);
return $check_result;
}
$site_id = $order_info[ 'site_id' ];
$order_info[ 'goods_num' ] = numberFormat($order_info[ 'goods_num' ]);
$order_action_array = $this->getOrderCommonAction($order_info, $order_complete_status);
$order_data = [
'order_status' => $order_action_array[ 'order_status' ],
'order_status_name' => $order_action_array[ 'order_status_name' ],
'order_status_action' => $order_action_array[ 'order_status_action' ],
'finish_time' => time()
];
$order_config = Config::getOrderConfig($site_id);
$after_sales_time = $order_config[ 'after_sales_time' ] ?? 0;
if ($after_sales_time > 0) {
OrderCron::afterSaleClose(['order_id' => $order_id, 'after_sales_time' => $after_sales_time]);
} else {
$order_data[ 'is_enable_refund' ] = 0;
}
$res = model('order')->update($order_data, $order_condition);
/******************************************************* 订单退款操作相关 **********************************************************/
//订单项移除可退款操作
$order_refund_model = new OrderRefund();
$order_refund_model->removeOrderGoodsRefundAction($order_condition);
//关键业务
( new OrderComplete() )->event([
'order_info' => $order_info,
]);
//后续业务
( new OrderComplete() )->after([
'order_info' => $order_info,
]);
Cache::delete($cache_name);
return $this->success($res);
}catch(\Exception $e){
Cache::delete($cache_name);
return $this->error(['file' => $e->getFile(), 'line' => $e->getLine(), 'message' => $e->getMessage()], '订单完成捕获错误');
}
}
/**********************************************************************************订单支付相关业务开始********/
/**
* 鉴于耦合度太高,封装一些公共操作
* @param $temp
* @param $action
* @return array
*/
public function getOrderCommonAction($temp, $action)
{
if (is_object($temp)) {
$order_model = $temp;
} else {
$order_model = $this->getOrderModel($temp);
}
return [
'order_status' => $action,
'order_status_name' => $order_model->order_status[ $action ][ 'name' ] ?? '',
'order_status_action' => json_encode($order_model->order_status[ $action ], JSON_UNESCAPED_UNICODE),
];
}
/**
* 主动关闭订单检测
* @param $order_id
* @return array
*/
public function activeOrderCloseCheck($order_id)
{
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], 'order_status');
if(empty($order_info)){
return $this->error(null, '订单不存在');
}
if($order_info['order_status'] != self::ORDER_CREATE){
return $this->error(null, '订单不是待支付状态,不可关闭');
}
return $this->success();
}
/**
* 订单关闭
* @param $order_id
* @param array $log_data
* @param string $close_cause
* @return array
*/
public function orderClose($order_id, $log_data = [], $close_cause = '')
{
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], '*');
if ($order_info[ 'order_status' ] == self::ORDER_CLOSE) {
return $this->success();
}
$order_info[ 'goods_num' ] = numberFormat($order_info[ 'goods_num' ]);
$local_result = $this->verifyOrderLock($order_info);
if ($local_result[ 'code' ] < 0) {
return $local_result;
}
//校验支付
$check_result = ( new OrderClose() )->check([ 'order_info' => $order_info ]);
if ($check_result[ 'code' ] < 0) return $check_result;
$order_data = [
'order_status' => self::ORDER_CLOSE,
'order_status_name' => $this->order_status[ self::ORDER_CLOSE ][ 'name' ],
'order_status_action' => json_encode($this->order_status[ self::ORDER_CLOSE ], JSON_UNESCAPED_UNICODE),
'close_time' => time(),
'is_enable_refund' => 0,
'is_evaluate' => 0,
'close_cause' => $close_cause
];
model('order')->startTrans();
try {
model('order')->update($order_data, [ [ 'order_id', '=', $order_id ] ]);
/******************************************************* 移除可退款相关 **********************************************************/
//订单项移除可退款操作
$order_refund_model = new OrderRefund();
$order_refund_model->removeOrderGoodsRefundAction([ [ 'order_id', '=', $order_id ] ]);
//订单关闭操作
( new OrderClose() )->event([
'order_info' => $order_info,
]);
model('order')->commit();
//订单关闭后操作
( new OrderClose() )->after([
'order_info' => $order_info,
'log_data' => $log_data,
'close_cause' => $close_cause
]);
return $this->success();
} catch (Exception $e) {
model('order')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 验证订单锁定状态
* @param $param
* @return array
*/
public function verifyOrderLock($param)
{
if (!is_array($param)) {
$order_info = model('order')->getInfo([ [ 'order_id', '=', $param ] ], 'is_lock');
} else {
$order_info = $param;
}
if ($order_info[ 'is_lock' ] == 1) {//判断订单锁定状态
return $this->error('', 'ORDER_LOCK');
} else {
return $this->success();
}
}
/************************************************************************ 订单调价 start **************************************************************************/
/**
* 订单线上支付(废弃合并支付)
* @param $data
* @return array
*/
public function orderOnlinePay($data)
{
$out_trade_no = $data[ 'out_trade_no' ];
$pay_model = new Pay();
$pay_info = $pay_model->getPayInfo($out_trade_no)['data'];
if(empty($pay_info)){
return $this->error(['PAY_RELATE_ERROR' => 1], '支付信息有误');
}
//初始化订单信息
$data[ 'order_info' ] = model('order')->getInfo([ [ 'out_trade_no', '=', $out_trade_no ] ], '*');
if ($data[ 'order_info' ][ 'order_status' ] == self::ORDER_CLOSE) {
return $this->error('订单已关闭!');
}
if ($data[ 'order_info' ][ 'pay_status' ] == 1) {
return $this->success('订单已支付!');
}
$data[ 'order_info' ][ 'goods_num' ] = numberFormat($data[ 'order_info' ][ 'goods_num' ]);
//初始化支付信息
$data[ 'pay_info' ] = $pay_info;
//初始化会员信息
$data[ 'member_info' ] = model('member')->getInfo([ [ 'member_id', '=', $data[ 'order_info' ][ 'member_id' ] ] ], '*');
$data[ 'order_id' ] = $data[ 'order_info' ][ 'order_id' ];
$order_model = $this->getOrderModel($data[ 'order_info' ]);
model('order')->startTrans();
try {
/** 各种类型订单支付 **/
$order_model->orderPay($data);
//订单支付关键业务
( new \app\model\order\event\OrderPay() )->event($data);
model('order')->commit();
} catch (Exception $e) {
//todo 不应该失败
model('order')->rollback();
Log::write('OrderPaySuccess_' . $e->getMessage() . $e->getFile() . $e->getLine());
return $this->error('', $e->getMessage());
}
//订单支付后操作
Queue::push('app\job\order\OrderPayAfter', $data);
return $this->success();
}
/**
* 拆分订单
* @param $order_id
* @param string $out_trade_no
* @return array
* @throws DbException
*/
public function splitOrderPay($order_id, $out_trade_no = '')
{
$order_condition = [
[ 'pay_status', '=', 0 ],
[ 'order_status', '=', 0 ]
];
if (empty($order_id)) {
$order_condition[] = [ 'out_trade_no', '=', $out_trade_no ];
} else {
$order_condition[] = [ 'order_id', '=', $order_id ];
}
$order_info = model('order')->getInfo($order_condition, 'pay_money,order_name,out_trade_no,order_id,pay_status,site_id,member_id,member_card_order');
if (empty($order_info))
return $this->error([], '选中订单中包含已支付或已关闭数据!');
$out_trade_no = $order_info[ 'out_trade_no' ];
$pay_model = new Pay();
$pay_info = $pay_model->getPayInfo($out_trade_no)[ 'data' ];
if (!empty($pay_info) && $pay_info['pay_status'] != Pay::PAY_STATUS_CLOSE) {
if ($pay_info[ 'balance' ] == 0 && $pay_info[ 'balance_money' ] == 0) {
return $this->success($out_trade_no);
}
}
$result = $pay_model->closePay($out_trade_no);//关闭旧支付单据
if ($result[ 'code' ] < 0) {
return $result;
}
//生成新的支付流水号
$out_trade_no = $pay_model->createOutTradeNo($order_info[ 'member_id' ] ?? 0);
if (!empty($order_info[ 'member_card_order' ])) model('member_level_order')->update([ 'out_trade_no' => $out_trade_no ], [ [ 'order_id', '=', $order_info[ 'member_card_order' ] ], [ 'pay_status', '=', 0 ] ]);
model('order')->update([ 'out_trade_no' => $out_trade_no ], [ [ 'order_id', '=', $order_info[ 'order_id' ] ], [ 'pay_status', '=', 0 ] ]);
$result = $pay_model->addPay($order_info[ 'site_id' ], $out_trade_no, '', $order_info[ 'order_name' ], $order_info[ 'order_name' ], $order_info[ 'pay_money' ], '', 'OrderPayNotify', '', $order_info['order_id'], $order_info['member_id']);
return $this->success($out_trade_no);
}
/**
* 订单金额调整 按整单调整
* @param $order_id
* @param $adjust_money
* @param $delivery_money
* @return array
*/
public function orderAdjustMoney($order_id, $adjust_money, $delivery_money)
{
model('order')->startTrans();
try {
//查询订单
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], 'site_id, out_trade_no,delivery_money, adjust_money, pay_money, order_money, promotion_money, coupon_money, goods_money, invoice_money, invoice_delivery_money, promotion_money, coupon_money, invoice_rate, invoice_delivery_money, balance_money, point_money, member_card_money');
if (empty($order_info))
return $this->error('', '找不到订单!');
if ($delivery_money < 0)
return $this->error('', '配送费用不能小于0');
$real_goods_money = $order_info[ 'goods_money' ] - $order_info[ 'promotion_money' ] - $order_info[ 'coupon_money' ] - $order_info[ 'point_money' ];//计算出订单真实商品金额
$new_goods_money = $real_goods_money + $adjust_money;
if ($new_goods_money < 0)
return $this->error('', '真实商品金额不能小于0');
$invoice_money = round(floor($new_goods_money * $order_info[ 'invoice_rate' ]) / 100, 2);
$new_order_money = $invoice_money + $new_goods_money + $delivery_money + $order_info[ 'invoice_delivery_money' ] + $order_info[ 'member_card_money' ];
if ($new_order_money < 0)
return $this->error('', '订单金额不能小于0');
$pay_money = $new_order_money - $order_info[ 'balance_money' ];
if ($pay_money < 0)
return $this->error('', '实际支付不能小于0');
$data_order = [
'delivery_money' => $delivery_money,
'pay_money' => $pay_money,
'adjust_money' => $adjust_money,
'order_money' => $new_order_money,
'invoice_money' => $invoice_money
];
model('order')->update($data_order, [ [ 'order_id', '=', $order_id ] ]);
$order_goods_list = model('order_goods')->getList([ [ 'order_id', '=', $order_id ] ], 'order_goods_id,goods_money,adjust_money,coupon_money,promotion_money,point_money');
//将调价摊派到所有订单项
$real_goods_money = $order_info[ 'goods_money' ] - $order_info[ 'promotion_money' ] - $order_info[ 'coupon_money' ] - $order_info[ 'point_money' ];
$this->distributionGoodsAdjustMoney($order_goods_list, $real_goods_money, $adjust_money);
//关闭原支付 生成新支付
$pay_model = new Pay();
$pay_result = $pay_model->closePay($order_info[ 'out_trade_no' ]);//关闭旧支付单据
if ($pay_result[ 'code' ] < 0) {
model('order')->rollback();
return $pay_result;
}
//重新生成支付单
$res = $this->splitOrderPay($order_id);
if($res['code'] < 0){
model('order')->rollback();
return $res;
}
$order_info['out_trade_no'] = $res['data'];
// 调价之后支付金额为0
if ($pay_money == 0) {
$pay_model = new Pay();
$res = $pay_model->onlinePay($order_info[ 'out_trade_no' ], OrderPayDict::offline_pay, '', '', []);
if($res['code'] < 0){
model('order')->rollback();
return $res;
}
}
model('order')->commit();
return $this->success();
} catch (Exception $e) {
model('order')->rollback();
return $this->error([$e->getFile(),$e->getLine(),$e->getMessage()], $e->getMessage());
}
}
/************************************************************************ 订单调价 end **************************************************************************/
/**
* 按比例摊派订单调价
* @param $goods_list
* @param $goods_money
* @param $adjust_money
* @return array
*/
public function distributionGoodsAdjustMoney($goods_list, $goods_money, $adjust_money)
{
$temp_adjust_money = $adjust_money;
$last_key = count($goods_list) - 1;
foreach ($goods_list as $k => $v) {
$item_goods_money = $v[ 'goods_money' ] - $v[ 'promotion_money' ] - $v[ 'coupon_money' ] - $v[ 'point_money' ];
if ($last_key != $k) {
$item_adjust_money = round($item_goods_money / $goods_money * $adjust_money, 2);
} else {
$item_adjust_money = $temp_adjust_money;
}
$temp_adjust_money -= $item_adjust_money;
$real_goods_money = $item_goods_money + $item_adjust_money;
$real_goods_money = max($real_goods_money, 0);
$order_goods_data = [
'adjust_money' => $item_adjust_money,
'real_goods_money' => $real_goods_money,
];
model('order_goods')->update($order_goods_data, [ [ 'order_goods_id', '=', $v[ 'order_goods_id' ] ] ]);
}
return $this->success();
}
/**
* 订单线下支付
* @param $order_id
* @param array $log_data
* @return array|mixed|multitype|void
*/
public function orderOfflinePay($order_id, $log_data = [])
{
//支付业务
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ], [ 'order_status', '=', 0 ] ], 'out_trade_no');
if(empty($order_info)){
return $this->error(null, '订单信息有误');
}
$pay_model = new Pay();
return $pay_model->onlinePay($order_info[ 'out_trade_no' ], OrderPayDict::offline_pay, '', '', $log_data);
}
/**
* 订单删除
* @param $order_id
* @param array $user_info
* @return array
*/
public function orderDelete($order_id, $user_info = [])
{
model('order')->startTrans();
try {
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], 'order_status,site_id,order_status_name');
if ($order_info[ 'order_status' ] != self::ORDER_CLOSE) {
return $this->error([], '只有已经关闭的订单才能删除!');
}
$order_data = [
'is_delete' => 1
];
//记录订单日志 start
if ($user_info) {
$log_data = [
'order_id' => $order_id,
'uid' => $user_info[ 'uid' ],
'nick_name' => $user_info[ 'username' ],
'action' => '商家删除了订单',
'action_way' => 2,
'order_status' => $order_info[ 'order_status' ],
'order_status_name' => $order_info[ 'order_status_name' ]
];
OrderLog::addOrderLog($log_data, $this);
}
//记录订单日志 end
$res = model('order')->update($order_data, [ [ 'order_id', '=', $order_id ] ]);
model('order')->commit();
return $this->success();
} catch (Exception $e) {
model('order')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 订单编辑
* @param $data
* @param $condition
* @param array $log_data
* @return array
*/
public function orderUpdate($data, $condition, $log_data = [])
{
$order_model = model('order');
$res = $order_model->update($data, $condition);
if ($res === false) {
return $this->error();
} else {
//记录订单日志 start
if ($log_data) {
$order_info = model('order')->getInfo([ 'order_id' => $log_data[ 'order_id' ] ], 'order_status,order_status_name');
$log_data = array_merge($log_data, [
'order_status' => $order_info[ 'order_status' ],
'order_status_name' => $order_info[ 'order_status_name' ]
]);
OrderLog::addOrderLog($log_data, $this);
}
//记录订单日志 end
return $this->success($res);
}
}
/**
* 订单发货
* @param $order_id
* @param array $log_data
* @return array|int
*/
public function orderCommonDelivery($order_id, $log_data = [])
{
$order_common_model = new OrderCommon();
$local_result = $order_common_model->verifyOrderLock($order_id);
if ($local_result[ 'code' ] < 0)
return $local_result;
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], 'order_type,site_id');
$order_model = $this->getOrderModel($order_info);
return $order_model->orderDelivery($order_id, $log_data);
}
/**
* 订单收货
* @param $order_id
* @param array $log_data
* @return array
*/
public function orderCommonTakeDelivery($order_id, $log_data = [])
{
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ], '*');
if (empty($order_info))
return $this->error([], 'ORDER_EMPTY');
$order_info[ 'goods_num' ] = numberFormat($order_info[ 'goods_num' ]);
$local_result = $this->verifyOrderLock($order_id);
if ($local_result[ 'code' ] < 0)
return $local_result;
$order_status = $order_info[ 'order_status' ];
$virtual_order_model = new VirtualOrder();
if (!in_array($order_status, [self::ORDER_DELIVERY, self::ORDER_WAIT_VERIFY, StoreOrder::ORDER_PENDING_DELIVERY])) {
return $this->error(null, '不是已发货或待核销状态');
}
$order_model = $this->getOrderModel($order_info);
model('order')->startTrans();
try {
$order_model->orderTakeDelivery($order_id);
//改变订单状态
//todo 如果是虚拟商品并且有虚拟码的话, 订单状态应该为已使用
if ($order_status == $virtual_order_model::ORDER_WAIT_VERIFY) {
$order_action_array = $this->getOrderCommonAction($order_model, $virtual_order_model::ORDER_VERIFYED);
} else {
$order_action_array = $this->getOrderCommonAction($order_model, $order_model::ORDER_TAKE_DELIVERY);
}
$order_data = [
'order_status' => $order_action_array[ 'order_status' ],
'order_status_name' => $order_action_array[ 'order_status_name' ],
'order_status_action' => $order_action_array[ 'order_status_action' ],
'is_evaluate' => 1,
'evaluate_status' => OrderDict::evaluate_wait,
'evaluate_status_name' => OrderDict::getEvaluateStatus(OrderDict::evaluate_wait),
'sign_time' => time()
];
model('order')->update($order_data, [ [ 'order_id', '=', $order_id ] ]);
model('order')->commit();
//自动完成事件
OrderCron::complete(['order_id' => $order_id, 'site_id' => $order_info['site_id']]);
// 小程序确认收货提醒、视频号接口返回信息
Queue::push('app\job\order\OrderTakeDeliveryAfter', [ 'order_id' => $order_id, 'site_id' => $order_info[ 'site_id' ] ]);
//记录订单日志 start
if ($log_data) {
if(isset($log_data['action'])){
$action = $log_data['action'];
}else{
$action = '商家对订单进行了确认收货';
if ($log_data[ 'action_way' ] == 1) {
$member_info = model('member')->getInfo([ 'member_id' => $log_data[ 'uid' ] ], 'nickname');
$buyer_name = empty($member_info[ 'nickname' ]) ? '' : '【' . $member_info[ 'nickname' ] . '】';
$log_data[ 'nick_name' ] = $buyer_name;
$action = '买家确认收到货物';
}
}
$log_data = array_merge($log_data, [
'order_id' => $order_id,
'action' => $action,
'order_status' => $order_action_array[ 'order_status' ],
'order_status_name' => $order_action_array[ 'order_status_name' ],
]);
OrderLog::addOrderLog($log_data, $this);
}
//记录订单日志 end
//删除定时任务
$cron = new Cron();
$cron->deleteCron([ [ 'event', '=', 'CronOrderTakeDelivery' ], [ 'relate_id', '=', $order_id ] ]);
return $this->success();
} catch (Exception $e) {
model('order')->rollback();
return $this->error('', $e->getMessage());
}
}
/*************************************************订单操作基础方法(订单关闭,订单完成,订单调价)结束*****************************************/
/******************************************************** 订单数据查询(开始)*********************************************************/
/**
* 订单解除锁定
* @param $order_id
* @return int
*/
public function orderUnlock($order_id)
{
$data = [
'is_lock' => 0
];
return model('order')->update($data, [ [ 'order_id', '=', $order_id ] ]);
}
/**
* 订单锁定
* @param $order_id
* @return int
*/
public function orderLock($order_id)
{
$data = [
'is_lock' => 1
];
return model('order')->update($data, [ [ 'order_id', '=', $order_id ] ]);
}
/**
* 获取订单详情
* @param $order_id
* @return array
*/
public function getOrderDetail($order_id)
{
$order_info = model('order')->getInfo([ [ 'o.order_id', '=', $order_id ] ], 'o.*,s.store_name', 'o', [ [ 'store s', 'o.store_id = s.store_id', 'left' ] ]);
if (empty($order_info))
return $this->error();
$order_info[ 'goods_num' ] = numberFormat($order_info[ 'goods_num' ]);
if ($order_info[ 'member_id' ] != 0) {
$member_info = model('member')->getInfo([ [ 'member_id', '=', $order_info[ 'member_id' ] ] ], 'nickname');
} else {
$member_info = [];
}
$order_info[ 'nickname' ] = $member_info[ 'nickname' ] ?? '';
if (!empty($order_info[ 'delivery_code' ])) {
$order_info[ 'verifier_name' ] = model('verify')->getValue([ [ 'verify_code', '=', $order_info[ 'delivery_code' ] ] ], 'verifier_name');
} else {
$order_info[ 'verifier_name' ] = '';
}
$order_goods_list = model('order_goods')->getList([ [ 'order_id', '=', $order_id ] ]);
$order_goods_id_array = [];
foreach ($order_goods_list as $k => $v) {
$order_goods_list[ $k ][ 'num' ] = numberFormat($v[ 'num' ]);
$order_goods_id_array[] = $v[ 'order_goods_id' ];
$order_goods_list[$k]['spec_name'] = mb_substr($v['sku_name'], mb_strlen($v['goods_name']) + 1);
}
$order_goods_ids = implode(',', $order_goods_id_array);
$form_list = model('form_data')->getList([ [ 'relation_id', 'in', $order_goods_ids ], [ 'scene', '=', 'goods' ] ], 'relation_id, form_data');
foreach ($order_goods_list as $k => $v) {
foreach ($form_list as $k_form => $v_form) {
if ($v[ 'order_goods_id' ] == $v_form[ 'relation_id' ]) {
$order_goods_list[ $k ][ 'form' ] = json_decode($v_form[ 'form_data' ], true);
}
}
}
$order_info[ 'order_goods' ] = $order_goods_list;
$order_model = $this->getOrderModel($order_info);
$temp_info = $order_model->orderDetail($order_info);
$order_info = array_merge($order_info, $temp_info);
$form_info = model('form_data')->getInfo([ [ 'relation_id', '=', $order_id ], [ 'scene', '=', 'order' ] ], 'form_data');
if (!empty($form_info)) {
$order_info[ 'form' ] = json_decode($form_info[ 'form_data' ], true);
}
if ($order_info[ 'store_id' ]) $order_info[ 'store_name' ] = model('store')->getValue([ [ 'store_id', '=', $order_info[ 'store_id' ] ] ], 'store_name');
$order_info[ 'order_log' ] = model('order_log')->getList([ [ 'order_id', '=', $order_id ] ], '*', 'action_time desc,id desc');
//线下支付信息
if(addon_is_exit('offlinepay')){
$order_info = (new \addon\offlinepay\model\Pay())->handleAdminOrderInfo($order_info);
}
//实际支付金额处理
$order_info = $this->dealWithRealPayMoney($order_info);
return $this->success($order_info);
}
/**
* 获取订单详情(为退款的订单项)
* @param $order_id
* @return array
*/
public function getUnRefundOrderDetail($order_id)
{
$order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ]);
if (empty($order_info))
return $this->error();
$order_info[ 'goods_num' ] = numberFormat($order_info[ 'goods_num' ]);
$member_info = model('member')->getInfo([ [ 'member_id', '=', $order_info[ 'member_id' ] ] ], 'nickname');
$order_info[ 'nickname' ] = $member_info[ 'nickname' ];
$order_goods_list = model('order_goods')->getList([ [ 'order_id', '=', $order_id ], [ 'refund_status', 'in', [OrderRefundDict::REFUND_NOT_APPLY,OrderRefundDict::PARTIAL_REFUND] ] ]);
foreach ($order_goods_list as $k => $v) {
$order_goods_list[ $k ][ 'num' ] = numberFormat($v[ 'num' ]);
}
$order_info[ 'order_goods' ] = $order_goods_list;
$order_model = $this->getOrderModel($order_info);
$temp_info = $order_model->orderDetail($order_info);
$order_info = array_merge($order_info, $temp_info);
return $this->success($order_info);
}
/**
* 得到订单基础信息
* @param $condition
* @param string $field
* @return array
*/
public function getOrderInfo($condition, $field = '*')
{
$info = model('order')->getInfo($condition, $field);
if (!empty($info)) {
if (isset($info[ 'goods_num' ])) {
$info[ 'goods_num' ] = numberFormat($info[ 'goods_num' ]);
}
}
return $this->success($info);
}
/**
* 得到订单数量
* @param $condition
* @param string $field
* @param string $alias
* @param null $join
* @param null $group
* @return array
*/
public function getOrderCount($condition, $field = '*', $alias = 'a', $join = null, $group = null)
{
$res = model('order')->getCount($condition, $field, $alias, $join, $group);
return $this->success($res);
}
/**
* 得到订单加和
* @param $condition
* @param string $field
* @param string $alias
* @param null $join
* @return array
*/
public function getOrderSum($condition, $field = '*', $alias = 'a', $join = null)
{
$res = model('order')->getSum($condition, $field, $alias, $join);
return $this->success($res);
}
/**
* 得到订单项数量
* @param $condition
* @param string $field
* @param string $alias
* @param null $join
* @param null $group
* @return array
*/
public function getOrderGoodsCount($condition, $field = '*', $alias = 'a', $join = null, $group = null)
{
$res = model('order_goods')->getCount($condition, $field, $alias, $join, $group);
return $this->success($res);
}
/**
* 查询会员订单数量
* @param $member_id
* @return array
*/
public function getMemberOrderNum($member_id)
{
$data = [
'waitpay' => 0,
'waitsend' => 0,
'waitconfirm' => 0,
'wait_use' => 0,
'waitrate' => 0
];
$list = model('order')->getList([ [ 'member_id', '=', $member_id ] ], 'order_id, order_status,order_type,is_evaluate,evaluate_status,order_scene');
//计算退款中id
if (!empty($list)) {
foreach ($list as $k => $v) {
//待支付
if ($v[ 'order_status' ] == 0 && $v['order_scene'] == 'online') {
$data[ 'waitpay' ] += 1;
}
//待发货
if ($v[ 'order_status' ] == 1) {
$data[ 'waitsend' ] += 1;
}
//待收货
if (( $v[ 'order_status' ] == 2 || $v[ 'order_status' ] == 3 ) && ( $v[ 'order_type' ] != 4 )) {
$data[ 'waitconfirm' ] += 1;
}
//待使用
if (( $v[ 'order_status' ] == 3 || $v[ 'order_status' ] == 11 ) && ( $v[ 'order_type' ] == 4 )) {
$data[ 'wait_use' ] += 1;
}
//待评价
if (( $v[ 'order_status' ] == 4 || $v[ 'order_status' ] == 10 ) && ( $v[ 'is_evaluate' ] == 1 ) && ( $v[ 'evaluate_status' ] == OrderDict::evaluate_wait )) {
$data[ 'waitrate' ] += 1;
}
}
}
$order_refund_model = new OrderRefundModel();
$result = $order_refund_model->getRefundOrderGoodsCount([
[ 'member_id', '=', $member_id ],
[ 'refund_status', 'not in', [ OrderRefundDict::REFUND_NOT_APPLY, OrderRefundDict::REFUND_COMPLETE,OrderRefundDict::PARTIAL_REFUND ] ]
]);
$data[ 'refunding' ] = $result[ 'data' ];
return $this->success($data);
}
/**
* 获取订单列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @param string $group
* @param string $alias
* @param string $join
* @return array
*/
public function getOrderList($condition = [], $field = '*', $order = '', $limit = null, $group = '', $alias = '', $join = '')
{
$list = model('order')->getList($condition, $field, $order, $alias, $join, $group, $limit);
foreach ($list as $k => $v) {
if (isset($v[ 'goods_num' ])) {
$list[ $k ][ 'goods_num' ] = numberFormat($v[ 'goods_num' ]);
}
}
return $this->success($list);
}
/**
* 获取订单分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @param string $alias
* @param array $join
* @return array
*/
public function getOrderPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = 'a', $join = [])
{
$order_list = model('order')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
$check_condition = array_column($condition, 2, 0);
//线下支付判断
$offline_pay_exist = addon_is_exit('offlinepay');
if($offline_pay_exist) $offline_pay_model = new \addon\offlinepay\model\Pay();
if (!empty($order_list[ 'list' ])) {
//组装数据
$member_id_array = [];
$order_id_array = [];
foreach ($order_list[ 'list' ] as $k => &$order_v) {
//先初始化订单商品数据,如果没有查到订单项,页面会报错
$order_v['order_goods'] = [];
if (isset($order_v[ 'member_id' ])) {
$member_id_array[] = $order_v[ 'member_id' ];
}
$order_id_array[] = $order_v[ 'order_id' ];
if (!empty($check_condition[ 'a.order_status' ])) {
$order_v[ 'order_data_status' ] = $check_condition[ 'a.order_status' ];
}
if (isset($order_v[ 'goods_num' ])) {
$order_v[ 'goods_num' ] = numberFormat($order_v[ 'goods_num' ]);
}
//处理线下支付信息
if($offline_pay_exist){
$order_v = $offline_pay_model->handleAdminOrderInfo($order_v);
}
//实际支付金额处理
$order_v = $this->dealWithRealPayMoney($order_v);
}
$order_goods_list = model('order_goods')->getList([
[ 'order_id', 'in', $order_id_array ]
]);
$member_list = [];
if (!empty($member_id_array)) {
$member_list = model('member')->getColumn([ [ 'member_id', 'in', $member_id_array ] ], 'nickname', 'member_id');
}
foreach ($order_list[ 'list' ] as &$v) {
foreach ($order_goods_list as &$cv) {
if ($v[ 'order_id' ] == $cv[ 'order_id' ]) {
$cv[ 'num' ] = numberFormat($cv[ 'num' ]);
$v[ 'order_goods' ][] = $cv;
}
}
$v['nickname'] = $member_list[ $v[ 'member_id' ] ?? 0 ] ?? '';
$v['buyer_message'] = htmlspecialchars($v['buyer_message']);
}
//部分发货处理
$order_model = new Order();
foreach ($order_list[ 'list' ] as &$v) {
if($v['order_type'] == OrderDict::express){
$v = array_merge($v, $order_model->orderPartDeliveryHandle($v));
}
}
}
return $this->success($order_list);
}
/****************************************************************************订单数据查询结束*************************************/
/****************************************************************************会员订单订单数据查询开始*************************************/
/**
* 获取订单发票分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @param string $alias
* @param array $join
* @return array
*/
public function getOrderInvoicePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = 'a', $join = [])
{
$order_list = model('order')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($order_list);
}
/**
* 获取订单项详情
* @param array $condition
* @param string $field
* @return array
*/
public function getOrderGoodsInfo($condition = [], $field = '*', $alias = 'og', $join = [])
{
$info = model('order_goods')->getInfo($condition, $field, $alias, $join);
$info = $this->handleOrderGoodsInfo($info);
return $this->success($info);
}
/**
* 处理订单商品信息
* @param $info
* @return mixed
*/
public function handleOrderGoodsInfo($info)
{
if(isset($info['refund_status_action'])){
$refund_action = empty($info[ 'refund_status_action' ]) ? [] : json_decode($info[ 'refund_status_action' ], true);
$refund_member_action = $refund_action[ 'member_action' ] ?? [];
$info[ 'refund_action' ] = $refund_member_action;
}
if (isset($v['goods_num'])) {
$info['goods_num'] = numberFormat($info['goods_num']);
}
if (isset($info[ 'num' ])) {
$info[ 'num' ] = numberFormat($info[ 'num' ]);
}
if(isset($info['refund_type'])){
$info['refund_type_name'] = OrderRefundDict::getRefundType($info['refund_type']);
}
if(isset($info['refund_money_type'])){
$info['refund_money_type_name'] = OrderRefundDict::getRefundMoneyType($info['refund_money_type']);
}
if(isset($info['shop_active_refund_money_type'])){
$info['shop_active_refund_money_type_name'] = OrderRefundDict::getRefundMoneyType($info['shop_active_refund_money_type']);
}
return $info;
}
/**
* 获取订单列表
* @param array $condition
* @param string $field
* @param string $order
* @param null $limit
* @param string $group
* @param string $alias
* @param string $join
* @return array
*/
public function getOrderGoodsList($condition = [], $field = '*', $order = '', $limit = null, $group = '', $alias = '', $join = '')
{
$list = model('order_goods')->getList($condition, $field, $order, $alias, $join, $group, $limit);
foreach ($list as &$v) {
$v = $this->handleOrderGoodsInfo($v);
}
return $this->success($list);
}
/****************************************************************************会员订单订单数据查询结束*************************************/
/***************************************************************** 交易记录 *****************************************************************/
/**
* 会员订单详情
* @param $order_id
* @param $member_id
* @param $site_id
* @param string $merchant_trade_no
* @return array
*/
public function getMemberOrderDetail($order_id, $member_id, $site_id, $merchant_trade_no = '')
{
$condition = [
[ 'member_id', '=', $member_id ],
[ 'site_id', '=', $site_id ]
];
if (!empty($order_id)) {
$condition[] = [ 'order_id', '=', $order_id ];
}
if (!empty($merchant_trade_no)) {
$condition[] = [ 'out_trade_no', '=', $merchant_trade_no ];
}
$order_info = model('order')->getInfo($condition);
if (empty($order_info))
return $this->error([], '当前订单不是本账号的订单!');
$order_info[ 'goods_num' ] = numberFormat($order_info[ 'goods_num' ]);
$order_goods_list = model('order_goods')->getList([ [ 'order_id', '=', $order_id ], [ 'member_id', '=', $member_id ] ]);
foreach ($order_goods_list as $k => $v) {
$refund_action = empty($v[ 'refund_status_action' ]) ? [] : json_decode($v[ 'refund_status_action' ], true);
$refund_action = $refund_action[ 'member_action' ] ?? [];
$order_goods_list[ $k ][ 'refund_action' ] = $refund_action;
//TODO 优化
$form_info = model('form_data')->getInfo([ [ 'relation_id', '=', $v[ 'order_goods_id' ] ], [ 'scene', '=', 'goods' ] ], 'form_data');
if (!empty($form_info)) $order_goods_list[ $k ][ 'form' ] = json_decode($form_info[ 'form_data' ], true);
$order_goods_list[ $k ][ 'num' ] = numberFormat($order_goods_list[ $k ][ 'num' ]);
}
$order_info[ 'order_goods' ] = $order_goods_list;
$order_model = $this->getOrderModel($order_info);
$temp_info = $order_model->orderDetail($order_info);
$order_info = array_merge($order_info, $temp_info);
$code_result = $this->orderQrcode($order_info);
$order_info = array_merge($order_info, $code_result);
$order_info[ 'code_info' ] = $code_result;
$form_info = model('form_data')->getInfo([ [ 'relation_id', '=', $order_id ], [ 'scene', '=', 'order' ] ], 'form_data');
if (!empty($form_info)) $order_info[ 'form' ] = json_decode($form_info[ 'form_data' ], true);
//操作按钮处理
$action = empty($order_info[ 'order_status_action' ]) ? [] : json_decode($order_info[ 'order_status_action' ], true);
$member_action = $action[ 'member_action' ] ?? [];
if (!in_array($order_info[ 'order_status' ], [ self::ORDER_CREATE, self::ORDER_COMPLETE, self::ORDER_CLOSE ]) && $order_info[ 'is_enable_refund' ]) {
$not_apply_refund_count = model('order_goods')->getCount([
[ 'order_id', '=', $order_id ],
[ 'refund_status', '=', OrderRefundDict::REFUND_NOT_APPLY ],
], 'order_goods_id');
if ($not_apply_refund_count > 1) {
$member_action[] = [
'action' => 'memberBatchRefund',
'title' => '批量退款',
'color' => '',
];
}
}
$order_info[ 'action' ] = $member_action;
//线下支付处理
if(addon_is_exit('offlinepay')){
$order_info = (new \addon\offlinepay\model\Pay())->handleMemberOrderInfo($order_info);
}
//增加删除订单操作
if(isset($order_info['order_status']) && isset($order_info['action']) && $order_info['order_status'] == self::ORDER_CLOSE){
$order_info['action'][] = [
'action' => 'orderDelete',
'title' => '删除',
'color' => '',
];
}
return $this->success($order_info);
}
/***************************************************************** 交易记录 *****************************************************************/
/**
* 订单生成码
* @param $order_info
* @return array
*/
public function orderQrcode($order_info)
{
$app_type = 'h5';
switch ( $order_info[ 'order_type' ] ) {
case OrderDict::store:
$code = $order_info[ 'delivery_code' ];
$verify_type = 'pickup';
break;
case OrderDict::virtual:
$code = $order_info[ 'virtual_code' ];
$verify_type = 'virtualgoods';
break;
default:
return [];
}
$verify_model = new Verify();
$result = $verify_model->qrcode($code, $app_type, $verify_type, $order_info[ 'site_id' ], 'get');
// 生成条形码
$txm = getBarcode($code, 'upload/qrcode/' . $verify_type);
$data = [];
if (!empty($result) && $result[ 'code' ] >= 0) {
$data[ $verify_type ] = $result[ 'data' ][ $app_type ][ 'path' ] ?? '';
}
$data[ $verify_type . '_barcode' ] = $txm;
return $data;
}
/************************************************************************* 订单日志 start ********************************************************************/
/**
* 会员订单分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @param string $alias
* @param array $join
* @return array
*/
public function getMemberOrderPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = 'a', $join = [])
{
$order_list = model('order')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
if (!empty($order_list[ 'list' ])) {
$order_id_array = [];
//线下支付判断
$offline_pay_exist = addon_is_exit('offlinepay');
if($offline_pay_exist) $offline_pay_model = new \addon\offlinepay\model\Pay();
foreach ($order_list[ 'list' ] as &$v) {
//需要先初始化 会有丢失订单项的情况导致前端报错
$v['order_goods'] = [];
$order_id_array[] = $v[ 'order_id' ];
$action = empty($v[ 'order_status_action' ]) ? [] : json_decode($v[ 'order_status_action' ], true);
$member_action = $action[ 'member_action' ] ?? [];
$v[ 'action' ] = $member_action;
//线下支付处理
if($offline_pay_exist) $v = $offline_pay_model->handleMemberOrderInfo($v);
if (isset($v[ 'goods_num' ])) {
$v[ 'goods_num' ] = numberFormat($v[ 'goods_num' ]);
}
//增加删除订单操作
if(isset($v['order_status']) && isset($v['action']) && $v['order_status'] == self::ORDER_CLOSE){
$v['action'][] = [
'action' => 'orderDelete',
'title' => '删除',
'color' => '',
];
}
}
$order_ids = implode(',', $order_id_array);
$order_goods_list = model('order_goods')->getList([ [ 'order_id', 'in', $order_ids ] ]);
unset($v);
//附件商品项目列表
foreach ($order_list[ 'list' ] as $k => $v) {
foreach ($order_goods_list as $cv) {
$cv[ 'num' ] = numberFormat($cv[ 'num' ]);
if ($v[ 'order_id' ] == $cv[ 'order_id' ]) {
$order_list[ 'list' ][ $k ][ 'order_goods' ][] = $cv;
}
}
}
//部分发货处理
$order_model = new Order();
foreach ($order_list[ 'list' ] as &$v) {
if($v['order_type'] == OrderDict::express){
$v = array_merge($v, $order_model->orderPartDeliveryHandle($v));
}
}
}
return $this->success($order_list);
}
/**
* 获取交易记录分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @return array
*/
public function getTradePageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
{
$res = model('order')->pageList($condition, $field, $order, $page, $page_size);
foreach ($res[ 'list' ] as &$v) {
if (isset($v[ 'goods_num' ])) {
$v[ 'goods_num' ] = numberFormat($v[ 'goods_num' ]);
}
}
return $this->success($res);
}
/**
* @param $order_id
* @return array
*/
public function orderAfterSaleClose($order_id)
{
$res = model('order')->update([ 'is_enable_refund' => 0 ], [ [ 'order_id', '=', $order_id ] ]);
return $this->success($res);
}
/**
* 获取订单项分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @param string $alias
* @param array $join
* @return array
*/
public function getOrderGoodsPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = '', $join = [], $group = '')
{
$res = model('order_goods')->pageList($condition, $field, $order, $page, $page_size, $alias, $join, $group);
foreach ($res[ 'list' ] as $k => $v) {
if (isset($v[ 'num' ])) {
$res[ 'list' ][ $k ][ 'num' ] = numberFormat($res[ 'list' ][ $k ][ 'num' ]);
}
}
return $this->success($res);
}
/**
* 处理页面要显示的实际支付金额
* @param $order_info
* @return mixed
*/
public function dealWithRealPayMoney($order_info)
{
$order_info['real_pay_money'] = $order_info['order_money'];
if(isset($order_info['order_money']) && isset($order_info['balance_money']) && isset($order_info['order_status']) && isset($order_info['pay_status'])){
if($order_info['order_status'] == self::ORDER_CREATE){
$order_info['real_pay_money'] = $order_info['balance_money'];
}
if($order_info['order_status'] == self::ORDER_CLOSE && $order_info['pay_status'] == 0){
$order_info['real_pay_money'] = '0.00';
}
}
return $order_info;
}
}