/* namespace MES.Service.service.BasicData; using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; public class MesStaffManager : Repository { // Save 方法用于保存单个员工记录,根据类型执行不同的操作 public bool Save(ErpStaff unit) { var entity = GetMesStaff(unit); // 将 ErpStaff 转换为 MesStaff var sysUser = GetUser(unit); // 获取 SysUser 实例 var mesStaffPositionLink = GetMesStaffPositionLink(unit); // 获取 MesStaffPositionLink 实例 return UseTransaction(db => { switch (unit.Type) { case "0": if (UpdateStaffStatus(db, entity.Id, "A")) // 启用员工 return 1; break; case "1": if (UpdateStaffStatus(db, entity.Id, "B")) // 禁用员工 return 1; break; case "2": case "4": if (InsertOrUpdateStaff(db, sysUser, entity,mesStaffPositionLink)) // 插入或更新员工 return 1; break; case "3": if (DeleteStaff(db, sysUser, entity)) // 删除员工 return 1; break; default: throw new ArgumentNullException( $"type没有{unit.Type}这个类型的参数"); } throw new NotImplementedException("操作失败"); }) > 0; } // 更新员工状态的方法 private bool UpdateStaffStatus(SqlSugarScope db, decimal staffId, string status) { var result = db.Updateable() .SetColumns(s => s.FforbidStatus == status) .Where(s => s.Id == staffId).ExecuteCommand(); if (result > 0) return true; throw new NotImplementedException(status == "A" ? "启用失败" : "禁用失败"); } // 插入或更新员工的方法 private bool InsertOrUpdateStaff(SqlSugarScope db, SysUser sysUser, MesStaff entity, List mesStaffPositionLink) { var exists = db.Queryable().Any(u => u.Sid == sysUser.Sid); if (!exists) { var insertUser = db.Insertable(sysUser).ExecuteCommand(); } db.Deleteable() .Where(s => s.Id == entity.Id) .ExecuteCommand(); var insertStaff = db.Insertable(entity).IgnoreColumns(true).ExecuteCommand(); var insertPosition = 1; if (mesStaffPositionLink != null && mesStaffPositionLink.Count > 0) { //先删除,再新增 db.Deleteable() .Where(s => mesStaffPositionLink.Any(m => m.StaffId == s.StaffId)) .ExecuteCommand(); //批量插入时,忽略空字段 insertPosition = db.Insertable(mesStaffPositionLink).PageSize(1) .IgnoreColumnsNull().ExecuteCommand(); } return insertStaff > 0 && insertPosition > 0; } // 删除员工的方法 private bool DeleteStaff(SqlSugarScope db, SysUser sysUser, MesStaff entity) { var deleteUser = db.Deleteable() .Where(s => s.Sid == sysUser.Sid).ExecuteCommand(); if (deleteUser > 0) { var deleteStaff = db.Deleteable() .Where(s => s.Id == entity.Id && s.PositionCode == entity.PositionCode) .ExecuteCommand(); //删除对应员工岗位信息关联表 池南骏 2025-01-02 var insertPosition = db.Deleteable() .Where(s => s.StaffId == entity.Id) .ExecuteCommand(); if (deleteStaff > 0) return true; } throw new NotImplementedException("反审核失败"); } // 将 ErpStaff 对象转换为 MesStaff 对象的方法 private MesStaff GetMesStaff(ErpStaff staff) { var entity = new MesStaff { Id = Convert.ToDecimal(staff.Id), StaffNo = staff.FStaffNumber, StaffName = staff.FName, DepartmentName = staff.FPostDept, PositionCode = staff.FPostId, PhoneNumber = staff.FMobile, Remark = staff.FDescription, FforbidStatus = staff.FForbidStatus, FSubsidiary = staff.FUseOrgId, Fumbrella = staff.FCreateOrgId, CreateDate = DateTime.Now, LastupdateDate = DateTime.Now, Type = staff.Type }; if (staff.FStaffStartDate != null) entity.StartDate = DateTime.ParseExact(staff.FStaffStartDate, "yyyy-MM-dd HH:mm:ss", null); return entity; } // 将 ErpStaff 对象转换为 SysUser 对象的方法 private SysUser GetUser(ErpStaff staff) { return new SysUser { IsStatus = true, Account = staff.FStaffNumber, UserName = staff.FName, Password = "E1ADC3949BA59ABBE56E057F2F883E", // 初始密码 DepartNo = staff.FPostDept, Type = staff.Type, CreateTime = DateTime.Now }; } /// /// 接口字段调整:根据json格式,在MesStaffPositionLink中存入数据。 /// /// /// 修改人:池南骏 /// 修改日期:2025-01-02 ——》 2025-01-05 二次修改 /// 修改说明: /// - 新增代码 /// private List GetMesStaffPositionLink(ErpStaff staff) { // 初始化返回的职位关联列表 List staffDetails = new List(); // 检查ErpStaff是否包含职位详情数据 if (staff.ErpStaffDetails != null && staff.ErpStaffDetails.Count > 0) { // 使用LINQ将ErpStaffDetails转换为MesStaffPositionLink对象 staffDetails = staff.ErpStaffDetails.Select(staffDetail => new MesStaffPositionLink { // 员工ID:从ErpStaff的Id属性转换为decimal类型 StaffId = Convert.ToDecimal(staff.Id), // 职位ID: // 1. 检查fPostId是否为空或null // 2. 非空时转换为decimal,否则设为null PositionId = string.IsNullOrEmpty(staffDetail.fPostId.ToString()) ? null : Convert.ToDecimal(staffDetail.fPostId), // 职位部门ID:逻辑与职位ID类似 FPostDeptId = string.IsNullOrEmpty(staffDetail.fPostDeptid.ToString()) ? null : Convert.ToDecimal(staffDetail.fPostDeptid), // 员工入职日期: // 1. 检查fStaffStartDate是否为空或null // 2. 非空时按"yyyy-MM-dd HH:mm:ss"格式解析为DateTime,否则设为null FStaffStartDate = string.IsNullOrEmpty(staffDetail.fStaffStartDate.ToString()) ? null : DateTime.ParseExact(staffDetail.fStaffStartDate, "yyyy-MM-dd HH:mm:ss", null) }).ToList(); } // 返回转换后的职位关联列表 return staffDetails; } // SaveList 方法用于保存多个员工记录,根据类型批量执行不同的操作 public bool SaveList(List departments) { var list = new List(); var userList = new List(); var mesStaffPositionLinkList = new List(); departments.ForEach(s => { var entity = GetMesStaff(s); entity.Type = s.Type; list.Add(entity); var sysUser = GetUser(s); sysUser.Type = s.Type; userList.Add(sysUser); var mesStaffPositionLink = GetMesStaffPositionLink(s); // 获取 SysUser 实例 mesStaffPositionLinkList.AddRange(mesStaffPositionLink); }); var groupBy = list.GroupBy(s => s.Type) .ToDictionary(g => g.Key, g => g.ToList()); return UseTransaction(db => { foreach (var staffGroup in groupBy) switch (staffGroup.Key) { case "0": if (!UpdateStaffStatusBatch(db, staffGroup.Value, "A")) // 批量启用员工 throw new NotImplementedException("启用失败"); break; case "1": if (!UpdateStaffStatusBatch(db, staffGroup.Value, "B")) // 批量禁用员工 throw new NotImplementedException("禁用失败"); break; case "3": if (!DeleteStaffBatch(db, userList, staffGroup.Value)) // 批量删除员工 throw new NotImplementedException("删除失败"); break; case "2": case "4": if (!InsertOrUpdateBatch(db, userList, staffGroup.Value,mesStaffPositionLinkList)) // 批量插入或更新员工 throw new NotImplementedException("同步失败"); break; default: throw new ArgumentNullException( $"type没有{staffGroup.Key}这个类型的参数"); } return 1; }) > 0; } // 批量更新员工状态的方法 private bool UpdateStaffStatusBatch(SqlSugarScope db, List staffList, string status) { var ids = staffList.Select(it => it.Id).ToArray(); var result = db.Updateable() .SetColumns(s => s.FforbidStatus == status) .Where(s => ids.Contains(s.Id)).ExecuteCommand(); if (result > 0) return true; throw new NotImplementedException(status == "A" ? "启用失败" : "禁用失败"); } // 批量插入员工的方法 private bool InsertStaffBatch(SqlSugarScope db, List userList, List staffList) { var userInsert = userList.FindAll(s => s.Type == "2"); var executeCommand = db.Insertable(userInsert).ExecuteCommand(); if (executeCommand <= 0) throw new ArgumentNullException("审核失败"); if (db.Insertable(staffList).ExecuteCommand() > 0) return true; throw new ArgumentNullException("审核失败"); } // 批量删除员工的方法 private bool DeleteStaffBatch(SqlSugarScope db, List userList, List staffList) { var sid = userList.FindAll(s => s.Type == "3").Select(s => s.Account) .ToArray(); var result = db.Deleteable() .Where(s => sid.Contains(s.Account)).ExecuteCommand(); if (result <= 0) throw new ArgumentNullException("反审核失败"); var ids = staffList.Select(it => it.Id).ToArray(); if (db.Deleteable() .Where(s => ids.Contains(s.Id)).ExecuteCommand() > 0) return true; throw new ArgumentNullException("反审核失败"); } // 批量插入或更新员工的方法 private bool InsertOrUpdateBatch(SqlSugarScope db, List userList, List staffList, List mesStaffPositionLink) { foreach (var sysUser in userList) { var entity = staffList.First(s => s.Id == sysUser.Sid); if (!InsertOrUpdateStaff(db, sysUser, entity, mesStaffPositionLink)) return false; } return true; } } */ namespace MES.Service.service.BasicData; using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; public class MesStaffManager : Repository { // 保存单个员工记录 public bool Save(ErpStaff unit) { if (unit == null) throw new ArgumentNullException(nameof(unit)); var entity = GetMesStaff(unit); var sysUser = GetUser(unit); var mesStaffPositionLink = GetMesStaffPositionLink(unit); return UseTransaction(db => { switch (unit.Type) { case "0": return UpdateStaffStatus(db, entity.Id, "A") ? 1 : 0; case "1": return UpdateStaffStatus(db, entity.Id, "B") ? 1 : 0; case "2": case "4": return InsertOrUpdateStaff(db, new List { sysUser }, new List { entity }, mesStaffPositionLink) ? 1 : 0; case "3": return DeleteStaff(db, new List { sysUser }, new List { entity }) ? 1 : 0; default: throw new ArgumentException($"不支持的类型: {unit.Type}"); } }) > 0; } // 保存多个员工记录 public bool SaveList(List departments) { if (departments == null || !departments.Any()) { Console.WriteLine("警告: 传入的员工列表为空"); return false; } var mesStaffList = new List(); var sysUserList = new List(); var positionLinkList = new List(); // 转换数据 foreach (var erpStaff in departments) { mesStaffList.Add(GetMesStaff(erpStaff)); sysUserList.Add(GetUser(erpStaff)); positionLinkList.AddRange(GetMesStaffPositionLink(erpStaff)); } // 按类型分组处理 var typeGroups = mesStaffList.GroupBy(s => s.Type).ToList(); return UseTransaction(db => { foreach (var group in typeGroups) { var groupType = group.Key; var groupUsers = sysUserList.Where(u => u.Type == groupType).ToList(); switch (groupType) { case "0": UpdateStaffStatusBatch(db, group.ToList(), "A"); break; case "1": UpdateStaffStatusBatch(db, group.ToList(), "B"); break; case "2": case "4": InsertOrUpdateBatch(db, groupUsers, group.ToList(), positionLinkList); break; case "3": DeleteStaffBatch(db, groupUsers, group.ToList()); break; default: throw new ArgumentException($"不支持的类型: {groupType}"); } } return 1; }) > 0; } // 插入或更新员工(批量版本) private bool InsertOrUpdateBatch(SqlSugarScope db, List sysUsers, List entities, List positionLinks) { if (!sysUsers.Any() || !entities.Any()) { Console.WriteLine("警告: SysUser或MesStaff列表为空,跳过插入操作"); return false; } try { // 1. 批量插入 SysUser(仅新增) var newSysUsers = sysUsers .Where(u => !db.Queryable().Any(e => e.Sid == u.Sid)) .ToList(); if (newSysUsers.Any()) { Console.WriteLine($"准备插入 {newSysUsers.Count} 个新SysUser"); var insertCount = db.Insertable(newSysUsers).ExecuteCommand(); if (insertCount != newSysUsers.Count) { throw new InvalidOperationException($"SysUser插入失败,期望插入 {newSysUsers.Count} 条,实际插入 {insertCount} 条"); } Console.WriteLine($"成功插入 {insertCount} 个SysUser"); } // 2. 批量删除并插入 MesStaff var staffIds = entities.Select(e => e.Id).ToList(); db.Deleteable().Where(s => staffIds.Contains(s.Id)).ExecuteCommand(); var staffInsertCount = db.Insertable(entities).IgnoreColumns(true).ExecuteCommand(); if (staffInsertCount != entities.Count) { throw new InvalidOperationException($"MesStaff插入失败,期望插入 {entities.Count} 条,实际插入 {staffInsertCount} 条"); } // 3. 处理岗位关联(如果有) if (positionLinks != null && positionLinks.Any()) { var positionStaffIds = positionLinks.Select(p => p.StaffId).Distinct().ToList(); db.Deleteable().Where(p => positionStaffIds.Contains(p.StaffId)).ExecuteCommand(); var positionInsertCount = db.Insertable(positionLinks).PageSize(500).IgnoreColumnsNull().ExecuteCommand(); if (positionInsertCount != positionLinks.Count) { throw new InvalidOperationException($"MesStaffPositionLink插入失败,期望插入 {positionLinks.Count} 条,实际插入 {positionInsertCount} 条"); } } return true; } catch (Exception ex) { Console.WriteLine($"批量插入/更新失败: {ex.Message}"); Console.WriteLine($"SQL: {db.Ado.SqlExecutionTime}"); // 记录完整的错误堆栈 Console.WriteLine($"堆栈跟踪: {ex.StackTrace}"); // 记录失败的数据 if (sysUsers != null && sysUsers.Any()) { Console.WriteLine($"失败的SysUser数据: {string.Join(", ", sysUsers.Select(u => u.Account))}"); } throw; } } // 插入或更新员工(兼容旧版本,调用批量方法) private bool InsertOrUpdateStaff(SqlSugarScope db, List sysUsers, List entities, List positionLinks) { return InsertOrUpdateBatch(db, sysUsers, entities, positionLinks); } // 批量更新员工状态 private bool UpdateStaffStatusBatch(SqlSugarScope db, List staffList, string status) { if (!staffList.Any()) { Console.WriteLine("警告: 员工列表为空,跳过状态更新"); return false; } var ids = staffList.Select(s => s.Id).ToList(); var updateCount = db.Updateable() .SetColumns(s => s.FforbidStatus == status) .Where(s => ids.Contains(s.Id)) .ExecuteCommand(); if (updateCount <= 0) { throw new InvalidOperationException($"更新员工状态失败,状态: {status},影响行数: {updateCount}"); } Console.WriteLine($"成功更新 {updateCount} 个员工状态为 {status}"); return true; } // 批量删除员工 private bool DeleteStaffBatch(SqlSugarScope db, List sysUsers, List entities) { if (!sysUsers.Any() || !entities.Any()) { Console.WriteLine("警告: SysUser或MesStaff列表为空,跳过删除操作"); return false; } try { // 1. 删除 SysUser var userAccounts = sysUsers.Select(u => u.Account).ToList(); var userDeleteCount = db.Deleteable().Where(u => userAccounts.Contains(u.Account)).ExecuteCommand(); // 2. 删除 MesStaff var staffIds = entities.Select(e => e.Id).ToList(); var staffDeleteCount = db.Deleteable().Where(s => staffIds.Contains(s.Id)).ExecuteCommand(); // 3. 删除岗位关联 :使用Any方法(推荐) db.Deleteable() .Where(p => staffIds.Any(id => id == p.StaffId)) .ExecuteCommand(); Console.WriteLine($"成功删除 {userDeleteCount} 个SysUser和 {staffDeleteCount} 个MesStaff"); return userDeleteCount > 0 && staffDeleteCount > 0; } catch (Exception ex) { Console.WriteLine($"批量删除失败: {ex.Message}"); Console.WriteLine($"SQL: {db.Ado.SqlExecutionTime}"); throw; } } // 更新员工状态 private bool UpdateStaffStatus(SqlSugarScope db, decimal staffId, string status) { var result = db.Updateable() .SetColumns(s => s.FforbidStatus == status) .Where(s => s.Id == staffId) .ExecuteCommand(); if (result <= 0) { throw new InvalidOperationException($"更新员工状态失败,员工ID: {staffId},状态: {status}"); } return true; } // 删除员工(调用批量方法) private bool DeleteStaff(SqlSugarScope db, List sysUsers, List entities) { return DeleteStaffBatch(db, sysUsers, entities); } // 将 ErpStaff 对象转换为 MesStaff 对象 private MesStaff GetMesStaff(ErpStaff staff) { if (staff == null) throw new ArgumentNullException(nameof(staff)); try { var entity = new MesStaff { Id = string.IsNullOrEmpty(staff.Id) ? DateTimeOffset.UtcNow.ToUnixTimeSeconds() : Convert.ToDecimal(staff.Id), StaffNo = staff.FStaffNumber, StaffName = staff.FName, DepartmentName = staff.FPostDept, PositionCode = staff.FPostId, PhoneNumber = staff.FMobile, Remark = staff.FDescription, FforbidStatus = staff.FForbidStatus, FSubsidiary = string.IsNullOrEmpty(staff.FUseOrgId) ? "1" : staff.FUseOrgId, Fumbrella = string.IsNullOrEmpty(staff.FCreateOrgId) ? "1" : staff.FCreateOrgId, CreateDate = DateTime.Now, LastupdateDate = DateTime.Now, Type = staff.Type }; if (!string.IsNullOrEmpty(staff.FStaffStartDate)) { entity.StartDate = DateTime.ParseExact(staff.FStaffStartDate, "yyyy-MM-dd HH:mm:ss", null); } var mesStaff = Db.Queryable() .Where(s => s.StaffNo == entity.StaffNo) .First(); if (mesStaff != null) { entity.Id = mesStaff.Id; } return entity; } catch (Exception ex) { Console.WriteLine($"转换ErpStaff到MesStaff失败: {ex.Message}"); Console.WriteLine($"输入数据: {staff.Id}, {staff.FStaffNumber}, {staff.FName}"); throw; } } // 将 ErpStaff 对象转换为 SysUser 对象 private SysUser GetUser(ErpStaff staff) { if (staff == null) throw new ArgumentNullException(nameof(staff)); try { return new SysUser { Sid = Convert.ToDecimal(staff.Id), // 确保Sid与员工ID一致 IsStatus = true, Account = staff.FStaffNumber, UserName = staff.FName, Password = "E1ADC3949BA59ABBE56E057F2F883E", // 初始密码 DepartNo = staff.FPostDept, Type = staff.Type, CreateTime = DateTime.Now }; } catch (Exception ex) { Console.WriteLine($"转换ErpStaff到SysUser失败: {ex.Message}"); Console.WriteLine($"输入数据: {staff.Id}, {staff.FStaffNumber}, {staff.FName}"); throw; } } // 获取员工岗位关联列表 private List GetMesStaffPositionLink(ErpStaff staff) { if (staff == null) return new List(); try { var staffDetails = new List(); if (staff.ErpStaffDetails != null && staff.ErpStaffDetails.Count > 0) { staffDetails = staff.ErpStaffDetails.Select(staffDetail => new MesStaffPositionLink { StaffId = Convert.ToDecimal(staff.Id), PositionId = string.IsNullOrEmpty(staffDetail.fPostId?.ToString()) ? null : Convert.ToDecimal(staffDetail.fPostId), FPostDeptId = string.IsNullOrEmpty(staffDetail.fPostDeptid?.ToString()) ? null : Convert.ToDecimal(staffDetail.fPostDeptid), FStaffStartDate = string.IsNullOrEmpty(staffDetail.fStaffStartDate?.ToString()) ? null : DateTime.ParseExact(staffDetail.fStaffStartDate, "yyyy-MM-dd HH:mm:ss", null) }).ToList(); } return staffDetails; } catch (Exception ex) { Console.WriteLine($"转换岗位关联数据失败: {ex.Message}"); Console.WriteLine($"员工ID: {staff.Id}"); throw; } } }