FlowTodoRepository.cs 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using GxPress.Common.AppOptions;
  5. using GxPress.Common.Tools;
  6. using GxPress.Entity.WorkFlow;
  7. using GxPress.EnumConst;
  8. using GxPress.Repository.Interface.WorkFlow;
  9. using GxPress.Request.App.Flow;
  10. using Microsoft.Extensions.Options;
  11. using Datory;
  12. using SqlKata;
  13. using Dapper;
  14. namespace GxPress.Repository.Implement.WorkFlow
  15. {
  16. public class FlowTodoRepository : IFlowTodoRepository
  17. {
  18. private readonly Repository<FlowTodo> _repository;
  19. private readonly Repository<Entity.User> _userRepository;
  20. private readonly IFlowFieldValueRepository _flowFieldValueRepository;
  21. private readonly Repository<Flow> _flowRepository;
  22. private readonly Repository<Entity.WorkProcess.Process> _processRepository;
  23. private readonly string _connectionString;
  24. private readonly string _databaseTypeStr;
  25. public FlowTodoRepository(IOptionsMonitor<DatabaseOptions> dbOptionsAccessor, IFlowFieldValueRepository flowFieldValueRepository)
  26. {
  27. _databaseTypeStr = dbOptionsAccessor.CurrentValue.DatabaseType;
  28. _connectionString = dbOptionsAccessor.CurrentValue.ConnectionString;
  29. var databaseType = StringUtils.ToEnum<DatabaseType>(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql);
  30. var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString);
  31. _repository = new Repository<FlowTodo>(database);
  32. _flowFieldValueRepository = flowFieldValueRepository;
  33. _userRepository = new Repository<Entity.User>(database);
  34. _flowRepository = new Repository<Flow>(database);
  35. _processRepository = new Repository<Entity.WorkProcess.Process>(database);
  36. }
  37. public IDatabase Database => _repository.Database;
  38. public string TableName => _repository.TableName;
  39. public List<TableColumn> TableColumns => _repository.TableColumns;
  40. public async Task<int> InsertAsync(FlowTodo item)
  41. {
  42. var id = await _repository.InsertAsync(item);
  43. item = await _repository.GetAsync(id);
  44. if (item.Sort == 0)
  45. {
  46. item.Sort = item.Id;
  47. await _repository.UpdateAsync(item);
  48. }
  49. return id;
  50. }
  51. public async Task<int> GetCountByUserIdAsync(int userId)
  52. {
  53. return await _repository.CountAsync(Q
  54. .Where(nameof(FlowTodo.UserId), userId)
  55. .WhereNot(nameof(FlowTodo.ProcessId), 0)
  56. .WhereNot(nameof(FlowTodo.FlowId), 0).Where(nameof(FlowTodo.IsDone), false).Where(nameof(FlowTodo.Type), nameof(EnumConst.TodoTypeConst.ApproverCheck))
  57. );
  58. }
  59. public async Task<IEnumerable<FlowTodo>> GetListByUserIdAsync(int userId, int processId, int page, int perPage)
  60. {
  61. var query = Q
  62. .Where(nameof(FlowTodo.UserId), userId)
  63. .WhereNot(nameof(FlowTodo.ProcessId), 0)
  64. .WhereNot(nameof(FlowTodo.FlowId), 0).Where(nameof(FlowTodo.IsDone), false).Where(nameof(FlowTodo.IsOperate), true)
  65. .ForPage(page, perPage)
  66. .OrderByDesc(nameof(FlowTodo.Id));
  67. if (processId > 0)
  68. {
  69. query.Where(nameof(FlowTodo.ProcessId), processId);
  70. }
  71. return await _repository.GetAllAsync(query);
  72. }
  73. public async Task<IEnumerable<FlowTodo>> GetListByFlowIdAsync(int flowId)
  74. {
  75. string sql = $@"
  76. SELECT
  77. a.*
  78. FROM
  79. tede_flow_todo a
  80. INNER JOIN
  81. tede_user b ON a.UserId = b.Id
  82. WHERE
  83. a.FlowId = {flowId} ORDER BY a.sort asc,a.LastModifiedDate asc";
  84. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  85. var database = new Database(databaseType, _connectionString);
  86. var connection = database.GetConnection();
  87. var result =
  88. await connection
  89. .QueryAsync<FlowTodo>(sql);
  90. return result;
  91. }
  92. public async Task<bool> DeleteAsync(int todoId)
  93. {
  94. return await _repository.DeleteAsync(todoId);
  95. }
  96. public async Task<bool> DeleteAllAsync(int flowId)
  97. {
  98. return await _repository.DeleteAsync(Q
  99. .Where(nameof(FlowTodo.FlowId), flowId)
  100. ) > 0;
  101. }
  102. /// <summary>
  103. /// 已审批
  104. /// </summary>
  105. /// <param name="userId"></param>
  106. /// <param name="type"></param>
  107. /// <param name="isDone"></param>
  108. /// <param name="request"></param>
  109. /// <returns></returns>
  110. public async Task<IEnumerable<(int FlowId, int TodoId)>> GetMyCheckedTodoIdFlowIdListAsync(int userId, string type, bool isDone, FlowListRequest request)
  111. {
  112. string sql = $@"
  113. SELECT
  114. a.FlowId,a.Id
  115. FROM
  116. tede_flow_todo a
  117. INNER JOIN
  118. tede_process b ON a.ProcessId = b.id
  119. INNER JOIN
  120. tede_flow c ON c.Id = a.FlowId
  121. INNER JOIN
  122. tede_user d on d.Id=a.UserId
  123. INNER JOIN
  124. tede_user e on e.Id=c.UserId
  125. WHERE
  126. a.UserId = {userId}
  127. AND a.Type = '{type}'";
  128. if (isDone)
  129. sql += $@"AND a.IsDone = 1";
  130. else sql += $@"AND a.IsDone = 0 AND a.IsOperate = 1";
  131. if (!string.IsNullOrWhiteSpace(request.Keyword))
  132. {
  133. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  134. OR a.FlowId IN (SELECT
  135. FlowId
  136. FROM
  137. tede_flow_field_value
  138. WHERE
  139. StringValues LIKE '%{request.Keyword}%')
  140. OR c.UserId IN (SELECT
  141. Id
  142. FROM
  143. tede_user
  144. WHERE
  145. Name LIKE '%{request.Keyword}%')
  146. or a.FlowId In(SELECT
  147. FlowId
  148. FROM
  149. tede_flow_todo
  150. WHERE
  151. UserId IN (SELECT
  152. Id
  153. FROM
  154. tede_user
  155. WHERE
  156. Name LIKE '%{request.Keyword}%'))
  157. or a.FlowId In(SELECT
  158. FlowId
  159. FROM
  160. tede_flow_message
  161. WHERE
  162. Message LIKE '%{request.Keyword}%'))";
  163. }
  164. if (request.ProcessIds.Count > 0)
  165. {
  166. var processId = "";
  167. foreach (var item in request.ProcessIds)
  168. {
  169. if (item == 0)
  170. continue;
  171. processId += $"{item},";
  172. }
  173. if (!string.IsNullOrWhiteSpace(processId))
  174. {
  175. processId = processId.Remove(processId.Length - 1, 1);
  176. sql += $" AND b.Id IN ({processId})";
  177. }
  178. }
  179. sql += $" ORDER BY a.CreatedDate DESC limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  180. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  181. var database = new Database(databaseType, _connectionString);
  182. var connection = database.GetConnection();
  183. var result =
  184. await connection
  185. .QueryAsync<(int FlowId, int TodoId)>(sql);
  186. return result;
  187. }
  188. public async Task<IEnumerable<(int TodoId, int FlowId)>> GetTodoIdFlowIdListAsync(int userId, string type, bool isDone, FlowListRequest request)
  189. {
  190. string sql = $@"SELECT
  191. a.Id,a.FlowId
  192. FROM
  193. tede_flow_todo a
  194. INNER JOIN
  195. tede_process b ON a.ProcessId = b.id
  196. INNER JOIN
  197. tede_flow c ON c.Id = a.FlowId
  198. INNER JOIN
  199. tede_user d on d.Id=a.UserId
  200. INNER JOIN
  201. tede_user e on e.Id=c.UserId
  202. WHERE
  203. a.UserId = {userId}
  204. AND a.Type = '{type}'";
  205. if (isDone)
  206. sql += $@"AND a.IsDone = 1";
  207. else sql += $@"AND a.IsDone = 0 AND a.IsOperate = 1";
  208. if (!string.IsNullOrWhiteSpace(request.Keyword))
  209. {
  210. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  211. OR a.FlowId IN (SELECT
  212. FlowId
  213. FROM
  214. tede_flow_field_value
  215. WHERE
  216. StringValues LIKE '%{request.Keyword}%')
  217. OR c.UserId IN (SELECT
  218. Id
  219. FROM
  220. tede_user
  221. WHERE
  222. Name LIKE '%{request.Keyword}%')
  223. or a.FlowId In(SELECT
  224. FlowId
  225. FROM
  226. tede_flow_todo
  227. WHERE
  228. UserId IN (SELECT
  229. Id
  230. FROM
  231. tede_user
  232. WHERE
  233. Name LIKE '%{request.Keyword}%'))
  234. or a.FlowId In(SELECT
  235. FlowId
  236. FROM
  237. tede_flow_message
  238. WHERE
  239. Message LIKE '%{request.Keyword}%'))";
  240. }
  241. if (request.ProcessIds.Count > 0)
  242. {
  243. var processId = "";
  244. foreach (var item in request.ProcessIds)
  245. {
  246. if (item == 0)
  247. continue;
  248. processId += $"{item},";
  249. }
  250. if (!string.IsNullOrWhiteSpace(processId))
  251. {
  252. processId = processId.Remove(processId.Length - 1, 1);
  253. sql += $" AND b.Id IN ({processId})";
  254. }
  255. }
  256. sql += $" ORDER BY a.CreatedDate DESC limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  257. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  258. var database = new Database(databaseType, _connectionString);
  259. var connection = database.GetConnection();
  260. var result =
  261. await connection
  262. .QueryAsync<(int TodoId, int FlowId)>(sql);
  263. return result;
  264. // var query = Q
  265. // .Select(nameof(FlowTodo.Id), nameof(FlowTodo.FlowId))
  266. // .WhereNot(nameof(FlowTodo.ProcessId), 0)
  267. // .Where(nameof(FlowTodo.UserId), userId)
  268. // .Where(nameof(FlowTodo.Type), type)
  269. // .Where(nameof(FlowTodo.IsDone), isDone)
  270. // .ForPage(request.Page, request.PerPage)
  271. // .OrderByDesc(nameof(FlowTodo.Id));
  272. // if (type == nameof(TodoTypeConst.ApproverCheck) && !isDone)
  273. // {
  274. // query.Where(nameof(FlowTodo.IsOperate), true);
  275. // }
  276. // if (request.ProcessIds != null && request.ProcessIds.Any() && !request.ProcessIds.Contains(0))
  277. // {
  278. // query.WhereIn(nameof(FlowTodo.ProcessId), request.ProcessIds);
  279. // }
  280. // #region 新增
  281. // if (!string.IsNullOrWhiteSpace(request.Keyword))
  282. // {
  283. // //获取用户
  284. // var users = await _userRepository.GetAllAsync(Q.WhereLike(nameof(Entity.User.Name), $"%{request.Keyword}%"));
  285. // if (users.Count > 0)
  286. // {
  287. // //获取
  288. // var flow = await _flowRepository.GetAllAsync(Q.WhereIn(nameof(Flow.UserId), users.Select(n => n.Id)));
  289. // var flowTodosApproverCheck = await _repository.GetAllAsync(Q.WhereIn(nameof(FlowTodo.UserId), users.Select(n => n.Id)).Where(nameof(FlowTodo.Type), "ApproverCheck"));
  290. // var flowTodosCarbonCopy = await _repository.GetAllAsync(Q.WhereIn(nameof(FlowTodo.UserId), users.Select(n => n.Id)).Where(nameof(FlowTodo.Type), "CarbonCopy"));
  291. // var flowIds = new List<int>();
  292. // if (flow.Count > 0)
  293. // flowIds.AddRange(flow.Select(n => n.Id));
  294. // //审批人
  295. // if (flowTodosApproverCheck.Count > 0)
  296. // flowIds.AddRange(flowTodosApproverCheck.Select(n => n.FlowId));
  297. // //抄送人
  298. // if (flowTodosCarbonCopy.Count > 0)
  299. // flowIds.AddRange(flowTodosCarbonCopy.Select(n => n.FlowId));
  300. // query.WhereIn(nameof(FlowTodo.FlowId), flowIds);
  301. // }
  302. // else
  303. // {
  304. // var flowFieldValues = await _flowFieldValueRepository.GetAllAsync(Q.WhereLike(nameof(FlowFieldValue.StringValue), $"%{request.Keyword}%"));
  305. // query.WhereIn(nameof(Flow.Id), flowFieldValues.Select(n => n.FlowId));
  306. // if (flowFieldValues.Count() == 0)
  307. // {
  308. // var processList = await _processRepository.GetAllAsync(Q.WhereLike(nameof(Entity.WorkProcess.Process.Name), $"%{request.Keyword}%"));
  309. // query.WhereIn(nameof(Flow.ProcessId), processList.Select(n => n.Id));
  310. // }
  311. // else
  312. // query.WhereIn(nameof(Flow.Id), flowFieldValues.Select(n => n.FlowId));
  313. // }
  314. // }
  315. // #endregion
  316. // return await _repository.GetAllAsync<(int TodoId, int FlowId)>(query);
  317. }
  318. public async Task<int> GetReadCountAsync(int userId, string type, FlowListRequest request, bool isRead)
  319. {
  320. string sql = $@"SELECT
  321. count(1)
  322. FROM
  323. tede_flow_todo a
  324. INNER JOIN
  325. tede_process b ON a.ProcessId = b.id
  326. INNER JOIN
  327. tede_flow c ON c.Id = a.FlowId
  328. INNER JOIN
  329. tede_user d ON d.Id = c.UserId
  330. WHERE
  331. a.UserId = {userId}
  332. AND a.Type = '{type}'";
  333. if (isRead)
  334. sql += $@"AND a.IsRead = 1";
  335. else sql += $@"AND a.IsRead = 0";
  336. if (!string.IsNullOrWhiteSpace(request.Keyword))
  337. {
  338. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  339. OR a.FlowId IN (SELECT
  340. FlowId
  341. FROM
  342. tede_flow_field_value
  343. WHERE
  344. StringValues LIKE '%{request.Keyword}%')
  345. OR c.UserId IN (SELECT
  346. Id
  347. FROM
  348. tede_user
  349. WHERE
  350. Name LIKE '%{request.Keyword}%') or a.FlowId In(SELECT
  351. FlowId
  352. FROM
  353. tede_flow_todo
  354. WHERE
  355. UserId IN (SELECT
  356. Id
  357. FROM
  358. tede_user
  359. WHERE
  360. Name LIKE '%{request.Keyword}%')) or a.FlowId In(SELECT
  361. FlowId
  362. FROM
  363. tede_flow_message
  364. WHERE
  365. Message LIKE '%{request.Keyword}%'))";
  366. }
  367. if (request.ProcessIds.Count > 0)
  368. {
  369. var processId = "";
  370. foreach (var item in request.ProcessIds)
  371. {
  372. if (item == 0)
  373. continue;
  374. processId += $"{item},";
  375. }
  376. if (!string.IsNullOrWhiteSpace(processId))
  377. {
  378. processId = processId.Remove(processId.Length - 1, 1);
  379. sql += $" AND b.Id IN ({processId})";
  380. }
  381. }
  382. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  383. var database = new Database(databaseType, _connectionString);
  384. var connection = database.GetConnection();
  385. var result =
  386. await connection
  387. .ExecuteScalarAsync<int>(sql);
  388. return result;
  389. }
  390. public async Task<int> GetCountAsync(int userId, string type, bool isDone, FlowListRequest request)
  391. {
  392. string sql = $@"SELECT
  393. count(1)
  394. FROM
  395. tede_flow_todo a
  396. INNER JOIN
  397. tede_process b ON a.ProcessId = b.id
  398. INNER JOIN
  399. tede_flow c ON c.Id = a.FlowId
  400. INNER JOIN
  401. tede_user d on d.Id=a.UserId
  402. INNER JOIN
  403. tede_user e on e.Id=c.UserId
  404. WHERE
  405. a.UserId = {userId}
  406. AND a.Type = '{type}'";
  407. if (isDone)
  408. sql += $@"AND a.IsDone = 1";
  409. else sql += $@"AND a.IsDone = 0 AND a.IsOperate = 1";
  410. if (!string.IsNullOrWhiteSpace(request.Keyword))
  411. {
  412. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  413. OR a.FlowId IN (SELECT
  414. FlowId
  415. FROM
  416. tede_flow_field_value
  417. WHERE
  418. StringValues LIKE '%{request.Keyword}%')
  419. OR c.UserId IN (SELECT
  420. Id
  421. FROM
  422. tede_user
  423. WHERE
  424. Name LIKE '%{request.Keyword}%')
  425. or a.FlowId In(SELECT
  426. FlowId
  427. FROM
  428. tede_flow_todo
  429. WHERE
  430. UserId IN (SELECT
  431. Id
  432. FROM
  433. tede_user
  434. WHERE
  435. Name LIKE '%{request.Keyword}%'))
  436. or a.FlowId In(SELECT
  437. FlowId
  438. FROM
  439. tede_flow_message
  440. WHERE
  441. Message LIKE '%{request.Keyword}%'))";
  442. }
  443. if (request.ProcessIds.Count > 0)
  444. {
  445. var processId = "";
  446. foreach (var item in request.ProcessIds)
  447. {
  448. if (item == 0)
  449. continue;
  450. processId += $"{item},";
  451. }
  452. if (!string.IsNullOrWhiteSpace(processId))
  453. {
  454. processId = processId.Remove(processId.Length - 1, 1);
  455. sql += $" AND b.Id IN ({processId})";
  456. }
  457. }
  458. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  459. var database = new Database(databaseType, _connectionString);
  460. var connection = database.GetConnection();
  461. var result =
  462. await connection
  463. .ExecuteScalarAsync<int>(sql);
  464. return result;
  465. }
  466. /// <summary>
  467. /// 已审批数量
  468. /// </summary>
  469. /// <param name="userId"></param>
  470. /// <param name="type"></param>
  471. /// <param name="isDone"></param>
  472. /// <param name="request"></param>
  473. /// <returns></returns>
  474. public async Task<int> GetMyCheckedCountAsync(int userId, string type, bool isDone, FlowListRequest request)
  475. {
  476. string sql = $@"
  477. SELECT
  478. count(1)
  479. FROM
  480. tede_flow_todo a
  481. INNER JOIN
  482. tede_process b ON a.ProcessId = b.id
  483. INNER JOIN
  484. tede_flow c ON c.Id = a.FlowId
  485. INNER JOIN
  486. tede_user d on d.Id=a.UserId
  487. INNER JOIN
  488. tede_user e on e.Id=c.UserId
  489. WHERE
  490. a.UserId = {userId}
  491. AND a.Type = '{type}'";
  492. if (isDone)
  493. sql += $@" AND a.IsDone = 1";
  494. else sql += $@" AND a.IsDone = 0 AND a.IsOperate = 1";
  495. if (!string.IsNullOrWhiteSpace(request.Keyword))
  496. {
  497. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  498. OR a.FlowId IN (SELECT
  499. FlowId
  500. FROM
  501. tede_flow_field_value
  502. WHERE
  503. StringValues LIKE '%{request.Keyword}%')
  504. OR c.UserId IN (SELECT
  505. Id
  506. FROM
  507. tede_user
  508. WHERE
  509. Name LIKE '%{request.Keyword}%') or a.FlowId In(SELECT
  510. FlowId
  511. FROM
  512. tede_flow_todo
  513. WHERE
  514. UserId IN (SELECT
  515. Id
  516. FROM
  517. tede_user
  518. WHERE
  519. Name LIKE '%{request.Keyword}%'))
  520. or a.FlowId In(SELECT
  521. FlowId
  522. FROM
  523. tede_flow_message
  524. WHERE
  525. Message LIKE '%{request.Keyword}%'))";
  526. }
  527. if (request.ProcessIds.Count > 0)
  528. {
  529. var processId = "";
  530. foreach (var item in request.ProcessIds)
  531. {
  532. if (item == 0)
  533. continue;
  534. processId += $"{item},";
  535. }
  536. if (!string.IsNullOrWhiteSpace(processId))
  537. {
  538. processId = processId.Remove(processId.Length - 1, 1);
  539. sql += $" AND b.Id IN ({processId})";
  540. }
  541. }
  542. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  543. var database = new Database(databaseType, _connectionString);
  544. var connection = database.GetConnection();
  545. var result =
  546. await connection
  547. .ExecuteScalarAsync<int>(sql);
  548. return result;
  549. }
  550. /// <summary>
  551. /// 未读数量
  552. /// </summary>
  553. /// <param name="userId"></param>
  554. /// <param name="type"></param>
  555. /// <param name="isDone"></param>
  556. /// <param name="request"></param>
  557. /// <returns></returns>
  558. #region
  559. public async Task<int> GetUReadCountAsync(int userId, string type, bool isDone, FlowListRequest request)
  560. {
  561. var query = Q
  562. .Select(nameof(FlowTodo.FlowId))
  563. .WhereNot(nameof(FlowTodo.ProcessId), 0)
  564. .Where(nameof(FlowTodo.UserId), userId)
  565. .Where(nameof(FlowTodo.Type), type)
  566. .Where(nameof(FlowTodo.IsDone), isDone)
  567. .OrderByDesc(nameof(FlowTodo.Id));
  568. if (!isDone && type == nameof(TodoTypeConst.ApproverCheck))
  569. {
  570. query.Where(nameof(FlowTodo.IsOperate), true);
  571. }
  572. if (request.ProcessIds != null && request.ProcessIds.Any())
  573. {
  574. query.WhereIn(nameof(FlowTodo.ProcessId), request.ProcessIds);
  575. }
  576. #region 新增
  577. if (!string.IsNullOrWhiteSpace(request.Keyword))
  578. {
  579. //获取用户
  580. var users = await _userRepository.GetAllAsync(Q.WhereLike(nameof(Entity.User.Name), $"%{request.Keyword}%"));
  581. //获取
  582. var flow = await _flowRepository.GetAllAsync(Q.WhereIn(nameof(Flow.UserId), users.Select(n => n.Id)));
  583. query.WhereIn(nameof(FlowTodo.FlowId), flow.Select(n => n.Id));
  584. }
  585. #endregion
  586. return await _repository.CountAsync(query);
  587. }
  588. #endregion
  589. public async Task<IEnumerable<(int TodoId, int FlowId)>> GetTodoIdFlowIdListAsync(int userId, string type, FlowListRequest request, bool isRead)
  590. {
  591. string sql = $@"SELECT
  592. a.Id,a.FlowId
  593. FROM
  594. tede_flow_todo a
  595. INNER JOIN
  596. tede_process b ON a.ProcessId = b.id
  597. INNER JOIN
  598. tede_flow c ON c.Id = a.FlowId
  599. INNER JOIN
  600. tede_user d ON d.Id = c.UserId
  601. WHERE
  602. a.UserId = {userId}
  603. AND a.Type = '{type}'";
  604. if (isRead)
  605. sql += $@"AND a.IsRead = 1";
  606. else sql += $@"AND a.IsRead = 0";
  607. if (!string.IsNullOrWhiteSpace(request.Keyword))
  608. {
  609. sql += $@" AND (b.Name LIKE '%{request.Keyword}%'
  610. OR a.FlowId IN (SELECT
  611. FlowId
  612. FROM
  613. tede_flow_field_value
  614. WHERE
  615. StringValues LIKE '%{request.Keyword}%')
  616. OR c.UserId IN (SELECT
  617. Id
  618. FROM
  619. tede_user
  620. WHERE
  621. Name LIKE '%{request.Keyword}%') or a.FlowId In(SELECT
  622. FlowId
  623. FROM
  624. tede_flow_todo
  625. WHERE
  626. UserId IN (SELECT
  627. Id
  628. FROM
  629. tede_user
  630. WHERE
  631. Name LIKE '%{request.Keyword}%'))
  632. or a.FlowId In(SELECT
  633. FlowId
  634. FROM
  635. tede_flow_message
  636. WHERE
  637. Message LIKE '%{request.Keyword}%'))";
  638. }
  639. if (request.ProcessIds.Count > 0)
  640. {
  641. var processId = "";
  642. foreach (var item in request.ProcessIds)
  643. {
  644. if (item == 0)
  645. continue;
  646. processId += $"{item},";
  647. }
  648. if (!string.IsNullOrWhiteSpace(processId))
  649. {
  650. processId = processId.Remove(processId.Length - 1, 1);
  651. sql += $" AND b.Id IN ({processId})";
  652. }
  653. }
  654. sql += $" order by a.CreatedDate desc limit {(request.Page - 1) * request.PerPage},{request.PerPage}";
  655. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  656. var database = new Database(databaseType, _connectionString);
  657. var connection = database.GetConnection();
  658. var result =
  659. await connection
  660. .QueryAsync<(int TodoId, int FlowId)>(sql);
  661. return result;
  662. // var query = Q
  663. // .WhereNot(nameof(FlowTodo.ProcessId), 0)
  664. // .Where(nameof(FlowTodo.UserId), userId)
  665. // .Where(nameof(FlowTodo.Type), type)
  666. // .ForPage(request.Page, request.PerPage)
  667. // .OrderByDesc(nameof(FlowTodo.Id));
  668. // if (request.ProcessIds != null && request.ProcessIds.Any() && !request.ProcessIds.Contains(0))
  669. // {
  670. // query.WhereIn(nameof(FlowTodo.ProcessId), request.ProcessIds);
  671. // }
  672. // #region 新增
  673. // if (!string.IsNullOrWhiteSpace(request.Keyword))
  674. // {
  675. // //获取用户
  676. // var users = await _userRepository.GetAllAsync(Q.WhereLike(nameof(Entity.User.Name), $"%{request.Keyword}%"));
  677. // if (users.Count > 0)
  678. // {
  679. // //获取
  680. // var flow = await _flowRepository.GetAllAsync(Q.WhereIn(nameof(Flow.UserId), users.Select(n => n.Id)));
  681. // var flowTodosApproverCheck = await _repository.GetAllAsync(Q.WhereIn(nameof(FlowTodo.UserId), users.Select(n => n.Id)).Where(nameof(FlowTodo.Type), "ApproverCheck"));
  682. // var flowTodosCarbonCopy = await _repository.GetAllAsync(Q.WhereIn(nameof(FlowTodo.UserId), users.Select(n => n.Id)).Where(nameof(FlowTodo.Type), "CarbonCopy"));
  683. // var flowIds = new List<int>();
  684. // if (flow.Count > 0)
  685. // flowIds.AddRange(flow.Select(n => n.Id));
  686. // //审批人
  687. // if (flowTodosApproverCheck.Count > 0)
  688. // flowIds.AddRange(flowTodosApproverCheck.Select(n => n.FlowId));
  689. // //抄送人
  690. // if (flowTodosCarbonCopy.Count > 0)
  691. // flowIds.AddRange(flowTodosCarbonCopy.Select(n => n.FlowId));
  692. // query.WhereIn(nameof(FlowTodo.FlowId), flowIds);
  693. // }
  694. // else
  695. // {
  696. // var allFlowIdList = await _repository.GetAllAsync<int>(query.Select(nameof(FlowTodo.FlowId)));
  697. // var flowIdList = await _flowFieldValueRepository.GetFlowIdListAsync(allFlowIdList, request.Keyword);
  698. // // if (flowIdList == null || !flowIdList.Any())
  699. // // {
  700. // // return new List<(int TodoId, int FlowId)>();
  701. // // }
  702. // if (flowIdList.Count() == 0)
  703. // {
  704. // var processList = await _processRepository.GetAllAsync(Q.WhereLike(nameof(Entity.WorkProcess.Process.Name), $"%{request.Keyword}%"));
  705. // query.WhereIn(nameof(FlowTodo.ProcessId), processList.Select(n => n.Id));
  706. // var result = await _repository.GetAllAsync(query);
  707. // return result.Select(n => (n.Id, n.FlowId));
  708. // }
  709. // else
  710. // {
  711. // var result = await _repository.GetAllAsync(query.WhereIn(nameof(FlowTodo.FlowId), flowIdList));
  712. // return result.Select(n => (n.Id, n.FlowId));
  713. // }
  714. // //return await _repository.GetAllAsync<(int TodoId, int FlowId)>(query.Select(nameof(FlowTodo.Id),nameof(FlowTodo.FlowId)).WhereIn(nameof(FlowTodo.FlowId), flowIdList));
  715. // }
  716. // }
  717. // #endregion
  718. // // if (!string.IsNullOrEmpty(request.Keyword))
  719. // // {
  720. // // var allFlowIdList = await _repository.GetAllAsync<int>(query.Select(nameof(FlowTodo.FlowId)));
  721. // // var flowIdList = await _flowFieldValueRepository.GetFlowIdListAsync(allFlowIdList, request.Keyword);
  722. // // if (flowIdList == null || !flowIdList.Any())
  723. // // {
  724. // // return new List<(int TodoId, int FlowId)>();
  725. // // }
  726. // // return await _repository.GetAllAsync<(int TodoId, int FlowId)>(query.Select(nameof(FlowTodo.Id)).WhereIn(nameof(FlowTodo.FlowId), flowIdList));
  727. // // }
  728. // return await _repository.GetAllAsync<(int TodoId, int FlowId)>(query.Select(nameof(FlowTodo.Id), nameof(FlowTodo.FlowId)));
  729. }
  730. public async Task<int> GetCountAsync(int userId, string type, FlowListRequest request)
  731. {
  732. var query = Q
  733. .Select(nameof(FlowTodo.FlowId))
  734. .WhereNot(nameof(FlowTodo.ProcessId), 0)
  735. .Where(nameof(FlowTodo.UserId), userId)
  736. .Where(nameof(FlowTodo.Type), type)
  737. .OrderByDesc(nameof(FlowTodo.Id));
  738. if (request.ProcessIds != null && request.ProcessIds.Any() && !request.ProcessIds.Contains(0))
  739. {
  740. query.WhereIn(nameof(FlowTodo.ProcessId), request.ProcessIds);
  741. }
  742. #region 新增
  743. if (!string.IsNullOrWhiteSpace(request.Keyword))
  744. {
  745. //获取用户
  746. var users = await _userRepository.GetAllAsync(Q.WhereLike(nameof(Entity.User.Name), $"%{request.Keyword}%"));
  747. if (users.Count > 0)
  748. {
  749. //获取
  750. var flow = await _flowRepository.GetAllAsync(Q.WhereIn(nameof(Flow.UserId), users.Select(n => n.Id)));
  751. var flowTodosApproverCheck = await _repository.GetAllAsync(Q.WhereIn(nameof(FlowTodo.UserId), users.Select(n => n.Id)).Where(nameof(FlowTodo.Type), "ApproverCheck"));
  752. var flowTodosCarbonCopy = await _repository.GetAllAsync(Q.WhereIn(nameof(FlowTodo.UserId), users.Select(n => n.Id)).Where(nameof(FlowTodo.Type), "CarbonCopy"));
  753. var flowIds = new List<int>();
  754. if (flow.Count > 0)
  755. flowIds.AddRange(flow.Select(n => n.Id));
  756. //审批人
  757. if (flowTodosApproverCheck.Count > 0)
  758. flowIds.AddRange(flowTodosApproverCheck.Select(n => n.FlowId));
  759. //抄送人
  760. if (flowTodosCarbonCopy.Count > 0)
  761. flowIds.AddRange(flowTodosCarbonCopy.Select(n => n.FlowId));
  762. query.WhereIn(nameof(FlowTodo.FlowId), flowIds);
  763. }
  764. else
  765. {
  766. var allFlowIdList = await _repository.GetAllAsync<int>(query.Select(nameof(FlowTodo.FlowId)));
  767. var flowIdList = await _flowFieldValueRepository.GetFlowIdListAsync(allFlowIdList, request.Keyword);
  768. // if (flowIdList == null || !flowIdList.Any())
  769. // {
  770. // return 0;
  771. // }
  772. if (flowIdList.Count() == 0)
  773. {
  774. var processList = await _processRepository.GetAllAsync(Q.WhereLike(nameof(Entity.WorkProcess.Process.Name), $"%{request.Keyword}%"));
  775. query.WhereIn(nameof(FlowTodo.ProcessId), processList.Select(n => n.Id));
  776. }
  777. else
  778. {
  779. return 0;
  780. }
  781. }
  782. }
  783. #endregion
  784. // if (!string.IsNullOrEmpty(request.Keyword))
  785. // {
  786. // var allFlowIdList = await _repository.GetAllAsync<int>(query.Select(nameof(FlowTodo.FlowId)));
  787. // var flowIdList = await _flowFieldValueRepository.GetFlowIdListAsync(allFlowIdList, request.Keyword);
  788. // if (flowIdList == null || !flowIdList.Any())
  789. // {
  790. // return 0;
  791. // }
  792. // return await _repository.CountAsync(query.WhereIn(nameof(FlowTodo.FlowId), flowIdList));
  793. // }
  794. return await _repository.CountAsync(query);
  795. }
  796. public async Task<FlowTodo> GetAsync(int todoId)
  797. {
  798. return await _repository.GetAsync(todoId);
  799. }
  800. public async Task<FlowTodo> GetAsync(SqlKata.Query query)
  801. {
  802. return await _repository.GetAsync(query);
  803. }
  804. /// <summary>
  805. /// 获取未处理的
  806. /// </summary>
  807. /// <param name="flowId"></param>
  808. /// <returns></returns>
  809. public async Task<FlowTodo> GetUCheckedAsync(int flowId)
  810. {
  811. string sql = $@" SELECT
  812. a.*
  813. FROM
  814. tede_flow_todo a
  815. INNER JOIN
  816. tede_user b ON a.UserId = b.Id
  817. WHERE
  818. a.FlowId ={flowId} AND a.IsDone = 0
  819. AND a.Type = 'ApproverCheck'
  820. AND IsChecked = 0 order by a.Sort limit 1";
  821. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  822. var database = new Database(databaseType, _connectionString);
  823. var connection = database.GetConnection();
  824. var result = await connection.QueryFirstOrDefaultAsync<FlowTodo>(sql);
  825. return result;
  826. }
  827. public async Task<bool> UpdateAsync(FlowTodo todo)
  828. {
  829. return await _repository.UpdateAsync(todo);
  830. }
  831. public async Task<bool> UpdateSortAsync(FlowTodo todo)
  832. {
  833. string sql = $"UPDATE `ccpph`.`tede_flow_todo` SET `Sort` = {todo.Sort} WHERE `Id` = {todo.Id}";
  834. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  835. var database = new Database(databaseType, _connectionString);
  836. var connection = database.GetConnection();
  837. var result = await connection.ExecuteAsync(sql);
  838. return result > 0;
  839. }
  840. public async Task<bool> UpdateAsync(SqlKata.Query query)
  841. {
  842. return await _repository.UpdateAsync(query) > 0;
  843. }
  844. public async Task<bool> UpdateReadAsync(int userId, int flowId)
  845. {
  846. string sql = $"UPDATE `ccpph`.`tede_flow_todo` SET `IsRead` = 1 WHERE `FlowId` = {flowId} and `UserId`={userId} ";
  847. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  848. var database = new Database(databaseType, _connectionString);
  849. var connection = database.GetConnection();
  850. var result = await connection.ExecuteAsync(sql);
  851. return result > 0;
  852. }
  853. public async Task<bool> UpdateFlowReadAsync(int userId, int flowId)
  854. {
  855. string sql = $"UPDATE `ccpph`.`tede_flow` SET `IsRead` = 1 WHERE `Id` = {flowId} and `UserId`={userId}";
  856. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  857. var database = new Database(databaseType, _connectionString);
  858. var connection = database.GetConnection();
  859. var result = await connection.ExecuteAsync(sql);
  860. return result > 0;
  861. }
  862. public async Task UpdateCCIsDoneAsync(int userId, int flowId)
  863. {
  864. await UpdateReadAsync(userId, flowId);
  865. await UpdateFlowReadAsync(userId, flowId);
  866. }
  867. public async Task DeleteCheckingByFlowIdAsync(int flowId)
  868. {
  869. await _repository.DeleteAsync(Q
  870. .Where(nameof(FlowTodo.FlowId), flowId)
  871. .Where(nameof(FlowTodo.Type), nameof(TodoTypeConst.ApproverCheck))
  872. .Where(nameof(FlowTodo.IsDone), false)
  873. );
  874. }
  875. public async Task<IEnumerable<int>> GetAllCheckedUserIdListAsync(int flowId)
  876. {
  877. return await _repository.GetAllAsync<int>(Q
  878. .Select(nameof(FlowTodo.UserId))
  879. .Where(nameof(FlowTodo.FlowId), flowId)
  880. .Where(nameof(FlowTodo.Type), nameof(TodoTypeConst.ApproverCheck))
  881. .Where(nameof(FlowTodo.IsChecked), true)
  882. .Where(nameof(FlowTodo.IsDone), true)
  883. );
  884. }
  885. /// <summary>
  886. /// 获取操作成功数量
  887. /// </summary>
  888. /// <param name="flowId"></param>
  889. /// <returns></returns>
  890. public async Task<int> CheckedCountAsync(int flowId)
  891. {
  892. string sql = $@"SELECT
  893. count(1)
  894. FROM
  895. tede_flow_todo a
  896. INNER JOIN
  897. tede_user b ON a.UserId = b.Id
  898. WHERE
  899. a.FlowId ={flowId} AND a.IsDone = 1
  900. AND a.Type = 'ApproverCheck'
  901. AND IsChecked = 1";
  902. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  903. var database = new Database(databaseType, _connectionString);
  904. var connection = database.GetConnection();
  905. var result = await connection.ExecuteScalarAsync<int>(sql);
  906. return result;
  907. }
  908. /// <summary>
  909. /// 获取所有数量
  910. /// </summary>
  911. /// <param name="flowId"></param>
  912. /// <returns></returns>
  913. public async Task<int> AllCountAsync(int flowId)
  914. {
  915. string sql = $@"SELECT
  916. count(1)
  917. FROM
  918. tede_flow_todo a
  919. INNER JOIN
  920. tede_user b ON a.UserId = b.Id
  921. WHERE
  922. a.FlowId ={flowId}
  923. AND a.Type = 'ApproverCheck'";
  924. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  925. var database = new Database(databaseType, _connectionString);
  926. var connection = database.GetConnection();
  927. var result = await connection.ExecuteScalarAsync<int>(sql);
  928. return result;
  929. }
  930. public async Task<int> CountAsync(SqlKata.Query query)
  931. {
  932. return await _repository.CountAsync(query);
  933. }
  934. /// <summary>
  935. /// 抄送未读数量
  936. /// </summary>
  937. /// <param name="userId"></param>
  938. /// <returns></returns>
  939. public async Task<int> FlowCcUReadCountAsync(int userId)
  940. {
  941. string sql = $"SELECT count(1) FROM tede_flow_todo a where a.UserId={userId} and a.Type='CarbonCopy' and a.IsRead=0 and a.IsDone=0 and a.ProcessId=(select Id from tede_process where Id=a.ProcessId)";
  942. var databaseType = StringUtils.ToEnum<DatabaseType>(_databaseTypeStr, DatabaseType.MySql);
  943. var database = new Database(databaseType, _connectionString);
  944. var connection = database.GetConnection();
  945. var result = await connection.ExecuteScalarAsync<int>(sql);
  946. return result;
  947. }
  948. public async Task<IEnumerable<FlowTodo>> GetAllAsync(Query query)
  949. {
  950. return await _repository.GetAllAsync(query);
  951. }
  952. }
  953. }