using System;
using System.Collections.Generic;
using System.Linq;
using Edu.Cache.User;
using Edu.Common.API;
using Edu.Common.Enum.Course;
using Edu.Common.Enum.OKR;
using Edu.Common.Plugin;
using Edu.Model.ViewModel.OKR;
using Edu.Module.OKR;
using Edu.WebApi.Filter;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;

namespace Edu.WebApi.Controllers.OKR
{
    [Route("api/[controller]/[action]")]
    [ApiExceptionFilter]
    [ApiController]
    [EnableCors("AllowCors")]
    public class OKRPeriodController : BaseController
    {
        /// <summary>
        /// OKR周期处理类对象
        /// </summary>
        private readonly OKRPeriodModule okrPeriodModule = new OKRPeriodModule();


        #region 基础配置
        /// <summary>
        /// 获取OKR周期配置信息
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRPeriodConfigInfo()
        {
            var userInfo = base.UserInfo;
            var model = okrPeriodModule.GetOKRPeriodConfigInfo(userInfo.Group_Id);
            return ApiResult.Success("", new
            {
                model.Id,
                model.PeriodMonth,
                StartDate = model.StartDate.HasValue ? model.StartDate.Value.ToString("yyyy年MM月") : "",
                EndDate = model.EndDate.HasValue ? model.EndDate.Value.ToString("yyyy年MM月") : "",
                model.BeforeNum,
                model.BeforeType,
                model.YearOKR,
                model.DirectorAudit
            });
        }

