FlowTodoRepository.cs 50 KB

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