徐总多门店
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.
 
 
 
 
 
 

1082 lines
40 KiB

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\controller\cashier;
use app\common\controller\Order as CommonOrder;
use app\jobs\system\SocketPushJob;
use app\Request;
use app\services\order\OtherOrderServices;
use app\services\activity\coupon\StoreCouponIssueServices;
use app\services\cashier\OrderServices;
use app\services\order\cashier\CashierOrderServices;
use app\services\order\cashier\StoreHangOrderServices;
use app\services\order\store\WriteOffOrderServices;
use app\services\store\StoreDrinkSaveServices;
use app\services\store\StoreDrinkLogServices;
use app\services\order\StoreCartServices;
use app\services\order\StoreOrderDeliveryServices;
use app\services\order\StoreOrderRefundServices;
use app\services\order\StoreOrderServices;
use app\services\order\StoreOrderSplitServices;
use app\services\pay\PayServices;
use app\services\store\DeliveryServiceServices;
use app\services\user\UserServices;
use app\services\user\UserRechargeServices;
use crmeb\services\AliPayService;
use crmeb\services\CacheService;
use crmeb\services\wechat\Payment;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\facade\App;
use think\db;
/**
* 收银台订单控制器
*/
class Order extends AuthController
{
use CommonOrder;
/**
* StoreOrder constructor.
* @param App $app
* @param StoreOrderServices $service
*/
public function __construct(App $app, StoreOrderServices $service)
{
parent::__construct($app);
$this->services = $service;
}
/**
* 获取收银订单用户
* @param OrderServices $services
* @param $storeId
* @param $cashierId
* @return mixed
*/
public function getUserList(OrderServices $services, $cashierId)
{
$data = $services->getOrderUserList($this->storeId);
return $this->success($data);
}
/**
* 获取门店订单列表
* @param Request $request
* @param StoreOrderServices $services
* @param UserRechargeServices $rechargeServices
* @param OtherOrderServices $otherOrderServices
* @param $orderType
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function getOrderList(Request $request, StoreOrderServices $services, UserRechargeServices $rechargeServices, OtherOrderServices $otherOrderServices, $orderType = 1)
{
if (!$orderType) $orderType = 1;
$where = $request->postMore([
['type', ''],
['pay_type', ''],
['status', ''],
['time', ''],
['staff_id', ''],
['keyword', '', '', 'real_name']
]);
if ($where['time'] && is_array($where['time']) && count($where['time']) == 2) {
[$start, $end] = $where['time'];
if (strtotime($start) > strtotime($end)) {
return $this->fail('开始时间不能大于结束时间,请重新选择时间');
}
}
$where['store_id'] = $this->storeId;
if (!$where['real_name'] && !in_array($where['status'], [-1, -2, -3])) {
$where['pid'] = 0;
}
switch ($orderType) {
case 1:
case 5:
$where['is_system_del'] = 0;
$with = [
'user',
'split' => function ($query) {
$query->field('id,pid');
},
'pink',
'invoice',
'storeStaff'
];
$data = $services->getOrderList($where, ['*'], $with, true, 'add_time desc,status asc,refund_status asc');
$list = $data['data'] ?? [];
if ($list) {
/** @var StoreCouponIssueServices $couponIssueService */
$couponIssueService = app()->make(StoreCouponIssueServices::class);
foreach ($list as $key => &$item) {
if ($item['give_coupon']) {
$couponIds = is_string($item['give_coupon']) ? explode(',', $item['give_coupon']) : $item['give_coupon'];
$item['give_coupon'] = $couponIssueService->getColumn([['id', 'IN', $couponIds]], 'id,coupon_title');
}
}
}
$count = $data['count'] ?? 0;
return $this->success(compact('list', 'count'));
case 2:
return $this->success($rechargeServices->getRechargeList($where, '*', 0, ['staff', 'user']));
case 3:
$where['paid'] = 1;
return $this->success($otherOrderServices->getMemberRecord($where));
}
return $this->success(['list' => [], 'count' => 0]);
}
/**获取单个订单信息
* @param Request $request
* @param StoreOrderServices $services
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function getOneOrder(Request $request, StoreOrderServices $services)
{
$where = $request->postMore([
['order_id', ''],
['uid', '']
]);
$detail = $services->getOneOrderList($where['order_id'], $where['uid'],
[
'user',
'split' => function ($query) {
$query->field('id,pid');
},
'pink',
'invoice',
'storeStaff'
]
);
return $this->success($detail);
}
/**
* 获取收银台挂单列表
* @param Request $request
* @param StoreHangOrderServices $services
* @param int $cashierId
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function getHangList(Request $request, StoreHangOrderServices $services, $cashierId = 0)
{
$search = $request->get('keyword', '');
$data = $services->getHangOrderList((int)$this->storeId, 0, $search);
$data['list'] = $data['data'];
unset($data['data']);
return $this->success($data);
}
/**
* 收银台退款订单列表
* @param Request $request
* @param StoreOrderRefundServices $service
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function getRefundList(Request $request, StoreOrderRefundServices $service)
{
$where = $request->getMore([
['keyword', '', '', 'order_id'],
['time', ''],
['refund_type', 0]
]);
$where['store_id'] = $this->storeId;
return $this->success($service->refundList($where));
}
/**
* 收银台核销订单
* @param Request $request
* @param StoreOrderServices $services
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function getVerifyList(Request $request, StoreOrderServices $services)
{
$where = $request->postMore([
['status', ''],
['time', ''],
['staff_id', ''],
['keyword', '', '', 'real_name']
]);
if ($where['time'] && is_array($where['time']) && count($where['time']) == 2) {
[$start, $end] = $where['time'];
if (strtotime($start) > strtotime($end)) {
return $this->fail('开始时间不能大于结束时间,请重新选择时间');
}
}
$where['is_system_del'] = 0;
$where['type'] = 105;
$where['store_id'] = $this->storeId;
if (!$where['real_name'] && !in_array($where['status'], [-1, -2, -3])) {
$where['pid'] = 0;
}
$result = $services->getOrderList($where, ['*'], ['split' => function ($query) {
$query->field('id,pid');
}, 'pink', 'invoice', 'storeStaff'], true);
if ($result['data']) {
/** @var StoreCouponIssueServices $couponIssueService */
$couponIssueService = app()->make(StoreCouponIssueServices::class);
foreach ($result['data'] as $key => &$item) {
if ($item['give_coupon']) {
$couponIds = is_string($item['give_coupon']) ? explode(',', $item['give_coupon']) : $item['give_coupon'];
$item['give_coupon'] = $couponIssueService->getColumn([['id', 'IN', $couponIds]], 'id,coupon_title');
}
}
}
return $this->success($result);
}
/**
* 退款订单详情
* @param StoreOrderRefundServices $service
* @param UserServices $userServices
* @param $id
* @return mixed
*/
public function refundInfo(StoreOrderRefundServices $service, UserServices $userServices, $id)
{
$order = $service->refundDetail($id);
$order['total_price'] = floatval(bcadd((string)$order['total_price'], (string)$order['vip_true_price'], 2));
$data['orderInfo'] = $order;
$userInfo = ['spread_uid' => '', 'spread_name' => '无'];
if ($order['uid']) {
$userInfo = $userServices->getUserWithTrashedInfo((int)$order['uid']);
if (!$userInfo) return $this->fail('用户信息不存在');
$userInfo = $userInfo->hidden(['pwd', 'add_ip', 'last_ip', 'login_type']);
$userInfo = $userInfo->toArray();
$userInfo['spread_name'] = '无';
if ($order['spread_uid']) {
$spreadName = $userServices->value(['uid' => $order['spread_uid']], 'nickname');
if ($spreadName) {
$userInfo['spread_name'] = $order['uid'] == $order['spread_uid'] ? $spreadName . '(自购)' : $spreadName;
$userInfo['spread_uid'] = $order['spread_uid'];
} else {
$userInfo['spread_uid'] = '';
}
} else {
$userInfo['spread_uid'] = '';
}
}
$data['userInfo'] = $userInfo;
return $this->success('ok', $data);
}
/**
* 加入购物车
* @param Request $request
* @param StoreCartServices $services
* @param $uid
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function addCart(Request $request, StoreCartServices $services, $uid)
{
$where = $request->postMore([
['productId', 0],//普通商品编号
[['cartNum', 'd'], 1], //购物车数量
['uniqueId', ''],//属性唯一值
['staff_id', ''],//店员ID
['secKillId', 0],//秒杀ID
['new', 1],//1直接购买,0=加入购物车
['tourist_uid', ''],//虚拟用户uid
[['secKillId', 'd'], 0],//秒杀商品编号
]);
$new = !!$where['new'];
if (!$where['productId']) {
return app('json')->fail('参数错误');
}
//真实用户存在,虚拟用户uid为空
if ($uid) {
$where['tourist_uid'] = '';
}
if (!$uid && !$where['tourist_uid']) {
return $this->fail('缺少用户UID');
}
$services->setItem('store_id', $this->storeId)
->setItem('tourist_uid', $where['tourist_uid'])
->setItem('staff_id', $where['staff_id']);
$activityId = $type = 0;
if ($where['secKillId']) {
$type = 1;
$activityId = $where['secKillId'];
}
[$cartId, $cartNum] = $services->setCart($uid, (int)$where['productId'], (int)$where['cartNum'], $where['uniqueId'], $type, $new, (int)$activityId);
$services->reset();
SocketPushJob::dispatch([$this->cashierId, 'changCart', ['uid' => $uid], 'cashier']);
return $this->success(['cartId' => $cartId]);
}
/**
* 收银台更改购物车数量
* @param Request $request
* @param StoreCartServices $services
* @param $uid
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function numCart(Request $request, StoreCartServices $services, $uid)
{
$where = $request->postMore([
['id', 0],//购物车编号
['number', 0],//购物数量
]);
if (!$where['id'] || !$where['number'] || !is_numeric($where['id']) || !is_numeric($where['number'])) {
return $this->fail('参数错误!');
}
if ($services->changeCashierCartNum((int)$where['id'], (int)$where['number'], $uid, $this->storeId)) {
//发送消息
SocketPushJob::dispatch([$this->cashierId, 'changCart', ['uid' => $uid], 'cashier']);
return $this->success('修改成功');
} else {
return $this->fail('修改失败');
}
}
/**
* 收银台删除购物车信息
* @param Request $request
* @param StoreCartServices $services
* @param $uid
* @return mixed
*/
public function delCart(Request $request, StoreCartServices $services, $uid)
{
$where = $request->postMore([
['ids', []],//购物车编号
]);
if (!count($where['ids'])) {
return $this->fail('参数错误!');
}
if ($services->removeUserCart((int)$uid, $where['ids'])) {
//发送消息
SocketPushJob::dispatch([$this->cashierId, 'changCart', ['uid' => $uid], 'cashier']);
return $this->success('删除成功');
} else {
return $this->fail('清除失败!');
}
}
/**
* 收银台重选商品规格
* @param Request $request
* @param StoreCartServices $services
* @return mixed
*/
public function changeCart(Request $request, StoreCartServices $services)
{
[$cart_id, $product_id, $unique] = $request->postMore([
['cart_id', 0],
['product_id', 0],
['unique', '']
], true);
$services->modifyCashierCart($this->storeId, (int)$cart_id, (int)$product_id, $unique);
//发送消息
SocketPushJob::dispatch([$this->cashierId, 'changCart', [], 'cashier']);
return $this->success('重选成功');
}
/**
* 获取购物车数据
* @param Request $request
* @param StoreCartServices $services
* @param $uid
* @param $cashierId
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getCartList(Request $request, StoreCartServices $services, $uid, $cashierId)
{
$cartIds = $request->get('cart_ids', '');
$touristUid = $request->get('tourist_uid', '');
$new = $request->get('new', false);
$cartIds = $cartIds ? explode(',', $cartIds) : [];
if (!$touristUid && !$uid) {
return $this->fail('缺少用户信息');
}
$result = $services->getUserCartList((int)$uid, -1, $cartIds, $this->storeId, -1, 4, (int)$touristUid, 0, $new);
$result['valid'] = $services->getReturnCartList($result['valid'] ?? [], $result['promotions'] ?? []);
unset($result['promotions']);
return $this->success($result);
}
/**
* 收银台计算订单金额
* @param Request $request
* @param CashierOrderServices $services
* @param $uid
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function orderCompute(Request $request, CashierOrderServices $services, $uid)
{
[$integral, $coupon, $cartIds, $coupon_id, $new] = $request->postMore([
['integral', 0],
['coupon', 0],
['cart_id', []],
['coupon_id', 0],
['new', 0]
], true);
if (!$cartIds) {
return $this->fail('缺少购物车ID');
}
$socket = $request->post('socket', '');
//发送消息
if (!$socket) {
SocketPushJob::dispatch([$this->cashierId, 'changCompute', [
'uid' => $uid,
'post_data' => [
'integral' => $integral,
'coupon' => $coupon,
'cart_id' => $cartIds,
'coupon_id' => $coupon_id,
'new' => $new,
],
], 'cashier']);
}
return $this->success($services->computeOrder((int)$uid, (int)$this->storeId, $cartIds, !!$integral, !!$coupon, [], $coupon_id, !!$new));
}
/**
* 生成订单
* @param CashierOrderServices $services
* @param $uid
* @return mixed
*/
public function createOrder(CashierOrderServices $services, $uid)
{
[$integral, $coupon, $cartIds, $payType, $remarks, $staffId, $changePrice, $isPrice, $userCode, $coupon_id, $authCode, $touristUid, $seckillId, $collate_code_id, $new] = $this->request->postMore([
['integral', 0],
['coupon', 0],
['cart_id', []],
['pay_type', ''],
['remarks', ''],
['staff_id', 0],
['change_price', 0],
['is_price', 0],
['userCode', ''],
['coupon_id', 0],
['auth_code', ''],
['tourist_uid', ''],
['seckill_id', 0],
['collate_code_id', 0],//拼单ID 、桌码ID
['new', 0]
], true);
if (!$staffId) {
$staffId = $this->request->cashierId();
}
if (!$cartIds) {
return $this->fail('缺少购物车ID');
}
if (!$payType && !$authCode) return $this->fail('缺少参数');
if (!in_array($payType, ['yue', 'cash']) && $authCode) {
if (Payment::isWechatAuthCode($authCode)) {
$payType = PayServices::WEIXIN_PAY;
} else if (AliPayService::isAliPayAuthCode($authCode)) {
$payType = PayServices::ALIAPY_PAY;
} else {
return $this->fail('未知,付款二维码');
}
}
$userInfo = [];
if ($uid) {
/** @var UserServices $userService */
$userService = app()->make(UserServices::class);
$userInfo = $userService->getUserInfo($uid);
if (!$userInfo) {
return $this->fail('用户不存在');
}
$userInfo = $userInfo->toArray();
}
$computeData = $services->computeOrder($uid, $this->storeId, $cartIds, $integral, $coupon, $userInfo, $coupon_id, !!$new);
$cartInfo = $computeData['cartInfo'];
try {
$res = $services->transaction(function () use ($services, $userInfo, $computeData, $authCode, $uid, $staffId, $cartIds, $payType, $integral, $coupon, $remarks, $changePrice, $isPrice, $userCode, $coupon_id, $seckillId, $collate_code_id) {
$orderInfo = $services->createOrder((int)$uid, $userInfo, $computeData, $this->storeId, (int)$staffId, $cartIds, $payType, !!$integral, !!$coupon, $remarks, $changePrice, !!$isPrice, $coupon_id, $seckillId, $collate_code_id);
if (in_array($payType, [PayServices::YUE_PAY, PayServices::CASH_PAY, PayServices::ALIAPY_PAY, PayServices::WEIXIN_PAY])) {
$res = $services->paySuccess($orderInfo['order_id'], $payType, $userCode, $authCode);
$res['order_id'] = $orderInfo['order_id'];
$res['oid'] = $orderInfo['id'];
return $res;
} else {
return ['status' => 'ORDER_CREATE', 'order_id' => $orderInfo['order_id'], 'oid' => $orderInfo['id']];
}
});
if (isset($res['status']) && $res['status'] === 'SUCCESS') {
//发送消息
SocketPushJob::dispatch([$this->cashierId, 'changSuccess', [], 'cashier']);
CacheService::redisHandler(CacheService::CASHIER_AUX_SCREEN_TAG . '_' . $this->storeId)->clear();
}
return app('json')->success($res);
} catch (\Throwable $e) {
//回退库存
if ($seckillId) {
foreach ($cartInfo as $item) {
if (!isset($item['product_attr_unique']) || !$item['product_attr_unique']) continue;
$type = $item['type'];
if (in_array($type, [1, 2, 3])) CacheService::setStock($item['product_attr_unique'], (int)$item['cart_num'], $type, false);
}
}
return app('json')->fail($e->getMessage());
}
}
/**
* 订单支付
* @param CashierOrderServices $services
* @param $orderId
* @return mixed
*/
public function payOrder(CashierOrderServices $services, $orderId)
{
if (!$orderId) {
return $this->fail('缺少订单号');
}
$payType = $this->request->post('payType', 'yue');
$userCode = $this->request->post('userCode', '');
$authCode = $this->request->post('auth_code', '');
$is_cashier_yue_pay_verify = (int)sys_config('is_cashier_yue_pay_verify'); // 收银台余额支付是否需要验证【是/否】
if ($payType == PayServices::YUE_PAY && !$userCode && $is_cashier_yue_pay_verify) {
return $this->fail('缺少用户余额支付CODE');
}
if (!in_array($payType, ['yue', 'cash']) && $authCode) {
if (Payment::isWechatAuthCode($authCode)) {
$payType = PayServices::WEIXIN_PAY;
} else if (AliPayService::isAliPayAuthCode($authCode)) {
$payType = PayServices::ALIAPY_PAY;
} else {
return $this->fail('未知,付款二维码');
}
}
$res = $services->paySuccess($orderId, $payType, $userCode, $authCode);
$res['order_id'] = $orderId;
if (isset($res['status']) && $res['status'] === 'SUCCESS') {
//发送消息
SocketPushJob::dispatch([$this->cashierId, 'changSuccess', [], 'cashier']);
CacheService::redisHandler(CacheService::CASHIER_AUX_SCREEN_TAG . '_' . $this->storeId)->clear();
}
return $this->success($res);
}
/**
* 订单核销订单数据
* @param Request $request
* @param WriteOffOrderServices $writeOffOrderServices
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function verifyCartInfo(Request $request, WriteOffOrderServices $writeOffOrderServices)
{
[$oid] = $request->postMore([
['oid', '']
], true);
return $this->success($writeOffOrderServices->getOrderCartInfo(0, (int)$oid, 0, (int)$this->cashierId, true));
}
/**
* 订单核销
* @param Request $request
* @param StoreOrderServices $services
* @param WriteOffOrderServices $writeOffOrderServices
* @param $id
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function writeOff(Request $request, StoreOrderServices $services, WriteOffOrderServices $writeOffOrderServices, $id)
{
if (!$id) {
return $this->fail('核销订单未查到!');
}
[$cart_ids] = $request->postMore([
['cart_ids', []]
], true);
if ($cart_ids) {
foreach ($cart_ids as $cart) {
if (!isset($cart['cart_id']) || !$cart['cart_id'] || !isset($cart['cart_num']) || !$cart['cart_num'] || $cart['cart_num'] <= 0) {
return $this->fail('请重新选择发货商品,或发货件数');
}
}
}
$orderInfo = $writeOffOrderServices->getOrderCartInfo(0, (int)$id, 0, (int)$this->cashierId);
$writeOffOrderServices->writeoffOrder(0, $orderInfo, $cart_ids, 0, (int)$this->cashierId);
return $this->success('核销成功');
}
/**
* 订单可用的优惠券列表
* @param Request $request
* @param CashierOrderServices $services
* @param $uid
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function couponList(Request $request, CashierOrderServices $services, $uid)
{
[$cartIds] = $request->postMore([
['cart_id', []],
], true);
if (!$uid) return $this->success([]);
return $this->success($services->getCouponList((int)$uid, $this->storeId, $cartIds));
}
/**
* 领取优惠券
*
* @param Request $request
* @return mixed
*/
public function couponReceive(Request $request, StoreCouponIssueServices $storeCouponIssueServices, UserServices $userServices, $uid)
{
[$couponId] = $request->getMore([
['couponId', 0]
], true);
if (!$uid || !$couponId || !is_numeric($couponId)) return app('json')->fail('参数错误!');
$userInfo = $userServices->getUserInfo($uid);
if (!$userInfo) {
return app('json')->fail('请选择用户');
}
$coupon = $storeCouponIssueServices->issueUserCoupon((int)$couponId, $userInfo);
if ($coupon) {
$coupon = $coupon->toArray();
return app('json')->success('领取成功', $coupon);
}
return app('json')->fail('领取失败');
}
/**
* 收银台删除挂单
* @param Request $request
* @param StoreCartServices $services
* @return mixed
*/
public function deleteHangOrder(Request $request, StoreCartServices $services)
{
$id = $request->get('id');
if (!$id) {
return $this->fail('缺少参数');
}
$id = explode(',', $id) ?: [];
if ($services->search(['id' => $id])->delete()) {
return $this->success('删除成功');
} else {
return $this->fail('删除失败');
}
}
/**
* 收银台售后订单退款
* @param Request $request
* @param StoreOrderServices $services
* @param StoreOrderRefundServices $refundService
* @param $id
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function agreeRefund(Request $request, StoreOrderServices $services, StoreOrderRefundServices $refundService, $id)
{
$data = $request->postMore([
['refund_price', 0],
['type', 1]
]);
if (!$id) {
return $this->fail('Data does not exist!');
}
$orderRefund = $refundService->get($id);
if (!$orderRefund) {
return $this->fail('Data does not exist!');
}
if ($orderRefund['is_cancel'] == 1) {
return $this->fail('用户已取消申请');
}
$order = $services->get((int)$orderRefund['store_order_id']);
if (!$order) {
return $this->fail('Data does not exist!');
}
if (!in_array($orderRefund['refund_type'], [0, 1, 2, 5]) && !($orderRefund['refund_type'] == 4 && $orderRefund['apply_type'] == 3)) {
return $this->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) {
$refundService->refuseRefund((int)$orderRefund['id'], $data, $orderRefund);
return $this->success('修改退款状态成功!');
} else {
//0元退款
if ($orderRefund['refund_price'] == 0) {
$refund_price = 0;
} else {
if (!$data['refund_price']) {
return $this->fail('请输入退款金额');
}
if ($orderRefund['refund_price'] == $orderRefund['refunded_price']) {
return $this->fail('已退完支付金额!不能再退款了');
}
$refund_price = $data['refund_price'];
$data['refunded_price'] = bcadd((string)$data['refund_price'], (string)$orderRefund['refunded_price'], 2);
$bj = bccomp((string)$orderRefund['refund_price'], (string)$data['refunded_price'], 2);
if ($bj < 0) {
return $this->fail('退款金额大于支付金额,请修改退款金额');
}
}
unset($data['type']);
$refund_data['pay_price'] = $order['pay_price'];
$refund_data['refund_price'] = $refund_price;
//修改订单退款状态
unset($data['refund_price']);
if ($refundService->agreeRefund($id, $refund_data)) {
//退款处理
$refundService->update($id, $data);
return $this->success('退款成功');
} else {
$refundService->storeProductOrderRefundYFasle((int)$id, $refund_price);
return $this->fail('退款失败');
}
}
}
/**
* 收银台获取配送员
* @param DeliveryServiceServices $services
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function getDeliveryList(DeliveryServiceServices $services)
{
return $this->success($services->getDeliveryList(1, $this->storeId));
}
/**
* 面单默认配置信息
* @return mixed
*/
public function getSheetInfo()
{
return $this->success([
'express_temp_id' => store_config($this->storeId, 'store_config_export_temp_id'),
'id' => store_config($this->storeId, 'store_config_export_id'),
'to_name' => store_config($this->storeId, 'store_config_export_to_name'),
'to_tel' => store_config($this->storeId, 'store_config_export_to_tel'),
'to_add' => store_config($this->storeId, 'store_config_export_to_address'),
'export_open' => (bool)store_config($this->storeId, 'store_config_export_open')
]);
}
/**
* 收银台订单发货
* @param Request $request
* @param StoreOrderDeliveryServices $services
* @param $id
* @return mixed
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws \think\db\exception\DbException
*/
public function updateDelivery(Request $request, StoreOrderDeliveryServices $services, $id)
{
$data = $request->postMore([
['type', 1],
['delivery_name', ''],//快递公司名称
['delivery_id', ''],//快递单号
['delivery_code', ''],//快递公司编码
['express_record_type', 2],//发货记录类型
['express_temp_id', ""],//电子面单模板
['to_name', ''],//寄件人姓名
['to_tel', ''],//寄件人电话
['to_addr', ''],//寄件人地址
['sh_delivery_name', ''],//送货人姓名
['sh_delivery_id', ''],//送货人电话
['sh_delivery_uid', ''],//送货人ID
['fictitious_content', ''],//虚拟发货内容
['cart_ids', []]
]);
if (!$id) {
return $this->fail('缺少发货ID');
}
if (!$data['cart_ids']) {
$res = $services->delivery((int)$id, $data, $this->cashierId);
return $this->success('发货成功', $res);
}
foreach ($data['cart_ids'] as $cart) {
if (!isset($cart['cart_id']) || !$cart['cart_id'] || !isset($cart['cart_num']) || !$cart['cart_num']) {
return $this->fail('请重新选择发货商品,或发货件数');
}
}
$res = $services->splitDelivery((int)$id, $data, $this->cashierId);
return $this->success('发货成功', $res);
}
/**
* 获取次卡商品核销表单
* @param WriteOffOrderServices $writeOffOrderServices
* @param $id
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function writeOrderFrom(WriteOffOrderServices $writeOffOrderServices, $id)
{
if (!$id) {
return $this->fail('缺少核销订单ID');
}
[$cart_num] = $this->request->getMore([
['cart_num', 1]
], true);
return $this->success($writeOffOrderServices->writeOrderFrom((int)$id, (int)$this->cashierId, (int)$cart_num));
}
/**
* 次卡商品核销表单提交
* @param WriteOffOrderServices $writeOffOrderServices
* @param $id
* @return \think\Response
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function writeoffFrom(WriteOffOrderServices $writeOffOrderServices, $id)
{
if (!$id) {
return $this->fail('缺少核销订单ID');
}
$orderInfo = $this->services->getOne(['id' => $id, 'is_del' => 0], '*', ['pink']);
if (!$orderInfo) {
return $this->fail('核销订单未查到!');
}
$data = $this->request->postMore([
['cart_id', ''],//核销订单商品cart_id
['cart_num', 0]
]);
$cart_ids[] = $data;
if ($cart_ids) {
foreach ($cart_ids as $cart) {
if (!isset($cart['cart_id']) || !$cart['cart_id'] || !isset($cart['cart_num']) || !$cart['cart_num'] || $cart['cart_num'] <= 0) {
return $this->fail('请重新选择发货商品,或发货件数');
}
}
}
return app('json')->success('核销成功', $writeOffOrderServices->writeoffOrder(0, $orderInfo->toArray(), $cart_ids, 1, (int)$this->cashierId));
}
/**
* 易联云打印机打印
* @param $id
* @return mixed
*/
public function order_print($id)
{
if (!$id) return app('json')->fail('缺少参数');
$order = $this->services->get($id);
if (!$order) {
return app('json')->fail('订单没有查到,无法打印!');
}
$res = $this->services->orderPrint((int)$id, 1, (int)$this->storeId);
if ($res) {
return app('json')->success('打印成功');
} else {
return app('json')->fail('打印失败');
}
}
public function drinkset(Request $request, StoreDrinkSaveServices $StoreDrinkSaveServices, $uid)
{
$goodsinfo = $request->post();
if (!$goodsinfo['product_name']) return app('json')->fail('请输入存入的酒水名称');
$goodsinfo['create'] = time();
$goodsinfo['uid'] = $uid;
$goodsinfo['out_time'] = date("Y-m-d", strtotime($goodsinfo['out_time']));
$goodsinfo['now_num'] = $goodsinfo['num'];
$goodsinfo['store_id'] = $this->storeId;
$goodsinfo['product_id'] = $goodsinfo['product_id'] ?? 0;
$goodsinfo['table_id'] = $goodsinfo['table_id'];
$randomNumber = mt_rand(100000, 999999);
$goodsinfo['code'] = $randomNumber;//取酒码
$res = $StoreDrinkSaveServices->save($goodsinfo);
if (!$res) return app('json')->fail('存酒失败');
return app('json')->success('存酒成功');
}
//取酒
public function drinkxiugai(Request $request, StoreDrinkSaveServices $StoreDrinkSaveServices, $uid)
{
[$id, $type, $num, $date, $code] = $request->postMore([
['id', 0],
['type', 0],
['num', 0],
['date', 0],
['code', 0]
], true);
$log = [];
$res = [];
if (empty($code)) {
return app('json')->fail('请输入取酒码');
}
$res2 = \think\facade\Db::name('store_drink_save')->where('code', $code)->find();
if(!$res2){
return app('json')->fail('取酒码异常');
}
$res = (object)$res2;
if ($res->code != $code) {
return app('json')->fail('取酒码错误');
}
if (!$res) return app('json')->fail('存酒信息不存在');
$log['type'] = $type;
if ($type == 1) {
$res->num = ((int)$res->num) + $num;
$res->now_num = ($res->now_num) + $num;
$msg = "存酒成功";
$log['content'] = "您的酒水【{$res['product_name']}】×{$num}瓶存库成功,当前存酒数量剩余:{$res->now_num}";
} else if ($type == 2) {
if ($res->now_num < $num) return app('json')->fail('取酒数量不得超过存酒数量');
$res->now_num = ($res->now_num) - $num;
$res->num = ((int)$res->num) - $num;
$msg = "取酒成功";
if ($res->now_num == 0) $res->is_del = 1;
$log['content'] = "您的酒水【{$res->product_name}】×{$num}瓶取出成功,当前存酒数量剩余:{$res->now_num}";
} else if ($type == 3) {
$res->out_time = date("Y-m-d", strtotime($date));
$msg = "续期成功";
$log['content'] = "您的酒水【{$res->product_name}】×{$num}瓶已续期成功,到期时间为:" . date("Y-m-d", strtotime($date));
}
\think\facade\Db::name('store_drink_save')->where('code', $code)->update((array)$res);
// $res->save();
$log['uid'] = $uid;
$log['pid'] = $id;
$log['create'] = time();
/** @var StoreDrinkLogServices $StoreDrinkLogServices */
$StoreDrinkLogServices = app()->make(StoreDrinkLogServices::class);
$StoreDrinkLogServices->save($log);
return app('json')->success($msg);
}
public function drinklist(Request $request, StoreDrinkSaveServices $StoreDrinkSaveServices, $uid)
{
[$page, $limit, $keyword] = $request->postMore([
['page', 1],
['limit', 10],
['keyword', ''],
], true);
$where['uid'] = $uid;
$where['is_del'] = 0;
if ($keyword) $where['product_name'] = $keyword;
$list = $StoreDrinkSaveServices->getList($where, $page, $limit);
return app('json')->success("成功", $list);
}
public function getlog(Request $request, StoreDrinkLogServices $StoreDrinkLogServices, $uid)
{
[$page, $limit, $keyword] = $request->postMore([
['page', 1],
['limit', 10],
['keyword', ''],
], true);
$where['uid'] = $uid;
if ($keyword) $where['product_name'] = $keyword;
$list = $StoreDrinkLogServices->getList($where, $page, $limit);
return app('json')->success("成功", $list);
}
}