合并今日消费记录冲突
This commit is contained in:
@@ -40,8 +40,8 @@ public class OrdersController : ControllerBase
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task AddAsync(OrderAddRequest request)
|
public async Task<OrderConsumeResponse> AddAsync(OrderAddRequest request)
|
||||||
{
|
{
|
||||||
await _orderService.AddAsync(request);
|
return await _orderService.AddAsync(request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class BalanceRecordResponse
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 档案号/QRCode
|
/// 档案号/QRCode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string UserId { get; set; }
|
public string UserNo { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 姓名
|
/// 姓名
|
||||||
|
|||||||
29
Src/Dlhis.Canteen/Order/Response/OrderConsumeResponse.cs
Normal file
29
Src/Dlhis.Canteen/Order/Response/OrderConsumeResponse.cs
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
namespace Dlhis.Canteen.Order.Response;
|
||||||
|
|
||||||
|
public class OrderConsumeResponse
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用户工号
|
||||||
|
/// </summary>
|
||||||
|
public string UserCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户名称
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门号
|
||||||
|
/// </summary>
|
||||||
|
public string DepartmentNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门名称
|
||||||
|
/// </summary>
|
||||||
|
public string DepartmentName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 余额
|
||||||
|
/// </summary>
|
||||||
|
public decimal Balance { get; set; }
|
||||||
|
}
|
||||||
@@ -8,5 +8,5 @@ public interface IOrderService : IScopeDependency
|
|||||||
{
|
{
|
||||||
Task<Pagination<OrderResponse>> GetPageAsync(OrderPageRequest request);
|
Task<Pagination<OrderResponse>> GetPageAsync(OrderPageRequest request);
|
||||||
|
|
||||||
Task AddAsync(OrderAddRequest request);
|
Task<OrderConsumeResponse> AddAsync(OrderAddRequest request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Dlhis.Canteen.Order.Request;
|
using Dlhis.Canteen.Order.Request;
|
||||||
using Dlhis.Canteen.Order.Response;
|
using Dlhis.Canteen.Order.Response;
|
||||||
|
using Dlhis.Entity.Basic.Entity;
|
||||||
using Dlhis.Entity.Canteen.Entities;
|
using Dlhis.Entity.Canteen.Entities;
|
||||||
using Kurisu.Core.DataAccess.Dto;
|
using Kurisu.Core.DataAccess.Dto;
|
||||||
using Kurisu.SqlSugar.Extensions;
|
using Kurisu.SqlSugar.Extensions;
|
||||||
@@ -19,10 +20,37 @@ public class BalanceService : IBalanceService
|
|||||||
public async Task<Pagination<BalanceRecordResponse>> GetPageAsync(BalanceRecordPageRequest request)
|
public async Task<Pagination<BalanceRecordResponse>> GetPageAsync(BalanceRecordPageRequest request)
|
||||||
{
|
{
|
||||||
var page = await _dbContext.Queryable<BalanceRecordEntity>()
|
var page = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||||
|
.LeftJoin<GainfoEntity>((record, ga) => record.UserNo == ga.No)
|
||||||
|
.LeftJoin<DepartmentEntity>((record, ga, department) => ga.DepartmentNo == department.No)
|
||||||
|
.LeftJoin<CanteenBusinessPlaceEntity>((record, ga, department, bplace) => record.BusinessPlaceCode == bplace.Code)
|
||||||
|
.LeftJoin<CanteenBusinessShiftEntity>((record, ga, department, bplace, bshift) => record.BusinessShiftCode == bshift.Code)
|
||||||
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CreateTime >= request.SearchDateTimePeriod.Start)
|
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CreateTime >= request.SearchDateTimePeriod.Start)
|
||||||
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CreateTime <= request.SearchDateTimePeriod.End)
|
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CreateTime <= request.SearchDateTimePeriod.End)
|
||||||
.OrderBy(record => record.CreateTime)
|
.OrderBy(record => record.CreateTime)
|
||||||
.Select<BalanceRecordResponse>()
|
.Select((record, ga, department, bplace, bshift) => new BalanceRecordResponse
|
||||||
|
{
|
||||||
|
Amount = record.Amount,
|
||||||
|
BusinessPlaceCode = record.BusinessPlaceCode,
|
||||||
|
BusinessShiftCode = record.BusinessShiftCode,
|
||||||
|
CostDate = record.CostDate,
|
||||||
|
CostId = record.CostId,
|
||||||
|
DepartmentNo = record.DepartmentNo,
|
||||||
|
DeviceInfo = record.DeviceInfo,
|
||||||
|
IP = record.IP,
|
||||||
|
UserNo = record.UserNo,
|
||||||
|
UserCode = record.UserCode,
|
||||||
|
Type = record.Type,
|
||||||
|
SubsidiesFromMonth = record.SubsidiesFromMonth,
|
||||||
|
Status = record.Status,
|
||||||
|
Source = record.Source,
|
||||||
|
No = record.No,
|
||||||
|
IsCostCrossTenant = record.IsCostCrossTenant,
|
||||||
|
OriginTenantId = record.OriginTenantId,
|
||||||
|
Name = record.Name,
|
||||||
|
DepartmentName = department.Name,
|
||||||
|
BusinessPlaceName = bplace.Name,
|
||||||
|
BusinessShiftName = bshift.Name,
|
||||||
|
})
|
||||||
.ToPageListAsync(request);
|
.ToPageListAsync(request);
|
||||||
|
|
||||||
return page;
|
return page;
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class OrderService : IOrderService
|
|||||||
}
|
}
|
||||||
|
|
||||||
[IgnoreTenant]
|
[IgnoreTenant]
|
||||||
public async Task AddAsync(OrderAddRequest request)
|
public async Task<OrderConsumeResponse> AddAsync(OrderAddRequest request)
|
||||||
{
|
{
|
||||||
var device = await _dbContext.Queryable<DeviceEntity>().Where(x => x.UniqueNo == request.DeviceUniqueNo).Where(x => x.Enable).FirstAsync();
|
var device = await _dbContext.Queryable<DeviceEntity>().Where(x => x.UniqueNo == request.DeviceUniqueNo).Where(x => x.Enable).FirstAsync();
|
||||||
device.ThrowIfNull("设备不存在或者尚未启用");
|
device.ThrowIfNull("设备不存在或者尚未启用");
|
||||||
@@ -107,10 +107,9 @@ public class OrderService : IOrderService
|
|||||||
RequestJson = request.ToJson(),
|
RequestJson = request.ToJson(),
|
||||||
ThirdNo = request.ThirdNo,
|
ThirdNo = request.ThirdNo,
|
||||||
Type = request.Type.Value,
|
Type = request.Type.Value,
|
||||||
OrderStatus = CanteenOrderStatusEnumType.Wait,
|
|
||||||
Name = gafinfo.Name,
|
Name = gafinfo.Name,
|
||||||
Source = request.Source,
|
Source = request.Source,
|
||||||
UserId = canteenUser.UserNo,
|
UserNo = canteenUser.UserNo,
|
||||||
UserCode = canteenUser.UserCode,
|
UserCode = canteenUser.UserCode,
|
||||||
Amount = request.Amount,
|
Amount = request.Amount,
|
||||||
BusinessPlaceCode = businessPlace.Code,
|
BusinessPlaceCode = businessPlace.Code,
|
||||||
@@ -127,38 +126,61 @@ public class OrderService : IOrderService
|
|||||||
|
|
||||||
OriginTenantId = canteenUser.TenantId,//人员可能跨基地消费
|
OriginTenantId = canteenUser.TenantId,//人员可能跨基地消费
|
||||||
|
|
||||||
Status = BalanceRecordStatusEnumType.Doubtful,
|
//餐别异常处理
|
||||||
TenantId = device.TenantId, //设备才能标识当前消费的基地
|
Status = shift == null ? BalanceRecordStatusEnumType.Doubtful : BalanceRecordStatusEnumType.Valid,
|
||||||
|
OrderStatus = CanteenOrderStatusEnumType.Wait,
|
||||||
|
//设备才能标识当前消费的基地
|
||||||
|
TenantId = device.TenantId,
|
||||||
|
|
||||||
|
//默认为admin
|
||||||
|
CreatedBy = 1,
|
||||||
|
CreateTime = DateTime.Now,
|
||||||
|
ModifiedBy = 1,
|
||||||
|
ModifiedTime = DateTime.Now,
|
||||||
};
|
};
|
||||||
|
|
||||||
var id = await _dbContext.InsertReturnIdentityAsync(order);
|
var id = await _dbContext.InsertReturnIdentityAsync(order);
|
||||||
await GenerateChargeRecordAsync(id, settings, shifts, request.CostDateTime);
|
var result = await _dbContext.UseTransactionAsync(async () =>
|
||||||
}
|
|
||||||
|
|
||||||
private static T GetSetting<T>(Dictionary<CanteenSettingItemEnumType, string> settings, CanteenSettingItemEnumType item, T defaultValue = default)
|
|
||||||
{
|
{
|
||||||
if (settings.TryGetValue(item, out var v))
|
try
|
||||||
{
|
{
|
||||||
return v.Adapt<T>();
|
var r = await GenerateChargeRecordAsync(id, settings, shifts, request.CostDateTime);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
//订单消费成功
|
||||||
|
order.OrderStatus = CanteenOrderStatusEnumType.Successful;
|
||||||
|
await _dbContext.UpdateAsync(order);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!result.IsSuccess)
|
||||||
|
{
|
||||||
|
throw new UserFriendlyException(result.ErrorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
return defaultValue;
|
return result.Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task GenerateChargeRecordAsync(long orderId,
|
public async Task<OrderConsumeResponse> GenerateChargeRecordAsync(long orderId,
|
||||||
Dictionary<CanteenSettingItemEnumType, string> settings,
|
Dictionary<CanteenSettingItemEnumType, string> settings,
|
||||||
List<CanteenBusinessShiftEntity> shifts,
|
List<CanteenBusinessShiftEntity> shifts,
|
||||||
DateTime costDateTime)
|
DateTime costDateTime)
|
||||||
{
|
{
|
||||||
var order = await _dbContext.Queryable<CanteenOrderEntity>().Where(x => x.Id == orderId).FirstAsync();
|
var order = await _dbContext.Queryable<CanteenOrderEntity>().Where(x => x.Id == orderId).FirstAsync();
|
||||||
|
|
||||||
await Verify(settings, shifts, costDateTime, order);//校验
|
//校验
|
||||||
|
await Verify(settings, shifts, costDateTime, order);
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++)
|
|
||||||
|
return await ContinueUpdateAsync(async () =>
|
||||||
{
|
{
|
||||||
try
|
var canteenUser = await _dbContext.Queryable<CanteenUserEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
|
||||||
{
|
|
||||||
var canteenUser = await _dbContext.Queryable<CanteenUserEntity>().Where(x => x.UserNo == order.UserId).FirstAsync();
|
|
||||||
//金额+-
|
//金额+-
|
||||||
canteenUser.Balance += order.Amount;
|
canteenUser.Balance += order.Amount;
|
||||||
|
|
||||||
@@ -173,31 +195,91 @@ public class OrderService : IOrderService
|
|||||||
var effect = await _dbContext.Updateable<CanteenUserEntity>()
|
var effect = await _dbContext.Updateable<CanteenUserEntity>()
|
||||||
.SetColumns(x => x.Balance == canteenUser.Balance + order.Amount)
|
.SetColumns(x => x.Balance == canteenUser.Balance + order.Amount)
|
||||||
.SetColumns(x => x.Version == x.Version + 1)
|
.SetColumns(x => x.Version == x.Version + 1)
|
||||||
.Where(x => x.UserNo == order.UserId && x.Version == canteenUser.Version)//必须与查询时的version一致
|
.Where(x => x.UserNo == order.UserNo && x.Version == canteenUser.Version)//必须与查询时的version一致
|
||||||
.ExecuteCommandAsync();
|
.ExecuteCommandAsync();
|
||||||
|
|
||||||
if (effect <= 0)
|
if (effect <= 0) throw new VersionExceptions("更新版本冲突");
|
||||||
{
|
|
||||||
throw new VersionExceptions("更新版本冲突");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//写入消费记录
|
||||||
var balanceRecord = order.Adapt<BalanceRecordEntity>();
|
var balanceRecord = order.Adapt<BalanceRecordEntity>();
|
||||||
await _dbContext.InsertAsync(balanceRecord);
|
await _dbContext.InsertAsync(balanceRecord);
|
||||||
order.Status = BalanceRecordStatusEnumType.Valid; //订单改为有效
|
|
||||||
|
|
||||||
break;
|
return await _dbContext.Queryable<GainfoEntity>()
|
||||||
|
.LeftJoin<DepartmentEntity>((ga, department) => ga.DepartmentNo == department.No)
|
||||||
|
.LeftJoin<CanteenUserEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
|
||||||
|
.Select((ga, department, mealUser) => new OrderConsumeResponse
|
||||||
|
{
|
||||||
|
UserCode = ga.Code,
|
||||||
|
UserName = ga.Name,
|
||||||
|
DepartmentNo = ga.DepartmentNo,
|
||||||
|
DepartmentName = department.Name,
|
||||||
|
Balance = mealUser.Balance
|
||||||
|
})
|
||||||
|
.FirstAsync();
|
||||||
|
}, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
//******************************************************* help methods ************************************************************/
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设备并发更新
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="func"></param>
|
||||||
|
/// <param name="retry"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="UserFriendlyException"></exception>
|
||||||
|
private async Task<T> ContinueUpdateAsync<T>(Func<Task<T>> func, int retry)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < retry; i++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return await func();
|
||||||
}
|
}
|
||||||
catch (Exception ex) when (ex is VersionExceptions)
|
catch (Exception ex) when (ex is VersionExceptions)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, ex.Message);
|
_logger.LogWarning(ex, ex.Message);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw new UserFriendlyException("消费失败,请重试");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取参数配置
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="settings"></param>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
/// <param name="defaultValue"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static T GetSetting<T>(Dictionary<CanteenSettingItemEnumType, string> settings, CanteenSettingItemEnumType item, T defaultValue = default)
|
||||||
|
{
|
||||||
|
if (settings.TryGetValue(item, out var v))
|
||||||
|
{
|
||||||
|
return v.Adapt<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证参数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="settings"></param>
|
||||||
|
/// <param name="shifts"></param>
|
||||||
|
/// <param name="costDateTime"></param>
|
||||||
|
/// <param name="order"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="UserFriendlyException"></exception>
|
||||||
private async Task Verify(Dictionary<CanteenSettingItemEnumType, string> settings, List<CanteenBusinessShiftEntity> shifts, DateTime costDateTime, CanteenOrderEntity order)
|
private async Task Verify(Dictionary<CanteenSettingItemEnumType, string> settings, List<CanteenBusinessShiftEntity> shifts, DateTime costDateTime, CanteenOrderEntity order)
|
||||||
{
|
{
|
||||||
//在线
|
//在线
|
||||||
@@ -215,8 +297,8 @@ public class OrderService : IOrderService
|
|||||||
var endOfDay = beginOfDay.AddHours(23).AddMinutes(59).AddSeconds(59);
|
var endOfDay = beginOfDay.AddHours(23).AddMinutes(59).AddSeconds(59);
|
||||||
|
|
||||||
var balanceRecords = await _dbContext.Queryable<BalanceRecordEntity>()
|
var balanceRecords = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||||
.Where(x => x.UserId == order.UserId)
|
.Where(x => x.UserNo == order.UserNo)
|
||||||
.Where(x => x.CreateTime >= beginOfDay && x.CreateTime <= endOfDay) //今天消费记录
|
.Where(x => x.CreateTime <= beginOfDay && x.CreateTime <= endOfDay) //今天消费记录
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
var dayMarketCostMax = GetSetting<decimal>(settings, CanteenSettingItemEnumType.DayMarketCostMax);
|
var dayMarketCostMax = GetSetting<decimal>(settings, CanteenSettingItemEnumType.DayMarketCostMax);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class BalanceRecordEntity : SugarBaseEntity, ITenantId
|
|||||||
/// 档案号/QRCode
|
/// 档案号/QRCode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnDescription = "档案号/QRCode")]
|
[SugarColumn(ColumnDescription = "档案号/QRCode")]
|
||||||
public string UserId { get; set; }
|
public string UserNo { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 姓名
|
/// 姓名
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ public enum BalanceRecordStatusEnumType
|
|||||||
[Description("有效数据")]
|
[Description("有效数据")]
|
||||||
Valid = 1,
|
Valid = 1,
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 存疑
|
/// 存疑
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Dlhis.Entity.Device.Enums;
|
using Dlhis.Entity.Device.Enums;
|
||||||
|
using Kurisu.Core.DataAccess.Entity;
|
||||||
using Kurisu.SqlSugar;
|
using Kurisu.SqlSugar;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using SqlSugar.DbConvert;
|
using SqlSugar.DbConvert;
|
||||||
@@ -9,7 +10,7 @@ namespace Dlhis.Entity.Device.Entities;
|
|||||||
/// 设备任务表
|
/// 设备任务表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarTable(TableName = "DeviceTask")]
|
[SugarTable(TableName = "DeviceTask")]
|
||||||
public class DeviceTaskEntity : SugarBaseEntity
|
public class DeviceTaskEntity : SugarBaseEntity, ITenantId
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 任务类型
|
/// 任务类型
|
||||||
@@ -52,4 +53,6 @@ public class DeviceTaskEntity : SugarBaseEntity
|
|||||||
/// 处理结果
|
/// 处理结果
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ResultMessage { get; set; }
|
public string ResultMessage { get; set; }
|
||||||
|
|
||||||
|
public string TenantId { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
31
Src/Dlhis.Entity/Device/Entities/DeviceUploadLogEntity.cs
Normal file
31
Src/Dlhis.Entity/Device/Entities/DeviceUploadLogEntity.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using Kurisu.Core.DataAccess.Entity;
|
||||||
|
using Kurisu.SqlSugar;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Dlhis.Entity.Device.Entities;
|
||||||
|
|
||||||
|
[SugarTable(TableName = "DeviceUploadLog", TableDescription = "设备上传记录")]
|
||||||
|
public class DeviceUploadLogEntity : SugarBaseEntity, ITenantId
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 设备号
|
||||||
|
/// </summary>
|
||||||
|
public string DeviceUniqueNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户档案号
|
||||||
|
/// </summary>
|
||||||
|
public string UserNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户学工号
|
||||||
|
/// </summary>
|
||||||
|
public string UserCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上传IP
|
||||||
|
/// </summary>
|
||||||
|
public string Ip { get; set; }
|
||||||
|
|
||||||
|
public string TenantId { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Request;
|
||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Response;
|
||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Services;
|
||||||
|
using Kurisu.Core.DataAccess.Dto;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace Dlhis.ScheduledTask.DeviceUploadLog.Controllers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设备上传记录
|
||||||
|
/// </summary>
|
||||||
|
[Authorize]
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
[ApiController]
|
||||||
|
public class DeviceUploadLogsController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly IDeviceUploadLogService _deviceUploadLogService;
|
||||||
|
|
||||||
|
public DeviceUploadLogsController(IDeviceUploadLogService deviceUploadLogService)
|
||||||
|
{
|
||||||
|
_deviceUploadLogService = deviceUploadLogService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取上传记录分页
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("page")]
|
||||||
|
public async Task<Pagination<DeviceUploadLogResponse>> GetPageAsync([FromQuery] DeviceUploadLogPageRequest request)
|
||||||
|
{
|
||||||
|
return await _deviceUploadLogService.GetPageAsync(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
using Dlhis.Entity.Canteen.Enums;
|
||||||
|
using Kurisu.Core.CustomClass;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using Kurisu.Core.DataAccess.Dto;
|
||||||
|
|
||||||
|
namespace Dlhis.ScheduledTask.DeviceUploadLog.Request;
|
||||||
|
|
||||||
|
public class DeviceUploadLogPageRequest : PageDto, IValidatableObject
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 查询日期范围类型 DateTimeSearchEnumType
|
||||||
|
/// </summary>
|
||||||
|
[EnumDataType(typeof(DateTimeSearchEnumType))]
|
||||||
|
public DateTimeSearchEnumType? SearchDateTimeDimension { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 日期范围查询
|
||||||
|
/// </summary>
|
||||||
|
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||||
|
|
||||||
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||||
|
{
|
||||||
|
var now = DateTime.Now;
|
||||||
|
if (SearchDateTimeDimension.HasValue)
|
||||||
|
{
|
||||||
|
//重新赋值
|
||||||
|
SearchDateTimePeriod = new DateTimePeriod();
|
||||||
|
|
||||||
|
if (SearchDateTimeDimension == DateTimeSearchEnumType.Day)
|
||||||
|
{
|
||||||
|
SearchDateTimePeriod.Start = new DateTime(now.Year, now.Month, now.Day, 0, 0, 1);
|
||||||
|
SearchDateTimePeriod.End = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
|
||||||
|
}
|
||||||
|
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Week)
|
||||||
|
{
|
||||||
|
SearchDateTimePeriod.Start = now.AddDays(1 - (int)now.DayOfWeek);
|
||||||
|
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddDays(6);
|
||||||
|
}
|
||||||
|
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Month)
|
||||||
|
{
|
||||||
|
SearchDateTimePeriod.Start = new DateTime(now.Year, now.Month, 1);
|
||||||
|
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddMonths(1).AddDays(-1);
|
||||||
|
}
|
||||||
|
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Season)
|
||||||
|
{
|
||||||
|
SearchDateTimePeriod.Start = now.AddMonths(0 - ((now.Month - 1) % 3));
|
||||||
|
SearchDateTimePeriod.End = now.AddMonths(3 - ((now.Month - 1) % 3)).AddMonths(1).AddDays(-1);
|
||||||
|
}
|
||||||
|
else if (SearchDateTimeDimension == DateTimeSearchEnumType.HalfOfYear)
|
||||||
|
{
|
||||||
|
SearchDateTimePeriod.Start = now.AddDays(-180);
|
||||||
|
SearchDateTimePeriod.End = now;
|
||||||
|
}
|
||||||
|
else if (SearchDateTimeDimension == DateTimeSearchEnumType.Year)
|
||||||
|
{
|
||||||
|
SearchDateTimePeriod.Start = new DateTime(now.Year, 1, 1);
|
||||||
|
SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddYears(1).AddDays(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchDateTimePeriod.Start = SearchDateTimePeriod.Start.Value.Date;
|
||||||
|
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
namespace Dlhis.ScheduledTask.DeviceUploadLog.Response;
|
||||||
|
|
||||||
|
public class DeviceUploadLogResponse
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设备号
|
||||||
|
/// </summary>
|
||||||
|
public string DeviceUniqueNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户档案号
|
||||||
|
/// </summary>
|
||||||
|
public string UserNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户学工号
|
||||||
|
/// </summary>
|
||||||
|
public string UserCode { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户名称
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上传IP
|
||||||
|
/// </summary>
|
||||||
|
public string Ip { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上传时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime UploadTime { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Request;
|
||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Response;
|
||||||
|
using Kurisu.Core.DataAccess.Dto;
|
||||||
|
|
||||||
|
namespace Dlhis.ScheduledTask.DeviceUploadLog.Services;
|
||||||
|
|
||||||
|
public interface IDeviceUploadLogService : IScopeDependency
|
||||||
|
{
|
||||||
|
Task<Pagination<DeviceUploadLogResponse>> GetPageAsync(DeviceUploadLogPageRequest request);
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using Dlhis.Entity.Basic.Entity;
|
||||||
|
using Dlhis.Entity.Device.Entities;
|
||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Request;
|
||||||
|
using Dlhis.ScheduledTask.DeviceUploadLog.Response;
|
||||||
|
using Kurisu.Core.DataAccess.Dto;
|
||||||
|
using Kurisu.SqlSugar.Extensions;
|
||||||
|
using Kurisu.SqlSugar.Services;
|
||||||
|
|
||||||
|
namespace Dlhis.ScheduledTask.DeviceUploadLog.Services.Implements;
|
||||||
|
|
||||||
|
public class DeviceUploadLogService : IDeviceUploadLogService
|
||||||
|
{
|
||||||
|
private readonly IDbContext _dbContext;
|
||||||
|
|
||||||
|
public DeviceUploadLogService(IDbContext dbContext)
|
||||||
|
{
|
||||||
|
_dbContext = dbContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Pagination<DeviceUploadLogResponse>> GetPageAsync(DeviceUploadLogPageRequest request)
|
||||||
|
{
|
||||||
|
var page = await _dbContext.Queryable<DeviceUploadLogEntity>()
|
||||||
|
.LeftJoin<GainfoEntity>((deviceUp, ga) => deviceUp.UserNo == ga.No)
|
||||||
|
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.CreateTime >= request.SearchDateTimePeriod.Start)
|
||||||
|
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.CreateTime <= request.SearchDateTimePeriod.End)
|
||||||
|
.Select((deviceUp, ga) => new DeviceUploadLogResponse
|
||||||
|
{
|
||||||
|
DeviceUniqueNo = deviceUp.DeviceUniqueNo,
|
||||||
|
Id = deviceUp.Id,
|
||||||
|
Ip = deviceUp.Ip,
|
||||||
|
UploadTime = deviceUp.CreateTime,
|
||||||
|
UserNo = deviceUp.UserNo,
|
||||||
|
UserCode = deviceUp.UserCode,
|
||||||
|
UserName = ga.Name,
|
||||||
|
})
|
||||||
|
.ToPageListAsync(request);
|
||||||
|
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user