        /// <summary>
        /// 保存OKR周期配置
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SetOKRPeriodConfigInfo()
        {
            var userInfo = base.UserInfo;
            RB_OKR_PeriodConfig_ViewModel dmodel = JsonHelper.DeserializeObject<RB_OKR_PeriodConfig_ViewModel>(RequestParm.Msg.ToString());
            if (dmodel.PeriodMonth <= 0)
            {
                return ApiResult.ParamIsNull("请选择周期长度");
            }
            if (!dmodel.StartDate.HasValue)
            {
                return ApiResult.ParamIsNull("请选择新周期生效时间");
            }
            if (!dmodel.EndDate.HasValue)
            {
                return ApiResult.ParamIsNull("请选择新周期生效时间");
            }
            if (dmodel.BeforeNum <= 0)
            {
                return ApiResult.ParamIsNull("请选择新周期出现时间");
            }
            if (dmodel.BeforeType <= 0)
            {
                return ApiResult.ParamIsNull("请选择类型");
            }
            if (dmodel.YearOKR <= 0)
            {
                return ApiResult.ParamIsNull("请选择年度是否开启");
            }
            if (dmodel.DirectorAudit <= 0)
            {
                return ApiResult.ParamIsNull("请选择主管审核是否开启");
            }
            if (dmodel.StartDate.Value.AddMonths((int)dmodel.PeriodMonth - 1).ToString("yyyy-MM") != dmodel.EndDate.Value.ToString("yyyy-MM"))
            {
                return ApiResult.ParamIsNull("时间不正确");
            }
            dmodel.StartDate = Convert.ToDateTime(dmodel.StartDate.Value.ToString("yyyy-MM") + "-01");
            dmodel.EndDate = Convert.ToDateTime(dmodel.EndDate.Value.ToString("yyyy-MM") + "-01 23:59:59").AddMonths(1).AddDays(-1);
            dmodel.Group_Id = userInfo.Group_Id;
            dmodel.School_Id = userInfo.School_Id;
            dmodel.CreateBy = userInfo.Id;
            dmodel.CreateTime = DateTime.Now;
            dmodel.UpdateBy = userInfo.Id;
            dmodel.UpdateTime = DateTime.Now;

            string msg = okrPeriodModule.SetOKRPeriodConfigInfo(dmodel, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 获取OKR提醒列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRRemindList()
        {
            var userInfo = base.UserInfo;
            var list = okrPeriodModule.GetOKRRemindList(userInfo.Group_Id);
            return ApiResult.Success("", list.Select(x => new
            {
                x.Id,
                x.Days,
                x.Time,
                x.Enable,
                x.Type
            }));
        }

        /// <summary>
        /// 设置OKR提醒
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SetOKRRemindInfo()
        {
            var userInfo = base.UserInfo;
            RB_OKR_Remind_ViewModel dmodel = JsonHelper.DeserializeObject<RB_OKR_Remind_ViewModel>(RequestParm.Msg.ToString());
            if (string.IsNullOrEmpty(dmodel.Days))
            {
                return ApiResult.ParamIsNull("请选择工作日");
            }
            if (string.IsNullOrEmpty(dmodel.Time))
            {
                return ApiResult.ParamIsNull("请选择时间");
            }
            if (dmodel.Type <= 0)
            {
                return ApiResult.ParamIsNull("请传递类型");
            }

            dmodel.Group_Id = userInfo.Group_Id;
            dmodel.School_Id = userInfo.School_Id;
            dmodel.CreateBy = userInfo.Id;
            dmodel.CreateTime = DateTime.Now;
            dmodel.UpdateBy = userInfo.Id;
            dmodel.UpdateTime = DateTime.Now;
            dmodel.Enable = 1;
            string msg = okrPeriodModule.SetOKRRemindInfo(dmodel, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 谁知OKR提醒启用
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SetOKRRemindEnable()
        {
            var userInfo = base.UserInfo;
            JObject prams = JObject.Parse(RequestParm.Msg.ToString());
            int Type = prams.GetInt("Type", 0);
            if (Type <= 0)
            {
                return ApiResult.ParamIsNull();
            }

            bool flag = okrPeriodModule.SetOKRRemindEnable(Type, userInfo);
            if (flag)
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed();
            }
        }

        /// <summary>
        /// 获取分数配置分页列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRScoreConfigPageList()
        {
            var userInfo = base.UserInfo;
            var pageModel = JsonHelper.DeserializeObject<ResultPageModel>(RequestParm.Msg.ToString());
            var dmodel = JsonHelper.DeserializeObject<RB_OKR_Score_ViewModel>(RequestParm.Msg.ToString());
            dmodel.Group_Id = userInfo.Group_Id;

            var list = okrPeriodModule.GetOKRScoreConfigPageList(pageModel.PageIndex, pageModel.PageSize, out long count, dmodel);
            pageModel.Count = Convert.ToInt32(count);
            pageModel.PageData = list.Select(x => new
            {
                x.Id,
                x.Name,
                x.IsDefault,
                DetailList = x.DetailList.OrderBy(x => x.ScoreMin).Select(z => new
                {
                    z.Name,
                    z.ScoreMin,
                    z.ScoreMax,
                    z.Color
                })
            });
            return ApiResult.Success("", pageModel);
        }

        /// <summary>
        /// 设置分数规则
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SetOKRScoreConfigInfo()
        {
            var userInfo = base.UserInfo;
            RB_OKR_Score_ViewModel dmodel = JsonHelper.DeserializeObject<RB_OKR_Score_ViewModel>(RequestParm.Msg.ToString());
            if (string.IsNullOrEmpty(dmodel.Name))
            {
                return ApiResult.ParamIsNull("请传递规则名称");
            }
            if (dmodel.DetailList == null || !dmodel.DetailList.Any())
            {
                return ApiResult.ParamIsNull("请传递分数明细");
            }
            decimal min = 0;
            foreach (var item in dmodel.DetailList)
            {
                if (string.IsNullOrEmpty(item.Name))
                {
                    return ApiResult.ParamIsNull("请传递颜色名称");
                }
                if (item.ScoreMin < 0 || item.ScoreMin >= 1)
                {
                    return ApiResult.ParamIsNull("分数有误");
                }
                if (item.ScoreMax <= 0 || item.ScoreMax > 1)
                {
                    return ApiResult.ParamIsNull("分数有误");
                }
                if (item.ScoreMax < item.ScoreMin)
                {
                    return ApiResult.ParamIsNull("分数有误");
                }
                if (min == 0)
                {
                    if (item.ScoreMin < min)
                    {
                        return ApiResult.ParamIsNull("分数有交集");
                    }
                }
                else
                {
                    if (item.ScoreMin <= min)
                    {
                        return ApiResult.ParamIsNull("分数有交集");
                    }
                }
                min = item.ScoreMax;
            }

            dmodel.IsDefault = 2;
            dmodel.Status = 0;
            dmodel.Group_Id = userInfo.Group_Id;
            dmodel.School_Id = userInfo.School_Id;
            dmodel.CreateBy = userInfo.Id;
            dmodel.CreateTime = DateTime.Now;
            dmodel.UpdateBy = userInfo.Id;
            dmodel.UpdateTime = DateTime.Now;

            string msg = okrPeriodModule.SetOKRScoreConfigInfo(dmodel, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed();
            }
        }

        /// <summary>
        /// 设置分数状态
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SetOKRScoreConfigState()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int ScoreId = parms.GetInt("ScoreId", 0);
            int Type = parms.GetInt("Type", 1);// 类型  1设置默认   2删除
            if (ScoreId <= 0)
            {
                return ApiResult.ParamIsNull("请传递id");
            }

            string msg = okrPeriodModule.SetOKRScoreConfigState(ScoreId, Type, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed();
            }
        }

        /// <summary>
        /// 获取枚举列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetPeriodMonthEnumList()
        {
            var list = EnumHelper.EnumToList(typeof(PeriodMonthEnum));
            return ApiResult.Success("", list.Select(x => new
            {
                x.Name,
                x.Id
            }));
        }
        /// <summary>
        /// 获取枚举列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetPermissionTypeEnumList()
        {
            var list = EnumHelper.EnumToList(typeof(PermissionTypeEnum));
            return ApiResult.Success("", list.Select(x => new
            {
                x.Name,
                x.Id
            }));
        }
        /// <summary>
        /// 获取枚举列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetProgressStateEnumList()
        {
            var list = EnumHelper.EnumToList(typeof(ProgressStateEnum));
            return ApiResult.Success("", list.Select(x => new
            {
                x.Name,
                x.Id
            }));
        }
        #endregion

        #region 目标管理
        /// <summary>
        /// 获取周期列表
        /// </summary>
        /// <returns></returns>
        public ApiResult GetOKRPeriodList()
        {
            var userInfo = base.UserInfo;
            var list = okrPeriodModule.GetOKRPeriodList(userInfo.Group_Id);
            return ApiResult.Success("", list.Select(x => new
            {
                x.Id,
                x.Name,
                StartDate = x.StartDate.ToString("yyyy-MM-dd HH:mm:ss"),
                EndDate = x.EndDate.ToString("yyyy-MM-dd HH:mm:ss"),
                x.IsCurrent,
                x.IsYear
            }));
        }

        /// <summary>
        /// 获取我的目标列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRMyObjectiveList()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int PeriodId = parms.GetInt("PeriodId", 0);
            if (PeriodId <= 0)
            {
                return ApiResult.ParamIsNull("请传递周期id");
            }
            var list = okrPeriodModule.GetOKRMyObjectiveList(PeriodId, userInfo);
            return ApiResult.Success("", list);
        }

        /// <summary>
        /// 获取单个我的目标
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRMyObjectiveInfo() {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int ObjectiveId = parms.GetInt("ObjectiveId", 0);
            if (ObjectiveId <= 0)
            {
                return ApiResult.ParamIsNull("请传递目标id");
            }
            var obj = okrPeriodModule.GetOKRMyObjectiveInfo(ObjectiveId, userInfo);
            return ApiResult.Success("", obj);
        }

        /// <summary>
        /// 新增修改目标
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyObjectiveInfo()
        {
            var userInfo = base.UserInfo;
            RB_OKR_Objective_ViewModel dmodel = JsonHelper.DeserializeObject<RB_OKR_Objective_ViewModel>(RequestParm.Msg.ToString());
            if (string.IsNullOrEmpty(dmodel.Title))
            {
                return ApiResult.ParamIsNull("请输入Objective");
            }
            if (dmodel.PeriodId <= 0)
            {
                return ApiResult.ParamIsNull("请传递周期id");
            }

            string msg = okrPeriodModule.SetOKRMyObjectiveInfo(dmodel, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 新增修改关键结果
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultInfo()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResultId = parms.GetInt("KeyResultId", 0);
            int ObjectiveId = parms.GetInt("ObjectiveId", 0);
            string Name = parms.GetStringValue("Name");
            if (string.IsNullOrEmpty(Name))
            {
                return ApiResult.ParamIsNull("请传递结果值");
            }
            if (KeyResultId <= 0 && ObjectiveId <= 0)
            {
                return ApiResult.ParamIsNull("结果id不正确");
            }

            string msg = okrPeriodModule.SetOKRMyKeyResultInfo(KeyResultId, ObjectiveId, Name, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 设置目标排序
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyObjectiveSort()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int ObjectiveId1 = parms.GetInt("ObjectiveId1", 0);
            int ObjectiveId2 = parms.GetInt("ObjectiveId2", 0);//目标的后面
            if (ObjectiveId1 <= 0)
            {
                return ApiResult.ParamIsNull();
            }
            if (ObjectiveId2 < 0)
            {
                return ApiResult.ParamIsNull();
            }
            if (ObjectiveId1 == ObjectiveId2)
            {
                return ApiResult.Success();
            }

            string msg = okrPeriodModule.SetOKRMyObjectiveSort(ObjectiveId1, ObjectiveId2, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 设置目标关键结果排序
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultSort()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResult1 = parms.GetInt("KeyResult1", 0);
            int KeyResult2 = parms.GetInt("KeyResult2", 0);//结果的后面
            if (KeyResult1 <= 0)
            {
                return ApiResult.ParamIsNull();
            }
            if (KeyResult2 < 0)
            {
                return ApiResult.ParamIsNull();
            }
            if (KeyResult1 == KeyResult2)
            {
                return ApiResult.Success();
            }

            string msg = okrPeriodModule.SetgetOKRMyKeyResultSort(KeyResult1, KeyResult2, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 设置目标状态
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyObjectiveState()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int ObjectiveId = parms.GetInt("ObjectiveId", 0);
            int Type = parms.GetInt("Type", 1);// 类型 1设置默认状态  2设置自定义状态  3删除
            int ProgressState = parms.GetInt("ProgressState", 0);
            if (ObjectiveId <= 0)
            {
                return ApiResult.ParamIsNull("请传递目标id");
            }
            if (Type == 2 && ProgressState <= 0)
            {
                return ApiResult.ParamIsNull("请传递自定义状态");
            }

            string msg = okrPeriodModule.SetOKRMyObjectiveState(ObjectiveId, Type, ProgressState, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 修改关键结果状态
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultState()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResultId = parms.GetInt("KeyResultId", 0);
            int Type = parms.GetInt("Type", 0);// 类型 1自定义状态   2删除(作废)  3切换为简单模式   4切换为高级模式
            string ProgressState = parms.GetStringValue("ProgressState");
            if (KeyResultId <= 0)
            {
                return ApiResult.ParamIsNull();
            }

            string msg = okrPeriodModule.SgetOKRMyKeyResultState(KeyResultId, Type, ProgressState, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 修改目标关键结果进度
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultProgress()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResultId = parms.GetInt("KeyResultId", 0);
            int Type = parms.GetInt("Type", 0);// 类型 1简单模式   2高级模式
            int Progress = parms.GetInt("Progress", 0);
            decimal StartValue = parms.GetDecimal("StartValue");
            decimal EndValue = parms.GetDecimal("EndValue");
            decimal CurrentValue = parms.GetDecimal("CurrentValue");
            if (KeyResultId <= 0)
            {
                return ApiResult.ParamIsNull();
            }
            if (Progress < 0 || StartValue < 0 || EndValue < 0 || CurrentValue < 0)
            {
                return ApiResult.ParamIsNull("不能小于0");
            }

            return okrPeriodModule.SgetOKRMyKeyResultProgress(KeyResultId, Type, Progress, StartValue, EndValue, CurrentValue, userInfo);
        }

        /// <summary>
        /// 修改目标关键结果权重
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultWeight() {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResultId = parms.GetInt("KeyResultId", 0);
            decimal Weight = parms.GetDecimal("Weight");
            if (KeyResultId <= 0) {
                return ApiResult.ParamIsNull("请传递结果Id");
            }
            if (Weight < 0 || Weight > 100) {
                return ApiResult.ParamIsNull("权重值有误");
            }

            return okrPeriodModule.SgetOKRMyKeyResultWeight(KeyResultId, Weight, userInfo);
        }

        /// <summary>
        /// 修改目标关键结果分数
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultScore() {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResultId = parms.GetInt("KeyResultId", 0);
            decimal Score = parms.GetDecimal("Score");
            if (KeyResultId <= 0)
            {
                return ApiResult.ParamIsNull("请传递结果Id");
            }
            if (Score < 0 || Score > 1)
            {
                return ApiResult.ParamIsNull("分值有误");
            }

            return okrPeriodModule.SgetOKRMyKeyResultScore(KeyResultId, Score, userInfo);
        }

        /// <summary>
        /// 删除关键结果状态
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyKeyResultDel()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int KeyResultId = parms.GetInt("KeyResultId", 0);
            if (KeyResultId <= 0)
            {
                return ApiResult.ParamIsNull();
            }

            return okrPeriodModule.SgetOKRMyKeyResultDel(KeyResultId, userInfo);
        }

        //权限  添加对齐  审核  评论  左边人员列表   对齐视图  数据看板  (管理员版  对齐视图  数据看板)

        #region 添加对齐
        /// <summary>
        /// 添加对齐
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyObjectiveParent() {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int ObjectiveId = parms.GetInt("ObjectiveId", 0);
            int ParentId = parms.GetInt("ParentId", 0);
            if (ParentId <= 0)
            {
                return ApiResult.ParamIsNull("请传递对齐目标id");
            }
            if (ObjectiveId <= 0)
            {
                return ApiResult.ParamIsNull("请传递当前目标id");
            }
            if (ObjectiveId == ParentId)
            {
                return ApiResult.ParamIsNull();
            }

            string msg = okrPeriodModule.SetOKRMyObjectiveParent(ObjectiveId, ParentId, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 取消对齐
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRMyObjectiveParentCancel()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int ObjectiveId = parms.GetInt("ObjectiveId", 0);
            int ParentId = parms.GetInt("ParentId", 0);
            if (ParentId <= 0)
            {
                return ApiResult.ParamIsNull("请传递对齐目标id");
            }
            if (ObjectiveId <= 0)
            {
                return ApiResult.ParamIsNull("请传递当前目标id");
            }

            string msg = okrPeriodModule.SgetOKRMyObjectiveParentCancel(ObjectiveId, ParentId, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else
            {
                return ApiResult.Failed(msg);
            }
        }

        /// <summary>
        /// 获取他人的目标列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKROthersObjectiveDropList()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int PeriodId = parms.GetInt("PeriodId", 0);//周期id
            int UserId = parms.GetInt("UserId", 0);//他人id
            int ObjectiveId = parms.GetInt("ObjectiveId", 0);//当前目标
            if (PeriodId <= 0)
            {
                return ApiResult.ParamIsNull("请传递周期id");
            }
            if (UserId <= 0)
            {
                return ApiResult.ParamIsNull("请传递用户id");
            }
            if (ObjectiveId <= 0)
            {
                return ApiResult.ParamIsNull("请传递当前目标id");
            }
            if (UserId == userInfo.Id)
            {
                return ApiResult.Failed("只能对齐他人目标");
            }

            var list = okrPeriodModule.GetOKROthersObjectiveDropList(PeriodId, ObjectiveId, UserId, userInfo);
            return ApiResult.Success("", list);
        }
        #endregion

        #region 权限控制

        /// <summary>
        /// 获取权限控制列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRPermissionList() {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int TargetId = parms.GetInt("TargetId", 0);
            int Type = parms.GetInt("Type", 0);// 1周期  2目标  3关键结果
            if (TargetId <= 0)
            {
                return ApiResult.ParamIsNull("请传递当前目标id");
            }

            var list = okrPeriodModule.GetOKRPermissionList(TargetId, Type, userInfo);
            return ApiResult.Success("", list.Select(x => new
            {
                x.Id,
                x.PermissionType,
                x.TargetId,
                x.Type,
                TypeName = x.Type.ToName(),
                x.SourceId,
                x.SourceName,
                x.State
            }));
        }

        /// <summary>
        /// 设置权限
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult SgetOKRPermissionInfo() {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int PermissionType = parms.GetInt("PermissionType", 0);
            int TargetId = parms.GetInt("TargetId", 0);
            string List = parms.GetStringValue("List");
            if (PermissionType <= 0)
            {
                return ApiResult.ParamIsNull("请传递权限类型");
            }
            if (TargetId <= 0)
            {
                return ApiResult.ParamIsNull("请传递目标值");
            }
            if (string.IsNullOrEmpty(List)) {
                return ApiResult.ParamIsNull("请传递列表数据");
            }
            List<RB_OKR_Permission_ViewModel> dmodel = JsonHelper.DeserializeObject<List<RB_OKR_Permission_ViewModel>>(List);
            foreach (var item in dmodel)
            {
                item.PermissionType = PermissionType;
                item.TargetId = TargetId;
                if (item.Type <= 0)
                {
                    return ApiResult.ParamIsNull("请传递类型");
                }
                if (item.SourceId <= 0)
                {
                    return ApiResult.ParamIsNull("请传递来源id");
                }
                if (item.State <= 0)
                {
                    return ApiResult.ParamIsNull("请传递查看状态");
                }

                item.Group_Id = userInfo.Group_Id;
                item.School_Id = userInfo.School_Id;
                item.CreateBy = userInfo.Id;
                item.CreateTime = DateTime.Now;
                item.UpdateBy = userInfo.Id;
                item.UpdateTime = DateTime.Now;
            }
            string msg = okrPeriodModule.SgetOKRPermissionInfo(PermissionType, TargetId, dmodel, userInfo);
            if (msg == "")
            {
                return ApiResult.Success();
            }
            else {
                return ApiResult.Failed(msg);
            }
        }

        #endregion

        #region 左边人员列表

        /// <summary>
        /// 获取我的人员列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRMyEmployeeList() {
            var userInfo = base.UserInfo;

            var obj = okrPeriodModule.GetOKRMyEmployeeList(userInfo);
            return ApiResult.Success("", obj);
        }

        /// <summary>
        /// 获取我的对齐人员列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRMyEmployeeAlignList()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int PeriodId = parms.GetInt("PeriodId", 0);
            if (PeriodId <= 0) {
                return ApiResult.ParamIsNull();
            }

            var obj = okrPeriodModule.GetOKRMyEmployeeAlignList(PeriodId, userInfo);
            return ApiResult.Success("", obj);
        }

        /// <summary>
        /// 获取我的审核人员列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKRMyEmployeeAuditList()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int PeriodId = parms.GetInt("PeriodId", 0);
            if (PeriodId <= 0)
            {
                return ApiResult.ParamIsNull();
            }

            var obj = okrPeriodModule.GetOKRMyEmployeeAuditList(PeriodId, userInfo);
            return ApiResult.Success("", obj);
        }

        #endregion

        #region 他人目标

        /// <summary>
        /// 获取他人的目标列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetOKROthersObjectiveList()
        {
            var userInfo = base.UserInfo;
            JObject parms = JObject.Parse(RequestParm.Msg.ToString());
            int PeriodId = parms.GetInt("PeriodId", 0);
            int UserId = parms.GetInt("UserId", 0);
            if (PeriodId <= 0)
            {
                return ApiResult.ParamIsNull("请传递周期id");
            }
            if (UserId <= 0)
            {
                return ApiResult.ParamIsNull("请传递用户id");
            }
            if (UserId == userInfo.Id)
            {
                return ApiResult.Failed("只能查看他人目标");
            }

            var list = okrPeriodModule.GetOKROthersObjectiveList(PeriodId, UserId, userInfo);
            return ApiResult.Success("", list);
        }

        #endregion

        #region 评论+关注



        #endregion
        #endregion

        #region okr评论管理
        /// <summary>
        /// 获取评论分页列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ApiResult GetCommentPageList()
        {
            var pageModel = Common.Plugin.JsonHelper.DeserializeObject<ResultPageModel>(RequestParm.Msg.ToString());
            var query = new RB_OKR_Comment_ViewModel()
            {

                School_Id = base.ParmJObj.GetInt("School_Id"),
                State = base.ParmJObj.GetInt("State", 0),
                PeriodId = base.ParmJObj.GetInt("PeriodId", 0)
            };
            query.Group_Id = base.UserInfo.Group_Id;
            var list = okrPeriodModule.GetCommentPageList(pageModel.PageIndex, pageModel.PageSize, out long rowsCount, query);
            foreach (var item in list)
            {
                if (item.CreateBy > 0)
                {
                    item.CreateByName = UserReidsCache.GetUserLoginInfo(item.CreateBy)?.AccountName ?? "";
                    item.CreateByIco = UserReidsCache.GetUserLoginInfo(item.CreateBy)?.UserIcon ?? "";
                }
                if (item.UpdateBy > 0)
                {
                    item.UpdateByName = UserReidsCache.GetUserLoginInfo(item.UpdateBy)?.AccountName ?? "";
                }
                item.CreateTimeStr = StringHelper.DateFormatToString(item.CreateTime);
            }
            pageModel.Count = rowsCount;
            pageModel.PageData = list.Select(x => new { x.CreateByName,x.Id, x.CreateByIco, x.UpdateByName, x.Content, x.CreateTimeStr });
            return ApiResult.Success(data: pageModel);
        }

        /// <summary>
        /// 新增评论状态
        /// </summary>
        /// <returns></returns>
        public ApiResult SetComment()
        {
            var extModel = new RB_OKR_Comment_ViewModel()
            {
                School_Id = base.ParmJObj.GetInt("School_Id"),
                PeriodId = base.ParmJObj.GetInt("PeriodId"),
                Content = base.ParmJObj.GetStringValue("Content"),
            };
            extModel.CreateBy = base.UserInfo.Id;
            extModel.State = 1;
            extModel.CreateTime = System.DateTime.Now;
            extModel.UpdateTime = System.DateTime.Now;
            extModel.UpdateBy = base.UserInfo.Id;
            extModel.Group_Id = base.UserInfo.Group_Id;
            bool flag = okrPeriodModule.SetOKRComment(extModel);
            return flag ? ApiResult.Success() : ApiResult.Failed();
        }

        /// <summary>
        /// 修改评论状态
        /// </summary>
        /// <returns></returns>
        public ApiResult SetCommentStatus()
        {
            var extModel = new RB_OKR_Comment_ViewModel()
            {
                Id = base.ParmJObj.GetInt("Id"),
                State = base.ParmJObj.GetInt("State"),
            };
            if (extModel.Id <= 0)
            {
                return ApiResult.ParamIsNull(message: "未获取到评论编号,请刷新页面重试!");
            }
            if (extModel.State <= 0)
            {
                return ApiResult.ParamIsNull(message: "请传递评论状态!");
            }
            extModel.UpdateBy = base.UserInfo.Id;
            bool flag = okrPeriodModule.SetOKRComment(extModel);
            return flag ? ApiResult.Success() : ApiResult.Failed();
        }



        #endregion

    }
}