fix 订餐null异常处理

This commit is contained in:
2024-03-19 19:51:56 +08:00
parent f427338715
commit f003e30169
18 changed files with 96 additions and 167 deletions

View File

@@ -8,9 +8,9 @@ public class DishesMenusBookingSettingResponse
public DateTime ServerTime { get; set; }
/// <summary>
/// 餐别-餐次信息
/// 订餐期限
/// </summary>
public List<BusinessShiftMealRelationshipResponse> ShiftInfos { get; set; }
public DateTime Deadline { get; set; }
/// <summary>
/// 支付方式

View File

@@ -178,7 +178,7 @@ public class DishesMenuService : IDishesMenuService
foreach (var item in request.Items)
{
var u = item.Date.ToString("yyyy-MM-dd") + "-" + item.CustomCode;
var u = item.Date.ToString("yyyy-MM-dd") + ". " + item.CustomCode;
(item.ShiftTypes.DistinctBy(x => x.ShiftType).Count() != item.ShiftTypes.Count).ThrowIfTrue($"{u}的餐次不可重复添加");

View File

@@ -66,12 +66,13 @@ public class DishesService : IDishesService
.Select(x => x.Value)
.FirstAsync();
DateTime dateTime;
DateTime.TryParseExact(strDatetime, "HH:mm:ss", null, System.Globalization.DateTimeStyles.None, out dateTime);
if (!TimeOnly.TryParse(strDatetime, out var deadline))
deadline = new TimeOnly(8, 30);
var res = new DishesMenusBookingSettingResponse
{
ServerTime = dateTime,
ServerTime = DateTime.Now,
Deadline = DateTime.Today.Add(deadline.ToTimeSpan())
};
var shift = await _dbContext.Queryable<BusinessPlaceShiftRelationshipEntity>()
@@ -87,11 +88,7 @@ public class DishesService : IDishesService
if (shift != null)
{
var businessShiftMealRelationships = await _dbContext.Queryable<BusinessShiftMealRelationshipEntity>()
.Where(x => x.ShiftCode == shift.ShiftCode)
.Select<BusinessShiftMealRelationshipResponse>()
.ToListAsync();
res.ShiftInfos = businessShiftMealRelationships;
if (shift.TenantId == request.Factory)
{
@@ -104,6 +101,7 @@ public class DishesService : IDishesService
}
res.PayTypes = payTypes;
return res;
}

View File

@@ -27,6 +27,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="MealUser\Request\" />
<Folder Include="Summary\Request\" />
</ItemGroup>

View File

@@ -1,5 +1,4 @@
using Dlhis.Basic.MealUser.Request;
using Dlhis.Basic.MealUser.Response;
using Dlhis.Basic.MealUser.Response;
using Dlhis.Basic.MealUser.Services;
using Kurisu.Core.DataAccess.Dto;
using Microsoft.AspNetCore.Authorization;
@@ -28,19 +27,8 @@ public class MealUsersController : ControllerBase
/// <param name="request"></param>
/// <returns></returns>
[HttpGet("page")]
public async Task<Pagination<MealUserResponse>> GetPageAsync([FromQuery] MealUserPageRequest request)
public async Task<Pagination<MealUserResponse>> GetPageAsync([FromQuery] PageDto request)
{
return await _mealUserService.GetPageAsync(request);
}
/// <summary>
/// 就餐人员保存
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task AddAsync(MealUserAddRequest request)
{
await _mealUserService.AddAsync(request);
}
}

View File

@@ -1,20 +0,0 @@
using System.ComponentModel.DataAnnotations;
using Dlhis.Entity.Canteen.Enums;
namespace Dlhis.Basic.MealUser.Request;
public class MealUserAddRequest
{
/// <summary>
/// 档案号
/// </summary>
[Required(ErrorMessage = "档案号不能为空")]
public string UserNo { get; set; }
/// <summary>
/// 用户类型
/// </summary>
[EnumDataType(typeof(CanteenUserEnumType))]
public CanteenUserEnumType UserType { get; set; }
}

