田爽 1 년 전
부모
커밋
b6c3ea066b

+ 112 - 3
src/Hotline.Api/Controllers/OrderController.cs

@@ -36,6 +36,8 @@ using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 using StackExchange.Redis;
 using Order = Hotline.Orders.Order;
+using Hotline.Share.Dtos.Quality;
+using Hotline.Repository.SqlSugar.Orders;
 
 namespace Hotline.Api.Controllers;
 
@@ -72,9 +74,10 @@ public class OrderController : BaseController
     private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
     private readonly IQualityRepository _qualityRepository;
     private readonly IRepository<Workflow> _workflowRepository;
+    private readonly ICitizenRepository _citizenRepository;
 
 
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -102,7 +105,8 @@ public class OrderController : BaseController
         IRepository<OrderPublishHistory> orderPublishHistoryRepository,
         IRepositoryTextSearch<OrderTs> repositoryts,
         IQualityRepository qualityRepository,
-        IRepository<Workflow> workflowRepository
+        IRepository<Workflow> workflowRepository,
+        ICitizenRepository citizenRepository
 		)
     {
         _orderDomainService = orderDomainService;
@@ -133,6 +137,7 @@ public class OrderController : BaseController
         _repositoryts = repositoryts;
         _qualityRepository =qualityRepository;
         _workflowRepository = workflowRepository;
+		_citizenRepository = citizenRepository;
 }
 
     #region 工单发布
@@ -1617,5 +1622,109 @@ public class OrderController : BaseController
         return new PagedDto<OrderWaitedDto>(total, dtos);
     }
 
-    #endregion
+	#endregion
+
+	#region  市民信息
+
+	/// <summary>
+	/// 新增市民信息
+	/// </summary>
+	/// <param name="dtos"></param>
+	/// <returns></returns>
+	[Permission(EPermission.AddCitizen)]
+	[HttpPost("citizen")]
+	public async Task Add([FromBody] CitizenAddDto dto)
+	{
+		var citizen = await _citizenRepository.CountAsync(x=>x.PhoneNumber == dto.PhoneNumber, HttpContext.RequestAborted);
+		if (citizen > 0)
+			throw UserFriendlyException.SameMessage("市民联系电话信息重复");
+		await _citizenRepository.AddAsync(dto, HttpContext.RequestAborted);
+    }
+
+	/// <summary>
+	/// 删除市民信息
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.DeleteCitizen)]
+	[HttpDelete("citizen")]
+	public async Task Delete([FromBody] CitizenDeleteDto dto)
+	{
+		await _citizenRepository.RemoveAsync(x => x.Id == dto.Id);
+	}
+
+	/// <summary>
+	/// 更新市民信息
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.UpdateCitizen)]
+	[HttpPut("citizen")]
+	public async Task Update([FromBody] CitizenUpdateDto dto)
+	{
+		var citizen = await _citizenRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+		if (citizen is null)
+			throw UserFriendlyException.SameMessage("无效市民信息");
+		_mapper.Map(dto, citizen);
+		citizen.LastModificationName = _sessionContext.UserName;
+		await _citizenRepository.UpdateAsync(citizen, HttpContext.RequestAborted);
+	}
+
+	/// <summary>
+	/// 获取市民信息列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.CitizenList)]
+	[HttpGet("citizen/list")]
+	public async Task<PagedDto<CitizenDto>> List([FromQuery] CitizenListDto dto)
+	{
+		var (total, items) = await _citizenRepository.Queryable()
+			.OrderByDescending(x => x.CreationTime)
+			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+		return new PagedDto<CitizenDto>(total, _mapper.Map<IReadOnlyList<CitizenDto>>(items));
+	}
+
+	/// <summary>
+	/// 获取市民信息
+	/// </summary>
+	/// <param name="id"></param>
+	/// <returns></returns>
+	[Permission(EPermission.CitizenEntity)]
+	[HttpGet("citizen/{id}")]
+	public async Task<Citizen> CitizenEntity(string id)
+	{
+		return await _citizenRepository.Queryable()
+			.FirstAsync(x => x.Id == id);
+	}
+
+	/// <summary>
+	/// 获取市民信息
+	/// </summary>
+	/// <param name="id"></param>
+	/// <returns></returns>
+	[HttpGet("citizen_phone/{phone}")]
+	public async Task<object> Citizen(string phone)
+	{
+        //市民基本信息
+		var citizen = await _citizenRepository.Queryable()
+			.FirstAsync(x => x.PhoneNumber == phone);
+        //工单历史 
+        var oders = await _orderRepository.Queryable().Where(x => x.FromPhone == phone).OrderBy(x => x.CreationTime, OrderByType.Desc).ToListAsync();
+        var allOrderNum = oders.Count;
+        var endOrderNum = oders.Count(x => x.Status == EOrderStatus.Published || x.Status == EOrderStatus.Visited || x.Status == EOrderStatus.Filed);
+        var handOrderNum = oders.Count(x => x.Status == EOrderStatus.Handling || x.Status == EOrderStatus.Countersigning);
+		//来电历史
+        //TODO
+		//关注诉求
+		var hotspotNames = string.Join(",", oders.Select(x => x.HotspotName).Distinct().Take(5).ToList());
+		var rsp = new {
+            Citizen = citizen,
+            Order = new { allOrderNum  = allOrderNum , endOrderNum = endOrderNum , handOrderNum = handOrderNum },
+			CallHistory = new { },
+			HotspotNames = hotspotNames,
+		};
+        return rsp;
+	}
+	#endregion
 }

