876 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			876 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["usingRule"]              = DictionaryRepository::getInstance()->getUsingRuleByCouponMainId($couponMain->id);
 | |
|         $data["punishRule"]             = '';//处罚规则 已取消
 | |
| 
 | |
|         $data["content"]                = $couponMain->content;
 | |
| 
 | |
|         //未登录可以领取 0可领取 1已领取
 | |
|         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]);
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 |