View File

@@ -1,7 +0,0 @@
using Kurisu.Core.DataAccess.Dto;
namespace Dlhis.Basic.MealUser.Request;
public class MealUserPageRequest : PageDto
{
}

View File

@@ -1,6 +1,4 @@
using Dlhis.Entity.Canteen.Enums;
namespace Dlhis.Basic.MealUser.Response;
namespace Dlhis.Basic.MealUser.Response;
public class MealUserResponse
{
@@ -15,13 +13,6 @@ public class MealUserResponse
/// </summary>
public string UserCode { get; set; }
/// <summary>
/// 消费人员类型
/// </summary>
public CanteenUserEnumType UserType { get; set; }
/// <summary>
/// 卡号
/// </summary>

View File

@@ -1,12 +1,9 @@
using Dlhis.Basic.MealUser.Request;
using Dlhis.Basic.MealUser.Response;
using Dlhis.Basic.MealUser.Response;
using Kurisu.Core.DataAccess.Dto;
namespace Dlhis.Basic.MealUser.Services;
public interface IMealUserService : IScopeDependency
{
Task<Pagination<MealUserResponse>> GetPageAsync(MealUserPageRequest request);
Task AddAsync(MealUserAddRequest request);
Task<Pagination<MealUserResponse>> GetPageAsync(PageDto request);
}

View File

@@ -1,9 +1,5 @@
using Dlhis.Basic.MealUser.Request;
using Dlhis.Basic.MealUser.Response;
using Dlhis.Basic.Organization.Services;
using Dlhis.Basic.MealUser.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Basic.Enums;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.DataAccess.Dto;
using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Services;
@@ -13,17 +9,15 @@ namespace Dlhis.Basic.MealUser.Services.Implements;
public class MealUserService : IMealUserService
{
private readonly IDbContext _dbContext;
private readonly IGainfoStore _gainfoStore;
public MealUserService(IDbContext dbContext, IGainfoStore gainfoStore)
public MealUserService(IDbContext dbContext)
{
_dbContext = dbContext;
_gainfoStore = gainfoStore;
}
public async Task<Pagination<MealUserResponse>> GetPageAsync(MealUserPageRequest request)
public async Task<Pagination<MealUserResponse>> GetPageAsync(PageDto request)
{
var page = await _dbContext.Queryable<CanteenUserEntity>()
var page = await _dbContext.Queryable<GainfoMealEntity>()
.LeftJoin<GainfoEntity>((x, ga) => x.UserNo == ga.No)
.Select((x, ga) => new MealUserResponse
{
@@ -32,32 +26,9 @@ public class MealUserService : IMealUserService
BalanceOfSubsidies = x.BalanceOfSubsidies,
UserCode = ga.Code,
UserNo = ga.No,
UserType = x.UserType
})
.ToPageListAsync(request);
return page;
}
public async Task AddAsync(MealUserAddRequest request)
{
//todo 获取档案信息
var gainfoEntity = await _gainfoStore.Queryable(GainfoStatusEnumType.Working)
.Where(x => x.No.ToString() == request.UserNo)
.FirstAsync();
gainfoEntity.ThrowIfNull($"档案[{request.UserNo}]不存在");
var entity = new CanteenUserEntity
{
UserNo = request.UserNo,
UserType = request.UserType,
Balance = 0,
BalanceOfRecharge = 0,
BalanceOfSubsidies = 0,
Version = 0,
};
await _dbContext.InsertAsync(entity);
}
}

View File

@@ -169,7 +169,7 @@ public class GainfoService : IGainfoService
var info = await _gainfoStore.Queryable(GainfoStatusEnumType.Working)
.LeftJoin<DepartmentEntity>((ga, department) => ga.DepartmentNo == department.No)
.LeftJoin<CanteenUserEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
.LeftJoin<GainfoMealEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
.Where((ga, department) => ga.Id == gainfo.Id)
.Select((ga, department, mealUser) => new GainfoCurrentResponse
{

View File

@@ -64,7 +64,6 @@ public class OrdersController : ControllerBase
/// 订餐
/// </summary>
/// <returns></returns>
[IgnoreTenant]
[HttpPost("booking")]
public async Task Booking(BookingMealRequest request)
{

View File

@@ -558,12 +558,12 @@ public class BalanceService : IBalanceService
await ContinueUpdateAsync(async () =>
{
//重算金额
var canteenUser = await _dbContext.Queryable<CanteenUserEntity>().Where(x => x.UserNo == balanceRecord.UserNo).SingleAsync();
var canteenUser = await _dbContext.Queryable<GainfoMealEntity>().Where(x => x.UserNo == balanceRecord.UserNo).SingleAsync();
//金额 +
canteenUser.Balance += Math.Abs(balanceRecord.Amount);
var effect = await _dbContext.Updateable<CanteenUserEntity>()
var effect = await _dbContext.Updateable<GainfoMealEntity>()
.SetColumns(x => x.Balance == canteenUser.Balance)
.SetColumns(x => x.Version == x.Version + 1)
.Where(x => x.UserNo == balanceRecord.UserNo && x.Version == canteenUser.Version)

View File

@@ -64,10 +64,7 @@ public class OrderService : IOrderService
public async Task Booking(BookingMealRequest request)
{
await CheckExistsMyBookingsAsync(request.BookingDate);
var jinkoCode = _currentUser.GetUserClaim("jinko-code");
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == jinkoCode).FirstAsync();
var gainfo = await CheckExistsMyBookingsAsync(request.BookingDate, request.ShiftType);
var businessPlace = await _dbContext.Queryable<BusinessPlaceEntity>().Where(x => x.Code == request.BusinessPlaceCode).FirstAsync();
@@ -130,15 +127,29 @@ public class OrderService : IOrderService
(menuDetail.Number < 0).ThrowIfTrue($"{menuDetail.DishesName}已售罄");
var canteenUser = await _dbContext.Queryable<CanteenUserEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
//金额+-
canteenUser.Balance += order.Amount;
(canteenUser.Balance < 0).ThrowIfTrue("余额不足,无法消费");
var mealInfo = await _dbContext.Queryable<GainfoMealEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
if (mealInfo == null)
{
await _dbContext.InsertAsync(new GainfoMealEntity
{
Balance = 0,
BalanceOfRecharge = 0,
BalanceOfSubsidies = 0,
UserCode = gainfo.Code,
UserNo = gainfo.No,
Version = 0,
});
var effect = await _dbContext.Updateable<CanteenUserEntity>()
.SetColumns(x => x.Balance == canteenUser.Balance)
(mealInfo == null).ThrowIfTrue("余额不足,无法消费");
}
//金额+-
mealInfo.Balance += order.Amount;
(mealInfo.Balance < 0).ThrowIfTrue("余额不足,无法消费");
var effect = await _dbContext.Updateable<GainfoMealEntity>()
.SetColumns(x => x.Balance == mealInfo.Balance)
.SetColumns(x => x.Version == x.Version + 1)
.Where(x => x.UserNo == order.UserNo && x.Version == canteenUser.Version)//必须与查询时的version一致
.Where(x => x.UserNo == order.UserNo && x.Version == mealInfo.Version)//必须与查询时的version一致
.ExecuteCommandAsync();
if (effect <= 0) throw new VersionExceptions("更新版本冲突");
@@ -147,7 +158,12 @@ public class OrderService : IOrderService
.SetColumns(x => x.Number == menuDetail.Number)
.SetColumns(x => x.Version == x.Version + 1)
.SetColumns(x => x.ModifiedTime == now)
.Where(x => x.Date == menuDetail.Date && x.ShiftType == request.ShiftType && x.BusinessPlaceCode == request.BusinessPlaceCode && x.Version == menuDetail.Version)
.Where(x => x.Date == menuDetail.Date
&& x.ShiftType == request.ShiftType
&& x.BusinessPlaceCode == request.BusinessPlaceCode
&& x.DishesCode == request.DishesCode
&& x.Version == menuDetail.Version
)
.ExecuteCommandAsync();
if (effect <= 0) throw new VersionExceptions("更新版本冲突");
@@ -189,19 +205,18 @@ public class OrderService : IOrderService
//消费权限控制
await CheckPAsync(gainfo.No, request.DeviceUniqueNo);
var canteenUserExists = await _dbContext.Queryable<CanteenUserEntity>()
var canteenUserExists = await _dbContext.Queryable<GainfoMealEntity>()
.Where(x => x.UserNo == gainfo.No)
.AnyAsync();
if (!canteenUserExists)
{
await _dbContext.InsertAsync(new CanteenUserEntity
await _dbContext.InsertAsync(new GainfoMealEntity
{
UserNo = gainfo.No,
Balance = 0,
BalanceOfRecharge = 0,
BalanceOfSubsidies = 0,
UserType = CanteenUserEnumType.LocalTenant,
TenantId = gainfo.Factory,
Version = 0,
@@ -226,7 +241,7 @@ public class OrderService : IOrderService
//获取人员余额
return await _dbContext.Queryable<GainfoEntity>()
.LeftJoin<DepartmentEntity>((ga, department) => ga.DepartmentNo == department.No)
.LeftJoin<CanteenUserEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
.LeftJoin<GainfoMealEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
.Where(ga => ga.Id == gainfo.Id)
.Select((ga, department, mealUser) => new OrderResultResponse
{
@@ -582,11 +597,11 @@ public class OrderService : IOrderService
await ContinueUpdateAsync(async () =>
{
var canteenUser = await _dbContext.Queryable<CanteenUserEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
var canteenUser = await _dbContext.Queryable<GainfoMealEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
//金额+-
canteenUser.Balance += order.Amount;
var effect = await _dbContext.Updateable<CanteenUserEntity>()
var effect = await _dbContext.Updateable<GainfoMealEntity>()
.SetColumns(x => x.Balance == canteenUser.Balance)
.SetColumns(x => x.Version == x.Version + 1)
.Where(x => x.UserNo == order.UserNo && x.Version == canteenUser.Version)
@@ -623,7 +638,7 @@ public class OrderService : IOrderService
{
if (!allowNoBalance)
{
var canteenUser = await _dbContext.Queryable<CanteenUserEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
var canteenUser = await _dbContext.Queryable<GainfoMealEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
//金额+-
canteenUser.Balance += order.Amount;
if (canteenUser.Balance < 0)
@@ -631,7 +646,7 @@ public class OrderService : IOrderService
throw new UserFriendlyException("余额不足,无法消费");
}
var effect = await _dbContext.Updateable<CanteenUserEntity>()
var effect = await _dbContext.Updateable<GainfoMealEntity>()
.SetColumns(x => x.Balance == canteenUser.Balance)
.SetColumns(x => x.Version == x.Version + 1)
.Where(x => x.UserNo == order.UserNo && x.Version == canteenUser.Version)//必须与查询时的version一致
@@ -651,20 +666,30 @@ public class OrderService : IOrderService
/// 检查我的订餐是否存在,存在抛出异常
/// </summary>
/// <param name="bookingDate"></param>
/// <param name="shiftType"></param>
/// <returns></returns>
private async Task CheckExistsMyBookingsAsync(DateTime bookingDate)
private async Task<GainfoEntity> CheckExistsMyBookingsAsync(DateTime bookingDate, ShiftEnumType shiftType)
{
var jinkoCode = _currentUser.GetUserClaim("jinko-code");
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == jinkoCode).FirstAsync();
var subjectId = _currentUser.GetIntSubjectId();
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.IdentityUserId == subjectId).FirstAsync();
var jinkoCode = _currentUser.GetUserClaim("jinko-code") ?? string.Empty;
if (jinkoCode.IsPresent())
{
gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == jinkoCode).FirstAsync();
}
var start = bookingDate.Date;
var start = bookingDate.Date.AddDays(-1);
var end = start.AddDays(1).AddSeconds(-1);
var exists = await _dbContext.Queryable<CanteenOrderEntity>().Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking)
var exists = await _dbContext.Queryable<CanteenOrderEntity>()
.Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking)
.Where(x => x.ShiftType == shiftType)
.Where(x => x.UserNo == gainfo.No)
.Where(x => x.CreateTime >= start && x.CreateTime <= end)
.AnyAsync();
exists.ThrowIfTrue("不可重复订餐");
return gainfo;
}
}

View File

@@ -10,6 +10,13 @@
"BasicRequestUrl": "http://localhost:5002",
"SysRequestUrl": "http://localhost:5003"
},
"SqlSugarOptions": {
"DefaultConnectionString": "server=192.168.199.124;port=3306;userid=root;password=dlhis123;database=yikatong;charset=utf8mb4;",
"SlaveConnectionString": [],
"Timeout": 30,
"SlowSqlTime": 1,
"EnableSqlLog": false
},
"SwaggerOptions": {
"Enable": true,
"Authority": "https://yikatong.isawesome.cn/oauth2",

View File

@@ -1,16 +1,14 @@
using Dlhis.Entity.Canteen.Enums;
using Kurisu.Core.DataAccess.Entity;
using Kurisu.Core.DataAccess.Entity;
using Kurisu.SqlSugar;
using SqlSugar;
using SqlSugar.DbConvert;
namespace Dlhis.Entity.Basic.Entity;
/// <summary>
/// 就餐人员
/// </summary>
[SugarTable(TableName = "CanteenUser", TableDescription = "就餐人员")]
public class CanteenUserEntity : SugarBaseEntity, IVersion, ITenantId
[SugarTable(TableName = "GainfoMeal", TableDescription = "就餐人员")]
public class GainfoMealEntity : SugarBaseEntity, IVersion, ITenantId
{
/// <summary>
/// 档案号
@@ -19,10 +17,10 @@ public class CanteenUserEntity : SugarBaseEntity, IVersion, ITenantId
public string UserNo { get; set; }
/// <summary>
/// 消费人员类型
/// 工号
/// </summary>
[SugarColumn(ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert), ColumnDescription = "消费人员类型")]
public CanteenUserEnumType UserType { get; set; }
[SugarColumn(IsNullable = false, ColumnDescription = "工号", UniqueGroupNameList = new[] { "idx_CanteenUser_UserCode" })]
public string UserCode { get; set; }
/// <summary>
/// 余额

View File

@@ -28,6 +28,17 @@ public class MealSupplementRecordEntity : MealSupplementRequestRecordEntity
/// </summary>
[SugarColumn(ColumnDataType = "varchar(50)", SqlParameterDbType = typeof(EnumToStringConvert))]
public MealSupplementStatusEnumtype Status { get; set; }
/// <summary>
/// 处理结果
/// </summary>
[SugarColumn(ColumnDescription = "处理结果", ColumnDataType = "varchar(2000)")]
public string Result { get; set; }
/// <summary>
/// 状态同步
/// </summary>
public bool Sync { get; set; }
}
[SugarTable(TableName = "MealSupplementRequestRecord", TableDescription = "餐补请求记录")]

View File

@@ -1,30 +0,0 @@

using System.ComponentModel;
namespace Dlhis.Entity.Canteen.Enums;
/// <summary>
/// 就餐人员类型
/// </summary>
[Description("就餐人员类型")]
public enum CanteenUserEnumType
{
/// <summary>
/// 本基地
/// </summary>
[Description("本基地人员")]
LocalTenant = 1,
/// <summary>
/// 其他基地
/// </summary>
[Description("其他基地人员")]
OtherTenant,
/// <summary>
/// 外部人员
/// </summary>
[Description("外部人员")]
External
}