882 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			882 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
namespace app\controller\api;
 | 
						|
 | 
						|
use app\exception\RepositoryException;
 | 
						|
use app\model\BusinessCircle;
 | 
						|
use app\model\Category;
 | 
						|
use app\repository\AccountRepository;
 | 
						|
use app\repository\BillRepository;
 | 
						|
use app\repository\BusinessRepository;
 | 
						|
use app\repository\CouponRepository;
 | 
						|
use app\repository\DictionaryRepository;
 | 
						|
use app\repository\RechargeRepository;
 | 
						|
use app\service\wx\WechatPay;
 | 
						|
use app\validate\BusinessValidate;
 | 
						|
use Endroid\QrCode\Builder\Builder;
 | 
						|
use Endroid\QrCode\Encoding\Encoding;
 | 
						|
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
 | 
						|
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
 | 
						|
use Endroid\QrCode\Writer\PngWriter;
 | 
						|
use think\Collection;
 | 
						|
use think\Exception;
 | 
						|
use think\facade\Db;
 | 
						|
use think\exception\ValidateException;
 | 
						|
use app\model\{Account,
 | 
						|
    Account as AccountModel,
 | 
						|
    Activity as ActivityModel,
 | 
						|
    ApplyStaff,
 | 
						|
    Business as BusinessModel,
 | 
						|
    CouponBill,
 | 
						|
    CouponMain};
 | 
						|
use think\response\Json;
 | 
						|
use function EasyWeChat\Kernel\Support\generate_sign;
 | 
						|
 | 
						|
/**
 | 
						|
 * 商家端:商家
 | 
						|
 *
 | 
						|
 * Class Business
 | 
						|
 * @package app\controller\api
 | 
						|
 */
 | 
						|
