StudentOrderController.java 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935
  1. package com.ym.mec.student.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.huifu.adapay.core.AdapayCore;
  6. import com.huifu.adapay.core.util.AdapaySign;
  7. import com.yeepay.g3.sdk.yop.encrypt.DigitalEnvelopeDTO;
  8. import com.yeepay.g3.sdk.yop.utils.DigitalEnvelopeUtils;
  9. import com.yeepay.g3.sdk.yop.utils.RSAKeyUtils;
  10. import com.ym.mec.auth.api.client.SysUserFeignService;
  11. import com.ym.mec.auth.api.entity.SysUser;
  12. import com.ym.mec.biz.dal.dao.*;
  13. import com.ym.mec.biz.dal.dto.*;
  14. import com.ym.mec.biz.dal.entity.*;
  15. import com.ym.mec.biz.dal.enums.*;
  16. import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
  17. import com.ym.mec.biz.dal.vo.StudentPaymentOrderVo;
  18. import com.ym.mec.biz.dal.wrapper.CloudTeacherOrderWrapper;
  19. import com.ym.mec.biz.service.*;
  20. import com.ym.mec.common.controller.BaseController;
  21. import com.ym.mec.common.entity.HttpResponseResult;
  22. import com.ym.mec.common.exception.BizException;
  23. import com.ym.mec.common.page.PageInfo;
  24. import com.ym.mec.common.tenant.TenantContextHolder;
  25. import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
  26. import com.ym.mec.thirdparty.yqpay.Msg;
  27. import com.ym.mec.util.date.DateUtil;
  28. import com.ym.mec.util.http.HttpUtil;
  29. import com.ym.mec.util.web.WebUtil;
  30. import io.swagger.annotations.Api;
  31. import io.swagger.annotations.ApiImplicitParam;
  32. import io.swagger.annotations.ApiImplicitParams;
  33. import io.swagger.annotations.ApiOperation;
  34. import org.apache.commons.collections.CollectionUtils;
  35. import org.apache.commons.lang3.StringUtils;
  36. import org.slf4j.Logger;
  37. import org.slf4j.LoggerFactory;
  38. import org.springframework.beans.factory.annotation.Autowired;
  39. import org.springframework.beans.factory.annotation.Value;
  40. import org.springframework.http.HttpStatus;
  41. import org.springframework.scheduling.annotation.EnableScheduling;
  42. import org.springframework.web.bind.annotation.*;
  43. import javax.servlet.http.HttpServletRequest;
  44. import javax.servlet.http.HttpServletResponse;
  45. import java.io.IOException;
  46. import java.math.BigDecimal;
  47. import java.net.URLEncoder;
  48. import java.security.PrivateKey;
  49. import java.security.PublicKey;
  50. import java.util.*;
  51. import java.util.stream.Collectors;
  52. @RequestMapping("${app-config.url.student:}/studentOrder")
  53. @Api(tags = "订单回调")
  54. @RestController
  55. @EnableScheduling
  56. public class StudentOrderController extends BaseController {
  57. private static final Logger logger = LoggerFactory.getLogger(StudentOrderController.class);
  58. @Autowired
  59. private StudentPaymentOrderService studentPaymentOrderService;
  60. @Autowired
  61. private VipGroupService vipGroupService;
  62. @Autowired
  63. private MusicGroupService musicGroupService;
  64. @Autowired
  65. private StudentPaymentOrderDetailService studentPaymentOrderDetailService;
  66. @Autowired
  67. private StudentPaymentOrderDao studentPaymentOrderDao;
  68. @Autowired
  69. private SysConfigDao sysConfigDao;
  70. @Autowired
  71. private SporadicChargeInfoService sporadicChargeInfoService;
  72. @Autowired
  73. private OrganizationDao organizationDao;
  74. @Autowired
  75. private CourseScheduleEvaluateDao courseScheduleEvaluateDao;
  76. @Autowired
  77. private StudentGoodsSellDao studentGoodsSellDao;
  78. @Autowired
  79. private LuckDrawCountService luckDrawCountService;
  80. @Autowired
  81. private DegreeRegistrationDao degreeRegistrationDao;
  82. @Autowired
  83. private SysUserFeignService sysUserFeignService;
  84. @Autowired
  85. private MusicGroupPaymentCalenderDao musicGroupPaymentCalenderDao;
  86. @Autowired
  87. private MusicGroupPaymentCalenderCourseSettingsDao musicGroupPaymentCalenderCourseSettingsDao;
  88. @Autowired
  89. private ReplacementInstrumentActivityDao replacementInstrumentActivityDao;
  90. @Autowired
  91. private CloudTeacherOrderService cloudTeacherOrderService;
  92. @Autowired
  93. private SysCouponCodeDao sysCouponCodeDao;
  94. @Autowired
  95. private StudentRegistrationDao studentRegistrationDao;
  96. @Autowired
  97. private VipGroupActivityService vipGroupActivityService;
  98. @Autowired
  99. private TenantOrderRecordService tenantOrderRecordService;
  100. @Autowired
  101. private OrderPayOpsService orderPayOpsService;
  102. @Autowired
  103. private MusicGroupPaymentCalenderActivityService musicGroupPaymentCalenderActivityService;
  104. @Autowired
  105. private TenantConfigService tenantConfigService;
  106. @Autowired
  107. private OrganizationService organizationService;
  108. @Autowired
  109. private VipGroupCategoryDao vipGroupCategoryDao;
  110. @Autowired
  111. private TempBuyDoubleElevenUserLogDao tempBuyDoubleElevenUserLogDao;
  112. @Autowired
  113. private HfMerchantConfigService hfMerchantConfigService;
  114. @Autowired
  115. private TempDirectorTrainingCampDetailService tempDirectorTrainingCampDetailService;
  116. @Autowired
  117. private MusicGroupPaymentCalenderMemberService musicGroupPaymentCalenderMemberService;
  118. @Value("${spring.profiles.active:dev}")
  119. private String profiles;
  120. @ApiOperation(value = "查询订单列表")
  121. @GetMapping("/queryPage")
  122. public Object findGroupUsers(StudentPaymentOrderQueryInfo queryInfo) {
  123. SysUser user = sysUserFeignService.queryUserInfo();
  124. if (user == null) {
  125. return failed(HttpStatus.FORBIDDEN, "请登录");
  126. }
  127. queryInfo.setStudentId(user.getId());
  128. PageInfo<StudentPaymentOrderDto> studentPaymentOrderPageInfo = studentPaymentOrderService.OrderQueryPage(queryInfo);
  129. return succeed(studentPaymentOrderPageInfo);
  130. }
  131. @PostMapping("/callback/{orderNo}")
  132. public String callback(@PathVariable("orderNo") String orderNo, HttpServletRequest request) {
  133. StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.findOrderByOrderNo(orderNo);
  134. if(studentPaymentOrder == null) {
  135. return "订单号错误";
  136. }
  137. PaymentChannelEnum paymentChannel = PaymentChannelEnum.codeOf(studentPaymentOrder.getPaymentChannel());
  138. try {
  139. switch (paymentChannel) {
  140. case ADAPAY:
  141. // 验签请参data
  142. String data = request.getParameter("data");
  143. // 验签请参sign
  144. String sign = request.getParameter("sign");
  145. String transType = request.getParameter("type");
  146. logger.info("callback response param:[data]{} [sign]{} [type]{}", data, sign, transType);
  147. // 验签
  148. if (AdapaySign.verifySign(data, sign, AdapayCore.PUBLIC_KEY)) {
  149. JSONObject dataObj = JSON.parseObject(data);
  150. Map<String, String> notifyMap = new HashMap<>();
  151. switch (transType) {
  152. case "payment.succeeded":// 支付成功
  153. notifyMap.put("channelType", dataObj.getString("pay_channel"));
  154. notifyMap.put("tradeState", "1");
  155. notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
  156. notifyMap.put("merOrderNo", dataObj.getString("order_no"));
  157. studentPaymentOrderService.updateOrder(notifyMap);
  158. break;
  159. case "payment.failed":// 支付失败
  160. notifyMap.put("channelType", dataObj.getString("pay_channel"));
  161. notifyMap.put("tradeState", "0");
  162. notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
  163. notifyMap.put("merOrderNo", dataObj.getString("order_no"));
  164. studentPaymentOrderService.updateOrder(notifyMap);
  165. break;
  166. default:
  167. break;
  168. }
  169. } else {
  170. return "验签失败";
  171. }
  172. break;
  173. case YEEPAY:
  174. String content = request.getParameter("response");
  175. HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(studentPaymentOrder.getTenantId(), studentPaymentOrder.getPaymentChannel());
  176. if(hfMerchantConfig == null){
  177. throw new BizException("机构[{}][{}]商户信息找不到", studentPaymentOrder.getTenantId(), studentPaymentOrder.getPaymentChannel());
  178. }
  179. // 构造结果通知请求对象
  180. DigitalEnvelopeDTO dto = new DigitalEnvelopeDTO();
  181. dto.setCipherText(content);
  182. PrivateKey privateKey =RSAKeyUtils.string2PrivateKey(hfMerchantConfig.getRsaPrivateKey());
  183. PublicKey publicKey = RSAKeyUtils.string2PublicKey(hfMerchantConfig.getRsaPublicKey());
  184. dto = DigitalEnvelopeUtils.decrypt(dto, privateKey, publicKey);
  185. logger.info("易宝支付回调信息:response:{} plaintText:{}", content, dto.getPlainText());
  186. JSONObject dataObj = JSON.parseObject(dto.getPlainText());
  187. Map<String, String> notifyMap = new HashMap<>();
  188. notifyMap.put("channelType", dataObj.getString("channel"));
  189. if("SUCCESS".equals(dataObj.getString("status"))) {
  190. notifyMap.put("tradeState", "1");
  191. }else {
  192. notifyMap.put("tradeState", "0");
  193. }
  194. notifyMap.put("totalMoney", dataObj.getString("orderAmount"));
  195. notifyMap.put("merOrderNo", dataObj.getString("orderId"));
  196. studentPaymentOrderService.updateOrder(notifyMap);
  197. return "SUCCESS";
  198. default:
  199. break;
  200. }
  201. } catch (Exception e) {
  202. return e.getMessage();
  203. }
  204. return "succeeded";
  205. }
  206. @PostMapping("/notify")
  207. public Msg notify(@ModelAttribute Msg msg) throws Exception {
  208. logger.info(msg.toString());
  209. Map<String, Object> rqMap = new LinkedHashMap<String, Object>();
  210. rqMap.put("code", msg.getCode());
  211. rqMap.put("msg", msg.getMsg());
  212. rqMap.put("responseType", msg.getResponseType());
  213. rqMap.put("responseParameters", msg.getResponseParameters());
  214. rqMap.put("sign", msg.getSign());
  215. //boolean rs = YqPayUtil.verify(rqMap);
  216. msg.setMsg("fail");
  217. Map<String, String> notifyMap = new HashMap<>();
  218. //if (rs) {
  219. notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
  220. //}
  221. //支付中订单存在,更新状态
  222. if (msg.getResponseType().equals("1") && notifyMap.size() > 0) {
  223. String tradeState = msg.getCode().equals("88") ? "1" : "0";
  224. String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
  225. notifyMap.put("tradeState", tradeState);
  226. notifyMap.put("totalMoney", notifyMap.get("payAmount"));
  227. notifyMap.put("merOrderNo", notifyMap.get("merMerOrderNo"));
  228. notifyMap.put("channelType", channelType);
  229. studentPaymentOrderService.updateOrder(notifyMap);
  230. msg.setCode("000000");
  231. msg.setMsg("success");
  232. }
  233. return msg;
  234. }
  235. @ApiOperation(value = "查询订单状态")
  236. @PostMapping("/checkOrderStatus")
  237. public Object checkOrderStatus(String orderNo) {
  238. if (StringUtils.isBlank(orderNo)) {
  239. return failed("请指定订单");
  240. }
  241. StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
  242. if (Objects.isNull(orderByOrderNo)) {
  243. logger.info("checkOrderStatus >>>> tenantOrder {}", orderNo);
  244. Map<String, Object> tenantOrder = tenantOrderRecordService.checkTenantOrder(orderNo);
  245. if (Objects.nonNull(tenantOrder)) {
  246. return succeed(tenantOrder);
  247. }
  248. return failed("未找到指定订单");
  249. }
  250. HashMap<String, Object> orderDetail = new HashMap<>();
  251. orderDetail.put("order", orderByOrderNo);
  252. orderDetail.put("groupType", orderByOrderNo.getGroupType());
  253. //查询财务章
  254. //如果分部有企业信息,就用分部上的企业信息,否则用机构上的企业信息
  255. String financeChops = null;
  256. Organization organizationDto = organizationService.get(orderByOrderNo.getOrganId());
  257. if (organizationDto == null || StringUtils.isBlank(organizationDto.getCorporateName()) || StringUtils.isBlank(organizationDto.getCorporateCode())) {
  258. TenantConfig tenantConfig = tenantConfigService.queryByTenantId(orderByOrderNo.getTenantId());
  259. if(tenantConfig == null){
  260. throw new BizException("机构配置信息查询失败");
  261. }
  262. financeChops = tenantConfig.getCorporateFinanceChops();
  263. } else {
  264. financeChops = organizationDto.getCorporateFinancialSeal();
  265. }
  266. if(StringUtils.isNotBlank(financeChops)){
  267. orderDetail.put("financeChops", financeChops);
  268. }
  269. if (OrderTypeEnum.APPLY.equals(orderByOrderNo.getType())) {
  270. StudentRegistration studentRegistration = studentRegistrationDao.getStudentRegister(orderByOrderNo.getMusicGroupId(), orderByOrderNo.getUserId());
  271. if (studentRegistration.getPayingStatus().equals(2)) {
  272. orderDetail.put("payingStatus", studentRegistration.getPayingStatus());
  273. }
  274. }
  275. if (orderByOrderNo.getGroupType().equals(GroupType.MUSIC)) {
  276. MusicGroup musicGroup = musicGroupService.get(orderByOrderNo.getMusicGroupId());
  277. List<Goods> goodsList = studentPaymentOrderDetailService.findApplyOrderGoods(orderByOrderNo.getId());
  278. // List<String> orderDetailType = studentPaymentOrderDetailService.getOrderDetailType(orderByOrderNo.getId());
  279. List<StudentPaymentOrderDetail> orderDetail1 = studentPaymentOrderDetailService.getOrderDetail(orderByOrderNo.getId());
  280. List<String> orderDetailType = orderDetail1.stream().map(e -> e.getType().getCode()).collect(Collectors.toList());
  281. String kitGroupPurchaseType = orderDetail1.stream().filter(e -> e.getGoodsList() != null).
  282. filter(e -> e.getKitGroupPurchaseType() != null).map(e -> e.getKitGroupPurchaseType().getCode()).collect(Collectors.joining(","));
  283. orderDetail.put("goods", goodsList);
  284. orderDetail.put("kitGroupPurchaseType", kitGroupPurchaseType);
  285. orderDetail.put("course", musicGroup.getCourseForm());
  286. orderDetail.put("ownershipType", musicGroup.getOwnershipType());
  287. orderDetail.put("detailType", orderDetailType);
  288. orderDetail.put("courseViewType", musicGroup.getCourseViewType());
  289. //新的课程形态10.27
  290. MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroup.getId());
  291. if (musicGroupRegCalender != null) {
  292. List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getMusicGroupRegCalenderCourseSettings(musicGroup.getId());
  293. musicGroupRegCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettings);
  294. //如果包含vip和网管,代表购买了活动包
  295. List<Long> activityList = orderDetail1.stream().filter(e -> e.getType() == OrderDetailTypeEnum.VIP
  296. || e.getType() == OrderDetailTypeEnum.PRACTICE).map(StudentPaymentOrderDetail::getStudentInstrumentId)
  297. .collect(Collectors.toList());
  298. if(CollectionUtils.isNotEmpty(activityList)){
  299. orderDetail.put("activity", musicGroupPaymentCalenderActivityService.findByActivityIds(activityList,musicGroupRegCalender.getId()));
  300. }
  301. }
  302. orderDetail.put("calender", musicGroupRegCalender);
  303. List<Long> ids = orderDetail1.stream().filter(e -> e.getType() == OrderDetailTypeEnum.CLOUD_TEACHER).map(StudentPaymentOrderDetail::getStudentInstrumentId).collect(Collectors.toList());
  304. if(CollectionUtils.isNotEmpty(ids)){
  305. List<MusicGroupPaymentCalenderMember> calenderMembers = musicGroupPaymentCalenderMemberService.findByIds(ids);
  306. List<CloudTeacherOrderWrapper.StudentMemberOrderDetail> memberOrderDetails = new ArrayList<>();
  307. for (MusicGroupPaymentCalenderMember calenderMember : calenderMembers) {
  308. CloudTeacherOrderWrapper.StudentMemberOrderDetail memberOrderDetail = new CloudTeacherOrderWrapper.StudentMemberOrderDetail();
  309. memberOrderDetail.setMemberRankId(calenderMember.getMemberRankSettingId());
  310. memberOrderDetail.setMemberRankName(calenderMember.getName());
  311. memberOrderDetail.setIntro(calenderMember.getIntro());
  312. memberOrderDetails.add(memberOrderDetail);
  313. }
  314. orderDetail.put("member", memberOrderDetails);
  315. }
  316. //判断是否是系统收费
  317. /*if (musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE) {
  318. orderDetail.put("member", cloudTeacherOrderService.queryOrderInfoByOrderId(orderByOrderNo.getId()));
  319. }else {
  320. }*/
  321. } else if (orderByOrderNo.getGroupType().equals(GroupType.VIP) || orderByOrderNo.getGroupType().equals(GroupType.LIVE)) {
  322. if(orderByOrderNo.getType() == OrderTypeEnum.ACTIVITY){
  323. orderDetail.put("activity", vipGroupActivityService.getDao().queryByIds(orderByOrderNo.getActivityId()));
  324. }else if (StringUtils.isNotEmpty(orderByOrderNo.getMusicGroupId())) {
  325. VipBuyResultDto vipBuyResultInfo = vipGroupService.findVipBuyResultInfo(Integer.valueOf(orderByOrderNo.getMusicGroupId()));
  326. orderDetail.put("detail", vipBuyResultInfo);
  327. }
  328. } else if (orderByOrderNo.getGroupType().equals(GroupType.SPORADIC)) {
  329. if (Objects.nonNull(orderByOrderNo.getMusicGroupId())) {
  330. if(orderByOrderNo.getType().equals(OrderTypeEnum.DIRECTOR_TRAINING_CAMP)){
  331. orderDetail.put("detail", tempDirectorTrainingCampDetailService.detail(Integer.parseInt(orderByOrderNo.getMusicGroupId())));
  332. }else {
  333. List<SporadicChargeInfo> info = sporadicChargeInfoService.findByIds(orderByOrderNo.getMusicGroupId());
  334. orderDetail.put("detail", info);
  335. }
  336. }
  337. if (orderByOrderNo.getType().equals(OrderTypeEnum.DOUBLE_ELEVEN2020)) {
  338. LuckDrawCount luckDrawCount = luckDrawCountService.get(orderByOrderNo.getUserId().longValue());
  339. orderDetail.put("drawTimes", luckDrawCount == null ? 0 : luckDrawCount.getAvailableCount());
  340. } else if (OrderTypeEnum.DEGREE_REGISTRATION.equals(orderByOrderNo.getType())) {
  341. List<DegreeRegistration> degreeRegistration = degreeRegistrationDao.findByByOrderId(orderByOrderNo.getOrderNo());
  342. // DegreeRegistration degreeRegistration = degreeRegistrationDao.get(orderByOrderNo.getClassGroupId());
  343. orderDetail.put("degree", degreeRegistration);
  344. List<StudentPaymentOrderDetail> studentPaymentOrderDetails = studentPaymentOrderDetailService.getOrderDetail(orderByOrderNo.getId());
  345. if (!CollectionUtils.isEmpty(studentPaymentOrderDetails)) {
  346. orderDetail.put("additionCourseInfo", studentPaymentOrderDetails.get(0).getGoodsIdList());
  347. }
  348. }
  349. } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)|| orderByOrderNo.getGroupType().equals(GroupType.MALL_SELL)) {
  350. orderDetail.put("detail", studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
  351. } else if (orderByOrderNo.getGroupType().equals(GroupType.REPLACEMENT)) {
  352. orderDetail.put("detail", replacementInstrumentActivityDao.getInfo(Integer.parseInt(orderByOrderNo.getMusicGroupId())));
  353. } else if (orderByOrderNo.getGroupType().equals(GroupType.DEGREE)) {
  354. // orderDetail.put("detail", childrenDayDegreeDetailDao.getByOrderId(orderByOrderNo.getId()));
  355. orderDetail.put("detail", degreeRegistrationDao.findByByOrderId(orderByOrderNo.getOrderNo()));
  356. } else if (orderByOrderNo.getGroupType().equals(GroupType.ACTIVITY)) {
  357. List<VipGroupActivity> vipGroupActivities = vipGroupActivityService.getDao().queryByIds(orderByOrderNo.getActivityId());
  358. if(CollectionUtils.isNotEmpty(vipGroupActivities)){
  359. String activeConfig = sysConfigDao.findConfigValue("2022_double_eleven_give_config");
  360. String giveStartTime = sysConfigDao.findConfigValue("2021_double_eleven_give_member_start_time");
  361. String giveEndTime = sysConfigDao.findConfigValue("2021_double_eleven_give_member_end_time");
  362. Map<String, String> categoryMap = vipGroupCategoryDao.findConditionCategorys().stream().collect(Collectors.toMap(e-> e.getId().toString(), ConditionDto::getName));
  363. Integer drawTimes = 0;
  364. for (VipGroupActivity vipGroupActivity : vipGroupActivities) {
  365. vipGroupActivity.setVipGroupCategoryNames(categoryMap.get(vipGroupActivity.getVipGroupCategoryIdList()));
  366. vipGroupActivity.setGiveCategoryName(categoryMap.get(vipGroupActivity.getGiveCategoryId()));
  367. vipGroupActivityService.setActivityType(vipGroupActivity);
  368. // if(orderByOrderNo.getOrganId().equals(4)){
  369. if(!DateUtil.contents(giveStartTime,giveEndTime,orderByOrderNo.getPayTime() == null?orderByOrderNo.getCreateTime():orderByOrderNo.getPayTime())){
  370. continue;
  371. }
  372. // }
  373. List<SysConfigJsonDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, SysConfigJsonDto.class);
  374. List<SysConfigJsonDto> activityDtos = cloud2022ActivityDtos.stream().
  375. filter(e -> Arrays.stream(e.getKey().split(",")).collect(Collectors.toList()).
  376. contains(vipGroupActivity.getId().toString())).collect(Collectors.toList());
  377. if(CollectionUtils.isNotEmpty(activityDtos)){
  378. SysConfigJsonDto jsonDto = activityDtos.get(0);
  379. drawTimes += Integer.parseInt(jsonDto.getValue());
  380. }
  381. }
  382. TempBuyDoubleElevenUserLog doubleElevenUserLog = tempBuyDoubleElevenUserLogDao.findByOrderId(orderByOrderNo.getId());
  383. if(Objects.nonNull(doubleElevenUserLog) && doubleElevenUserLog.isGiveFlag()){
  384. VipGroupActivity vipGroupActivity = new VipGroupActivity();
  385. vipGroupActivity.setName("乐器清洁保养服务1次");
  386. vipGroupActivities.add(vipGroupActivity);
  387. }
  388. orderDetail.put("drawTimes",drawTimes);
  389. }
  390. orderDetail.put("detail", vipGroupActivities);
  391. } else if (orderByOrderNo.getGroupType().equals(GroupType.MEMBER)) {
  392. CloudTeacherOrderDto orderDto = cloudTeacherOrderService.queryOrderInfoByOrderId(orderByOrderNo.getId()).get(0);
  393. orderDetail.put("detail", orderDto);
  394. if (orderDto != null) {
  395. Map<String, Object> map = new HashMap<>(1);
  396. map.put("paymentOrderId", orderDto.getCloudTeacherOrder().getOrderId());
  397. orderDetail.put("couponList", sysCouponCodeDao.querySysCouponUseList(map));
  398. }
  399. } else if (orderByOrderNo.getGroupType().equals(GroupType.LIVE_BUY)) {
  400. orderDetail.put("detail", vipGroupActivityService.getDao().queryByIds(orderByOrderNo.getActivityId()));
  401. orderDetail.put("goodsId",orderByOrderNo.getClassGroupId());
  402. }
  403. return succeed(orderDetail);
  404. }
  405. @ApiOperation(value = "台牌支付")
  406. @PostMapping("/executePayment")
  407. @ApiImplicitParams({
  408. @ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
  409. @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
  410. @ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
  411. })
  412. public Object executePayment(@RequestBody PaymentParam paymentParam, HttpServletRequest request) {
  413. try {
  414. paymentParam.setIp(WebUtil.getRemoteIp(request));
  415. Map<String, Object> payment = orderPayOpsService.executePayment(paymentParam);
  416. return succeed(payment);
  417. } catch (Exception e) {
  418. return failed(e.getMessage());
  419. }
  420. }
  421. @GetMapping("/authorize")
  422. public String authorize(@RequestParam("returnUrl") String returnUrl) {
  423. String appId = "wxcf8e8b33a9477845";
  424. String url = URLEncoder.encode("http://wxwechat.utools.club/studentOrder/userInfo");
  425. String redirectURL = String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect",
  426. appId, url);
  427. return "redirect:" + redirectURL;
  428. }
  429. @GetMapping("/userInfo")
  430. public Object userInfo(@RequestParam("code") String code,
  431. @RequestParam("state") String returnUrl) throws Exception {
  432. String appId = "wxcf8e8b33a9477845";
  433. String appSecret = "1286452b9c68b13325dece7cdf892645";
  434. String wxMpOAuth2AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
  435. wxMpOAuth2AccessTokenUrl = String.format(wxMpOAuth2AccessTokenUrl, appId, appSecret, code);
  436. Map<String, String> map = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
  437. if (!map.containsKey("openid")) {
  438. return failed("授权失败,请重新授权");
  439. }
  440. return map.get("openid");
  441. }
  442. // @Scheduled(cron = "0/30 * * * * ?")
  443. @GetMapping("/setSuccessStatus")
  444. public HttpResponseResult setSuccessStatus(String orderNo) throws Exception {
  445. if (!profiles.equals("dev") && !profiles.equals("test")) {
  446. // return failed("非法操作");
  447. }
  448. List<StudentPaymentOrder> payingOrders = studentPaymentOrderService.findOrdersByStatus(DealStatusEnum.ING);
  449. String[] statusArr = {"0", "1", "7"};
  450. for (StudentPaymentOrder payingOrder : payingOrders) {
  451. if (StringUtils.isNotBlank(orderNo) && !orderNo.equals(payingOrder.getOrderNo())) {
  452. continue;
  453. }
  454. if (StringUtils.isNotBlank(payingOrder.getMusicGroupId()) && Objects.nonNull(payingOrder.getUserId())) {
  455. StudentRegistration studentRegister = studentRegistrationDao.getStudentRegister(payingOrder.getMusicGroupId(), payingOrder.getUserId());
  456. if (Objects.nonNull(studentRegister) && studentRegister.getPayingStatus() == 2) {
  457. //跳过审核中的
  458. continue;
  459. }
  460. }
  461. Map<String, String> rpMap = new HashMap<>();
  462. rpMap.put("tradeState", "1");
  463. rpMap.put("remarks", "模拟支付成功");
  464. rpMap.put("merOrderNo", payingOrder.getOrderNo());
  465. rpMap.put("orderNo", payingOrder.getOrderNo());
  466. rpMap.put("channelType", "1");
  467. rpMap.put("simulation", "1");
  468. String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
  469. rpMap.put("channelType", channelType);
  470. if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
  471. try {
  472. studentPaymentOrderService.updateOrder(rpMap); //更新订单
  473. } catch (Exception e) {
  474. e.printStackTrace();
  475. continue;
  476. }
  477. }
  478. }
  479. return succeed();
  480. }
  481. @RequestMapping("/paymentResult")
  482. public void paymentResult(HttpServletResponse response, String orderNo, String type) {
  483. try {
  484. String baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.BASE_API_URL_MDAYA);
  485. if (type != null && type.equals("edu")) {
  486. baseApiUrl = sysConfigDao.findConfigValue(SysConfigService.EDU_TEACHER_BASE_URL_MANAGER);
  487. }
  488. response.sendRedirect(baseApiUrl + "/#/paymentresult?orderNo=" + orderNo);
  489. } catch (IOException e) {
  490. e.printStackTrace();
  491. }
  492. }
  493. @GetMapping("/getLuckStatis")
  494. public HttpResponseResult getLuckStatis() {
  495. List<Organization> organs = organizationDao.findAllOrgans(TenantContextHolder.getTenantId());
  496. List<OrderStatisDto> orders = studentPaymentOrderDao.getLuckStatis(TenantContextHolder.getTenantId());
  497. for (Organization organ : organs) {
  498. boolean flag = false;
  499. for (OrderStatisDto order : orders) {
  500. if (organ.getName().equals(order.getOrganName())) {
  501. flag = true;
  502. break;
  503. }
  504. }
  505. if (!flag) {
  506. OrderStatisDto orderStatisDto = new OrderStatisDto();
  507. orderStatisDto.setOrganName(organ.getName());
  508. orderStatisDto.setMoney(BigDecimal.ZERO);
  509. orderStatisDto.setNums(0);
  510. orders.add(orderStatisDto);
  511. }
  512. }
  513. BigDecimal totalMoney = BigDecimal.ZERO;
  514. Integer totalNum = 0;
  515. Iterator<OrderStatisDto> iterator = orders.iterator();
  516. while (iterator.hasNext()) {
  517. OrderStatisDto order = iterator.next();
  518. if (order.getOrganName().equals("总部国际") || order.getOrganName().equals("阳光总部国际") || order.getOrganName().equals("武汉小学")) {
  519. iterator.remove();
  520. continue;
  521. }
  522. totalMoney = totalMoney.add(order.getMoney());
  523. totalNum += order.getNums();
  524. }
  525. orders = orders.stream().sorted(Comparator.comparing(OrderStatisDto::getNums).reversed()).collect(Collectors.toList());
  526. LuckStatisDto luckStatisDto = new LuckStatisDto();
  527. luckStatisDto.setOrderStatisDtoList(orders);
  528. luckStatisDto.setTotalNum(totalNum);
  529. luckStatisDto.setTotalMoney(totalMoney);
  530. return succeed(luckStatisDto);
  531. }
  532. @GetMapping("/getPracticeGroupStatis")
  533. public HttpResponseResult getPracticeGroupStatis() {
  534. Integer tenantId = TenantContextHolder.getTenantId();
  535. List<Organization> organs = organizationDao.findAllOrgans(tenantId);
  536. List<PracticeGroupsDto> hasReportNums = courseScheduleEvaluateDao.getHasReportNums(tenantId);
  537. List<PracticeGroupsDto> organMoneys = courseScheduleEvaluateDao.getOrganMoney(tenantId);
  538. List<PracticeGroupsDto> organPracticeGroups = courseScheduleEvaluateDao.getOrganPracticeGroups(tenantId);
  539. List<PracticeGroupsDto> practiceGroupsFrees = courseScheduleEvaluateDao.getPracticeGroupsFree(tenantId);
  540. List<PracticeGroupsDto> practiceGroupsBuys = courseScheduleEvaluateDao.getPracticeGroupsBuy(tenantId);
  541. List<PracticeGroupsDto> practiceGroupsRenews = courseScheduleEvaluateDao.getPracticeGroupsRenew(tenantId);
  542. Date startTime = DateUtil.getFirstDayOfMonth(new Date());
  543. List<PracticeGroupsDto> monthOrganBuyMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_BUY, startTime, tenantId);
  544. List<PracticeGroupsDto> monthOrganRenewMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_RENEW, startTime, tenantId);
  545. //List<PracticeGroupsDto> monthOrganBuyMoneys = courseScheduleEvaluateDao.getOrganNewPracticeGroupsOfMonth(OrderTypeEnum.PRACTICE_GROUP_BUY,startTime);
  546. //List<PracticeGroupsDto> monthOrganRenewMoneys = courseScheduleEvaluateDao.getOrganNewPracticeGroupsOfMonth(OrderTypeEnum.PRACTICE_GROUP_RENEW,startTime);
  547. List<PracticeGroupsDto> practiceGroups = new ArrayList<>();
  548. for (Organization organ : organs) {
  549. PracticeGroupsDto practiceGroupsDto = new PracticeGroupsDto();
  550. practiceGroupsDto.setOrganName(organ.getName());
  551. practiceGroupsDto.setOrganId(organ.getId());
  552. //体验人数
  553. for (PracticeGroupsDto practiceGroupsFree : practiceGroupsFrees) {
  554. if (organ.getId().equals(practiceGroupsFree.getOrganId())) {
  555. practiceGroupsDto.setTotalNums(practiceGroupsFree.getTotalNums());
  556. break;
  557. }
  558. }
  559. //购买人数
  560. for (PracticeGroupsDto practiceGroupsBuy : practiceGroupsBuys) {
  561. if (organ.getId().equals(practiceGroupsBuy.getOrganId())) {
  562. practiceGroupsDto.setBuyNums(practiceGroupsBuy.getBuyNums());
  563. break;
  564. }
  565. }
  566. //续费人数
  567. for (PracticeGroupsDto practiceGroupsRenew : practiceGroupsRenews) {
  568. if (organ.getId().equals(practiceGroupsRenew.getOrganId())) {
  569. practiceGroupsDto.setRenewNums(practiceGroupsRenew.getRenewNums());
  570. break;
  571. }
  572. }
  573. //已完成人数
  574. for (PracticeGroupsDto organPracticeGroup : organPracticeGroups) {
  575. if (organ.getId().equals(organPracticeGroup.getOrganId()) && organPracticeGroup.getBuyNums() >= organPracticeGroup.getTotalNums()) {
  576. practiceGroupsDto.setOverNums(practiceGroupsDto.getOverNums() + 1);
  577. }
  578. }
  579. //已提交报告人数
  580. for (PracticeGroupsDto hasReportNum : hasReportNums) {
  581. if (organ.getId().equals(hasReportNum.getOrganId())) {
  582. practiceGroupsDto.setReportNums(hasReportNum.getReportNums());
  583. break;
  584. }
  585. }
  586. //成交金额
  587. for (PracticeGroupsDto organMoney : organMoneys) {
  588. if (organ.getId().equals(organMoney.getOrganId())) {
  589. practiceGroupsDto.setTotalMoney(organMoney.getTotalMoney());
  590. break;
  591. }
  592. }
  593. //当月新增金额和人数
  594. for (PracticeGroupsDto monthOrganBuyMoney : monthOrganBuyMoneys) {
  595. if (organ.getId().equals(monthOrganBuyMoney.getOrganId())) {
  596. practiceGroupsDto.setMonthBuyMoney(monthOrganBuyMoney.getTotalMoney());
  597. practiceGroupsDto.setMonthBuyNums(monthOrganBuyMoney.getBuyNums());
  598. break;
  599. }
  600. }
  601. //当月续费金额和人数
  602. for (PracticeGroupsDto monthOrganRenewMoney : monthOrganRenewMoneys) {
  603. if (organ.getId().equals(monthOrganRenewMoney.getOrganId())) {
  604. practiceGroupsDto.setMonthRenewNums(monthOrganRenewMoney.getBuyNums());
  605. practiceGroupsDto.setMonthRenewMoney(monthOrganRenewMoney.getTotalMoney());
  606. break;
  607. }
  608. }
  609. if (practiceGroupsDto.getTotalNums() > 0) {
  610. double scale = new BigDecimal(practiceGroupsDto.getBuyNums()).multiply(new BigDecimal(100)).divide(new BigDecimal(practiceGroupsDto.getTotalNums()), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
  611. practiceGroupsDto.setBuyScale(scale);
  612. }
  613. practiceGroups.add(practiceGroupsDto);
  614. }
  615. BigDecimal totalMoney = BigDecimal.ZERO;
  616. Integer totalNum = 0;
  617. Integer buyNum = 0;
  618. Integer renewNum = 0;
  619. Integer overNum = 0;
  620. Integer reportNum = 0;
  621. Integer monthBuyNums = 0;
  622. Integer monthRenewNums = 0;
  623. BigDecimal monthBuyMoney = BigDecimal.ZERO;
  624. BigDecimal monthRenewMoney = BigDecimal.ZERO;
  625. Iterator<PracticeGroupsDto> iterator = practiceGroups.iterator();
  626. while (iterator.hasNext()) {
  627. PracticeGroupsDto next = iterator.next();
  628. if (next.getOrganName().equals("总部国际") || next.getOrganName().equals("阳光总部国际") || next.getOrganName().equals("武汉小学")) {
  629. iterator.remove();
  630. continue;
  631. }
  632. totalMoney = totalMoney.add(next.getTotalMoney());
  633. totalNum += next.getTotalNums();
  634. overNum += next.getOverNums();
  635. buyNum += next.getBuyNums();
  636. reportNum += next.getReportNums();
  637. renewNum += next.getRenewNums();
  638. monthBuyNums += next.getMonthBuyNums();
  639. monthRenewNums += next.getMonthRenewNums();
  640. monthBuyMoney = monthBuyMoney.add(next.getMonthBuyMoney());
  641. monthRenewMoney = monthRenewMoney.add(next.getMonthRenewMoney());
  642. }
  643. practiceGroups = practiceGroups.stream().sorted(Comparator.comparingDouble(PracticeGroupsDto::getBuyScale).reversed()).collect(Collectors.toList());
  644. PracticeGroupStatisDto practiceGroupStatisDto = new PracticeGroupStatisDto();
  645. practiceGroupStatisDto.setPracticeGroupsDtoList(practiceGroups);
  646. practiceGroupStatisDto.setTotalMoney(totalMoney);
  647. practiceGroupStatisDto.setTotalNum(totalNum);
  648. practiceGroupStatisDto.setBuyNum(buyNum);
  649. practiceGroupStatisDto.setRenewNum(renewNum);
  650. practiceGroupStatisDto.setOverNum(overNum);
  651. practiceGroupStatisDto.setReportNum(reportNum);
  652. practiceGroupStatisDto.setMonthBuyNums(monthBuyNums);
  653. practiceGroupStatisDto.setMonthBuyMoney(monthBuyMoney);
  654. practiceGroupStatisDto.setMonthRenewNums(monthRenewNums);
  655. practiceGroupStatisDto.setMonthRenewMoney(monthRenewMoney);
  656. if (totalNum > 0) {
  657. BigDecimal scale = new BigDecimal(buyNum).multiply(new BigDecimal(100)).divide(new BigDecimal(totalNum), 2, BigDecimal.ROUND_HALF_UP);
  658. practiceGroupStatisDto.setBuyScale(scale);
  659. }
  660. return succeed(practiceGroupStatisDto);
  661. }
  662. @GetMapping("/getPracticeStatis")
  663. public HttpResponseResult getPracticeStatis() {
  664. Date nowDate = new Date();
  665. Integer tenantId = TenantContextHolder.getTenantId();
  666. List<Organization> organs = organizationDao.findAllOrgans(tenantId);
  667. List<Practice4OrganDto> allTryNums = courseScheduleEvaluateDao.getAllTryNums(tenantId);
  668. List<Practice4OrganDto> practiceBuyNums = courseScheduleEvaluateDao.getPracticeBuyNums(nowDate, null, tenantId);
  669. List<Practice4OrganDto> vipBuyNums = courseScheduleEvaluateDao.getVipBuyNums(nowDate, null, tenantId);
  670. List<Practice4OrganDto> practiceAndVipBuyNums = courseScheduleEvaluateDao.getPracticeAndVipNums(nowDate, null, tenantId);
  671. Date startTime = DateUtil.getFirstDayOfMonth(nowDate);
  672. Date endTime = DateUtil.addMonths(startTime, 1);
  673. //当月新增网管课人数
  674. List<PracticeGroupsDto> monthOrganPracticeBuyMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_BUY, startTime, tenantId);
  675. //当月新增VIP人数
  676. List<PracticeGroupsDto> monthOrganVipBuyMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.SMALL_CLASS_TO_BUY, startTime, tenantId);
  677. //当月续费人数
  678. List<PracticeGroupsDto> monthOrganRenewMoneys = courseScheduleEvaluateDao.getMonthOrganMoney(OrderTypeEnum.PRACTICE_GROUP_RENEW, startTime, tenantId);
  679. //本月总人数
  680. List<Practice4OrganDto> nowMonthPracticeBuyNums = courseScheduleEvaluateDao.getPracticeBuyNums(startTime, endTime, tenantId);
  681. List<Practice4OrganDto> nowMonthVipBuyNums = courseScheduleEvaluateDao.getVipBuyNums(startTime, endTime, tenantId);
  682. List<Practice4OrganDto> nowMonthPracticeAndVipBuyNums = courseScheduleEvaluateDao.getPracticeAndVipNums(startTime, endTime, tenantId);
  683. //上月总人数
  684. Date lastMonthStartTime = DateUtil.addMonths(startTime, -1);
  685. List<Practice4OrganDto> lastMonthPracticeBuyNums = courseScheduleEvaluateDao.getPracticeBuyNums(lastMonthStartTime, startTime, tenantId);
  686. List<Practice4OrganDto> lastMonthVipBuyNums = courseScheduleEvaluateDao.getVipBuyNums(lastMonthStartTime, startTime, tenantId);
  687. List<Practice4OrganDto> lastMonthPracticeAndVipBuyNums = courseScheduleEvaluateDao.getPracticeAndVipNums(lastMonthStartTime, startTime, tenantId);
  688. List<Practice4OrganDto> practice4Organs = new ArrayList<>();
  689. for (Organization organ : organs) {
  690. Practice4OrganDto practice4OrganDto = new Practice4OrganDto();
  691. practice4OrganDto.setOrganName(organ.getName());
  692. practice4OrganDto.setOrganId(organ.getId());
  693. for (Practice4OrganDto allTryNum : allTryNums) {
  694. if (organ.getId().equals(allTryNum.getOrganId())) {
  695. practice4OrganDto.setTryNum(allTryNum.getTryNum());
  696. }
  697. }
  698. //网管课转化人数
  699. for (Practice4OrganDto practiceBuyNum : practiceBuyNums) {
  700. if (organ.getId().equals(practiceBuyNum.getOrganId())) {
  701. practice4OrganDto.setPracticeNum(practiceBuyNum.getPracticeNum());
  702. break;
  703. }
  704. }
  705. //VIP课转化人数
  706. for (Practice4OrganDto vipBuyNum : vipBuyNums) {
  707. if (organ.getId().equals(vipBuyNum.getOrganId())) {
  708. practice4OrganDto.setVipNum(vipBuyNum.getVipNum());
  709. break;
  710. }
  711. }
  712. for (Practice4OrganDto practiceAndVipBuyNum : practiceAndVipBuyNums) {
  713. if (organ.getId().equals(practiceAndVipBuyNum.getOrganId())) {
  714. practice4OrganDto.setVipNum(practice4OrganDto.getVipNum() - practiceAndVipBuyNum.getPracticeNum());
  715. break;
  716. }
  717. }
  718. practice4OrganDto.setTotalNum(practice4OrganDto.getPracticeNum() + practice4OrganDto.getVipNum());
  719. //当月新增网管课人数
  720. for (PracticeGroupsDto monthOrganPracticeBuyMoney : monthOrganPracticeBuyMoneys) {
  721. if (organ.getId().equals(monthOrganPracticeBuyMoney.getOrganId())) {
  722. practice4OrganDto.setPractice4MonthNum(monthOrganPracticeBuyMoney.getBuyNums());
  723. practice4OrganDto.setTotalMoney(practice4OrganDto.getTotalMoney().add(monthOrganPracticeBuyMoney.getTotalMoney()));
  724. break;
  725. }
  726. }
  727. //当月新增VIP课人数
  728. for (PracticeGroupsDto monthOrganVipBuyMoney : monthOrganVipBuyMoneys) {
  729. if (organ.getId().equals(monthOrganVipBuyMoney.getOrganId())) {
  730. practice4OrganDto.setVip4MonthNum(monthOrganVipBuyMoney.getBuyNums());
  731. practice4OrganDto.setTotalMoney(practice4OrganDto.getTotalMoney().add(monthOrganVipBuyMoney.getTotalMoney()));
  732. break;
  733. }
  734. }
  735. //当月续费人数
  736. for (PracticeGroupsDto monthOrganRenewMoney : monthOrganRenewMoneys) {
  737. if (organ.getId().equals(monthOrganRenewMoney.getOrganId())) {
  738. practice4OrganDto.setRenew4MonthNum(monthOrganRenewMoney.getBuyNums());
  739. practice4OrganDto.setTotalMoney(practice4OrganDto.getTotalMoney().add(monthOrganRenewMoney.getTotalMoney()));
  740. break;
  741. }
  742. }
  743. //同比上月增减人数
  744. for (Practice4OrganDto nowMonthPracticeBuyNum : nowMonthPracticeBuyNums) {
  745. if (organ.getId().equals(nowMonthPracticeBuyNum.getOrganId())) {
  746. practice4OrganDto.setChange4MonthNum(nowMonthPracticeBuyNum.getPracticeNum());
  747. break;
  748. }
  749. }
  750. for (Practice4OrganDto nowMonthVipBuyNum : nowMonthVipBuyNums) {
  751. if (organ.getId().equals(nowMonthVipBuyNum.getOrganId())) {
  752. practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() + nowMonthVipBuyNum.getVipNum());
  753. break;
  754. }
  755. }
  756. for (Practice4OrganDto nowMonthPracticeAndVipBuyNum : nowMonthPracticeAndVipBuyNums) {
  757. if (organ.getId().equals(nowMonthPracticeAndVipBuyNum.getOrganId())) {
  758. practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() - nowMonthPracticeAndVipBuyNum.getPracticeNum());
  759. break;
  760. }
  761. }
  762. //上月人数
  763. for (Practice4OrganDto lastMonthPracticeBuyNum : lastMonthPracticeBuyNums) {
  764. if (organ.getId().equals(lastMonthPracticeBuyNum.getOrganId())) {
  765. practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() - lastMonthPracticeBuyNum.getPracticeNum());
  766. break;
  767. }
  768. }
  769. for (Practice4OrganDto lastMonthVipBuyNum : lastMonthVipBuyNums) {
  770. if (organ.getId().equals(lastMonthVipBuyNum.getOrganId())) {
  771. practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() - lastMonthVipBuyNum.getVipNum());
  772. break;
  773. }
  774. }
  775. for (Practice4OrganDto lastMonthPracticeAndVipBuyNum : lastMonthPracticeAndVipBuyNums) {
  776. if (organ.getId().equals(lastMonthPracticeAndVipBuyNum.getOrganId())) {
  777. practice4OrganDto.setChange4MonthNum(practice4OrganDto.getChange4MonthNum() + lastMonthPracticeAndVipBuyNum.getPracticeNum());
  778. break;
  779. }
  780. }
  781. if (practice4OrganDto.getTryNum() > 0) {
  782. double scale = new BigDecimal(practice4OrganDto.getTotalNum()).multiply(new BigDecimal(100)).divide(new BigDecimal(practice4OrganDto.getTryNum()), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
  783. practice4OrganDto.setScale(scale);
  784. }
  785. practice4Organs.add(practice4OrganDto);
  786. }
  787. practice4Organs = practice4Organs.stream().sorted(Comparator.comparingDouble(Practice4OrganDto::getScale).reversed()).collect(Collectors.toList());
  788. return succeed(practice4Organs);
  789. }
  790. @GetMapping("/getUserApplyOrders")
  791. public HttpResponseResult<List<StudentPaymentOrderExportDto>> getUserApplyOrders(String musicGroupId) {
  792. SysUser sysUser = sysUserFeignService.queryUserInfo();
  793. if (sysUser == null) {
  794. return failed(HttpStatus.FORBIDDEN, "请登录");
  795. }
  796. return succeed(studentPaymentOrderService.getUserApplyOrders(sysUser.getId(), musicGroupId));
  797. }
  798. @GetMapping("/reConfirmOrder")
  799. public HttpResponseResult<List<StudentPaymentOrder>> reConfirmOrder(Date startTime, Date endTime) {
  800. if (!profiles.equals("prod")) {
  801. return failed("测试环境不支持");
  802. }
  803. return succeed(studentPaymentOrderService.reConfirmOrder(startTime, endTime));
  804. }
  805. @GetMapping("/getMusicGroupApplyCalender")
  806. public HttpResponseResult<MusicGroupPaymentCalender> getMusicGroupApplyCalender(String musicGroupId) {
  807. MusicGroupPaymentCalender musicGroupRegCalender = musicGroupPaymentCalenderDao.getMusicGroupRegCalender(musicGroupId);
  808. if (musicGroupRegCalender != null) {
  809. MusicGroup musicGroup = musicGroupService.get(musicGroupId);
  810. List<MusicGroupPaymentCalenderCourseSettings> courseSettings = musicGroupPaymentCalenderCourseSettingsDao.getMusicGroupRegCalenderCourseSettings(musicGroupId);
  811. musicGroupRegCalender.setMusicGroupPaymentCalenderCourseSettingsList(courseSettings);
  812. musicGroupRegCalender.setCourseViewType(musicGroup.getCourseViewType());
  813. }
  814. return succeed(musicGroupRegCalender);
  815. }
  816. @ApiImplicitParams({
  817. @ApiImplicitParam(name = "queryDate", dataType = "String", value = "年月"),
  818. @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
  819. @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
  820. })
  821. @ApiOperation("分页查询")
  822. /**
  823. * 学生端查询订单
  824. */
  825. @PostMapping("/queryOrder")
  826. public Object queryOrder(@RequestBody Map<String, Object> param) throws Exception {
  827. return succeed(studentPaymentOrderService.queryOrder(param));
  828. }
  829. /**
  830. * 学生端查询订单详情
  831. */
  832. @GetMapping("/queryOrderDetail")
  833. public HttpResponseResult<StudentPaymentOrderVo> queryOrderDetail(String orderNo) {
  834. return succeed(studentPaymentOrderService.queryOrderDetail(orderNo));
  835. }
  836. }