You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
505 lines
18 KiB
505 lines
18 KiB
2 months ago
|
<?php
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
|
||
|
// +----------------------------------------------------------------------
|
||
|
// | Author: CRMEB Team <admin@crmeb.com>
|
||
|
// +----------------------------------------------------------------------
|
||
|
|
||
|
namespace app\controller\out;
|
||
|
|
||
|
use app\Request;
|
||
|
use app\services\order\StoreOrderCartInfoServices;
|
||
|
use app\services\order\StoreOrderDeliveryServices;
|
||
|
use app\services\order\StoreOrderInvoiceServices;
|
||
|
use app\services\order\StoreOrderRefundServices;
|
||
|
use app\services\order\StoreOrderTakeServices;
|
||
|
use app\services\other\ExpressServices;
|
||
|
use app\services\out\OutStoreOrderRefundServices;
|
||
|
use app\services\out\OutStoreOrderServices;
|
||
|
use app\services\order\StoreOrderServices;
|
||
|
|
||
|
/**
|
||
|
* Class Order
|
||
|
* @package app\kefuapi\controller
|
||
|
*/
|
||
|
class Order
|
||
|
{
|
||
|
/**
|
||
|
* 订单services
|
||
|
* @var StoreOrderServices
|
||
|
*/
|
||
|
protected $orderServices;
|
||
|
|
||
|
/**
|
||
|
* 退款订单services
|
||
|
* @var StoreOrderRefundServices
|
||
|
*/
|
||
|
protected $refundServices;
|
||
|
|
||
|
/**
|
||
|
* @param StoreOrderServices $orderServices
|
||
|
* @param StoreOrderRefundServices $refundServices
|
||
|
*/
|
||
|
public function __construct(StoreOrderServices $orderServices, StoreOrderRefundServices $refundServices)
|
||
|
{
|
||
|
$this->orderServices = $orderServices;
|
||
|
$this->refundServices = $refundServices;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 订单列表
|
||
|
* @param Request $request
|
||
|
* @param OutStoreOrderServices $outStoreOrderServices
|
||
|
* @return \think\Response
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function orderList(Request $request, OutStoreOrderServices $outStoreOrderServices)
|
||
|
{
|
||
|
$where = $request->getMore([
|
||
|
['status', ''],
|
||
|
['real_name', ''],
|
||
|
['is_del', ''],
|
||
|
['data', '', '', 'time'],
|
||
|
['type', ''],
|
||
|
['pay_type', ''],
|
||
|
['order', ''],
|
||
|
['field_key', ''],
|
||
|
['supplier_id', ''],
|
||
|
['paid', '']
|
||
|
]);
|
||
|
$where['type'] = trim($where['type']);
|
||
|
$where['is_system_del'] = 0;
|
||
|
|
||
|
$where['store_id'] = 0;
|
||
|
$where['type'] = trim($where['type'], ' ');
|
||
|
return app('json')->success($outStoreOrderServices->getOrderList($where));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 订单详情
|
||
|
* @param OutStoreOrderServices $outStoreOrderServices
|
||
|
* @param $order_id
|
||
|
* @return \think\Response
|
||
|
*/
|
||
|
public function orderInfo(OutStoreOrderServices $outStoreOrderServices, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail(100100);
|
||
|
return app('json')->success($outStoreOrderServices->getInfo($order_id));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 订单备注
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function orderRemark(Request $request, $order_id)
|
||
|
{
|
||
|
$data = $request->postMore([['remark', '']]);
|
||
|
if (!$data['remark'])
|
||
|
return app('json')->fail('请输入要备注的内容');
|
||
|
if (!$order_id)
|
||
|
return app('json')->fail('缺少参数');
|
||
|
|
||
|
if (!$order = $this->orderServices->get(['order_id' => $order_id])) {
|
||
|
return app('json')->fail('修改的订单不存在!');
|
||
|
}
|
||
|
$order->remark = $data['remark'];
|
||
|
if ($order->save()) {
|
||
|
return app('json')->success('备注成功');
|
||
|
} else
|
||
|
return app('json')->fail('备注失败');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 订单收货
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function orderReceive($order_id)
|
||
|
{
|
||
|
/** @var StoreOrderTakeServices $takeOrderServices */
|
||
|
$takeOrderServices = app()->make(StoreOrderTakeServices::class);
|
||
|
$uid = $this->orderServices->value(['order_id' => $order_id], 'uid');
|
||
|
$takeOrderServices->takeOrder($order_id, $uid);
|
||
|
return app('json')->success('收货成功');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 查询物流公司
|
||
|
* @param ExpressServices $services
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function orderExpressList(ExpressServices $services)
|
||
|
{
|
||
|
$data['is_show'] = 1;
|
||
|
|
||
|
return app('json')->success($services->express($data));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 订单发货
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function orderDelivery(Request $request, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail('参数错误');
|
||
|
$data = $request->postMore([
|
||
|
['delivery_name', ''],//快递公司名称
|
||
|
['delivery_id', ''],//快递单号
|
||
|
['delivery_code', ''],//快递公司编码
|
||
|
]);
|
||
|
$data['express_record_type'] = 1;
|
||
|
$data['type'] = 1;
|
||
|
/** @var StoreOrderDeliveryServices $deliveryServices */
|
||
|
$deliveryServices = app()->make(StoreOrderDeliveryServices::class);
|
||
|
$id = $this->orderServices->value(['order_id' => $order_id], 'id');
|
||
|
$deliveryServices->delivery($id, $data);
|
||
|
return app('json')->success('发货成功');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 修改配送信息
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function updateDistribution(Request $request, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail(100100);
|
||
|
$data = $request->postMore([
|
||
|
['delivery_name', ''],
|
||
|
['delivery_code', ''],
|
||
|
['delivery_id', '']
|
||
|
]);
|
||
|
/** @var StoreOrderDeliveryServices $deliveryServices */
|
||
|
$deliveryServices = app()->make(StoreOrderDeliveryServices::class);
|
||
|
$id = $this->orderServices->value(['order_id' => $order_id], 'id');
|
||
|
$deliveryServices->updateDistribution($id, $data);
|
||
|
return app('json')->success('修改成功');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取订单可拆分商品列表
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function SplitCartInfo($order_id)
|
||
|
{
|
||
|
if (!$order_id) {
|
||
|
return app('json')->fail('缺少发货ID');
|
||
|
}
|
||
|
$id = $this->orderServices->value(['order_id' => $order_id], 'id');
|
||
|
/** @var StoreOrderCartInfoServices $orderCartServices */
|
||
|
$orderCartServices = app()->make(StoreOrderCartInfoServices::class);
|
||
|
return app('json')->success($orderCartServices->getSplitCartList((int)$id));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 拆单发货
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function orderSplitDelivery(Request $request, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail('参数错误');
|
||
|
$data = $request->postMore([
|
||
|
['delivery_name', ''],//快递公司名称
|
||
|
['delivery_id', ''],//快递单号
|
||
|
['delivery_code', ''],//快递公司编码
|
||
|
['fictitious_content', ''],//虚拟发货内容
|
||
|
['cart_ids', []]
|
||
|
]);
|
||
|
|
||
|
if (!$data['cart_ids']) {
|
||
|
return app('json')->fail('参数错误');
|
||
|
}
|
||
|
foreach ($data['cart_ids'] as &$cart) {
|
||
|
if (!isset($cart['cart_id']) || !$cart['cart_id'] || !isset($cart['cart_num']) || !$cart['cart_num']) {
|
||
|
return app('json')->fail('数据不存在');
|
||
|
}
|
||
|
$cart['cart_id'] = (int)$cart['cart_id'];
|
||
|
$cart['cart_num'] = (int)$cart['cart_num'];
|
||
|
}
|
||
|
$data['express_record_type'] = 1;
|
||
|
$data['type'] = 1;
|
||
|
/** @var StoreOrderDeliveryServices $deliveryServices */
|
||
|
$deliveryServices = app()->make(StoreOrderDeliveryServices::class);
|
||
|
$id = $this->orderServices->value(['order_id' => $order_id], 'id');
|
||
|
$deliveryServices->splitDelivery($id, $data);
|
||
|
return app('json')->success('发货成功');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 修改订单开票信息
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function setInvoice(Request $request, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail(100100);
|
||
|
$data = $request->postMore([
|
||
|
[['header_type', 'd'], 1],
|
||
|
[['type', 'd'], 1],
|
||
|
['drawer_phone', ''],
|
||
|
['email', ''],
|
||
|
['name', ''],
|
||
|
['duty_number', ''],
|
||
|
['tell', ''],
|
||
|
['address', ''],
|
||
|
['bank', ''],
|
||
|
['card_number', ''],
|
||
|
]);
|
||
|
|
||
|
if (!$data['drawer_phone']) return app('json')->fail('请填写开票手机号');
|
||
|
if (!check_phone($data['drawer_phone'])) return app('json')->fail('手机号格式不正确');
|
||
|
if (!$data['name']) return app('json')->fail('请填写发票抬头(开具发票企业名称)');
|
||
|
if (!in_array($data['header_type'], [1, 2])) {
|
||
|
$data['header_type'] = empty($data['duty_number']) ? 1 : 2;
|
||
|
}
|
||
|
if ($data['header_type'] == 1 && !preg_match('/^[\x80-\xff]{2,60}$/', $data['name'])) {
|
||
|
return app('json')->fail('请填写发票抬头(开具发票企业名称)');
|
||
|
}
|
||
|
if ($data['header_type'] == 2 && !preg_match('/^[0-9a-zA-Z&\(\)\(\)\x80-\xff]{2,150}$/', $data['name'])) {
|
||
|
return app('json')->fail('请填写发票抬头(开具发票企业名称)');
|
||
|
}
|
||
|
if ($data['header_type'] == 2 && !$data['duty_number']) {
|
||
|
return app('json')->fail('请填写发票税号');
|
||
|
}
|
||
|
if ($data['header_type'] == 2 && !preg_match('/^[A-Z0-9]{15}$|^[A-Z0-9]{17}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/', $data['duty_number'])) {
|
||
|
return app('json')->fail('请填写正确的发票税号');
|
||
|
}
|
||
|
if ($data['card_number'] && !preg_match('/^[1-9]\d{11,19}$/', $data['card_number'])) {
|
||
|
return app('json')->fail('请填写正确的银行卡号');
|
||
|
}
|
||
|
$orderInfo = $this->orderServices->get(['order_id' => $order_id], ['id'], ['invoice']);
|
||
|
if (!$orderInfo) return app('json')->fail('订单不存在');
|
||
|
if (!$orderInfo->invoice || !$invoiceId = $orderInfo->invoice->id) {
|
||
|
return app('json')->fail('订单未提交开票申请');
|
||
|
}
|
||
|
/** @var StoreOrderInvoiceServices $invoiceServices */
|
||
|
$invoiceServices = app()->make(StoreOrderInvoiceServices::class);
|
||
|
if ($invoiceServices->setInvoice($invoiceId, $data)) {
|
||
|
return app('json')->success('修改成功');
|
||
|
} else {
|
||
|
return app('json')->fail('修改失败');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function setInvoiceStatus(Request $request, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail(100100);
|
||
|
$data = $request->postMore([
|
||
|
['is_invoice', 0],
|
||
|
['invoice_number', 0],
|
||
|
['remark', '']
|
||
|
]);
|
||
|
|
||
|
if ($data['is_invoice'] == 1 && !$data['invoice_number']) {
|
||
|
return app('json')->fail('请填写开票号');
|
||
|
}
|
||
|
if ($data['invoice_number'] && !preg_match('/^\d{8,10}$/', $data['invoice_number'])) {
|
||
|
return app('json')->fail('请填写正确的开票号');
|
||
|
}
|
||
|
$orderInfo = $this->orderServices->get(['order_id' => $order_id], ['id'], ['invoice']);
|
||
|
if (!$orderInfo) return app('json')->fail('订单不存在');
|
||
|
if (!$orderInfo->invoice || !$invoiceId = $orderInfo->invoice->id) {
|
||
|
return app('json')->fail('订单未提交开票申请');
|
||
|
}
|
||
|
/** @var StoreOrderInvoiceServices $invoiceServices */
|
||
|
$invoiceServices = app()->make(StoreOrderInvoiceServices::class);
|
||
|
$invoiceServices->setInvoice($invoiceId, $data);
|
||
|
return app('json')->success('修改成功');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 售后单列表
|
||
|
* @param Request $request
|
||
|
* @return \think\Response
|
||
|
*/
|
||
|
public function refundList(Request $request, OutStoreOrderRefundServices $outStoreOrderRefundServices)
|
||
|
{
|
||
|
$where = $request->getMore([
|
||
|
['order_id', ''],
|
||
|
['time', ''],
|
||
|
['refund_type', 0]
|
||
|
]);
|
||
|
$where['is_cancel'] = 0;
|
||
|
return app('json')->success($outStoreOrderRefundServices->refundList($where));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 退款单详情
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function refundInfo(OutStoreOrderRefundServices $outStoreOrderRefundServices, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail('缺少参数');
|
||
|
$data = $outStoreOrderRefundServices->getInfo($order_id);
|
||
|
return app('json')->success($data);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 退款单备注
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function refundRemark(Request $request, $order_id)
|
||
|
{
|
||
|
$data = $request->postMore([['remark', '']]);
|
||
|
if (!$data['remark']) return app('json')->fail('请输入要备注的内容');
|
||
|
if (!$order_id) return app('json')->fail('缺少参数');
|
||
|
if (!$order = $this->refundServices->get(['order_id' => $order_id])) {
|
||
|
return app('json')->fail('修改的订单不存在!');
|
||
|
}
|
||
|
$order->remark = $data['remark'];
|
||
|
if ($order->save()) {
|
||
|
return app('json')->success('备注成功');
|
||
|
} else
|
||
|
return app('json')->fail('备注失败');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 退款单退款
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function refundPrice(Request $request, $order_id)
|
||
|
{
|
||
|
$data = $request->postMore([
|
||
|
['refund_price', 0],
|
||
|
['type', 1],
|
||
|
['refuse_reason', '']
|
||
|
]);
|
||
|
if (!$order_id) {
|
||
|
return app('json')->fail('数据不存在');
|
||
|
}
|
||
|
$orderRefund = $this->refundServices->get(['order_id' => $order_id]);
|
||
|
if (!$orderRefund) {
|
||
|
return app('json')->fail('数据不存在');
|
||
|
}
|
||
|
if ($orderRefund['is_cancel'] == 1) {
|
||
|
return app('json')->fail('用户已取消申请');
|
||
|
}
|
||
|
$order = $this->orderServices->get((int)$orderRefund['store_order_id']);
|
||
|
if (!$order) {
|
||
|
return app('json')->fail('数据不存在');
|
||
|
}
|
||
|
if (!in_array($orderRefund['refund_type'], [0, 1, 2, 5]) && !($orderRefund['refund_type'] == 4 && $orderRefund['apply_type'] == 3)) {
|
||
|
return app('json')->fail('售后订单状态不支持该操作');
|
||
|
}
|
||
|
if ($data['type'] == 1) {
|
||
|
$data['refund_type'] = 6;
|
||
|
} else if ($data['type'] == 2) {
|
||
|
$data['refund_type'] = 3;
|
||
|
}
|
||
|
$data['refunded_time'] = time();
|
||
|
$type = $data['type'];
|
||
|
//拒绝退款
|
||
|
if ($type == 2) {
|
||
|
$this->refundServices->refuseRefund((int)$orderRefund['id'], $data, $orderRefund);
|
||
|
return app('json')->successful('修改退款状态成功!');
|
||
|
} else {
|
||
|
//0元退款
|
||
|
if ($orderRefund['refund_price'] == 0) {
|
||
|
$refund_price = 0;
|
||
|
} else {
|
||
|
if (!$data['refund_price']) {
|
||
|
return app('json')->fail('请输入退款金额');
|
||
|
}
|
||
|
if ($orderRefund['refund_price'] == $orderRefund['refunded_price']) {
|
||
|
return app('json')->fail('已退完支付金额!不能再退款了');
|
||
|
}
|
||
|
$refund_price = $data['refund_price'];
|
||
|
$data['refunded_price'] = bcadd($data['refund_price'], $orderRefund['refunded_price'], 2);
|
||
|
$bj = bccomp((string)$orderRefund['refund_price'], (string)$data['refunded_price'], 2);
|
||
|
if ($bj < 0) {
|
||
|
return app('json')->fail('退款金额大于支付金额,请修改退款金额');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unset($data['type']);
|
||
|
$refund_data['pay_price'] = $order['pay_price'];
|
||
|
$refund_data['refund_price'] = $refund_price;
|
||
|
if ($order['refund_price'] > 0) {
|
||
|
mt_srand();
|
||
|
$refund_data['refund_id'] = $order['order_id'] . rand(100, 999);
|
||
|
}
|
||
|
//修改订单退款状态
|
||
|
unset($data['refund_price']);
|
||
|
if ($this->refundServices->agreeRefund($orderRefund['id'], $refund_data)) {
|
||
|
$this->refundServices->update($orderRefund['id'], $data);
|
||
|
return app('json')->success('退款成功');
|
||
|
} else {
|
||
|
$this->refundServices->storeProductOrderRefundYFasle((int)$orderRefund['id'], $refund_price);
|
||
|
return app('json')->fail('退款失败');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 同意退货
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function agreeRefund($order_id)
|
||
|
{
|
||
|
$this->refundServices->agreeRefundProdcut((int)$order_id);
|
||
|
return app('json')->success('操作成功');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 拒绝退款
|
||
|
* @param Request $request
|
||
|
* @param $order_id
|
||
|
* @return mixed
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
*/
|
||
|
public function refuseRefund(Request $request, $order_id)
|
||
|
{
|
||
|
if (!$order_id) return app('json')->fail('订单不存在');
|
||
|
if (!$orderRefundInfo = $this->refundServices->get(['order_id' => $order_id])) return app('json')->fail('订单不存在');
|
||
|
[$refund_reason] = $request->postMore([['refund_reason', '']], true);
|
||
|
if (!$refund_reason) {
|
||
|
return app('json')->fail('请输入不退款原因');
|
||
|
}
|
||
|
$refundData = [
|
||
|
'refuse_reason' => $refund_reason,
|
||
|
'refund_type' => 3,
|
||
|
'refunded_time' => time()
|
||
|
];
|
||
|
//拒绝退款处理
|
||
|
$this->refundServices->refuseRefund((int)$orderRefundInfo['id'], $refundData, $orderRefundInfo);
|
||
|
|
||
|
return app('json')->success('Modified success');
|
||
|
}
|
||
|
|
||
|
}
|