操控平台后端代码
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.

257 lines
10 KiB

// 大名科技(天津)有限公司版权所有 电话:18020030720 QQ:515096995
//
// 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Admin.NET.Bodk.Core;
using Admin.NET.Bodk.Genetic.Entities.Reports;
using Admin.NET.Bodk.Genetic.Entities.Tumors;
using Admin.NET.Bodk.Genetic.Models.Reports;
using Admin.NET.Core;
using Admin.NET.Core.Service;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Admin.NET.Bodk.Genetic;
[ApiDescriptionSettings(Groups = new[] { "Bodk Groups" }, Name = "GeneReport", Description = "基因检测服务")]
public class GeneReportService(
UserManager userManager,
SysOrgService sysOrgService,
SysUserService sysUserService,
SqlSugarRepository<GeneTestingTumorLocusReportEntity> geneTestingTumorLocusReportRepository,
SqlSugarRepository<GeneTestingReportEntity> reportRepository,
SqlSugarRepository<GeneTestingTumorReportEntity> geneTestingTumorReportRepository)
: ServiceBase(userManager, sysOrgService, sysUserService)
{
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + SignatureAuthenticationDefaults.AuthenticationScheme)]
[DisplayName("Add")]
public async Task AddReport(AddReportInput input)
{
var db = geneTestingTumorLocusReportRepository.Context;
try
{
await db.Ado.BeginTranAsync();
var entity = input.Adapt<GeneTestingReportEntity>();
// var entity = new GeneTestingReportEntity()
// {
// SampleType = input.SampleType,
// TestingType = input.TestingType,
// TestingMethod = input.TestingMethod,
// TofMs = input.TofMs,
// GenotypingAnalysis = input.GenotypingAnalysis,
// SampleQuality = input.SampleQuality,
// GeneticRiskAssessment = input.GeneticRiskAssessment,
// Barcode = input.Barcode,
// DnaExtraction = input.DnaExtraction,
// CustomerId = input.CustomerId,
// ReportTime = input.ReportTime,
// Report = input.Report,
// Pcr = input.Pcr,
// SubmissionTime = input.SubmissionTime,
// };
entity = await AddBefore(entity);
var reportId = await db.Insertable(entity).ExecuteReturnSnowflakeIdAsync();
foreach (var tumor in input.Tumors)
{
var tumorEntity = new GeneTestingTumorReportEntity()
{
TumorId = tumor.TumorId,
RiskScore = tumor.RiskScore,
RiskLevel = tumor.RiskLevel,
ReportId = reportId
};
tumorEntity = await AddBefore(tumorEntity);
var tumorId = await db.Insertable(tumorEntity).ExecuteReturnSnowflakeIdAsync();
foreach (var locus in tumor.Loci)
{
var locusEntity = new GeneTestingTumorLocusReportEntity()
{
LocusId = locus.LocusId,
RiskId = locus.RiskId,
TumorId = tumorId
};
locusEntity = await AddBefore(locusEntity);
await db.Insertable(locusEntity).ExecuteReturnSnowflakeIdAsync();
}
}
await db.Ado.CommitTranAsync();
}
catch
{
await db.Ado.RollbackTranAsync();
throw;
}
}
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + SignatureAuthenticationDefaults.AuthenticationScheme)]
[DisplayName("GetList")]
public async Task<List<ReportOutput>> GetList([Required] long customerId)
{
var db = reportRepository.Context;
var reports = await db.Queryable<GeneTestingReportEntity>()
.Where(r => r.CustomerId == customerId)
.Select(r => new ReportOutput()
{
SampleType = r.SampleType,
TestingType = r.TestingType,
TestingMethod = r.TestingMethod,
TofMs = r.TofMs,
GenotypingAnalysis = r.GenotypingAnalysis,
SampleQuality = r.SampleQuality,
GeneticRiskAssessment = r.GeneticRiskAssessment,
Barcode = r.Barcode,
DnaExtraction = r.DnaExtraction,
CustomerId = r.CustomerId,
Id = r.Id,
ReportTime = r.ReportTime,
Report = r.Report,
Pcr = r.Pcr,
SubmissionTime = r.SubmissionTime
}).ToListAsync();
foreach (var report in reports)
{
var tumors = await db.Queryable<GeneTestingTumorReportEntity>()
.LeftJoin<TumorEntity>((r, t) => r.TumorId == t.Id)
.Where(r => r.ReportId == report.Id)
.Select((r, t) => new TumorOutput()
{
AvaRiskScore = t.AvaRiskScore,
TumorName = t.TumorName,
Description = t.Description,
Code = t.Code,
RiskScore = r.RiskScore,
RiskLevel = r.RiskLevel,
ReportId = report.Id,
TumorId = r.TumorId,
Id = r.Id,
}).ToListAsync();
foreach (var tumor in tumors)
{
var loci = await db.Queryable<GeneTestingTumorLocusReportEntity>()
.LeftJoin<GeneLocusEntity>((l, gl) => l.LocusId == gl.Id)
.LeftJoin<GeneTypeEntity>((l, gl, gt) => l.RiskId == gt.Id)
.Where(l => l.TumorId == tumor.Id)
.Select((l, gl, gt) => new LocusOutput()
{
Description = gt.Description,
Risk = gt.Risk,
GenekType = gt.GenekType,
Position = gl.Position,
LocusName = gl.Name,
Id = l.Id,
}).ToListAsync();
tumor.Loci = loci;
}
report.Tumors = tumors;
}
return reports;
}
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + SignatureAuthenticationDefaults.AuthenticationScheme)]
[DisplayName("Bind")]
public async Task<long> Bind(BindInput input)
{
GeneTestingReportEntity entity = new GeneTestingReportEntity()
{
CustomerId = input.CustomerId,
Barcode = input.Barcode
};
entity = await AddBefore(entity);
return await reportRepository.InsertReturnSnowflakeIdAsync(entity);
}
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + SignatureAuthenticationDefaults.AuthenticationScheme)]
[DisplayName("Update")]
public async Task UpdateReport(UpdateReportInput input)
{
var db = geneTestingTumorLocusReportRepository.Context;
try
{
await db.Ado.BeginTranAsync();
var entity = new GeneTestingReportEntity()
{
Id = input.Id,
SampleType = input.SampleType,
TestingType = input.TestingType,
TestingMethod = input.TestingMethod,
TofMs = input.TofMs,
GenotypingAnalysis = input.GenotypingAnalysis,
SampleQuality = input.SampleQuality,
GeneticRiskAssessment = input.GeneticRiskAssessment,
Barcode = input.Barcode,
DnaExtraction = input.DnaExtraction,
CustomerId = input.CustomerId,
ReportTime = input.ReportTime,
Report = input.Report,
Pcr = input.Pcr,
SubmissionTime = input.SubmissionTime,
};
entity = await UpdateBefore(entity);
await db.Updateable(entity).ExecuteCommandAsync();
foreach (var tumor in input.Tumors)
{
var tumorEntity = new GeneTestingTumorReportEntity()
{
TumorId = tumor.TumorId,
RiskScore = tumor.RiskScore,
RiskLevel = tumor.RiskLevel,
ReportId = input.Id
};
long tumorId = 0;
if (tumor.Id is null)
{
tumorEntity = await AddBefore(tumorEntity);
tumorId = await db.Insertable(tumorEntity).ExecuteReturnSnowflakeIdAsync();
}
else
{
tumorEntity.Id=tumor.Id.Value;
tumorEntity = await UpdateBefore(tumorEntity);
await db.Updateable<TumorEntity>(tumorEntity).ExecuteCommandAsync();
tumorId = tumor.Id.Value;
}
foreach (var locus in tumor.Loci)
{
var locusEntity = new GeneTestingTumorLocusReportEntity()
{
LocusId = locus.LocusId,
RiskId = locus.RiskId,
TumorId = tumorId
};
if (locus.Id is null)
{
locusEntity = await AddBefore(locusEntity);
await db.Insertable(locusEntity).ExecuteReturnSnowflakeIdAsync();
}
else
{
locusEntity.Id=locus.Id.Value;
locusEntity = await UpdateBefore(locusEntity);
await db.Updateable(locusEntity).ExecuteCommandAsync();
}
}
}
await db.Ado.CommitTranAsync();
}
catch
{
await db.Ado.RollbackTranAsync();
throw;
}
}
// public async Task<ReportOutput> GetSingle([Required] string barcode)
// {
// }
}