<?php
namespace app\controller ;
use app\controller\Acl;
use app\model\Attribute as Attributes;
use think\facade\Db;
use think\exception\ValidateException;
class Attribute extends Acl {
    //列表
    public function record(){
        $input=input('post.');
        $sql=fastSql($input,[
            ['name','fullLike'],
            ['data','fullLike']
        ]);//构造SQL
        $count = Attributes::where($sql)->count();//获取总条数
        $info = Attributes::where($sql)->page($input['page'],$input['limit'])->order(['sort'=>'asc'])->select();//查询分页数据
        $result=[
            'state'=>'success',
            'count'=>$count,
            'info'=>$info
        ];//返回数据
        return json($result);
    }
    //新增|更新
    public function save(){
        $input=input('post.');
        if(isset($input['id'])){
            //验证数据
            try {
                empty($input['id'])?$this->validate($input,'app\validate\Attribute'):$this->validate($input,'app\validate\Attribute.update');
                //关联判断
                if(!empty($input['id'])){
                    $column=[array_column($input['info'],'name'),array_column(Db::name('attribute_info')->where([['pid','=',$input['id']]])->select()->toArray(),'name')];
                    $diff=array_diff($column[1],$column[0]);
                    if(!empty($diff)){
                        $whereOr=[];
                        foreach($diff as $v){$whereOr[]=['name','like','%'.$v.'%'];}
                        $attr=Db::name('attr')->whereOr($whereOr)->select()->toArray();
                        if(!empty($attr)){
                            $column[]=array_column($attr,'name');
                            $columns=[];
                            foreach($column[2] as $v){$columns=array_merge($columns,explode("|",$v));}
                            foreach($column[2] as $v){
                                if(in_array($v,$columns)){throw new ValidateException('[ '.$v.' ] 存在数据关联,操作已撤销!');}
                            }
                        }
                    }
                }
            } catch (ValidateException $e) {
                return json(['state'=>'error','info'=>$e->getError()]);
                exit;
            }
            
            //处理数据
            Db::startTrans();
            try {
                if(empty($input['id'])){
                    //创建数据
                    $createInfo=Attributes::create($input);
                    $input['id']=$createInfo['id'];//转存主键
                    pushLog('新增辅助属性[ '.$input['name'].' ]');//日志
                }else{
                    //更新数据
                    Attributes::update($input);
                    pushLog('更新辅助属性[ '.$input['name'].' ]');//日志
                }
                
                //INFO数据
                Db::name('attribute_info')->where([['pid','=',$input['id']]])->delete();
                foreach ($input['info'] as $k=>$v) {
                    $input['info'][$k]['pid']=$input['id'];
                }
                Db::name('attribute_info')->insertAll($input['info']);
                
                Db::commit();
            	$result=['state'=>'success'];
            } catch (\Exception $e) {
            	Db::rollback();
            	$result=['state'=>'error','info'=>'内部错误,操作已撤销!'];
            }
        }else{
            $result=['state'=>'error','info'=>'传入参数不完整!'];
        }
        return json($result);
    }
    //获取
    public function get(){
        $input=input('post.');
        if(existFull($input,['id'])){
            $result=[
                'state'=>'success',
                'info'=>Attributes::with(['info'])->where([['id','=',$input['id']]])->find()
            ];
        }else{
            $result=['state'=>'error','info'=>'传入参数不完整!'];
        }
        return json($result);
    }
    //删除
    public function del(){
        $input=input('post.');
        if(existFull($input,['id'])){
            $find=Db::name('attribute')->where([['id','=',$input['id']]])->find();
            $info=Db::name('attribute_info')->where([['pid','=',$input['id']]])->select()->toArray();
            
            //关联判断
            $list=array_column($info,'name');
            $whereOr=[];
            foreach($list as $v){
                $whereOr[]=['name','like','%'.$v.'%'];
            }
            $attr=Db::name('attr')->whereOr($whereOr)->select()->toArray();
            if(!empty($attr)){
                $column=array_column($attr,'name');
                $columns=[];
                foreach($column as $v){
                    $columns=array_merge($columns,explode("|",$v));
                }
                foreach($list as $v){
                    if(in_array($v,$columns)){
                        return json(['state'=>'error','info'=>'存在数据关联,删除失败!']);
                    }
                }
            }
            
            Db::startTrans();
            try {
                Db::name('attribute')->where([['id','=',$input['id']]])->delete();
                Db::name('attribute_info')->where([['pid','=',$input['id']]])->delete();
                pushLog('删除辅助属性[ '.$find['name'].' ]');//日志
                
            	Db::commit();
            	$result=['state'=>'success'];
            } catch (\Exception $e) {
            	Db::rollback();
            	$result=['state'=>'error','info'=>'内部错误,操作已撤销!'];
            }
        }else{
            $result=['state'=>'error','info'=>'传入参数不完整!'];
        }
        return json($result);
    }
    //全部
    public function select(){
        $info = Attributes::with('info')->order(['sort'=>'asc'])->select();
        $result=['state'=>'success','info'=>$info];
        return json($result);
    }
}