Activity.php 14.4 KB
<?php

namespace app\api\controller\engineering;
//允许所有的跨域请求
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: *");
header('Access-Control-Allow-Methods: POST,GET,OPTIONS');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
date_default_timezone_set('PRC');

use fast\Tree;
use think\Db;
use app\common\controller\Api;


/**
 * 工程标准化管理
 * @package app\api\controller\engineering
 */
class Activity extends Api
{
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['*'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];
    public $staffInfo;

    //初始化
    public function _initialize()
    {
        parent::_initialize();
        if ($this->request->action() != "login" && $this->request->action() != "screen_mng_login") {
            $staffModel = new \app\admin\model\inspection\Staff();
            $staffInfo = $staffModel->where(['user_id' => $this->auth->id])->find();
            if (empty($staffInfo)) {
                $this->error('当前员工账号异常');
            }
            $this->staffInfo = $staffInfo;
        }
    }

    /**
     * 1、首页统计(最近一次评审活动数据)
     */
    public function dataStatistics()
    {
        $activity = \app\admin\model\engineering\Activity::where("status", "in", ["1", "2"])->order("id desc")->find();
        if (!empty($activity)) {
            $data['activity_id'] = $activity['id'];
            $data['title'] = $activity['title'];
            $data['status_text'] = $activity['status_text'];

            $all_score = 0;
            //评审类目
            $category = Db::name("engineering_category")->field("id,name")->order("weigh asc,id asc")->select();
            if (!empty($category)) {
                foreach ($category as $k => $v) {
                    //查询每个类目已经评价的分数总和
                    $w = [];
                    $w["inspection_staff_id"] = ["=", $this->staffInfo['id']];
                    $w["engineering_activity_id"] = ["=", $activity['id']];
                    $w["engineering_category_id"] = ["=", $v['id']];
                    $category[$k]["sum_score"] = Db::name("engineering_evaluate")->where($w)->sum("score_v");

                    //每个类目的已评项目数/总项目数
                    $exsit_project_num = Db::name("engineering_evaluate")->where($w)->group("engineering_criteria_id")->count();
                    $total_project_num = Db::name("engineering_criteria")->where("engineering_category_id", $v['id'])->count();
                    $category[$k]["exsit_project_num"] = $exsit_project_num;
                    $category[$k]["total_project_num"] = $total_project_num;
                    $category[$k]["percent"] = number_format($exsit_project_num / $total_project_num, 2);
                    $all_score += $category[$k]["sum_score"];
                }
            }
            $data['region_full_score'] = Db::name("engineering_project")->sum("score");
            $data['all_score'] = $all_score;
            $data['level_text'] = $all_score >= 920 ? "合格" : "不合格";
            $data['category'] = $category;

        }
        $this->success("评价统计数据获取成功", $data);

    }

    /**
     * 2、根据活动id获取类别、项目列表
     *
     */
    public function categoryProjectList()
    {
        $param = $this->request->param();
        $activity_id = $param['activity_id'];
        if (!empty($activity_id)) {
            $category = Db::name("engineering_category")->field("id,name")->order("weigh asc,id asc")->select();
            if (!empty($category)) {

                $field = "id,engineering_category_id,name,base_requirement,more_requirement,score";
                foreach ($category as $k => $v) {
                    $category_sum_score = 0;//某类别下已得总分
                    $category_all_score = 0;//某类别下总分
                    //每个类目的已评项目数/总项目数
                    $w = [];
                    $w["inspection_staff_id"] = ["=", $this->staffInfo['id']];
                    $w["engineering_activity_id"] = ["=", $activity_id];
                    $w["engineering_category_id"] = ["=", $v['id']];
                    $exsit_project_num = Db::name("engineering_evaluate")->where($w)->group("engineering_criteria_id")->count();
                    $total_project_num = Db::name("engineering_criteria")->where("engineering_category_id", $v['id'])->count();
                    $category[$k]["exsit_project_num"] = $exsit_project_num;
                    $category[$k]["total_project_num"] = $total_project_num;

                    $project = Db::name("engineering_project")->where("engineering_category_id", $v['id'])->field($field)->order("weigh asc,id asc")->select();
                    if (!empty($project)) {
                        foreach ($project as $kk => $vv) {
                            //查表
                            $project[$kk]['activity_id'] = $activity_id;
                            $w = [];
                            $w["inspection_staff_id"] = ["=", $this->staffInfo['id']];
                            $w["engineering_activity_id"] = ["=", $activity_id];
                            $w["engineering_project_id"] = ["=", $vv['id']];
                            $project[$kk]["sum_score"] = Db::name("engineering_evaluate")->where($w)->sum("score_v");
                            $category_sum_score += $project[$kk]["sum_score"];
                            $category_all_score += $vv['score'];

                            $exsit_criteria_num = Db::name("engineering_evaluate")->where($w)->group("engineering_criteria_id")->count();
                            $total_criteria_num = Db::name("engineering_criteria")->where("engineering_project_id", $vv['id'])->count();
                            $project[$kk]["exsit_project_num"] = $exsit_criteria_num;
                            $project[$kk]["total_project_num"] = $total_criteria_num;
                        }
                    }
                    $category[$k]['project'] = $project;
                    $category[$k]['category_sum_score'] = $category_sum_score;
                    $category[$k]['category_all_score'] = $category_all_score;
                    $category[$k]['activity_id'] = $activity_id;
                }
            }
            $this->success("类别/项目数据获取成功", $category);
        } else {
            $this->error("评审活动id异常");
        }
    }

