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;",