SmartClassController.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. package com.template.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.seewo.open.sdk.DefaultSeewoClient;
  6. import com.seewo.open.sdk.SeewoClient;
  7. import com.seewo.open.sdk.auth.Account;
  8. import com.template.annotation.DESRespondSecret;
  9. import com.template.api.SmartClassControllerAPI;
  10. import com.template.common.utils.*;
  11. import com.template.config.ControlConfig;
  12. import com.template.config.SeewoConfig;
  13. import com.template.model.pojo.*;
  14. import com.template.model.request.insertSmartClassRequest;
  15. import com.template.model.request.updateClassRequest;
  16. import com.template.model.result.CommonResult;
  17. import com.template.model.result.PageUtils;
  18. import com.template.model.seewo.*;
  19. import com.template.model.vo.*;
  20. import com.template.services.SmartClassService;
  21. import com.template.services.SmartGradeService;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import org.springframework.validation.BindingResult;
  27. import org.springframework.web.bind.annotation.RestController;
  28. import javax.annotation.Resource;
  29. import java.io.UnsupportedEncodingException;
  30. import java.net.URLDecoder;
  31. import java.net.URLEncoder;
  32. import java.time.LocalDate;
  33. import java.time.Year;
  34. import java.util.ArrayList;
  35. import java.util.List;
  36. import java.util.Optional;
  37. import static com.template.common.utils.AesTestOne.decrypt;
  38. /**
  39. * <p>
  40. * 楼栋表 前端控制器
  41. * </p>
  42. *
  43. * @author ceshi
  44. * @since 2023-12-25
  45. */
  46. @RestController
  47. //返回参数加密注解
  48. @DESRespondSecret
  49. public class SmartClassController implements SmartClassControllerAPI {
  50. private static Logger logger = LoggerFactory.getLogger(SmartClassController.class);
  51. @Resource
  52. private SeewoConfig seewoConfig;
  53. @Resource
  54. private ControlConfig controlConfig;
  55. @Autowired
  56. private SmartClassService smartClassService;
  57. @Autowired
  58. private SmartGradeService smartGradeService;
  59. @Override
  60. @DESRespondSecret(validated = true)
  61. public CommonResult insertSmartClass(SmartClass smartApply, BindingResult bindingResult) {
  62. return null;
  63. }
  64. @Override
  65. @DESRespondSecret(validated = true)
  66. public CommonResult queryPageSmartClasss(int currentPage, int pageCount, String name) {
  67. PageUtils<SmartClass> result = smartClassService.queryPageSmartClass(currentPage, pageCount, name);
  68. PageUtils<SmartClassPageVo> datas = new PageUtils<SmartClassPageVo>(null, result.getTotalCount(), result.getPageSize(), result.getCurrPage());
  69. if (result != null && result.getList().size() > 0) {
  70. List<SmartGrade> grades = smartGradeService.getSmartGrades();
  71. List<SmartClassPageVo> pages = new ArrayList<>();
  72. for (SmartClass data : result.getList()) {
  73. SmartClassPageVo pageData = new SmartClassPageVo();
  74. pageData.setId(data.getId());
  75. pageData.setGradeId(data.getGradeId());
  76. Optional<SmartGrade> grade = grades.stream().filter(e -> e.getId().equals(data.getGradeId())).findFirst();
  77. if (grade != null && grade.isPresent()) {
  78. pageData.setGradeStr(grade.get().getName());
  79. }
  80. pageData.setClassUid(data.getClassUid());
  81. pageData.setName(data.getName());
  82. pageData.setClassNo(data.getClassNo());
  83. pageData.setBsClassNo(data.getBsClassNo());
  84. pages.add(pageData);
  85. }
  86. datas = new PageUtils<SmartClassPageVo>(pages, result.getTotalCount(), result.getPageSize(), result.getCurrPage());
  87. }
  88. return CommonResult.ok(datas);
  89. }
  90. @Override
  91. @DESRespondSecret(validated = true)
  92. public CommonResult deleteSmartClassById(int id) {
  93. return null;
  94. }
  95. @Override
  96. @DESRespondSecret(validated = true)
  97. public CommonResult querySmartClasss(int gradeId) {
  98. List<SmartClass> datas = smartClassService.getSmartClassByGradeID(gradeId);
  99. List<SemesterVo> result = new ArrayList<>();
  100. for (SmartClass data : datas) {
  101. SemesterVo model = new SemesterVo();
  102. model.setId(data.getId());
  103. model.setName(data.getName());
  104. result.add(model);
  105. }
  106. return CommonResult.ok(result);
  107. }
  108. @Override
  109. @Transactional(rollbackFor = {Exception.class})
  110. public CommonResult insertSmartClassToBaisheng(insertSmartClassRequest iscr, BindingResult bindingResult) throws Exception {
  111. if (bindingResult.hasErrors()) {
  112. String st = paramUtils.getParamError(bindingResult);
  113. return CommonResult.fail(st);
  114. }
  115. //先查找年级编号对应的年级数据是否存在
  116. SmartGrade grade = smartGradeService.querySmartGradeByBaisheng(iscr.getGradeNo());
  117. if (grade == null) {
  118. return CommonResult.fail("添加班级前,请先添加对应年级数据");
  119. }
  120. //判断重复性
  121. int existCount = smartClassService.existSmartClass(iscr.getClassName(), grade.getId());
  122. if (existCount > 0) {
  123. return CommonResult.fail("该班级数据已在系统中存在,请勿重复添加");
  124. }
  125. String appId = controlConfig.getAppId();
  126. String schoolno = controlConfig.getSchoolCode();
  127. String timestamp = TimeExchange.DateNowTimeStamo();
  128. String className = iscr.getClassName();
  129. String gradeNo = iscr.getGradeNo();
  130. String appSecret = controlConfig.getAppSecret();
  131. String url = controlConfig.getUrl() + "classtab/create";
  132. JSONObject jsonobject = new JSONObject();
  133. jsonobject.put("appid", appId);
  134. String str = "{\"grade_no\":\"" + gradeNo + "\",\"classtab_name\":\"" + grade.getName() + className + "\"}";
  135. String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
  136. jsonobject.put("data", aesStr);
  137. jsonobject.put("schoolno", schoolno);
  138. jsonobject.put("timestamp", timestamp);
  139. String md5Str = "appid=" + appId + "&data={\"grade_no\":\"" + gradeNo + "\",\"classtab_name\":\"" + grade.getName() + className + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
  140. String sign = CommonUtil.MD5(md5Str);
  141. //sign签名
  142. jsonobject.put("sign", sign);
  143. //返回的结果中 code为1表示成功
  144. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  145. if (result.contains("添加成功")) {
  146. //希沃班级传输特点:
  147. //当前月份小于9月份就传当前年份 - 1 ;如果大于9月份就传当前年份
  148. Integer nowMonth = Integer.valueOf(TimeExchange.getNowMonth());
  149. //初始化客户端
  150. SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  151. //region 将K12校区的班级数据初始化
  152. K12Class(seewoClient, grade.getGradeNo(),nowMonth);
  153. //endregion
  154. //region 将数据加入希沃系统中
  155. CommonResult<String[]> saveClass = SeewoInsertOrUpdateClass(seewoClient, iscr.getClassNo(), iscr.getClassName(), grade.getGradeNo(), nowMonth);
  156. if (!saveClass.isSuccess()) {
  157. return CommonResult.fail(saveClass.getMessage());
  158. }
  159. //endregion
  160. //希沃添加年级和班级数据是:存在就覆盖 不存在就新增
  161. //要拿到希沃的年级Uid和班级Uid
  162. String gradeUid = saveClass.getData()[0];
  163. String classUid = saveClass.getData()[1];
  164. ObjectMapper objectMapper = new ObjectMapper();
  165. BsClassVo classVo = objectMapper.readValue(result, BsClassVo.class);
  166. // URL解码
  167. String decodedUrl = URLDecoder.decode(classVo.getData(), "UTF-8");
  168. BsClassNoVo classNo = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsClassNoVo.class);
  169. if (classNo == null) {
  170. return CommonResult.fail("百胜班级编号为空,新增失败");
  171. }
  172. SmartClass smartClass = new SmartClass();
  173. smartClass.setGradeId(grade.getId());
  174. smartClass.setClassUid(classUid);
  175. smartClass.setName(iscr.getClassName());
  176. smartClass.setClassNo(iscr.getClassNo());
  177. smartClass.setBsClassNo(classNo.getClasstab_no());
  178. grade.setGradeUid(gradeUid);
  179. try {
  180. int insertClass = smartClassService.insertSmartClass(smartClass);
  181. if (insertClass <= 0) {
  182. throw new Exception("新增失败");
  183. }
  184. int updateGrade = smartGradeService.updateSmartGrade(grade);
  185. if (updateGrade <= 0) {
  186. throw new Exception("新增失败");
  187. }
  188. } catch (Exception e) {
  189. throw new Exception("新增失败");
  190. }
  191. return CommonResult.ok("新增成功");
  192. }
  193. return CommonResult.fail("操作失败");
  194. }
  195. @Override
  196. @DESRespondSecret(validated = true)
  197. public CommonResult updateSmartClassById(updateClassRequest ucr, BindingResult bindingResult) throws Exception {
  198. if (bindingResult.hasErrors()) {
  199. String st = paramUtils.getParamError(bindingResult);
  200. return CommonResult.fail(st);
  201. }
  202. //数据ID是否有效
  203. SmartClass oldData = smartClassService.querySmartClassById(ucr.getId());
  204. if (oldData == null) {
  205. return CommonResult.fail("班级数据无效,更新失败");
  206. }
  207. //判断重复性
  208. SmartClass existData = smartClassService.existSmartClassData(oldData.getGradeId(), ucr.getName(), ucr.getClassNo());
  209. if (existData != null && !existData.getId().equals(ucr.getId())) {
  210. return CommonResult.fail("该班级数据已在系统中存在,更新失败");
  211. }
  212. //先查找年级编号对应的年级数据是否存在
  213. SmartGrade grade = smartGradeService.querySmartGradeById(oldData.getGradeId());
  214. if (grade == null) {
  215. return CommonResult.fail("添加班级前,请先添加对应年级数据");
  216. }
  217. //region 修改百胜中的班级数据
  218. String appId = controlConfig.getAppId();
  219. String schoolno = controlConfig.getSchoolCode();
  220. String timestamp = TimeExchange.DateNowTimeStamo();
  221. String className = ucr.getName();
  222. String appSecret = controlConfig.getAppSecret();
  223. String url = controlConfig.getUrl() + "classtab/update";
  224. JSONObject jsonobject = new JSONObject();
  225. jsonobject.put("appid", appId);
  226. String str = "{\"classtab_no\":\"" + oldData.getBsClassNo() + "\",\"classtab_name\":\"" + className + "\"}";
  227. String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
  228. jsonobject.put("data", aesStr);
  229. jsonobject.put("schoolno", schoolno);
  230. jsonobject.put("timestamp", timestamp);
  231. String md5Str = "appid=" + appId + "&data={\"classtab_no\":\"" + oldData.getBsClassNo() + "\",\"classtab_name\":\"" + className + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
  232. String sign = CommonUtil.MD5(md5Str);
  233. //sign签名
  234. jsonobject.put("sign", sign);
  235. //返回的结果中 code为1表示成功
  236. String result = RequestUtils.httpPost(url, jsonobject.toJSONString());
  237. if (result.contains("更新成功")) {
  238. //region 更新希沃班级
  239. //希沃班级传输特点:
  240. //当前月份小于9月份就传当前年份 - 1 ;如果大于9月份就传当前年份
  241. Integer nowMonth = Integer.valueOf(TimeExchange.getNowMonth());
  242. //初始化客户端
  243. SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  244. //region 将K12校区的班级数据初始化
  245. if (oldData.getClassUid() == null) {
  246. K12Class(seewoClient, grade.getGradeNo(),nowMonth);
  247. }
  248. //endregion
  249. //region 将数据加入希沃系统中
  250. CommonResult<String[]> saveClass = SeewoInsertOrUpdateClass(seewoClient, ucr.getClassNo(), ucr.getName(), grade.getGradeNo(), nowMonth);
  251. if (!saveClass.isSuccess()) {
  252. return CommonResult.fail(saveClass.getMessage());
  253. }
  254. //endregion
  255. //endregion
  256. grade.setGradeUid(saveClass.getData()[0]);
  257. oldData.setClassUid(saveClass.getData()[1]);
  258. oldData.setClassNo(ucr.getClassNo());
  259. oldData.setName(ucr.getName());
  260. int updateClass = smartClassService.updateSmartClass(oldData);
  261. if (updateClass <= 0) {
  262. return CommonResult.fail("班级信息更新失败");
  263. }
  264. int updateGrade = smartGradeService.updateSmartGrade(grade);
  265. if (updateGrade <= 0) {
  266. throw new Exception("新增失败");
  267. }
  268. } else {
  269. return CommonResult.fail("班级信息更新失败");
  270. }
  271. //endregion
  272. return CommonResult.ok("班级信息更新成功");
  273. }
  274. //region 新增更新希沃班级
  275. //K12班级
  276. private void K12Class(SeewoClient seewoClient, Integer gradeNo, Integer nowMonth) {
  277. OrganizationNodeServiceInitSchoolClassesParam kParam = new OrganizationNodeServiceInitSchoolClassesParam();
  278. //响应体,MimeType为 application/json
  279. OrganizationNodeServiceInitSchoolClassesParam.RequestBody kRequestBody = OrganizationNodeServiceInitSchoolClassesParam.RequestBody.builder()
  280. .build();
  281. kParam.setRequestBody(kRequestBody);
  282. //query
  283. OrganizationNodeServiceInitSchoolClassesParam.Query kQuery = OrganizationNodeServiceInitSchoolClassesParam.Query.builder()
  284. .appId(seewoConfig.getAppId())
  285. .unitUid(seewoConfig.getSchoolId())
  286. .campusName("宜阳学校")
  287. .build();
  288. kRequestBody.setQuery(kQuery);
  289. //新增班级列表(最大200条)
  290. OrganizationNodeServiceInitSchoolClassesParam.Object kClassList = OrganizationNodeServiceInitSchoolClassesParam.Object.builder()
  291. .stageName("初中")
  292. .gradeYear(ClassYear.getAdmissionYear(gradeNo, Year.now().getValue(), LocalDate.now()))
  293. .build();
  294. kQuery.setClassList(java.util.Collections.singletonList(kClassList));
  295. kParam.setRequestBody(kRequestBody);
  296. OrganizationNodeServiceInitSchoolClassesRequest kRequest = new OrganizationNodeServiceInitSchoolClassesRequest(kParam);
  297. logger.info("入参:" + kRequest);
  298. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  299. //request.setServerUrl("https://openapi.test.seewo.com")
  300. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  301. OrganizationNodeServiceInitSchoolClassesResult kResult = seewoClient.invoke(kRequest);
  302. logger.info("出参:" + kResult);
  303. }
  304. //新增班级和年级
  305. public CommonResult<String[]> SeewoInsertOrUpdateClass(SeewoClient seewoClient, Integer classNo, String className, Integer gradeNo, Integer nowMonth) {
  306. String[] result = new String[2];
  307. //初始化客户端
  308. //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  309. ClassServiceBatchSaveClassParam param = new ClassServiceBatchSaveClassParam();
  310. //请求体,MimeType为 application/json
  311. ClassServiceBatchSaveClassParam.JSONRequestBody requestBody = ClassServiceBatchSaveClassParam.JSONRequestBody.builder()
  312. .build();
  313. param.setRequestBody(requestBody);
  314. //查询条件
  315. ClassServiceBatchSaveClassParam.ClassSaveQuery query = ClassServiceBatchSaveClassParam.ClassSaveQuery.builder()
  316. .appId(seewoConfig.getAppId())
  317. .schoolUid(seewoConfig.getSchoolId())
  318. .build();
  319. requestBody.setQuery(query);
  320. //班级信息列表
  321. ClassServiceBatchSaveClassParam.ClassInfo classList = ClassServiceBatchSaveClassParam.ClassInfo.builder()
  322. .stageCode("CodeSchoolStage_1")
  323. .clazz(classNo)
  324. .nickName(className)
  325. .grade(gradeNo)
  326. .gradeYear(ClassYear.getAdmissionYear(gradeNo, Year.now().getValue(), LocalDate.now()))
  327. .build();
  328. query.setClassList(java.util.Collections.singletonList(classList));
  329. param.setRequestBody(requestBody);
  330. ClassServiceBatchSaveClassRequest request = new ClassServiceBatchSaveClassRequest(param);
  331. logger.info("入参:" + request);
  332. logger.info("入参body:" + JSON.toJSON(requestBody));
  333. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  334. // request.setServerUrl("https://openapi.test.seewo.com")
  335. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  336. ClassServiceBatchSaveClassResult xwResult = seewoClient.invoke(request);
  337. logger.info("出参:" + xwResult);
  338. if (xwResult == null) {
  339. return CommonResult.fail("希沃班级数据新增失败!");
  340. }
  341. if (!xwResult.getResponseBody().getCode().equals("000000")) {
  342. return CommonResult.fail(xwResult.getResponseBody().getMessage());
  343. }
  344. String gradeUid = xwResult.getResponseBody().getData().get(0).getGradeUid();
  345. String classUid = xwResult.getResponseBody().getData().get(0).getUid();
  346. result[0] = gradeUid;
  347. result[1] = classUid;
  348. return CommonResult.ok(result);
  349. }
  350. //endregion
  351. @Override
  352. @DESRespondSecret(validated = true)
  353. public CommonResult initSchoolClasses() {
  354. //初始化客户端
  355. SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
  356. OrganizationNodeServiceInitSchoolClassesParam param = new OrganizationNodeServiceInitSchoolClassesParam();
  357. //响应体,MimeType为 application/json
  358. OrganizationNodeServiceInitSchoolClassesParam.RequestBody requestBody = OrganizationNodeServiceInitSchoolClassesParam.RequestBody.builder()
  359. .build();
  360. param.setRequestBody(requestBody);
  361. //query
  362. OrganizationNodeServiceInitSchoolClassesParam.Query query = OrganizationNodeServiceInitSchoolClassesParam.Query.builder()
  363. .appId(seewoConfig.getAppId())
  364. .unitUid(seewoConfig.getSchoolId())
  365. .campusName("宜阳学校")
  366. .build();
  367. requestBody.setQuery(query);
  368. //新增班级列表(最大200条)
  369. OrganizationNodeServiceInitSchoolClassesParam.Object classList = OrganizationNodeServiceInitSchoolClassesParam.Object.builder()
  370. .stageName("初中")
  371. .gradeYear(2022)
  372. .build();
  373. query.setClassList(java.util.Collections.singletonList(classList));
  374. param.setRequestBody(requestBody);
  375. OrganizationNodeServiceInitSchoolClassesRequest request = new OrganizationNodeServiceInitSchoolClassesRequest(param);
  376. logger.info("入参:" + request);
  377. //如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
  378. //request.setServerUrl("https://openapi.test.seewo.com")
  379. //执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
  380. OrganizationNodeServiceInitSchoolClassesResult result = seewoClient.invoke(request);
  381. logger.info("出参:" + result);
  382. return null;
  383. }
  384. }