    /**
     * 3、获取评价指标/分值选择项
     */
    public function getCriteriaList()
    {
        $param = $this->request->param();
        $activity_id = $param['activity_id'];
        $engineering_project_id = $param['engineering_project_id'];
        if (empty($activity_id)) {
            $this->error("活动id参数异常");
        }
        if (empty($engineering_project_id)) {
            $this->error("项目id参数异常");
        }
        $project_field = "id as project_id,name,base_requirement,more_requirement,score";
        $project = Db::name("engineering_project")->where("id", $engineering_project_id)->field($project_field)->find();
        if (empty($project)) {
            $this->error("项目数据不存在");
        }
        $project['activity_id'] = $activity_id;
        $field = "id,scoring_tips,full_score";
        $criteria = Db::name("engineering_criteria")->where("engineering_project_id", $engineering_project_id)->field($field)->order("weigh asc,id asc")->select();
        if (!empty($criteria)) {
            foreach ($criteria as $k => $v) {
                $criteria[$k]["activity_id"] = $activity_id;
                $w = [];
                $w["inspection_staff_id"] = ["=", $this->staffInfo['id']];
                $w["engineering_activity_id"] = ["=", $activity_id];
                $w["engineering_project_id"] = ["=", $engineering_project_id];
                $w["engineering_criteria_id"] = ["=", $v['id']];
                $evaluate = Db::name("engineering_evaluate")->where($w)->find();

                $value_arr = $this->recombination_score_to_array($v["full_score"]);
                if (!empty($value_arr) && !empty($evaluate)) {
                    foreach ($value_arr as $k1 => $v1) {
                        //看看分值项被用户选中没有
                        if ($evaluate['score_v'] == $v1['v']) {
                            $value_arr[$k1]["selected"] = 1;//被选中
                        }
                    }
                }
                $criteria[$k]["value_arr"] = $value_arr;
            }
        }
        $project["criteria"] = $criteria;
        $this->success("项目内容、评价指标、分值选择项数据获取成功", $project);
    }

