FlowTodoRepository.cs 44 KB

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