From 33cca5eef4676bc780949e4cef096c9ad991876c Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Mon, 1 Jun 2026 02:58:42 +0000 Subject: [PATCH] revert 5a286c82aaa38c5aaa4cd381164e90fbffd709cb revert Merge branch 'dev' of http://8.153.108.90:3000/YD/YD_SmartSports.Api into dev --- .../ShangWaiMao/ITempTccjRepository.cs | 28 ++ .../ShangWaiMao/IShangWaiMaoService.cs | 22 + .../ShangWaiMao/TempTccjRepository.cs | 464 ++++++++++++++++++ .../ShangWaiMao/ShangWaiMaoService.cs | 1 + .../Training/I_TrainingDataService.cs | 2 +- VOL.Core/Configuration/AppSetting.cs | 12 + .../DBManager/Partial/DBServerProvider.cs | 31 +- VOL.Core/EFDbContext/SwmMySqlContext.cs | 43 ++ .../AutofacContainerModuleExtension.cs | 7 + .../DomainModels/ShangWaiMao/TempTccj.cs | 3 +- .../Request/ShangWaiMaoTempTccjDetailParam.cs | 23 + .../Request/ShangWaiMaoTempTccjPageParam.cs | 50 ++ .../Response/ShangWaiMaoTempTccjModels.cs | 136 +++++ .../Response/GetClassReportDetailsModel.cs | 8 +- .../Business/ShangWaiMaoController.cs | 34 ++ VOL.WebApi/appsettings.json | 4 +- 16 files changed, 843 insertions(+), 25 deletions(-) create mode 100644 VOL.Business/IRepositories/ShangWaiMao/ITempTccjRepository.cs create mode 100644 VOL.Business/Repositories/ShangWaiMao/TempTccjRepository.cs create mode 100644 VOL.Core/EFDbContext/SwmMySqlContext.cs create mode 100644 VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjDetailParam.cs create mode 100644 VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjPageParam.cs create mode 100644 VOL.Model/ShangWaiMao/Response/ShangWaiMaoTempTccjModels.cs diff --git a/VOL.Business/IRepositories/ShangWaiMao/ITempTccjRepository.cs b/VOL.Business/IRepositories/ShangWaiMao/ITempTccjRepository.cs new file mode 100644 index 0000000..e89ea3c --- /dev/null +++ b/VOL.Business/IRepositories/ShangWaiMao/ITempTccjRepository.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using VOL.Core.Extensions.AutofacManager; +using VOL.Entity.DomainModels; +using VOL.Model; +using VOL.Model.ShangWaiMao.Request; +using VOL.Model.ShangWaiMao.Response; + +namespace VOL.Business.IRepositories.ShangWaiMao +{ + /// + /// 上外贸体测成绩临时表仓储 + /// + public interface ITempTccjRepository : IDependency + { + Task GetFilterOptionsAsync(); + + Task> GetPageListAsync(ShangWaiMaoTempTccjPageParam param); + + Task GetDetailAsync(ShangWaiMaoTempTccjDetailParam param); + + Task> GetAllAsync(); + + Task InsertAsync(TempTccj entity); + + Task InsertRangeAsync(IEnumerable entities); + } +} diff --git a/VOL.Business/IServices/ShangWaiMao/IShangWaiMaoService.cs b/VOL.Business/IServices/ShangWaiMao/IShangWaiMaoService.cs index f78ff64..1f0a84b 100644 --- a/VOL.Business/IServices/ShangWaiMao/IShangWaiMaoService.cs +++ b/VOL.Business/IServices/ShangWaiMao/IShangWaiMaoService.cs @@ -1,5 +1,7 @@ using System.Threading.Tasks; using VOL.Model; +using VOL.Model.ShangWaiMao.Request; +using VOL.Model.ShangWaiMao.Response; namespace VOL.Business.IServices.ShangWaiMao { @@ -8,6 +10,26 @@ namespace VOL.Business.IServices.ShangWaiMao /// public interface IShangWaiMaoService { + /// + /// 获取体测成绩列表页搜索条件 + /// + /// + Task GetTempTccjFilterOptionsAsync(); + + /// + /// 获取体测成绩分页列表 + /// + /// + /// + Task> GetTempTccjPageListAsync(ShangWaiMaoTempTccjPageParam paramDto); + + /// + /// 获取体测成绩详情 + /// + /// + /// + Task GetTempTccjDetailAsync(ShangWaiMaoTempTccjDetailParam paramDto); + /// /// 导出学生课程心率与运动数据 /// diff --git a/VOL.Business/Repositories/ShangWaiMao/TempTccjRepository.cs b/VOL.Business/Repositories/ShangWaiMao/TempTccjRepository.cs new file mode 100644 index 0000000..07b4ec0 --- /dev/null +++ b/VOL.Business/Repositories/ShangWaiMao/TempTccjRepository.cs @@ -0,0 +1,464 @@ +using System; +using Dapper; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using VOL.Business.IRepositories.ShangWaiMao; +using VOL.Core.DBManager; +using VOL.Core.Dapper; +using VOL.Core.Extensions.AutofacManager; +using VOL.Entity.DomainModels; +using VOL.Model; +using VOL.Model.ShangWaiMao.Request; +using VOL.Model.ShangWaiMao.Response; + +namespace VOL.Business.Repositories.ShangWaiMao +{ + /// + /// 上外贸体测成绩临时表仓储 + /// + public class TempTccjRepository : ITempTccjRepository + { + private const string TableName = "temp_tccj"; + + private ISqlDapper Dapper => DBServerProvider.SqlDapperSwmMySql; + + public static ITempTccjRepository Instance + { + get { return AutofacContainerModule.GetService(); } + } + + public async Task GetFilterOptionsAsync() + { + const string sql = @" +select distinct + case sex + when '1' then '男' + when '2' then '女' + else sex + end as Label, + sex as Value +from temp_tccj +where ifnull(sex, '') <> '' +order by sex; + +select distinct college_name as Label, college_name as Value +from temp_tccj +where ifnull(college_name, '') <> '' +order by college_name; + +select distinct grade_no as Label, grade_no as Value +from temp_tccj +where ifnull(grade_no, '') <> '' +order by grade_no; + +select distinct class_name as Label, class_name as Value +from temp_tccj +where ifnull(class_name, '') <> '' +order by class_name; + +select distinct conclusion as Label, conclusion as Value +from temp_tccj +where ifnull(conclusion, '') <> '' +order by conclusion;"; + + var (sexList, collegeList, gradeList, administrativeClassList, conclusionList) = + await Dapper.QueryMultipleAsync(sql, null); + + return new ShangWaiMaoTempTccjFilterOptions + { + SexList = sexList.ToList(), + CollegeList = collegeList.ToList(), + GradeList = gradeList.ToList(), + AdministrativeClassList = administrativeClassList.ToList(), + SportsClassList = new List(), + ConclusionList = conclusionList.ToList() + }; + } + + public async Task> GetPageListAsync(ShangWaiMaoTempTccjPageParam param) + { + param ??= new ShangWaiMaoTempTccjPageParam(); + param.PageIndex = param.PageIndex <= 0 ? 1 : param.PageIndex; + param.PageSize = param.PageSize <= 0 ? 20 : param.PageSize; + + var whereBuilder = new StringBuilder(" where 1=1 "); + var dbParams = new DynamicParameters(); + + if (!string.IsNullOrWhiteSpace(param.StudentNo)) + { + whereBuilder.Append(" and student_no like concat('%', @StudentNo, '%') "); + dbParams.Add("StudentNo", param.StudentNo.Trim()); + } + + if (!string.IsNullOrWhiteSpace(param.Name)) + { + whereBuilder.Append(" and name like concat('%', @Name, '%') "); + dbParams.Add("Name", param.Name.Trim()); + } + + if (!string.IsNullOrWhiteSpace(param.Sex)) + { + whereBuilder.Append(" and sex = @Sex "); + dbParams.Add("Sex", NormalizeSex(param.Sex)); + } + + if (!string.IsNullOrWhiteSpace(param.CollegeName)) + { + whereBuilder.Append(" and college_name = @CollegeName "); + dbParams.Add("CollegeName", param.CollegeName.Trim()); + } + + if (!string.IsNullOrWhiteSpace(param.GradeNo)) + { + whereBuilder.Append(" and grade_no = @GradeNo "); + dbParams.Add("GradeNo", param.GradeNo.Trim()); + } + + if (!string.IsNullOrWhiteSpace(param.AdministrativeClass)) + { + whereBuilder.Append(" and class_name = @AdministrativeClass "); + dbParams.Add("AdministrativeClass", param.AdministrativeClass.Trim()); + } + + if (!string.IsNullOrWhiteSpace(param.Conclusion)) + { + whereBuilder.Append(" and conclusion = @Conclusion "); + dbParams.Add("Conclusion", param.Conclusion.Trim()); + } + + var countSql = $"select count(1) from {TableName} {whereBuilder}"; + var totalObj = await Dapper.ExecuteScalarAsync(countSql, dbParams); + var total = int.TryParse(totalObj?.ToString(), out var parsedTotal) ? parsedTotal : 0; + + dbParams.Add("Offset", (param.PageIndex - 1) * param.PageSize); + dbParams.Add("PageSize", param.PageSize); + + var listSql = $@" +select + student_no as StudentNo, + name as Name, + case sex + when '1' then '男' + when '2' then '女' + else sex + end as Sex, + grade_no as GradeNo, + class_name as AdministrativeClass, + '' as SportsClass, + case test_state + when 0 then '未测试' + when 1 then '已测试' + when 2 then '缺项' + else '' + end as TestState, + case exempt + when 0 then '测试' + when 1 then '免试' + else '' + end as Exempt, + add_score as AddScore, + health_score as HealthScore, + score as Score, + conclusion as Conclusion, + '' as Remark, + college_name as CollegeName +from {TableName} +{whereBuilder} +order by student_no +limit @Offset, @PageSize"; + + var datas = (await Dapper.QueryListAsync(listSql, dbParams)).ToList(); + + return new PageDataDto + { + Total = total, + TotalPages = total == 0 ? 0 : (total + param.PageSize - 1) / param.PageSize, + PageIndex = param.PageIndex, + PageSize = param.PageSize, + Datas = datas + }; + } + + public async Task GetDetailAsync(ShangWaiMaoTempTccjDetailParam param) + { + if (string.IsNullOrWhiteSpace(param?.StudentNo)) + { + throw new Exception("学号不能为空"); + } + + var whereBuilder = new StringBuilder(" where student_no = @StudentNo "); + var dbParams = new DynamicParameters(); + dbParams.Add("StudentNo", param.StudentNo.Trim()); + + if (!string.IsNullOrWhiteSpace(param.SchoolYear)) + { + whereBuilder.Append(" and school_year = @SchoolYear "); + dbParams.Add("SchoolYear", param.SchoolYear.Trim()); + } + + if (!string.IsNullOrWhiteSpace(param.SchoolTerm)) + { + whereBuilder.Append(" and school_term = @SchoolTerm "); + dbParams.Add("SchoolTerm", param.SchoolTerm.Trim()); + } + + var sql = $@" +select * +from {TableName} +{whereBuilder} +order by school_year desc, school_term desc +limit 1; + +select + avg(lungs_score) as LungsScore, + avg(meter50_score) as Meter50Score, + avg(standing_long_jump_score) as StandingLongJumpScore, + avg(sit_and_reach_score) as SitAndReachScore, + avg(case when sex = '1' then meter1000_score when sex = '2' then meter800_score else null end) as EnduranceScore, + avg(case when sex = '1' then pull_up_score when sex = '2' then sit_up_score else null end) as StrengthScore +from {TableName};"; + + var (studentList, averageList) = await Dapper.QueryMultipleAsync(sql, dbParams); + var student = studentList.FirstOrDefault(); + if (student == null) + { + throw new Exception("未找到该学生体测详情"); + } + + var averages = averageList.FirstOrDefault() ?? new TempTccjPortraitAverageData(); + + return new ShangWaiMaoTempTccjDetailDto + { + BasicInfo = BuildBasicInfo(student), + DetailItems = BuildDetailItems(student), + PortraitItems = BuildPortraitItems(student, averages) + }; + } + + private static string NormalizeSex(string sex) + { + var normalized = sex?.Trim(); + return normalized switch + { + "男" => "1", + "女" => "2", + _ => normalized + }; + } + + private static ShangWaiMaoTempTccjBasicInfo BuildBasicInfo(TempTccj student) + { + return new ShangWaiMaoTempTccjBasicInfo + { + CollegeName = student.college_name, + GradeName = GetGradeDisplayName(student.grade_no), + AdministrativeClass = student.class_name, + StudentNo = student.student_no, + Name = student.name, + Sex = GetSexDisplayName(student.sex), + HealthScore = FormatDisplayValue(student.health_score), + AddScore = FormatDisplayValue(student.add_score), + TotalScore = FormatDisplayValue(student.score), + Conclusion = student.conclusion, + Remark = string.Empty + }; + } + + private static List BuildDetailItems(TempTccj student) + { + var isMale = student.sex == "1"; + + return new List + { + CreateDetailItem("身高", student.height, "厘米"), + CreateDetailItem("体重", student.weight, "公斤"), + CreateDetailItem("肺活量", student.lungs, "毫升", null, student.lungs_score, student.lungs_leve), + CreateDetailItem("50米跑", student.meter50, "秒", null, student.meter50_score, student.meter50_leve), + CreateDetailItem("立定跳远", student.standing_long_jump, "厘米", null, student.standing_long_jump_score, student.standing_long_jump_leve), + CreateDetailItem("坐位体前屈", student.sit_and_reach, "厘米", null, student.sit_and_reach_score, student.sit_and_reach_leve), + CreateDetailItem(isMale ? "1000米跑" : "800米跑", isMale ? student.meter1000 : student.meter800, "分/秒", student.bonus2_df, isMale ? student.meter1000_score : student.meter800_score, isMale ? student.meter1000_leve : student.meter800_leve), + CreateDetailItem(isMale ? "引体向上" : "1分钟仰卧起坐", isMale ? student.pull_up : student.sit_up, isMale ? "次" : "次/分钟", student.bonus1_df, isMale ? student.pull_up_score : student.sit_up_score, isMale ? student.pull_up_leve : student.sit_up_leve), + CreateDetailItem("左眼裸眼视力", student.leftVision), + CreateDetailItem("右眼裸眼视力", student.rightVision), + CreateDetailItem("左眼球镜", student.left_sphere), + CreateDetailItem("右眼球镜", student.right_sphere), + CreateDetailItem("左眼柱镜", student.left_cytdnder), + CreateDetailItem("右眼柱镜", student.right_cytdnder) + }; + } + + private static List BuildPortraitItems(TempTccj student, TempTccjPortraitAverageData averages) + { + var isMale = student.sex == "1"; + + return new List + { + CreatePortraitItem("肺活量", student.lungs_score, averages.LungsScore), + CreatePortraitItem("中长跑", isMale ? student.meter1000_score : student.meter800_score, averages.EnduranceScore), + CreatePortraitItem("引体/仰卧", isMale ? student.pull_up_score : student.sit_up_score, averages.StrengthScore), + CreatePortraitItem("立定跳远", student.standing_long_jump_score, averages.StandingLongJumpScore), + CreatePortraitItem("坐位体前屈", student.sit_and_reach_score, averages.SitAndReachScore), + CreatePortraitItem("50米跑", student.meter50_score, averages.Meter50Score) + }; + } + + private static ShangWaiMaoTempTccjDetailItem CreateDetailItem(string itemName, decimal? achievement, string unit = "", decimal? addScore = null, decimal? score = null, string level = "") + { + return new ShangWaiMaoTempTccjDetailItem + { + ItemName = itemName, + Achievement = FormatDisplayValue(achievement), + Unit = unit, + AddScore = FormatDisplayValue(addScore), + Score = FormatDisplayValue(score), + Level = level ?? string.Empty + }; + } + + private static ShangWaiMaoTempTccjDetailItem CreateDetailItem(string itemName, string achievement, string unit = "", string addScore = "", string score = "", string level = "") + { + return new ShangWaiMaoTempTccjDetailItem + { + ItemName = itemName, + Achievement = achievement ?? string.Empty, + Unit = unit, + AddScore = addScore ?? string.Empty, + Score = score ?? string.Empty, + Level = level ?? string.Empty + }; + } + + private static ShangWaiMaoTempTccjPortraitItem CreatePortraitItem(string itemName, decimal? personalScore, decimal? schoolAverageScore) + { + return new ShangWaiMaoTempTccjPortraitItem + { + ItemName = itemName, + PersonalScore = personalScore, + SchoolAverageScore = schoolAverageScore + }; + } + + private static string GetSexDisplayName(string sex) + { + return sex switch + { + "1" => "男", + "2" => "女", + _ => sex ?? string.Empty + }; + } + + private static string GetGradeDisplayName(string gradeNo) + { + var normalized = gradeNo?.Trim(); + return normalized switch + { + "41" => "大一", + "42" => "大二", + "43" => "大三", + "44" => "大四", + _ => normalized ?? string.Empty + }; + } + + private static string FormatDisplayValue(decimal? value) + { + return value.HasValue ? value.Value.ToString("0.##") : string.Empty; + } + + private sealed class TempTccjPortraitAverageData + { + public decimal? LungsScore { get; set; } + + public decimal? Meter50Score { get; set; } + + public decimal? StandingLongJumpScore { get; set; } + + public decimal? SitAndReachScore { get; set; } + + public decimal? EnduranceScore { get; set; } + + public decimal? StrengthScore { get; set; } + } + + public async Task> GetAllAsync() + { + var result = await Dapper.QueryListAsync($"select * from {TableName}", null); + return result.ToList(); + } + + public Task InsertAsync(TempTccj entity) + { + const string sql = @" +insert into temp_tccj +( +school_year, school_term, student_no, name, sex, class_no, grade_no, class_name, college_name, +test_state, exempt, add_score, health_score, score, conclusion, height, weight, bmi, bmi_df, +bmi_score, bmi_leve, lungs, lungs_df, lungs_score, lungs_leve, meter50, meter50_df, meter50_score, +meter50_leve, standing_long_jump, standing_long_jump_df, standing_long_jump_score, standing_long_jump_leve, +sit_and_reach, sit_and_reach_df, sit_and_reach_score, sit_and_reach_leve, meter800, meter800_df, +meter800_score, meter800_leve, meter1000, meter1000_df, meter1000_score, meter1000_leve, sit_up, +sit_up_df, sit_up_score, sit_up_leve, pull_up, pull_up_df, pull_up_score, pull_up_leve, skip, skip_df, +skip_score, skip_leve, shuttle_run, shuttle_run_df, shuttle_run_score, shuttle_run_leve, leftVision, +rightVision, leftMirror, rightMirror, leftAmetropia, rightAmetropia, left_sphere, right_sphere, +left_cytdnder, right_cytdnder, left_axial, right_axial, is_ok_mirror, bonus1, bonus1_df, bonus2, bonus2_df +) +values +( +@school_year, @school_term, @student_no, @name, @sex, @class_no, @grade_no, @class_name, @college_name, +@test_state, @exempt, @add_score, @health_score, @score, @conclusion, @height, @weight, @bmi, @bmi_df, +@bmi_score, @bmi_leve, @lungs, @lungs_df, @lungs_score, @lungs_leve, @meter50, @meter50_df, @meter50_score, +@meter50_leve, @standing_long_jump, @standing_long_jump_df, @standing_long_jump_score, @standing_long_jump_leve, +@sit_and_reach, @sit_and_reach_df, @sit_and_reach_score, @sit_and_reach_leve, @meter800, @meter800_df, +@meter800_score, @meter800_leve, @meter1000, @meter1000_df, @meter1000_score, @meter1000_leve, @sit_up, +@sit_up_df, @sit_up_score, @sit_up_leve, @pull_up, @pull_up_df, @pull_up_score, @pull_up_leve, @skip, @skip_df, +@skip_score, @skip_leve, @shuttle_run, @shuttle_run_df, @shuttle_run_score, @shuttle_run_leve, @leftVision, +@rightVision, @leftMirror, @rightMirror, @leftAmetropia, @rightAmetropia, @left_sphere, @right_sphere, +@left_cytdnder, @right_cytdnder, @left_axial, @right_axial, @is_ok_mirror, @bonus1, @bonus1_df, @bonus2, @bonus2_df +);"; + + return Dapper.ExcuteNonQueryAsync(sql, entity); + } + + public Task InsertRangeAsync(IEnumerable entities) + { + var entityList = entities?.ToList() ?? new List(); + if (entityList.Count == 0) + { + return Task.FromResult(0); + } + + const string sql = @" +insert into temp_tccj +( +school_year, school_term, student_no, name, sex, class_no, grade_no, class_name, college_name, +test_state, exempt, add_score, health_score, score, conclusion, height, weight, bmi, bmi_df, +bmi_score, bmi_leve, lungs, lungs_df, lungs_score, lungs_leve, meter50, meter50_df, meter50_score, +meter50_leve, standing_long_jump, standing_long_jump_df, standing_long_jump_score, standing_long_jump_leve, +sit_and_reach, sit_and_reach_df, sit_and_reach_score, sit_and_reach_leve, meter800, meter800_df, +meter800_score, meter800_leve, meter1000, meter1000_df, meter1000_score, meter1000_leve, sit_up, +sit_up_df, sit_up_score, sit_up_leve, pull_up, pull_up_df, pull_up_score, pull_up_leve, skip, skip_df, +skip_score, skip_leve, shuttle_run, shuttle_run_df, shuttle_run_score, shuttle_run_leve, leftVision, +rightVision, leftMirror, rightMirror, leftAmetropia, rightAmetropia, left_sphere, right_sphere, +left_cytdnder, right_cytdnder, left_axial, right_axial, is_ok_mirror, bonus1, bonus1_df, bonus2, bonus2_df +) +values +( +@school_year, @school_term, @student_no, @name, @sex, @class_no, @grade_no, @class_name, @college_name, +@test_state, @exempt, @add_score, @health_score, @score, @conclusion, @height, @weight, @bmi, @bmi_df, +@bmi_score, @bmi_leve, @lungs, @lungs_df, @lungs_score, @lungs_leve, @meter50, @meter50_df, @meter50_score, +@meter50_leve, @standing_long_jump, @standing_long_jump_df, @standing_long_jump_score, @standing_long_jump_leve, +@sit_and_reach, @sit_and_reach_df, @sit_and_reach_score, @sit_and_reach_leve, @meter800, @meter800_df, +@meter800_score, @meter800_leve, @meter1000, @meter1000_df, @meter1000_score, @meter1000_leve, @sit_up, +@sit_up_df, @sit_up_score, @sit_up_leve, @pull_up, @pull_up_df, @pull_up_score, @pull_up_leve, @skip, @skip_df, +@skip_score, @skip_leve, @shuttle_run, @shuttle_run_df, @shuttle_run_score, @shuttle_run_leve, @leftVision, +@rightVision, @leftMirror, @rightMirror, @leftAmetropia, @rightAmetropia, @left_sphere, @right_sphere, +@left_cytdnder, @right_cytdnder, @left_axial, @right_axial, @is_ok_mirror, @bonus1, @bonus1_df, @bonus2, @bonus2_df +);"; + + return Dapper.ExcuteNonQueryAsync(sql, entityList); + } + } +} diff --git a/VOL.Business/Services/ShangWaiMao/ShangWaiMaoService.cs b/VOL.Business/Services/ShangWaiMao/ShangWaiMaoService.cs index 7d5afe7..2c8e7a4 100644 --- a/VOL.Business/Services/ShangWaiMao/ShangWaiMaoService.cs +++ b/VOL.Business/Services/ShangWaiMao/ShangWaiMaoService.cs @@ -113,6 +113,7 @@ namespace VOL.Business.Services.ShangWaiMao return BuildExcel(rawDataList); } + private static byte[] BuildExcel(List rawDataList) { using var package = new ExcelPackage(); diff --git a/VOL.Business/Services/Training/I_TrainingDataService.cs b/VOL.Business/Services/Training/I_TrainingDataService.cs index 2a65634..d5e0b8d 100644 --- a/VOL.Business/Services/Training/I_TrainingDataService.cs +++ b/VOL.Business/Services/Training/I_TrainingDataService.cs @@ -1,4 +1,4 @@ -using AutoMapper; +using AutoMapper; using Castle.Core.Internal; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; diff --git a/VOL.Core/Configuration/AppSetting.cs b/VOL.Core/Configuration/AppSetting.cs index 4f35c37..3429f21 100644 --- a/VOL.Core/Configuration/AppSetting.cs +++ b/VOL.Core/Configuration/AppSetting.cs @@ -78,6 +78,11 @@ namespace VOL.Core.Configuration /// public static JingShiTiJiao JingShiTiJiao { get; set; } + /// + /// 上外贸 MySQL + /// + public static SwmMySqlOptions SwmMySql { get; private set; } + /// /// JWT有效期(分钟=默认120) /// @@ -103,6 +108,7 @@ namespace VOL.Core.Configuration services.Configure(configuration.GetSection("YueDongServerOSS")); services.Configure(configuration.GetSection("JingShiTiJiao")); + services.Configure(configuration.GetSection("SwmMySql")); var provider = services.BuildServiceProvider(); IWebHostEnvironment environment = provider.GetRequiredService(); @@ -124,6 +130,7 @@ namespace VOL.Core.Configuration YueDongServerOSS = provider.GetRequiredService>().Value ?? new YueDongServerOSS(); JingShiTiJiao = provider.GetRequiredService>().Value ?? new JingShiTiJiao(); + SwmMySql = provider.GetRequiredService>().Value ?? new SwmMySqlOptions(); _connection = provider.GetRequiredService>().Value; @@ -265,4 +272,9 @@ namespace VOL.Core.Configuration public string SchoolCode { get; set; } public string SportsItem { get; set; } } + + public class SwmMySqlOptions + { + public string ConnectionString { get; set; } + } } diff --git a/VOL.Core/DBManager/Partial/DBServerProvider.cs b/VOL.Core/DBManager/Partial/DBServerProvider.cs index ea92fb9..146b70e 100644 --- a/VOL.Core/DBManager/Partial/DBServerProvider.cs +++ b/VOL.Core/DBManager/Partial/DBServerProvider.cs @@ -1,4 +1,8 @@ -namespace VOL.Core.DBManager.Partial +using VOL.Core.Configuration; +using VOL.Core.Dapper; +using VOL.Core.Enums; + +namespace VOL.Core.DBManager { /// /// 2022.11.21增加其他数据库(sqlserver、mysql、pgsql、oracle)连接配置说明 @@ -6,21 +10,16 @@ namespace VOL.Core.DBManager.Partial /// public partial class DBServerProvider { - ///// - ///// 单独配置mysql数据库 - ///// - //public static ISqlDapper SqlDapperMySql - //{ - // get - // { - // //读取appsettings.json中的配置 - // string 数据库连接字符串 = AppSetting.GetSettingString("key"); - // return new SqlDapper(数据库连接字符串, DbCurrentType.MySql); - - // //访问数据库方式 - // //DBServerProvider.SqlDapperMySql.xx - // } - //} + /// + /// 上外贸独立 MySQL 数据库对象 + /// + public static ISqlDapper SqlDapperSwmMySql + { + get + { + return new SqlDapper(AppSetting.SwmMySql.ConnectionString, DbCurrentType.MySql); + } + } ///// ///// 如果有多个不同的mysql数据库,这里再加一个配置 diff --git a/VOL.Core/EFDbContext/SwmMySqlContext.cs b/VOL.Core/EFDbContext/SwmMySqlContext.cs new file mode 100644 index 0000000..25e0295 --- /dev/null +++ b/VOL.Core/EFDbContext/SwmMySqlContext.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.EntityFrameworkCore; +using VOL.Core.Configuration; +using VOL.Entity.DomainModels; + +namespace VOL.Core.EFDbContext +{ + /// + /// 上外贸独立 MySQL 上下文 + /// + public class SwmMySqlContext : DbContext + { + public SwmMySqlContext(DbContextOptions options) + : base(options) + { + } + + public DbSet TempTccj { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (!optionsBuilder.IsConfigured) + { + optionsBuilder.UseMySql( + AppSetting.SwmMySql.ConnectionString, + new MySqlServerVersion(new Version(8, 0, 20))); + } + + base.OnConfiguring(optionsBuilder); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasNoKey(); + entity.ToTable("temp_tccj"); + }); + + base.OnModelCreating(modelBuilder); + } + } +} diff --git a/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs b/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs index e1b238f..25347b2 100644 --- a/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs +++ b/VOL.Core/Extensions/AutofacManager/AutofacContainerModuleExtension.cs @@ -83,6 +83,13 @@ namespace VOL.Core.Extensions { services.AddDbContextPool(optionsBuilder => { optionsBuilder.UseSqlServer(connectionString); }, 64); } + + services.AddDbContextPool(optionsBuilder => + { + optionsBuilder.UseMySql( + AppSetting.SwmMySql.ConnectionString, + new MySqlServerVersion(new Version(8, 0, 20))); + }, 16); //启用缓存 if (AppSetting.UseRedis) { diff --git a/VOL.Entity/DomainModels/ShangWaiMao/TempTccj.cs b/VOL.Entity/DomainModels/ShangWaiMao/TempTccj.cs index b2ea799..ca3fdcb 100644 --- a/VOL.Entity/DomainModels/ShangWaiMao/TempTccj.cs +++ b/VOL.Entity/DomainModels/ShangWaiMao/TempTccj.cs @@ -1,5 +1,4 @@ using System.ComponentModel.DataAnnotations.Schema; -using VOL.Entity.SystemModels; namespace VOL.Entity.DomainModels { @@ -7,7 +6,7 @@ namespace VOL.Entity.DomainModels /// 上外贸体测成绩临时表 /// [Table("temp_tccj")] - public class TempTccj : BaseEntity + public class TempTccj { public string school_year { get; set; } public string school_term { get; set; } diff --git a/VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjDetailParam.cs b/VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjDetailParam.cs new file mode 100644 index 0000000..a87e1fd --- /dev/null +++ b/VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjDetailParam.cs @@ -0,0 +1,23 @@ +namespace VOL.Model.ShangWaiMao.Request +{ + /// + /// 上外贸体测成绩详情参数 + /// + public class ShangWaiMaoTempTccjDetailParam + { + /// + /// 学号 + /// + public string StudentNo { get; set; } + + /// + /// 学年 + /// + public string SchoolYear { get; set; } + + /// + /// 学期 + /// + public string SchoolTerm { get; set; } + } +} diff --git a/VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjPageParam.cs b/VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjPageParam.cs new file mode 100644 index 0000000..394fcb3 --- /dev/null +++ b/VOL.Model/ShangWaiMao/Request/ShangWaiMaoTempTccjPageParam.cs @@ -0,0 +1,50 @@ +using VOL.Model; + +namespace VOL.Model.ShangWaiMao.Request +{ + /// + /// 上外贸体测成绩列表查询参数 + /// + public class ShangWaiMaoTempTccjPageParam : PageDto + { + /// + /// 学号 + /// + public string StudentNo { get; set; } + + /// + /// 姓名 + /// + public string Name { get; set; } + + /// + /// 性别 + /// + public string Sex { get; set; } + + /// + /// 院系 + /// + public string CollegeName { get; set; } + + /// + /// 年级 + /// + public string GradeNo { get; set; } + + /// + /// 行政班 + /// + public string AdministrativeClass { get; set; } + + /// + /// 体育班 + /// + public string SportsClass { get; set; } + + /// + /// 等级 + /// + public string Conclusion { get; set; } + } +} diff --git a/VOL.Model/ShangWaiMao/Response/ShangWaiMaoTempTccjModels.cs b/VOL.Model/ShangWaiMao/Response/ShangWaiMaoTempTccjModels.cs new file mode 100644 index 0000000..b9e6ba8 --- /dev/null +++ b/VOL.Model/ShangWaiMao/Response/ShangWaiMaoTempTccjModels.cs @@ -0,0 +1,136 @@ +using System.Collections.Generic; + +namespace VOL.Model.ShangWaiMao.Response +{ + /// + /// 上外贸体测成绩搜索项 + /// + public class ShangWaiMaoTempTccjFilterOptions + { + public List SexList { get; set; } = new(); + + public List CollegeList { get; set; } = new(); + + public List GradeList { get; set; } = new(); + + public List AdministrativeClassList { get; set; } = new(); + + public List SportsClassList { get; set; } = new(); + + public List ConclusionList { get; set; } = new(); + } + + /// + /// 上外贸下拉项 + /// + public class ShangWaiMaoOptionItem + { + public string Label { get; set; } + + public string Value { get; set; } + } + + /// + /// 上外贸体测成绩列表项 + /// + public class ShangWaiMaoTempTccjListItem + { + public string StudentNo { get; set; } + + public string Name { get; set; } + + public string Sex { get; set; } + + public string GradeNo { get; set; } + + public string AdministrativeClass { get; set; } + + public string SportsClass { get; set; } + + public string TestState { get; set; } + + public string Exempt { get; set; } + + public decimal? AddScore { get; set; } + + public decimal? HealthScore { get; set; } + + public decimal? Score { get; set; } + + public string Conclusion { get; set; } + + public string Remark { get; set; } + + public string CollegeName { get; set; } + } + + /// + /// 上外贸体测成绩详情 + /// + public class ShangWaiMaoTempTccjDetailDto + { + public ShangWaiMaoTempTccjBasicInfo BasicInfo { get; set; } = new(); + + public List DetailItems { get; set; } = new(); + + public List PortraitItems { get; set; } = new(); + } + + /// + /// 上外贸体测成绩顶部基础信息 + /// + public class ShangWaiMaoTempTccjBasicInfo + { + public string CollegeName { get; set; } + + public string GradeName { get; set; } + + public string AdministrativeClass { get; set; } + + public string StudentNo { get; set; } + + public string Name { get; set; } + + public string Sex { get; set; } + + public string HealthScore { get; set; } + + public string AddScore { get; set; } + + public string TotalScore { get; set; } + + public string Conclusion { get; set; } + + public string Remark { get; set; } + } + + /// + /// 上外贸体测成绩明细项 + /// + public class ShangWaiMaoTempTccjDetailItem + { + public string ItemName { get; set; } + + public string Achievement { get; set; } + + public string Unit { get; set; } + + public string AddScore { get; set; } + + public string Score { get; set; } + + public string Level { get; set; } + } + + /// + /// 上外贸运动画像项 + /// + public class ShangWaiMaoTempTccjPortraitItem + { + public string ItemName { get; set; } + + public decimal? PersonalScore { get; set; } + + public decimal? SchoolAverageScore { get; set; } + } +} diff --git a/VOL.Model/Training/Response/GetClassReportDetailsModel.cs b/VOL.Model/Training/Response/GetClassReportDetailsModel.cs index 82f21d2..220b994 100644 --- a/VOL.Model/Training/Response/GetClassReportDetailsModel.cs +++ b/VOL.Model/Training/Response/GetClassReportDetailsModel.cs @@ -113,21 +113,21 @@ namespace VOL.Model /// /// 平均心率 /// - public double AvgHR { get; set; } = 0; + public int AvgHR { get; set; } = 0; /// /// 运动强度 /// - public double Strength { get; set; } = 0; + public int Strength { get; set; } = 0; /// /// 运动密度 /// - public double Density { get; set; } = 0; + public int Density { get; set; } = 0; /// /// 平均消耗 /// - public double Consumption { get; set; } = 0; + public int Consumption { get; set; } = 0; } } diff --git a/VOL.WebApi/Controllers/Business/ShangWaiMaoController.cs b/VOL.WebApi/Controllers/Business/ShangWaiMaoController.cs index 792fe15..493ccb9 100644 --- a/VOL.WebApi/Controllers/Business/ShangWaiMaoController.cs +++ b/VOL.WebApi/Controllers/Business/ShangWaiMaoController.cs @@ -4,6 +4,8 @@ using System.Threading.Tasks; using VOL.Business.IServices.ShangWaiMao; using VOL.Core.Filters; using VOL.Model; +using VOL.Model.ShangWaiMao.Request; +using VOL.Model.ShangWaiMao.Response; namespace VOL.WebApi.Controllers.Business { @@ -23,6 +25,38 @@ namespace VOL.WebApi.Controllers.Business _shangWaiMaoService = shangWaiMaoService; } + /// + /// 获取体测成绩列表页搜索条件 + /// + /// + [HttpGet(nameof(GetTempTccjFilterOptions))] + public async Task GetTempTccjFilterOptions() + { + return await _shangWaiMaoService.GetTempTccjFilterOptionsAsync(); + } + + /// + /// 获取体测成绩分页列表 + /// + /// + /// + [HttpGet(nameof(GetTempTccjPageList))] + public async Task> GetTempTccjPageList([FromQuery] ShangWaiMaoTempTccjPageParam paramDto) + { + return await _shangWaiMaoService.GetTempTccjPageListAsync(paramDto); + } + + /// + /// 获取体测成绩详情 + /// + /// + /// + [HttpGet(nameof(GetTempTccjDetail))] + public async Task GetTempTccjDetail([FromQuery] ShangWaiMaoTempTccjDetailParam paramDto) + { + return await _shangWaiMaoService.GetTempTccjDetailAsync(paramDto); + } + /// /// 导出学生课程心率与运动数据 /// diff --git a/VOL.WebApi/appsettings.json b/VOL.WebApi/appsettings.json index 4680317..8d71486 100644 --- a/VOL.WebApi/appsettings.json +++ b/VOL.WebApi/appsettings.json @@ -19,8 +19,8 @@ //"DbConnectionString": "Data Source=DESKTOP-JJQM2OL\\SQLEXPRESS;Initial Catalog=netcoredev;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=500;", //mysql连接字符串(升级EFCore3.1到时已将mysql连接字符串修改,2019-12-20) - //"DbConnectionString": "Data Source=rm-uf64b8oxdt19pfyxfao.sqlserver.rds.aliyuncs.com;Database=SmartSportsServerDB_QA;User ID=yd;Password=Admin@123456;Connect Timeout=500;", - "DbConnectionString": " Data Source=rm-uf64b8oxdt19pfyxfao.sqlserver.rds.aliyuncs.com;Database=SmartSportsServerDB;User ID=yd;Password=Admin@123456;Connect Timeout=500;", + "DbConnectionString": "Data Source=rm-uf64b8oxdt19pfyxfao.sqlserver.rds.aliyuncs.com;Database=SmartSportsServerDB_QA;User ID=yd;Password=Admin@123456;Connect Timeout=500;", + // "DbConnectionString": " Data Source=rm-uf64b8oxdt19pfyxfao.sqlserver.rds.aliyuncs.com;Database=SmartSportsServerDB;User ID=yd;Password=Admin@123456;Connect Timeout=500;", //"DbConnectionString": "Server=192.168.10.230;Port=3306;Database=dachentradedb;Uid=root;Pwd=123456;AllowLoadLocalInfile=true;Command Timeout=120;", //"DbConnectionString": "Server=47.101.60.251;Port=3306;Database=smartsports;Uid=root;Pwd=Admin@123;AllowLoadLocalInfile=true;Command Timeout=120;",