class Business extends Base
 | 
						|
{
 | 
						|
 | 
						|
    protected $noNeedLogin = [
 | 
						|
        'couponDetail',
 | 
						|
    ];
 | 
						|
    /**
 | 
						|
     * 商家认证注册
 | 
						|
     *
 | 
						|
     * 重新编辑注册则覆盖之前的审核信息,并重新进行审核
 | 
						|
     */
 | 
						|
    public function registerBusiness()
 | 
						|
    {
 | 
						|
        $params = [
 | 
						|
            'business_license'=> $this->request->param('business_license', ''),
 | 
						|
            'background'=> $this->request->param('background', ''),
 | 
						|
            'business_name'=> $this->request->param('business_name', ''),
 | 
						|
            'business_subtitle'=> $this->request->param('business_subtitle', ''),
 | 
						|
            'province'=> $this->request->param('province', ''),
 | 
						|
            'city'=> $this->request->param('city', ''),
 | 
						|
            'county'=> $this->request->param('county', ''),
 | 
						|
            'business_address' => $this->request->param('business_address', ''),
 | 
						|
            'lat'=> $this->request->param('lat', ''),
 | 
						|
            'lng'=> $this->request->param('lng', ''),
 | 
						|
            'business_circle_id' => $this->request->param('business_circle_id/d', 0),
 | 
						|
            'agency_code'   => $this->request->param('agency_code', ''),
 | 
						|
            'type'=> $this->request->param('type/d', 0),
 | 
						|
            'contact_name'=> $this->request->param('contact_name', ''),
 | 
						|
            'contact_phone'=> $this->request->param('contact_phone', ''),
 | 
						|
        ];
 | 
						|
 | 
						|
        $accountId  = $this->request->user['user_id'] ?? 0;
 | 
						|
 | 
						|
 | 
						|
        try {
 | 
						|
            $validate   = new BusinessValidate();
 | 
						|
            $busRepo    = BusinessRepository::getInstance();
 | 
						|
            $dicRepo    = DictionaryRepository::getInstance();
 | 
						|
            $accountRepo    = AccountRepository::getInstance();
 | 
						|
 | 
						|
            $account = $accountRepo->findById($accountId);
 | 
						|
            if (empty($account)) {
 | 
						|
                throw new ValidateException('无效请求!');
 | 
						|
            }
 | 
						|
            if ($account->type !== Account::type_consumer) {
 | 
						|
                throw new ValidateException('您已经是商家或者员工,不能认证');
 | 
						|
            }
 | 
						|
 | 
						|
            //检查有没有加入一个商家的申请
 | 
						|
            $applyStaff = $busRepo->getApplyStaffByUserCode($account->user_code);
 | 
						|
            if(!empty($applyStaff)){
 | 
						|
                throw new ValidateException('您有申请加入一个商家,不能认证');
 | 
						|
            }
 | 
						|
 | 
						|
            if (!$validate->scene('apiRegister')->check($params)) {
 | 
						|
                throw new ValidateException($validate->getError());
 | 
						|
            }
 | 
						|
 | 
						|
            $businessCategory   = $dicRepo->findBusinessTypeById($params['type']);
 | 
						|
            if (empty($businessCategory)) {
 | 
						|
                throw new ValidateException('请选择正确的商家分类信息!');
 | 
						|
            }
 | 
						|
 | 
						|
            if ($params['business_circle_id'] > 0) {
 | 
						|
                $businessCircle = $dicRepo->findBusinessCircleById($params['business_circle_id']);
 | 
						|
                if (empty($businessCircle)) {
 | 
						|
                    throw new ValidateException('请选择正确的商圈信息!');
 | 
						|
                }
 | 
						|
                $params['business_circle']  = $businessCircle['name'];
 | 
						|
            }
 | 
						|
 | 
						|
            if (!empty($params['agency_code'])) {
 | 
						|
                $agencyBusiness = $busRepo->findOneByWhere([
 | 
						|
                    ['code',"=", $params['agency_code']],
 | 
						|
                    ['is_agency',"=", BusinessModel::COMMON_ON],
 | 
						|
                    [ 'state' ,"=", BusinessModel::state_on]
 | 
						|
                ]);
 | 
						|
                if (empty($agencyBusiness)) {
 | 
						|
                    throw new ValidateException('没有相关的代理商记录!');
 | 
						|
                } elseif ($agencyBusiness['enable'] == self::BOOL_TRUE) {
 | 
						|
                    throw new ValidateException('该代理商已被封禁!');
 | 
						|
                }
 | 
						|
 | 
						|
                $params['is_assign']            = 1;
 | 
						|
            }
 | 
						|
 | 
						|
            $business = null;
 | 
						|
            if (isset($account['business_code']) && !empty($account['business_code'])) {
 | 
						|
                $business = $busRepo->findOneByWhere(['code'=> $account['business_code']]);
 | 
						|
            }
 | 
						|
 | 
						|
            $params['create_time']          = date('Y-m-d H:i:s');
 | 
						|
            $params['is_delete']            = 0;
 | 
						|
            $params['state']                = BusinessModel::state_reviewing;
 | 
						|
            $params['enable']               = 0;
 | 
						|
            $params['total_recharge']       = 0;
 | 
						|
            $params['balance']              = 0;
 | 
						|
            $params['is_agency']            = 0;
 | 
						|
            $params['type_name']            = $businessCategory['name'];
 | 
						|
 | 
						|
            if ($business) {
 | 
						|
                if ($business['state'] == BusinessModel::state_reviewing) {
 | 
						|
                    throw new ValidateException('商户认证审批中,请勿重复提交!');
 | 
						|
                }
 | 
						|
 | 
						|
                // 更新审批信息,重新审批
 | 
						|
                $params['update_time']  = date('Y-m-d H:i:s');
 | 
						|
                $business->save($params);
 | 
						|
 | 
						|
            } else {
 | 
						|
                // 添加审批记录
 | 
						|
                $businessCode   = createUuid();
 | 
						|
                $params['code'] = $businessCode;
 | 
						|
                $business = $busRepo->create($params);
 | 
						|
                if (!$business) {
 | 
						|
                    throw new RepositoryException('服务器繁忙!商户认证申请提交失败!');
 | 
						|
                }
 | 
						|
 | 
						|
                $account->save(['business_code' => $businessCode]);
 | 
						|
            }
 | 
						|
 | 
						|
            $result = $busRepo->formatFrontBusinessInfo($business->toArray());
 | 
						|
            return $this->json(0, 'success', $result);
 | 
						|
        } catch (ValidateException $e) {
 | 
						|
            return $this->json(4001, $e->getError());
 | 
						|
        } catch (RepositoryException | \Exception $e) {
 | 
						|
            return $this->json(5001, '服务器繁忙!商户认证申请提交失败!');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 认证失败之后  撤销认证  删除资料  用户还原身份成消费者
 | 
						|
     * */
 | 
						|
    public function revokeAuth()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(['business'=>function($q){
 | 
						|
                $q->lock(true);
 | 
						|
            }, 'parent']);
 | 
						|
        });
 | 
						|
        if(empty($account)){
 | 
						|
            return  $this->json(6001,"登录失效");
 | 
						|
        }
 | 
						|
        if ($account->type != AccountModel::type_consumer) {
 | 
						|
            return $this->json(4001, "用户状态错误");
 | 
						|
        }
 | 
						|
 | 
						|
        if (!isset($account->business) || empty($account->business)) {
 | 
						|
            return $this->json(4001, "商家信息错误");
 | 
						|
        }
 | 
						|
        if ($account->business->state != BusinessModel::state_off ) {
 | 
						|
            return $this->json(4001, "当前商家状态不能撤销");
 | 
						|
        }
 | 
						|
 | 
						|
        //开始撤销操作
 | 
						|
        Db::startTrans();
 | 
						|
        try {
 | 
						|
            $account->business->delete();
 | 
						|
            $account->save(["business_code"=>"","type"=>AccountModel::type_consumer]);
 | 
						|
            Db::commit();
 | 
						|
            return $this->json();
 | 
						|
        }catch (RepositoryException $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(5001, "撤销失败");
 | 
						|
        }catch (Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(5002, "撤销失败");
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 申请失败后
 | 
						|
     * */
 | 
						|
    public function revokeJoinStaffAuth()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(['business'=>function($q){
 | 
						|
                $q->lock(true);
 | 
						|
            }, 'parent']);
 | 
						|
        });
 | 
						|
        if(empty($account)){
 | 
						|
            return  $this->json(6001,"登录失效");
 | 
						|
        }
 | 
						|
        if ($account->type != AccountModel::type_consumer) {
 | 
						|
            return $this->json(4001, "用户状态错误");
 | 
						|
        }
 | 
						|
 | 
						|
        //检查有没有加入一个商家的申请
 | 
						|
        $applyStaff = BusinessRepository::getInstance()->getApplyStaffByUserCode($account->user_code);
 | 
						|
        if(empty($applyStaff)){
 | 
						|
            return $this->json(4001, "申请记录不存在");
 | 
						|
        }
 | 
						|
 | 
						|
        if ($applyStaff->status == ApplyStaff::status_success) {
 | 
						|
            return $this->json(4001, "该申请已通过");
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        // 待审核或者审核驳回  可以撤销 开始撤销操作
 | 
						|
        Db::startTrans();
 | 
						|
        try {
 | 
						|
            $applyStaff->delete();
 | 
						|
            Db::commit();
 | 
						|
            return $this->json();
 | 
						|
        }catch (RepositoryException $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(5001, "撤销失败");
 | 
						|
        }catch (Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(5002, "撤销失败");
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取当前账号所属商家的信息
 | 
						|
     * 适用范围:商户账号 或 商户员工账号
 | 
						|
     */
 | 
						|
    public function getMyBusinessInfo()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
 | 
						|
        try {
 | 
						|
            $account    = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
                return $q->with(['business', 'parent']);
 | 
						|
            });
 | 
						|
            if (empty($account)) {
 | 
						|
                return $this->json(4004, '无效请求!');
 | 
						|
            }
 | 
						|
 | 
						|
            $result = [];
 | 
						|
            if ($account['type'] == AccountModel::type_staff) {
 | 
						|
                // 员工账号
 | 
						|
                $businessCode   = $account['parent']['business_code'] ?? '';
 | 
						|
                if (!empty($businessCode)) {
 | 
						|
                    $business = BusinessRepository::getInstance()->findOneByWhere(['code' => $businessCode]);
 | 
						|
                    if ($business) {
 | 
						|
                        $result = $business->toArray();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                $result = arrayKeysExcludeFilter($result, ['pay_account', 'total_recharge']);
 | 
						|
 | 
						|
            } elseif(!empty($account['business'])) {
 | 
						|
                // 商户认证信息
 | 
						|
                $result     = $account['business']->toArray();
 | 
						|
            }
 | 
						|
 | 
						|
            if (count($result)) {
 | 
						|
                $result     = DictionaryRepository::getInstance()->parseAreaText($result);
 | 
						|
            }
 | 
						|
 | 
						|
            $result = arrayKeysExcludeFilter($result, ['update_time']);
 | 
						|
            return $this->json(0, 'success', $result);
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            return $this->json(5001, '商家信息查询失败!');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取商家信息(已认证通过的商户)
 | 
						|
     * @return Json
 | 
						|
     */
 | 
						|
    public function getBusinessInfo()
 | 
						|
    {
 | 
						|
        $businessCode   = $this->request->param('businessCode/s', '');
 | 
						|
 | 
						|
        $busRepo        = BusinessRepository::getInstance();
 | 
						|
        try {
 | 
						|
            $business   = $busRepo->findOneByWhere(['code' => $businessCode, 'state' => BusinessModel::state_on]);
 | 
						|
            if (empty($business)) {
 | 
						|
                return $this->json(4004, '没有相关的商户!');
 | 
						|
            }
 | 
						|
 | 
						|
            $list       = $business->toArray();
 | 
						|
            $list       = DictionaryRepository::getInstance()->parseAreaText($list);
 | 
						|
            $disableFields = ['is_delete', 'update_time', 'total_recharge', 'balance', 'is_assign', 'agency_code',
 | 
						|
                'reason', 'pay_account', 'business_license'
 | 
						|
            ];
 | 
						|
            $result     = arrayKeysExcludeFilter($list, $disableFields);
 | 
						|
            return $this->json(0, 'success', $result);
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            return $this->json(5004, '商家信息查询失败!');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 获取商家类型
 | 
						|
     * */
 | 
						|
    public function getBusinessTypeList()
 | 
						|
    {
 | 
						|
        $data = Category::getList();
 | 
						|
        return $this->json(1,"ok",$data);
 | 
						|
    }
 | 
						|
    /**
 | 
						|
     * 获取商家类型
 | 
						|
     * */
 | 
						|
    public function getBusinessCircle()
 | 
						|
    {
 | 
						|
        $data = BusinessCircle::getList();
 | 
						|
        return $this->json(1,"ok",$data);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 商家签到券详情
 | 
						|
     * */
 | 
						|
    public function couponDetail()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(['business', 'parent']);
 | 
						|
        });
 | 
						|
 | 
						|
        $couponMainId = input("id/d");
 | 
						|
        $couponMain = CouponMain::findOne(["id"=>$couponMainId]);
 | 
						|
        if(empty($couponMain)){
 | 
						|
            return $this->json(4001,"签到券不存在");
 | 
						|
        }
 | 
						|
        if(!$business = BusinessRepository::getInstance()->findOneByWhere(["code"=>$couponMain["business_code"]])){
 | 
						|
            return $this->json(4001,"签到券商家信息不存在");
 | 
						|
        }
 | 
						|
 | 
						|
        $list       = $business->toArray();
 | 
						|
        $list       = DictionaryRepository::getInstance()->parseAreaText($list);
 | 
						|
 | 
						|
        $data       = [];
 | 
						|
 | 
						|
        $data["businessAddress"]        = $list['province_text'] . $list['city_text'] . $list['county_text'] . $business['business_address'];
 | 
						|
        $data["businessName"]           = $list['business_name'];
 | 
						|
        $data["businessCode"]           = $list['code'];
 | 
						|
        $data["businessSubtitle"]       = $business['business_subtitle'];
 | 
						|
        $data["count"]                  = $couponMain->count;
 | 
						|
        $data["couponName"]             = $couponMain->name;
 | 
						|
        $data["deductionMoney"]         = $couponMain->deduction_money;
 | 
						|
        $data["startTime"]              = $couponMain->start_time;
 | 
						|
        $data["endTime"]                = $couponMain->end_time;
 | 
						|
        $data["id"]                     = $couponMain->id;
 | 
						|
        $data["imageUrl"]               = $this->request->domain(). $couponMain->image_url;
 | 
						|
        $data["intro"]                  = $couponMain->intro;//简介
 | 
						|
 | 
						|
        $data["lat"]                    = $couponMain->lat;
 | 
						|
        $data["lng"]                    = $couponMain->lng;
 | 
						|
        $data["money"]                  = $couponMain->money;
 | 
						|
        $data["is_distribution"]        =
 | 
						|
            $business['is_assign'] == BusinessModel::COMMON_ON
 | 
						|
                ?
 | 
						|
                BusinessModel::COMMON_OFF
 | 
						|
                :
 | 
						|
                BusinessModel::COMMON_ON;
 | 
						|
        $data["usingRule"]              = DictionaryRepository::getInstance()->getUsingRuleByCouponMainId($couponMain->id);
 | 
						|
        $data["punishRule"]             = '';//处罚规则 已取消
 | 
						|
 | 
						|
        $data["content"]                = (string)$couponMain->content;
 | 
						|
 | 
						|
        //未登录可以领取 0可领取 1已领取 2 已领完
 | 
						|
        if (empty($account)) {
 | 
						|
            $data["receiveStatus"]  = CouponMain::COMMON_OFF;//领取状态
 | 
						|
        }else{
 | 
						|
            $data["receiveStatus"]  = AccountRepository::getInstance()->getCouponReceiveStatus($account->user_code,$couponMain);//领取状态
 | 
						|
        }
 | 
						|
        $data["receivedCount"] =  $couponMain->received_count;//已领取数量
 | 
						|
        $data["typeName"] =  $couponMain->type_name;
 | 
						|
 | 
						|
        return $this->json(0,"success",$data);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 检查是否已经有商家审核了
 | 
						|
     * */
 | 
						|
    public function checkAuth()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(['business', 'parent']);
 | 
						|
        });
 | 
						|
        $showSubmitBtn = true;
 | 
						|
        if(empty($account)){
 | 
						|
            return  $this->json(6001,"登录失效",["showSubmitBtn"=>$showSubmitBtn]);
 | 
						|
        }
 | 
						|
 | 
						|
        //如果有商家 并且审核失败或者待审核
 | 
						|
        if (isset($account->business) && !empty($account->business) && in_array($account->business->state, [BusinessModel::state_off, BusinessModel::state_reviewing,])) {
 | 
						|
            if ($account->business->state == BusinessModel::state_off) {
 | 
						|
                return $this->json(4001, "认证被退回,请重新填写资料:" . $account->business->reason,
 | 
						|
                    ["business" => $account->business, "showSubmitBtn" => $showSubmitBtn]);
 | 
						|
            }
 | 
						|
            $showSubmitBtn = false;
 | 
						|
            return $this->json(4001, " 正在认证中请耐心等待", ["business" => $account->business, "showSubmitBtn" => $showSubmitBtn]);
 | 
						|
        }
 | 
						|
 | 
						|
        if($account->type == AccountModel::type_staff){
 | 
						|
            $showSubmitBtn = false;
 | 
						|
            return $this->json(4001, "您已经是员工,无需认证", ["showSubmitBtn" => $showSubmitBtn]);
 | 
						|
        }
 | 
						|
 | 
						|
        //检查有没有加入一个商家的申请
 | 
						|
        $applyStaff = BusinessRepository::getInstance()->getApplyStaffByUserCode($account->user_code);
 | 
						|
        if(!empty($applyStaff)){
 | 
						|
            $showSubmitBtn = false;
 | 
						|
            if($applyStaff->status == ApplyStaff::status_default){
 | 
						|
                return $this->json(4001, "您有申请加入一个商家待审核,不能认证", [ "showSubmitBtn" => $showSubmitBtn ,"applyStaff"=>$applyStaff]);
 | 
						|
            }
 | 
						|
            if($applyStaff->status == ApplyStaff::status_fail){
 | 
						|
                $showSubmitBtn = true;
 | 
						|
                return $this->json(4001, "您申请加入商家,商家驳回了,请先撤销申请", [ "showSubmitBtn" => $showSubmitBtn ,"applyStaff"=>$applyStaff]);
 | 
						|
            }
 | 
						|
            if($applyStaff->status == ApplyStaff::status_success){
 | 
						|
                return $this->json(4001, "您申请加入商家已通过,请不要重复认证", [ "showSubmitBtn" => $showSubmitBtn ,"applyStaff"=>$applyStaff]);
 | 
						|
            }
 | 
						|
            return $this->json(4001, "状态错误", [ "showSubmitBtn" => $showSubmitBtn ,"applyStaff"=>$applyStaff]);
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->json(0,"success",[ "showSubmitBtn" => $showSubmitBtn]);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * 充值
 | 
						|
     * */
 | 
						|
    public function recharge()
 | 
						|
    {
 | 
						|
        $accountId  = $this->request->user['user_id'] ?? 0;
 | 
						|
        $money      = input("money/f",1);
 | 
						|
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(['business', 'parent']);
 | 
						|
        });
 | 
						|
        if(empty($account)||empty($account->business)){
 | 
						|
            return  $this->json(6001,"登录失效");
 | 
						|
        }
 | 
						|
        if ($money <= 0) {
 | 
						|
            return  $this->json(4001,"充值金额有误");
 | 
						|
        }
 | 
						|
        $money = floor($money*100)/100;
 | 
						|
        Db::startTrans();
 | 
						|
        try {
 | 
						|
 | 
						|
            //创建充值订单
 | 
						|
            if (!$order = RechargeRepository::getInstance()->createOrder($account->business_code, $account->open_id,$money)) {
 | 
						|
                throw new RepositoryException('订单创建失败,请稍后重试');
 | 
						|
            }
 | 
						|
            //生成支付
 | 
						|
            $time = time();
 | 
						|
            $res = WechatPay::getInstance()->order->unify([
 | 
						|
                'body' => '商家充值',
 | 
						|
                'openid' => $account->open_id,
 | 
						|
                'out_trade_no' => $order->order_num,
 | 
						|
                'total_fee' => $money * 100,
 | 
						|
                'trade_type' => 'JSAPI',
 | 
						|
                'timeStamp' => $time,
 | 
						|
                'product_id' => $order->id,
 | 
						|
                'sign_type' => "MD5",
 | 
						|
                'notify_url' => $this->request->domain() . "/api/recharge/notify.html",
 | 
						|
            ]);
 | 
						|
 | 
						|
            if (!isset($res['prepay_id'])) {
 | 
						|
                throw new RepositoryException('订单创建失败,请稍后重试');
 | 
						|
            }
 | 
						|
            $payData = [
 | 
						|
                "appId" =>config("wechat.applets_appId"),
 | 
						|
                "timeStamp" =>$time."",
 | 
						|
                'nonceStr'  => randomStr(0,16),
 | 
						|
                'package'   => 'prepay_id='.$res['prepay_id'],
 | 
						|
                "signType"  =>'MD5',
 | 
						|
            ];
 | 
						|
 | 
						|
            $payData['sign'] = generate_sign($payData, config("wechat.key"));
 | 
						|
            $payData['order_num'] = $order->order_num;
 | 
						|
 | 
						|
            Db::commit();
 | 
						|
            return $this->json(0, "success", [
 | 
						|
                "payData" => $payData
 | 
						|
            ]);
 | 
						|
 | 
						|
        }catch (RepositoryException $e){
 | 
						|
            Db::rollback();
 | 
						|
            return  $this->json(4001,"发起充值失败");
 | 
						|
        }catch (Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            return  $this->json(5001,"发起充值失败");
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 商家详情
 | 
						|
     * */
 | 
						|
    public function getShopInfo()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $account = AccountRepository::getInstance()->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(['business', 'parent']);
 | 
						|
        });
 | 
						|
        if(empty($account)){
 | 
						|
            return  $this->json(6001,"登录失效");
 | 
						|
        }
 | 
						|
        if ($account->type == Account::type_consumer) {
 | 
						|
            return $this->json(4001, "您不是商家");
 | 
						|
        }
 | 
						|
        $account->business->business_license = $this->request->domain().$account->business->business_license;
 | 
						|
        $account->business->background = $this->request->domain().$account->business->background;
 | 
						|
        if (isset($account->business) && $account->business) {
 | 
						|
            return $this->json(0, "success",["business"=>$account->business]);
 | 
						|
        }
 | 
						|
        return $this->json(4001, "获取商家信息错误");
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 商家的列表
 | 
						|
     * */
 | 
						|
    public function getBusinessList()
 | 
						|
    {
 | 
						|
        $accountId      = $this->request->user['user_id'] ?? 0;
 | 
						|
        $page           = $this->request->param('page/d', 1);
 | 
						|
        $size           = $this->request->param('size/d', 10);
 | 
						|
        $keyword        = input("keyWord/s");
 | 
						|
        $accountRepo = AccountRepository::getInstance();
 | 
						|
        try {
 | 
						|
            $account = $accountRepo->findById($accountId, [], function ($q) {
 | 
						|
                return $q->with(['business', 'parent']);
 | 
						|
            });
 | 
						|
            if (empty($account)) {
 | 
						|
                throw new ValidateException('用户无效!');
 | 
						|
            }
 | 
						|
            $where = [
 | 
						|
                ["business_name|business_subtitle", "like", "%{$keyword}%"],
 | 
						|
                ["state", "=", BusinessModel::state_on],//审核状态 0 审核中 1 审核通过 2 拒绝
 | 
						|
                ["enable", "=", BusinessModel::COMMON_OFF],// 启用状态 0 正常 1禁用
 | 
						|
            ];
 | 
						|
            $data = BusinessRepository::getInstance()->findList($where,[],$page,$size,null,["id"=>"desc"]);
 | 
						|
            $data["list"]->each(function ($item){
 | 
						|
                $item->businessCover = $this->request->domain() . $item->background;
 | 
						|
            });
 | 
						|
            return $this->json(0,"success",$data["list"]);
 | 
						|
        }catch (ValidateException $e) {
 | 
						|
            return $this->json(4001, $e->getError());
 | 
						|
        } catch (Exception $e) {
 | 
						|
            return $this->json(5001, '服务器繁忙!获取用户个人信息失败');
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 加入一个商家成为员工
 | 
						|
     * */
 | 
						|
    public function joinBusiness(){
 | 
						|
        $accountId      = $this->request->user['user_id'] ?? 0;
 | 
						|
        $businessCode   = input("business_code/s","");
 | 
						|
 | 
						|
        $accountRepo = AccountRepository::getInstance();
 | 
						|
        try {
 | 
						|
            $account = $accountRepo->findById($accountId,[],function ($q){
 | 
						|
                return $q->with(["business"]);
 | 
						|
            });
 | 
						|
            if (empty($account)) {
 | 
						|
                throw new RepositoryException('用户无效!');
 | 
						|
            }
 | 
						|
            $business = BusinessRepository::getInstance()->findOneByWhere(["code"=>$businessCode]);
 | 
						|
            if(empty($business)){
 | 
						|
                throw new RepositoryException('商家不存在');
 | 
						|
            }
 | 
						|
 | 
						|
            if($business->state !=BusinessModel::state_on){
 | 
						|
                throw new RepositoryException('商家审核未通过');
 | 
						|
            }
 | 
						|
            if($business->enable !=BusinessModel::COMMON_OFF){
 | 
						|
                throw new RepositoryException('商家已禁用');
 | 
						|
            }
 | 
						|
 | 
						|
            //检查有没有加入一个商家的申请
 | 
						|
            $applyStaff = BusinessRepository::getInstance()->getApplyStaffByUserCode($account->user_code);
 | 
						|
            if(!empty($applyStaff)){
 | 
						|
                throw new RepositoryException('您已经有申请加入一个商家,不能重复申请');
 | 
						|
            }
 | 
						|
 | 
						|
            //是否有认证商家的申请
 | 
						|
            if(isset($account->business)&&$account->business){
 | 
						|
                if($account->business->state==businessModel::state_on){
 | 
						|
                    throw new RepositoryException('您已经是商家');
 | 
						|
                }
 | 
						|
                if($account->business->state==businessModel::state_reviewing){
 | 
						|
                    throw new RepositoryException('您有审核中商家认证申请');
 | 
						|
                }
 | 
						|
                throw new RepositoryException('您有被驳回商家认证申请,请先撤销申请');
 | 
						|
            }
 | 
						|
 | 
						|
            //验证通过  写入申请
 | 
						|
            BusinessRepository::getInstance()->createApplyStaff($account->user_code,$businessCode);
 | 
						|
 | 
						|
            return $this->json();
 | 
						|
        }catch (RepositoryException $e) {
 | 
						|
            return $this->json(4001, $e->getMessage());
 | 
						|
        } catch (Exception $e) {
 | 
						|
            return $this->json(5001, '服务器繁忙!');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 绑定的员工列表  查询所有
 | 
						|
     * */
 | 
						|
    public function getBindUserList()
 | 
						|
    {
 | 
						|
        $accountId      = $this->request->user['user_id'] ?? 0;
 | 
						|
        $keyword        = input("key/s","");
 | 
						|
        $type           = input("type/s","staff");
 | 
						|
        $accountRepo    = AccountRepository::getInstance();
 | 
						|
        try {
 | 
						|
            $account = $accountRepo->findById($accountId,[],function ($q){
 | 
						|
                return $q->with(["business"]);
 | 
						|
            });
 | 
						|
            if (empty($account)) {
 | 
						|
                throw new RepositoryException('用户无效!');
 | 
						|
            }
 | 
						|
 | 
						|
            if ($account->type != AccountModel::type_business) {
 | 
						|
                throw new RepositoryException('您没有权限查看');
 | 
						|
            }
 | 
						|
            if (!isset($account->business) || empty($account->business)) {
 | 
						|
                throw new RepositoryException('商家信息无效');
 | 
						|
            }
 | 
						|
 | 
						|
            if($type == "staff"){
 | 
						|
                //查看列表  员工列表
 | 
						|
                $list = $accountRepo->getStaffListByBusinessCode($account->business->code,$account->user_code,$keyword);
 | 
						|
            }else{
 | 
						|
                //申请列表
 | 
						|
                $list = $accountRepo->getApplyStaffListByBusinessCode($account->business->code,$keyword);
 | 
						|
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            return $this->json(0,"success",["list"=>$list]);
 | 
						|
 | 
						|
        }catch (RepositoryException $e) {
 | 
						|
            return $this->json(4001, $e->getMessage());
 | 
						|
        } catch (Exception $e) {
 | 
						|
 | 
						|
            return $this->json(5001, '服务器繁忙!');
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 审核加入商家
 | 
						|
     * */
 | 
						|
    public function examineApplyStaff()
 | 
						|
    {
 | 
						|
        $status = input("status/d", -1);
 | 
						|
        $userCode = input("user_code/s", '');
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $accountRepo = AccountRepository::getInstance();
 | 
						|
 | 
						|
        $account = $accountRepo->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(["business"]);
 | 
						|
        });
 | 
						|
        if(!in_array($status,[ApplyStaff::status_success,ApplyStaff::status_fail])){
 | 
						|
            return $this->json(4001, "状态错误");
 | 
						|
        }
 | 
						|
        if (empty($account)) {
 | 
						|
            return $this->json(6001, "用户无效!");
 | 
						|
        }
 | 
						|
 | 
						|
        if ($account->type != AccountModel::type_business) {
 | 
						|
            return $this->json(4001, "您没有权限");
 | 
						|
        }
 | 
						|
        if (!isset($account->business) || empty($account->business)) {
 | 
						|
            return $this->json(4001, "商家信息无效");
 | 
						|
        }
 | 
						|
        $applyStaff = BusinessRepository::getInstance()->getApplyStaffByUserCode($userCode);
 | 
						|
        if(empty($applyStaff)){
 | 
						|
            return $this->json(4001,"申请记录不存在");
 | 
						|
        }
 | 
						|
 | 
						|
        if(!isset($applyStaff->account)||empty($applyStaff->account)){
 | 
						|
            return $this->json(4001,"申请人信息不存在");
 | 
						|
        }
 | 
						|
        if($applyStaff->business_code!=$account->business->code){
 | 
						|
            return $this->json(4001,"信息无效");
 | 
						|
        }
 | 
						|
 | 
						|
        if($applyStaff->status != ApplyStaff::status_default){
 | 
						|
            return $this->json(4001,"审核过了");
 | 
						|
        }
 | 
						|
 | 
						|
        //开始数据操作
 | 
						|
        Db::startTrans();
 | 
						|
        try {
 | 
						|
            $applyStaff->save(["status"=>$status]);
 | 
						|
 | 
						|
            //如果是审核通过 修改员工状态
 | 
						|
            if($status==ApplyStaff::status_success){
 | 
						|
                $applyStaff->account->save(["type"=>AccountModel::type_staff,"business_code"=>$account->business->code,"main_code"=>$account->user_code]);
 | 
						|
            }
 | 
						|
 | 
						|
            Db::commit();
 | 
						|
            return $this->json();
 | 
						|
        } catch (RepositoryException $e) {
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(5001,"审核失败");
 | 
						|
        }catch (Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json(5002,"审核失败");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 解除员工关系
 | 
						|
     * */
 | 
						|
    public function relieveApplyStaff()
 | 
						|
    {
 | 
						|
        $userCode = input("user_code/s", '');
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $accountRepo = AccountRepository::getInstance();
 | 
						|
 | 
						|
        $account = $accountRepo->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(["business"]);
 | 
						|
        });
 | 
						|
 | 
						|
        if (empty($account)) {
 | 
						|
            return $this->json(6001, "用户无效!");
 | 
						|
        }
 | 
						|
 | 
						|
        if ($account->type != AccountModel::type_business) {
 | 
						|
            return $this->json(4001, "您没有权限");
 | 
						|
        }
 | 
						|
        if (!isset($account->business) || empty($account->business)) {
 | 
						|
            return $this->json(4001, "商家信息无效");
 | 
						|
        }
 | 
						|
 | 
						|
        $staff = $accountRepo->findOneByWhere(["user_code"=>$userCode]);
 | 
						|
        if(empty($staff)){
 | 
						|
            return $this->json(4001, "员工信息不存在");
 | 
						|
        }
 | 
						|
        if($staff->type != AccountModel::type_staff){
 | 
						|
            return $this->json(4001, "员工信息不正确1");
 | 
						|
        }
 | 
						|
        if($staff->main_code != $account->user_code){
 | 
						|
            return $this->json(4001, "员工信息不正确2");
 | 
						|
        }
 | 
						|
        if($staff->business_code != $account->business_code){
 | 
						|
            return $this->json(4001, "员工信息不正确3");
 | 
						|
        }
 | 
						|
        $applyStaff = BusinessRepository::getInstance()->getApplyStaffByUserCodeAndBusinessCode($userCode,$account->business_code);
 | 
						|
        if(empty($applyStaff)){
 | 
						|
            return $this->json(4001,"申请记录不存在");
 | 
						|
        }
 | 
						|
 | 
						|
        //确定是员工后  修改信息
 | 
						|
        Db::startTrans();
 | 
						|
        try {
 | 
						|
            $staff->save(["main_code"=>"","business_code"=>"","type"=>AccountModel::type_consumer]);
 | 
						|
            $applyStaff->delete();
 | 
						|
            Db::commit();
 | 
						|
            return $this->json();
 | 
						|
        }catch (RepositoryException $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json("服务器错误,解除关系失败");
 | 
						|
        }catch (Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            return $this->json("服务器错误,解除关系失败2");
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 商家查看流水
 | 
						|
     * */
 | 
						|
    public function businessBill()
 | 
						|
    {
 | 
						|
        $page           = $this->request->param('page/d', 1);
 | 
						|
        $size           = $this->request->param('size/d', 10);
 | 
						|
        $startTime      = $this->request->param('startTime/s');
 | 
						|
        $endTime        = $this->request->param('endTime/s');
 | 
						|
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $accountRepo = AccountRepository::getInstance();
 | 
						|
 | 
						|
        $account = $accountRepo->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(["business"]);
 | 
						|
        });
 | 
						|
 | 
						|
        if (!isset($account->business) || empty($account->business)) {
 | 
						|
            return $this->json(4001, "商家信息无效");
 | 
						|
        }
 | 
						|
        $businessCode = $account->business->code;
 | 
						|
        $orders = ['id' => 'desc'];
 | 
						|
        $list = BillRepository::getInstance()->apiBillList($page, $size, $businessCode, $startTime, $endTime, $orders);
 | 
						|
        $bill_money_sum = BillRepository::getInstance()->getBillMoneySum($businessCode, $startTime, $endTime );
 | 
						|
 | 
						|
        return $this->json(0,"success",["list"=>$list,"bill_money_sum"=>$bill_money_sum]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 下载商家核销二维码
 | 
						|
     * */
 | 
						|
 | 
						|
    public function downloadWriteOffCode()
 | 
						|
    {
 | 
						|
        $accountId = $this->request->user['user_id'] ?? 0;
 | 
						|
        $accountRepo = AccountRepository::getInstance();
 | 
						|
 | 
						|
        $account = $accountRepo->findById($accountId, [], function ($q) {
 | 
						|
            return $q->with(["business"]);
 | 
						|
        });
 | 
						|
 | 
						|
        if (!isset($account->business) || empty($account->business)) {
 | 
						|
            return $this->json(4001, "商家信息无效");
 | 
						|
        }
 | 
						|
 | 
						|
        $qrData = $this->request->domain() . "/business_code_to_coupon_list?business_code=" . $account->business->code;
 | 
						|
        $w      = 3000;//尺寸
 | 
						|
 | 
						|
        $logoImg    = app()->getRootPath().'public/static/images/icon-logo.jpg';
 | 
						|
 | 
						|
        $result = Builder::create()
 | 
						|
            ->writer(new PngWriter())
 | 
						|
            ->writerOptions([])
 | 
						|
            ->data($qrData)
 | 
						|
            ->encoding(new Encoding('UTF-8'))
 | 
						|
            ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
 | 
						|
            ->size($w)
 | 
						|
            ->margin(10)
 | 
						|
            ->roundBlockSizeMode(new RoundBlockSizeModeMargin())
 | 
						|
            ->logoPath($logoImg)
 | 
						|
            ->logoResizeToHeight(ceil($w/6))
 | 
						|
            ->logoResizeToWidth(ceil($w/6))
 | 
						|
            ->logoPunchoutBackground(true)
 | 
						|
            ->build();
 | 
						|
        header(
 | 
						|
            "Content-type: image/jpg"
 | 
						|
        );
 | 
						|
        $path = "/storage/business/" . $account->business->code . ".jpg";
 | 
						|
        $result->saveToFile( public_path() . $path);
 | 
						|
        return $this->json(0,"success",["url"=>$this->request->domain().$path]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 |