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.

486 lines
20 KiB

using AutoMapper.Internal.Mappers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Shentun.Peis.CustomerOrgGroupDetails;
using Shentun.Peis.CustomerOrgGroups;
using Shentun.Peis.CustomerOrgs;
using Shentun.Peis.HelperDto;
using Shentun.Peis.Models;
using Shentun.Peis.PatientRegisters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
using Xceed.Document.NET;
namespace Shentun.Peis.CustomerOrgGroups
{
/// <summary>
/// 团检分组
/// </summary>
[ApiExplorerSettings(GroupName = "Work")]
[Authorize]
public class CustomerOrgGroupAppService : CrudAppService<
CustomerOrgGroup, //The Book entity
CustomerOrgGroupDto, //Used to show books
Guid, //Primary key of the book entity
PagedAndSortedResultRequestDto, //Used for paging/sorting
CreateCustomerOrgGroupDto,
UpdateCustomerOrgGroupDto>
{
private readonly IRepository<CustomerOrgRegister, Guid> _customerOrgRegisterRepository;
private readonly ICustomerOrgGroupDetailRepository _customerOrgGroupDetailRepository;
private readonly IRepository<IdentityUser, Guid> _userRepository;
private readonly CustomerOrgGroupManager _manager;
private readonly CacheService _cacheService;
private readonly CustomerOrgGroupDetailManager _customerOrgGroupDetailManager;
public CustomerOrgGroupAppService(
IRepository<CustomerOrgGroup, Guid> repository,
IRepository<CustomerOrgRegister, Guid> customerOrgRegisterRepository,
ICustomerOrgGroupDetailRepository customerOrgGroupDetailRepository,
IRepository<IdentityUser, Guid> userRepository,
CustomerOrgGroupManager manager,
CacheService cacheService,
CustomerOrgGroupDetailManager customerOrgGroupDetailManager)
: base(repository)
{
this._customerOrgRegisterRepository = customerOrgRegisterRepository;
_customerOrgGroupDetailRepository = customerOrgGroupDetailRepository;
_userRepository = userRepository;
_manager = manager;
_cacheService = cacheService;
_customerOrgGroupDetailManager = customerOrgGroupDetailManager;
}
/// <summary>
/// 获取通过主键
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public override async Task<CustomerOrgGroupDto> GetAsync(Guid id)
{
var entityDto = await base.GetAsync(id);
entityDto.CreatorName = _cacheService.GetSurnameAsync(entityDto.CreatorId).Result;
entityDto.LastModifierName = _cacheService.GetSurnameAsync(entityDto.LastModifierId).Result;
return entityDto;
}
/// <summary>
/// 获取列表 团检分组
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[RemoteService(false)]
public override async Task<PagedResultDto<CustomerOrgGroupDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
return await base.GetListAsync(input);
}
[RemoteService(false)]
public override Task<CustomerOrgGroupDto> CreateAsync(CreateCustomerOrgGroupDto input)
{
return base.CreateAsync(input);
}
/// <summary>
/// 获取列表 团检分组 可以带名字 次数 单位ID 检查
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("api/app/customerorggroup/getlistinfilter")]
public async Task<List<CustomerOrgGroupOrCustomerOrgDto>> GetListInFilterAsync(GetListDto input)
{
var oldlist = (await Repository.GetQueryableAsync()).
Include(x => x.CustomerOrgRegister).
Include(x => x.CustomerOrgRegister.CustomerOrg).AsEnumerable();
if (!string.IsNullOrEmpty(input.Filter))
oldlist = oldlist.Where(m => m.DisplayName.Contains(input.Filter));
if (input.CustomerOrgId != null && input.CustomerOrgId != Guid.Empty)
oldlist = oldlist.Where(m => m.CustomerOrgRegister.CustomerOrg.Id == input.CustomerOrgId);
if (input.CustomerOrgRegisterId != null && input.CustomerOrgRegisterId != Guid.Empty)
oldlist = oldlist.Where(m => m.CustomerOrgRegisterId == input.CustomerOrgRegisterId);
if (input.MedicalTimes != null)
oldlist = oldlist.Where(m => m.CustomerOrgRegister.MedicalTimes == input.MedicalTimes);
var entdto = oldlist.OrderBy(o => o.CustomerOrgRegister.CustomerOrg.DisplayOrder)
.ThenBy(o => o.CustomerOrgRegister.MedicalTimes)
.ThenBy(o => o.DisplayOrder)
.Select(s => new CustomerOrgGroupOrCustomerOrgDto
{
CreationTime = s.CreationTime,
CreatorId = s.CreatorId,
DisplayName = s.DisplayName,
DisplayOrder = s.DisplayOrder,
Id = s.Id,
LastModificationTime = s.LastModificationTime,
LastModifierId = s.LastModifierId,
Price = s.Price,
ForSexId = s.ForSexId,
Remark = s.Remark,
MaritalStatusId = s.MaritalStatusId,
JobTitle = s.JobTitle,
JobPost = s.JobPost,
AgeUpperLimit = s.AgeUpperLimit,
AgeLowerLimit = s.AgeLowerLimit,
CreatorName = _cacheService.GetSurnameAsync(s.CreatorId).Result,
LastModifierName = _cacheService.GetSurnameAsync(s.LastModifierId).Result,
CustomerOrgId = s.CustomerOrgRegister.CustomerOrgId,
CustomerOrgName = s.CustomerOrgRegister.CustomerOrg.DisplayName,
MedicalTimes = s.CustomerOrgRegister.MedicalTimes,
CustomerOrgRegisterId = s.CustomerOrgRegisterId
}).OrderBy(m => m.DisplayOrder).ToList();
return entdto;
}
[HttpPost("api/app/CustomerOrgGroup/GetListForPatentRegisterByFilter")]
public async Task<List<CustomerOrgGroupForPatientRegisterDto>> GetListForPatentRegisterByFilterAsync(GetListDto input)
{
var oldlist = (await Repository.GetQueryableAsync()).
Include(x => x.CustomerOrgRegister).
Include(x => x.CustomerOrgRegister.CustomerOrg).AsEnumerable();
if (!string.IsNullOrEmpty(input.Filter))
oldlist = oldlist.Where(m => m.DisplayName.Contains(input.Filter));
if (input.CustomerOrgId != null && input.CustomerOrgId != Guid.Empty)
oldlist = oldlist.Where(m => m.CustomerOrgRegister.CustomerOrg.Id == input.CustomerOrgId);
if (input.CustomerOrgRegisterId != null && input.CustomerOrgRegisterId != Guid.Empty)
oldlist = oldlist.Where(m => m.CustomerOrgRegisterId == input.CustomerOrgRegisterId);
if (input.MedicalTimes != null)
oldlist = oldlist.Where(m => m.CustomerOrgRegister.MedicalTimes == input.MedicalTimes);
var entdto = oldlist.OrderBy(o => o.CustomerOrgRegister.CustomerOrg.DisplayOrder)
.ThenBy(o => o.CustomerOrgRegister.MedicalTimes)
.ThenBy(o => o.DisplayOrder)
.Select(s => new CustomerOrgGroupForPatientRegisterDto
{
Id = s.Id,
DisplayName = s.DisplayName,
DisplayOrder = s.DisplayOrder,
Price = s.Price,
ForSexId = s.ForSexId,
MaritalStatusId = s.MaritalStatusId,
JobTitle = s.JobTitle,
JobPost = s.JobPost,
AgeUpperLimit = s.AgeUpperLimit,
AgeLowerLimit = s.AgeLowerLimit,
CustomerOrgRegisterId = s.CustomerOrgRegisterId
}).OrderBy(m => m.DisplayOrder).ToList();
return entdto;
}
/// <summary>
/// 创建单位分组
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/customerorggroup/createcustomerorggroupincustomerorgregister")]
public async Task<CustomerOrgGroupDto> CreateCustomerOrgGroupInCustomerOrgRegisterAsync(CreateCustomerOrgGroupInCustomerOrgRegisterDto input)
{
var createEntity = ObjectMapper.Map<CreateCustomerOrgGroupDto, CustomerOrgGroup>(input);
var entity = await _manager.CreateAsync(input.IsMaxMedicalTimes, input.CustomerOrgRegisterId, input.CustomerOrgId, createEntity);
//检查体检次数是否完成
await _manager.CheckCustomerOrgRegisterStatus(entity.CustomerOrgRegisterId);
entity = await Repository.InsertAsync(entity);
var dto = ObjectMapper.Map<CustomerOrgGroup, CustomerOrgGroupDto>(entity);
return dto;
}
[HttpPost("api/app/CustomerOrgGroup/CreateCustomerOrgGroupWithDetail")]
public async Task<CustomerOrgGroupDto> CreateCustomerOrgGroupWithDetailAsync(CreateCustomerOrgGroupWithDetailDto input)
{
var createEntity = ObjectMapper.Map<CreateCustomerOrgGroupDto, CustomerOrgGroup>(input);
var entity = await _manager.CreateAsync(input.IsMaxMedicalTimes, input.CustomerOrgRegisterId, input.CustomerOrgId, createEntity);
//检查体检次数是否完成
await _manager.CheckCustomerOrgRegisterStatus(entity.CustomerOrgRegisterId);
entity = await Repository.InsertAsync(entity);
//插入明细
if (input.Details.Any())
{
var createEntityList = ObjectMapper.Map<List<CreateCustomerOrgGroupDetail_Detail>, List<CustomerOrgGroupDetail>>(input.Details);
var list = new List<CustomerOrgGroupDetail>();
foreach (var item in createEntityList)
{
item.CustomerOrgGroupId = entity.Id;
var customerOrgGroupDetail = _customerOrgGroupDetailManager.CreateAsync(item);
list.Add(customerOrgGroupDetail);
}
var sumMonkey = list.Sum(o => o.Price * o.Amount);
entity.Price = sumMonkey;
entity = await Repository.InsertAsync(entity);
await _customerOrgGroupDetailRepository.InsertManyAsync(list);
}
var dto = ObjectMapper.Map<CustomerOrgGroup, CustomerOrgGroupDto>(entity);
return dto;
}
/// <summary>
/// 更新
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <returns></returns>
public override async Task<CustomerOrgGroupDto> UpdateAsync(Guid id, UpdateCustomerOrgGroupDto input)
{
var entity = await Repository.GetAsync(id);
var sourceEntity = ObjectMapper.Map<UpdateCustomerOrgGroupDto, CustomerOrgGroup>(input);
//检查体检次数是否完成
await _manager.CheckCustomerOrgRegisterStatus(entity.CustomerOrgRegisterId);
await _manager.UpdateAsync(sourceEntity, entity);
//修改明细价格,只修改价格不为0的
var detailList = (await _customerOrgGroupDetailRepository.GetQueryableAsync()).
Where(o => o.CustomerOrgGroupId == id && o.Price != 0).ToList();
if (detailList.Any())
{
var sumMoney = detailList.Sum(o => o.Amount * o.Price);
if (entity.Price == 0)
{
foreach (var item in detailList)
{
item.Price = 0;
}
}
else
{
//按原来的比例重新计算
if (entity.Price != sumMoney)
{
var percentage = entity.Price / sumMoney;
foreach (var item in detailList)
{
item.Price = Math.Round(percentage * item.Price, 2);
}
//自动分摊小数
var newSumMoney = detailList.Sum(o => o.Amount * o.Price);
var differenceMoney = entity.Price - newSumMoney;
if (differenceMoney != 0)
{
foreach (var item in detailList)
{
//不允许算出负数,并且必须能反算出正确的价格
if ((item.Price * item.Amount + differenceMoney) ==
(item.Price + Math.Round((differenceMoney / item.Amount), 2)) * item.Amount &&
(item.Price + Math.Round((differenceMoney / item.Amount), 2)) > 0)
{
item.Price = item.Price + Math.Round((differenceMoney / item.Amount), 2);
break;
}
}
}
differenceMoney = entity.Price - detailList.Sum(o => o.Amount * o.Price);
if (differenceMoney != 0)
{
throw new UserFriendlyException("无法反算出组合项目价格");
}
}
}
}
entity = await Repository.UpdateAsync(entity);
if (detailList.Count() > 0)
{
await _customerOrgGroupDetailRepository.UpdateManyAsync(detailList);
}
return ObjectMapper.Map<CustomerOrgGroup, CustomerOrgGroupDto>(entity);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public override async Task DeleteAsync(Guid id)
{
await _manager.CheckAndDeleteAsync(id);
}
/// <summary>
/// 修改排序 置顶,置底
/// </summary>
/// <param name="id">需要修改的ID</param>
/// <param name="SortType">修改方式:1 置顶 2 置底</param>
/// <returns></returns>
[HttpPut("api/app/customerorggroup/updatemanysort")]
public async Task UpdateManySortAsync(Guid id, int SortType)
{
await _manager.UpdateManySortAsync(id, SortType);
}
/// <summary>
/// 修改排序 拖拽
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPut("api/app/customerorggroup/updatesortmany")]
public async Task UpdateSortManyAsync(UpdateSortManyDto input)
{
await _manager.UpdateSortManyAsync(input);
}
/// <summary>
/// 获取体检分组列表 按单位ID检索 查询最后一次
/// </summary>
/// <param name="CustomerOrgId"></param>
/// <returns></returns>
public async Task<List<CustomerOrgGroupDto>> GetListInCustomerOrgIdAsync(Guid CustomerOrgId)
{
var CustomerOrgRegisterId = (await _customerOrgRegisterRepository.GetListAsync(m => m.CustomerOrgId == CustomerOrgId))
.OrderByDescending(x => x.MedicalTimes).Select(s => s.Id).FirstOrDefault();
if (CustomerOrgRegisterId != Guid.Empty)
{
var entlist = await Repository.GetListAsync(m => m.CustomerOrgRegisterId == CustomerOrgRegisterId);
//var userList = await _userRepository.GetListAsync();
var entdto = entlist.Select(s => new CustomerOrgGroupDto
{
CreationTime = s.CreationTime,
CreatorId = s.CreatorId,
DisplayName = s.DisplayName,
DisplayOrder = s.DisplayOrder,
Id = s.Id,
LastModificationTime = s.LastModificationTime,
LastModifierId = s.LastModifierId,
Price = s.Price,
ForSexId = s.ForSexId,
Remark = s.Remark,
MaritalStatusId = s.MaritalStatusId,
JobTitle = s.JobTitle,
JobPost = s.JobPost,
AgeUpperLimit = s.AgeUpperLimit,
AgeLowerLimit = s.AgeLowerLimit,
CreatorName = _cacheService.GetSurnameAsync(s.CreatorId).Result,
LastModifierName = _cacheService.GetSurnameAsync(s.LastModifierId).Result,
CustomerOrgRegisterId = CustomerOrgRegisterId
}).ToList();
return entdto;
}
return new List<CustomerOrgGroupDto>();
}
/// <summary>
/// 复制上次分组
/// </summary>
/// <returns></returns>
[HttpPost("api/app/CustomerOrgGroup/CopyLastGrouping")]
public async Task CopyLastGroupingAsync(CustomerOrgRegisterIdInputDto input)
{
if (input == null)
throw new UserFriendlyException("请求参数有误");
var customerOrgRegisterEnt = await _customerOrgRegisterRepository.GetAsync(input.CustomerOrgRegisterId);
if (customerOrgRegisterEnt == null)
throw new UserFriendlyException("单位体检次数不存在");
if (customerOrgRegisterEnt.IsComplete == 'Y')
throw new UserFriendlyException("该单位体检次数已完成,无法复制");
var prevCustomerOrgRegister = (await _customerOrgRegisterRepository.GetQueryableAsync())
.Where(m => m.CustomerOrgId == customerOrgRegisterEnt.CustomerOrgId && m.MedicalTimes < customerOrgRegisterEnt.MedicalTimes)
.OrderByDescending(o => o.MedicalTimes).FirstOrDefault();
if (prevCustomerOrgRegister != null)
{
#region 创建分组、明细
//上一次体检次数的分组
var prevCustomerOrgGroupList = (await Repository.GetQueryableAsync()).Where(m => m.CustomerOrgRegisterId == prevCustomerOrgRegister.Id);
foreach (var group in prevCustomerOrgGroupList)
{
Guid customerOrgGroupId = GuidGenerator.Create();
var newCustomerOrgGroup = new CustomerOrgGroup(customerOrgGroupId)
{
AgeLowerLimit = group.AgeLowerLimit,
AgeUpperLimit = group.AgeUpperLimit,
CustomerOrgRegisterId = customerOrgRegisterEnt.Id,
DisplayName = group.DisplayName,
DisplayOrder = group.DisplayOrder,
ForSexId = group.ForSexId,
JobPost = group.JobPost,
JobTitle = group.JobTitle,
MaritalStatusId = group.MaritalStatusId,
Price = group.Price,
Remark = group.Remark
};
await Repository.InsertAsync(newCustomerOrgGroup, true);
#region 创建分组明细
var prevCustomerOrgGroupDetailList = (await _customerOrgGroupDetailRepository.GetQueryableAsync()).Where(m => m.CustomerOrgGroupId == group.Id);
foreach (var customerOrgGroupDetail in prevCustomerOrgGroupDetailList)
{
var newcustomerOrgGroupDetail = new CustomerOrgGroupDetail
{
Amount = customerOrgGroupDetail.Amount,
AsbitemId = customerOrgGroupDetail.AsbitemId,
CustomerOrgGroupId = customerOrgGroupId,
Price = customerOrgGroupDetail.Price
};
await _customerOrgGroupDetailRepository.InsertAsync(newcustomerOrgGroupDetail);
}
#endregion
}
#endregion
}
else
{
throw new UserFriendlyException("上一次单位体检次数不存在");
}
}
}
}