+ 47 - 0
src/Hotline.Repository.SqlSugar/Orders/CitizenRepository.cs

@@ -0,0 +1,47 @@
+using Hotline.Orders;
+using Hotline.Quality;
+using MapsterMapper;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using SqlSugar;
+using XF.Domain.Authentications;
+using XF.Domain.Dependency;
+using Hotline.Share.Dtos.Quality;
+using Hotline.Share.Enums.Quality;
+using Hotline.Share.Dtos.Order;
+
+namespace Hotline.Repository.SqlSugar.Orders
+{
+	public class CitizenRepository : BaseRepository<Citizen>, ICitizenRepository, IScopeDependency
+	{
+		private readonly ISessionContext _sessionContext;
+		private readonly IMapper _mapper;
+		private readonly IOrderRepository _orderRepository;
+
+		public CitizenRepository(
+			ISugarUnitOfWork<HotlineDbContext> uow,
+			IDataPermissionFilterBuilder dataPermissionFilterBuilder,
+			ISessionContext sessionContext,
+			IOrderRepository orderRepository,
+			IMapper mapper
+		) : base(uow, dataPermissionFilterBuilder)
+		{
+			_sessionContext = sessionContext;
+			_orderRepository = orderRepository;
+			_mapper = mapper;
+		}
+
+		public async Task AddAsync(CitizenAddDto citizen, CancellationToken cancellationToken)
+		{
+			var firstCallTime = await _orderRepository.Queryable().Where(x => x.FromPhone == citizen.PhoneNumber).MinAsync(x => x.CreationTime);
+			firstCallTime = firstCallTime == null ? DateTime.Now : firstCallTime;
+			citizen.FirstCallTime = firstCallTime;
+			var addCitizen = _mapper.Map<Citizen>(citizen);
+			await AddAsync(addCitizen, cancellationToken);
+		}
+	}
+}

+ 191 - 0
src/Hotline.Share/Dtos/Order/CitizenDto.cs

