.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
using Ewide.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Application
|
||||
{
|
||||
public class InspectionOrgKeyInput
|
||||
{
|
||||
public virtual string Id { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionOrgKeyRequiredInput : InspectionOrgKeyInput
|
||||
{
|
||||
[Required]
|
||||
public override string Id { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionOrgPageInput : PageInputBase
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class InspectionOrgRegisterInput
|
||||
{
|
||||
[MaxLength(100)]
|
||||
[Required]
|
||||
public string Name { get; set; }
|
||||
|
||||
[MaxLength(50)]
|
||||
[Required]
|
||||
public string CreditCode { get; set; }
|
||||
|
||||
[Required]
|
||||
public string Address { get; set; }
|
||||
|
||||
[MaxLength(50)]
|
||||
[Required]
|
||||
public string Contacts { get; set; }
|
||||
|
||||
[MaxLength(50)]
|
||||
[Required]
|
||||
public string ContactsPhone { get; set; }
|
||||
|
||||
[MaxLength(50)]
|
||||
[Required]
|
||||
public string LegalPerson { get; set; }
|
||||
|
||||
[MaxLength(50)]
|
||||
public string OrgTelephone { get; set; }
|
||||
|
||||
[Required]
|
||||
public string ApplicationFormFiles { get; set; }
|
||||
|
||||
[Required]
|
||||
public string OrgBusinessLicenseFiles { get; set; }
|
||||
|
||||
[Required]
|
||||
public string InspectionQualificationCertificateFiles { get; set; }
|
||||
|
||||
[Required]
|
||||
public string OfficeInformationFiles { get; set; }
|
||||
|
||||
[Required]
|
||||
public string EmployeeCertificateFiles { get; set; }
|
||||
|
||||
[Required]
|
||||
public string CalibrationCertificateFiles { get; set; }
|
||||
|
||||
public string OtherFiles { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionOrgReviewNotApprovedInput : InspectionOrgKeyRequiredInput
|
||||
{
|
||||
[Required]
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Application
|
||||
{
|
||||
public class InspectionOrgDetailOutput
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Code { get; set; }
|
||||
public InspectionOrgStatus Status { get; set; }
|
||||
public InspectionOrgUpdateStatus UpdateStatus { get; set; }
|
||||
public string Remark { get; set; }
|
||||
public DateTime? CreatedTime { get; set; }
|
||||
public DateTime? UpdatedTime { get; set; }
|
||||
public InspectionOrgRegisterInput Record { get; set; }
|
||||
public InspectionOrgRegisterInput UpdateRecord { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionRegisterStatusOutput
|
||||
{
|
||||
public DateTime BeginDate { get; set; }
|
||||
public DateTime EndDate { get; set; }
|
||||
public InspectionOrgDetailOutput InspectionOrg { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Application.Service
|
||||
{
|
||||
public interface IInspectionOrgService
|
||||
{
|
||||
public Task<string> NewCode();
|
||||
public Task<InspectionRegisterStatusOutput> RegisterStatus();
|
||||
public Task Register(InspectionOrgRegisterInput input);
|
||||
public Task Update(InspectionOrgRegisterInput input);
|
||||
public Task<InspectionOrgDetailOutput> Detail(InspectionOrgKeyInput input);
|
||||
public Task<dynamic> ReviewPage(InspectionOrgPageInput input);
|
||||
public Task<dynamic> ReviewUpdatePage(InspectionOrgPageInput input);
|
||||
public Task ReviewApproved(InspectionOrgKeyRequiredInput input);
|
||||
public Task ReviewNotApproved(InspectionOrgReviewNotApprovedInput input);
|
||||
public Task<dynamic> History(InspectionOrgKeyRequiredInput input);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,410 @@
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// 鉴定机构相关
|
||||
/// </summary>
|
||||
[ApiDescriptionSettings(Name = "InspectionOrg")]
|
||||
public class InspectionOrgService : IInspectionOrgService, IDynamicApiController, ITransient
|
||||
{
|
||||
private readonly IJsonSerializerProvider _jsonSerializer;
|
||||
private readonly IDapperRepository _dapperRep;
|
||||
|
||||
private readonly IUserManager _userManager;
|
||||
|
||||
private readonly IRepository<BsInspectionOrg> _orgRep;
|
||||
private readonly IRepository<BsInspectionOrgUpdate> _orgUpdateRep;
|
||||
private readonly IRepository<BsInspectionMemberRelation> _relationRep;
|
||||
private readonly IRepository<BsInspectionOrgSetting> _settingRep;
|
||||
|
||||
public InspectionOrgService(
|
||||
IJsonSerializerProvider jsonSerializer,
|
||||
IDapperRepository dapperRep,
|
||||
IUserManager userManager,
|
||||
IRepository<BsInspectionOrg> orgRep,
|
||||
IRepository<BsInspectionOrgUpdate> orgUpdateRep,
|
||||
IRepository<BsInspectionMemberRelation> relationRep,
|
||||
IRepository<BsInspectionOrgSetting> settingRep
|
||||
)
|
||||
{
|
||||
_jsonSerializer = jsonSerializer;
|
||||
_dapperRep = dapperRep;
|
||||
|
||||
_userManager = userManager;
|
||||
|
||||
_orgRep = orgRep;
|
||||
_orgUpdateRep = orgUpdateRep;
|
||||
_relationRep = relationRep;
|
||||
_settingRep = settingRep;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取可登记的时间范围
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task<BsInspectionOrgSetting_DateRange> DateRange()
|
||||
{
|
||||
// 验证当前时间是否已在可申报时间范围内
|
||||
var setting = await _settingRep.DetachedEntities.FirstOrDefaultAsync(p => p.Type == InspectionOrgSettingType.DateRange);
|
||||
var dateRange = _jsonSerializer.Deserialize<BsInspectionOrgSetting_DateRange>(setting.Setting);
|
||||
return dateRange;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前用户所在机构
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task<string> RelationOrgId()
|
||||
{
|
||||
var relation = await _relationRep.DetachedEntities.FirstOrDefaultAsync(p => p.SysUserId.Equals(_userManager.UserId));
|
||||
if (relation == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return relation.InspectionOrgId;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取最新备案编号
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/inspectionOrg/newCode")]
|
||||
public async Task<string> 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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前用户所在鉴定机构信息及登记时间范围
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/inspectionOrg/registerStatus")]
|
||||
public async Task<InspectionRegisterStatusOutput> RegisterStatus()
|
||||
{
|
||||
var orgId = await RelationOrgId();
|
||||
var dateRange = await DateRange();
|
||||
var output = dateRange.Adapt<InspectionRegisterStatusOutput>();
|
||||
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<InspectionOrgDetailOutput>();
|
||||
output.InspectionOrg.UpdateStatus = orgUpdate.Status;
|
||||
output.InspectionOrg.Remark = orgUpdate.Remark;
|
||||
return output;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 鉴定机构登记
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[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<BsInspectionOrgUpdate>();
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 鉴定机构申请修改
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[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<BsInspectionOrgUpdate>();
|
||||
// 与之前的值进行对比, 没有变更则不提交
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 鉴定机构详情
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/inspectionOrg/detail")]
|
||||
public async Task<InspectionOrgDetailOutput> 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<InspectionOrgRegisterInput>();
|
||||
}
|
||||
if (orgUpdate != null &&
|
||||
(orgUpdate.Status == InspectionOrgUpdateStatus.Reviewing || orgUpdate.Status == InspectionOrgUpdateStatus.Back))
|
||||
{
|
||||
output.UpdateRecord = orgUpdate.Adapt<InspectionOrgRegisterInput>();
|
||||
}
|
||||
|
||||
// 获取最新更新时间
|
||||
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<dynamic> 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<dynamic> ReviewPage([FromBody] InspectionOrgPageInput input)
|
||||
{
|
||||
return await Page(input, 1);
|
||||
}
|
||||
|
||||
[HttpPost("/inspectionOrg/reviewUpdatePage")]
|
||||
public async Task<dynamic> ReviewUpdatePage([FromBody] InspectionOrgPageInput input)
|
||||
{
|
||||
return await Page(input, 2);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 登记审核通过
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[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<BsInspectionOrg>();
|
||||
org.Id = input.Id;
|
||||
org.Status = InspectionOrgStatus.Normal;
|
||||
|
||||
await org.UpdateExcludeAsync(new[] {
|
||||
nameof(BsInspectionOrg.Code)
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 登记审核退回
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[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)
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取审核记录
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/inspectionOrg/history")]
|
||||
public async Task<dynamic> 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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using Ewide.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Application
|
||||
{
|
||||
public class InspectionOrgDirKeyInput
|
||||
{
|
||||
public virtual string Id { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionOrgDirKeyRequiredInput : InspectionOrgDirKeyInput
|
||||
{
|
||||
[Required]
|
||||
public override string Id { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionOrgDirPageInput : PageInputBase
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class InspectionOrgDirSaveInput : InspectionOrgDirKeyInput
|
||||
{
|
||||
[Required]
|
||||
public string No { get; set; }
|
||||
[Required]
|
||||
public InspectionOrgDirSaveDetailInput[] Detail { get; set; }
|
||||
}
|
||||
|
||||
public class InspectionOrgDirSaveDetailInput
|
||||
{
|
||||
[Required]
|
||||
public string OrgId { get; set; }
|
||||
[Required]
|
||||
public int Score { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Application
|
||||
{
|
||||
public class InspectionOrgDirPreviewOutput
|
||||
{
|
||||
public BsInspectionOrgDirStage Stage { get; set; }
|
||||
public int Count { get; set; }
|
||||
public dynamic List { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Application.Service
|
||||
{
|
||||
public interface IInspectionOrgDirService
|
||||
{
|
||||
public Task<dynamic> Page(InspectionOrgDirPageInput input);
|
||||
public Task<dynamic> ListScore();
|
||||
public Task<dynamic> Detail();
|
||||
public Task SaveScore(InspectionOrgDirSaveInput input);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,295 @@
|
||||
using Dapper;
|
||||
using Ewide.Core.Extension;
|
||||
using Furion.DatabaseAccessor;
|
||||
using Furion.DatabaseAccessor.Extensions;
|
||||
using Furion.DependencyInjection;
|
||||
using Furion.DynamicApiController;
|
||||
using Furion.FriendlyException;
|
||||
using Mapster;
|
||||
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
|
||||
{
|
||||
public class InspectionOrgDirService : IInspectionOrgDirService, IDynamicApiController, ITransient
|
||||
{
|
||||
private readonly IDapperRepository _dapperRep;
|
||||
|
||||
private readonly IRepository<BsInspectionOrgDirStage> _dirStageRep;
|
||||
private readonly IRepository<BsInspectionOrgDirDetail> _dirDetailRep;
|
||||
private readonly IRepository<BsInspectionOrg> _orgRep;
|
||||
|
||||
public InspectionOrgDirService(
|
||||
IDapperRepository dapperRep,
|
||||
|
||||
IRepository<BsInspectionOrgDirStage> dirStageRep,
|
||||
IRepository<BsInspectionOrgDirDetail> dirDetailRep,
|
||||
IRepository<BsInspectionOrg> orgRep
|
||||
)
|
||||
{
|
||||
_dapperRep = dapperRep;
|
||||
|
||||
_dirStageRep = dirStageRep;
|
||||
_dirDetailRep = dirDetailRep;
|
||||
_orgRep = orgRep;
|
||||
}
|
||||
|
||||
[HttpPost("/inspectionOrgDir/page")]
|
||||
public async Task<dynamic> Page([FromBody] InspectionOrgDirPageInput input)
|
||||
{
|
||||
var sql = "SELECT * FROM bs_inspection_org_dir_stage WHERE Status = 1 ORDER BY PublishTime DESC";
|
||||
return await _dapperRep.QueryPageDataDynamic(sql, input, filterFields: new[] { nameof(BsInspectionOrgDirStage.No) });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前名录打分列表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("/inspectionOrgDir/listScore")]
|
||||
public async Task<dynamic> ListScore()
|
||||
{
|
||||
var sql = @"SELECT * FROM
|
||||
(
|
||||
SELECT
|
||||
IO.Id,
|
||||
IO.`Code`,
|
||||
IO.`Name`,
|
||||
CASE WHEN LIODD.ScoreResult IS NULL THEN 1 ELSE 0 END IsNew,
|
||||
LIODD.ScoreResult PrevScoreResult,
|
||||
TIODD.Score,
|
||||
TIODD.ScoreResult
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
*,
|
||||
(SELECT Id FROM bs_inspection_org_dir_stage WHERE Status = 1 ORDER BY CreatedTime DESC LIMIT 1) PrevStageId,
|
||||
(SELECT Id FROM bs_inspection_org_dir_stage WHERE Status = 0) CurrentStageId
|
||||
FROM
|
||||
bs_inspection_org
|
||||
) IO
|
||||
LEFT JOIN bs_inspection_org_dir_detail LIODD ON IO.PrevStageId = LIODD.StageId AND IO.Id = LIODD.OrgId
|
||||
LEFT JOIN bs_inspection_org_dir_detail TIODD ON IO.CurrentStageId = TIODD.StageId AND IO.Id = TIODD.OrgId
|
||||
WHERE IO.Status = 1
|
||||
) T ORDER BY IsNew DESC, `Code`";
|
||||
return await _dapperRep.QueryAsync(sql);
|
||||
}
|
||||
|
||||
[HttpGet("/inspectionOrgDir/detail")]
|
||||
public async Task<dynamic> Detail()
|
||||
{
|
||||
return await _dirStageRep.DetachedEntities.FirstOrDefaultAsync(p => p.Status.Equals(0));
|
||||
}
|
||||
|
||||
private int ScoreResult(int score, int? prevScoreResult)
|
||||
{
|
||||
int result;
|
||||
if (score >= 10)
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
else if (score >= 8)
|
||||
{
|
||||
result = 2;
|
||||
}
|
||||
else if (score >= 6)
|
||||
{
|
||||
result = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = 4;
|
||||
}
|
||||
|
||||
if (prevScoreResult.GetValueOrDefault(0).Equals(3) && result.Equals(3))
|
||||
{
|
||||
result = 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[HttpPost("/inspectionOrgDir/saveScore")]
|
||||
[UnitOfWork]
|
||||
public async Task SaveScore([FromBody] InspectionOrgDirSaveInput input)
|
||||
{
|
||||
var stageId = input.Id;
|
||||
|
||||
var isAdd = false;
|
||||
// 新增修改名录主表
|
||||
if (String.IsNullOrEmpty(stageId))
|
||||
{
|
||||
// 新增
|
||||
// 如果存在未公布的名录,则失败
|
||||
var isExistUnpublished = await _dirStageRep.DetachedEntities.AnyAsync(p => p.Status.Equals(0));
|
||||
if(isExistUnpublished)
|
||||
throw Oops.Oh("存在未公布的名录,无法新增");
|
||||
|
||||
var isExistNo = await _dirStageRep.DetachedEntities.AnyAsync(p => p.No.Equals(input.No));
|
||||
if (isExistNo)
|
||||
throw Oops.Oh("名录期号已存在");
|
||||
|
||||
var stage = input.Adapt<BsInspectionOrgDirStage>();
|
||||
stageId = Guid.NewGuid().ToString().ToLower();
|
||||
stage.Id = stageId;
|
||||
|
||||
await stage.InsertAsync();
|
||||
|
||||
isAdd = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
var isExistNo = await _dirStageRep.DetachedEntities.AnyAsync(p => p.No.Equals(input.No) && !p.Id.Equals(input.Id));
|
||||
if (isExistNo)
|
||||
throw Oops.Oh("名录期号已存在");
|
||||
|
||||
// 修改
|
||||
var stage = await _dirStageRep.FirstOrDefaultAsync(p => p.Id.Equals(input.Id));
|
||||
stage.No = input.No;
|
||||
|
||||
await stage.UpdateAsync();
|
||||
}
|
||||
|
||||
var prevStage = await _dirStageRep.DetachedEntities.OrderByDescending(p => p.CreatedTime).FirstOrDefaultAsync(p => !p.Id.Equals(stageId));
|
||||
var prevDetails = new List<BsInspectionOrgDirDetail>();
|
||||
if (prevStage != null)
|
||||
{
|
||||
prevDetails = await _dirDetailRep.DetachedEntities.Where(p => p.StageId.Equals(prevStage.Id)).ToListAsync();
|
||||
}
|
||||
|
||||
// 新增修改名录详细表
|
||||
foreach (var detail in input.Detail)
|
||||
{
|
||||
var prevDetail = prevDetails.FirstOrDefault(p => p.OrgId.Equals(detail.OrgId));
|
||||
var scoreResult = ScoreResult(detail.Score, prevDetail?.ScoreResult);
|
||||
|
||||
if (!isAdd)
|
||||
{
|
||||
// 名录已经存在时,判断每个机构的打分记录是否已经存在
|
||||
var _data = await _dirDetailRep.FirstOrDefaultAsync(p => p.OrgId.Equals(detail.OrgId) && p.StageId.Equals(stageId));
|
||||
if (_data != null)
|
||||
{
|
||||
_data.Score = detail.Score;
|
||||
_data.ScoreResult = scoreResult;
|
||||
await _data.UpdateAsync();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
var data = detail.Adapt<BsInspectionOrgDirDetail>();
|
||||
data.StageId = stageId;
|
||||
data.ScoreResult = scoreResult;
|
||||
|
||||
await data.InsertAsync();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("/inspectionOrgDir/preview")]
|
||||
public async Task<InspectionOrgDirPreviewOutput> Preview()
|
||||
{
|
||||
var stage = await _dirStageRep.FirstOrDefaultAsync(p => p.Status.Equals(0));
|
||||
if (stage == null)
|
||||
{
|
||||
// 当前没有需要发布的名录
|
||||
return null;
|
||||
}
|
||||
|
||||
var count = await _dirDetailRep.Where(p => p.StageId.Equals(stage.Id) && !p.ScoreResult.Equals(4)).CountAsync();
|
||||
|
||||
var sql = @"SELECT * FROM
|
||||
(
|
||||
SELECT
|
||||
IO.Id,
|
||||
IO.`Code`,
|
||||
IO.`Name`,
|
||||
IO.Address,
|
||||
CASE
|
||||
WHEN TIODD.ScoreResult = 4 THEN -1
|
||||
WHEN LIODD.ScoreResult IS NULL THEN 1
|
||||
ELSE 0 END `Status`
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
*,
|
||||
(SELECT Id FROM bs_inspection_org_dir_stage WHERE Status = 1 ORDER BY CreatedTime DESC LIMIT 1) PrevStageId,
|
||||
(SELECT Id FROM bs_inspection_org_dir_stage WHERE Status = 0) CurrentStageId
|
||||
FROM
|
||||
bs_inspection_org
|
||||
) IO
|
||||
LEFT JOIN bs_inspection_org_dir_detail LIODD ON IO.PrevStageId = LIODD.StageId AND IO.Id = LIODD.OrgId
|
||||
LEFT JOIN bs_inspection_org_dir_detail TIODD ON IO.CurrentStageId = TIODD.StageId AND IO.Id = TIODD.OrgId
|
||||
WHERE (LIODD.ScoreResult IS NULL OR LIODD.ScoreResult < 4) AND IO.`Status` >= 0
|
||||
) T ORDER BY `Status` DESC, `Code`";
|
||||
var list = await _dapperRep.QueryAsync(sql);
|
||||
|
||||
return new InspectionOrgDirPreviewOutput
|
||||
{
|
||||
Stage = stage,
|
||||
Count = count,
|
||||
List = list
|
||||
};
|
||||
}
|
||||
|
||||
[HttpPost("/inspectionOrgDir/publish")]
|
||||
[UnitOfWork]
|
||||
public async Task Publish()
|
||||
{
|
||||
var stage = await _dirStageRep.FirstOrDefaultAsync(p => p.Status.Equals(0));
|
||||
if (stage == null)
|
||||
throw Oops.Oh("当前名录数据错误");
|
||||
|
||||
// 评分详情
|
||||
var details = await _dirDetailRep.DetachedEntities.Where(p => p.StageId.Equals(stage.Id)).ToListAsync();
|
||||
// 当前需打分的机构
|
||||
var orgIds = await _orgRep.DetachedEntities.Where(p => p.Status != InspectionOrgStatus.Delisting && p.Status != InspectionOrgStatus.Revoke).Select(p => p.Id).ToListAsync();
|
||||
if (orgIds.Any(p => !details.Select(p => p.OrgId).Contains(p)))
|
||||
throw Oops.Oh("存在未评分的机构");
|
||||
|
||||
// 往期名录
|
||||
var prevStage = await _dirStageRep.DetachedEntities.OrderByDescending(p => p.CreatedTime).FirstOrDefaultAsync(p => !p.Id.Equals(stage.Id));
|
||||
// 往期机构
|
||||
var prevDetails = await _dirDetailRep.DetachedEntities.Where(p => p.StageId.Equals(prevStage.Id)).ToListAsync();
|
||||
// 往期黄牌机构
|
||||
var prevFilteredDetailOrgIds = new List<string>();
|
||||
if (prevStage != null)
|
||||
{
|
||||
// 获取往期黄牌机构
|
||||
prevFilteredDetailOrgIds = prevDetails.Where(p => p.ScoreResult.Equals(3)).Select(p => p.OrgId).ToList();
|
||||
}
|
||||
|
||||
// 对除名的机构修改状态
|
||||
var revmoeCount = 0;
|
||||
var mayBeRemovedDetails = details.Where(p => p.ScoreResult.Equals(3) || p.ScoreResult.Equals(4)).ToList();
|
||||
foreach (var detail in mayBeRemovedDetails)
|
||||
{
|
||||
if ((detail.ScoreResult.Equals(3) && prevFilteredDetailOrgIds.Contains(detail.OrgId))
|
||||
|| detail.ScoreResult.Equals(4))
|
||||
{
|
||||
// 本期及往期为黄牌或者本期为红牌的,进行除名
|
||||
var org = await _orgRep.FirstOrDefaultAsync(p => p.Id.Equals(detail.OrgId));
|
||||
org.Status = InspectionOrgStatus.Delisting;
|
||||
await org.UpdateIncludeAsync(new[] { nameof(BsInspectionOrg.Status) });
|
||||
revmoeCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// 新增机构数量
|
||||
var newDetailsCount = details.Where(p => (p.ScoreResult.Equals(1) || p.ScoreResult.Equals(2)) && !prevDetails.Select(p => p.OrgId).Contains(p.OrgId)).Count();
|
||||
|
||||
// 总数减去除名
|
||||
stage.OrgAmount = details.Count - revmoeCount;
|
||||
// 除名
|
||||
stage.RemovedOrgAmount = revmoeCount;
|
||||
// 新增
|
||||
stage.NewOrgAmount = newDetailsCount;
|
||||
|
||||
stage.Status = 1;
|
||||
stage.PublishTime = DateTime.Now;
|
||||
await stage.UpdateAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user