DiverseYouthNightSchool/application/common/model/dyqc/ManystoreShop.php

514 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\model\dyqc;
use app\common\model\BaseModel;
use app\common\model\school\classes\ClassesLib;
use app\common\model\school\classes\Teacher;
use app\common\model\User;
use app\manystore\model\Manystore;
use app\manystore\model\ManystoreAuthGroup;
use app\manystore\model\ManystoreAuthGroupAccess;
use fast\Random;
use think\Cache;
use think\Model;
class ManystoreShop extends BaseModel
{
// 表名
protected $name = 'manystore_shop';
// 自动写入时间戳字段
protected $autoWriteTimestamp = false;
// 定义时间戳字段名
protected $createTime = false;
protected $updateTime = false;
protected $deleteTime = false;
// 追加属性
protected $append = [
'status_text',
'auth_time_text',
'create_time_text',
'update_time_text'
];
// 拼音对象
protected static $pinyin = null;
protected static function init()
{
self::$pinyin = new \Overtrue\Pinyin\Pinyin('Overtrue\Pinyin\MemoryFileDictLoader');
}
/** 专家团队
* @return \think\model\relation\HasMany
*/
public function teachers()
{
return $this->hasMany(Teacher::class,'shop_id')->where("status","1")->order("weigh desc");
}
public function getLogoAttr($value, $data)
{
if (!empty($value)) return cdnurl($value, true);
}
public function getImageAttr($value, $data)
{
if (!empty($value)) return cdnurl($value, true);
}
public function getImagesAttr($value, $data)
{
$imagesArray = [];
if (!empty($value)) {
$imagesArray = explode(',', $value);
foreach ($imagesArray as &$v) {
$v = cdnurl($v, true);
}
return $imagesArray;
}
return $imagesArray;
}
public function getYyzzImagesAttr($value, $data)
{
$imagesArray = [];
if (!empty($value)) {
$imagesArray = explode(',', $value);
foreach ($imagesArray as &$v) {
$v = cdnurl($v, true);
}
return $imagesArray;
}
return $imagesArray;
}
public function getStatusList()
{
return ['0' => __('Status 0'), '1' => __('Status 1'), '2' => __('Status 2')];
}
public function getStatusTextAttr($value, $data)
{
$value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
$list = $this->getStatusList();
return isset($list[$value]) ? $list[$value] : '';
}
public function getAuthTimeTextAttr($value, $data)
{
$value = $value ? $value : (isset($data['auth_time']) ? $data['auth_time'] : '');
return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
}
public function getCreateTimeTextAttr($value, $data)
{
$value = $value ? $value : (isset($data['create_time']) ? $data['create_time'] : '');
return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
}
public function getUpdateTimeTextAttr($value, $data)
{
$value = $value ? $value : (isset($data['update_time']) ? $data['update_time'] : '');
return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
}
protected function setAuthTimeAttr($value)
{
return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
}
protected function setCreateTimeAttr($value)
{
return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
}
protected function setUpdateTimeAttr($value)
{
return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
}
public function admin()
{
return $this->belongsTo('app\admin\model\Admin', 'admin_id', 'id', [], 'LEFT')->setEagerlyType(0);
}
public function checkFull($id){
$self = $this->get($id,['teachers']);
// var_dump($self->toArray());
if(empty($self["address_city"])
|| empty($self["province"])
|| empty($self["city"])
|| empty($self["district"])
|| empty($self["longitude"])
|| empty($self["latitude"])
|| empty($self["name"])
|| empty($self["image"])
|| empty($self["images"])
|| empty($self["content"])
|| empty($self["tel"])
) return false;
return true;
}
/** 机构详情
* @param $id
* @throws \think\exception\DbException
*/
public function detail($id){
$self = $this->get($id,['teachers']);
if(!$this->checkFull($id))throw new \Exception("当前机构未完善信息,暂时无法展示!");
//一对多隐藏字段方法
// foreach ($self['teachers'] as $k=>$v){
// $v->visible(['id','name','expert_image','expert_content']);
// }
// $self->visible(['id','name','expert_image','expert_content']);
$self["hot"] = $this->getHotClasses($id,$limit=5);
return $self;
}
public function getHotClasses($id,$limit=5){
$data = ClassesLib::where("shop_id",$id)
->where("status",'1')
->limit($limit)
->order("hot desc,weigh desc")
->field("title,headimage,price,hot,weigh")
->select();
return $data;
}
/**申请机构
* @param $type 申请类型 类型:1=个人,2=机构
* @param int $user_id 申请人
* @param $params 申请参数
* @param bool $check
* @param bool $trans
* @return bool
* @throws \Exception
*/
public function apply($type,$user_id=0,$params=[],$check=false,$trans=false){
if($check){
$user = User::get($user_id);
if(!$user)throw new \Exception("用户不存在");
//已经是机构
$shop = ManystoreShop::where( 'user_id',$user_id)->where("status","1")->find();
if($shop)throw new \Exception("已申请机构,请勿重复申请");
//验证参数
//$type 1=个人,2=机构
if(!in_array($type,['1','2']))throw new \Exception("类型参数错误");
//switch不同类型type做不同验证
//未传手机号则默认用户手机号
if(empty($params['tel'])) $params['tel'] = $user['mobile'];
switch ($type) {
case '1': //个人
$rule = [
'name' => 'require',
'tel' => 'require|number',
// 'desc' => 'require',
'front_idcard_image' => 'require',
'reverse_idcard_image' => 'require',
];
$rule_msg = [
'name.require' => '姓名必须填写',
'tel.require' => '服务电话必须填写',
'tel.number' => '服务电话必须是数字',
// 'desc.require' => '申请备注必须填写',
'front_idcard_image.require' => '身份证正面必须上传',
'reverse_idcard_image.require' => '身份证反面必须上传',
];
break;
case '2': //机构
$rule = [
'name' => 'require',
'tel' => 'require|number',
// 'desc' => 'require',
'front_idcard_image' => 'require',
'reverse_idcard_image' => 'require',
'images' => 'require',
'yyzz_images' => 'require',
];
$rule_msg = [
'name.require' => '机构名称必须填写',
'tel.require' => '服务电话必须填写',
'tel.number' => '服务电话必须是数字',
// 'desc.require' => '申请备注必须填写',
'front_idcard_image.require' => '法人身份证正面必须上传',
'reverse_idcard_image.require' => '法人身份证反面必须上传',
'images.require' => '机构环境照片必须上传',
'yyzz_images.require' => '营业执照照片必须上传',
];
break;
}
self::check($params,$rule,$rule_msg);
}
$params["type"] = $type;
// $order = self::getHaveCancelOrder($order_no);
//判断逻辑
if($trans){
self::beginTrans();
}
$res = true;
try{
//事务逻辑
//得到申请单(没有则创建)
$shop = ManystoreShop::where( 'user_id',$user_id)->find();
//如果存在申请单,则直接更新这个单的状态
//如果不存在则创建一个新单
if(!$shop){
//创建申请单
$shop = $this->creatShop($type,$user_id,$params);
}
//更新申请单状态为审核中
$shop['status']= '0';
//清空审核时间
$shop['reason']= '';
$shop['auth_time']= 0;
$shop["admin_id"] = 0;
$shop->save();
$store = Manystore::where("shop_id",$shop['id'])->find();
$store["status"] = 'hidden';
$store->save();
//调用订单事件
$data = ['shop' => $shop];
\think\Hook::listen('shop_apply_after', $data);
if($trans){
self::commitTrans();
}
}catch (\Exception $e){
if($trans){
self::rollbackTrans();
}
throw new \Exception($e->getMessage());
}
return $res;
}
/** 机构后台默认密码获取
* @param $type
* @param $user_id
* @param $params
*
* @throws \think\exception\DbException
*/
public function getDefaultPassword($type,$user_id,$params){
$user = User::get($user_id);
$defaultPassword = null;
switch ($type) {
case '1': //个人
//手机号 + 个人id生成的code
$defaultPassword = $user["mobile"].en_code($user['id']);
// $rule = [
// 'name' => 'require',
// 'tel' => 'require|number',
//// 'desc' => 'require',
// 'front_idcard_image' => 'require',
// 'reverse_idcard_image' => 'require',
// ];
// $rule_msg = [
// 'name.require' => '姓名必须填写',
// 'tel.require' => '服务电话必须填写',
// 'tel.number' => '服务电话必须是数字',
//// 'desc.require' => '申请备注必须填写',
// 'front_idcard_image.require' => '身份证正面必须上传',
// 'reverse_idcard_image.require' => '身份证反面必须上传',
// ];
break;
case '2': //机构
$defaultPassword = $user["mobile"].en_code($user['id']);
// $rule = [
// 'name' => 'require',
// 'tel' => 'require|number',
//// 'desc' => 'require',
// 'front_idcard_image' => 'require',
// 'reverse_idcard_image' => 'require',
// 'images' => 'require',
// 'yyzz_images' => 'require',
// ];
// $rule_msg = [
// 'name.require' => '机构名称必须填写',
// 'tel.require' => '服务电话必须填写',
// 'tel.number' => '服务电话必须是数字',
//// 'desc.require' => '申请备注必须填写',
// 'front_idcard_image.require' => '法人身份证正面必须上传',
// 'reverse_idcard_image.require' => '法人身份证反面必须上传',
// 'images.require' => '机构环境照片必须上传',
// 'yyzz_images.require' => '营业执照照片必须上传',
// ];
break;
}
return $defaultPassword;
}
public function creatShop($type,$user_id,$params){
$params["user_id"] = $user_id;
//商家附表
$shop = (new self);
$shop_info = $shop->allowField(true)->save($params);
if($shop_info === false){
throw new \Exception($shop->getError());
}
//账号主表
$manystore_params = [
"nickname" => $params["name"],
"user_id"=>$user_id,
];
$manystore_params["username"] = $params["tel"] ?: self::$pinyin->permalink($manystore_params["nickname"]);
$manystore_params["email"] = $manystore_params["username"] . "@xx.com";
$manystore_params['password'] = self::getDefaultPassword($type,$user_id,$params);
$manystore_params['shop_id'] = $shop->id;
$manystore_params['salt'] = Random::alnum();
$manystore_params['password'] = md5(md5($manystore_params['password']) . $manystore_params['salt']);
$manystore_params['avatar'] = '/assets/img/avatar.png'; //设置新管理员默认头像。
$manystore_params['is_main'] = 1;
$manystore_params['status'] = "hidden";
$model = new Manystore();
$result = $model->allowField(true)->save($manystore_params);
if ($result === false) {
throw new \Exception($model->getError());
}
$manystoreAuthGroupModel = new ManystoreAuthGroup();
$group = [];
switch ($type) {
case '1': //个人
$group['name'] = '个人认证类型';
$group['rules'] = '*';
break;
case '2': //机构
$group['name'] = '机构认证类型';
$group['rules'] = '*';
break;
}
$group['shop_id'] = $shop->id;
$group['createtime'] = time();
$group['updatetime'] = time();
$group_id = $manystoreAuthGroupModel->insertGetId($group);
if(!$group_id){
$this->error('添加失败');
}
$manystoreAuthGroupAccessModel = new ManystoreAuthGroupAccess();
$group_access = [];
$group_access['uid'] = $model->id;
$group_access['group_id'] = $group_id;
$manystoreAuthGroupAccessModel->insert($group_access);
//调用订单事件
$data = ['shop' => $shop];
\think\Hook::listen('shop_create_after', $data);
return $shop;
}
/** 机耕申请状态查询
*
*/
public static function getAuthInfo($user_id){
$auth_status = '-1'; //-1=未申请,0=待审核,1=审核通过,2=审核失败
$shop_id = 0;
$type = '1';
$reason =""; //失败原因
//得到申请单
$apply_info = self::where("user_id",$user_id)->where("status","1")->find();
if(!$apply_info)$apply_info = self::where("user_id",$user_id)->find();
//不存在说明未申请,直接返回
if(!$apply_info){
return compact('auth_status','shop_id','reason','apply_info',"type");
}
$type = $apply_info['type'];
//从申请单取到申请状态
$auth_status = $apply_info['status'];
//如果是审核失败,取失败原因
if($auth_status == '2'){
$reason = $apply_info['reason'];
}
//如果是申请成功取店铺id
if($auth_status == '1'){
$shop_id = $apply_info['id'];
}
return compact('auth_status','shop_id','reason','apply_info',"type");
}
}