<?php
namespace app\adminVue\controller;

use think\facade\Db;
use think\facade\Cache;
use think\facade\Log;

class V2PerformanceNotice extends V2SuggestionNotice
{
    public function sendPerformance($row,$event)
    {
        $saved=$event==='create'?'绩效已保存':'绩效已删除';
        try{
            $member=Db::name('member_list')->whereRaw('CAST(eid AS UNSIGNED) = ?',[(int)$row['eid']])->order('status,id desc')->find();
            $bindings=$member?Db::name('auth')->where(['user_id'=>$member['id'],'username'=>(string)$member['eid'],'status'=>1])->where('gzhOpenid','<>','')->column('gzhOpenid'):[];
            if(!$bindings)return ['status'=>'skipped','message'=>$saved.'，员工未绑定公众号，未发送通知'];
            $s=$this->settings();if(!$s['appid']||!$s['secret']||!$s['mini'])return ['status'=>'skipped','message'=>$saved.'，公众号通知配置不完整'];
            $key='admin-v2:performance-notice:'.hash('sha256',$s['appid']);$token=Cache::get($key);
            if(!$token){$response=$this->request('https://api.weixin.qq.com/cgi-bin/stable_token',['grant_type'=>'client_credential','appid'=>$s['appid'],'secret'=>$s['secret']]);
                if(empty($response['access_token']))throw new \RuntimeException('Token unavailable');$token=$response['access_token'];Cache::set($key,$token,max(60,(int)($response['expires_in']??7200)-120));}
            $name=Db::name('admin_user')->where('id',$row['aid'])->value('truename')?:'评估人';
            foreach(array_unique($bindings) as $binding){$response=$this->request('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.rawurlencode($token),[
                'touser'=>$binding,'template_id'=>'3Huxw6Ptdx15igJrOWwJ2OhlRmqX15AKwDdI5cK-ZOE','miniprogram'=>['appid'=>$s['mini'],'pagepath'=>$event==='remove'?'pages/performance/index':'pages/performance/detail?id='.$row['id']],
                'data'=>['keyword1'=>['value'=>(string)$row['id']],'keyword2'=>['value'=>$event==='create'?'绩效考评确认':'绩效考评反馈'],'keyword3'=>['value'=>'绩效'.$row['score'].'分，'.($event==='create'?'超期将自动确认！':'已被删除！')],'keyword4'=>['value'=>$name],'keyword5'=>['value'=>date('Y-m-d H:i:s')]]]);
                if((int)($response['errcode']??-1)!==0){if(in_array((int)($response['errcode']??0),[40001,40014,42001],true))Cache::delete($key);throw new \RuntimeException('Notification rejected');}}
            return ['status'=>'sent','message'=>$saved.'，通知已发送'];
        }catch(\Throwable $error){Log::warning('admin-v2 performance notification failed');return ['status'=>'failed','message'=>$saved.'，通知未完整发送，请另行提醒员工，勿重复新增'];}
    }
}
