CourseController.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Http;
  6. using Microsoft.AspNetCore.Mvc;
  7. using OpenXmlPowerTools;
  8. using Org.BouncyCastle.Ocsp;
  9. using TEAMModelOS.Models;
  10. using TEAMModelOS.SDK.Context.Exception;
  11. using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
  12. using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
  13. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  14. using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
  15. using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
  16. using TEAMModelOS.Service.Models;
  17. namespace TEAMModelOS.Controllers
  18. {
  19. [Route("api/[controller]")]
  20. [ApiController]
  21. public class CourseController : BaseController
  22. {
  23. private IAzureCosmosDBV3Repository _cosmos;
  24. public CourseController(IAzureCosmosDBV3Repository cosmos)
  25. {
  26. _cosmos = cosmos;
  27. }
  28. /// <summary>
  29. /// 更新保存课程
  30. /// </summary>
  31. /// <param name="request"></param>
  32. /// <returns></returns>
  33. [HttpPost("upsert")]
  34. public async Task<BaseJosnRPCResponse> upsert(JosnRPCRequest<Course> request)
  35. {
  36. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  37. if (string.IsNullOrEmpty(request.@params.id)) {
  38. List<int> count =await _cosmos.FindCountByDict<Course>(new Dictionary<string, object> { { "courseCode", request.@params.courseCode },{ "code",request.@params.code} });
  39. if (count.IsNotEmpty() && count[0] > 0) {
  40. throw new BizException("课程编码已经存在!",ResponseCode.DATA_EXIST);
  41. }
  42. request.@params.id = request.@params.code.Replace("#", "") +"-"+ request.@params.courseCode;
  43. }
  44. Course response = await _cosmos.SaveOrUpdate<Course>(request.@params);
  45. return builder.Data(response).build();
  46. }
  47. /// <summary>
  48. /// 查询课程
  49. /// </summary>
  50. /// <param name="request"></param>
  51. /// <returns></returns>
  52. [HttpPost("find")]
  53. public async Task<BaseJosnRPCResponse> Find(JosnRPCRequest<Dictionary<string, object>> request)
  54. {
  55. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  56. List<Course> data = new List<Course>();
  57. if (request.@params.Keys.Count > 0) {
  58. data = await _cosmos.FindByDict<Course>(request.@params);
  59. }
  60. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  61. }
  62. /// <summary>
  63. /// 删除课程
  64. /// </summary>
  65. /// <param name="request"></param>
  66. /// <returns></returns>
  67. [HttpPost("delete")]
  68. public async Task<BaseJosnRPCResponse> Delete(JosnRPCRequest<IdPk> request)
  69. {
  70. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  71. IdPk idPk= await _cosmos.DeleteAsync<Course>(request.@params);
  72. return builder.Data(idPk).build();
  73. }
  74. /// <summary>
  75. /// 删除课程
  76. /// </summary>
  77. /// <param name="request"></param>
  78. /// <returns></returns>
  79. [HttpPost("deleteAll")]
  80. public async Task<BaseJosnRPCResponse> DeleteAll(JosnRPCRequest<List<IdPk>> request)
  81. {
  82. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  83. List<IdPk> idPk = await _cosmos.DeleteAll<Course>(request.@params);
  84. return builder.Data(idPk).build();
  85. }
  86. /// <summary>
  87. /// 保存更新课程安排
  88. /// </summary>
  89. /// <param name="request"></param>
  90. /// <returns></returns>
  91. [HttpPost("upsertAllPlan")]
  92. public async Task<BaseJosnRPCResponse> UpsertAllPlan(JosnRPCRequest<List<CoursePlanDto>> request)
  93. {
  94. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  95. List<CoursePlan> coursePlans = new List<CoursePlan>();
  96. foreach (IGrouping<dynamic, CoursePlanDto> group in request.@params.GroupBy(c => new { c.courseId, c.code })) {
  97. List<CoursePlan> datas = await _cosmos.FindByDict<CoursePlan>(new Dictionary<string, object>
  98. { { "id",group.Key.courseId }, { "code", group.Key.code } });
  99. var list = request.@params.Where(x => x.code == group.Key.code && x.courseId == group.Key.courseId).ToList();
  100. if (datas.IsNotEmpty())
  101. {
  102. CoursePlan data = datas[0];
  103. foreach (IGrouping<string, CoursePlanDto> groupClass in list.GroupBy(c => c.classroomCode)) {
  104. var listclass = request.@params.Where(x => x.code == group.Key.code &&x.classroomCode==groupClass.Key && x.courseId == group.Key.courseId).ToList();
  105. if (listclass.IsNotEmpty()) {
  106. List<CourseTime> courseTimes = new List<CourseTime>();
  107. listclass.ForEach(x => {
  108. if (!data.classes.Select(m=>m.classroomCode).Contains(x.classroomCode)) {
  109. courseTimes.Add(x.courseTime);
  110. }
  111. });
  112. if (courseTimes.IsNotEmpty()) {
  113. data.classes.Add(new CourseClass { classroomCode = groupClass.Key, courseTimes = courseTimes });
  114. coursePlans.Add(data);
  115. }
  116. }
  117. }
  118. }
  119. else {
  120. CoursePlan data = new CoursePlan {
  121. id = group.Key.courseId,
  122. code = group.Key.code,
  123. // courseId = group.Key.courseId ,
  124. };
  125. foreach (IGrouping<string, CoursePlanDto> groupClass in list.GroupBy(c => c.classroomCode))
  126. {
  127. var listclass = request.@params.Where(x => x.code == group.Key.code && x.classroomCode == groupClass.Key && x.courseId == group.Key.courseId).ToList();
  128. if (listclass.IsNotEmpty())
  129. {
  130. List<CourseTime> courseTimes = new List<CourseTime>();
  131. listclass.ForEach(x => { courseTimes.Add(x.courseTime); });
  132. data.classes.Add(new CourseClass { classroomCode = groupClass.Key, courseTimes = courseTimes });
  133. coursePlans.Add(data);
  134. }
  135. }
  136. coursePlans.Add(data);
  137. }
  138. }
  139. if (coursePlans.IsNotEmpty()) {
  140. await _cosmos.SaveOrUpdateAll(coursePlans);
  141. }
  142. return builder.Data(coursePlans).build();
  143. }
  144. /// <summary>
  145. /// 教师更新副属信息,助教,分组等。
  146. /// </summary>
  147. /// <param name="request"></param>
  148. /// <returns></returns>
  149. [HttpPost("upsertPlan")]
  150. public async Task<BaseJosnRPCResponse> UpsertPlan(JosnRPCRequest<CoursePlan> request) {
  151. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  152. CoursePlan datas = await _cosmos.FindByIdPk<CoursePlan>(request.@params.id,request.@params.code);
  153. if (datas!=null) {
  154. request.@params.semesterCode = datas.semesterCode;
  155. request.@params.classes.ForEach(x => {
  156. datas.classes.ForEach(m => {
  157. if (m.classroomCode == x.classroomCode) {
  158. x.courseTimes = m.courseTimes;
  159. } });
  160. });
  161. await _cosmos.Update(request.@params);
  162. }
  163. return builder.Data(request.@params).build();
  164. }
  165. /// <summary>
  166. /// 查询课程安排
  167. /// </summary>
  168. /// <param name="request"></param>
  169. /// <returns></returns>
  170. [HttpPost("findPlan")]
  171. public async Task<BaseJosnRPCResponse> FindPlan(JosnRPCRequest<Dictionary<string, object>> request)
  172. {
  173. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  174. List<CoursePlan> data = new List<CoursePlan>();
  175. if (request.@params.Keys.Count > 0
  176. &&
  177. //必须保证这几个参数之一有传递
  178. (request.@params.ContainsKey("id")|| request.@params.ContainsKey("code") ||
  179. request.@params.ContainsKey("classes[*].classroomCode"))
  180. )
  181. {
  182. data = await _cosmos.FindByDict<CoursePlan>(request.@params);
  183. }
  184. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  185. }
  186. /// <summary>
  187. /// 查询课程安排
  188. /// </summary>
  189. /// <param name="request"></param>
  190. /// <returns></returns>
  191. [HttpPost("findTeach")]
  192. public async Task<BaseJosnRPCResponse> FindTeach(JosnRPCRequest<string> request)
  193. {
  194. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  195. List<CoursePlan> data= await _cosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "code", request.@params } }, new List<string> { "id" });
  196. List<Course> courses = new List<Course>();
  197. if (data.IsNotEmpty()) {
  198. courses= await _cosmos.FindByDict<Course>(new Dictionary<string, object> { { "id", courses.Select(x => x.id).ToArray() } });
  199. }
  200. List<Course> coursesp = await _cosmos.FindByDict<Course>(new Dictionary<string, object> { { "code", request.@params } });
  201. if (courses.IsNotEmpty())
  202. {
  203. //个人教室
  204. if (coursesp.IsNotEmpty())
  205. {
  206. coursesp.ForEach(x =>
  207. {
  208. ///处理重复
  209. if (!courses.Select(y => y.id).Contains(x.id)) {
  210. courses.Add(x);
  211. }
  212. });
  213. }
  214. }
  215. else {
  216. courses = coursesp;
  217. }
  218. return builder.Data(courses).build();
  219. }
  220. /// <summary>
  221. /// 查询执教助教的课程班级
  222. /// </summary>
  223. /// <param name="request"></param>
  224. /// <returns></returns>
  225. [HttpPost("findTeachClass")]
  226. public async Task<BaseJosnRPCResponse> FindPlan(JosnRPCRequest<string> request)
  227. {
  228. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  229. HashSet<string> data = new HashSet<string>();
  230. List<dynamic> room = new List<dynamic>();
  231. if (!string.IsNullOrEmpty(request.@params))
  232. {
  233. var prop = new List<string> { "classes" };
  234. var teachers= await _cosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "code",request.@params} } , prop);
  235. if (teachers.IsNotEmpty()) {
  236. teachers.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
  237. }
  238. var assistant = await _cosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "assistant[*]", request.@params } }, prop);
  239. if (assistant.IsNotEmpty()) {
  240. assistant.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
  241. }
  242. }
  243. if (data.Count > 0) {
  244. var classRoom= await _cosmos.FindByDict<Classroom>(new Dictionary<string, object> { { "classroomCode",data.ToArray() } } );
  245. if (classRoom.IsNotEmpty()) {
  246. classRoom.ForEach(x => {
  247. room.Add(x);
  248. });
  249. }
  250. }
  251. return builder.Data(room).Extend(new Dictionary<string, object> { { "count", room.Count } }).build();
  252. }
  253. /// <summary>
  254. /// 删除课程安排
  255. /// </summary>
  256. /// <param name="request"></param>
  257. /// <returns></returns>
  258. [HttpPost("deleteTime")]
  259. public async Task<BaseJosnRPCResponse> DeletePlan(JosnRPCRequest<Dictionary<string,object>> request)
  260. {
  261. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  262. if (request.@params.ContainsKey("id") && request.@params.ContainsKey("code") && request.@params.ContainsKey("classroomCode") && request.@params.ContainsKey("time") && request.@params.ContainsKey("day")) {
  263. CoursePlan coursePlan = await _cosmos.FindByIdPk<CoursePlan>(request.@params["id"].ToString(), request.@params["code"].ToString());
  264. List<CourseTime> courseTimes = new List<CourseTime>();
  265. coursePlan.classes.ForEach(x=> {
  266. if (x.classroomCode == request.@params["classroomCode"].ToString()) {
  267. x.courseTimes.ForEach(y => {
  268. if (y.time == request.@params["time"].ToString() && y.day == request.@params["day"].ToString())
  269. {
  270. courseTimes.Add(y);
  271. }
  272. });
  273. }
  274. });
  275. coursePlan.classes.ForEach(x => { if (x.classroomCode == request.@params["classroomCode"].ToString()) {
  276. courseTimes.ForEach(y => { x.courseTimes.Remove(y); });
  277. } });
  278. await _cosmos.Update(coursePlan);
  279. return builder.Data(coursePlan).build();
  280. }
  281. return builder.Data(null).build();
  282. }
  283. /// <summary>
  284. /// 删除课程安排
  285. /// </summary>
  286. /// <param name="request"></param>
  287. /// <returns></returns>
  288. [HttpPost("deletePlan")]
  289. public async Task<BaseJosnRPCResponse> DeletePlan(JosnRPCRequest<IdPk> request)
  290. {
  291. JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
  292. IdPk idPk = await _cosmos.DeleteAsync<CoursePlan>(request.@params);
  293. return builder.Data(idPk).build();
  294. }
  295. }
  296. }