dev #43
|
|
@ -31,13 +31,20 @@ namespace Learn.Archives.API.Controllers
|
||||||
readonly Repository<Position> positionService;
|
readonly Repository<Position> positionService;
|
||||||
readonly UserCenterService _userCenterService;
|
readonly UserCenterService _userCenterService;
|
||||||
readonly LiveUserInfo userInfo;
|
readonly LiveUserInfo userInfo;
|
||||||
public StudentController(Repository<Student> baseService, LiveUserInfo userInfo, IHttpContextAccessor httpContextAccessor, UserCenterService userCenterService, Repository<Position> positionService) : base(baseService)
|
readonly Repository<School> schoolService;
|
||||||
|
readonly Repository<Classes> classesService;
|
||||||
|
readonly Repository<User> userService;
|
||||||
|
|
||||||
|
public StudentController(Repository<Student> baseService, LiveUserInfo userInfo, IHttpContextAccessor httpContextAccessor, UserCenterService userCenterService, Repository<Position> positionService, Repository<School> schoolService, Repository<Classes> classesService, Repository<User> userService) : base(baseService)
|
||||||
{
|
{
|
||||||
this.baseService = baseService;
|
this.baseService = baseService;
|
||||||
this.userInfo = userInfo;
|
this.userInfo = userInfo;
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_userCenterService = userCenterService;
|
_userCenterService = userCenterService;
|
||||||
this.positionService = positionService;
|
this.positionService = positionService;
|
||||||
|
this.schoolService = schoolService;
|
||||||
|
this.classesService = classesService;
|
||||||
|
this.userService = userService;
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
[NonAction]
|
||||||
|
|
@ -352,37 +359,135 @@ namespace Learn.Archives.API.Controllers
|
||||||
[HttpLogEnable]
|
[HttpLogEnable]
|
||||||
public async Task<IActionResult> ImportUpdateStudent(IFormFile? file)
|
public async Task<IActionResult> ImportUpdateStudent(IFormFile? file)
|
||||||
{
|
{
|
||||||
var dataList = await _httpContextAccessor
|
var dataList = await _httpContextAccessor.ParsingExcelAsync<StudentInfoImportError>();
|
||||||
.ParsingExcelAsync<StudentInfoImportError>();
|
if (dataList == null || dataList.Length == 0)
|
||||||
if (dataList == null || dataList.Count() == 0)
|
|
||||||
Oh.ModelError("导入失败:无有效数据");
|
Oh.ModelError("导入失败:无有效数据");
|
||||||
var insertInfo = new List<Student>();
|
|
||||||
|
var updateArr = new List<Student>();
|
||||||
var impError = new List<StudentInfoImportError>();
|
var impError = new List<StudentInfoImportError>();
|
||||||
var userCenterImp = new List<UserExcelExportData>();
|
var userCenterUpdate = new List<User>();
|
||||||
|
|
||||||
|
var db = schoolService.Context;
|
||||||
|
var schoolDic = await schoolService.AsQueryable().ToDictionaryAsync(s => s.Name, s => s.Id);
|
||||||
|
|
||||||
//如果有错误数据则返回excel
|
foreach (var schoolGroup in dataList.GroupBy(s => s.School))
|
||||||
if (impError.Count() != 0)
|
|
||||||
return File(impError.ExportExcel(), "application/ms-excel", $"导入错误学生{DateTime.Now.ToString("MMddHHmm")}.xlsx");
|
|
||||||
//调用 用户中心 导入接口
|
|
||||||
var importRes = await _userCenterService.CallAPI_ImportJsonData(_httpContextAccessor.HttpContext, userCenterImp);
|
|
||||||
|
|
||||||
var hUAccount = importRes.InsertUsers.ToDictionary(s => s.Account, s => s.Id);
|
|
||||||
//基于结果判断添加成功`
|
|
||||||
insertInfo = insertInfo
|
|
||||||
.Where(s => hUAccount.ContainsKey(s.UserCenterId.ToString())).Select(s =>
|
|
||||||
{
|
{
|
||||||
s.UserCenterId = hUAccount[s.UserCenterId.ToString()];
|
if (!schoolDic.ContainsKey(schoolGroup.Key))
|
||||||
return s;
|
Oh.ModelError($"未能识别的学校[{schoolGroup.Key}]");
|
||||||
}).ToList();
|
var schoolId = (long)schoolDic[schoolGroup.Key];
|
||||||
//部分成功的数据写入数据库
|
var names = schoolGroup.Select(r => r.RealName)
|
||||||
await baseService.InsertRangeAsync(insertInfo);
|
.Where(n => !string.IsNullOrWhiteSpace(n)).Distinct().ToList();
|
||||||
//处理数据
|
var userDic = new Dictionary<string, long>();
|
||||||
var errorExcelInfo = importRes.ErrorExcelExport.Select(s => s.Adapt<StudentInfoImportError>());
|
for (int i = 0; i < names.Count; i += 500)
|
||||||
//如果有错误数据则返回excel
|
{
|
||||||
if (errorExcelInfo.Count() != 0)
|
var batch = names.Skip(i).Take(500).ToList();
|
||||||
return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"导入错误学生{DateTime.Now.ToString("MMddHHmm")}.xlsx");
|
var part = await db.Queryable<School>()
|
||||||
|
.LeftJoin<Classes>((s, c) => c.SchoolId == s.Id)
|
||||||
|
.LeftJoin<Position>((s, c, p) => p.ClassId == c.Id)
|
||||||
|
.LeftJoin<PositionRelation>((s, c, p, pr) => pr.PositionId == p.Id)
|
||||||
|
.LeftJoin<User>((s, c, p, pr, u) => u.Id == pr.UserId)
|
||||||
|
.Where((s, c, p, pr, u) =>
|
||||||
|
s.Id == schoolId &&
|
||||||
|
u.UserType == UserTypeEnum.学生.GetHashCode() &&
|
||||||
|
batch.Contains(u.RealName) &&
|
||||||
|
s.Enable && p.Enable && pr.Enable &&
|
||||||
|
!p.DeleteState && !c.DeleteState && !u.DeleteState && !s.DeleteState)
|
||||||
|
.Select((s, c, p, pr, u) => new
|
||||||
|
{
|
||||||
|
Name = c.GradeLevel.ToString() + c.GraduationYear.ToString() + c.Name + u.RealName,
|
||||||
|
u.Id,
|
||||||
|
}).ToListAsync();
|
||||||
|
foreach (var kv in part)
|
||||||
|
userDic[kv.Name] = (long)kv.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var row in schoolGroup)
|
||||||
|
{
|
||||||
|
var ginfo = GradeHelper.GetStudentGradeBaseByGrade(row.Grade);
|
||||||
|
var key = (ginfo?.GradeLevel.ToString() ?? string.Empty) + (ginfo?.GradeYear.ToString() ?? string.Empty) + row.Class + row.RealName;
|
||||||
|
if (!userDic.ContainsKey(key))
|
||||||
|
{
|
||||||
|
row.ErrorMsg = "未能匹配到学校下对应的班级学生";
|
||||||
|
impError.Add(row);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var uid = (long)userDic[key];
|
||||||
|
var u = new Student()
|
||||||
|
{
|
||||||
|
UserCenterId = uid,
|
||||||
|
AmountRelief = decimal.TryParse(row.AmountRelief, out var v) ? v : 0,
|
||||||
|
ReliefApplication = row.ReliefApplication?.Contains("已申请") ?? false,
|
||||||
|
ReliefType = row.ReliefType,
|
||||||
|
ReliefSubTime = row.ReliefSubTime,
|
||||||
|
StudentType = row.StudentType.ToEnum<StudentTypeEnum>(),
|
||||||
|
Status = row.Status.ToEnum<UserStatusEnum>(),
|
||||||
|
JoinTime = row.JoinTime,
|
||||||
|
ExitTime = row.ExitTime,
|
||||||
|
Remark = row.Remark,
|
||||||
|
};
|
||||||
|
updateArr.Add(u);
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(row.高考选科))
|
||||||
|
{
|
||||||
|
var gradeStd = ginfo is null ? row.Grade : GradeHelper.GetGrade(ginfo.GradeLevel, ginfo.GradeYear);
|
||||||
|
var subjectArr = row.高考选科.Split(",")
|
||||||
|
.Select(s => s.ToEnum<SubjectEnum>())
|
||||||
|
.ToArray();
|
||||||
|
userCenterUpdate.Add(new User
|
||||||
|
{
|
||||||
|
Id = uid,
|
||||||
|
Phone = row.Phone,
|
||||||
|
GLSubject = (int?)subjectArr[0],
|
||||||
|
GSubject1 = (int?)subjectArr[1],
|
||||||
|
GSubject2 = (int?)subjectArr[2],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (impError.Count != 0)
|
||||||
|
return File(impError.ExportExcel(), "application/ms-excel", $"导入错误学生{DateTime.Now.ToString("MMddHHmm")}.xlsx");
|
||||||
|
|
||||||
|
if (updateArr.Count > 0)
|
||||||
|
{
|
||||||
|
await baseService.AsUpdateable(updateArr)
|
||||||
|
.UpdateColumns(s => new
|
||||||
|
{
|
||||||
|
s.AmountRelief,
|
||||||
|
s.ReliefApplication,
|
||||||
|
s.ReliefType,
|
||||||
|
s.ReliefSubTime,
|
||||||
|
s.StudentType,
|
||||||
|
s.Status,
|
||||||
|
s.JoinTime,
|
||||||
|
s.ExitTime,
|
||||||
|
s.Remark
|
||||||
|
})
|
||||||
|
//更新忽略null并且忽略默认值 (比如int默认值是0就不更新)
|
||||||
|
.IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true)
|
||||||
|
.WhereColumns(it => new { it.UserCenterId })
|
||||||
|
.ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
if (userCenterUpdate.Count > 0)
|
||||||
|
await userService.AsUpdateable(userCenterUpdate)
|
||||||
|
.UpdateColumns(s => new
|
||||||
|
{
|
||||||
|
s.Phone,
|
||||||
|
s.GLSubject,
|
||||||
|
s.GSubject1,
|
||||||
|
s.GSubject2,
|
||||||
|
})
|
||||||
|
//更新忽略null并且忽略默认值 (比如int默认值是0就不更新)
|
||||||
|
.IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true)
|
||||||
|
.WhereColumns(it => new { it.Id })
|
||||||
|
.ExecuteCommandAsync();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Oh.Error("需要测试");
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue