瀏覽代碼

团组流程相关代码

Lyyyi 4 天之前
父節點
當前提交
71ab26f60a

+ 16 - 13
OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs

@@ -1156,19 +1156,19 @@ namespace OASystem.API.OAMethodLib
                     }).Distinct().ToList();
             }
 
-            //公务资料信息
-            var ioaUsers1 = _sqlSugar.Queryable< Res_OfficialActivities >()
-                .LeftJoin<Sys_Users>((x,y) => x.CreateUserId == y.Id)
-                .Where((x,y) => x.DiId == groupId && x.IsDel == 0)
-                .Select((x, y) => new GroupOperationUserInfo
-                {
-                    UserId = y.Id,
-                    UserName = y.CnName
-                }).Distinct().ToList();
-            if (!ioaUsers.Any())
-            {
-                ioaUsers.AddRange(ioaUsers1);
-            }
+            ////公务资料信息
+            //var ioaUsers1 = _sqlSugar.Queryable< Res_OfficialActivities >()
+            //    .LeftJoin<Sys_Users>((x,y) => x.CreateUserId == y.Id)
+            //    .Where((x,y) => x.DiId == groupId && x.IsDel == 0)
+            //    .Select((x, y) => new GroupOperationUserInfo
+            //    {
+            //        UserId = y.Id,
+            //        UserName = y.CnName
+            //    }).Distinct().ToList();
+            //if (!ioaUsers.Any())
+            //{
+            //    ioaUsers.AddRange(ioaUsers1);
+            //}
             view.Where(it => it.CTableId == 81).FirstOrDefault().OperationUsers = ioaUsers.Distinct().ToList();
 
             //其他款项 98
@@ -1221,6 +1221,9 @@ namespace OASystem.API.OAMethodLib
                     var qtbUsers = qtb.AsEnumerable().
                         Where(x => x.Field<int>("CTId") == groupModule.CTableId).
                         Select(x => x.Field<int>("userid")).ToList();
