using FlexJobApi.Core;
using Furion;
using Furion.DatabaseAccessor;
using Furion.DataValidation;
using Furion.FriendlyException;
using Furion.HttpRemote;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using MiniExcelLibs;
using NetTopologySuite.Index.HPRtree;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace FlexJobApi.UserServer.Application
{
///
/// 灵工命令处理器
///
public class EnterpriseEmployeesCommandHandler(
IRepository rep,
IRepository repUser
) :
IRequestHandler,
IRequestHandler
{
private readonly IRepository rep = rep;
private readonly IRepository repUser = repUser;
///
/// 导入灵工信息
///
///
///
///
public async Task Handle(ImportEnterpriseEmployeesCommand request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var result = new ImportEnterpriseEmployeesCommandResult();
var models = await request.ExcelUrl.ImportExcelFromOSS();
var identities = models.DistinctSelect(it => it.Identity);
var enterpriseEmployees = await rep.AsQueryable()
.Where(it => it.EnterpriseId == logier.EnterpriseId && identities.Contains(it.Identity))
.ToListAsync();
var userIds = enterpriseEmployees.DistinctSelect(it => it.UserId.HasValue, it => it.UserId!.Value);
var users = await repUser.AsQueryable()
.Where(it => userIds.Contains(it.Id))
.ToListAsync();
var successList = new List();
foreach (var model in models)
{
var errors = new List();
if (model.Name.IsNull())
{
errors.Add("请填写姓名");
}
if (model.ContactPhoneNumber.IsNull())
{
errors.Add("请填写手机号");
}
else if (!model.ContactPhoneNumber.TryValidate(EnumValidationTypes.ValidPhoneNumber).IsValid)
{
errors.Add("手机号格式不正确");
}
if (model.Identity.IsNull())
{
errors.Add("请填写身份证号");
}
else if (!model.Identity.TryValidate(EnumValidationTypes.ValiIdentity).IsValid)
{
errors.Add("身份证号格式不正确");
}
else if (successList.Any(it => it.Identity == model.Identity))
{
errors.Add("身份证号重复");
}
else
{
model.Gender = model.Identity.GetGender();
model.Birthday = model.Identity.GetBirthday();
model.Age = model.Identity.GetAge();
}
if (errors.IsNull())
{
var enterpriseEmployee = enterpriseEmployees.FirstOrDefault(it => it.Identity == model.Identity);
if (enterpriseEmployee == null)
{
enterpriseEmployee = new EnterpriseEmployee
{
EnterpriseId = logier.EnterpriseId!.Value,
Name = model.Name,
Identity = model.Identity,
ContactPhoneNumber = model.ContactPhoneNumber,
Gender = model.Gender,
Birthday = model.Birthday,
Age = model.Age,
};
await rep.InsertAsync(enterpriseEmployee);
successList.Add(model);
}
else
{
var canUpdate = true;
if (enterpriseEmployee.UserId.HasValue)
{
var user = users.FirstOrDefault(it => it.Id == enterpriseEmployee.UserId.Value)!;
if (user.IsReal == true)
{
canUpdate = false;
errors.Add("已实名无法修改信息");
}
else
{
user.Name = model.Name;
user.ContactPhoneNumber = model.ContactPhoneNumber;
user.Identity = model.Identity;
user.Gender = model.Gender;
user.Birthday = model.Birthday;
user.Age = model.Age;
await repUser.UpdateAsync(user);
}
}
if (canUpdate)
{
enterpriseEmployee.Name = model.Name;
enterpriseEmployee.ContactPhoneNumber = model.ContactPhoneNumber;
enterpriseEmployee.Gender = model.Gender;
enterpriseEmployee.Birthday = model.Birthday;
enterpriseEmployee.Age = model.Age;
await rep.UpdateAsync(enterpriseEmployee);
successList.Add(model);
}
}
}
if (errors.IsNotNull())
{
var error = model.Adapt();
error.ErrorMessage = errors.SplitJoin(",");
result.Errors.Add(error);
}
}
result.TotalCount = models.Count;
result.FailCount = result.Errors.Count;
result.SuccessCount = result.TotalCount - result.FailCount;
return result;
}
///
/// 编辑灵工信息
///
///
///
///
public async Task Handle(EditEnterpriseEmployeeCommand request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var entity = await request.SaveData(
q => q.Where(it => it.EnterpriseId == logier.EnterpriseId),
it => it.EnterpriseId == logier.EnterpriseId && it.Id != request.Id && it.Identity == request.Identity,
(entity) =>
{
if (request.Id.HasValue && entity.UserId.HasValue)
{
var user = repUser.AsQueryable().FirstOrDefault(it => it.Id == entity.UserId.Value);
if (user!.IsReal == true)
{
throw Oops.Oh(EnumErrorCodeType.s510, "已实名无法修改信息");
}
else
{
user.Name = request.Name;
user.ContactPhoneNumber = request.ContactPhoneNumber;
user.Identity = request.Identity;
user.Birthday = request.Identity.GetBirthday();
user.Gender = request.Gender;
user.Age = request.Age;
repUser.Update(user);
}
}
request.Adapt(entity);
},
cancellationToken);
return entity.Id;
}
}
}