using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using OASystem.Domain.Dtos.Task;
using OASystem.Domain.Entities.Groups;
using OASystem.Domain.Entities.WorkOrder;
using OASystem.Domain.ViewModels.JuHeExchangeRate;
using OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice;
using Dm.util;
namespace OASystem.API.Controllers
{
    /// 
    /// 部门任务相关
    /// 
    //[Authorize]
    [Route("api/[controller]/[action]")]
    public class TaskController : ControllerBase
    {
        readonly SqlSugarClient _sqlsugar;
        public TaskController(SqlSugarClient sqlsugar)
        {
            _sqlsugar = sqlsugar;
        }
        /// 
        /// 数据列表
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task GetTaskList(GetTaskListDto dto)
        {
            var jw = JsonView(false);
            if (dto.TypeId < 1 || dto.UserId < 1)
            {
                jw.Msg = "参数有误!";
                return Ok(jw);
            }
            DateTime startTime;
            DateTime endTime = DateTime.Now;
            var expr = Expressionable.Create().And(x => x.IsDel == 0)
                                                              .And(x => x.TypeId == dto.TypeId)
                                                              .And(x => (x.CreateUserId == dto.UserId || x.AssignedUserId == dto.UserId))
                                                              .AndIF(!string.IsNullOrEmpty(dto.Search_Name), x => x.Name.Contains(dto.Search_Name))
                                                              //   .AndIF(dto.Search_UserId > 0, x => (x.CreateUserId == dto.Search_UserId || x.AssignedUserId == dto.Search_UserId))
                                                              .AndIF(DateTime.TryParse(dto.Seach_StartTime, out startTime) && DateTime.TryParse(dto.Seach_EndTime, out endTime), x => x.StartTime >= startTime && x.StartTime <= endTime);
            var query = _sqlsugar.Queryable()
                     .LeftJoin((x, y) => x.GroupId == y.Id && y.IsDel == 0)
                     .LeftJoin((x, y, z) => x.ForeignOptionId == z.Id && z.IsDel == 0)
                     .LeftJoin((x, y, z, w) => x.AssignedUserId == w.Id && w.IsDel == 0)
                     .Where(expr.ToExpression());
            var count = query.Count();
            var temp = query.Select((x, y, z, w) => new
            {
                Id = x.Id,
                TaskName = x.Name,
                StartTime = x.StartTime.ToString("yyyy-MM-dd HH:mm"),
                Assignee = w.CnName,
                ExternalOption = z.Name,
                Team = y.TeamName,
                Active = x.ProgressId,
                CreateUserid = x.CreateUserId
            });
            var list = temp
                .OrderByIF(dto.isLv == 1,
                    x => SqlFunc.IsNull(
                        SqlFunc.Subqueryable()
                            .Where(twt => twt.IsDel == 0 && twt.IsUrgent && twt.WorkOrderId == x.Id)
                            .Min(twt => twt.StartTime),
                        DateTime.MaxValue  // 把 null 替换成极大值
                    )
                )
                .OrderBy(x => x.StartTime)
                .ToPageList(dto.PageIndex, dto.PageSize);
            var data = list.Select(x =>
            {
                var taskArr = _sqlsugar.Queryable()
                                        .Where(y => y.IsDel == 0 && y.WorkOrderId == x.Id)
                                        .ToList();
                var ExtraStep = taskArr.Where(x => x.IsExtraTask == true);
                var historyStep = _sqlsugar.Queryable()
                                        .Where(y => y.IsDel == 0 && y.WorkOrderId == x.Id
                                        && ExtraStep.Select(z => z.Id).Contains(y.WorkTaskId)
                                        && y.IsApproved == 1)
                                        .Select(x => x.WorkTaskId)
                                        .ToList();
                return new WorkOrdeView
                {
                    Id = x.Id,
                    TaskName = x.TaskName,
                    StartTime = x.StartTime,
                    Assignee = x.Assignee,
                    ExternalOption = x.ExternalOption,
                    Team = string.IsNullOrWhiteSpace(x.Team) ? "未选择" : x.Team,
                    StepInfo = new StepInfo
                    {
                        Active = x.Active,
                        ExtraActive = 1,
                        Steps = taskArr.Where(x => x.IsExtraTask == false)
                        .OrderBy(x => x.Sort)
                        .Select(x => new Steps
                        {
                            Id = x.Id,
                            Name = x.Name,
                        }).ToList(),
                        ExtraStep = ExtraStep
                        .OrderBy(x => x.Sort)
                        .Select(x => new ExtraSteps
                        {
                            Id = x.Id,
                            Name = x.Name,
                            Approved = historyStep.Contains(x.Id) ? 1 : 0,
                        }).ToList()
                    },
                    isReview = x.CreateUserid == dto.UserId,
                    UrgentCount = taskArr.Where(x => x.IsUrgent).Count()
                };
            }).ToList();
            jw.Data = data;
            jw.Count = count;
            jw.Msg = "查询成功!";
            jw.Code = 200;
            return Ok(jw);
        }
        /// 
        /// 计算两个时间之间的工作小时数
        /// 工作时间:周一至周五,上午9:00-12:00,下午13:30-18:00
        /// 
        /// 开始时间 "yyyy-MM-dd HH:mm"
        /// 结束时间 "yyyy-MM-dd HH:mm"
        /// 工作小时数
        private double CalcWorkHoursExact(string startStr, string endStr)
        {
            DateTime start = DateTime.ParseExact(startStr, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
            DateTime end = DateTime.ParseExact(endStr, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
            if (end <= start) return 0;
            // 每天工作时间段(分钟)
            (int Start, int End)[] workPeriods = {
            (9 * 60, 12 * 60),      // 上午 9:00-12:00
            (13 * 60 + 30, 18 * 60) // 下午 13:30-18:00
        };
            double totalMinutes = 0;
            DateTime current = start;
            while (current < end)
            {
                DayOfWeek day = current.DayOfWeek;
                if (day >= DayOfWeek.Monday && day <= DayOfWeek.Friday) // 工作日
                {
                    foreach (var period in workPeriods)
                    {
                        DateTime periodStart = current.Date.AddMinutes(period.Start);
                        DateTime periodEnd = current.Date.AddMinutes(period.End);
                        DateTime effectiveStart = periodStart > current ? periodStart : current;
                        DateTime effectiveEnd = periodEnd < end ? periodEnd : end;
                        if (effectiveEnd > effectiveStart)
                        {
                            totalMinutes += (effectiveEnd - effectiveStart).TotalMinutes;
                        }
                    }
                }
                // 下一天 0 点
                current = current.Date.AddDays(1);
            }
            return totalMinutes / 60.0; // 转为小时
        }
        /// 
        /// 根据开始时间和工作小时数,计算结束日期时间
        /// 
        /// 开始时间
        /// 工作小时数
        /// 结束时间
        private DateTime CalcEndDate(DateTime start, double workHours)
        {
            // 工作时间段(分钟)
            (int Start, int End)[] workPeriods = {
            (9 * 60, 12 * 60),      // 上午 9:00-12:00
            (13 * 60 + 30, 18 * 60) // 下午 13:30-18:00
        };
            double remainingMinutes = workHours * 60;
            DateTime current = start;
            while (remainingMinutes > 0)
            {
                DayOfWeek day = current.DayOfWeek;
                if (day >= DayOfWeek.Monday && day <= DayOfWeek.Friday) // 工作日
                {
                    foreach (var period in workPeriods)
                    {
                        DateTime periodStart = current.Date.AddMinutes(period.Start);
                        DateTime periodEnd = current.Date.AddMinutes(period.End);
                        // 如果当前时间超过本段结束,则跳过
                        if (current >= periodEnd) continue;
                        // 当前段开始时间
                        DateTime effectiveStart = current > periodStart ? current : periodStart;
                        double availableMinutes = (periodEnd - effectiveStart).TotalMinutes;
                        if (availableMinutes >= remainingMinutes)
                        {
                            // 剩余工作时间在本段可以完成
                            return effectiveStart.AddMinutes(remainingMinutes);
                        }
                        else
                        {
                            remainingMinutes -= availableMinutes;
                        }
                    }
                }
                // 下一天 0点
                current = current.Date.AddDays(1);
                current = current.Date.AddHours(0);
            }
            return current; // 理论上不会到这里
        }
        private string GetAdjustedStartTime()
        {
            // 获取当前时间
            DateTime now = DateTime.Now;
            // 获取年月日、小时和分钟
            int year = now.Year;
            int month = now.Month;
            int day = now.Day;
            int hours = now.Hour;
            int minutes = now.Minute;
            // 调整分钟数,使其能被10整除
            if (minutes % 10 != 0)
            {
                minutes = (int)Math.Ceiling(minutes / 10.0) * 10;
                // 如果分钟超过59,则进位到下一小时
                if (minutes > 59)
                {
                    minutes = 0;
                    hours++;
                    // 如果小时进位到24,则日期需要增加一天
                    if (hours >= 24)
                    {
                        hours = 0;
                        // 如果小时为24,日期需要增加一天
                        DateTime nextDay = now.AddDays(1);
                        year = nextDay.Year;
                        month = nextDay.Month;
                        day = nextDay.Day;
                    }
                }
            }
            // 格式化时间为 "yyyy-MM-dd HH:mm"
            return new DateTime(year, month, day, hours, minutes, 0).ToString("yyyy-MM-dd HH:mm");
        }
        /// 
        /// 新增/编辑操作基本数据
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task TaskInit(TaskInitDto dto)
        {
            if (dto.TypeId < 1)
            {
                return Ok(JsonView(false, "参数有误!"));
            }
            var jw = JsonView(false);
            var groupList = _sqlsugar.Queryable().Where(x => x.IsDel == 0).OrderByDescending(x => x.VisitStartDate).Select(x => new { x.Id, x.TeamName }).ToList();
            groupList.Insert(0, new { Id = -1, TeamName = "未选择" });
            var setdataids = new List() { 122, 123 };
            var setData = _sqlsugar.Queryable().Where(x => x.IsDel == 0 && setdataids.Contains(x.STid)).Select(x => new
            {
                x.Id,
                x.STid,
                x.Name
            }).ToList();
            var taskLv = setData.Where(x => x.STid == 122);
            var foreignLv = setData.Where(x => x.STid == 123);
            var users = _sqlsugar.Queryable().Where(x => x.IsDel == 0).Select(x => new { x.Id, x.CnName }).ToList();
            users.Insert(0, new { Id = 0, CnName = "未选择" });
            var defaultTask = new ArrayList();
            var startTime = GetAdjustedStartTime();
            if (DateTime.TryParse(startTime, out DateTime thisTime))
            {
                var taskArr = _sqlsugar.Queryable()
                    .Where(x => x.IsDel == 0 && x.TypeId == dto.TypeId)
                    .OrderBy(x => x.Sort).ToList();
                var i = 1;
                foreach (var item in taskArr)
                {
                    var endTime = CalcEndDate(thisTime, item.DurationHours);
                    defaultTask.Add(new WorkTaskView
                    {
                        Name = item.Name,
                        PriorityId = item.PriorityId,
                        IsUrgent = item.IsUrgent,
                        StartTime = thisTime,
                        EndTime = endTime,
                        DurationHours = item.DurationHours,
                        IsExtraTask = false,
                        Sort = i,
                        Remark = item.Remark
                    });
                    i++;
                    thisTime = endTime;
                }
            }
            var data = new
            {
                GroupList = groupList,
                TaskLv = taskLv,
                ForeignLv = foreignLv,
                Users = users,
                DefaultTask = defaultTask,
                startTime
            };
            jw.Data = data;
            jw.Code = 200;
            jw.Msg = "SUCCESS!";
            return Ok(jw);
        }
        /// 
        /// 工单详情
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task TaskDetail(TaskDetailDto dto)
        {
            var jw = JsonView(false);
            var groupList = _sqlsugar.Queryable().Where(x => x.IsDel == 0).OrderByDescending(x => x.VisitStartDate).Select(x => new { x.Id, x.TeamName }).ToList();
            groupList.Insert(0, new { Id = -1, TeamName = "未选择" });
            var setdataids = new List() { 122, 123 };
            var setData = _sqlsugar.Queryable().Where(x => x.IsDel == 0 && setdataids.Contains(x.STid)).Select(x => new
            {
                x.Id,
                x.STid,
                x.Name
            }).ToList();
            var taskLv = setData.Where(x => x.STid == 122);
            var foreignLv = setData.Where(x => x.STid == 123);
            var users = _sqlsugar.Queryable().Where(x => x.IsDel == 0).Select(x => new { x.Id, x.CnName }).ToList();
            users.Insert(0, new { Id = 0, CnName = "未选择" });
            var workOrder = _sqlsugar.Queryable().First(x => x.Id == dto.Id && x.IsDel == 0);
            var tasks = _sqlsugar.Queryable()
                                    .Where(x => x.IsDel == 0 && x.WorkOrderId == workOrder.Id)
                                    .OrderBy(x => x.Sort)
                                    .Select()
                                    .ToList();
            var data = new
            {
                GroupList = groupList,
                TaskLv = taskLv,
                ForeignLv = foreignLv,
                Users = users,
                workOrder = new
                {
                    workOrder.Id,
                    workOrder.Name,
                    workOrder.Remark,
                    workOrder.AssignedUserId,
                    workOrder.ForeignOptionId,
                    workOrder.GroupId,
                    workOrder.StartTime,
                    Action = workOrder.ProgressId
                },
                mainTask = tasks.Where(x => x.IsExtraTask == false).ToList(),
                extraTask = tasks.Where(x => x.IsExtraTask == true).ToList()
            };
            jw.Data = data;
            jw.Code = 200;
            jw.Msg = "SUCCESS!";
            return Ok(jw);
        }
        /// 
        /// 新增/编辑操作
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task TaskOperation(TaskOperationDto dto)
        {
            var jw = JsonView(false);
            jw.Data = "";
            if (dto.TypeId < 1 || dto.AssignedUserId < 1)
            {
                return Ok(JsonView(false, "参数有误!"));
            }
            if (!DateTime.TryParse(dto.StartTime, out DateTime startTime))
            {
                return Ok(JsonView(false, "时间格式不正确!"));
            }
            Task_WorkOrder workOrder = new Task_WorkOrder
            {
                Id = dto.Id,
                AssignedUserId = dto.AssignedUserId,
                CreateTime = DateTime.Now,
                CreateUserId = dto.CreateUserId,
                ForeignOptionId = dto.ForeignOptionId,
                GroupId = dto.GroupId,
                ProgressId = dto.Action,
                TypeId = dto.TypeId,
                IsDel = 0,
                Name = dto.Name,
                StartTime = startTime,
            };
            if (dto.Id == 0)
            {
                _sqlsugar.BeginTran();
                try
                {
                    var workOrderId = _sqlsugar.Insertable(workOrder).ExecuteReturnIdentity();
                    workOrder.Id = workOrderId;
                    List workTasks = dto.Tasks.Select(x => new Task_WorkTask
                    {
                        AssignedUserId = x.AssignedUserId,
                        CreateTime = DateTime.Now,
                        CreateUserId = dto.CreateUserId,
                        DurationHours = x.DurationHours,
                        IsUrgent = x.IsUrgent,
                        PriorityId = x.PriorityId,
                        WorkOrderId = workOrderId,
                        IsDel = 0,
                        StartTime = x.StartTime,
                        EndTime = x.EndTime,
                        IsExtraTask = x.IsExtraTask,
                        Name = x.Name,
                        Sort = x.Sort,
                        Remark = x.Remark
                    }).ToList();
                    _sqlsugar.Insertable(workTasks).ExecuteCommand();
                    _sqlsugar.CommitTran();
                    jw.Code = 200;
                    jw.Msg = "SUCCESS!";
                }
                catch (Exception ex)
                {
                    _sqlsugar.RollbackTran();
                    jw.Code = 500;
                    jw.Msg = ex.Message;
                }
            }
            else
            {
                _sqlsugar.BeginTran();
                try
                {
                    var workOrderId = workOrder.Id;
                    _sqlsugar.Updateable(workOrder)
                    .IgnoreColumns(x => new { x.CreateTime, x.CreateUserId })
                    .ExecuteCommand();
                    List workTasks = dto.Tasks.Select(x => new Task_WorkTask
                    {
                        Id = x.Id,
                        AssignedUserId = x.AssignedUserId,
                        DurationHours = x.DurationHours,
                        IsUrgent = x.IsUrgent,
                        PriorityId = x.PriorityId,
                        WorkOrderId = workOrderId,
                        IsDel = 0,
                        StartTime = x.StartTime,
                        EndTime = x.EndTime,
                        IsExtraTask = x.IsExtraTask,
                        Name = x.Name,
                        Sort = x.Sort,
                        Remark = x.Remark
                    }).ToList();
                    var insertArr = workTasks.Where(x => x.Id == 0).ToList();
                    var updateArr = workTasks.Where(x => x.Id > 0).ToList();
                    var notdeleteArr = updateArr.Select(x => x.Id);
                    _sqlsugar.Updateable().Where(x => x.WorkOrderId == workOrderId && !notdeleteArr.Contains(x.Id))
                     .SetColumns(x => new Task_WorkTask
                     {
                         IsDel = 1,
                         DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm"),
                         DeleteUserId = dto.CreateUserId
                     })
                     .ExecuteCommand();
                    if (insertArr.Any())
                    {
                        insertArr.ForEach(x =>
                        {
                            x.CreateUserId = dto.CreateUserId;
                            x.CreateTime = DateTime.Now;
                        });
                        _sqlsugar.Insertable(insertArr).ExecuteCommand();
                    }
                    if (updateArr.Any())
                    {
                        _sqlsugar.Updateable(updateArr)
                         .IgnoreColumns(x => new { x.CreateTime, x.CreateUserId })
                         .ExecuteCommand();
                    }
                    _sqlsugar.CommitTran();
                    jw.Code = 200;
                    jw.Msg = "SUCCESS!";
                }
                catch (Exception ex)
                {
                    _sqlsugar.RollbackTran();
                    jw.Code = 500;
                    jw.Msg = ex.Message;
                }
            }
            _ = AppNoticeLibrary.SendUserMsg_Task_ToUser(workOrder.Id,
            new List() { dto.AssignedUserId.toString(), "235" }
            , dto.Id == 0);
            return Ok(jw);
        }
        /// 
        /// 获取历史回执数据
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task GetWorkTaskReceipt(GetWorkTaskReceiptDto dto)
        {
            var jw = JsonView(false);
            if (dto.OrderId < 1 || dto.TaskId < 1)
            {
                jw.Msg = "参数有误!";
                return Ok(jw);
            }
            var data = _sqlsugar.Queryable()
                .Where(x => x.WorkOrderId == dto.OrderId && x.WorkTaskId == dto.TaskId && x.IsDel == 0)
                .Select()
                .ToList()
                .Select(x =>
                {
                    var Files = JsonConvert.DeserializeObject>(x.FilePath) ?? new
                     List();
                    return new
                    {
                        x.WorkTaskId,
                        x.WorkOrderId,
                        x.Remark,
                        x.Id,
                        x.RejectReason,
                        x.Content,
                        x.IsApproved,
                        x.IsCompleted,
                        Files = Files.Select(y =>
                        {
                            var sp = y.Split('/');
                            string filename = sp[sp.Length - 1];
                            string ftpUrl = AppSettingsHelper.Get("TaskFileBaseUrl") + y.Replace(AppSettingsHelper.Get("TaskFileBasePath"), AppSettingsHelper.Get("TaskFileFtpPath"));
                            return new
                            {
                                FileName = filename,
                                Url = ftpUrl,
                            };
                        })
                    };
                });
            jw.Data = data;
            jw.Code = 200;
            jw.Msg = "SUCCESS";
            return Ok(jw);
        }
        /// 
        /// 任务回执提交
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task SubmitWorkTaskReceipt([FromForm] SubmitWorkTaskReceiptDto dto)
        {
            var jw = JsonView(false);
            jw.Data = "";
            var orderInfo = _sqlsugar.Queryable().First(x => x.Id == dto.WorkOrderId && x.IsDel == 0);
            if (orderInfo == null)
            {
                jw.Msg = "参数有误!";
                return Ok(jw);
            }
            var filePathArr = new List();
            if (dto.Files != null && dto.Files.Count > 0)
            {
                string winPath = AppSettingsHelper.Get("TaskFileBasePath") + $"{orderInfo.Name}/";
                if (!Directory.Exists(winPath))
                {
                    Directory.CreateDirectory(winPath);
                }
                //保存文件
                foreach (var item in dto.Files)
                {
                    var fileName = item.FileName;
                    var saveFilePath = winPath + fileName;
                    using (FileStream fs = System.IO.File.Create(saveFilePath))
                    {
                        item.CopyTo(fs);
                        fs.Flush();
                    }
                    filePathArr.Add(saveFilePath);
                }
            }
            var task = _sqlsugar.Queryable().
            First(x => x.Id == dto.WorkTaskId && x.IsDel == 0);
            if (task == null)
            {
                jw.Msg = "任务不存在或已删除!";
                return Ok(jw);
            }
            Task_WorkTaskReceipt data = new Task_WorkTaskReceipt
            {
                Content = dto.Content,
                CreateTime = DateTime.Now,
                CreateUserId = dto.UserId,
                IsApproved = 0,
                IsCompleted = dto.IsCompleted,
                WorkTaskId = dto.WorkTaskId,
                WorkOrderId = dto.WorkOrderId,
                FilePath = JsonConvert.SerializeObject(filePathArr)
            };
            var count = _sqlsugar.Insertable(data).ExecuteCommand();
            if (count > 0)
            {
                _ = AppNoticeLibrary.SendUserMsg_TaskSubMit_ToUser(task.Id,
                 new List() { task.CreateUserId.toString() });
            }
            jw.Code = 200;
            jw.Msg = $"{count}条回执单、{dto.Files}个文件保存成功!";
            return Ok(jw);
        }
        /// 
        /// 无记录通过
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task SubmitWorkTaskNotRecord(SubmitWorkTaskNotRecord dto)
        {
            var jw = JsonView(false);
            jw.Data = "";
            var orderInfo = _sqlsugar.Queryable().First(x => x.Id == dto.WorkOrderId && x.IsDel == 0);
            if (orderInfo == null)
            {
                jw.Msg = "参数有误!";
                return Ok(jw);
            }
            var task = _sqlsugar.Queryable().
             First(x => x.Id == dto.WorkTaskId && x.IsDel == 0);
            if (task == null)
            {
                jw.Msg = "任务不存在或已删除!";
                return Ok(jw);
            }
            //设置工单回执
            Task_WorkTaskReceipt data = new Task_WorkTaskReceipt
            {
                Content = string.Empty,
                CreateTime = DateTime.Now,
                CreateUserId = dto.UserId,
                IsApproved = 1,
                IsCompleted = 1,
                WorkTaskId = dto.WorkTaskId,
                WorkOrderId = dto.WorkOrderId,
                FilePath = string.Empty
            };
            _sqlsugar.BeginTran();
            try
            {
                var ReceiptId = _sqlsugar.Insertable(data)
                                         .ExecuteReturnIdentity();
                var existsApproved = _sqlsugar.Queryable()
               .First(x => x.WorkOrderId == dto.WorkOrderId
                && x.WorkTaskId == dto.WorkTaskId
                && x.IsDel == 0
                && x.IsApproved == 1
                && x.Id != ReceiptId);
                if (ReceiptId > 0 && existsApproved == null && !task.IsExtraTask)
                {
                    _sqlsugar.Updateable()
                                                        .SetColumns(x => new Task_WorkOrder
                                                        {
                                                            ProgressId = x.ProgressId + 1
                                                        })
                                                        .Where(x => x.Id == orderInfo.Id)
                                                        .ExecuteCommand();
                }
                _sqlsugar.CommitTran();
                jw.Code = 200;
                jw.Msg = "SUCCESS!";
                jw.Data = ReceiptId;
            }
            catch (Exception ex)
            {
                _sqlsugar.RollbackTran();
                jw.Code = 500;
                jw.Msg = ex.Message;
            }
            return Ok(jw);
        }
        /// 
        /// 软删除工作订单
        /// 
        /// 删除参数
        /// 
        [HttpPost]
        public async Task SoftDeleteWorkOrder(SoftDeleteWorkOrderDto dto)
        {
            var jw = JsonView(false);
            if (dto.WorkOrderId < 1 || dto.UserId < 1)
            {
                jw.Msg = "参数有误!";
                return Ok(jw);
            }
            // 检查工作订单是否存在且未被删除
            var workOrder = _sqlsugar.Queryable()
                .First(x => x.Id == dto.WorkOrderId && x.IsDel == 0);
            if (workOrder == null)
            {
                jw.Msg = "工作订单不存在或已被删除!";
                return Ok(jw);
            }
            // 检查权限:只有创建者或管理员可以删除
            if (workOrder.CreateUserId != dto.UserId)
            {
                jw.Msg = "权限不足,无法删除此工作订单!";
                return Ok(jw);
            }
            _sqlsugar.BeginTran();
            try
            {
                // 软删除工作订单
                var updateWorkOrderResult = _sqlsugar.Updateable()
                    .SetColumns(x => new Task_WorkOrder
                    {
                        IsDel = 1,
                        DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        DeleteUserId = dto.UserId
                    })
                    .Where(x => x.Id == dto.WorkOrderId)
                    .ExecuteCommand();
                // 软删除相关的工作任务
                var updateWorkTaskResult = _sqlsugar.Updateable()
                    .SetColumns(x => new Task_WorkTask
                    {
                        IsDel = 1,
                        DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        DeleteUserId = dto.UserId
                    })
                    .Where(x => x.WorkOrderId == dto.WorkOrderId)
                    .ExecuteCommand();
                // 软删除相关的回执单
                var updateReceiptResult = _sqlsugar.Updateable()
                    .SetColumns(x => new Task_WorkTaskReceipt
                    {
                        IsDel = 1,
                        DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        DeleteUserId = dto.UserId
                    })
                    .Where(x => x.WorkOrderId == dto.WorkOrderId)
                    .ExecuteCommand();
                _sqlsugar.CommitTran();
                jw.Code = 200;
                jw.Msg = "工作订单删除成功!";
                jw.Data = new
                {
                    WorkOrderId = dto.WorkOrderId,
                    DeletedWorkTasks = updateWorkTaskResult,
                    DeletedReceipts = updateReceiptResult,
                    DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                };
            }
            catch (Exception ex)
            {
                _sqlsugar.RollbackTran();
                jw.Code = 500;
                jw.Msg = $"删除失败:{ex.Message}";
            }
            return Ok(jw);
        }
        /// 
        /// 回执审核
        /// 
        /// 
        /// 
        [HttpPost]
        public async Task AuditWorkTaskReceipt(AuditWorkTaskReceiptDto dto)
        {
            var jw = JsonView(false);
            if (dto.ReceiptId < 1 || dto.ApproverId < 1)
            {
                jw.Msg = "参数有误!";
                return Ok(jw);
            }
            if (dto.Approve == -1 && string.IsNullOrWhiteSpace(dto.RejectReason))
            {
                jw.Msg = "驳回必须填写原因!";
                return Ok(jw);
            }
            var receipt = _sqlsugar.Queryable()
                .Includes(o => o.WorkTask)
                .First(x => x.Id == dto.ReceiptId && x.IsDel == 0);
            if (receipt == null)
            {
                jw.Msg = "回执单不存在或已删除!";
                return Ok(jw);
            }
            try
            {
                _sqlsugar.BeginTran();
                var existsApproved = _sqlsugar.Queryable()
               .First(x => x.WorkOrderId == receipt.WorkOrderId && x.WorkTaskId == receipt.WorkTaskId && x.IsDel == 0 && x.IsApproved == 1);
                var affected = _sqlsugar.Updateable()
                    .SetColumns(x => new Task_WorkTaskReceipt
                    {
                        IsApproved = dto.Approve,
                        RejectReason = dto.Approve == -1 ? dto.RejectReason : ""
                    })
                    .Where(x => x.Id == dto.ReceiptId)
                    .ExecuteCommand();
                if (existsApproved == null && dto.Approve == 1 && !receipt.WorkTask.IsExtraTask)
                {
                    _sqlsugar.Updateable()
                                    .SetColumns(x => new Task_WorkOrder
                                    {
                                        ProgressId = x.ProgressId + 1
                                    })
                                    .Where(x => x.Id == receipt.WorkOrderId)
                                    .ExecuteCommand();
                }
                _sqlsugar.CommitTran();
                //企微通知
                _ = AppNoticeLibrary.SendUserMsg_TaskAudit_ToUser
                (receipt.WorkTaskId, dto.Approve == 1,
                dto.RejectReason,
                new List() { receipt.WorkTask.AssignedUserId.toString() });
                jw.Code = 200;
                jw.Msg = "审核完成!";
                jw.Data = new
                {
                    dto.ReceiptId,
                    Status = dto.Approve == 1 ? "审核通过" : "审核驳回",
                    dto.RejectReason,
                    receipt.WorkOrderId,
                    Affected = affected
                };
            }
            catch (Exception ex)
            {
                _sqlsugar.RollbackTran();
                jw.Code = 500;
                jw.Msg = $"审核失败:{ex.Message}";
            }
            return Ok(jw);
        }
    }
}