<?php
namespace wstmart\admin\model;
use think\Db;
/**
 * ============================================================================
 * WSTMart多用户商城
 * 版权所有 2016-2066 广州商淘信息科技有限公司，并保留所有权利。
 * 官网地址:http://www.wstmart.net
 * 交流社区:http://bbs.shangtaosoft.com
 * 联系QQ:153289970
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！未经本公司授权您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 * 微信菜单业务处理
 */
class WxMenus extends Base{
	/**
	 * 获取树形分类
	 */
	public function pageQuery(){
		return $this->where(['dataFlag'=>1,'parentId'=>input('menuId/d',0)])->order('menuSort asc,menuId desc')->paginate(input('post.pagesize/d'))->toArray();
	}
	
	/**
	 * 获取列表
	 */
	public function listQuery(){
		$listMenu = $this->where(['dataFlag'=>1,'parentId'=>0])->field('menuId,menuName')->order('menuSort asc')->select();
		for ($i = 0; $i < count($listMenu); $i++) {
			$parentId = $listMenu[$i]["menuId"];
			$listSon = $this->where(['dataFlag'=>1,'parentId'=>$parentId])->field('menuId,menuName')->order('menuSort asc')->select();
			$listMenu[$i]['listSon'] = $listSon;
		}	
		return $listMenu;
	}
	
	/**
	 * 获取指定对象
	 */
	public function getById($id){
		return $this->where(['menuId'=>$id])->find();
	}
	
    /**
     * 与微信菜单同步
     */
	public function synchroWx(){
		$this->where('menuId>0')->delete();
		$wx = WXAdmin();
		$data = $wx->wxMenuGet();
		if(isset($data['errcode'])){
			if($data['errcode']!=0)return WSTReturn('与微信同步失败,请清除缓存重试');
		}
		if($data){
			$data = $data['menu']['button'];
			$type = array('click'=>1,'view'=>2,'scancode_push'=>3,'scancode_waitmsg'=>4,'pic_sysphoto'=>5,'pic_photo_or_album'=>6,'pic_weixin'=>7,'location_select'=>8,'media_id'=>9,'view_limited'=>10);
			$dataList = [];
			foreach( $data as $key=>$v){
				$data = [];
				$data['menuName'] = $v['name'];
				$data['createTime'] = date('Y-m-d H:i:s');
				$data['menuType'] = (isset($v['type']))?$type[$v['type']]:'';
				$data['menuKey'] = (isset($v['key']))?$v['key']:'';
				$data['menuSort'] = $key;
				$data['menuUrl'] = '';
				$rs = $this->insert($data,false,true);
				if($v['sub_button']){
					foreach($v['sub_button'] as $keys=>$vs){
						$datas = [];
						$datas['menuName'] = $vs['name'];
						$datas['parentId'] = $rs;
						$datas['menuSort'] = $keys;
						$datas['createTime'] = date('Y-m-d H:i:s');
						$datas['menuType'] = (isset($vs['type']))?$type[$vs['type']]:'';
						$datas['menuKey'] = (isset($vs['key']))?$vs['key']:'';
						$datas['menuUrl'] = (isset($vs['url']))?$vs['url']:'';
						$dataList[] = $datas;
					}
				}
			}
			$this->insertAll($dataList);
			return WSTReturn("与微信同步成功", 1);
		}
	}
	
