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.
 
 
 
Tiobon.Web/Tiobon.Core.Services/Ghre/Ghre_RequestServices.cs

393 lines
18 KiB

using Mapster;
using Microsoft.IdentityModel.Tokens;
using Serilog;
using static Tiobon.Core.Model.Consts;
namespace Tiobon.Core.Services;
/// <summary>
/// 培训需求 (服务)
/// </summary>
public class Ghre_RequestServices : BaseServices<Ghre_Request, Ghre_RequestDto, InsertGhre_RequestInput, EditGhre_RequestInput>, IGhre_RequestServices
{
private readonly IBaseRepository<Ghre_Request> _dal;
public Ghre_RequestServices(ICaching caching, IBaseRepository<Ghre_Request> dal)
{
this._dal = dal;
base.BaseDal = dal;
base._caching = caching;
}
public override async Task<ServicePageResult<Ghre_RequestDto>> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true)
{
var sql = @"UPDATE A
SET A.CourseName = B.CourseName
FROM Ghre_Request A
JOIN Ghre_Course B
ON A.CourseId = B.Id AND (A.CourseName ! = B.CourseName OR A.CourseName IS NULL)";
await Db.Ado.ExecuteCommandAsync(sql);
var result = await base.QueryFilterPage(filter, condition, IsEnable);
//var courseIds = result.result.DT_TableDataT1.Where(x => x.CourseId != null).Select(x => x.CourseId).Distinct().ToList();
//var courses = await Db.Queryable<Ghre_Course>().Where(x => courseIds.Contains(x.Id)).ToListAsync();
var deptIds = result.result.DT_TableDataT1.Where(x => x.DeptId != null).Select(x => x.DeptId).Distinct().ToList();
var depts = await Db.Queryable<Ghro_Dept>().Where(x => deptIds.Contains(x.DeptID)).ToListAsync();
var sponsorIds = result.result.DT_TableDataT1.Where(x => x.SponsorId != null).Select(x => x.SponsorId).Distinct().ToList();
var userIds = result.result.DT_TableDataT1.Where(x => x.RefuseUserId != null).Select(x => x.RefuseUserId).Distinct().ToList();
userIds.AddRange(result.result.DT_TableDataT1.Where(x => x.AgreeUserId != null).Select(x => x.AgreeUserId).Distinct());
result.result.DT_TableDataT1.ForEach(x =>
{
string trainStaffId = x.TrainStaffId;
if (!string.IsNullOrWhiteSpace(trainStaffId))
{
x.TrainStaffIds = JsonHelper.JsonToObj<List<int>>(trainStaffId);
var TrainStaffIds = JsonHelper.JsonToObj<List<long?>>(trainStaffId);
sponsorIds.AddRange(TrainStaffIds);
}
});
sponsorIds = sponsorIds.Distinct().ToList();
var staffs = await Db.Queryable<Ghra_Staff>().Where(x => sponsorIds.Contains(x.StaffID)).ToListAsync();
var users = await Db.Queryable<Ghrs_User>().Where(x => userIds.Contains(x.UserId)).ToListAsync();
result.result.DT_TableDataT1.ForEach(async x =>
{
x.CourseSourceLabel = await GetParaLabel("TrainingRequestCourseSource", x.CourseSource);
x.RequestSourceLabel = await GetParaLabel("TrainingRequestRequestSource", x.RequestSource);
x.TrainClassLabel = await GetParaLabel("TrainingRequestTrainClass", x.TrainClass);
x.TrainLevelLabel = await GetParaLabel("TrainingRequestTrainLevel", x.TrainLevel);
x.InOrOutLabel = await GetParaLabel("CourseInOrOut", x.InOrOut);
x.TeacherClassLabel = await GetParaLabel("TrainingTeacherType", x.InOrOut);
//if (x.CourseId != null)
// x.CourseName = courses.Where(o => x.CourseId == o.Id).FirstOrDefault()?.CourseName;
if (x.DeptId != null)
x.DeptName = depts.Where(o => x.DeptId == o.DeptID).FirstOrDefault()?.DeptName;
if (x.SponsorId != null)
x.SponsorName = staffs.Where(o => x.SponsorId == o.StaffID).FirstOrDefault()?.StaffName;
if (x.TrainStaffIds.IsNotEmptyOrNull())
x.TrainStaffNames = string.Join("、", staffs.Where(o => x.TrainStaffIds.Contains(o.StaffID)).Select(o => o.StaffName));
if (x.AgreeUserId != null)
x.AgreeUserName = users.Where(o => x.AgreeUserId == o.UserId).FirstOrDefault()?.UserName;
if (x.RefuseUserId != null)
x.RefuseUserName = users.Where(o => x.RefuseUserId == o.UserId).FirstOrDefault()?.UserName;
if (x.WorkState.IsNotEmptyOrNull())
{
if (x.WorkState == 0) x.WorkStateLabel = "审批中";
if (x.WorkState == 1) x.WorkStateLabel = "审批通过";
}
if (x.RequestNum.IsNotEmptyOrNull() && x.RequestNum > 0)
if (x.TrainDays.IsNotEmptyOrNull() && x.TrainDays > 0)
{
var TotalTrainDays = x.TrainDays * x.RequestNum;
x.TotalTrainDays = StringHelper.TrimDecimalString(TotalTrainDays);
}
});
return result;
}
public override async Task<long> Add(InsertGhre_RequestInput entity)
{
entity.SponsorId = GetStaffId();
if (entity.TrainStaffIds.IsNotEmptyOrNull())
entity.TrainStaffId = JsonHelper.ObjToJson(entity.TrainStaffIds);
entity.RequestNo = await GenerateContinuousSequence("Ghre_Request", "RequestNo", "R");
var id = await base.Add(entity);
var sql = $"SELECT ISNULL(MAX(id)+1,1) FROM Ghre_Request WHERE Id !='{id}'";
var id1 = await Db.Ado.GetLongAsync(sql);
sql = $"UPDATE Ghre_Request SET Id={id1} WHERE Id ='{id}'";
await Db.Ado.ExecuteCommandAsync(sql);
return id1;
}
public override async Task<bool> Update(long Id, EditGhre_RequestInput entity)
{
if (entity.TrainStaffIds.IsNotEmptyOrNull())
entity.TrainStaffId = JsonHelper.ObjToJson(entity.TrainStaffIds);
else entity.TrainStaffId = null;
return await base.Update(Id, entity, null, ["Status"]);
}
public async Task<ServiceResult<long>> InsertByStatus(InsertGhre_RequestInput insertModel, string status)
{
var data = ServiceResult<long>.OprateSuccess("新增成功", 0);
insertModel.Status = status;
var id = await Add(insertModel);
data.Success = id > 0;
if (data.Success)
data.Data = id;
else
return ServiceResult<long>.OprateFailed("发布成功!");
return data;
}
public override async Task<ServiceFormResult<Ghre_RequestDto>> QueryForm(QueryForm body)
{
var result = await base.QueryForm(body);
string trainStaffId = result.result.DT_TableDataT1[0].TrainStaffId;
if (!string.IsNullOrWhiteSpace(trainStaffId))
result.result.DT_TableDataT1[0].TrainStaffIds = JsonHelper.JsonToObj<List<int>>(trainStaffId);
else result.result.DT_TableDataT1[0].TrainStaffIds = new List<int>();
return result;
}
public async Task<ServiceResult> UpdateStatus(InsertGhre_RequestInput input, string status)
{
HttpRequest request = UserContext.Context.Request;
var api = request.Path.ObjToString().TrimEnd('/').ToLower();
var ip = GetUserIp(UserContext.Context);
var entities = new List<Ghre_Request>();
foreach (var id in input.Ids)
{
if (!BaseDal.Any(id))
continue;
var entity = await BaseDal.QueryById(id);
switch (status)
{
case DIC_REQUEST_STATUS.Active:
entity.AgreeReason = input.Reason;
entity.AgreeTime = DateTime.Now;
entity.AgreeUserId = App.User.ID;
break;
case DIC_REQUEST_STATUS.Temporary:
entity.RefuseReason = input.Reason;
entity.RefuseTime = DateTime.Now;
entity.RefuseUserId = App.User.ID;
break;
}
entity.UpdateIP = ip;
entity.UpdateProg = api;
entity.Status = status;
entities.Add(entity);
}
var result = await BaseDal.Update(entities);
return ServiceResult.OprateSuccess("执行成功!");
//if (status == Consts.DIC_COURSE_STATUS.RELEASED)
// return ServiceResult.OprateSuccess("发布成功!");
//else if (status == Consts.DIC_COURSE_STATUS.DRAFT)
// return ServiceResult.OprateSuccess("已启用成功,请进入草稿箱查看!");
//else
// return ServiceResult.OprateSuccess("停用成功!");
}
public async Task<ServicePageResult<Ghre_RequestDto>> QueryGroup(QueryBody filter, string type)
{
if (string.IsNullOrWhiteSpace(filter.orderBy))
filter.orderBy = "DeptName ASC";
if (filter.pageSize == 0)
filter.pageSize = 10000;
string conditions = "WHERE 1=1 ";
foreach (JProperty jProperty in filter.jsonParam.Properties())
{
var name = jProperty.Name;
var value = jProperty.Value.ToString();
if (name == "page" || name == "pageSize")
continue;
if (name == "YearMonth")
{
if (value != null)
{
var jsonParam = JsonHelper.JsonToObj<JsonParam>(value);
var ids1 = JsonHelper.JsonToObj<List<string>>(jsonParam.columnValue.ToString());
conditions += $" AND {name}>= '{ids1[0]}-01'";
conditions += $" AND {name}<= '{ids1[1]}-01'";
}
continue;
}
if (name == "Year")
{
if (value != null)
{
var jsonParam = JsonHelper.JsonToObj<JsonParam>(value);
var ids1 = JsonHelper.JsonToObj<List<string>>(jsonParam.columnValue.ToString());
conditions += $" AND {name}>= '{ids1[0]}'";
conditions += $" AND {name}<= '{ids1[1]}'";
}
continue;
}
if (!string.IsNullOrWhiteSpace(value))
conditions = DealConditions(conditions, name, value);
}
string sql = @$"SELECT *
FROM (SELECT sum (RequestNum) RequestNum,
sum (TotalBudget) TotalBudget,
CourseName,
YearMonth1 YearMonthLabel,
DeptName,
TrainClass,
TrainLevel,
InOrOut
FROM (SELECT A.Id,
A.CourseName,
SUBSTRING (A.YearMonth, 1, 4) + '年' YearMonth1,
-- CAST (A.YearMonth + '-01' AS DATE) YearMonthDate,
CONVERT (INT, SUBSTRING (A.YearMonth, 1, 4)) Year,
ISNULL (B.DeptName, D.DeptName) DeptName,
ISNULL (B.DeptId, D.DeptId) DeptId,
ISNULL (A.RequestNum, 1) RequestNum,
A.TrainClass,
A.CourseSource,
A.RequestSource,
TrainLevel,
A.InOrOut,
ISNULL (A.TotalBudget, 0) TotalBudget
FROM Ghre_Request A
LEFT JOIN Ghro_Dept B ON A.DeptId = B.DeptID
LEFT JOIN Ghra_Staff C ON A.ApplicantId = C.StaffID
LEFT JOIN Ghro_Dept D ON C.DeptID = D.DeptID
WHERE A.IsEnable = 1) A {conditions}
GROUP BY CourseName,
YearMonth1,
DeptName,
TrainClass,
TrainLevel,
InOrOut) A
ORDER BY {filter.orderBy}";
if (type == "Month")
sql = @$"SELECT *
FROM (SELECT sum (RequestNum) RequestNum,
sum (TotalBudget) TotalBudget,
CourseName,
YearMonth1 YearMonthLabel,
DeptName,
TrainClass,
TrainLevel,
InOrOut
FROM (SELECT A.Id,
A.CourseName,
SUBSTRING (A.YearMonth, 1, 4)
+ '年'
+ SUBSTRING (A.YearMonth, 6, 2)
+ '月' YearMonth1,
CAST (A.YearMonth + '-01' AS DATE) YearMonth,
ISNULL (B.DeptName, D.DeptName) DeptName,
ISNULL (B.DeptId, D.DeptId) DeptId,
ISNULL (A.RequestNum, 1) RequestNum,
A.TrainClass, A.CourseSource,
TrainLevel,
A.RequestSource,
A.InOrOut,
ISNULL (A.TotalBudget, 0) TotalBudget
FROM Ghre_Request A
LEFT JOIN Ghro_Dept B ON A.DeptId = B.DeptID
LEFT JOIN Ghra_Staff C ON A.ApplicantId = C.StaffID
LEFT JOIN Ghro_Dept D ON C.DeptID = D.DeptID
WHERE A.IsEnable = 1) A {conditions}
GROUP BY CourseName,
YearMonth1,
DeptName,
TrainClass,
TrainLevel,
InOrOut) A
ORDER BY {filter.orderBy}";
var result = await Db.Ado.SqlQueryAsync<Ghre_RequestDto>(sql);
result.ForEach(async x =>
{
x.TrainClassLabel = await GetParaLabel("TrainingRequestTrainClass", x.TrainClass);
x.TrainLevelLabel = await GetParaLabel("TrainingRequestTrainLevel", x.TrainLevel);
x.InOrOutLabel = await GetParaLabel("CourseInOrOut", x.InOrOut);
x.TeacherClassLabel = await GetParaLabel("TrainingTeacherType", x.InOrOut);
});
//return ServiceResult<List<>>.OprateSuccess("查询成功", result);
return new ServicePageResult<Ghre_RequestDto>(filter.pageNum, result.Count, filter.pageSize, result);
}
#region 牛尾培训需求同步
public async Task Ushio_Sync()
{
Log.Information($"【牛尾培训需求同步】开始同步");
try
{
string sql = @"SELECT *, TrainStaffId TrainStaffId1
FROM [120.26.205.42].[GhrUshio].[dbo].Ghrz_Ushio_TrainRequestApply_GHR50_V
WHERE RequestNo NOT IN (SELECT RequestNo FROM Ghre_Request)";
var dt = await Db.Ado.GetDataTableAsync(sql);
var list = Db.Utilities.DataTableToList<Ghre_RequestDto>(dt);
Log.Information($"【牛尾培训需求同步】查询到待同步{list.Count}条数据");
for (int i = 0; i < list.Count; i++)
{
Log.Information($"【牛尾培训需求同步】同步队列{i + 1}/{list.Count}");
var insert = Mapper.Map(list[i]).ToANew<InsertGhre_RequestInput>();
if (await base.AnyAsync(x => x.RequestNo == insert.RequestNo))
continue;
if (list[i].DeptNo.IsNotEmptyOrNull())
insert.DeptId = (await Db.Queryable<Ghro_Dept>().Where(x => x.DeptNo == list[i].DeptNo).FirstAsync())?.DeptID;
if (list[i].SponsorNo.IsNotEmptyOrNull())
insert.SponsorId = (await Db.Queryable<Ghra_Staff>().Where(x => x.StaffNo == list[i].SponsorNo).FirstAsync())?.StaffID;
if (list[i].TrainStaffId1.IsNotEmptyOrNull())
{
var staffNos = list[i].TrainStaffId1.Split(',').ToList();
if (staffNos.Any())
{
var staffIds = await Db.Queryable<Ghra_Staff>().Where(x => staffNos.Contains(x.StaffNo)).Select(x => x.StaffID).ToListAsync();
insert.TrainStaffId = JsonHelper.ObjToJson(staffIds);
}
}
insert.WorkNo = insert.RequestNo;
if (insert.CourseId == 0) insert.CourseId = null;
#region 根据参数 处理数据默认状态
var config = await Db.Queryable<Ghre_Config>().FirstAsync(x => x.ConfigCode == "ESS_Request_Apply_Status");
if (config != null)
insert.Status = config.ConfigValue;
#endregion
await base.Add(insert);
}
}
catch (Exception E)
{
Log.Information($"【牛尾培训需求同步】发生错误:{E.Message}");
Log.Information($"【牛尾培训需求同步】发生错误行:{E.StackTrace}");
}
Log.Information($"【牛尾培训需求同步】结束同步");
}
#endregion
}