|
@@ -12,6 +12,9 @@ use app\common\Enum\OrderEnum;
|
|
use app\common\Enum\GoodsEnum;
|
|
use app\common\Enum\GoodsEnum;
|
|
use app\common\Enum\PayEnum;
|
|
use app\common\Enum\PayEnum;
|
|
use app\common\Enum\ChannelEnum;
|
|
use app\common\Enum\ChannelEnum;
|
|
|
|
+use app\common\Enum\OrderActionEnum;
|
|
|
|
+use app\common\Service\Order\OrderActionService;
|
|
|
|
+use app\common\Service\Pay\PayService;
|
|
use think\Db;
|
|
use think\Db;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -44,7 +47,7 @@ class Order extends Backend
|
|
$this->view->assign("deliveryTypeList", OrderEnum::getDeliveryTypeList());
|
|
$this->view->assign("deliveryTypeList", OrderEnum::getDeliveryTypeList());
|
|
$this->view->assign("invoiceStatusList", OrderEnum::getInvoiceStatusList());
|
|
$this->view->assign("invoiceStatusList", OrderEnum::getInvoiceStatusList());
|
|
$this->view->assign("activityTypeList", OrderEnum::getActivityTypeList());
|
|
$this->view->assign("activityTypeList", OrderEnum::getActivityTypeList());
|
|
- $this->view->assign("actionTypeList", OrderEnum::getActionTypeList());
|
|
|
|
|
|
+ $this->view->assign("actionTypeList", OrderActionEnum::getActionTypeList());
|
|
$this->view->assign("saleStatusList", GoodsEnum::getSaleStatusMap());
|
|
$this->view->assign("saleStatusList", GoodsEnum::getSaleStatusMap());
|
|
|
|
|
|
// 前端配置
|
|
// 前端配置
|
|
@@ -56,36 +59,10 @@ class Order extends Backend
|
|
$this->assignconfig('deliveryTypeList', json_encode(OrderEnum::getDeliveryTypeList()));
|
|
$this->assignconfig('deliveryTypeList', json_encode(OrderEnum::getDeliveryTypeList()));
|
|
$this->assignconfig('invoiceStatusList', json_encode(OrderEnum::getInvoiceStatusList()));
|
|
$this->assignconfig('invoiceStatusList', json_encode(OrderEnum::getInvoiceStatusList()));
|
|
$this->assignconfig('activityTypeList', json_encode(OrderEnum::getActivityTypeList()));
|
|
$this->assignconfig('activityTypeList', json_encode(OrderEnum::getActivityTypeList()));
|
|
- $this->assignconfig('actionTypeList', json_encode(OrderEnum::getActionTypeList()));
|
|
|
|
|
|
+ $this->assignconfig('actionTypeList', json_encode(OrderActionEnum::getActionTypeList()));
|
|
$this->assignconfig('saleStatusList', json_encode(GoodsEnum::getSaleStatusMap()));
|
|
$this->assignconfig('saleStatusList', json_encode(GoodsEnum::getSaleStatusMap()));
|
|
|
|
|
|
- // 订单状态常量配置
|
|
|
|
- $this->assignconfig('orderStatusConstants', json_encode([
|
|
|
|
- 'STATUS_CREATE' => OrderEnum::STATUS_CREATE,
|
|
|
|
- 'STATUS_PAY' => OrderEnum::STATUS_PAY,
|
|
|
|
- 'STATUS_SHIP' => OrderEnum::STATUS_SHIP,
|
|
|
|
- 'STATUS_CONFIRM' => OrderEnum::STATUS_CONFIRM,
|
|
|
|
- 'STATUS_COMMENT' => OrderEnum::STATUS_COMMENT,
|
|
|
|
- 'STATUS_CANCEL' => OrderEnum::STATUS_CANCEL,
|
|
|
|
- 'STATUS_AUTO_CANCEL' => OrderEnum::STATUS_AUTO_CANCEL,
|
|
|
|
- 'STATUS_ADMIN_CANCEL' => OrderEnum::STATUS_ADMIN_CANCEL,
|
|
|
|
- 'STATUS_REFUND' => OrderEnum::STATUS_REFUND,
|
|
|
|
- 'STATUS_REFUND_CONFIRM' => OrderEnum::STATUS_REFUND_CONFIRM,
|
|
|
|
- 'STATUS_GROUPON_TIMEOUT' => OrderEnum::STATUS_GROUPON_TIMEOUT,
|
|
|
|
- 'STATUS_AUTO_CONFIRM' => OrderEnum::STATUS_AUTO_CONFIRM,
|
|
|
|
- ]));
|
|
|
|
-
|
|
|
|
- // 显示类型状态映射
|
|
|
|
- $this->assignconfig('showTypeStatusMap', json_encode([
|
|
|
|
- 'all' => [],
|
|
|
|
- 'wait_pay' => [OrderEnum::STATUS_CREATE],
|
|
|
|
- 'cancelled' => [OrderEnum::STATUS_CANCEL, OrderEnum::STATUS_AUTO_CANCEL, OrderEnum::STATUS_ADMIN_CANCEL],
|
|
|
|
- 'refund' => [OrderEnum::STATUS_REFUND, OrderEnum::STATUS_REFUND_CONFIRM, OrderEnum::STATUS_GROUPON_TIMEOUT],
|
|
|
|
- 'wait_ship' => [OrderEnum::STATUS_PAY],
|
|
|
|
- 'shipped' => [OrderEnum::STATUS_SHIP],
|
|
|
|
- 'wait_comment' => [OrderEnum::STATUS_CONFIRM, OrderEnum::STATUS_AUTO_CONFIRM],
|
|
|
|
- 'completed' => [OrderEnum::STATUS_COMMENT],
|
|
|
|
- ]));
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -227,106 +204,61 @@ class Order extends Backend
|
|
$this->error('记录未找到');
|
|
$this->error('记录未找到');
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 转换为数组以便处理
|
|
|
|
+ $rowData = $row->toArray();
|
|
|
|
+
|
|
// 添加枚举文本转换
|
|
// 添加枚举文本转换
|
|
- $row['order_status_text'] = OrderEnum::getOrderStatusText($row['order_status']);
|
|
|
|
- $row['source_text'] = $this->getSourceText($row['source']);
|
|
|
|
- $row['type_text'] = $this->getTypeText($row['type']);
|
|
|
|
- $row['pay_type_text'] = $this->getPayTypeText($row['pay_type']);
|
|
|
|
- $row['pay_mode_text'] = $this->getPayModeText($row['pay_mode']);
|
|
|
|
- $row['delivery_type_text'] = $this->getDeliveryTypeText($row['delivery_type']);
|
|
|
|
- $row['invoice_status_text'] = $this->getInvoiceStatusText($row['invoice_status']);
|
|
|
|
- $row['activity_type_text'] = $this->getActivityTypeText($row['activity_type']);
|
|
|
|
|
|
+ $rowData['order_status_text'] = OrderEnum::getOrderStatusText($rowData['order_status']);
|
|
|
|
+ $rowData['source_text'] = ChannelEnum::getChannelText($rowData['source'] ?? '');
|
|
|
|
+ $rowData['type_text'] = $this->getTypeText($rowData['type']);
|
|
|
|
+ $rowData['pay_type_text'] = $this->getPayTypeText($rowData['pay_type']);
|
|
|
|
+ $rowData['pay_mode_text'] = $this->getPayModeText($rowData['pay_mode']);
|
|
|
|
+ $rowData['delivery_type_text'] = $this->getDeliveryTypeText($rowData['delivery_type']);
|
|
|
|
+
|
|
|
|
+ if (!empty($rowData['invoice_status'])) {
|
|
|
|
+ $rowData['invoice_status_text'] = $this->getInvoiceStatusText($rowData['invoice_status']);
|
|
|
|
+ }
|
|
|
|
+ if (!empty($rowData['activity_type'])) {
|
|
|
|
+ $rowData['activity_type_text'] = $this->getActivityTypeText($rowData['activity_type']);
|
|
|
|
+ }
|
|
|
|
|
|
// 处理订单商品的规格信息和售后状态文本
|
|
// 处理订单商品的规格信息和售后状态文本
|
|
- if ($row->order_goods) {
|
|
|
|
|
|
+ if (!empty($rowData['order_goods'])) {
|
|
$orderGoods = [];
|
|
$orderGoods = [];
|
|
- foreach ($row->order_goods as $index => $item) {
|
|
|
|
- $itemData = $item->toArray();
|
|
|
|
|
|
+ foreach ($rowData['order_goods'] as $index => $item) {
|
|
// 格式化商品规格属性
|
|
// 格式化商品规格属性
|
|
- $itemData['goods_sku_attr_formatted'] = $this->formatGoodsSkuAttr($itemData['goods_sku_attr']);
|
|
|
|
|
|
+ $item['goods_sku_attr_formatted'] = $this->formatGoodsSkuAttr($item['goods_sku_attr']);
|
|
// 处理售后状态文本
|
|
// 处理售后状态文本
|
|
- $itemData['sale_status_text'] = $this->getSaleStatusText($itemData['sale_status']);
|
|
|
|
- $orderGoods[] = $itemData;
|
|
|
|
|
|
+ $item['sale_status_text'] = $this->getSaleStatusText($item['sale_status']);
|
|
|
|
+ $orderGoods[] = $item;
|
|
}
|
|
}
|
|
- $row['order_goods'] = $orderGoods;
|
|
|
|
|
|
+ $rowData['order_goods'] = $orderGoods;
|
|
}
|
|
}
|
|
|
|
|
|
- // 单独查询订单操作记录(因为使用order_sn关联)
|
|
|
|
- $orderActionResult = Db::name('shop_order_action')
|
|
|
|
- ->where('order_sn', $row['order_sn'])
|
|
|
|
- ->order('createtime desc')
|
|
|
|
- ->select();
|
|
|
|
-
|
|
|
|
- // 转换为数组并处理操作记录文本
|
|
|
|
- $orderActions = [];
|
|
|
|
- if ($orderActionResult) {
|
|
|
|
- $orderActions = collection($orderActionResult)->toArray();
|
|
|
|
- foreach ($orderActions as &$action) {
|
|
|
|
- $action['action_type_text'] = $this->getActionTypeText($action['action_type'] ?? '');
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // 使用 OrderActionService 获取订单操作记录
|
|
|
|
+ $orderActions = OrderActionService::getActionTimeline($rowData['order_sn']);
|
|
|
|
|
|
// 将操作记录添加到订单数据中
|
|
// 将操作记录添加到订单数据中
|
|
- $row['order_action'] = $orderActions;
|
|
|
|
-
|
|
|
|
- // 重新计算商品折扣价格(基于新字段)
|
|
|
|
- // $this->calculateGoodsDiscountPrice($row);
|
|
|
|
|
|
+ $rowData['order_action'] = $orderActions;
|
|
|
|
|
|
|
|
+ // 支付信息
|
|
|
|
+ // 查询支付信息
|
|
|
|
+ $payInfo = PayService::getPayInfo($rowData['id']);
|
|
|
|
+ $rowData['pay_info'] = $payInfo;
|
|
$config = get_addon_config('shop');
|
|
$config = get_addon_config('shop');
|
|
$this->assignconfig('shop', $config);
|
|
$this->assignconfig('shop', $config);
|
|
|
|
|
|
- $this->view->assign('row', $row);
|
|
|
|
|
|
+ $this->view->assign('row', $rowData);
|
|
return $this->view->fetch();
|
|
return $this->view->fetch();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 计算商品折扣后的价格
|
|
|
|
- */
|
|
|
|
- private function calculateGoodsDiscountPrice(&$row)
|
|
|
|
- {
|
|
|
|
- if (!isset($row['order_goods']) || empty($row['order_goods'])) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 使用新的字段名进行计算
|
|
|
|
- $orderAmount = bcsub($row['order_amount'], $row['express_fee'], 2);
|
|
|
|
- $goodsPrice = $row['goods_price'];
|
|
|
|
- $discountRatio = $goodsPrice > 0 ? bcdiv($orderAmount, $goodsPrice, 10) : 1;
|
|
|
|
- $remainingAmount = $orderAmount;
|
|
|
|
-
|
|
|
|
- $orderGoods = $row['order_goods'];
|
|
|
|
- $goodsCount = count($orderGoods);
|
|
|
|
- foreach ($orderGoods as $index => $item) {
|
|
|
|
- if ($index == $goodsCount - 1) {
|
|
|
|
- // 最后一个商品,使用剩余金额
|
|
|
|
- $discountPrice = $remainingAmount;
|
|
|
|
- } else {
|
|
|
|
- // 计算折扣后价格
|
|
|
|
- $originalPrice = bcmul($item['goods_original_price'], $item['nums'], 2);
|
|
|
|
- $discountPrice = $row['discount_fee'] == 0 ? $originalPrice : bcmul($originalPrice, $discountRatio, 2);
|
|
|
|
- }
|
|
|
|
- $remainingAmount = bcsub($remainingAmount, $discountPrice, 2);
|
|
|
|
- $row['order_goods'][$index]['discount_price'] = $discountPrice;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
* 获取订单来源文本
|
|
* 获取订单来源文本
|
|
*/
|
|
*/
|
|
- private function getSourceText($source)
|
|
|
|
|
|
+ private function getPlatformText($platform)
|
|
{
|
|
{
|
|
- // 映射数据库中的source字段到ChannelEnum
|
|
|
|
- $sourceMapping = [
|
|
|
|
- 'H5' => ChannelEnum::CHANNEL_H5,
|
|
|
|
- 'WechatOfficialAccount' => ChannelEnum::CHANNEL_WECHAT_OFFICIAL_ACCOUNT,
|
|
|
|
- 'WechatMiniProgram' => ChannelEnum::CHANNEL_WECHAT_MINI_PROGRAM,
|
|
|
|
- 'App' => ChannelEnum::CHANNEL_IOS_APP, // 默认使用iOS
|
|
|
|
- 'PC' => ChannelEnum::CHANNEL_PC,
|
|
|
|
- 'Admin' => ChannelEnum::CHANNEL_PC, // 后台创建归为PC
|
|
|
|
- ];
|
|
|
|
-
|
|
|
|
- $channelType = $sourceMapping[$source] ?? $source;
|
|
|
|
- return ChannelEnum::getChannelText($channelType);
|
|
|
|
|
|
+ // 直接使用ChannelEnum获取渠道文本
|
|
|
|
+ return ChannelEnum::getChannelText($platform);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -379,13 +311,7 @@ class Order extends Backend
|
|
return OrderEnum::getActivityTypeText($activityType);
|
|
return OrderEnum::getActivityTypeText($activityType);
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * 获取操作类型文本
|
|
|
|
- */
|
|
|
|
- private function getActionTypeText($actionType)
|
|
|
|
- {
|
|
|
|
- return OrderEnum::getActionTypeText($actionType);
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取售后状态文本
|
|
* 获取售后状态文本
|
|
@@ -432,18 +358,39 @@ class Order extends Backend
|
|
}
|
|
}
|
|
//取消
|
|
//取消
|
|
if ($order_status == OrderEnum::STATUS_CANCEL && $order->order_status == OrderEnum::STATUS_CREATE && !$order->pay_time) {
|
|
if ($order_status == OrderEnum::STATUS_CANCEL && $order->order_status == OrderEnum::STATUS_CREATE && !$order->pay_time) {
|
|
|
|
+ $oldStatus = $order->order_status;
|
|
$order->order_status = OrderEnum::STATUS_CANCEL;
|
|
$order->order_status = OrderEnum::STATUS_CANCEL;
|
|
$order->cancel_time = time();
|
|
$order->cancel_time = time();
|
|
$order->save();
|
|
$order->save();
|
|
|
|
+
|
|
|
|
+ // 记录管理员操作
|
|
|
|
+ OrderActionService::recordAdminAction(
|
|
|
|
+ $order->order_sn,
|
|
|
|
+ OrderActionEnum::ACTION_ADMIN_CANCEL,
|
|
|
|
+ '管理员',
|
|
|
|
+ '管理员取消订单',
|
|
|
|
+ $this->auth->id ?? 0
|
|
|
|
+ );
|
|
|
|
+
|
|
$this->success('取消成功');
|
|
$this->success('取消成功');
|
|
}
|
|
}
|
|
// 支付
|
|
// 支付
|
|
if ($pay_time && $order->order_status == OrderEnum::STATUS_CREATE && !$order->pay_time) {
|
|
if ($pay_time && $order->order_status == OrderEnum::STATUS_CREATE && !$order->pay_time) {
|
|
|
|
+ $oldStatus = $order->order_status;
|
|
$order->order_status = OrderEnum::STATUS_PAY;
|
|
$order->order_status = OrderEnum::STATUS_PAY;
|
|
$order->pay_type = 'system';
|
|
$order->pay_type = 'system';
|
|
$order->pay_amount = $order->amount;
|
|
$order->pay_amount = $order->amount;
|
|
$order->pay_time = time();
|
|
$order->pay_time = time();
|
|
$order->save();
|
|
$order->save();
|
|
|
|
+
|
|
|
|
+ // 记录管理员操作
|
|
|
|
+ OrderActionService::recordAdminAction(
|
|
|
|
+ $order->order_sn,
|
|
|
|
+ OrderActionEnum::ACTION_PAY,
|
|
|
|
+ '管理员',
|
|
|
|
+ '管理员手动标记订单为已支付',
|
|
|
|
+ $this->auth->id ?? 0
|
|
|
|
+ );
|
|
|
|
|
|
//发送通知
|
|
//发送通知
|
|
//TemplateMsg::sendTempMsg(0, $order->order_sn);
|
|
//TemplateMsg::sendTempMsg(0, $order->order_sn);
|
|
@@ -451,9 +398,19 @@ class Order extends Backend
|
|
}
|
|
}
|
|
//已完成
|
|
//已完成
|
|
if ($order_status == OrderEnum::STATUS_CONFIRM && $order->order_status == OrderEnum::STATUS_PAY && $order->pay_time) {
|
|
if ($order_status == OrderEnum::STATUS_CONFIRM && $order->order_status == OrderEnum::STATUS_PAY && $order->pay_time) {
|
|
|
|
+ $oldStatus = $order->order_status;
|
|
$order->order_status = OrderEnum::STATUS_CONFIRM;
|
|
$order->order_status = OrderEnum::STATUS_CONFIRM;
|
|
$order->save();
|
|
$order->save();
|
|
- OrderAction::push($order->order_sn, '更改订单为已完成', '管理员');
|
|
|
|
|
|
+
|
|
|
|
+ // 记录管理员操作
|
|
|
|
+ OrderActionService::recordAdminAction(
|
|
|
|
+ $order->order_sn,
|
|
|
|
+ OrderActionEnum::ACTION_RECEIVE,
|
|
|
|
+ '管理员',
|
|
|
|
+ '管理员手动标记订单为已完成',
|
|
|
|
+ $this->auth->id ?? 0
|
|
|
|
+ );
|
|
|
|
+
|
|
$this->success('操作成功');
|
|
$this->success('操作成功');
|
|
} elseif ($order->order_status == OrderEnum::STATUS_REFUND) {
|
|
} elseif ($order->order_status == OrderEnum::STATUS_REFUND) {
|
|
$this->error("请完成售后后再进行操作");
|
|
$this->error("请完成售后后再进行操作");
|
|
@@ -494,11 +451,26 @@ class Order extends Backend
|
|
}
|
|
}
|
|
//发货 / 修改快递信息
|
|
//发货 / 修改快递信息
|
|
if ($order->order_status == OrderEnum::STATUS_PAY && $type == 0) {
|
|
if ($order->order_status == OrderEnum::STATUS_PAY && $type == 0) {
|
|
|
|
+ $oldStatus = $order->order_status;
|
|
$order->express_name = $expressname;
|
|
$order->express_name = $expressname;
|
|
$order->express_no = $expressno;
|
|
$order->express_no = $expressno;
|
|
$order->order_status = OrderEnum::STATUS_SHIP;
|
|
$order->order_status = OrderEnum::STATUS_SHIP;
|
|
$order->shipping_time = time();
|
|
$order->shipping_time = time();
|
|
$order->save();
|
|
$order->save();
|
|
|
|
+
|
|
|
|
+ // 记录管理员操作
|
|
|
|
+ OrderActionService::recordAdminAction(
|
|
|
|
+ $order->order_sn,
|
|
|
|
+ OrderActionEnum::ACTION_SHIP,
|
|
|
|
+ '管理员',
|
|
|
|
+ '管理员发货,快递公司:' . $expressname . ',快递单号:' . $expressno,
|
|
|
|
+ $this->auth->id ?? 0,
|
|
|
|
+ [
|
|
|
|
+ 'express_name' => $expressname,
|
|
|
|
+ 'express_no' => $expressno,
|
|
|
|
+ ]
|
|
|
|
+ );
|
|
|
|
+
|
|
$this->success('发货成功');
|
|
$this->success('发货成功');
|
|
} elseif ($type == 1) {
|
|
} elseif ($type == 1) {
|
|
$order->express_name = $expressname;
|
|
$order->express_name = $expressname;
|