using Dapper; using Ewide.Core; using Ewide.Core.Extension; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Furion.JsonSerialization; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ewide.Application.Service { /// /// 鉴定机构相关 /// [ApiDescriptionSettings(Name = "InspectionOrg")] public class InspectionOrgService : IInspectionOrgService, IDynamicApiController, ITransient { private readonly IJsonSerializerProvider _jsonSerializer; private readonly IDapperRepository _dapperRep; private readonly IUserManager _userManager; private readonly IRepository _orgRep; private readonly IRepository _orgUpdateRep; private readonly IRepository _relationRep; private readonly IRepository _settingRep; public InspectionOrgService( IJsonSerializerProvider jsonSerializer, IDapperRepository dapperRep, IUserManager userManager, IRepository orgRep, IRepository orgUpdateRep, IRepository relationRep, IRepository settingRep ) { _jsonSerializer = jsonSerializer; _dapperRep = dapperRep; _userManager = userManager; _orgRep = orgRep; _orgUpdateRep = orgUpdateRep; _relationRep = relationRep; _settingRep = settingRep; } /// /// 获取可登记的时间范围 /// /// private async Task DateRange() { // 验证当前时间是否已在可申报时间范围内 var setting = await _settingRep.DetachedEntities.FirstOrDefaultAsync(p => p.Type == InspectionOrgSettingType.DateRange); var dateRange = _jsonSerializer.Deserialize(setting.Setting); return dateRange; } /// /// 获取当前用户所在机构 /// /// private async Task RelationOrgId() { var relation = await _relationRep.DetachedEntities.FirstOrDefaultAsync(p => p.SysUserId.Equals(_userManager.UserId)); if (relation == null) { return null; } return relation.InspectionOrgId; } /// /// 获取最新备案编号 /// /// [HttpGet("/inspectionOrg/newCode")] public async Task NewCode() { var nowYear = DateTime.Now.Year; var code = await _orgRep.DetachedEntities.MaxAsync(p => p.Code); if (String.IsNullOrEmpty(code)) { code = nowYear + "001"; } else { var year = int.Parse(code.Substring(0, 4)); var no = int.Parse(code.Substring(4, 3)); if (year < nowYear) { code = nowYear + "001"; } else { code = year + (no + 1).ToString().PadLeft(3, '0'); } } return code; } /// /// 获取当前用户所在鉴定机构信息及登记时间范围 /// /// [HttpGet("/inspectionOrg/registerStatus")] public async Task RegisterStatus() { var orgId = await RelationOrgId(); var dateRange = await DateRange(); var output = dateRange.Adapt(); if (String.IsNullOrEmpty(orgId)) { return output; } var org = await _orgRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id.Equals(orgId)); var orgUpdate = await _orgUpdateRep.DetachedEntities.Where(p => p.OrgId.Equals(orgId)).OrderByDescending(p => p.CreatedTime).FirstOrDefaultAsync(); output.InspectionOrg = org.Adapt(); output.InspectionOrg.UpdateStatus = orgUpdate.Status; output.InspectionOrg.Remark = orgUpdate.Remark; return output; } /// /// 鉴定机构登记 /// /// /// [HttpPost("/inspectionOrg/register")] [UnitOfWork] public async Task Register([FromBody] InspectionOrgRegisterInput input) { // 验证当前时间是否已在可申报时间范围内 var dateRange = await DateRange(); var now = DateTime.Now; if (!(now >= dateRange.BeginDate && now < dateRange.EndDate.AddDays(1))) throw Oops.Oh("当前时间段无法登记鉴定机构"); // 登记时主表数据应为空, 只向记录数据中插入当前填表的内容 var updateData = input.Adapt(); var orgId = await RelationOrgId(); if (String.IsNullOrEmpty(orgId)) { orgId = Guid.NewGuid().ToString().ToLower(); var code = await NewCode(); // 登记主表 var data = new BsInspectionOrg { Id = orgId, Code = code, }; await data.InsertAsync(); // 用户关系表 await new BsInspectionMemberRelation { SysUserId = _userManager.UserId, InspectionOrgId = orgId }.InsertAsync(); } // 登记记录表 updateData.OrgId = orgId; updateData.Type = InspectionOrgUpdateType.Register; updateData.Status = InspectionOrgUpdateStatus.Reviewing; await updateData.InsertAsync(); } /// /// 鉴定机构申请修改 /// /// /// [HttpPost("/inspectionOrg/update")] public async Task Update([FromBody] InspectionOrgRegisterInput input) { var orgId = await RelationOrgId(); var org = await _orgRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id.Equals(orgId)); var updateData = input.Adapt(); // 与之前的值进行对比, 没有变更则不提交 var updated = false; var TSource = org.GetType(); var TSourceProperties = TSource.GetProperties(); var TTarget = updateData.GetType(); var TTargetProperties = TTarget.GetProperties(); var compareFields = new[] { nameof(BsInspectionOrg.Name), nameof(BsInspectionOrg.CreditCode), nameof(BsInspectionOrg.Address), nameof(BsInspectionOrg.Contacts), nameof(BsInspectionOrg.ContactsPhone), nameof(BsInspectionOrg.LegalPerson), nameof(BsInspectionOrg.OrgTelephone), nameof(BsInspectionOrg.ApplicationFormFiles), nameof(BsInspectionOrg.OrgBusinessLicenseFiles), nameof(BsInspectionOrg.InspectionQualificationCertificateFiles), nameof(BsInspectionOrg.OfficeInformationFiles), nameof(BsInspectionOrg.EmployeeCertificateFiles), nameof(BsInspectionOrg.CalibrationCertificateFiles), nameof(BsInspectionOrg.OtherFiles) }; foreach (var fields in compareFields) { var PSource = TSourceProperties.FirstOrDefault(p => p.Name.Equals(fields)); var VSource = PSource.GetValue(org); var PTarget = TTargetProperties.FirstOrDefault(p => p.Name.Equals(fields)); var VTarget = PTarget.GetValue(updateData); if ( (VSource == null && VTarget != null) || (VSource != null && !VSource.Equals(VTarget)) ) { updated = true; break; } } if (!updated) { throw Oops.Oh("当前信息未修改"); } // 登记记录表 updateData.OrgId = orgId; updateData.Type = InspectionOrgUpdateType.Update; updateData.Status = InspectionOrgUpdateStatus.Reviewing; await updateData.InsertAsync(); } /// /// 鉴定机构详情 /// /// /// [HttpGet("/inspectionOrg/detail")] public async Task Detail([FromQuery] InspectionOrgKeyInput input) { var orgId = String.Empty; // 传入Id表示查看他人,否则查看自己 if (!String.IsNullOrEmpty(input.Id)) { orgId = input.Id; } else { orgId = await RelationOrgId(); } if (String.IsNullOrEmpty(orgId)) return null; var output = new InspectionOrgDetailOutput(); var org = await _orgRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id.Equals(orgId)); var orgUpdate = await _orgUpdateRep.DetachedEntities.Where(p => p.OrgId.Equals(orgId)).OrderByDescending(p => p.CreatedTime).FirstOrDefaultAsync(); if (org.Status == InspectionOrgStatus.Normal) { output.Record = org.Adapt(); } if (orgUpdate != null && (orgUpdate.Status == InspectionOrgUpdateStatus.Reviewing || orgUpdate.Status == InspectionOrgUpdateStatus.Back)) { output.UpdateRecord = orgUpdate.Adapt(); } // 获取最新更新时间 var lastOrgUpdatedTime = await _orgUpdateRep.DetachedEntities .Where(p => p.OrgId.Equals(orgId)) .Where(p => p.Status == InspectionOrgUpdateStatus.Approved) .MaxAsync(p => p.UpdatedTime); output.Id = orgId; output.Code = org.Code; output.Status = org.Status; output.UpdateStatus = orgUpdate.Status; output.Remark = orgUpdate.Remark; output.CreatedTime = org.CreatedTime; output.UpdatedTime = lastOrgUpdatedTime; return output; } private async Task Page(InspectionOrgPageInput input, int Type) { var sql = @"SELECT IO.Id, IO.Code, IOU.Name, IOU.CreditCode, IOU.Address, IOU.Contacts, IOU.ContactsPhone, IOU.LegalPerson, IOU.OrgTelephone, IO.Status, IOU.Type UpdateType, IOU.Status UpdateStatus, (SELECT COUNT(0) FROM bs_inspection_org_update WHERE OrgId = IO.Id AND Status <> 1) UpdateCount, IOU.UpdatedTime FROM bs_inspection_org IO LEFT JOIN (SELECT * FROM bs_inspection_org_update WHERE CreatedTime IN (SELECT MAX(CreatedTime) FROM bs_inspection_org_update WHERE Status <> -2 AND Type = @UpdateType GROUP BY OrgId)) IOU ON IOU.OrgId = IO.Id"; return await _dapperRep.QueryPageDataDynamic( sql, input, param: new { UpdateType = Type }, filterFields: new[] { "Code", "UpdateStatus" } ); } [HttpPost("/inspectionOrg/reviewPage")] public async Task ReviewPage([FromBody] InspectionOrgPageInput input) { return await Page(input, 1); } [HttpPost("/inspectionOrg/reviewUpdatePage")] public async Task ReviewUpdatePage([FromBody] InspectionOrgPageInput input) { return await Page(input, 2); } /// /// 登记审核通过 /// /// /// [HttpPost("/inspectionOrg/reviewApproved")] [UnitOfWork] public async Task ReviewApproved([FromBody] InspectionOrgKeyRequiredInput input) { var orgUpdate = await _orgUpdateRep.DetachedEntities.Where(p => p.OrgId.Equals(input.Id)).OrderByDescending(p => p.CreatedTime).FirstOrDefaultAsync(); orgUpdate.Status = InspectionOrgUpdateStatus.Approved; await orgUpdate.UpdateIncludeAsync(new [] { nameof(BsInspectionOrgUpdate.Status) }); var org = orgUpdate.Adapt(); org.Id = input.Id; org.Status = InspectionOrgStatus.Normal; await org.UpdateExcludeAsync(new[] { nameof(BsInspectionOrg.Code) }); } /// /// 登记审核退回 /// /// /// [HttpPost("/inspectionOrg/reviewNotApproved")] public async Task ReviewNotApproved([FromBody] InspectionOrgReviewNotApprovedInput input) { var orgUpdate = await _orgUpdateRep.DetachedEntities.Where(p => p.OrgId.Equals(input.Id)).OrderByDescending(p => p.CreatedTime).FirstOrDefaultAsync(); orgUpdate.Status = InspectionOrgUpdateStatus.Back; orgUpdate.Remark = input.Remark; await orgUpdate.UpdateIncludeAsync(new[] { nameof(BsInspectionOrgUpdate.Status), nameof(BsInspectionOrgUpdate.Remark) }); } /// /// 获取审核记录 /// /// /// [HttpGet("/inspectionOrg/history")] public async Task History([FromQuery] InspectionOrgKeyRequiredInput input) { var sql = @"SELECT IOU.Id, IOU.OrgId, IO.Code, IOU.Remark, IOU.Type, IOU.Status, IOU.CreatedTime, IOU.UpdatedTime FROM bs_inspection_org_update IOU LEFT JOIN bs_inspection_org IO ON IO.Id = IOU.OrgId WHERE IO.Id = @Id AND IOU.Status <> 1 -- 审核中 ORDER BY CreatedTime DESC"; return await _dapperRep.QueryAsync(sql, new { Id = input.Id }); } } }