You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/labs/Teacher/TeacherExt/Controllers/HomeController.cs

1115 lines
52 KiB

using Infrastructure.Data;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using TeacherExt.Entities;
using TeacherExt.Models;
using System.Reflection;
using NPOI.SS.Util;
using NPOI.HSSF.Util;
namespace TeacherExt.Controllers
{
[Authorize]
[ApiController]
[Route("[controller]/[action]")]
public class HomeController : Controller
{
private readonly IHostEnvironment _env;
private readonly ILogger<HomeController> _logger;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<User> _userRepo;
private readonly IRepository<Teacher> _teacherRepo;
private readonly IRepository<CheckLog> _checkLogRepo;
public HomeController(IHostEnvironment env,
ILogger<HomeController> logger,
IRepository<Organ> organRepo,
IRepository<User> userRepo,
IRepository<Teacher> teacherRepo,
IRepository<CheckLog> checkLogRepo)
{
this._env = env;
_logger = logger;
this._organRepo = organRepo;
this._userRepo = userRepo;
this._teacherRepo = teacherRepo;
this._checkLogRepo = checkLogRepo;
}
[HttpGet]
[Route("/")]
public IActionResult Index(QueryTeacherModel model)
{
var query = Query(model);
model.TotalCount = query.Count();
var list = query
.Skip(model.PageSize * (model.PageIndex - 1))
.Take(model.PageSize)
.ToList()
.Select(o =>
{
var m = o.Teacher != null ? o.Teacher.To<EditTeacherModel>() : new EditTeacherModel();
if (o.Teacher != null)
{
this.EntityToModel(o.Teacher, m);
}
m.UserName = o.UserName;
m.UserId = o.Id;
m.Organ = o.Organ.Name;
m.RealName = o.RealName;
return m;
}).ToList();
model.List.AddRange(list);
ViewData.SelectList(o => model.RequestEditStatus, () => this.GetRequestEditStatus(model.RequestEditStatus));
ViewData.SelectList(o => model.CheckStatus, () => this.GetCheckStatus(model.CheckStatus));
return Result<EditTeacherModel>(model);
}
[HttpPost]
[Route("/")]
public IActionResult Index(QueryTeacherModel model,bool isPost)
{
return this.Index(model);
}
[HttpGet]
public IActionResult Details(Guid userId)
{
var entity = this._userRepo.ReadOnlyTable()
.Include(o => o.Organ)
.Include(o => o.Teacher)
.FirstOrDefault(o => o.Id == userId);
var model = entity.To<EditTeacherModel>();
if (entity.Teacher != null)
{
model.From(entity.Teacher);
}
model.UserName = entity.UserName;
model.UserId = entity.Id;
model.Organ = entity.Organ.Name;
model.RealName = entity.RealName;
this.EntityToModel(entity.Teacher, model);
this.ToEditModel(entity.Teacher, model);
return Result<EditTeacherModel>(model);
}
[HttpPost]
public IActionResult Details([FromForm] EditTeacherModel model)
{
ValidEditModel(model);
var entity = this._userRepo.Table().Include(o => o.Organ).Include(o => o.Teacher).FirstOrDefault(o => o.Id == model.UserId);
if (ModelState.IsValid)
{
if (entity.Teacher.CheckStatus != model.CheckStatus)
{
this._checkLogRepo.Add(new CheckLog
{
UpdateBy = User.Identity.Name,
UpdateAt = DateTime.Now,
UserName = entity.UserName,
FromStatus = entity.Teacher.CheckStatus,
ToStatus = model.CheckStatus
});
}
entity.Teacher.From(model);
this._userRepo.SaveChanges();
return RedirectToAction("Index");
}
this.EntityToModel(entity?.Teacher, model);
this.ToEditModel(entity?.Teacher, model);
return Result<EditTeacherModel>(model);
}
[HttpGet]
public IActionResult Add()
{
var model = new EditTeacherModel();
this.ToEditModel(null, model);
return View(model);
}
[HttpGet]
public IActionResult Edit(Guid userId)
{
var entity = this._userRepo.ReadOnlyTable()
.Include(o => o.Organ)
.Include(o => o.Teacher)
.FirstOrDefault(o => o.Id == userId);
var model = entity.To<EditTeacherModel>();
if (entity.Teacher != null)
{
model.From(entity.Teacher);
}
model.UserName = entity.UserName;
model.UserId = entity.Id;
model.Organ = entity.Organ.Name;
model.RealName = entity.RealName;
this.EntityToModel(entity.Teacher, model);
this.ToEditModel(entity.Teacher, model);
return Result<EditTeacherModel>(model);
}
[HttpPost]
public IActionResult Add([FromForm] EditTeacherModel model)
{
if (ModelState.IsValid)
{
var entity = new Teacher();
entity.From(model);
this._teacherRepo.Add(entity);
this._teacherRepo.SaveChanges();
return RedirectToAction("Index");
}
this.ToEditModel(null, model);
return View(model);
}
[HttpPost]
public IActionResult Edit([FromForm] EditTeacherModel model)
{
ValidEditModel(model);
var entity = this._userRepo.Table().Include(o => o.Organ).Include(o => o.Teacher).FirstOrDefault(o => o.Id == model.UserId);
if (ModelState.IsValid)
{
if (entity.Teacher == null)
{
entity.Teacher = new Teacher();
}
entity.Teacher.From(model);
this._userRepo.SaveChanges();
return RedirectToAction("Index");
}
this.EntityToModel(entity?.Teacher, model);
this.ToEditModel(entity?.Teacher, model);
return View(model);
}
[HttpGet]
public IActionResult History([FromQuery] QueryHistoryModel model)
{
var query = this._checkLogRepo.ReadOnlyTable()
.Where(o => o.UserName == model.UserName)
.OrderByDescending(o => o.UpdateAt);
model.TotalCount = query.Count();
var list = query.Skip(model.PageSize * (model.PageIndex - 1))
.OrderByDescending(o => o.UpdateAt)
.Take(model.PageSize)
.ToList()
.Select(o =>
{
var m = o.To<QueryHistoryModel>();
return m;
})
.ToList();
model.List.AddRange(list);
return Result<EditTeacherModel>(model);
}
/// <summary>
/// https://github.com/nissl-lab/npoi/wiki/How-to-use-NPOI-on-Linux
/// apt-get install libgdiplus libc6-dev
/// cd /usr/lib
/// ln -s libgdiplus.so gdiplus.dll
/// </summary>
/// <returns></returns>
[HttpPost]
public FileResult Export([FromForm] QueryTeacherModel model)
{
var template = Path.Combine(this._env.ContentRootPath, "wwwroot", "teacher.xlsx");
using var fs = System.IO.File.OpenRead(template);
var wk = new XSSFWorkbook(fs);
var sheet = wk.GetSheetAt(0);
this.ExportInternal(sheet, model);
using var ms = new MemoryStream();
wk.Write(ms);
return File(ms.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"教师列表_{DateTime.Now.ToString("yyyy_MM-dd_HH_mm_ss")}.xlsx");
}
private IQueryable<User> Query(QueryTeacherModel model)
{
var userName = User.Identity.Name;
var organId = this._userRepo.ReadOnlyTable().Where(o => o.UserName == userName).Select(o => o.OrganId).FirstOrDefault();
if (User.IsInRole("局管理员"))
{
model.Organs = this._organRepo.Table().ToList().Where(o => o.ParentId == null).ToList();
}
else
{
model.Organs = this._organRepo.ReadOnlyTable().ToList().Where(o => o.Id == organId).ToList();
}
var query = this._userRepo.ReadOnlyTable().Include(o => o.Organ).Include(o => o.Teacher).AsQueryable();
if (User.IsInRole("局管理员"))
{
if (model.OrganId.HasValue)
{
query = query.Where(o => o.OrganId == model.OrganId.Value);
}
}
else if (User.IsInRole("校管理员"))
{
query = query.Where(o => o.OrganId == organId);
}
else
{
query = query.Where(o => o.UserName == userName);
}
if (!model.OrganId.HasValue)
{
model.OrganId = organId;
}
query = query
.WhereIf(!string.IsNullOrEmpty(model.RequestEditStatus), o => o.Teacher.RequestEditStatus == model.RequestEditStatus)
.WhereIf(!string.IsNullOrEmpty(model.CheckStatus), o => o.Teacher.CheckStatus == model.CheckStatus)
.WhereIf(!string.IsNullOrEmpty(model.RealName), o => o.RealName.Contains(model.RealName));
return query;
}
private void ValidEditModel(EditTeacherModel model)
{
if (!ModelState.IsValid)
{
if (model.IsJobAsMaxTitle.HasValue)
{
if (model.IsJobAsMaxTitle.Value)
{//最高职称聘任
if (ModelState.ContainsKey(nameof(model.JobAsNotMaxTitleReason)))
{
ModelState.Remove(nameof(model.JobAsNotMaxTitleReason));
}
if (ModelState.ContainsKey(nameof(model.NotMaxTitle)))
{
ModelState.Remove(nameof(model.NotMaxTitle));
}
if (ModelState.ContainsKey(nameof(model.NotMaxTitleStart)))
{
ModelState.Remove(nameof(model.NotMaxTitleStart));
}
if (ModelState.ContainsKey(nameof(model.JobAsNotMaxTitleDate)))
{
ModelState.Remove(nameof(model.JobAsNotMaxTitleDate));
}
}
else
{
if (ModelState.ContainsKey(nameof(model.JobAsMaxTitleDate)))
{
ModelState.Remove(nameof(model.JobAsMaxTitleDate));
}
}
}
if (string.IsNullOrEmpty(model.EducationGrade) && ModelState.ContainsKey(nameof(model.EducationGradeDate)))
{//不享受待遇
ModelState.Remove(nameof(model.EducationGradeDate));
}
if (model.HasPosition.HasValue)
{
if (model.HasPosition.Value)
{//在编在岗
if (ModelState.ContainsKey(nameof(model.NotOnPostReason)))
{
ModelState.Remove(nameof(model.NotOnPostReason));
}
if (ModelState.ContainsKey(nameof(model.NotOnPostReasonDate)))
{
ModelState.Remove(nameof(model.NotOnPostReasonDate));
}
if (model.IsMiddleLevel.HasValue)
{
if (model.IsMiddleLevel.Value)
{//中层
if (ModelState.ContainsKey(nameof(model.FrontTeacher)))
{
ModelState.Remove(nameof(model.FrontTeacher));
}
}
else
{//一线教师
if (ModelState.ContainsKey(nameof(model.Position)))
{
ModelState.Remove(nameof(model.Position));
}
if (ModelState.ContainsKey(nameof(model.PositionStart)))
{
ModelState.Remove(nameof(model.PositionStart));
}
}
}
}
else
{//在编不在岗
if (ModelState.ContainsKey(nameof(model.Position)))
{
ModelState.Remove(nameof(model.Position));
}
if (ModelState.ContainsKey(nameof(model.PositionStart)))
{
ModelState.Remove(nameof(model.PositionStart));
}
if (ModelState.ContainsKey(nameof(model.FrontTeacher)))
{
ModelState.Remove(nameof(model.FrontTeacher));
}
}
}
}
}
private void ExportInternal(ISheet sheet, QueryTeacherModel model)
{
var style = this.CreateStyle(sheet);
var headers = CreateHader(sheet, model);
var list = this.Query(model)
.ToList()
.Select(o =>
{
var m = o.Teacher != null ? o.Teacher.To<EditTeacherModel>() : new EditTeacherModel { Id = Guid.Empty };
if (o.Teacher != null)
{
this.EntityToModel(o.Teacher, m);
}
m.UserId = o.Id;
m.Organ = o.Organ.Name;
m.RealName = o.RealName;
return m;
})
.ToList();
var rowIndex = 0;
var colIndex = -1;
for (int i = 0; i < list.Count; i++)
{
var teacher = list[i];
var rowNumber = i + 1;
rowIndex = i + 4;
colIndex = -1;
var row = sheet.CreateRow(rowIndex);
teacher.DisplayOrder = rowNumber;
row.Order(00).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(rowNumber);
// this.IsExport(teacher);
row.Order(01).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Organ);
row.Order(02).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.RealName);
row.Order(03).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Sex)?"无":teacher.Sex);
row.Order(04).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Birthday.HasValue ? teacher.Birthday.Value.ToString("yyyy-MM") : "无");
if(teacher.Age.HasValue)
{
row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.Age.Value);
}
else
{
row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
row.Order(06).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Nation) ? "无" : teacher.Nation);
row.Order(07).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.NativePlace) ? "无" : teacher.NativePlace);
row.Order(08).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.PhoneNumber) ? "无" : teacher.PhoneNumber);
row.Order(09).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.IdNumber) ? "无" : teacher.IdNumber);
row.Order(10).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobStart.HasValue ? teacher.JobStart.Value.ToString("yyyy-MM") : "无");
row.Order(11).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeachDate.HasValue ? teacher.TeachDate.Value.ToString("yyyy-MM") : "无");
row.Order(12).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentJobStart.HasValue ? teacher.CurrentJobStart.Value.ToString("yyyy-MM") : "无");
if (teacher.JobStart.HasValue)
{
row.Order(13).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAgeYear.Value);
row.Order(14).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAgeMonth.Value);
}
else
{
row.Order(13).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(14).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
row.Order(15).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Politics)?"无":teacher.Politics);
row.Order(16).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JoinPartyDate.HasValue ? teacher.JoinPartyDate.Value.ToString("yyyy-MM") : "无");
row.Order(17).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MaxTitle)?"无":teacher.MaxTitle);
row.Order(18).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxTitleStart.HasValue ? teacher.MaxTitleStart.Value.ToString("yyyy-MM") : "无");
if (teacher.IsJobAsMaxTitle.HasValue)
{
if (teacher.IsJobAsMaxTitle.Value)
{
row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsMaxTitleDate.HasValue ? teacher.JobAsMaxTitleDate.Value.ToString("yyyy-MM") : "无");
row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
else
{
row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobAsNotMaxTitleReason)?"无":teacher.JobAsNotMaxTitleReason);
row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.NotMaxTitle)?"无":teacher.NotMaxTitle);
row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotMaxTitleStart.HasValue ? teacher.NotMaxTitleStart.Value.ToString("yyyy-MM") : "无");
row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsNotMaxTitleDate.HasValue ? teacher.JobAsNotMaxTitleDate.Value.ToString("yyyy-MM") : "无");
}
}
else
{
row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
row.Order(24).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.PostType) ? "无" : teacher.PostType);
row.Order(25).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.PostGrade) ? "无" : teacher.PostGrade);
row.Order(26).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentPostGradeStart.HasValue ? teacher.CurrentPostGradeStart.Value.ToString("yyyy-MM") : "无");
row.Order(27).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.EducationGrade);
row.Order(28).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.EducationGrade) ? "无" : teacher.EducationGradeDate.Value.ToString("yyyy-MM"));
row.Order(30).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchool) ? "无" : teacher.FullTimeSchool);
row.Order(29).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchoolType) ? "无" : teacher.FullTimeSchoolType);
row.Order(31).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchoolMajor) ? "无" : teacher.FullTimeSchoolMajor);
row.Order(32).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchoolEducation) ? "无" : teacher.FullTimeSchoolEducation);
row.Order(33).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolEducationDate.HasValue ? teacher.FullTimeSchoolEducationDate.Value.ToString("yyyy-MM") : "无");
row.Order(35).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchool) ? "无" : teacher.JobTimeSchool);
row.Order(34).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchoolType) ? "无" : teacher.JobTimeSchoolType);
row.Order(36).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchoolMajor) ? "无" : teacher.JobTimeSchoolMajor);
row.Order(37).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchoolEducation) ? "无" : teacher.JobTimeSchoolEducation);
row.Order(38).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobTimeSchoolEducationDate.HasValue ? teacher.JobTimeSchoolEducationDate.Value.ToString("yyyy-MM") : "无");
row.Order(39).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MaxEducation) ? "无" : teacher.MaxEducation);
row.Order(40).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MaxDegree) ? "无" : teacher.MaxDegree);
row.Order(41).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.IsClassTeacher ? "是" : "否");
row.Order(42).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MainTeachPeriod) ? "无" : teacher.MainTeachPeriod);
row.Order(43).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MainTeachSubject) ? "无" : teacher.MainTeachSubject);
row.Order(44).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MainTeachGrade) ? "无" : teacher.MainTeachGrade);
row.Order(45).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.OtherTeachPeriod) ? "无" : teacher.OtherTeachPeriod);
row.Order(46).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.OtherTeachSubject) ? "无" : teacher.OtherTeachSubject);
if (teacher.HasPosition.HasValue)
{
if (teacher.HasPosition.Value)
{
if (teacher.IsMiddleLevel.Value)
{
row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Position) ? "无" : teacher.Position);
row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.PositionStart.HasValue ? teacher.PositionStart.Value.ToString("yyyy-MM") : "无");
row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FrontTeacher) ? "无" : teacher.FrontTeacher);
row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
else
{
row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
}
else
{
row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.NotOnPostReason) ? "无" : teacher.NotOnPostReason);
row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotOnPostReasonDate.HasValue ? teacher.NotOnPostReasonDate.Value.ToString("yyyy-MM") : "无");
}
}
else
{
row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无");
}
row.Order(52).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.TeacherCardType) ? "无" : teacher.TeacherCardType);
row.Order(53).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.TeacherCardSubject) ? "无" : teacher.TeacherCardSubject);
row.Order(54).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.TeacherCardLangLevel) ? "无" : teacher.TeacherCardLangLevel);
row.Order(55).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.CurrentAddressArea) ? "无" : teacher.CurrentAddressArea);
row.Order(55).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.CurrentAddressStreat) ? "无" : teacher.CurrentAddressStreat);
row.Order(56).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Comment) ? "无" : teacher.Comment);
}
for (int i = 0; i < rowIndex; i++)
{
sheet.AutoSizeColumn(i);
var row = sheet.GetRow(i);
if (row != null)
{
for (int j = 0; j < colIndex; j++)
{
var cell = sheet.GetRow(i).GetCell(j);
if (cell != null)
{
var length = cell.ToString().Split('\n').Select(o=> Encoding.UTF8.GetBytes(o).Count()).Max()*256;
if (length > sheet.GetColumnWidthInPixels(j))
{
if (!cell.IsMergedCell)
{
sheet.SetColumnWidth(j, length);
}
}
}
}
}
}
}
private List<string> CreateHader(ISheet sheet, QueryTeacherModel model)
{
var style = this.CreateStyle(sheet, HSSFColor.PaleBlue.Index, 11,HSSFColor.White.Index,true,"黑体");
var result = new List<string>();
var headers = typeof(EditTeacherModel).GetProperties().Select(o => o.GetCustomAttribute<ExcelHeaderAttribute>()).Where(o => o != null).ToList();
var colIndex = 0;
foreach (var item in headers)
{
if (!model.Headers.Any()||model.Headers.Contains(item.Header))
{
result.Add(item.Header);
int i = 0;
foreach (var head in item.Headers)
{
for (int j = i; j < i + head.Value; j++)
{
var row = (sheet.GetRow(j) ?? sheet.CreateRow(j));
var cell = (row.GetCell(colIndex) ?? row.CreateCell(colIndex));
cell.SetStyle(style);//.SetCellValue(head.Key);
if(j==i)
{
cell.SetCellValue(head.Key);
}
}
if (head.Value > 1)
{
sheet.AddMergedRegion(new CellRangeAddress(i, i + head.Value - 1, colIndex, colIndex));
sheet.GetRow(i).GetCell(colIndex).SetStyle(style);
}
i = i + head.Value;
}
colIndex += 1;
}
}
for (int i = 0; i < sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
for (int j = 0; j < row.LastCellNum; j++)
{
var cell = row.GetCell(j);
var cells = new List<ICell>() { cell };
if (cell != null && cell.StringCellValue != "")
{
var col = 1;
if(j+1<row.LastCellNum)
{
for (int k = j + 1; k < row.LastCellNum; k++)
{
var next = row.GetCell(k);
if (next == null || next.StringCellValue != cell.StringCellValue)
{
break;
}
next.SetCellValue("");
cells.Add(next);
col++;
}
}
if (col > 1)
{
if(!cell.IsMergedCell)
{
sheet.AddMergedRegion(new CellRangeAddress(i,i,j,j+col-1));
}
else
{
var currentRegion = this.GetRegion(sheet, cell);
var rowEnd = currentRegion.LastRow;
foreach (var rcell in cells)
{
var region = this.GetRegion(sheet, rcell);
if(region!=null)
{
RemoveRegion(sheet,region);
}
}
sheet.AddMergedRegion(new CellRangeAddress(i, rowEnd, j, j + col - 1));
}
Console.WriteLine($"@@@@@:{i},{i},{j},{j + col - 1}");
}
j = j + col - 1;
}
//Console.WriteLine($">>>>>>>>>>>>>{i}x{j}:{cell?.StringCellValue}");
}
//break;
}
return result;
}
private CellRangeAddress GetRegion(ISheet sheet,ICell cell)
{
CellRangeAddress result = null;
if(cell.IsMergedCell)
{
foreach (var region in sheet.MergedRegions)
{
if (cell.RowIndex >= region.FirstRow && cell.RowIndex <= region.LastRow && cell.ColumnIndex >= region.FirstColumn && cell.ColumnIndex <= region.LastColumn)
{
result = region;
break;
}
}
}
return result;
}
private void RemoveRegion(ISheet sheet, CellRangeAddress region)
{
for (int i = 0; i < sheet.NumMergedRegions; i++)
{
var item = sheet.GetMergedRegion(i);
if(item.FirstRow==region.FirstRow
&&item.LastRow==region.LastRow
&&item.FirstColumn==region.FirstColumn
&&item.LastColumn==region.LastColumn)
{
sheet.RemoveMergedRegion(i);
break;
}
}
}
private ICellStyle CreateStyle(ISheet sheet,short? backgroundColor=null,double? fontSize=null,short? fontColor=null,bool isBold=false,string fontName=null)
{
var style = sheet.Workbook.CreateCellStyle();
style.WrapText = true;
if(backgroundColor.HasValue)
{
style.FillPattern = FillPattern.SolidForeground;
style.FillForegroundColor = backgroundColor.Value;
}
var font = sheet.Workbook.CreateFont();
if(!string.IsNullOrEmpty(fontName))
{
font.FontName = fontName;
}
font.IsBold = isBold;
if(fontSize.HasValue)
{
font.FontHeightInPoints = fontSize.Value;
}
if(fontColor.HasValue)
{
font.Color = fontColor.Value;
}
style.SetFont(font);
style.Alignment = HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
style.BorderTop = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderBottom = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
return style;
}
private void EntityToModel(Teacher entity, EditTeacherModel model)
{
if (entity != null)
{
if (!string.IsNullOrEmpty(entity.IdNumber))
{
var value = entity.IdNumber.Length == 15 ? $"19{entity.IdNumber.Substring(6, 6)}" : entity.IdNumber.Substring(6, 8);
var birthday = DateTime.ParseExact(value, "yyyyMMdd", CultureInfo.InvariantCulture);
model.Age = DateTime.Now.Year - birthday.Year;
}
if (entity.JobStart.HasValue)
{
model.JobAgeYear = DateTime.Now.Year - entity.JobStart.Value.Year;
model.JobAgeMonth = model.JobAgeYear*12 + Math.Abs((entity.JobStart.Value.Month - DateTime.Now.Month));
}
}
}
private void ToEditModel(Teacher entity, EditTeacherModel model)
{
ViewData.SelectList(o => model.RequestEditStatus, () => this.GetRequestEditStatus(model.RequestEditStatus));
ViewData.SelectList(o => model.CheckStatus, () => this.GetCheckStatus(model.CheckStatus));
ViewData.SelectList(o => model.UserType, () => this.GetUserType(model.UserType));
ViewData.SelectList(o => model.Sex, () => this.GetSex(model.Sex));
ViewData.SelectList(o => model.Nation, () => this.GetNation(model.Nation));
ViewData.SelectList(o => model.Politics, () => this.GetPolitics(model.Politics));
ViewData.SelectList(o => model.MaxTitle, () => this.GetTitle(model.MaxTitle));
ViewData.SelectList(o => model.NotMaxTitle, () => this.GetTitle(model.NotMaxTitle));
ViewData.SelectList(o => model.PostType, () => this.GetPost(model.PostType));
ViewData.SelectList(o => model.PostGrade, () => this.GetPostGrade(model.PostGrade));
ViewData.SelectList(o => model.EducationGrade, () => this.GetEducationGrade(model.EducationGrade));
ViewData.SelectList(o => model.FullTimeSchoolType, () => this.GetFullTimeSchoolType(model.FullTimeSchoolType));
ViewData.SelectList(o => model.FullTimeSchoolEducation, () => this.GetEducation(model.FullTimeSchoolEducation));
ViewData.SelectList(o => model.JobTimeSchoolType, () => this.GetFullTimeSchoolType(model.JobTimeSchoolType));
ViewData.SelectList(o => model.JobTimeSchoolEducation, () => this.GetEducation(model.JobTimeSchoolEducation));
ViewData.SelectList(o => model.MaxEducation, () => this.GetEducation(model.MaxEducation));
ViewData.SelectList(o => model.MaxDegree, () => this.GetDegree(model.MaxDegree));
ViewData.SelectList(o => model.MainTeachPeriod, () => this.GetTeachPeriod(model.MainTeachPeriod));
ViewData.SelectList(o => model.MainTeachSubject, () => this.GetTeachSubject(model.MainTeachSubject));
ViewData.SelectList(o => model.MainTeachGrade, () => this.GetTeachGrade(model.MainTeachGrade));
ViewData.SelectList(o => model.OtherTeachPeriod, () => this.GetTeachPeriod(model.OtherTeachPeriod));
ViewData.SelectList(o => model.OtherTeachSubject, () => this.GetTeachSubject(model.OtherTeachSubject));
ViewData.SelectList(o => model.Position, () => this.GetPosition(model.Position));
ViewData.SelectList(o => model.FrontTeacher, () => this.GetFrontTeacher(model.FrontTeacher));
ViewData.SelectList(o => model.NotOnPostReason, () => this.GetNotOnPostReason(model.NotOnPostReason));
ViewData.SelectList(o => model.TeacherCardType, () => this.GetTeacherCardType(model.TeacherCardType));
ViewData.SelectList(o => model.TeacherCardLangLevel, () => this.GetLangLevel(model.TeacherCardLangLevel));
ViewData.SelectList(o => model.CurrentAddressArea, () => this.GetAddressArea(model.CurrentAddressArea));
}
private SelectList GetRequestEditStatus(string selected)
{
return new string[] {
"未申请",
"已申请",
}.ToSelectList(selected);
}
private SelectList GetCheckStatus(string selected)
{
return new string[] {
"未提交",
"待校级审核",
"校级审核失败",
"待局级审核",
"局级审核失败",
"局级审核成功",
}.ToSelectList(selected);
}
private SelectList GetUserType(string selected)
{
return new string[] {
"在编教师",
"区聘教师",
"校聘教师",
}.ToSelectList(selected);
}
private SelectList GetSex(string selected)
{
return new string[] {
"男",
"女",
}.ToSelectList(selected);
}
private SelectList GetNation(string selected)
{
return new string[] {
"汉族",
"蒙古族",
"回族",
"藏族",
"维吾尔族",
"苗族",
"彝族",
"壮族",
"布依族",
"朝鲜族",
"满族",
"侗族",
"瑶族",
"白族",
"土家族",
"哈尼族",
"哈萨克族",
"傣族",
"黎族",
"傈僳族",
"佤族",
"畲族",
"高山族",
"拉祜族",
"水族",
"东乡族",
"纳西族",
"景颇族",
"柯尔克孜族",
"土族",
"达斡尔族",
"仫佬族",
"羌族",
"布朗族",
"撒拉族",
"毛难族",
"仡佬族",
"锡伯族",
"阿昌族",
"普米族",
"塔吉克族",
"怒族",
"乌孜别克族",
"俄罗斯族",
"鄂温克族",
"崩龙族",
"保安族",
"裕固族",
"京族",
"塔塔尔族",
"独龙族",
"鄂伦春族",
"赫哲族",
"门巴族",
"珞巴族",
"基诺族",
"无"
}.ToSelectList(selected);
}
private SelectList GetPolitics(string selected)
{
return new string[] {
"中共党员",
"中共预备党员",
"共青团员",
"群众",
"民革会员",
"民盟盟员",
"民建会员",
"民进会员",
"农工党党员",
"致公党党员",
"九三学社社员",
"台盟盟员",
"其他民主党派",
}.ToSelectList(selected);
}
private SelectList GetTitle(string selected)
{
return new string[] {
"正高级教师",
"高级教师",
"一级教师",
"二级教师",
"未评",
"工勤",
}.ToSelectList(selected);
}
private SelectList GetPost(string selected)
{
return new string[] {
"专技岗位",
"管理岗位",
"工勤岗位",
}.ToSelectList(selected);
}
private SelectList GetPostGrade(string selected)
{
return new string[] {
"四级",
"五级",
"六级",
"七级",
"八级",
"九级",
"十级",
"十一级",
"十二级",
}.ToSelectList(selected);
}
private SelectList GetEducationGrade(string selected)
{
return new string[] {
"专技十一级",
"专技十二级",
}.ToSelectList(selected);
}
private SelectList GetFullTimeSchoolType(string selected)
{
return new string[] {
"师范院校师范专业",
"师范院校非师范专业",
"非师范院校师范专业",
"非师范院校非师范专业",
}.ToSelectList(selected);
}
private SelectList GetEducation(string selected)
{
return new string[] {
"研究生博士教育",
"研究生硕士教育",
"大学本科教育",
"大学专科教育",
"中等专业教育",
"普通高级中学教育",
"初级中学教育",
"小学教育",
"其他",
}.ToSelectList(selected);
}
private SelectList GetDegree(string selected)
{
return new string[] {
"学士学位",
"硕士学位",
"博士学位",
}.ToSelectList(selected);
}
private SelectList GetTeachPeriod(string selected)
{
return new string[] {
"学前教育",
"小学",
"普通初中",
"无",
}.ToSelectList(selected);
}
private SelectList GetTeachSubject(string selected)
{
return new string[] {
"语文",
"数学",
"英语",
"音乐",
"体育",
"美术",
"科学",
"书法",
"信息技术",
"政治",
"历史",
"地理",
"物理",
"化学",
"生物",
"幼教全科",
"心理健康",
"综合实践课",
"无",
}.ToSelectList(selected);
}
private SelectList GetTeachGrade(string selected)
{
return new string[] {
"九年级",
"八年级",
"七年级",
"六年级",
"五年级",
"四年级",
"三年级",
"二年级",
"一年级",
"幼儿园大班",
"幼儿园中班",
"幼儿园小班",
"无",
}.ToSelectList(selected);
}
private SelectList GetPosition(string selected)
{
return new string[] {
"校长",
"副校长",
"党支部副书记",
"办公室主任",
"办公室副主任",
"教导处主任",
"教导处副主任",
"德育主任",
"团支部书记",
"大队辅导员",
"工会主席",
"总务主任",
"总务副主任",
"无",
}.ToSelectList(selected);
}
private SelectList GetFrontTeacher(string selected)
{
return new string[] {
"一线教师",
"无",
}.ToSelectList(selected);
}
private SelectList GetNotOnPostReason(string selected)
{
return new string[] {
"长期病假",
"产假",
"挂职",
"支教",
}.ToSelectList(selected);
}
private SelectList GetTeacherCardType(string selected)
{
return new string[] {
"幼儿园教师资格",
"小学教师资格",
"初级中学教师资格",
"高级中学教师资格",
"中等职业学校教师资格",
"中等职业学校实习指导教师资格",
"高等学校教师资格",
"无",
}.ToSelectList(selected);
}
private SelectList GetLangLevel(string selected)
{
return new string[] {
"一级甲等",
"一级乙等",
"二级甲等",
"二级乙等",
"三级甲等",
"无",
}.ToSelectList(selected);
}
private SelectList GetAddressArea(string selected)
{
return new string[] {
"城中区",
"城北区",
"城西区",
"城东区",
}.ToSelectList(selected);
}
private IActionResult Result<TEditModel>(object model)
{
if (this.IsJsonRequest())
{
return Json(new
{
schema = this.GetJsonSchema<TEditModel>(),
model,
errors = ModelState.Where(o => o.Value.ValidationState == ModelValidationState.Invalid),
data = ViewData
}, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
}
return View(model);
}
}
}