ExamOrganizationRelationServiceImpl.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. package com.keao.edu.user.service.impl;
  2. import cfca.sadk.org.bouncycastle.apache.bzip2.BZip2Constants;
  3. import com.keao.edu.auth.api.client.SysUserFeignService;
  4. import com.keao.edu.auth.api.entity.SysUser;
  5. import com.keao.edu.common.dal.BaseDAO;
  6. import com.keao.edu.common.entity.SysConfig;
  7. import com.keao.edu.common.enums.MessageTypeEnum;
  8. import com.keao.edu.common.exception.BizException;
  9. import com.keao.edu.common.page.PageInfo;
  10. import com.keao.edu.common.service.SysMessageService;
  11. import com.keao.edu.common.service.impl.BaseServiceImpl;
  12. import com.keao.edu.common.tenant.TenantContextHolder;
  13. import com.keao.edu.thirdparty.message.provider.JiguangPushPlugin;
  14. import com.keao.edu.thirdparty.message.provider.YimeiSmsPlugin;
  15. import com.keao.edu.user.dao.*;
  16. import com.keao.edu.user.dto.ExamOrganStatisticsDto;
  17. import com.keao.edu.user.dto.ExamOrganizationRelationExtraDto;
  18. import com.keao.edu.user.entity.*;
  19. import com.keao.edu.user.enums.ExamStatusEnum;
  20. import com.keao.edu.user.enums.TransStatusEnum;
  21. import com.keao.edu.user.enums.YesOrNoEnum;
  22. import com.keao.edu.user.page.ExamOrganizationRelationQueryInfo;
  23. import com.keao.edu.user.service.ExamOrganizationRelationService;
  24. import com.keao.edu.user.service.OrganizationService;
  25. import com.keao.edu.user.service.ShortUrlService;
  26. import com.keao.edu.user.service.SysConfigService;
  27. import com.keao.edu.util.collection.MapUtil;
  28. import com.keao.edu.util.date.DateUtil;
  29. import org.apache.commons.beanutils.BeanUtils;
  30. import org.apache.commons.lang3.StringUtils;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Isolation;
  34. import org.springframework.transaction.annotation.Transactional;
  35. import org.springframework.util.CollectionUtils;
  36. import java.lang.reflect.InvocationTargetException;
  37. import java.math.BigDecimal;
  38. import java.time.LocalDate;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. @Service
  42. public class ExamOrganizationRelationServiceImpl extends BaseServiceImpl<Long, ExamOrganizationRelation> implements ExamOrganizationRelationService {
  43. @Autowired
  44. private ExamOrganizationRelationDao examOrganizationRelationDao;
  45. @Autowired
  46. private ExaminationBasicDao examinationBasicDao;
  47. @Autowired
  48. private OrganizationService organizationService;
  49. @Autowired
  50. private OrganizationDao organizationDao;
  51. @Autowired
  52. private ShortUrlService shortUrlService;
  53. @Autowired
  54. private SysUserFeignService sysUserFeignService;
  55. @Autowired
  56. private SysConfigService sysConfigService;
  57. @Autowired
  58. private TenantInfoDao tenantInfoDao;
  59. @Autowired
  60. private SysUserDao sysUserDao;
  61. @Autowired
  62. private SysMessageService sysMessageService;
  63. @Autowired
  64. private ExamLifecycleLogDao examLifecycleLogDao;
  65. @Autowired
  66. private ExamRegistrationPaymentDao examRegistrationPaymentDao;
  67. @Autowired
  68. private ExamManualLedgerDao examManualLedgerDao;
  69. public static final Set<ExamStatusEnum> EDIT_ABLE_EXAM_STATUS=new HashSet<>(Arrays.asList(ExamStatusEnum.SETTING,ExamStatusEnum.NOT_START,ExamStatusEnum.APPLYING,ExamStatusEnum.APPLIED));
  70. @Override
  71. public BaseDAO<Long, ExamOrganizationRelation> getDAO() {
  72. return examOrganizationRelationDao;
  73. }
  74. @Override
  75. public PageInfo<ExamOrganizationRelationExtraDto> queryExamOrgans(ExamOrganizationRelationQueryInfo queryInfo) {
  76. PageInfo<ExamOrganizationRelationExtraDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
  77. Map<String, Object> params = new HashMap<String, Object>();
  78. MapUtil.populateMap(params, queryInfo);
  79. List<Integer> nextLevelOrganIds = organizationService.getNextLevelOrganIds(queryInfo.getOrganId(), false);
  80. params.put("organIds", nextLevelOrganIds);
  81. List<ExamOrganizationRelationExtraDto> dataList = new ArrayList<>();
  82. int count = examOrganizationRelationDao.countExamOrgans(params);
  83. if (count > 0) {
  84. pageInfo.setTotal(count);
  85. params.put("offset", pageInfo.getOffset());
  86. dataList = examOrganizationRelationDao.queryExamOrgans(params);
  87. List<Integer> organIds = dataList.stream().map(ExamOrganizationRelation::getOrganId).collect(Collectors.toList());
  88. for (ExamOrganizationRelationExtraDto examOrganizationRelation : dataList) {
  89. if(examOrganizationRelation.getOrganId().equals(queryInfo.getOrganId())){
  90. examOrganizationRelation.setSelfOrgan(1);
  91. }
  92. }
  93. }
  94. pageInfo.setRows(dataList);
  95. return pageInfo;
  96. }
  97. @Override
  98. public List<ExamOrganizationRelationExtraDto> getChildOrgans(Long examId, Integer organId) {
  99. List<Integer> childOrganIds = organizationService.getChildOrganIds(organId, true);
  100. return examOrganizationRelationDao.getExamChildOrgans(examId,childOrganIds);
  101. }
  102. @Override
  103. @Transactional(rollbackFor = Exception.class)
  104. public void addExamOrganizations(Long examId, String orgainIdsStr) {
  105. if(Objects.isNull(examId)){
  106. throw new BizException("请指定考级项目");
  107. }
  108. if(StringUtils.isBlank(orgainIdsStr)){
  109. throw new BizException("请指定合作单位");
  110. }
  111. ExaminationBasic examinationBasic = examinationBasicDao.get(examId.longValue());
  112. if(Objects.isNull(examinationBasic)){
  113. throw new BizException("考级项目不存在");
  114. }
  115. if(!EDIT_ABLE_EXAM_STATUS.contains(examinationBasic.getStatus())){
  116. throw new BizException("当前状态暂不可添加合作单位");
  117. }
  118. Set<Integer> organIdsWithExam = examOrganizationRelationDao.getOrganIdsWithExam(examId.intValue());
  119. List<Integer> organIds = Arrays.stream(orgainIdsStr.split(",")).map(e -> Integer.valueOf(e)).collect(Collectors.toList());
  120. List<Organization> organs = organizationDao.getOrgans(organIds);
  121. if(organs.size()!=organIds.size()){
  122. throw new BizException("合作单位信息错误");
  123. }
  124. SysConfig baseUrlConfig = sysConfigService.findByParamName(SysConfigService.BASE_H5_URL);
  125. String baseUrl="";
  126. if(Objects.nonNull(baseUrlConfig)){
  127. baseUrl=baseUrlConfig.getParanValue();
  128. }
  129. baseUrl = baseUrl+"/#/signUp?";
  130. Map<Integer, Organization> idOrganMap = organs.stream().collect(Collectors.toMap(Organization::getId, o -> o));
  131. List<ExamOrganizationRelation> organizationRelations=new ArrayList<>();
  132. for (Integer organId : organIds) {
  133. if(organIdsWithExam.contains(organId)){
  134. throw new BizException("合作单位冲突");
  135. }
  136. ExamOrganizationRelation og = new ExamOrganizationRelation();
  137. og.setTenantId(TenantContextHolder.getTenantId());
  138. og.setExaminationBasicId(examId.intValue());
  139. og.setOrganId(organId);
  140. Organization organization = idOrganMap.get(organId);
  141. if(Objects.isNull(organization)){
  142. throw new BizException("合作单位信息错误");
  143. }
  144. og.setSendUrlFlag(1);
  145. og.setIsAllowArrangeExam(1);
  146. og.setSettlementType(organization.getSettlementType());
  147. og.setShareProfitAmount(organization.getShareProfitAmount());
  148. og.setTotalRegistrationStudentNum(BigDecimal.ZERO.intValue());
  149. og.setTotalPaymentAmount(BigDecimal.ZERO);
  150. og.setTotalTransAmount(BigDecimal.ZERO);
  151. og.setSelfRegistrationStudentNum(BigDecimal.ZERO.intValue());
  152. og.setSelfPaymentAmount(BigDecimal.ZERO);
  153. String registrationUrl = baseUrl + "examId=" + examId + "&organId=" + organId;
  154. String registShortUrl = shortUrlService.createShortUrl(registrationUrl);
  155. og.setUrl(registShortUrl);
  156. organizationRelations.add(og);
  157. }
  158. examOrganizationRelationDao.batchInsert(organizationRelations);
  159. }
  160. @Override
  161. @Transactional(rollbackFor = Exception.class)
  162. public void addExamOrganizations(List<ExamOrganizationRelation> organizationRelations, Integer selfOrganId) {
  163. if(CollectionUtils.isEmpty(organizationRelations)){
  164. throw new BizException("请指定考级项目");
  165. }
  166. if(Objects.isNull(organizationRelations.get(0).getExaminationBasicId())){
  167. throw new BizException("请指定考级项目");
  168. }
  169. ExaminationBasic examinationBasic = examinationBasicDao.get(organizationRelations.get(0).getExaminationBasicId().longValue());
  170. if(Objects.isNull(examinationBasic)){
  171. throw new BizException("考级项目不存在");
  172. }
  173. if(!EDIT_ABLE_EXAM_STATUS.contains(examinationBasic.getStatus())){
  174. throw new BizException("当前状态暂不可添加合作单位");
  175. }
  176. ExamOrganStatisticsDto examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examinationBasic.getId(), selfOrganId);
  177. if(Objects.isNull(examOrganizationRelation)){
  178. throw new BizException("操作异常");
  179. }
  180. Set<Integer> organIdsWithExam = examOrganizationRelationDao.getOrganIdsWithExam(examinationBasic.getId().intValue());
  181. List<Integer> organIds = organizationRelations.stream().filter(e->Objects.nonNull(e.getOrganId())).map(ExamOrganizationRelation::getOrganId).collect(Collectors.toList());
  182. if(organIds.size()!=organizationRelations.size()){
  183. throw new BizException("参数错误");
  184. }
  185. List<Organization> organs = organizationDao.getOrgans(organIds);
  186. if(organs.size()!=organIds.size()){
  187. throw new BizException("合作单位信息错误");
  188. }
  189. Map<Integer, Organization> idOrganMap = organs.stream().collect(Collectors.toMap(Organization::getId, o -> o));
  190. for (ExamOrganizationRelation og : organizationRelations) {
  191. if(organIdsWithExam.contains(og.getOrganId())){
  192. throw new BizException("合作单位冲突");
  193. }
  194. if(Objects.isNull(og.getIsAllowArrangeExam())){
  195. throw new BizException("参数错误");
  196. }
  197. if(Objects.isNull(og.getSettlementType())){
  198. throw new BizException("参数错误");
  199. }
  200. if(Objects.isNull(og.getShareProfitAmount())){
  201. throw new BizException("参数错误");
  202. }
  203. if(examOrganizationRelation.getIsAllowArrangeExam()==0){
  204. og.setIsAllowArrangeExam(0);
  205. }
  206. og.setTenantId(TenantContextHolder.getTenantId());
  207. og.setExaminationBasicId(examinationBasic.getId().intValue());
  208. og.setSendUrlFlag(0);
  209. og.setTotalRegistrationStudentNum(BigDecimal.ZERO.intValue());
  210. og.setTotalPaymentAmount(BigDecimal.ZERO);
  211. og.setTotalTransAmount(BigDecimal.ZERO);
  212. og.setSelfRegistrationStudentNum(BigDecimal.ZERO.intValue());
  213. og.setSelfPaymentAmount(BigDecimal.ZERO);
  214. }
  215. examOrganizationRelationDao.batchInsert(organizationRelations);
  216. }
  217. @Override
  218. @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
  219. public void updateExamOrganizationRelation(ExamOrganizationRelation examOrganizationRelation,Integer selfOrganId) {
  220. if(Objects.isNull(examOrganizationRelation.getId())){
  221. throw new BizException("参数错误");
  222. }
  223. ExamOrganizationRelation organizationRelation = examOrganizationRelationDao.get(examOrganizationRelation.getId());
  224. if(Objects.isNull(organizationRelation)){
  225. throw new BizException("参数错误");
  226. }
  227. ExamOrganStatisticsDto selfOrgan = examOrganizationRelationDao.getExamOrganizationRelation(organizationRelation.getExaminationBasicId().longValue(), selfOrganId);
  228. if(Objects.isNull(selfOrgan)){
  229. throw new BizException("操作异常");
  230. }
  231. if(selfOrgan.getIsAllowArrangeExam()==0&&examOrganizationRelation.getIsAllowArrangeExam()==1){
  232. throw new BizException("暂无权限");
  233. }
  234. if(Objects.nonNull(examOrganizationRelation.getIsAllowArrangeExam())&&examOrganizationRelation.getIsAllowArrangeExam()==0){
  235. List<Integer> childOrganIds = organizationService.getChildOrganIds(organizationRelation.getOrganId(), false);
  236. examOrganizationRelationDao.updateOrganAllowArrangeExamStatus(organizationRelation.getExaminationBasicId().longValue(), 0, childOrganIds);
  237. }
  238. examOrganizationRelationDao.update(examOrganizationRelation);
  239. }
  240. @Override
  241. @Transactional(rollbackFor = Exception.class)
  242. public void deleteExamOrgan(Long id) {
  243. if(Objects.isNull(id)){
  244. throw new BizException("参数错误");
  245. }
  246. ExamOrganizationRelation organizationRelation = examOrganizationRelationDao.get(id);
  247. if(Objects.isNull(organizationRelation)){
  248. throw new BizException("删除失败");
  249. }
  250. List<Integer> childOrganIds = organizationService.getChildOrganIds(organizationRelation.getOrganId(), true);
  251. List<ExamOrganizationRelation> examOrganizationRelations = examOrganizationRelationDao.getExamOrganizationRelations(organizationRelation.getExaminationBasicId().longValue(), childOrganIds);
  252. long count = examOrganizationRelations.stream().filter(e -> e.getSendUrlFlag() == 1).count();
  253. if(count>0){
  254. throw new BizException("删除失败");
  255. }
  256. examOrganizationRelationDao.deleteExamOrgans(organizationRelation.getExaminationBasicId().longValue(), childOrganIds);
  257. }
  258. @Override
  259. @Transactional(rollbackFor = Exception.class)
  260. public void sendUrl(Integer examId, Integer selfOrganId) {
  261. if(Objects.isNull(examId)){
  262. throw new BizException("请指定考级项目");
  263. }
  264. List<Integer> childOrganIds = organizationService.getNextLevelOrganIds(selfOrganId, false);
  265. ExamOrganStatisticsDto examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(examId.longValue(), selfOrganId);
  266. if(Objects.isNull(examOrganizationRelation)){
  267. throw new BizException("数据异常");
  268. }
  269. if(examOrganizationRelation.getSendUrlFlag()==0){
  270. throw new BizException("发送失败");
  271. }
  272. List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getExamOrganizationRelations(examId.longValue(), childOrganIds);
  273. Set<Integer> existOrganizationIds = examOrgans.stream().map(ExamOrganizationRelation::getOrganId).collect(Collectors.toSet());
  274. ExaminationBasic examinationBasic = examinationBasicDao.get(examId.longValue());
  275. if(Objects.isNull(examinationBasic)){
  276. throw new BizException("考级项目不存在");
  277. }
  278. if(ExamStatusEnum.CLOSE.equals(examinationBasic.getStatus())){
  279. throw new BizException("考级项目已关闭");
  280. }
  281. StringBuffer expectRegistTime = new StringBuffer(DateUtil.dateToString(examinationBasic.getEnrollStartTime(), "yyyy年MM月dd日 HH时mm分"));
  282. expectRegistTime.append("-");
  283. expectRegistTime.append(DateUtil.dateToString(examinationBasic.getEnrollEndTime(), "yyyy年MM月dd日 HH时mm分"));
  284. TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(examinationBasic.getOrganId());
  285. if(Objects.isNull(tenantInfo)){
  286. throw new BizException("考级信息错误");
  287. }
  288. SysConfig baseUrlConfig = sysConfigService.findByParamName(SysConfigService.BASE_H5_URL);
  289. String baseUrl="";
  290. if(Objects.nonNull(baseUrlConfig)){
  291. baseUrl=baseUrlConfig.getParanValue();
  292. }
  293. baseUrl = baseUrl+"/#/signUp?";
  294. List<ExamOrganizationRelation> needUpdate=new ArrayList<>();
  295. for (ExamOrganizationRelation examOrgan : examOrgans) {
  296. if(YesOrNoEnum.YES.getCode().equals(examOrgan.getSendUrlFlag())){
  297. continue;
  298. }
  299. String registrationUrl = baseUrl + "examId=" + examinationBasic.getId() + "&organId=" + examOrgan.getOrganId();
  300. String registShortUrl = shortUrlService.createShortUrl(registrationUrl);
  301. examOrgan.setUrl(registShortUrl);
  302. examOrgan.setSendUrlFlag(1);
  303. needUpdate.add(examOrgan);
  304. SysUser organUser = sysUserDao.getWithOrgan(examOrgan.getOrganId());
  305. Map<Integer, String> userPhoneMap = new HashMap<>();
  306. userPhoneMap.put(organUser.getId(), organUser.getPhone());
  307. sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGISTRATION_URL_SMS,
  308. userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
  309. tenantInfo.getName(), examinationBasic.getName(), expectRegistTime.toString(), examOrgan.getUrl());
  310. }
  311. if(!CollectionUtils.isEmpty(needUpdate)){
  312. examOrganizationRelationDao.batchUpdate(needUpdate);
  313. examLifecycleLogDao.insert(new ExamLifecycleLog(examinationBasic.getId().intValue(), "发送考级连接", examinationBasic.getCreatorId()));
  314. }
  315. if(examinationBasic.getStatus().equals(ExamStatusEnum.SETTING)){
  316. examinationBasic.setStatus(ExamStatusEnum.NOT_START);
  317. examinationBasicDao.update(examinationBasic);
  318. }
  319. }
  320. @Override
  321. @Transactional(rollbackFor = Exception.class)
  322. public void examStatusChangePush(Long examId, ExamStatusEnum examStatus) {
  323. if(Objects.isNull(examId)||Objects.isNull(examStatus)){
  324. return;
  325. }
  326. ExaminationBasic exam = examinationBasicDao.get(examId);
  327. if(Objects.isNull(exam)){
  328. return;
  329. }
  330. MessageTypeEnum messageType=null;
  331. switch (examStatus){
  332. case APPLIED:
  333. messageType = MessageTypeEnum.EXAM_REGISTRATION_CLOSE_SMS;
  334. break;
  335. case CLOSE:
  336. messageType = MessageTypeEnum.EXAM_CLOSE_SMS;
  337. break;
  338. }
  339. if(Objects.isNull(messageType)){
  340. return;
  341. }
  342. TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(exam.getOrganId());
  343. List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getOrganInfoWithExam(examId.intValue());
  344. Map<Integer, String> userPhoneMap = new HashMap<>();
  345. for (ExamOrganizationRelation examOrgan : examOrgans) {
  346. if(examOrgan.getOrganId().equals(exam.getOrganId())){
  347. continue;
  348. }
  349. userPhoneMap.put(examOrgan.getOrganization().getUserId(), examOrgan.getOrganization().getContactPhone());
  350. }
  351. if(CollectionUtils.isEmpty(userPhoneMap)){
  352. return;
  353. }
  354. sysMessageService.batchSendMessage(messageType,
  355. userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
  356. tenantInfo.getName(), exam.getName());
  357. }
  358. @Override
  359. public void examDateChangePush(Long examId) {
  360. if(Objects.isNull(examId)){
  361. return;
  362. }
  363. ExaminationBasic exam = examinationBasicDao.get(examId);
  364. if(Objects.isNull(exam)){
  365. return;
  366. }
  367. TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(exam.getOrganId());
  368. List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getOrganInfoWithExam(examId.intValue());
  369. Map<Integer, String> userPhoneMap = new HashMap<>();
  370. for (ExamOrganizationRelation examOrgan : examOrgans) {
  371. if(examOrgan.getOrganId().equals(exam.getOrganId())){
  372. continue;
  373. }
  374. userPhoneMap.put(examOrgan.getOrganization().getUserId(), examOrgan.getOrganization().getContactPhone());
  375. }
  376. if(CollectionUtils.isEmpty(userPhoneMap)){
  377. return;
  378. }
  379. String enrollStartTimeStr = DateUtil.dateToString(exam.getEnrollStartTime(), "yyyy年MM月dd日 HH时mm分");
  380. String enrollEndTimeStr = DateUtil.dateToString(exam.getEnrollEndTime(), "yyyy年MM月dd日 HH时mm分");
  381. sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGIST_TIME_CHANGE_SMS,
  382. userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
  383. tenantInfo.getName(), exam.getName(), enrollStartTimeStr, enrollEndTimeStr);
  384. }
  385. @Override
  386. public void examRegistCutOffPush(Long examId) {
  387. if(Objects.isNull(examId)){
  388. return;
  389. }
  390. ExaminationBasic exam = examinationBasicDao.get(examId);
  391. if(Objects.isNull(exam)){
  392. return;
  393. }
  394. TenantInfo tenantInfo = tenantInfoDao.getWithOrgan(exam.getOrganId());
  395. List<ExamOrganizationRelation> examOrgans = examOrganizationRelationDao.getOrganInfoWithExam(examId.intValue());
  396. Map<Integer, String> userPhoneMap = new HashMap<>();
  397. for (ExamOrganizationRelation examOrgan : examOrgans) {
  398. userPhoneMap.put(examOrgan.getOrganization().getUserId(), examOrgan.getOrganization().getContactPhone());
  399. }
  400. if(CollectionUtils.isEmpty(userPhoneMap)){
  401. return;
  402. }
  403. sysMessageService.batchSendMessage(MessageTypeEnum.EXAM_REGIST_EXPIRE_SMS,
  404. userPhoneMap, null, 0, null, YimeiSmsPlugin.PLUGIN_NAME,
  405. tenantInfo.getName(), exam.getName());
  406. }
  407. @Override
  408. public ExamOrganStatisticsDto getExamOrganStatistics(Integer organId, Long examId) {
  409. if(Objects.isNull(examId)){
  410. throw new BizException("请指定考级项目");
  411. }
  412. ExaminationBasic examinationBasic = examinationBasicDao.get(examId);
  413. if(Objects.isNull(examinationBasic)){
  414. throw new BizException("考级项目不存在");
  415. }
  416. ExamOrganStatisticsDto examOrganStatistics = examOrganizationRelationDao.getExamOrganizationRelation(examId, organId);
  417. if(Objects.isNull(examOrganStatistics)){
  418. examOrganStatistics=new ExamOrganStatisticsDto();
  419. }
  420. if(Objects.isNull(examOrganStatistics.getSettlementType())){
  421. examOrganStatistics.setIsAllowArrangeExam(1);
  422. }
  423. examOrganStatistics.setExamLifecycleLogs(examLifecycleLogDao.findWithExam(examId));
  424. Map<String, BigDecimal> dayTransAmount=new LinkedHashMap<>();
  425. Map<String, BigDecimal> dayPaymentAmount=new LinkedHashMap<>();
  426. LocalDate today = LocalDate.now();
  427. List<String> days=new ArrayList<>();
  428. days.add(today.toString());
  429. dayTransAmount.put(today.toString(), BigDecimal.ZERO);
  430. dayPaymentAmount.put(today.toString(), BigDecimal.ZERO);
  431. for (int i=-1;i>-7;i--){
  432. days.add(today.plusDays(i).toString());
  433. dayTransAmount.put(today.plusDays(i).toString(), BigDecimal.ZERO);
  434. dayPaymentAmount.put(today.plusDays(i).toString(), BigDecimal.ZERO);
  435. }
  436. List<ExamRegistrationPayment> examRegistrationPayments = examRegistrationPaymentDao.getWithExamOrganAndDay(examId, organId, days);
  437. List<ExamManualLedger> examOrganManualLedgers = examManualLedgerDao.getExamOrganManualLedgers(organId, examId, days);
  438. Map<String, List<ExamRegistrationPayment>> dayPaymentMap = new HashMap<>();
  439. if(!CollectionUtils.isEmpty(examRegistrationPayments)){
  440. dayPaymentMap = examRegistrationPayments.stream().filter(e-> TransStatusEnum.SUCCESS.equals(e.getTransStatus())).collect(Collectors.groupingBy(e -> DateUtil.dateToString(e.getTransSuccessedTime())));
  441. }
  442. Map<String, List<ExamManualLedger>> dayLedgerMap = new HashMap<>();
  443. if(!CollectionUtils.isEmpty(examOrganManualLedgers)){
  444. dayLedgerMap = examOrganManualLedgers.stream().collect(Collectors.groupingBy(e -> DateUtil.dateToString(e.getTransTime())));
  445. }
  446. for (String day : dayTransAmount.keySet()) {
  447. List<ExamManualLedger> dayLeders = dayLedgerMap.get(day);
  448. if(CollectionUtils.isEmpty(dayLeders)){
  449. continue;
  450. }
  451. BigDecimal amount = dayLeders.stream().map(ExamManualLedger::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
  452. dayTransAmount.put(day, amount);
  453. }
  454. for (String day : dayPaymentAmount.keySet()) {
  455. List<ExamRegistrationPayment> dayPayments = dayPaymentMap.get(day);
  456. if(CollectionUtils.isEmpty(dayPayments)){
  457. continue;
  458. }
  459. BigDecimal amount = dayPayments.stream().map(ExamRegistrationPayment::getTransAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
  460. dayPaymentAmount.put(day, amount);
  461. }
  462. examOrganStatistics.setDayTransAmount(dayTransAmount);
  463. examOrganStatistics.setDayPaymentAmount(dayPaymentAmount);
  464. return examOrganStatistics;
  465. }
  466. @Override
  467. public Map<String, Object> queryUnRelatedOrgans(ExamOrganizationRelationQueryInfo queryInfo) {
  468. PageInfo<Organization> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
  469. Map<String, Object> params = new HashMap<String, Object>();
  470. MapUtil.populateMap(params, queryInfo);
  471. List<Integer> nextLevelOrganIds = organizationService.getNextLevelOrganIds(queryInfo.getOrganId(), false);
  472. params.put("organIds", nextLevelOrganIds);
  473. List<Organization> dataList = new ArrayList<>();
  474. int count = examOrganizationRelationDao.countUnRelatedOrgans(params);
  475. if (count > 0) {
  476. pageInfo.setTotal(count);
  477. params.put("offset", pageInfo.getOffset());
  478. dataList = examOrganizationRelationDao.queryUnRelatedOrgans(params);
  479. }
  480. ExamOrganStatisticsDto examOrganizationRelation = examOrganizationRelationDao.getExamOrganizationRelation(queryInfo.getExamId().longValue(), queryInfo.getOrganId());
  481. pageInfo.setRows(dataList);
  482. Map<String, Object> result=new HashMap<>();
  483. result.put("pageInfo", pageInfo);
  484. if(Objects.nonNull(examOrganizationRelation)){
  485. result.put("isAllowArrangeExam",examOrganizationRelation.getIsAllowArrangeExam());
  486. }else{
  487. result.put("isAllowArrangeExam",0);
  488. }
  489. return result;
  490. }
  491. }