SmartClassController.java 21 KB

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