using Microsoft.Extensions.Configuration.UserSecrets; using Shentun.Utilities; using Shentun.Utilities.Enums; using Shentun.WebPeis.Models; using Shentun.WebPeis.SysParmValues; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; using Volo.Abp.Identity; namespace Shentun.WebPeis.Persons { public class PersonManager : DomainService { private readonly IRepository _repository; private readonly IRepository _identityUserRepository; private readonly IdentityUserManager _identityUserManager; private readonly IRepository _nationRepository; private readonly SysParmValueManager _sysParmValueManager; private readonly IRepository _primarykeyBuilderRepository; public PersonManager(IRepository repository, IRepository identityUserRepository, IdentityUserManager identityUserManager, IRepository nationRepository, SysParmValueManager sysParmValueManager, IRepository primarykeyBuilderRepository) { _repository = repository; _identityUserRepository = identityUserRepository; _identityUserManager = identityUserManager; _nationRepository = nationRepository; _sysParmValueManager = sysParmValueManager; _primarykeyBuilderRepository = primarykeyBuilderRepository; } public async Task CreateAsync( Person entity, string name, string? email, string phone ) { await Verify(entity); Check.NotNullOrWhiteSpace(name, "姓名"); Check.NotNullOrWhiteSpace(phone, "手机"); if (!string.IsNullOrWhiteSpace(entity.IdNo)) { var existPerson = await _repository.FirstOrDefaultAsync(o => o.IdNo == entity.IdNo); if (existPerson != null) { throw new UserFriendlyException("该身份证号已经在人员信息中注册"); } entity.BirthDate = ConvertExtr.ToBirthDateByIdNo(entity.IdNo); } var users = (from identityUser in await _identityUserRepository.GetQueryableAsync() join person in await _repository.GetQueryableAsync() on identityUser.Id equals person.PersonId where identityUser.PhoneNumber == phone select identityUser ).ToList(); if (users.Any()) { throw new UserFriendlyException("该手机号已经在人员信息中注册"); } var wechatPerson = await _repository.FindAsync(o => o.WechatOpenId == entity.WechatOpenId && !string.IsNullOrWhiteSpace(entity.WechatOpenId)); if (wechatPerson != null) { throw new UserFriendlyException("该微信号已经注册"); } entity.PersonNo = await CreatePersonNoAsync(entity.MedicalCenterId); if(string.IsNullOrWhiteSpace(email)) { email = entity.PersonNo + "@qq.com"; } var user = new IdentityUser(GuidGenerator.Create(), entity.PersonNo, email) { Name = name, }; user.SetPhoneNumber(phone, false); // await _identityUserManager.CreateAsync(user); if (!string.IsNullOrWhiteSpace(entity.IdNo)) { var existPatient = await _repository.FirstOrDefaultAsync(o => o.IdNo == entity.IdNo); if (existPatient != null) { throw new UserFriendlyException("该身份证号已经在人员信息中注册"); } entity.BirthDate = ConvertExtr.ToBirthDateByIdNo(entity.IdNo); } entity.PersonId = user.Id; entity.SimpleCode = LanguageConverter.GetPYSimpleCode(name); var userWithPerson = new UserWithPerson() { User = user, Person = entity, }; return userWithPerson; } private async Task Verify(Person entity) { Check.NotNull(entity, "entity"); Check.NotNullOrWhiteSpace(entity.IdNo, "身份证号"); Check.NotNullOrWhiteSpace(entity.NationId, "民族"); CheckExter.CheckSex(entity.SexId); CheckExter.CheckMaritalStatus(entity.MaritalStatusId); if(string.IsNullOrWhiteSpace(entity.IdTypeId)) { entity.IdTypeId = "01"; } if (string.IsNullOrWhiteSpace(entity.CountryCode)) { entity.CountryCode = "86"; } if (entity.IsAllowBind == null) { entity.IsAllowBind = 'Y'; } if (entity.MedicalCenterId == null || entity.MedicalCenterId == Guid.Empty) { throw new UserFriendlyException("体检中心不能为空"); } if (!string.IsNullOrEmpty(entity.IdNo)) { entity.IdNo = entity.IdNo.Trim(); if (entity.IdNo.Length != 18) { throw new UserFriendlyException("身份证长度必须为18位"); } var sexByIdNo = ConvertExtr.ToSexByIdNo(entity.IdNo).ToCharArray(); if (entity.SexId == default(char)) { entity.SexId = sexByIdNo[0]; } else { if (sexByIdNo[0] != entity.SexId) { throw new UserFriendlyException("身份证号解析出的性别与填入的性别不一致"); } } } if (!string.IsNullOrWhiteSpace(entity.NationId)) { if ((await _nationRepository.GetQueryableAsync()). Where(o => o.NationId == entity.NationId).Count() == 0) { throw new UserFriendlyException("民族ID不存在"); } } } private async Task CreatePersonNoAsync(Guid medicalCenterId) { var person_id_rule_prefix = ""; //前缀 var person_id_rule_tail_len = ""; //尾号长度 person_id_rule_tail_len = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "person_id_rule_tail_len"); person_id_rule_prefix = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "person_id_rule_prefix"); if (string.IsNullOrWhiteSpace(person_id_rule_tail_len)) { throw new UserFriendlyException("人员号尾号长度不能为空"); } int tailLen; if (!int.TryParse(person_id_rule_tail_len, out tailLen)) { throw new UserFriendlyException("人员号尾号长度必须是数字"); }; if (tailLen < 5) { throw new UserFriendlyException("人员号尾号长度必须大于5"); } string maxnum = "1"; //未补位的档案号 var primarykeyBuilderEnt = await _primarykeyBuilderRepository .FirstOrDefaultAsync(f => f.PrimarykeyBuilderId == "person_no"); if (primarykeyBuilderEnt != null) { //获取最新的,加1,并更新数据 maxnum = (Convert.ToInt32(primarykeyBuilderEnt.SerialNo) + 1).ToString(); primarykeyBuilderEnt.SerialNo = maxnum; await _primarykeyBuilderRepository.UpdateAsync(primarykeyBuilderEnt); } else { //生成首位,并添加 primarykeyBuilderEnt = new PrimarykeyBuilder { PrimarykeyBuilderId = "person_no", DateString = "", SerialNo = maxnum }; await _primarykeyBuilderRepository.InsertAsync(primarykeyBuilderEnt, true); } return person_id_rule_prefix + maxnum.PadLeft(Convert.ToInt32(person_id_rule_tail_len), '0'); } } }