+
+                    //王鸽、王思雨、朱琳
+
                     groupModule.OperationUsers = qtbUsers.Select(x => new GeneralMethod.GroupOperationUserInfo()
                     {
                         UserId = x,

+ 4 - 0
OASystem/OASystem.Api/appsettings.json

@@ -419,6 +419,10 @@
           "Id": 149,
           "Name": "王鸽"
         },
+        {
+          "Id": 327,
+          "Name": "江姗"
+        },
         //{
         //  "Id": 330,
         //  "Name": "刘琪"

+ 306 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_ProcessOverview.cs

@@ -0,0 +1,306 @@
+using OASystem.Domain.Enums;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.Groups
+{
+    /// <summary>
+    /// 团组流程总览表
+    /// </summary>
+    [SugarTable("Grp_ProcessOverview", "团组流程总览表")]
+    public class Grp_ProcessOverview : EntityBase
+    {
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        [SugarColumn(ColumnName = "GroupId", ColumnDescription = "团组Id", IsNullable = true, ColumnDataType = "int")]
+        public int GroupId { get; set; }
+
+        /// <summary>
+        /// 流程顺序
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessOrder", ColumnDescription = "流程顺序", IsNullable = true, ColumnDataType = "int")]
+        public int ProcessOrder { get; set; }
+
+        /// <summary>
+        /// 流程类型 
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessType", ColumnDescription = "流程类型", ColumnDataType = "int")]
+        public GroupProcessType ProcessType { get; set; }
+
+        /// <summary>
+        /// 整体状态 
+        /// </summary>
+        [SugarColumn(ColumnName = "OverallStatus", ColumnDescription = "流程整体状态",ColumnDataType = "int")]
+        public ProcessStatus OverallStatus { get; set; } = ProcessStatus.UnStarted;
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        [SugarColumn(ColumnName = "EndTime", ColumnDescription = "开始时间", IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        [SugarColumn(ColumnName = "EndTime", ColumnDescription = "结束时间", IsNullable = true, ColumnDataType = "datetime")]
+        public DateTime? EndTime { get; set; }
+
+        /// <summary>
+        /// 更新人 
+        /// </summary>
+        [SugarColumn(ColumnName = "UpdatedUserId", ColumnDescription = "更新人", IsNullable = true, ColumnDataType = "int")]
+        public int UpdatedUserId { get; set; }
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        [SugarColumn(ColumnName = "UpdatedTime", ColumnDescription = "更新时间", ColumnDataType = "datetime")]
+        public DateTime UpdatedTime { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 节点集合 - 流程包含的所有节点(导航属性)
+        /// </summary>
+        [Navigate(NavigateType.OneToMany, nameof(Grp_ProcessNode.ProcessId))]
+        public List<Grp_ProcessNode> Nodes { get; set; } = new List<Grp_ProcessNode>();
+
+        public Grp_ProcessOverview() { }
+
+        /// <summary>
+        /// 流程进度默认模板
+        /// </summary>
+        /// <param name="groupId"></param>
+        /// <param name="currUserId"></param>
+        /// <param name="visaCountries"></param>
+        /// <returns></returns>
+        public static List<Grp_ProcessOverview> ProcessInit(int groupId, int currUserId, List<string> visaCountries)
+        {
+            //单独处理签证流程节点
+            var visaDefualtNodes = new List<VisaNode>() {
+                new(){NodeOrder = 1, NodeName = "收集资料",IsHandle = false,HandleTime = "" },
+                new(){NodeOrder = 2, NodeName = "取护照资料",IsHandle = false,HandleTime = "" },
+                new(){NodeOrder = 3, NodeName = "填资料",IsHandle = false,HandleTime = "" },
+                new(){NodeOrder = 4, NodeName = "送签",IsHandle = false,HandleTime = "" },
+                new(){NodeOrder = 5, NodeName = "出签+取护照",IsHandle = false,HandleTime = "" },
+                new(){NodeOrder = 6, NodeName = "归还护照",IsHandle = false,HandleTime = "",Returner="" }
+            };
+
+            var visaNodes = new List<Grp_ProcessNode>();
+
+            if (visaCountries != null && visaCountries.Count > 0)
+            {
+                for (int i = 1; i < visaCountries.Count + 1; i++)
+                {
+                    visaNodes.Add(new Grp_ProcessNode()
+                    {
+                        NodeOrder = i,
+                        NodeName = visaCountries[i].ToString(),
+                        OverallStatus = ProcessStatus.UnStarted,
+                        IsCurrent = i == 1,
+                        CreateUserId = currUserId
+                    });
+                }
+            }
+
+            return new List<Grp_ProcessOverview>
+            {
+                //商邀报批流程
+                new()
+                {
+                    GroupId = groupId,
+                    ProcessOrder = 1,
+                    ProcessType = GroupProcessType.Invitation,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    StartTime = DateTime.Now,
+                    UpdatedUserId = currUserId,
+                    CreateUserId = currUserId,
+                    Nodes = new List<Grp_ProcessNode>()
+                {
+                    new(){NodeOrder = 1, NodeName="报批资料准备", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
+                    new(){NodeOrder = 2, NodeName="开始报批", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                    new(){NodeOrder = 3, NodeName="报批中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                    new(){NodeOrder = 4, NodeName="报批已出", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId }
+                }
+                },
+
+                //签证流程
+                new()
+                {
+                    GroupId = groupId,
+                    ProcessOrder = 2,
+                    ProcessType = GroupProcessType.Visa,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    StartTime = DateTime.Now,
+                    UpdatedUserId = currUserId,
+                    CreateUserId = currUserId,
+                    Nodes=visaNodes
+                },
+
+                //机票流程
+                new()
+                {
+                    GroupId = groupId,
+                    ProcessOrder = 3,
+                    ProcessType = GroupProcessType.AirTicket,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    StartTime = DateTime.Now,
+                    UpdatedUserId = currUserId,
+                    CreateUserId = currUserId,
+                    Nodes = new List<Grp_ProcessNode>()
+                {
+                    new(){NodeOrder = 1, NodeName="机票占位中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
+                    new(){NodeOrder = 2, NodeName="机票已出", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                }
+                },
+
+                //酒店流程
+                new()
+                {
+                    GroupId = groupId,
+                    ProcessOrder = 4,
+                    ProcessType = GroupProcessType.Hotel,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    StartTime = DateTime.Now,
+                    UpdatedUserId = currUserId,
+                    CreateUserId = currUserId,
+                    Nodes = new List<Grp_ProcessNode>()
+                {
+                    new(){NodeOrder = 1, NodeName="酒店占房中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
+                    new(){NodeOrder = 2, NodeName="酒店已订", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                }
+                },
+
+                //地接流程
+                new()
+                {
+                    GroupId = groupId,
+                    ProcessOrder = 5,
+                    ProcessType = GroupProcessType.LocalGuide,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    StartTime = DateTime.Now,
+                    UpdatedUserId = currUserId,
+                    CreateUserId = currUserId,
+                    Nodes = new List<Grp_ProcessNode>()
+                {
+                    new(){NodeOrder = 1, NodeName="地接对接中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
+                    new(){NodeOrder = 2, NodeName="地接已安排好", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                    new(){NodeOrder = 2, NodeName="出行物资准备完毕", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                }
+                },
+
+                //费用结算流程
+                new()
+                {
+                    GroupId = groupId,
+                    ProcessOrder = 6,
+                    ProcessType = GroupProcessType.FeeSettle,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    StartTime = DateTime.Now,
+                    UpdatedUserId = currUserId,
+                    CreateUserId = currUserId,
+                    Nodes = new List<Grp_ProcessNode>()
+                {
+                    new(){NodeOrder = 1, NodeName="费用结算中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
+                    new(){NodeOrder = 2, NodeName="费用结算完毕", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                }
+                }
+            };
+        }
+    }
+
+    /// <summary>
+    /// 流程节点
+    /// </summary>
+    [SugarTable("Grp_ProcessNode", "流程节点")]
+    public class Grp_ProcessNode : EntityBase
+    {
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        [SugarColumn(ColumnName = "ProcessId ", ColumnDescription = "流程ID", IsNullable = true, ColumnDataType = "int")]
+        public int ProcessId { get; set; }
+
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        [SugarColumn(ColumnName = "NodeName", ColumnDescription = "节点名称", ColumnDataType = "varchar(100)")]
+        public string NodeName { get; set; }
+
+        /// <summary>
+        /// 节点顺序 
+        /// </summary>
+        [SugarColumn(ColumnName = "NodeOrder", ColumnDescription = "节点顺序", ColumnDataType = "int")]
+        public int NodeOrder { get; set; } 
+
+        /// <summary>
+        /// 节点状态 
+        /// </summary>
+        [SugarColumn(ColumnName = "OverallStatus", ColumnDescription = "节点状态", ColumnDataType = "int")]
+        public ProcessStatus OverallStatus { get; set; } = ProcessStatus.UnStarted;
+
+        /// <summary>
+        /// 操作人 
+        /// </summary>
+        [SugarColumn(ColumnName = "Operator ", ColumnDescription = "操作人", IsNullable = true, ColumnDataType = "int")]
+        public int Operator { get; set; }
+
+        /// <summary>
+        /// 操作时间 
+        /// </summary>
+        [SugarColumn(ColumnName = "OperationTime ", ColumnDescription = "操作时间", ColumnDataType = "datetime")]
+        public DateTime OperationTime { get; set; } = DateTime.Now;
+
+        ///// <summary>
+        ///// 国家
+        ///// </summary>
+        //[SugarColumn(ColumnName = "Country", ColumnDescription = "国家", ColumnDataType = "varchar(100)",IsNullable = true)]
+        //public string? Country { get; set; }
+
+        /// <summary>
+        /// 是否为当前节点
+        /// </summary>
+        [SugarColumn(ColumnName = "IsCurrent", ColumnDescription = "是否为当前节点", ColumnDataType = "bit")]
+        [DefaultValue(false)]
+        public bool IsCurrent { get; set; }
+
+        /// <summary>
+        /// 流程信息 - 关联的流程信息(导航属性)
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(ProcessId))]
+        public Grp_ProcessOverview Process { get; set; }
+    }
+
+
+    public class VisaNode
+    {
+        /// <summary>
+        /// 节点顺序
+        /// </summary>
+        public int NodeOrder { get; set; }
+
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        public string NodeName { get; set; }
+
+        /// <summary>
+        /// 是否办理
+        /// </summary>
+        public bool IsHandle { get; set; }
+
+        /// <summary>
+        /// 办理时间
+        /// </summary>
+        public string HandleTime { get; set; }
+
+        /// <summary>
+        /// 归还人
+        /// NodeName = "归还护照" 时使用
+        /// </summary>
+        public string Returner { get; set; }
+    }
+}

+ 60 - 0
OASystem/OASystem.Domain/Enums/GroupProcessType.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Enums
+{
+    /// <summary>
+    /// 团组流程类型
+    /// 商邀报批/签证/机票/酒店/地接/费用结算
+    /// </summary>
+    public enum GroupProcessType
+    {
+        /// <summary>
+        /// 商邀报批
+        /// </summary>
+        Invitation = 1,
+        /// <summary>
+        /// 签证
+        /// </summary>
+        Visa = 2,
+        /// <summary>
+        /// 机票
+        /// </summary>
+        AirTicket = 4,
+        /// <summary>
+        /// 酒店
+        /// </summary>
+        Hotel = 5,
+        /// <summary>
+        /// 地接
+        /// </summary>
+        LocalGuide = 6,
+        /// <summary>
+        /// 费用结算
+        /// </summary>
+        FeeSettle = 7
+    }
+
+    /// <summary>
+    /// 流程整体状态
+    /// 未开始/进行中/已完成
+    /// </summary>
+    public enum ProcessStatus
+    {
+        /// <summary>
+        /// 未开始
+        /// </summary>
+        UnStarted = 1,
+        /// <summary>
+        /// 进行中
+        /// </summary>
+        InProgress = 2,
+        /// <summary>
+        /// 已完成
+        /// </summary>
+        Completed = 3
+    }
+}

+ 88 - 0
OASystem/OASystem.Infrastructure/Repositories/Groups/ProcessOverviewRepository.cs

@@ -0,0 +1,88 @@
+using AutoMapper;
+using OASystem.Domain;
+using OASystem.Domain.Entities.Groups;
+using OASystem.Domain.ViewModels.JuHeExchangeRate;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Infrastructure.Repositories.Groups
+{
+    /// <summary>
+    /// 团组流程总览表仓储
+    /// </summary>
+    public class ProcessOverviewRepository : BaseRepository<Grp_ProcessOverview, Grp_ProcessOverview>
+    {
+        private readonly IMapper _mapper;
+        private readonly DelegationInfoRepository _groupRep;
+        public ProcessOverviewRepository(SqlSugarClient sqlSugar, IMapper mapper, DelegationInfoRepository groupRep) : base(sqlSugar)
+        {
+            _mapper = mapper;
+            _groupRep = groupRep;
+        }
+
+        /// <summary>
+        /// 团组流程初始化
+        /// </summary>
+        /// <param name="request">创建流程请求参数</param>
+        /// <returns>创建的流程信息</returns>
+        public async Task<Result> ProcessInitAsync(int groupId,int currUserId)
+        {
+            //团组验证
+            var groupInfo = await _sqlSugar.Queryable<Grp_DelegationInfo>().FirstAsync(g => g.Id == groupId);
+            if (groupInfo == null)
+            {
+                return new Result { Code = 400, Msg = "团组不存在" };
+            }
+
+            // 检查是否已存在流程
+            var existingProcesses = await _sqlSugar.Queryable<Grp_ProcessOverview>().Where(p => p.GroupId == groupId).ToListAsync();
+            if (existingProcesses.Any())
+            {
+                return new Result { Code = 400, Msg = "该团组的流程已存在" };
+            }
+
+            //处理签证国家
+            var visaCountries = _groupRep.GroupSplitCountry(groupInfo.VisitCountry);
+
+            // 定义默认的流程节点
+            var processs = Grp_ProcessOverview.ProcessInit(groupId,currUserId,visaCountries);
+
+
+            _sqlSugar.BeginTran();
+
+            foreach (var item in processs)
+            {
+                var processId = await _sqlSugar.Insertable(item).ExecuteReturnIdentityAsync();
+
+                if (processId < 1 )
+                {
+                    _sqlSugar.RollbackTran();
+                    return new Result { Code = 400, Msg = "团组流程进度总览表添加失败!" };
+                }
+
+                var nodes = item.Nodes.Select((nodeDto, index) => new Grp_ProcessNode
+                {
+                    ProcessId = processId,
+                    NodeName = nodeDto.NodeName,
+                    NodeOrder = nodeDto.NodeOrder,
+                    OverallStatus = ProcessStatus.UnStarted,
+                    //Country = nodeDto.Country,
+                    IsCurrent = nodeDto.IsCurrent,
+                }).ToList();
+
+                var nodeIds = await _sqlSugar.Insertable(nodes).ExecuteCommandAsync();
+                if (nodeIds < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return new Result { Code = 400, Msg = "团组流程进度流程表添加失败!" };
+                }
+            }
+
+           return new Result { Code = 200, Msg = "添加成功!" }; ;
+        }
+
+    }
+}