package com.peanut.modules.common.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.HttpContextUtil; import com.peanut.common.utils.R; import com.peanut.common.utils.ShiroUtils; import com.peanut.config.Constants; import com.peanut.config.DelayQueueConfig; import com.peanut.modules.book.service.TransactionDetailsService; import com.peanut.modules.common.dao.MyUserDao; import com.peanut.modules.common.entity.*; import com.peanut.modules.common.service.*; import com.peanut.modules.master.service.CourseCatalogueService; import com.peanut.modules.master.service.CourseService; import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo; import com.peanut.modules.pay.weChatPay.service.WxpayService; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.MessagePostProcessor; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; import jakarta.transaction.Transactional; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * 超V管理 */ @Slf4j @RestController("commonUserVip") @RequestMapping("common/userVip") public class UserVipController { @Autowired private UserVipService userVipService; @Autowired private BuyOrderService buyOrderService; @Autowired private WxpayService wxpayService; @Autowired private RabbitTemplate rabbitTemplate; @Autowired private MyUserDao myUserDao; @Autowired private VipBuyConfigService vipBuyConfigService; @Autowired private TransactionDetailsService transactionDetailsService; @Autowired private JfTransactionDetailsService jfTransactionDetailsService; @Autowired private CourseCatalogueService courseCatalogueService; //获取用户类型 @RequestMapping("/getUserVipType") public R getUserVipType() { List> resList = new ArrayList(); //根部不同平台返回不同列表 HttpServletRequest request = HttpContextUtil.getHttpServletRequest(); String appType = request.getHeader("appType")==null?"":request.getHeader("appType"); if (!"psyche".equals(appType)){ List l4 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,4).orderByDesc(UserVip::getEndTime)); List l9 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,9).orderByDesc(UserVip::getEndTime)); List l5 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,5).orderByDesc(UserVip::getEndTime)); List l6 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,6).orderByDesc(UserVip::getEndTime)); List l10 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,10).orderByDesc(UserVip::getEndTime)); if (l4.size()>0&&l9.size()>0&&l5.size()>0&&l6.size()>0&&l10.size()>0){ Date t4 = l4.get(0).getEndTime(); Date t9 = l9.get(0).getEndTime(); Date t5 = l5.get(0).getEndTime(); Date t6 = l6.get(0).getEndTime(); Date t10 = l10.get(0).getEndTime(); if (t4.getTime()==t9.getTime()&&t9.getTime()==t5.getTime()&&t5.getTime()==t6.getTime()&&t6.getTime()==t10.getTime()){ Map map = new HashMap(); map.put("type",1); map.put("endTime",t4); resList.add(map); }else { List> tempList = new ArrayList(); Map map4 = new HashMap(); map4.put("type",4); map4.put("endTime",t4); tempList.add(map4); Map map9 = new HashMap(); map9.put("type",9); map9.put("endTime",t9); tempList.add(map9); Map map5 = new HashMap(); map5.put("type",5); map5.put("endTime",t5); tempList.add(map5); Map map6 = new HashMap(); map6.put("type",6); map6.put("endTime",t6); tempList.add(map6); Map map10 = new HashMap(); map10.put("type",10); map10.put("endTime",t10); tempList.add(map10); tempList = tempList.stream().sorted((map1,map2)->{ return Long.compare(((Date)map1.get("endTime")).getTime(),((Date)map2.get("endTime")).getTime()); }).collect(Collectors.toList()); resList.addAll(tempList); Map map1 = new HashMap(); map1.put("type",1); map1.put("endTime",tempList.get(0).get("endTime")); resList.add(map1); } }else { if (l4.size()>0){ Map map = new HashMap(); map.put("type",4); map.put("endTime",l4.get(0).getEndTime()); resList.add(map); } if (l5.size()>0){ Map map = new HashMap(); map.put("type",5); map.put("endTime",l5.get(0).getEndTime()); resList.add(map); } if (l9.size()>0){ Map map = new HashMap(); map.put("type",9); map.put("endTime",l9.get(0).getEndTime()); resList.add(map); } if (l6.size()>0){ Map map = new HashMap(); map.put("type",6); map.put("endTime",l6.get(0).getEndTime()); resList.add(map); } if (l10.size()>0){ Map map = new HashMap(); map.put("type",10); map.put("endTime",l10.get(0).getEndTime()); resList.add(map); } } } List l7 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,7).orderByDesc(UserVip::getEndTime)); List l8 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,8).orderByDesc(UserVip::getEndTime)); if (l7.size()>0&&l8.size()>0){ Date t7 = l7.get(0).getEndTime(); Date t8 = l8.get(0).getEndTime(); if (t7.getTime()==t8.getTime()){ Map map = new HashMap(); map.put("type",2); map.put("endTime",t7); resList.add(map); }else { List> tempList = new ArrayList(); Map map7 = new HashMap(); map7.put("type",7); map7.put("endTime",t7); tempList.add(map7); Map map8 = new HashMap(); map8.put("type",8); map8.put("endTime",t8); tempList.add(map8); tempList = tempList.stream().sorted((map1,map2)->{ return Long.compare(((Date)map1.get("endTime")).getTime(),((Date)map2.get("endTime")).getTime()); }).collect(Collectors.toList()); resList.addAll(tempList); Map map2 = new HashMap(); map2.put("type",2); map2.put("endTime",tempList.get(0).get("endTime")); resList.add(map2); } }else { if (l7.size()>0){ Map map = new HashMap(); map.put("type",7); map.put("endTime",l7.get(0).getEndTime()); resList.add(map); } if (l8.size()>0){ Map map = new HashMap(); map.put("type",8); map.put("endTime",l8.get(0).getEndTime()); resList.add(map); } } resList = resList.stream().sorted((map1,map2)->{ return Long.compare(((Date)map1.get("endTime")).getTime(),((Date)map2.get("endTime")).getTime()); }).collect(Collectors.toList()); return R.ok().put("list", resList); } //vip商品列表 @RequestMapping("/getVipBuyConfigList") public R getVipBuyConfigList() { List ll = new ArrayList<>(); //根部不同平台返回不同列表 HttpServletRequest request = HttpContextUtil.getHttpServletRequest(); String appType = request.getHeader("appType")==null?"":request.getHeader("appType"); if ("psyche".equals(appType)){ ll.add(Arrays.asList(8,7)); ll.add(Arrays.asList(2)); }else { ll.add(Arrays.asList(1)); ll.add(Arrays.asList(4)); ll.add(Arrays.asList(9)); ll.add(Arrays.asList(5)); ll.add(Arrays.asList(6)); ll.add(Arrays.asList(10)); ll.add(Arrays.asList(2)); ll.add(Arrays.asList(7,8)); } List> resList = new ArrayList<>(); for (List l : ll) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); wrapper.select(VipBuyConfigEntity::getType,VipBuyConfigEntity::getTitle); wrapper.and(r->r.eq(VipBuyConfigEntity::getDateType,0).or(f->f.eq(VipBuyConfigEntity::getDateType,1).lt(VipBuyConfigEntity::getStartTime,new Date()).gt(VipBuyConfigEntity::getEndTime,new Date()))); wrapper.in(VipBuyConfigEntity::getType,l); if ("psyche".equals(appType)){ wrapper.orderByDesc(VipBuyConfigEntity::getType); } wrapper.groupBy(VipBuyConfigEntity::getType); List> list = vipBuyConfigService.listMaps(wrapper); for (Map map:list){ Map originalPriceAndCourseCount = getOriginalPriceAndCourseCount(map.get("type").toString()); map.put("originalPrice",originalPriceAndCourseCount.get("originalPrice"));//模块下课程一年原价 map.put("courseCount",originalPriceAndCourseCount.get("courseCount"));//模块下课程数量 map.put("tip",null);//提示到期 map.put("vcbList",null);//vip商品列表 map.put("yanqiList",null);//延期商品列表 map.put("state",null);//有效状态 boolean flag = false; if ("1".equals(map.get("type").toString())){ List uv4 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,4).orderByDesc(UserVip::getEndTime)); List uv9 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,9).orderByDesc(UserVip::getEndTime)); List uv5 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,5).orderByDesc(UserVip::getEndTime)); List uv6 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,6).orderByDesc(UserVip::getEndTime)); if (uv4.size() > 0 && uv9.size() > 0 && uv5.size() > 0 && uv6.size() > 0){//办理过 if (uv4.get(0).getState()==0&&uv9.get(0).getState()==0&&uv5.get(0).getState()==0&&uv6.get(0).getState()==0){ long l4 = uv4.get(0).getEndTime().getTime(); long l9 = uv9.get(0).getEndTime().getTime(); long l5 = uv5.get(0).getEndTime().getTime(); long l6 = uv6.get(0).getEndTime().getTime(); List tempList = new ArrayList(); tempList.add(l4); tempList.add(l9); tempList.add(l5); tempList.add(l6); tempList = tempList.stream().sorted((long1,long2)->{ return Long.compare(long1,long2); }).collect(Collectors.toList()); map.put("tip",(tempList.get(0)-new Date().getTime())/60/60/24/1000); map.put("state",0); }else { map.put("state",1); } flag = true; } }else if ("2".equals(map.get("type").toString())){ List uv7 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,7).orderByDesc(UserVip::getEndTime)); List uv8 = userVipService.list(new LambdaQueryWrapper().eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,8).orderByDesc(UserVip::getEndTime)); if (uv7.size() > 0 && uv8.size() > 0){ if (uv7.get(0).getState()==0&&uv8.get(0).getState()==0){ if (uv7.get(0).getEndTime().getTime() userVips = userVipService.list(new LambdaQueryWrapper() .eq(UserVip::getUserId,ShiroUtils.getUId()).eq(UserVip::getType,map.get("type")).orderByDesc(UserVip::getEndTime)); if (userVips.size()>0){ if (userVips.get(0).getState()==0){ map.put("tip",(userVips.get(0).getEndTime().getTime()-new Date().getTime())/60/60/24/1000); map.put("state",0); }else { map.put("state",1); } flag = true; } } if (flag){ List yanqiList = vipBuyConfigService.list(new LambdaQueryWrapper() .and(r->r.eq(VipBuyConfigEntity::getDateType,0).or(f->f.eq(VipBuyConfigEntity::getDateType,1).lt(VipBuyConfigEntity::getStartTime,new Date()).gt(VipBuyConfigEntity::getEndTime,new Date()))) .eq(VipBuyConfigEntity::getType,map.get("type")+"1")); map.put("yanqiList",yanqiList); }else { List vcbList = vipBuyConfigService.list(new LambdaQueryWrapper() .and(r->r.eq(VipBuyConfigEntity::getDateType,0).or(f->f.eq(VipBuyConfigEntity::getDateType,1).lt(VipBuyConfigEntity::getStartTime,new Date()).gt(VipBuyConfigEntity::getEndTime,new Date()))) .eq(VipBuyConfigEntity::getType,map.get("type"))); map.put("vcbList",vcbList); } } list = list.stream().sorted((map1,map2)->{ return Long.compare((Long) (map1.get("tip")==null?0l:map1.get("tip")),(Long)(map2.get("tip")==null?0l:map2.get("tip"))); }).collect(Collectors.toList()); list = list.stream().sorted((map1,map2)->{ return Long.compare((Long) (map1.get("vcbList")==null?0l:1l),(Long)(map2.get("vcbList")==null?0l:1l)); }).collect(Collectors.toList()); resList.addAll(list); } return R.ok().put("res", resList); } //vip配置列表 @RequestMapping("/vipBuyConfigList") public R vipBuyConfigList() { List ll = new ArrayList<>(); ll.add(Arrays.asList(1)); ll.add(Arrays.asList(4)); ll.add(Arrays.asList(9)); ll.add(Arrays.asList(5)); ll.add(Arrays.asList(6)); ll.add(Arrays.asList(10)); ll.add(Arrays.asList(2)); ll.add(Arrays.asList(7,8)); List> resList = new ArrayList<>(); for (List l : ll) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); wrapper.select(VipBuyConfigEntity::getType,VipBuyConfigEntity::getTitle); wrapper.and(r->r.eq(VipBuyConfigEntity::getDateType,0).or(f->f.eq(VipBuyConfigEntity::getDateType,1).lt(VipBuyConfigEntity::getStartTime,new Date()).gt(VipBuyConfigEntity::getEndTime,new Date()))); wrapper.in(VipBuyConfigEntity::getType,l); wrapper.groupBy(VipBuyConfigEntity::getType); List> list = vipBuyConfigService.listMaps(wrapper); for (Map map:list){ Map originalPriceAndCourseCount = getOriginalPriceAndCourseCount(map.get("type").toString()); map.put("originalPrice",originalPriceAndCourseCount.get("originalPrice"));//模块下课程一年原价 map.put("courseCount",originalPriceAndCourseCount.get("courseCount"));//模块下课程数量 map.put("vcbList",null);//vip商品列表 map.put("yanqiList",null);//延期商品列表 List yanqiList = vipBuyConfigService.list(new LambdaQueryWrapper() .and(r->r.eq(VipBuyConfigEntity::getDateType,0).or(f->f.eq(VipBuyConfigEntity::getDateType,1).lt(VipBuyConfigEntity::getStartTime,new Date()).gt(VipBuyConfigEntity::getEndTime,new Date()))) .eq(VipBuyConfigEntity::getType,map.get("type")+"1")); map.put("yanqiList",yanqiList); List vcbList = vipBuyConfigService.list(new LambdaQueryWrapper() .and(r->r.eq(VipBuyConfigEntity::getDateType,0).or(f->f.eq(VipBuyConfigEntity::getDateType,1).lt(VipBuyConfigEntity::getStartTime,new Date()).gt(VipBuyConfigEntity::getEndTime,new Date()))) .eq(VipBuyConfigEntity::getType,map.get("type"))); map.put("vcbList",vcbList); } resList.addAll(list); } return R.ok().put("res", resList); } //是否是这门课的vip @RequestMapping("/ownCourseCatalogueByVip") public R ownCourseCatalogueByVip(@RequestBody Map params) { UserVip userVip = userVipService.ownCourseCatalogueByVip(Integer.parseInt(params.get("courseId").toString())); Map userVipInfo = new HashMap<>(); if(userVip!=null){ userVipInfo.put("id",userVip.getId()); userVipInfo.put("userId",userVip.getUserId()); userVipInfo.put("type",userVip.getType()); userVipInfo.put("startTime",userVip.getStartTime()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); userVipInfo.put("endTime",sdf.format(userVip.getEndTime())); userVipInfo.put("state",userVip.getState()); userVipInfo.put("delFlag",userVip.getDelFlag()); userVipInfo.put("user",userVip.getUser()); userVipInfo.put("userVipLogs",userVip.getUserVipLogs()); }else{ userVipInfo = null; } return R.ok().put("userVip", userVipInfo); } //当前课程属于什么会员 @RequestMapping("/getCourseVipModule") public R getCourseVipModule(@RequestBody Map params) { return R.ok().put("list", userVipService.getCourseVipModule(Integer.parseInt(params.get("courseId").toString()))); } @RequestMapping("/getMyVipHistory") public R getMyVipHistory(String userId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); wrapper.eq(UserVip::getUserId,userId); wrapper.orderByAsc(UserVip::getState); wrapper.orderByAsc(UserVip::getEndTime); List userVips = userVipService.list(wrapper); return R.ok().put("result", userVips); } @RequestMapping("/placeVipOrder") @Transactional public R placeVipOrder(@RequestBody BuyOrder buyOrder){ int uid = ShiroUtils.getUId(); buyOrder.setOrderStatus("0"); buyOrder.setPaymentDate(new Date()); buyOrder.setOrderType("vip"); String timeId = IdWorker.getTimeId().substring(0, 32); buyOrder.setOrderSn(timeId); buyOrder.setUserId(uid); buyOrder.setPaymentDate(new Date()); buyOrderService.save(buyOrder); BigDecimal totalPrice = buyOrder.getRealMoney(); if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) { buyOrder.setOrderStatus(Constants.ORDER_STATUS_TO_BE_SHIPPED); MyUserEntity user = myUserDao.selectById(buyOrder.getUserId()); if (usePeanutCoin(user, totalPrice)&&useJfCoin(user,buyOrder.getJfDeduction())) { // 更新订单状态 buyOrder.setPaymentDate(new Date()); buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "2"); //记录用户虚拟币消费 if(totalPrice.compareTo(BigDecimal.ZERO)>0){ transactionDetailsService.recordTransaction(buyOrder, user, totalPrice); } //记录用户积分消费情况 if(buyOrder.getJfDeduction()!=null&&buyOrder.getJfDeduction().compareTo(BigDecimal.ZERO) > 0){ jfTransactionDetailsService.recordJfTransaction(buyOrder, user, buyOrder.getJfDeduction()); } //开通用户vip userVipService.openVipForUser(buyOrder); } else { rabbitTemplate.convertAndSend( DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE, DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY, buyOrder.getOrderId(), messagePostProcessor() ); return R.error(500, "余额不足!"); } } //下单微信支付预付款订单 if(Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())){ BuyOrder buyOrderEntity = buyOrderService.getBaseMapper().selectOne(new LambdaQueryWrapper().eq(BuyOrder::getOrderSn, timeId)); WechatPaymentInfo paymentInfo = new WechatPaymentInfo(); paymentInfo.setOrderSn(buyOrderEntity.getOrderSn()); paymentInfo.setBuyOrderId(buyOrderEntity.getOrderId()); paymentInfo.setTotalAmount(buyOrderEntity.getRealMoney()); // paymentInfo.setAppName(buyOrder.getAppName()); if (buyOrder.getCome()==2){ paymentInfo.setAppName("wumen"); } else if (buyOrder.getCome()==1) { paymentInfo.setAppName("zmzm"); } else if (buyOrder.getCome()==3) { paymentInfo.setAppName("xlkj"); } else if (buyOrder.getCome()==4) { paymentInfo.setAppName("thyy"); }else { paymentInfo.setAppName(buyOrder.getAppName()); } wxpayService.prepay(paymentInfo); } rabbitTemplate.convertAndSend( DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE, DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY, buyOrder.getOrderId(), messagePostProcessor() ); return R.ok().put("orderSn", timeId).put("money",buyOrder.getRealMoney()); } private boolean usePeanutCoin(MyUserEntity user, BigDecimal totalPrice) { if (user.getPeanutCoin().compareTo(totalPrice) >= 0) { if(totalPrice.compareTo(BigDecimal.ZERO)==0){//纯积分支付,虚拟币不用支付 return true; } user.setPeanutCoin(user.getPeanutCoin().subtract(totalPrice)); myUserDao.updateById(user); return true; } return false; } private boolean useJfCoin(MyUserEntity user,BigDecimal jf){ if(jf==null){ return true; } if(user.getJf().compareTo(jf)>=0){ user.setJf(user.getJf().subtract(jf)); myUserDao.updateById(user); return true; }else{ return false; } } private MessagePostProcessor messagePostProcessor() { return message -> { //设置有效期30分钟 message.getMessageProperties().setExpiration(String.valueOf(30 * 60 * 1000)); return message; }; } public Map getOriginalPriceAndCourseCount(String type) { Map map = new HashMap(); map.put("courseCount",0); map.put("originalPrice",0); if ("4".equals(type)||"9".equals(type)||"5".equals(type)||"6".equals(type)||"10".equals(type)){ List list = new ArrayList<>(); if ("4".equals(type)){ userVipService.bottomLabel(1,list); }else if ("9".equals(type)){ userVipService.bottomLabel(74,list); }else if ("5".equals(type)){ userVipService.bottomLabel(2,list); }else if ("6".equals(type)){ userVipService.bottomLabel(5,list); }else if ("10".equals(type)){ userVipService.bottomLabel(109,list); } if (list.size()>0){ MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.inSql(CourseCatalogueEntity::getCourseId, "select course_id from course_to_medicine where del_flag = 0 and medical_id in ("+String.join(",",list.toString().replace("[","").replace("]",""))+") group by course_id"); wrapper.select("count(1) as courseCount,sum(fee) as originalPrice"); map = courseCatalogueService.getMap(wrapper); } }else if ("7".equals(type)){ MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.inSql(CourseCatalogueEntity::getCourseId, "select course_id from course_to_sociology where del_flag = 0 group by course_id"); wrapper.select("count(1) as courseCount,sum(fee) as originalPrice"); map = courseCatalogueService.getMap(wrapper); }else if ("8".equals(type)){ MPJLambdaWrapper pWrapper = new MPJLambdaWrapper(); pWrapper.inSql(CourseCatalogueEntity::getCourseId, "select course_id from course_to_psyche where del_flag = 0 group by course_id"); pWrapper.select("count(1) as courseCount,sum(fee) as originalPrice"); map = courseCatalogueService.getMap(pWrapper); }else if ("2".equals(type)){ MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.inSql(CourseCatalogueEntity::getCourseId, "select course_id from course_to_sociology where del_flag = 0 group by course_id\n" + "union \n" + "select course_id from course_to_psyche where del_flag = 0 group by course_id"); wrapper.select("count(1) as courseCount,sum(fee) as originalPrice"); map = courseCatalogueService.getMap(wrapper); }else if ("1".equals(type)){ MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.inSql(CourseCatalogueEntity::getCourseId, "select course_id from course_to_medicine where del_flag = 0 group by course_id\n" + "union \n" + "select course_id from course_to_sociology where del_flag = 0 group by course_id\n" + "union \n" + "select course_id from course_to_psyche where del_flag = 0 group by course_id"); wrapper.select("count(1) as courseCount,sum(fee) as originalPrice"); map = courseCatalogueService.getMap(wrapper); } return map; } }