using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; namespace MES.Service.service.BasicData; 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" ? "启用失败" : "禁用失败"); } /// /// "插入或更新员工的方法"调整:修改为先删除再插入,同时用id和PositionCode作为判断依据 /// /// /// 修改人:池南骏 /// 修改日期:2024-12-30 /// 修改说明:` /// //// - 原代码: // 插入或更新员工的方法 //private bool InsertOrUpdateStaff(SqlSugarScope db, SysUser sysUser, // MesStaff entity) //{ // var exists = db.Queryable().Any(u => u.Sid == sysUser.Sid); // if (exists) // { // var updateUser = db.Updateable() // .SetColumns(s => s.Fcode == sysUser.Fcode) // .SetColumns(s => s.Fname == sysUser.Fname) // .Where(s => s.Sid == sysUser.Sid) // .ExecuteCommand(); // if (updateUser > 0) // { // var updateStaff = db.Updateable(entity).ExecuteCommand(); // if (updateStaff > 0) // return true; // } // } // else // { // var insertUser = db.Insertable(sysUser).ExecuteCommand(); // if (insertUser > 0) // { // var insertStaff = db.Insertable(entity).ExecuteCommand(); // if (insertStaff > 0) // return true; // } // } // return false; //} // 插入或更新员工的方法 /// 新代码 // 插入或更新员工的方法 /// /// 接口字段调整:修改参数,新增List的参数 /// /// /// 修改人:池南骏 /// 修改日期:2024-12-25 ——》 2025-01-05 二次修改 /// 修改说明:为了应为一个员工多岗位的情况 /// 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; } /// /// "删除员工的方法"调整:调整传入参数,将id改为MesStaff类,删除使用id和PositionCode作为判断依据 /// /// /// 修改人:池南骏 /// 修改日期:2024-12-30 /// 修改说明:` /// //// 原代码 // 删除员工的方法 //private bool DeleteStaff(SqlSugarScope db, SysUser sysUser, decimal staffId) //{ // var deleteUser = db.Deleteable() // .Where(s => s.Sid == sysUser.Sid).ExecuteCommand(); // if (deleteUser > 0) // { // var deleteStaff = // db.Deleteable().In(staffId).ExecuteCommand(); // if (deleteStaff > 0) // return true; // } // throw new NotImplementedException("反审核失败"); //} /// 新代码 // 删除员工的方法 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, //删除 2025-01-04 池南骏 //DepartmentNo = staff.FPostDept, /// /// 接口字段调整:将FPost字段重命名为FPostId。 /// /// /// 修改人:池南骏 /// 修改日期:2024-12-25 /// 修改说明: /// - 原代码:`PositionCode = staff.FPost, /// - 修改后:`PositionCode = staff.FPostId, /// - 二次修改,删除 /// //PositionCode = staff.FPostId, PhoneNumber = staff.FMobile, CreateOrg = Convert.ToDecimal(staff.FCreateOrgId), UseOrg = Convert.ToDecimal(staff.FUseOrgId), CreateDate = DateTime.Now, Remark = staff.FDescription, FDOCUMENTSTATUS = staff.FDocumentStatus, FforbidStatus = staff.FForbidStatus }; //删除 2025-01-04 池南骏 //if (staff.FStaffStartDate != null) // entity.StartDate = DateTime.ParseExact(staff.FStaffStartDate, // "yyyy-MM-dd HH:mm:ss", null); return entity; } /// /// 接口字段调整:根据json格式,在MesStaffPositionLink中存入数据。 /// /// /// 修改人:池南骏 /// 修改日期:2025-01-02 ——》 2025-01-05 二次修改 /// 修改说明: /// - 新增代码 /// private List GetMesStaffPositionLink(ErpStaff staff) { List 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(); //postIds.AddRange(links); return staffDetails; } // 将 ErpStaff 对象转换为 SysUser 对象的方法 private SysUser GetUser(ErpStaff staff) { //获取当前用户使用组织对应的组织名称 var db = SqlSugarHelper.GetInstance(); var organize = db.Queryable() .Where(it => it.Id == Convert.ToDecimal(staff.FUseOrgId)) // 使用 Where 方法根据单个 ID 查询 .Select(it => it.Fname) // 选择 Fname 属性 .Single(); // 使用 Single 因为我们期望只有一个匹配项 //string organizeName = organize.f; return new SysUser { Sid = Convert.ToDecimal(staff.Id), Fcode = staff.FStaffNumber, Fname = staff.FName, Fpassword = "8+()./,", // 初始密码 Fsystem = organize, Lever = 0, Fcompany = "1000", Ffactory = "1000", DelFlag = 0, Dev = 0, Tet = 0, Prd = 1, Ismanager = 0, Isacq = 0, ExpField9 = "1020", QmUser = 0, Status = 0, Isdeparture = 0, CheckFlag = 0, ExpFiel12 = 0, FirstLogin = 0, CreateDate = DateTime.Now, PswEditTime = DateTime.Now }; } // 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 == "INSERT"); var executeCommand = db.Insertable(userInsert).ExecuteCommand(); if (executeCommand > 0) 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 == "DELETE").Select(s => s.Sid) .ToArray(); var result = db.Deleteable() .Where(s => sid.Contains(s.Sid)).ExecuteCommand(); if (result > 0) { var ids = staffList.Select(it => it.Id).ToArray(); if (db.Deleteable().In(ids).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; } }