123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 |
- <?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\store\order;
- use app\controller\store\AuthController;
- use app\Request;
- use app\services\order\cashier\CashierOrderServices;
- use app\services\order\cashier\StoreHangOrderServices;
- use app\services\order\StoreCartServices;
- use app\services\other\QrcodeServices;
- use app\services\pay\PayServices;
- use app\services\product\branch\StoreBranchProductServices;
- use app\services\store\SystemStoreStaffServices;
- use app\services\user\UserServices;
- use app\services\product\category\StoreProductCategoryServices;
- use crmeb\services\AliPayService;
- use crmeb\services\wechat\Payment;
- use crmeb\utils\Canvas;
- use think\db\exception\DataNotFoundException;
- use think\db\exception\ModelNotFoundException;
- use think\Exception;
- use think\exception\DbException;
- use think\exception\ValidateException;
- use think\facade\App;
- /**
- * 收银台
- * Class Cashier
- * @package app\controller\store\order
- * @property Request $request
- */
- class Cashier extends AuthController
- {
- /**
- * @var CashierOrderServices
- */
- protected $service;
- /**
- * Cashier constructor.
- * @param App $app
- * @param CashierOrderServices $service
- */
- public function __construct(App $app, CashierOrderServices $service)
- {
- parent::__construct($app);
- $this->service = $service;
- }
- /**
- * 获取用户信息
- * @param UserServices $services
- * @return mixed
- */
- public function getUserInfo(UserServices $services, StoreCartServices $cartServices)
- {
- $code = $this->request->post('code', '');
- $uid = $this->request->post('uid', '');
- if (!$code && !$uid) {
- return $this->fail('缺少参数');
- }
- $field = ['uid', 'avatar', 'phone', 'nickname', 'now_money', 'integral'];
- if ($uid) {
- $userInfo = $services->getUserInfo($uid, $field);
- } elseif ($code) {
- $userInfo = $services->get(['uniqid' => $code], $field);
- }
- if (!isset($userInfo) && !$userInfo) {
- return $this->fail('用户不存在');
- }
- $cart = $this->request->post('cart', []);
- if ($cart) {
- $cartServices->batchAddCart($cart, $this->storeId, $userInfo->uid);
- }
- return $this->success($userInfo->toArray());
- }
- /**
- * 获取一级分类
- * @param StoreProductCategoryServices $services
- * @return mixed
- * @throws DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws ModelNotFoundException
- */
- public function getCateGoryList(StoreProductCategoryServices $services)
- {
- return $this->success($services->getOneCategory());
- }
- /**
- * 获取商品列表
- * @param Request $request
- * @param StoreBranchProductServices $services
- * @return mixed
- */
- public function getProductList(Request $request, StoreBranchProductServices $services)
- {
- $where = $request->getMore([
- ['store_name', ''],
- ['cate_id', 0],
- ['field_key', ''],
- ['staff_id', '']
- ]);
- $store_id = (int)$this->storeId;
- $where['field_key'] = $where['field_key'] == 'all' ? '' : $where['field_key'];
- $where['field_key'] = $where['field_key'] == 'id' ? 'product_id' : $where['field_key'];
- $staff_id = (int)$where['staff_id'];
- unset($where['staff_id']);
- $where['is_del'] = 0;
- $where['is_show'] = 1;
- $uid = $this->request->get('uid', 0);
- return $this->success($services->getCashierProductListV2($where, $store_id, (int)$uid, $staff_id));
- }
- /**
- * 获取商品详情
- * @param StoreBranchProductServices $services
- * @param $id
- * @return mixed
- */
- public function getProductDetail(StoreBranchProductServices $services, $id, $uid = 0)
- {
- if (!$id) {
- return $this->fail('缺少商品id');
- }
- $touristUid = $this->request->get('tourist_uid');
- return $this->success($services->getProductDetail($this->storeId, (int)$id, (int)$uid, (int)$touristUid));
- }
- /**
- * 购物车列表
- * @param StoreCartServices $services
- * @param $uid
- * @param $staff_id
- * @return mixed
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws \think\db\exception\DbException
- */
- public function getCartList(StoreCartServices $services, $uid, $staff_id)
- {
- if (!$staff_id) {
- return $this->fail('缺少参数');
- }
- $cartIds = $this->request->get('cart_ids', '');
- $touristUid = $this->request->get('tourist_uid', '');
- $cartIds = $cartIds ? explode(',', $cartIds) : [];
- if (!$touristUid && !$uid) {
- return $this->fail('缺少用户信息');
- }
- return $this->success($services->getUserCartList((int)$uid, -1, $cartIds, $this->storeId, $staff_id, 4, (int)$touristUid));
- }
- /**
- * 获取店员信息
- * @param SystemStoreStaffServices $services
- * @return mixed
- */
- public function getStaffList(SystemStoreStaffServices $services)
- {
- $where = [];
- $where['store_id'] = $this->storeId;
- $where['keyword'] = $this->request->get('keyword', '');
- $where['is_del'] = 0;
- return $this->success([
- 'staffInfo' => $this->request->storeStaffInfo(),
- 'staffList' => $services->getStoreStaff($where),
- 'count' => $services->count($where)
- ]);
- }
- /**
- * 解析条形码值
- * @return mixed
- */
- public function getAnalysisCode()
- {
- $code = $this->request->post('bar_code', '');
- $uid = $this->request->post('uid', 0);
- $staff_id = $this->request->post('staff_id', 0);
- $touristUid = $this->request->post('tourist_uid', '');
- if (!$touristUid && !$uid) {
- return $this->fail('缺少用户信息');
- }
- return $this->success($this->service->getAnalysisCode($code, $this->storeId, (int)$uid, (int)$staff_id, (int)$touristUid));
- }
- /**
- * 游客切换到用户
- * @param StoreCartServices $services
- * @param $staffId
- * @return mixed
- */
- public function switchCartUser(StoreCartServices $services, $staffId)
- {
- [$uid, $toUid, $isTourist] = $this->request->postMore([
- ['uid', 0],
- ['to_uid', 0],
- ['is_tourist', 0]
- ], true);
- if ($isTourist) {
- $where = ['tourist_uid' => $uid, 'store_id' => $this->storeId, 'staff_id' => $staffId];
- $touristCart = $services->getCartList($where);
- if ($touristCart) {
- $userWhere = ['uid' => $toUid, 'store_id' => $this->storeId, 'staff_id' => $staffId];
- $userCarts = $services->getCartList($userWhere);
- if ($userCarts) {
- foreach ($touristCart as $cart) {
- foreach ($userCarts as $userCart) {
- //游客商品 存在用户购物车商品中
- if($cart['product_id'] == $userCart['product_id'] && $cart['product_attr_unique'] == $userCart['product_attr_unique']) {
- //修改用户商品数量 删除游客购物车这条数据
- $services->update(['id' => $userCart['id']], ['cart_num' => bcadd((string)$cart['cart_num'], (string)$userCart['cart_num'])]);
- $services->delete(['id' => $cart['id']]);
- }
- }
- }
- }
- }
- $services->update($where, ['uid' => $toUid, 'tourist_uid' => '']);
- }
- return $this->success('修改成功');
- }
- /**
- * 加入购物车
- * @param StoreCartServices $services
- * @param $uid
- * @return mixed
- * @throws \Psr\SimpleCache\InvalidArgumentException
- * @throws DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws ModelNotFoundException
- */
- public function addCart(StoreCartServices $services, $uid)
- {
- $where = $this->request->postMore([
- ['productId', 0],//普通商品编号
- [['cartNum', 'd'], 1], //购物车数量
- ['uniqueId', ''],//属性唯一值
- ['staff_id', ''],//店员ID
- ['tourist_uid', '']//虚拟用户uid
- ]);
- if (!$where['productId']) {
- return $this->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']);
- $res = $services->addCashierCart((int)$uid, (int)$where['productId'], (int)$where['cartNum'], $where['uniqueId'], (int)$where['staff_id']);
- $services->reset();
- return $this->success(['cartId' => $res]);
- }
- /**
- * 删除购物车
- * @param StoreCartServices $services
- * @param $uid
- * @return mixed
- */
- public function delCart(StoreCartServices $services, $uid)
- {
- $where = $this->request->postMore([
- ['ids', []],//购物车编号
- ]);
- if (!count($where['ids'])) {
- return $this->fail('参数错误!');
- }
- if ($services->removeUserCart((int)$uid, $where['ids'])) {
- return $this->success();
- } else {
- return $this->fail('清除失败!');
- }
- }
- /**
- * 购物车 修改商品数量
- * @param Request $request
- * @return mixed
- * @throws Exception
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws DbException
- */
- public function numCart(StoreCartServices $services, $uid)
- {
- $where = $this->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)) {
- return $this->success();
- } else {
- return $this->fail('修改失败');
- }
- }
- /**
- * 购物车重选
- * @param Request $request
- * @return mixed
- */
- public function changeCart(StoreCartServices $services)
- {
- [$cart_id, $product_id, $unique] = $this->request->postMore([
- ['cart_id', 0],
- ['product_id', 0],
- ['unique', '']
- ], true);
- $services->modifyCashierCart($this->storeId, (int)$cart_id, (int)$product_id, $unique);
- return $this->success('重选成功');
- }
- /**
- * 获取用户优惠券列表
- * @param CashierOrderServices $services
- * @param $uid
- * @return mixed
- */
- public function couponList(CashierOrderServices $services, $uid)
- {
- [$cartIds] = $this->request->postMore([
- ['cart_id', []],
- ], true);
- if (!$uid) return $this->success([]);
- return $this->success($services->getCouponList((int)$uid, $this->storeId, $cartIds));
- }
- /**
- * 添加挂单数据
- * @return mixed
- */
- public function saveHangOrder()
- {
- return $this->success('挂单成功');
- }
- /**
- * 获取挂单列表和用户购买历史列表 挂单规定10个,历史记录规定20个没有分页
- * @param StoreHangOrderServices $services
- * @param int $staffId
- * @return mixed
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws \think\db\exception\DbException
- */
- public function getHangOrder(StoreHangOrderServices $services, $staffId = 0)
- {
- return $this->success($services->getHangOrder((int)$this->storeId, $staffId ?: (int)$this->storeStaffId));
- }
- /**
- * 获取挂单列表分页
- * @param StoreHangOrderServices $services
- * @param int $staffId
- * @return mixed
- * @throws DataNotFoundException
- * @throws ModelNotFoundException
- * @throws \think\db\exception\DbException
- */
- public function getHangOrderList(StoreHangOrderServices $services, $staffId = 0)
- {
- $search = $this->request->get('keyword', '');
- return $this->success($services->getHangOrderList((int)$this->storeId, 0, $search));
- }
- /**
- * 删除购物车信息
- * @param StoreCartServices $services
- * @return mixed
- */
- public function deleteHangOrder(StoreCartServices $services)
- {
- $id = $this->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 CashierOrderServices $services
- * @param $uid
- * @return mixed
- * @throws DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws ModelNotFoundException
- */
- public function computeOrder(CashierOrderServices $services, $uid)
- {
- [$integral, $coupon, $cartIds, $coupon_id] = $this->request->postMore([
- ['integral', 0],
- ['coupon', 0],
- ['cart_id', []],
- ['coupon_id', 0]
- ], true);
- if (!$cartIds) {
- return $this->fail('缺少购物车ID');
- }
- return $this->success($services->computeOrder((int)$uid, $this->storeId, $cartIds, !!$integral, !!$coupon, [], $coupon_id));
- }
- /**
- * 生成订单
- * @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] = $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', '']
- ], true);
- if (!$staffId) {
- $staffId = $this->request->storeStaffId();
- }
- if (!$cartIds) {
- return $this->fail('缺少购物车ID');
- }
- 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);
- $cartInfo = $computeData['cartInfo'];
- return $services->transaction(function () use ($services, $userInfo, $computeData, $authCode, $uid, $staffId, $cartIds, $payType, $integral, $coupon, $remarks, $changePrice, $isPrice, $userCode, $coupon_id) {
- $orderInfo = $services->createOrder((int)$uid, $userInfo, $computeData, $this->storeId, (int)$staffId, $cartIds, $payType, !!$integral, !!$coupon, $remarks, $changePrice, !!$isPrice, $coupon_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'];
- return app('json')->success($res);
- } else {
- return app('json')->success(['status' => 'ORDER_CREATE', 'order_id' => $orderInfo['order_id']]);
- }
- });
- }
- /**
- * 订单支付
- * @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', '');
- if ($payType == PayServices::YUE_PAY && !$userCode) {
- 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;
- return $this->success($res);
- }
- /** 获取二维码
- * @return mixed
- */
- public function cashier_scan()
- {
- $store_id = $this->storeId;
- //生成h5地址
- $weixinPage = "/pages/goods/order_pay/index?store_id=" . $store_id;
- $weixinFileName = "wechat_cashier_pay_" . $store_id . ".png";
- /** @var QrcodeServices $QrcodeService */
- $QrcodeService = app()->make(QrcodeServices::class);
- $wechatQrcode = $QrcodeService->getWechatQrcodePath($weixinFileName, $weixinPage, false, false);
- //生成小程序地址
- $routineQrcode = $QrcodeService->getRoutineQrcodePath($store_id, 0, 7, [], false);
- $qrcod = ['wechat' => $wechatQrcode, 'routine' => $routineQrcode];
- //生成画布
- $canvas = Canvas::instance();
- $path = 'uploads/offline/';
- $imageType = 'jpg';
- $siteUrl = sys_config('site_url');
- $canvas->setImageUrl(public_path() . 'statics/qrcode/offlines.jpg')->setImageHeight(730)->setImageWidth(500)->pushImageValue();
- foreach ($qrcod as $k => $v) {
- if ($v) {
- $name = 'offline_' . $k;
- $canvas->setImageUrl($v)->setImageHeight(344)->setImageWidth(344)->setImageLeft(76)->setImageTop(120)->pushImageValue();
- $image = $canvas->setFileName($name)->setImageType($imageType)->setPath($path)->setBackgroundWidth(500)->setBackgroundHeight(720)->starDrawChart();
- $data[$k] = $image ? $siteUrl . '/' . $image : '';
- } else {
- $data[$k] = "";
- }
- }
- return $this->success($data);
- }
- }
|