fix 外包人员,餐补导入,人员列表
This commit is contained in:
@@ -0,0 +1,52 @@
|
|||||||
|
using Dlhis.Basic.Organization.Request;
|
||||||
|
using Dlhis.Basic.Organization.Services;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace Dlhis.Basic.Organization.Controllers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 外包人员
|
||||||
|
/// </summary>
|
||||||
|
[Authorize]
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
[ApiController]
|
||||||
|
public class GainfoOutSourceController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly IGainfoOutSourceService _gainfoOutSourceService;
|
||||||
|
|
||||||
|
public GainfoOutSourceController(IGainfoOutSourceService gainfoOutSourceService)
|
||||||
|
{
|
||||||
|
_gainfoOutSourceService = gainfoOutSourceService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 入职
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
[HttpPost("entry")]
|
||||||
|
public async Task EntryAsync(GainfoOutEntryRequest request)
|
||||||
|
{
|
||||||
|
await _gainfoOutSourceService.EntryAsync(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 离职
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
[HttpPost("resign")]
|
||||||
|
public async Task ResignAsync(GainfoOutResignRequest request)
|
||||||
|
{
|
||||||
|
await _gainfoOutSourceService.ResignAsync(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 编辑
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
[HttpPost("edit")]
|
||||||
|
public async Task EditAsync(GainfoOutEntryRequest request)
|
||||||
|
{
|
||||||
|
await _gainfoOutSourceService.EditAsync(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ using Kurisu.Core.DataAccess.Dto;
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace Dlhis.Basic.MealUser.Controllers;
|
namespace Dlhis.Basic.Organization.Controllers;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// sap档案表
|
/// sap档案表
|
||||||
|
|||||||
119
Src/Dlhis.Basic/Organization/Request/GainfoOutEntryRequest.cs
Normal file
119
Src/Dlhis.Basic/Organization/Request/GainfoOutEntryRequest.cs
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
using Dlhis.Entity.Basic.Enums;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Dlhis.Basic.Organization.Request;
|
||||||
|
|
||||||
|
public class GainfoOutEntryRequest
|
||||||
|
{
|
||||||
|
public long? Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 姓名
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 证件类型代码
|
||||||
|
/// </summary>
|
||||||
|
public string IdClass { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 身份证号
|
||||||
|
/// </summary>
|
||||||
|
public string IdNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 身份证籍贯区域代码
|
||||||
|
/// </summary>
|
||||||
|
public string Native { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 性别 GenderEnumType
|
||||||
|
/// </summary>
|
||||||
|
public GenderEnumType Gender { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生日
|
||||||
|
/// </summary>
|
||||||
|
public DateTime Birthday { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 身份证地址
|
||||||
|
/// </summary>
|
||||||
|
public string Address { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 部门编码
|
||||||
|
/// </summary>
|
||||||
|
public string DepartmentNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 民族代码
|
||||||
|
/// </summary>
|
||||||
|
public string Nation { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 手机号码
|
||||||
|
/// </summary>
|
||||||
|
public string Phone { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 学历
|
||||||
|
/// </summary>
|
||||||
|
public string Degree { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 岗位
|
||||||
|
/// </summary>
|
||||||
|
public string PositionNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 职等
|
||||||
|
/// </summary>
|
||||||
|
public string Grade { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 职级
|
||||||
|
/// </summary>
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 卡号
|
||||||
|
/// </summary>
|
||||||
|
public string CardNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注
|
||||||
|
/// </summary>
|
||||||
|
public string Remark { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 人事范围
|
||||||
|
/// </summary>
|
||||||
|
public string Werks { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 工作地
|
||||||
|
/// </summary>
|
||||||
|
public string Workplace { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 厂区
|
||||||
|
/// </summary>
|
||||||
|
public string Factory { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 成本中心
|
||||||
|
/// </summary>
|
||||||
|
public string CostId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 入职日期
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EntryDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 离职日期
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? ResignationDate { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Dlhis.Basic.Organization.Request
|
||||||
|
{
|
||||||
|
public class GainfoOutResignRequest : IValidatableObject
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
public string Reason { get; set; }
|
||||||
|
|
||||||
|
public DateTime Date { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||||
|
{
|
||||||
|
if (Date < DateTime.Now.Date)
|
||||||
|
{
|
||||||
|
yield return new ValidationResult("离职日期不能小于当前时间", new[] { nameof(Date) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,12 @@ public class GainfoPageRequest : PageDto, IValidatableObject
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<TenantDepartmentRequest> DepartmentSelections { get; set; } = new List<TenantDepartmentRequest>();
|
public List<TenantDepartmentRequest> DepartmentSelections { get; set; } = new List<TenantDepartmentRequest>();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否为外包
|
||||||
|
/// </summary>
|
||||||
|
public bool? IsOutSource { get; set; }
|
||||||
|
|
||||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||||
{
|
{
|
||||||
DepartmentSelections.ForEach(d =>
|
DepartmentSelections.ForEach(d =>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using Dlhis.Basic.Organization.Request;
|
||||||
|
|
||||||
|
namespace Dlhis.Basic.Organization.Services;
|
||||||
|
|
||||||
|
public interface IGainfoOutSourceService : IScopeDependency
|
||||||
|
{
|
||||||
|
Task EntryAsync(GainfoOutEntryRequest request);
|
||||||
|
|
||||||
|
Task ResignAsync(GainfoOutResignRequest request);
|
||||||
|
|
||||||
|
Task EditAsync(GainfoOutEntryRequest request);
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
using Dlhis.Basic.Organization.Request;
|
||||||
|
using Dlhis.Entity.Basic.Entity;
|
||||||
|
using Kurisu.AspNetCore.Utils;
|
||||||
|
using Kurisu.AspNetCore.Utils.Extensions;
|
||||||
|
using Kurisu.SqlSugar.Services;
|
||||||
|
using Mapster;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Dlhis.Basic.Organization.Services.Implements;
|
||||||
|
|
||||||
|
public class GainfoOutSourceService : IGainfoOutSourceService
|
||||||
|
{
|
||||||
|
private readonly IDbContext _dbContext;
|
||||||
|
private readonly RedisCache _redisCache;
|
||||||
|
|
||||||
|
public GainfoOutSourceService(IDbContext dbContext, RedisCache redisCache)
|
||||||
|
{
|
||||||
|
_dbContext = dbContext;
|
||||||
|
_redisCache = redisCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task EntryAsync(GainfoOutEntryRequest request)
|
||||||
|
{
|
||||||
|
await SaveAsync(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ResignAsync(GainfoOutResignRequest request)
|
||||||
|
{
|
||||||
|
//todo 生成任务处理
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task EditAsync(GainfoOutEntryRequest request)
|
||||||
|
{
|
||||||
|
await SaveAsync(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//********************************************************************** help methods ***********************************************************************************
|
||||||
|
|
||||||
|
private async Task<string> GetOutSourceCodeAsync()
|
||||||
|
{
|
||||||
|
await using var handler = await _redisCache.LockAsync("gainfo:outsource:code-generate", expiry: TimeSpan.FromSeconds(3), retryInterval: TimeSpan.FromSeconds(1), retryCount: 3);
|
||||||
|
handler.Acquired.ThrowIfFalse("生成虚拟工号失败");
|
||||||
|
|
||||||
|
int code;
|
||||||
|
var entity = await _dbContext.Queryable<OutSourceEntity>().OrderBy(x => x.Id, OrderByType.Desc).FirstAsync();
|
||||||
|
if (entity == null)
|
||||||
|
{
|
||||||
|
code = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
code = int.Parse(entity.Code.Replace("LS", "").Replace("0", "")) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "LS" + code.ToString().PadLeft(6, '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SaveAsync(GainfoOutEntryRequest request)
|
||||||
|
{
|
||||||
|
if (!request.Id.HasValue)
|
||||||
|
{
|
||||||
|
var entity = request.Adapt<GainfoEntity>();
|
||||||
|
entity.No = Guid.NewGuid().ToString();
|
||||||
|
entity.Code = await GetOutSourceCodeAsync();
|
||||||
|
|
||||||
|
await _dbContext.InsertAsync(entity);
|
||||||
|
await _dbContext.InsertAsync(new OutSourceEntity
|
||||||
|
{
|
||||||
|
Code = entity.Code
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var entity = await _dbContext.Queryable<GainfoEntity>().FirstAsync(x => x.Id == request.Id);
|
||||||
|
entity.ThrowIfNull("档案数据不存在");
|
||||||
|
|
||||||
|
(await _dbContext.Queryable<OutSourceEntity>().AnyAsync(x => x.Code == entity.Code)).ThrowIfFalse("不可编辑非外包人员档案数据");
|
||||||
|
|
||||||
|
request.Adapt(entity);
|
||||||
|
|
||||||
|
await _dbContext.UpdateAsync(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ using Kurisu.Core.User.Abstractions;
|
|||||||
using Kurisu.SqlSugar.Extensions;
|
using Kurisu.SqlSugar.Extensions;
|
||||||
using Kurisu.SqlSugar.Services;
|
using Kurisu.SqlSugar.Services;
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
using Microsoft.AspNetCore.DataProtection;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
namespace Dlhis.Basic.Organization.Services.Implements;
|
namespace Dlhis.Basic.Organization.Services.Implements;
|
||||||
|
|
||||||
@@ -64,10 +65,12 @@ public class GainfoService : IGainfoService
|
|||||||
var page = await _gainfoStore.Queryable(request.Status)
|
var page = await _gainfoStore.Queryable(request.Status)
|
||||||
.WhereIF(request.DepartmentSelections.IsPresent(), where)
|
.WhereIF(request.DepartmentSelections.IsPresent(), where)
|
||||||
.WhereIF(request.DepartmentSelections.IsEmpty(), gainfo => gainfo.Factory == currentTenantId)
|
.WhereIF(request.DepartmentSelections.IsEmpty(), gainfo => gainfo.Factory == currentTenantId)
|
||||||
|
.WhereIF(request.IsOutSource.HasValue && request.IsOutSource.Value, gainfo => SqlFunc.Subqueryable<OutSourceEntity>().Where(x => x.Code == gainfo.Code).Any())
|
||||||
|
.WhereIF(request.IsOutSource.HasValue && !request.IsOutSource.Value, gainfo => SqlFunc.Subqueryable<OutSourceEntity>().Where(x => x.Code == gainfo.Code).NotAny())
|
||||||
.WhereIF(request.Search.IsPresent(), gainfo =>
|
.WhereIF(request.Search.IsPresent(), gainfo =>
|
||||||
gainfo.Name.Contains(request.Search)
|
gainfo.Name.Contains(request.Search)
|
||||||
|| gainfo.Code == request.Search
|
|| gainfo.Code == request.Search
|
||||||
|| gainfo.IdNo == request.Search)
|
|| gainfo.IdNo == request.Search)
|
||||||
.Select<GainfoPageResponse>()
|
.Select<GainfoPageResponse>()
|
||||||
.ToPageListAsync(request);
|
.ToPageListAsync(request);
|
||||||
|
|
||||||
@@ -77,9 +80,9 @@ public class GainfoService : IGainfoService
|
|||||||
public async Task<Pagination<GainfoAllPageResponse>> GetPageByCodeAsync(string code)
|
public async Task<Pagination<GainfoAllPageResponse>> GetPageByCodeAsync(string code)
|
||||||
{
|
{
|
||||||
var page = await _gainfoStore.Queryable()
|
var page = await _gainfoStore.Queryable()
|
||||||
.Where(x => x.Code == code)
|
.Where(x => x.Code == code)
|
||||||
.Select<GainfoAllPageResponse>()
|
.Select<GainfoAllPageResponse>()
|
||||||
.ToPageListAsync(new PageDto { PageIndex = 1, PageSize = 1 });
|
.ToPageListAsync(new PageDto { PageIndex = 1, PageSize = 1 });
|
||||||
|
|
||||||
var tenantsResult = await _tenantApi.GetTenantsInternalAsync();
|
var tenantsResult = await _tenantApi.GetTenantsInternalAsync();
|
||||||
var tenants = tenantsResult.Data;
|
var tenants = tenantsResult.Data;
|
||||||
@@ -101,6 +104,7 @@ public class GainfoService : IGainfoService
|
|||||||
_logger.LogWarning("工号为空尝试获取人员信息");
|
_logger.LogWarning("工号为空尝试获取人员信息");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var gainfo = await _gainfoStore.Queryable().Where(x => x.Code == code).SingleAsync();
|
var gainfo = await _gainfoStore.Queryable().Where(x => x.Code == code).SingleAsync();
|
||||||
|
|
||||||
if (gainfo == null)
|
if (gainfo == null)
|
||||||
@@ -111,25 +115,25 @@ public class GainfoService : IGainfoService
|
|||||||
}
|
}
|
||||||
|
|
||||||
var info = await _gainfoStore.Queryable(GainfoStatusEnumType.Working)
|
var info = await _gainfoStore.Queryable(GainfoStatusEnumType.Working)
|
||||||
.LeftJoin<DepartmentEntity>((ga, department) => ga.DepartmentNo == department.No)
|
.LeftJoin<DepartmentEntity>((ga, department) => ga.DepartmentNo == department.No)
|
||||||
.LeftJoin<GainfoMealEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
|
.LeftJoin<GainfoMealEntity>((ga, department, mealUser) => ga.No == mealUser.UserNo)
|
||||||
.Where((ga, department) => ga.Id == gainfo.Id)
|
.Where((ga, department) => ga.Id == gainfo.Id)
|
||||||
.Select((ga, department, mealUser) => new GainfoCurrentResponse
|
.Select((ga, department, mealUser) => new GainfoCurrentResponse
|
||||||
{
|
{
|
||||||
UserNo = ga.No,
|
UserNo = ga.No,
|
||||||
Birthday = ga.Birthday,
|
Birthday = ga.Birthday,
|
||||||
DepartmentNo = department.No,
|
DepartmentNo = department.No,
|
||||||
DepartmentName = department.Name,
|
DepartmentName = department.Name,
|
||||||
Gender = ga.Gender,
|
Gender = ga.Gender,
|
||||||
UserCode = ga.Code,
|
UserCode = ga.Code,
|
||||||
UserName = ga.Name,
|
UserName = ga.Name,
|
||||||
Factory = ga.Factory,
|
Factory = ga.Factory,
|
||||||
MealInfo = new GainfoCurrentMealInfoResponse
|
MealInfo = new GainfoCurrentMealInfoResponse
|
||||||
{
|
{
|
||||||
Balance = mealUser.Balance
|
Balance = mealUser.Balance
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.FirstAsync();
|
.FirstAsync();
|
||||||
|
|
||||||
if (info != null)
|
if (info != null)
|
||||||
{
|
{
|
||||||
@@ -259,7 +263,6 @@ public class GainfoService : IGainfoService
|
|||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,4 +342,4 @@ public class GainfoService : IGainfoService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,32 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using Kurisu.AspNetCore.Utils.Extensions;
|
||||||
|
|
||||||
namespace Dlhis.Canteen.MealSupplementRecord.Request;
|
namespace Dlhis.Canteen.MealSupplementRecord.Request;
|
||||||
|
|
||||||
public class MealSupplementInitImportRequest
|
public class MealSupplementInitImportRequest : IValidatableObject
|
||||||
{
|
{
|
||||||
[Required(ErrorMessage = "工号不能为空")]
|
[Required(ErrorMessage = "工号不能为空")]
|
||||||
public string Code { get; set; }
|
public string Code { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 余额
|
/// 余额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Range(1, int.MaxValue, ErrorMessage = "余额有误")]
|
|
||||||
public decimal Balance { get; set; }
|
public decimal Balance { get; set; }
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||||
|
{
|
||||||
|
if (Name.IsEmpty())
|
||||||
|
{
|
||||||
|
yield return new ValidationResult($"工号{Code}姓名不能为空", new[] { nameof(Name) });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Balance <= 0)
|
||||||
|
{
|
||||||
|
yield return new ValidationResult($"工号{Code}余额有误", new[] { nameof(Balance) });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -117,10 +117,10 @@ public class MealSupplementRecordService : IMealSupplementRecordService
|
|||||||
foreach (var request in requests)
|
foreach (var request in requests)
|
||||||
{
|
{
|
||||||
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == request.Code).FirstAsync();
|
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == request.Code).FirstAsync();
|
||||||
if (gainfo == null)
|
gainfo.ThrowIfNull($"工号{request.Code}不存在");
|
||||||
{
|
|
||||||
continue;
|
(_currentUser.GetStringTenantId() != gainfo.Factory).ThrowIfTrue($"工号{request.Code}属于{gainfo.Factory}人员,无法导入");
|
||||||
}
|
(gainfo.Name != request.Name).ThrowIfTrue($"工号{request.Code}姓名不一致");
|
||||||
|
|
||||||
await CommonHelper.RetryAsync(async () =>
|
await CommonHelper.RetryAsync(async () =>
|
||||||
{
|
{
|
||||||
@@ -150,6 +150,9 @@ public class MealSupplementRecordService : IMealSupplementRecordService
|
|||||||
.ExecuteCommandThrowVersionAsync();
|
.ExecuteCommandThrowVersionAsync();
|
||||||
}, 5);
|
}, 5);
|
||||||
|
|
||||||
|
(await _dbContext.Queryable<BalanceRecordEntity>().Where(x => x.UserCode == request.Code).Where(x => x.Remark == "期初导入").AnyAsync()).ThrowIfTrue($"工号{request.Code}已导入期初余额");
|
||||||
|
|
||||||
|
|
||||||
await _dbContext.InsertAsync(new BalanceRecordEntity
|
await _dbContext.InsertAsync(new BalanceRecordEntity
|
||||||
{
|
{
|
||||||
Amount = request.Balance,
|
Amount = request.Balance,
|
||||||
|
|||||||
10
Src/Dlhis.Entity/Basic/Entity/OutSourceEntity.cs
Normal file
10
Src/Dlhis.Entity/Basic/Entity/OutSourceEntity.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using Kurisu.SqlSugar;
|
||||||
|
using SqlSugar;
|
||||||
|
|
||||||
|
namespace Dlhis.Entity.Basic.Entity;
|
||||||
|
|
||||||
|
[SugarTable(TableName = "OutSources")]
|
||||||
|
public class OutSourceEntity : SugarBaseEntity
|
||||||
|
{
|
||||||
|
public string Code { get; set; }
|
||||||
|
}
|
||||||
@@ -99,10 +99,10 @@ public class JinkoJIPService : IJinkoJIPService
|
|||||||
{
|
{
|
||||||
var jwtKey = _configuration.GetSection("JinkoOptions:Jip:Key").Value;
|
var jwtKey = _configuration.GetSection("JinkoOptions:Jip:Key").Value;
|
||||||
var jwtSecret = _configuration.GetSection("JinkoOptions:Jip:Secret").Value;
|
var jwtSecret = _configuration.GetSection("JinkoOptions:Jip:Secret").Value;
|
||||||
var mins = 5;
|
const int min = 5;
|
||||||
|
|
||||||
var now = DateTime.Now.AddMinutes(-mins);
|
var now = DateTime.Now.AddMinutes(-min);
|
||||||
var expires = DateTime.Now.AddMinutes(mins);
|
var expires = DateTime.Now.AddMinutes(min);
|
||||||
|
|
||||||
var claims = new List<Claim>
|
var claims = new List<Claim>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ public class DeviceUploadLogPageRequest : PageDto, IValidatableObject
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? Sync { get; set; }
|
public bool? Sync { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否为外包
|
||||||
|
/// </summary>
|
||||||
|
public bool? IsOutSource { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 日期范围查询
|
/// 日期范围查询
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ public class DeviceUploadLogService : IDeviceUploadLogService
|
|||||||
{
|
{
|
||||||
DeviceUploadLogTypeEnumType? type = request.Type == DeviceTypeEnumType.Attendance
|
DeviceUploadLogTypeEnumType? type = request.Type == DeviceTypeEnumType.Attendance
|
||||||
? DeviceUploadLogTypeEnumType.Attendance
|
? DeviceUploadLogTypeEnumType.Attendance
|
||||||
: request.Type == DeviceTypeEnumType.Door ? DeviceUploadLogTypeEnumType.Door
|
: request.Type == DeviceTypeEnumType.Door
|
||||||
: null;
|
? DeviceUploadLogTypeEnumType.Door
|
||||||
|
: null;
|
||||||
|
|
||||||
return await _dbContext.Queryable<DeviceUploadLogEntity>()
|
return await _dbContext.Queryable<DeviceUploadLogEntity>()
|
||||||
.LeftJoin<DeviceEntity>((deviceUp, device) => deviceUp.DeviceUniqueNo == device.UniqueNo)
|
.LeftJoin<DeviceEntity>((deviceUp, device) => deviceUp.DeviceUniqueNo == device.UniqueNo)
|
||||||
@@ -37,10 +38,12 @@ public class DeviceUploadLogService : IDeviceUploadLogService
|
|||||||
.WhereIF(request.Sync.HasValue, deviceUp => deviceUp.Sync == request.Sync)
|
.WhereIF(request.Sync.HasValue, deviceUp => deviceUp.Sync == request.Sync)
|
||||||
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.RaiseDateTime >= request.SearchDateTimePeriod.Start)
|
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.RaiseDateTime >= request.SearchDateTimePeriod.Start)
|
||||||
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.RaiseDateTime <= request.SearchDateTimePeriod.End)
|
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.RaiseDateTime <= request.SearchDateTimePeriod.End)
|
||||||
|
.WhereIF(request.IsOutSource.HasValue && request.IsOutSource.Value, deviceUp => SqlFunc.Subqueryable<OutSourceEntity>().Where(x => x.Code == deviceUp.UserUniqueNo).Any())
|
||||||
|
.WhereIF(request.IsOutSource.HasValue && !request.IsOutSource.Value, deviceUp => SqlFunc.Subqueryable<OutSourceEntity>().Where(x => x.Code == deviceUp.UserUniqueNo).NotAny())
|
||||||
.WhereIF(request.Search.IsPresent(), (deviceUp, device, ga) =>
|
.WhereIF(request.Search.IsPresent(), (deviceUp, device, ga) =>
|
||||||
ga.Code == request.Search
|
ga.Code == request.Search
|
||||||
|| ga.Name == request.Search
|
|| ga.Name == request.Search
|
||||||
|| deviceUp.DeviceUniqueNo == request.Search
|
|| deviceUp.DeviceUniqueNo == request.Search
|
||||||
)
|
)
|
||||||
.OrderBy(deviceUp => deviceUp.CreateTime, OrderByType.Desc)
|
.OrderBy(deviceUp => deviceUp.CreateTime, OrderByType.Desc)
|
||||||
.Select((deviceUp, device, ga) => new DeviceUploadLogResponse
|
.Select((deviceUp, device, ga) => new DeviceUploadLogResponse
|
||||||
@@ -65,10 +68,7 @@ public class DeviceUploadLogService : IDeviceUploadLogService
|
|||||||
{
|
{
|
||||||
//判断存在的记录
|
//判断存在的记录
|
||||||
Expression<Func<DeviceUploadLogEntity, bool>> where = LinqExpressionExtensions.False<DeviceUploadLogEntity>();
|
Expression<Func<DeviceUploadLogEntity, bool>> where = LinqExpressionExtensions.False<DeviceUploadLogEntity>();
|
||||||
requests.ForEach(p =>
|
requests.ForEach(p => { where = where.Or(x => x.DeviceUniqueNo == p.DeviceUniqueNo && x.SerialNo == p.SerialNo && x.RaiseDateTime == p.RaiseDateTime); });
|
||||||
{
|
|
||||||
where = where.Or(x => x.DeviceUniqueNo == p.DeviceUniqueNo && x.SerialNo == p.SerialNo && x.RaiseDateTime == p.RaiseDateTime);
|
|
||||||
});
|
|
||||||
|
|
||||||
//处理冗余的请求数据
|
//处理冗余的请求数据
|
||||||
var exists = await _dbContext.Queryable<DeviceUploadLogEntity>().Where(where).ToListAsync();
|
var exists = await _dbContext.Queryable<DeviceUploadLogEntity>().Where(where).ToListAsync();
|
||||||
@@ -94,12 +94,10 @@ public class DeviceUploadLogService : IDeviceUploadLogService
|
|||||||
Type = device.Type == DeviceTypeEnumType.Attendance ? DeviceUploadLogTypeEnumType.Attendance : DeviceUploadLogTypeEnumType.Door,
|
Type = device.Type == DeviceTypeEnumType.Attendance ? DeviceUploadLogTypeEnumType.Attendance : DeviceUploadLogTypeEnumType.Door,
|
||||||
|
|
||||||
TenantId = device.TenantId,
|
TenantId = device.TenantId,
|
||||||
|
|
||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}).Where(x => x != null).ToList();
|
}).Where(x => x != null).ToList();
|
||||||
|
|
||||||
await _dbContext.InsertAsync(records);
|
await _dbContext.InsertAsync(records);
|
||||||
@@ -130,4 +128,4 @@ public class DeviceUploadLogService : IDeviceUploadLogService
|
|||||||
|
|
||||||
await _dbContext.InsertAsync(logs);
|
await _dbContext.InsertAsync(logs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -33,24 +33,21 @@ public class SyncOriginCardInfoJob : BaseJob
|
|||||||
|
|
||||||
//获取上传日志(有效的)
|
//获取上传日志(有效的)
|
||||||
var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList();
|
var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList();
|
||||||
var logs = await DbContext.Queryable<DeviceUploadLogEntity>()
|
|
||||||
.Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo))
|
|
||||||
.Where(x => !string.IsNullOrEmpty(x.UserUniqueNo))
|
|
||||||
.Where(x => x.Sync == false)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
//获取人员信息
|
var requests = await DbContext.Queryable<DeviceUploadLogEntity>()
|
||||||
var userCodes = logs.Select(x => x.UserUniqueNo).ToList();
|
.Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo))
|
||||||
var gainfoCodes = await DbContext.Queryable<GainfoEntity>().Where(x => userCodes.Contains(x.Code)).Select(x => x.Code).ToListAsync();
|
.Where(x => !string.IsNullOrEmpty(x.UserUniqueNo))
|
||||||
|
.Where(x => x.Sync == false)
|
||||||
var requests = logs.Select(x => new UploadAttendanceRequest
|
.Where(x => SqlFunc.Subqueryable<GainfoEntity>().Where(p => p.Code == x.UserUniqueNo).Any())
|
||||||
{
|
.Where(x => SqlFunc.Subqueryable<OutSourceEntity>().Where(p => p.Code == x.UserUniqueNo).NotAny())
|
||||||
Id = x.Id,
|
.Select(x => new UploadAttendanceRequest
|
||||||
RaiseDateTime = x.RaiseDateTime,
|
{
|
||||||
ZNOTE = devices.First(item => item.UniqueNo == x.DeviceUniqueNo).DeployPlace,
|
Id = x.Id,
|
||||||
ZWORKCODE = gainfoCodes.Contains(x.UserUniqueNo) ? x.UserUniqueNo?.TrimEnd('\0') : string.Empty,
|
RaiseDateTime = x.RaiseDateTime,
|
||||||
|
ZNOTE = devices.First(item => item.UniqueNo == x.DeviceUniqueNo).DeployPlace,
|
||||||
}).Where(x => x.ZWORKCODE.IsPresent()).ToList();
|
ZWORKCODE = x.UserUniqueNo.TrimEnd('\0')
|
||||||
|
})
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
if (requests.Any())
|
if (requests.Any())
|
||||||
{
|
{
|
||||||
@@ -63,10 +60,10 @@ public class SyncOriginCardInfoJob : BaseJob
|
|||||||
if (r.OLX == "0")
|
if (r.OLX == "0")
|
||||||
{
|
{
|
||||||
await DbContext.Updateable<DeviceUploadLogEntity>()
|
await DbContext.Updateable<DeviceUploadLogEntity>()
|
||||||
.SetColumns(x => x.Sync == true)
|
.SetColumns(x => x.Sync == true)
|
||||||
.SetColumns(x => x.ModifiedTime == DateTime.Now)
|
.SetColumns(x => x.ModifiedTime == DateTime.Now)
|
||||||
.Where(x => ids.Contains(x.Id))
|
.Where(x => ids.Contains(x.Id))
|
||||||
.ExecuteCommandAsync();
|
.ExecuteCommandAsync();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -80,4 +77,4 @@ public class SyncOriginCardInfoJob : BaseJob
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Dlhis.ScheduledTask.Common.Services;
|
||||||
using Kurisu.AspNetCore.Startup;
|
using Kurisu.AspNetCore.Startup;
|
||||||
using Kurisu.AspNetCore.Utils;
|
using Kurisu.AspNetCore.Utils;
|
||||||
using Kurisu.AspNetCore.Utils.Extensions;
|
using Kurisu.AspNetCore.Utils.Extensions;
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class DeviceTaskAssignmentService : IDeviceTaskAssignmentService
|
|||||||
.LeftJoin<DeviceEntity>((deviceTask, ga, device) => deviceTask.DeviceUniqueNo == device.UniqueNo)
|
.LeftJoin<DeviceEntity>((deviceTask, ga, device) => deviceTask.DeviceUniqueNo == device.UniqueNo)
|
||||||
.WhereIF(request.Type.HasValue, (deviceTask, ga, device) => deviceTask.DeviceType == request.Type)
|
.WhereIF(request.Type.HasValue, (deviceTask, ga, device) => deviceTask.DeviceType == request.Type)
|
||||||
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true && request.SearchDateTimePeriod?.End.HasValue == true,
|
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true && request.SearchDateTimePeriod?.End.HasValue == true,
|
||||||
deviceTask => deviceTask.CreateTime >= request.SearchDateTimePeriod.Start && deviceTask.CreateTime <= request.SearchDateTimePeriod.End
|
deviceTask => deviceTask.ModifiedTime >= request.SearchDateTimePeriod.Start && deviceTask.ModifiedTime <= request.SearchDateTimePeriod.End
|
||||||
)
|
)
|
||||||
.WhereIF(request.TaskTypes.IsPresent(), deviceTask => request.TaskTypes.Contains(deviceTask.Type))
|
.WhereIF(request.TaskTypes.IsPresent(), deviceTask => request.TaskTypes.Contains(deviceTask.Type))
|
||||||
.WhereIF(request.Status.IsPresent(), deviceTask => request.Status.Contains(deviceTask.Status))
|
.WhereIF(request.Status.IsPresent(), deviceTask => request.Status.Contains(deviceTask.Status))
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
|
|
||||||
namespace Dlhis.Sys.Identity.Controllers;
|
namespace Dlhis.Sys.Identity.Controllers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 租户
|
||||||
|
/// </summary>
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
@@ -84,7 +87,7 @@ public class TenantsController : ControllerBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取我的管理租户
|
/// 获取我管理的租户
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("my")]
|
[HttpGet("my")]
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
|
|
||||||
namespace Dlhis.Sys.Identity.Controllers;
|
namespace Dlhis.Sys.Identity.Controllers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户租户
|
||||||
|
/// </summary>
|
||||||
[Authorize(Roles = "admin")]
|
[Authorize(Roles = "admin")]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
|
|||||||
Reference in New Issue
Block a user