using Dapper; using Ewide.Core; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ewide.Application.Service { /// /// 房屋流转日志 /// [ApiDescriptionSettings(Name = "HouseLog", Order = 210)] public class HouseLogService : IHouseLogService, IDynamicApiController, ITransient { private readonly IDapperRepository _dapperRep; private readonly IUserManager _userManager; private readonly IRepository _bsHouseLogRep; public HouseLogService(IDapperRepository dapperRep, IUserManager userManager, IRepository bsHouseLogRep) { _dapperRep = dapperRep; _userManager = userManager; _bsHouseLogRep = bsHouseLogRep; } [NonAction] [UnitOfWork] public async Task Add(string houseCodeId, SysUser targetUser, HouseLogType type, string remark = null, int? sort = null) { return await Add(houseCodeId, new List { targetUser }, type, remark, sort); } [NonAction] [UnitOfWork] public async Task Add(string houseCodeId, List targetUsers, HouseLogType type, string remark = null, int? sort = null) { if (!sort.HasValue) { sort = await _bsHouseLogRep.DetachedEntities.Where(p => p.HouseCodeId.Equals(houseCodeId)).MaxAsync(p => p.Sort); } var _sort = sort.GetValueOrDefault(1) + 1; await new BsHouseLog { Id = Guid.NewGuid().ToString(), HouseCodeId = houseCodeId, TargetUserIds = String.Join(",", targetUsers.Select(p => p.Id)), Type = type, Status = HouseLogStatus.Handle, Remark = remark, Sort = _sort }.InsertAsync(); return _sort; } [NonAction] [UnitOfWork] public async Task Read(string houseCodeId) { var log = await _bsHouseLogRep .Where(p => p.HouseCodeId.Equals(houseCodeId) && p.Status.Equals(HouseLogStatus.Handle)) .OrderByDescending(p => p.CreatedTime) .FirstOrDefaultAsync(); if (log != null) { log.Status = HouseLogStatus.Handling; await log.UpdateAsync(); } } [NonAction] [UnitOfWork] public async Task Done(string houseCodeId) { var log = await _bsHouseLogRep .Where(p => p.HouseCodeId.Equals(houseCodeId) && !p.Status.Equals(HouseLogStatus.Handled)) .OrderByDescending(p => p.CreatedTime) .FirstOrDefaultAsync(); if (log != null) { log.Status = HouseLogStatus.Handled; log.FinishedTime = DateTime.Now; log.FinishedUserId = _userManager.UserId; log.FinishedUserName = _userManager.User.Account; await log.UpdateAsync(); } } [NonAction] [UnitOfWork] public async Task AddThenRead(string houseCodeId, SysUser targetUser, HouseLogType type, string remark = null, int? sort = null) { return await AddThenRead(houseCodeId, new List { targetUser }, type, remark, sort); } [NonAction] [UnitOfWork] public async Task AddThenRead(string houseCodeId, List targetUsers, HouseLogType type, string remark = null, int? sort = null) { if (!sort.HasValue) { sort = await _bsHouseLogRep.DetachedEntities.Where(p => p.HouseCodeId.Equals(houseCodeId)).MaxAsync(p => p.Sort); } var _sort = sort.GetValueOrDefault(1) + 1; await new BsHouseLog { Id = Guid.NewGuid().ToString(), HouseCodeId = houseCodeId, TargetUserIds = String.Join(",", targetUsers.Select(p => p.Id)), Type = type, Status = HouseLogStatus.Handling, Remark = remark, Sort = _sort }.InsertAsync(); return _sort; } [NonAction] [UnitOfWork] public async Task AddThenDone(string houseCodeId, SysUser targetUser, HouseLogType type, string remark = null, int? sort = null) { return await AddThenDone(houseCodeId, new List { targetUser }, type, remark, sort); } [NonAction] [UnitOfWork] public async Task AddThenDone(string houseCodeId, List targetUsers, HouseLogType type, string remark = null, int? sort = null) { if (!sort.HasValue) { sort = await _bsHouseLogRep.DetachedEntities.Where(p => p.HouseCodeId.Equals(houseCodeId)).MaxAsync(p => p.Sort); } var _sort = sort.GetValueOrDefault(1) + 1; await new BsHouseLog { Id = Guid.NewGuid().ToString(), HouseCodeId = houseCodeId, TargetUserIds = String.Join(",", targetUsers.Select(p => p.Id)), Type = type, Status = HouseLogStatus.Handled, Remark = remark, FinishedTime = DateTime.Now, FinishedUserId = _userManager.UserId, FinishedUserName = _userManager.User.Account, Sort = _sort }.InsertAsync(); return _sort; } [HttpGet("/houseLog/list")] public async Task List([FromQuery] HouseLogInput input) { var sql = @"SELECT HL.Id, HL.Type, HL.`Status`, HL.Remark, HL.FinishedTime, HL.FinishedUserId, IFNULL(NickName, `Name`) FinishedUserName, (SELECT GROUP_CONCAT(IFNULL(NickName,`Name`)) FROM sys_user WHERE Id IN ( SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(_HL.TargetUserIds,',',HT.help_topic_id + 1),',',-1) FROM bs_house_log _HL JOIN mysql.help_topic HT ON HT.help_topic_id < (LENGTH(_HL.TargetUserIds) - LENGTH(REPLACE(_HL.TargetUserIds,',','')) + 1) WHERE _HL.Id = HL.Id ) ) TargetUserNames FROM bs_house_log HL LEFT JOIN sys_user SU ON HL.FinishedUserId = SU.Id WHERE HouseCodeId = @HouseCodeId ORDER BY Sort DESC"; return await _dapperRep.QueryAsync(sql, new { houseCodeId = input.Id }); } [HttpGet("/houseLog/listByInfoId")] public async Task ListByInfoId([FromQuery] HouseLogInput input) { var info = await Db.GetRepository().DetachedEntities.FirstOrDefaultAsync(p => p.Id.Equals(input.Id)); return await List(new HouseLogInput { Id = info.HouseCodeId }); } [HttpGet("/houseLog/listByTaskId")] public async Task ListByTaskId([FromQuery] HouseLogInput input) { var task = await Db.GetRepository().DetachedEntities.FirstOrDefaultAsync(p => p.Id.Equals(input.Id)); return await List(new HouseLogInput { Id = task.HouseCodeId }); } } }