Files
amb_wechatapp/application/admin/controller/app/physical/Dispatch.php
T

453 lines
13 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
namespace app\admin\controller\app\physical;
use app\common\controller\Backend;
use app\common\model\order\Order;
use app\common\model\app\physical\OrderExpress;
use app\common\model\app\physical\OrderAddress;
use app\common\library\app\physical\express\Express;
use think\Db;
/**
* 订单发货管理
*/
class Dispatch extends Backend
{
protected $orderModel = null;
protected $expressModel = null;
public function _initialize()
{
parent::_initialize();
$this->orderModel = new Order;
$this->expressModel = new OrderExpress;
}
/**
* 发货操作
*
* @param string $action 发货行为(默认:confirm=确认发货, cancel=取消发货, change=修改发货信息)
* @param int $order_id 订单id
* @param int $order_express_id 发货单id
* @param string $method 发货方式(input=手动发货, api=推送运单, upload=上传发货单)
* @param array $express 物流信息
*
* @return \think\Response
*/
public function dispatch()
{
$params = $this->request->param();
$action = $params['action'] ?? 'confirm';
if (!in_array($action, ['confirm', 'cancel', 'change'])) {
$this->error('发货参数错误');
}
$orderId = $params['order_id'] ?? 0;
if (!$orderId) {
$this->error('订单ID不能为空');
}
$order = $this->orderModel->where([
'id' => $orderId,
'uniacid' => UNIACID
])->find();
if (!$order) {
$this->error('未找到订单');
}
if ($order['order_type'] != 'physical') {
$this->error('该订单不是实物商品订单');
}
switch ($action) {
case 'confirm':
$result = $this->confirmDispatch($order, $params);
$this->success('发货成功', $result);
break;
case 'cancel':
$result = $this->cancelDispatch($order, $params);
$this->success('取消发货成功');
break;
case 'change':
$result = $this->changeDispatch($order, $params);
$this->success('修改成功', $result);
break;
}
$this->error('操作失败');
}
/**
* 确认发货
*/
private function confirmDispatch($order, $params)
{
$method = $params['method'] ?? 'input';
if (!in_array($method, ['input', 'api', 'upload'])) {
$this->error('请使用正确的发货方式');
}
$orderStatus = \app\common\constant\order\Status::STATUS_UNSEND;
if ($order['status'] != $orderStatus) {
$this->error("该订单状态不允许发货");
}
$express = $params['express'] ?? null;
if (empty($express['name']) || empty($express['code']) || empty($express['no'])) {
$this->error('请输入正确的快递信息');
}
// 获取收货地址信息
$address = OrderAddress::where([
'order_id' => $order['id'],
'uniacid' => UNIACID
])->find();
Db::startTrans();
try {
$orderExpress = $this->expressModel->create([
'uniacid' => UNIACID,
'user_id' => $order['user_id'],
'order_id' => $order['id'],
'method' => $method,
'driver' => $express['driver'] ?? null,
'express_name' => $express['name'],
'express_code' => $express['code'],
'express_no' => $express['no'],
'sender_mobile' => $address ? $address['mobile'] : '',
'status' => 'transport',
'ext' => isset($express['ext']) ? json_encode($express['ext']) : null,
'createtime' => time(),
'updatetime' => time()
]);
$order->status = \app\common\constant\order\Status::STATUS_UNRECEIVE;
$order->save();
\app\common\model\order\Log::set($order['order_no'], "订单已发货,快递公司:{$express['name']},运单号:{$express['no']}");
Db::commit();
$this->syncExpressInfo($orderExpress, $order);
} catch (\Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
return $express;
}
/**
* 取消发货
*/
private function cancelDispatch($order, $params)
{
$orderExpressId = $params['order_express_id'] ?? 0;
if (!$orderExpressId) {
$this->error('发货单ID不能为空');
}
$orderExpress = $this->expressModel->where([
'id' => $orderExpressId,
'order_id' => $order['id'],
'uniacid' => UNIACID
])->find();
if (!$orderExpress) {
$this->error('未找到发货单');
}
Db::startTrans();
try {
$orderExpress->delete();
$order->status = \app\common\constant\order\Status::STATUS_UNSEND;
$order->save();
\app\common\model\order\Log::set($order['order_no'], "已取消发货");
Db::commit();
} catch (\Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
return true;
}
/**
* 修改发货信息
*/
private function changeDispatch($order, $params)
{
$orderExpressId = $params['order_express_id'] ?? 0;
if (!$orderExpressId) {
$this->error('发货单ID不能为空');
}
$orderExpress = $this->expressModel->where([
'id' => $orderExpressId,
'order_id' => $order['id'],
'uniacid' => UNIACID
])->find();
if (!$orderExpress) {
$this->error('未找到发货单');
}
$express = $params['express'] ?? null;
if (empty($express['name']) || empty($express['code']) || empty($express['no'])) {
$this->error('请输入正确的快递信息');
}
Db::startTrans();
try {
$orderExpress->save([
'express_name' => $express['name'],
'express_code' => $express['code'],
'express_no' => $express['no'],
'sender_mobile' => $express['sender_mobile'] ?? '',
'method' => 'input',
'status' => 'noinfo',
'updatetime' => time()
]);
// 删除旧的物流轨迹记录
\app\common\model\app\physical\OrderExpressLog::where([
'order_express_id' => $orderExpress['id'],
'uniacid' => UNIACID
])->delete();
\app\common\model\order\Log::set($order['order_no'], "修改发货信息,快递公司:{$express['name']},运单号:{$express['no']}");
Db::commit();
$this->syncExpressInfo($orderExpress, $order);
} catch (\Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
return $express;
}
/**
* 查询物流信息
*/
public function query()
{
$orderExpressId = $this->request->param('order_express_id', 0);
if (!$orderExpressId) {
$this->error('发货单ID不能为空');
}
$orderExpress = $this->expressModel->where([
'id' => $orderExpressId,
'uniacid' => UNIACID
])->find();
if (!$orderExpress) {
$this->error('未找到发货单');
}
$expressLib = new Express();
$result = $expressLib->search([
'order_id' => $orderExpress['order_id'],
'express_code' => $orderExpress['express_code'],
'express_no' => $orderExpress['express_no']
], $orderExpress);
$this->success('查询成功', $result);
}
/**
* 刷新物流信息
*/
public function refresh()
{
$orderExpressId = $this->request->param('order_express_id', 0);
if (!$orderExpressId) {
$this->error('发货单ID不能为空');
}
$orderExpress = $this->expressModel->where([
'id' => $orderExpressId,
'uniacid' => UNIACID
])->find();
if (!$orderExpress) {
$this->error('未找到发货单');
}
$order = $this->orderModel->where([
'id' => $orderExpress['order_id'],
'uniacid' => UNIACID
])->find();
if (!$order) {
$this->error('未找到订单');
}
try {
$this->syncExpressInfo($orderExpress, $order);
$orderExpress = $this->expressModel->where([
'id' => $orderExpressId,
'uniacid' => UNIACID
])->find();
} catch (\Exception $e) {
$this->error('刷新失败:' . $e->getMessage());
}
$this->success('刷新成功', $orderExpress);
}
/**
* 同步物流信息
*/
private function syncExpressInfo($orderExpress, $order)
{
try {
$physicalConfig = \app\common\model\app\Config::getConfig('physical');
$aliyunConfig = [];
$aliyunConfig['appcode'] = $physicalConfig['express_app_code'] ?? '';
$expressLib = new Express('aliyun', $aliyunConfig);
// 使用 Express 库的更新方法
$expressLib->updateExpress($orderExpress);
} catch (\Exception $e) {
\think\Log::error('syncExpressInfo.Exception: ' . $e->getMessage());
}
}
/**
* 根据订单号获取收货信息
*/
public function getAddress()
{
$orderNo = $this->request->param('order_no', '');
if (empty($orderNo)) {
$this->error('订单号不能为空');
}
$order = $this->orderModel->where([
'order_no' => $orderNo,
'uniacid' => UNIACID
])->find();
if (!$order) {
$this->error('未找到订单');
}
if ($order['order_type'] != 'physical') {
$this->error('该订单不是实物商品订单');
}
$address = OrderAddress::where([
'order_id' => $order['id'],
'uniacid' => UNIACID
])->find();
if (!$address) {
$this->error('未找到收货地址');
}
$this->success('获取成功', $address);
}
/**
* 根据订单号编辑收货信息
*/
public function editAddress()
{
$orderNo = $this->request->param('order_no', '');
if (empty($orderNo)) {
$this->error('订单号不能为空');
}
$order = $this->orderModel->where([
'order_no' => $orderNo,
'uniacid' => UNIACID
])->find();
if (!$order) {
$this->error('未找到订单');
}
if ($order['order_type'] != 'physical') {
$this->error('该订单不是实物商品订单');
}
$orderStatus = \app\common\constant\order\Status::STATUS_UNSEND;
if ($order['status'] != $orderStatus) {
$this->error('该订单状态不允许修改收货信息');
}
$consignee = $this->request->param('consignee', '');
$mobile = $this->request->param('mobile', '');
$province = $this->request->param('province', '');
$city = $this->request->param('city', '');
$district = $this->request->param('district', '');
$address = $this->request->param('address', '');
if (empty($consignee)) {
$this->error('收货人不能为空');
}
if (empty($mobile)) {
$this->error('联系电话不能为空');
}
if (empty($address)) {
$this->error('详细地址不能为空');
}
$orderAddress = OrderAddress::where([
'order_id' => $order['id'],
'uniacid' => UNIACID
])->find();
Db::startTrans();
try {
if ($orderAddress) {
$orderAddress->save([
'consignee' => $consignee,
'mobile' => $mobile,
'province_name' => $province,
'city_name' => $city,
'district_name' => $district,
'address' => $address,
'updatetime' => time()
]);
} else {
OrderAddress::create([
'uniacid' => UNIACID,
'order_id' => $order['id'],
'user_id' => $order['user_id'],
'consignee' => $consignee,
'mobile' => $mobile,
'province_name' => $province,
'city_name' => $city,
'district_name' => $district,
'address' => $address,
'createtime' => time(),
'updatetime' => time()
]);
}
\app\common\model\order\Log::set($order['order_no'], "修改收货信息:{$consignee}{$mobile}{$province}{$city}{$district}{$address}");
Db::commit();
} catch (\Exception $e) {
Db::rollback();
$this->error('修改失败:' . $e->getMessage());
}
$this->success('修改成功');
}
}