    /**
     * 4、评分
     */
    public function evaluate()
    {
        $param = $this->request->param();
        $activity_id = $param['activity_id'];
        $select_data = $param['select_data'];
        if (empty($activity_id)) {
            $this->error("活动id参数异常");
        } else {
            //查询活动状态
            $activity = Db::name("engineering_activity")->where("id", $activity_id)->find();
            if (empty($activity)) {
                $this->error("测评不存在");
            } elseif ($activity['status'] == 0) {
                $this->error("操作失败[测评活动未开启]");
            } elseif ($activity['status'] == 2) {
                $this->error("操作失败[测评活动已结束]");
            }
        }
        if (empty($select_data)) {
            $this->error("操作失败[请评分后提交]");
        }

        $time = time();
        foreach ($select_data as $k => $v) {
            $insert_data = [];
            $update_data = [];

            $engineering_criteria_id = $v['id'];
            if (empty($engineering_criteria_id)) {
                $this->error("评价指标id参数异常");
            }
            $criteria = Db::name("engineering_criteria")->where("id", $engineering_criteria_id)->find();
            if (empty($criteria)) {
                $this->error("评价指标数据异常[" . $engineering_criteria_id . "]");
            }
            if ($v['score_v'] < 0) {
                $this->error("评分数值异常[" . $engineering_criteria_id . "]");
            } elseif ($v['score_v'] > $criteria['full_score']) {
                $this->error("评分值不能高于系统设定满分值[" . $engineering_criteria_id . "]");
            }

            $project = Db::name("engineering_project")->where("id", $criteria['engineering_project_id'])->find();
            if (empty($project)) {
                $this->error("项目数据异常[" . $engineering_criteria_id . "]");
            }
            $category = Db::name("engineering_category")->where("id", $criteria['engineering_category_id'])->find();
            if (empty($category)) {
                $this->error("类目数据异常[" . $engineering_criteria_id . "]");
            }
            $w = [];
            $w["inspection_staff_id"] = ["=", $this->staffInfo['id']];
            $w["engineering_activity_id"] = ["=", $activity_id];
            $w["engineering_category_id"] = ["=", $criteria['engineering_category_id']];
            $w["engineering_project_id"] = ["=", $criteria['engineering_project_id']];
            $w["engineering_criteria_id"] = ["=", $engineering_criteria_id];
            $exist = Db::name("engineering_evaluate")->where($w)->find();
            if (empty($exist)) {
                $insert_data = [
                    "inspection_staff_id" => $this->staffInfo['id'],
                    "user_id" => $this->auth->id,
                    "engineering_activity_id" => $activity_id,
                    "engineering_category_id" => $criteria['engineering_category_id'],
                    "engineering_project_id" => $criteria['engineering_project_id'],
                    "engineering_criteria_id" => $engineering_criteria_id,
                    "score_v" => $v['score_v'],
                    "createtime" => $time,
                    "updatetime" => $time,
                ];
                Db::name("engineering_evaluate")->insertGetId($insert_data);
            } else {
                $update_data = [
                    "inspection_staff_id" => $this->staffInfo['id'],
                    "user_id" => $this->auth->id,
                    "engineering_activity_id" => $activity_id,
                    "engineering_category_id" => $criteria['engineering_category_id'],
                    "engineering_project_id" => $criteria['engineering_project_id'],
                    "engineering_criteria_id" => $engineering_criteria_id,
                    "score_v" => $v['score_v'],
                    "updatetime" => $time,
                ];
                Db::name("engineering_evaluate")->where("id", $exist['id'])->update($update_data);
            }
        }
        $this->success("保存成功");
    }

    /**
     * 分值重组为数组(分值从小到大)
     */
    public function recombination_score_to_array($value)
    {
        $arr = [];
        if ($value) {
            for ($i = 0; $i <= $value; $i++) {
                $arr[$i]["v"] = $i;
                $arr[$i]["selected"] = 0;
            }
        }
        return $arr;
    }

    /**
     * 5、个人中心历史评价
     */
    public function evaluateRecordList()
    {
        $param = $this->request->param();
        $year = $param["year"] ? $param["year"] : "2023";
        $fmt_start_year_time = $year . "-01-01";
        $fmt_end_year_time = $year . "-12-31";
        $where = [];
        $where["status"] = ["in", ["1", "2"]];
        $where["createtime"] = ["between", [strtotime($fmt_start_year_time), strtotime($fmt_end_year_time)]];
        $activity = \app\admin\model\engineering\Activity::where($where)->field("id as activity_id,title,status")->order("id desc")->select();
        if (!empty($activity)) {
            foreach ($activity as $k1 => $v1) {
                $w = [];
                $w["inspection_staff_id"] = ["=", $this->staffInfo['id']];
                $w["engineering_activity_id"] = ["=", $v1['activity_id']];
                $activity[$k1]['all_score'] = Db::name("engineering_evaluate")->where($w)->sum("score_v");
                $activity[$k1]['region_full_score'] = Db::name("engineering_project")->sum("score");
                $activity[$k1]['level_text'] = $activity[$k1]['all_score'] >= 920 ? "合格" : "不合格";
            }
        }
        $this->success("历史评价数据获取成功", $activity);
    }

}