@@ -0,0 +1,191 @@
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Requests;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Order
+{
+	public class CitizenAddDto
+	{
+		/// <summary>
+		/// 电话
+		/// </summary>
+		public string PhoneNumber { get; set; }
+
+		/// <summary>
+		/// 姓名
+		/// </summary>
+		public string Name { get; set; }
+
+		/// <summary>
+		/// 性别
+		/// </summary>
+		public EGender Gender { get; set; }
+
+		/// <summary>
+		/// 市民身份
+		/// </summary>
+		public EIdentityType IdentityType { get; set; }
+
+		/// <summary>
+		/// 证件类型
+		/// </summary>
+		public string? LicenceType { get; set; }
+
+		/// <summary>
+		/// 证件号码
+		/// </summary>
+		public string? LicenceNo { get; set; }
+
+		/// <summary>
+		/// 年龄段
+		/// </summary>
+		public string? AgeRange { get; set; }
+
+		/// <summary>
+		/// 联系电话
+		/// </summary>
+		public string? Contact { get; set; }
+
+		/// <summary>
+		/// 联系电话脱敏
+		/// </summary>
+		public string? ContactMask { get; set; }
+
+		/// <summary>
+		/// 市民标签
+		/// </summary>
+		public string? Label { get; set; }
+
+		/// <summary>
+		/// 更新人
+		/// </summary>
+		public string? LastModificationName { get; set; }
+
+		/// <summary>
+		/// 首次来电时间
+		/// </summary>
+		public DateTime? FirstCallTime { get; set; }
+	}
+	public class CitizenDeleteDto
+	{
+		public string Id { get; set; }
+	}
+	public class CitizenUpdateDto : CitizenAddDto
+	{
+		public string Id { get; set; }
+	}
+	public record CitizenListDto : PagedKeywordRequest
+	{
+		/// <summary>
+		/// 电话
+		/// </summary>
+		public string? PhoneNumber { get; set; }
+
+		/// <summary>
+		/// 市民标签
+		/// </summary>
+		public string? Label { get; set; }
+	}
+	public class CitizenBaseDto
+	{
+		public DateTime? LastModificationTime { get; set; }
+
+		public bool IsDeleted { get; set; }
+
+		/// <summary>
+		/// 删除时间
+		/// </summary>
+		public DateTime? DeletionTime { get; set; }
+
+
+		/// <summary>
+		/// 创建时间
+		/// </summary>
+		public DateTime CreationTime { get; set; }
+
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 组织Id
+		/// </summary>
+		public string? CreatorOrgId { get; set; }
+
+
+		public string? CreatorOrgName { get; set; }
+
+		/// <summary>
+		/// 创建人
+		/// </summary>
+		public string? CreatorId { get; set; }
+
+		public string? CreatorName { get; set; }
+	}
+
+	public class CitizenDto : CitizenBaseDto
+	{
+		/// <summary>
+		/// 电话
+		/// </summary>
+		public string PhoneNumber { get; set; }
+
+		/// <summary>
+		/// 姓名
+		/// </summary>
+		public string Name { get; set; }
+
+		/// <summary>
+		/// 性别
+		/// </summary>
+		public EGender Gender { get; set; }
+
+		/// <summary>
+		/// 市民身份
+		/// </summary>
+		public EIdentityType IdentityType { get; set; }
+
+		/// <summary>
+		/// 证件类型
+		/// </summary>
+		public string? LicenceType { get; set; }
+
+		/// <summary>
+		/// 证件号码
+		/// </summary>
+		public string? LicenceNo { get; set; }
+
+		/// <summary>
+		/// 年龄段
+		/// </summary>
+		public string? AgeRange { get; set; }
+
+		/// <summary>
+		/// 联系电话
+		/// </summary>
+		public string? Contact { get; set; }
+
+		/// <summary>
+		/// 联系电话脱敏
+		/// </summary>
+		public string? ContactMask { get; set; }
+
+		/// <summary>
+		/// 市民标签
+		/// </summary>
+		public string? Label { get; set; }
+
+		/// <summary>
+		/// 更新人
+		/// </summary>
+		public string? LastModificationName { get; set; }
+
+		/// <summary>
+		/// 首次来电时间
+		/// </summary>
+		public DateTime? FirstCallTime { get; set; }
+
+	}
+}

+ 0 - 1
src/Hotline/Orders/Citizen.cs

@@ -10,7 +10,6 @@ using XF.Domain.Repository;
 
 namespace Hotline.Orders
 {
-
 	[Description("市民")]
 	public class Citizen : FullStateEntity
 	{

+ 10 - 0
src/Hotline/Orders/ICitizenRepository.cs

@@ -0,0 +1,10 @@
+using Hotline.Share.Dtos.Order;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+	public interface ICitizenRepository : IRepository<Citizen>
+	{
+		Task AddAsync(CitizenAddDto citizen, CancellationToken cancellationToken);
+	}
+}

+ 36 - 2
src/Hotline/Permissions/EPermission.cs

@@ -1124,6 +1124,7 @@ namespace Hotline.Permissions
 		[Display(GroupName = "Quality", Name = "甄别详情", Description = "甄别详情")]
 		QualityEntity = 500904,
 		#endregion
+
 		#region 质检项目管理
 		/// <summary>
 		/// 新增质检项目
@@ -1227,10 +1228,43 @@ namespace Hotline.Permissions
 
 		#endregion
 
+		#region 市民管理
+
+		/// <summary>
+		/// 新增市民信息
+		/// </summary>
+		[Display(GroupName = "Citizen", Name = "新增市民信息", Description = "新增市民信息")]
+		AddCitizen = 504001,
+
+		/// <summary>
+		/// 删除市民信息
+		/// </summary>
+		[Display(GroupName = "Citizen", Name = "删除市民信息", Description = "删除市民信息")]
+		DeleteCitizen = 504002,
+
+		/// <summary>
+		/// 修改市民信息
+		/// </summary>
+		[Display(GroupName = "Citizen", Name = "修改市民信息", Description = "修改市民信息")]
+		UpdateCitizen = 504003,
+
+		/// <summary>
+		/// 市民信息列表
+		/// </summary>
+		[Display(GroupName = "Citizen", Name = "市民信息列表", Description = "市民信息列表")]
+		CitizenList = 504004,
+
+		/// <summary>
+		/// 市民信息实体
+		/// </summary>
+		[Display(GroupName = "Citizen", Name = "市民信息实体", Description = "市民信息实体")]
+		CitizenEntity = 504005,
+		#endregion
+
 		#endregion
 
-        #region 辅助功能(600)
-        [Display(GroupName = "辅助功能", Name = "辅助功能", Description = "辅助功能")]
+		#region 辅助功能(600)
+		[Display(GroupName = "辅助功能", Name = "辅助功能", Description = "辅助功能")]
         Auxiliary = 600000,
 
         #region 公告列表