    /**
     * 同步到微信菜单
     */
    public function synchroAd(){
    	$rs = Db::name('wx_menus')->where('dataFlag=1')->order('menuSort asc')->select();
    	$arr = $this->makeNewArr($rs,0);
    	header('content-type:text/html;charset=utf-8');
    	$arr = json_encode($arr,JSON_UNESCAPED_UNICODE);
    	$wx = WXAdmin();
    	$data = $wx->wxMenuCreate($arr);
        if($data['errcode']==0){
            return WSTReturn('菜单同步成功',1);
        }
        return WSTReturn('菜单同步失败,请清除缓存重试');
    }
    function makeNewArr($data,$pId){
    	$type = array(1=>'click',2=>'view',3=>'scancode_push',4=>'scancode_waitmsg',5=>'pic_sysphoto',6=>'pic_photo_or_album',7=>'pic_weixin',8=>'location_select',9=>'media_id',10=>'view_limited');
    	$c=0;
    	$newArr = [];
    	foreach($data as $k=>$v){
    		if($v['parentId']==$pId){
    			$sub_button = $this->makeNewArr($data,$v['menuId']);
    			if($pId==0){
    				$arr = ['name'=>$v['menuName']];
    				if(!empty($sub_button)){
    					$arr['sub_button'] = $sub_button;
    				}else{
    					$arr['key']=$v['menuKey'];
    					$arr['type']=$type[$v['menuType']];
                        if($v['menuUrl']!='')
    					   $arr['url']=$v['menuUrl'];
    				}
    				$newArr['button'][] = $arr;
    			}else{
    				$newArr[$c]['name'] = $v['menuName'];
    				$newArr[$c]['key'] = $v['menuKey'];
    				$newArr[$c]['type'] =$type[$v['menuType']];
                    if($v['menuUrl']!='')
    				    $newArr[$c]['url'] = $v['menuUrl'];
    				++$c;
    			}
    		}
    	}
    	return $newArr;
    }
    
    /**
     * 查询菜单个数
     */
    function menuNum($parentId){
    	$rs = $this->where(['parentId'=>$parentId,'dataFlag'=>1])->field('menuId')->select();
    	return count($rs);
    }
    
    /**
     * 新增
     */
    public function add(){
    	$data = input('post.');
    	if($data['content']==0){
    		$data['menuType'] = 2;
    	}
    	WSTUnset($data,'menuId,dataFlag,content');
    	if(!$data['menuName'])return WSTReturn("请输入菜单名称");
    	$num = $this->menuNum($data['parentId']);
    	if($data['parentId']==0){
			if($num>=3)return WSTReturn("一级菜单数，个数应为1~3个 ");
    	}else{
    		if($num>=5)return WSTReturn("二级菜单数，个数应为1~5个 ");
    	}
    	$data['parentId'] = $data['parentId'];
    	$data['createTime'] = date('Y-m-d H:i:s');
    	$result = $this->allowField(true)->save($data);
    	if(false !== $result){
    		return WSTReturn("新增成功", 1);
    	}else{
    		return WSTReturn($this->getError(),-1);
    	}
    }
    
    /**
     * 编辑
     */
    public function edit(){
    	$menuId = input('post.menuId/d');
    	$data = input('post.');
    	if($data['content']==0){
    		$data['menuType'] = 2;
    	}
    	WSTUnset($data,'menuId,dataFlag,createTime,content');
    	if(!$data['menuName'])return WSTReturn("请输入菜单名称");
    	$result = $this->allowField(true)->save($data,['menuId'=>$menuId]);
    	if(false !== $result){
    		return WSTReturn("修改成功", 1);
    	}else{
    		return WSTReturn($this->getError(),-1);
    	}
    }
    
    /**
     * 删除
     */
    public function del(){
    	$ids = array();
    	$ids[] = input('post.id/d');
    	$ids = $this->getChild($ids,$ids);
    	$data = [];
    	$data['dataFlag'] = -1;
    	$result = $this->where("menuId in(".implode(',',$ids).")")->update($data);
    	if(false !== $result){
    		return WSTReturn("删除成功", 1);
    	}else{
    		return WSTReturn($this->getError(),-1);
    	}
    }
    
    /**
     * 迭代获取下级
     */
    public function getChild($ids = array(),$pids = array()){
    	$result = $this->where("dataFlag=1 and parentId in(".implode(',',$pids).")")->field('menuId')->select();
    	if(count($result)>0){
    		$cids = array();
    		foreach ($result as $key =>$v){
    			$cids[] = $v['menuId'];
    		}
    		$ids = array_merge($ids,$cids);
    		return $this->getChild($ids,$cids);
    	}else{
    		return $ids;
    	}
    }
}
