|
@@ -0,0 +1,825 @@
|
|
|
+package com.qxgmat.service.extend;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.nuliji.tools.Tools;
|
|
|
+import com.nuliji.tools.Transform;
|
|
|
+import com.nuliji.tools.exception.ParameterException;
|
|
|
+import com.qxgmat.data.constants.enums.ServiceKey;
|
|
|
+import com.qxgmat.data.constants.enums.ServiceVipKey;
|
|
|
+import com.qxgmat.data.constants.enums.module.CourseModule;
|
|
|
+import com.qxgmat.data.constants.enums.module.ProductType;
|
|
|
+import com.qxgmat.data.constants.enums.trade.PayChannel;
|
|
|
+import com.qxgmat.data.constants.enums.trade.PayMethod;
|
|
|
+import com.qxgmat.data.constants.enums.trade.PayModule;
|
|
|
+import com.qxgmat.data.constants.enums.trade.RecordSource;
|
|
|
+import com.qxgmat.data.dao.entity.*;
|
|
|
+import com.qxgmat.service.UserServiceService;
|
|
|
+import com.qxgmat.service.UsersService;
|
|
|
+import com.qxgmat.service.annotation.*;
|
|
|
+import com.qxgmat.service.inline.*;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class OrderFlowService {
|
|
|
+ @Resource
|
|
|
+ private ToolsService toolsService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CourseService courseService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CourseExtendService courseExtendService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CoursePackageService coursePackageService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private CourseDataService courseDataService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserCourseService userCourseService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserServiceService userServiceService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserOrderService userOrderService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserOrderCheckoutService userOrderCheckoutService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserOrderRecordService userOrderRecordService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UsersService usersService;
|
|
|
+
|
|
|
+ private TradeService tradeService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private void registerTrade(TradeService tradeService) {
|
|
|
+ this.tradeService = tradeService;
|
|
|
+ this.tradeService.register(PayModule.ORDER, (obj)->{
|
|
|
+ Pay pay = (Pay)obj;
|
|
|
+ Integer userId = pay.getUserId();
|
|
|
+ Integer orderId = pay.getModuleExtend();
|
|
|
+ return this.payed(orderId, userId, pay.getId(), pay.getPayTime(), PayMethod.FromChannel(PayChannel.ValueOf(pay.getChannel())), pay.getTransactionNo());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<ProductType, InitCheckout> initCheckoutCallback = new HashMap<>();
|
|
|
+
|
|
|
+ private Map<ProductType, RemoveCheckout> removeCheckoutCallback = new HashMap<>();
|
|
|
+
|
|
|
+ private Map<ProductType, InitOrder> initOrderCallback = new HashMap<>();
|
|
|
+
|
|
|
+ private Map<ProductType, InitRecord> initRecordCallback = new HashMap<>();
|
|
|
+
|
|
|
+ private Map<ProductType, UseRecord> useRecordCallback = new HashMap<>();
|
|
|
+
|
|
|
+ private Map<ProductType, StopRecord> stopRecordCallback = new HashMap<>();
|
|
|
+
|
|
|
+ public OrderFlowService(){
|
|
|
+ initCheckoutCallback.put(ProductType.COURSE, ((checkout, userOrderCheckoutList) -> {
|
|
|
+
|
|
|
+ UserOrderCheckout tmp=null;
|
|
|
+ for(UserOrderCheckout in: userOrderCheckoutList){
|
|
|
+ if (!in.getProductType().equals(ProductType.COURSE.key)) continue;
|
|
|
+ if (in.getProductId().equals(checkout.getProductId())){
|
|
|
+ tmp = in;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Course mainCourse = courseService.get(checkout.getProductId());
|
|
|
+
|
|
|
+
|
|
|
+ if (mainCourse.getCourseModule().equals(CourseModule.VS.key)){
|
|
|
+ if (tmp != null){
|
|
|
+
|
|
|
+ checkout.setId(tmp.getId());
|
|
|
+ checkout.setNumber(tmp.getNumber() + checkout.getNumber());
|
|
|
+ }
|
|
|
+ checkout.setOriginMoney(mainCourse.getPrice().multiply(BigDecimal.valueOf(checkout.getNumber())));
|
|
|
+ int percent = toolsService.computeVsMoney(checkout);
|
|
|
+ checkout.setMoney(checkout.getOriginMoney().multiply(BigDecimal.valueOf(percent)).divide(BigDecimal.valueOf(100), BigDecimal.ROUND_HALF_UP));
|
|
|
+ return checkout;
|
|
|
+ }else{
|
|
|
+
|
|
|
+ if(tmp != null){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ checkout.setMoney(mainCourse.getPrice());
|
|
|
+ checkout.setOriginMoney(mainCourse.getPrice());
|
|
|
+
|
|
|
+
|
|
|
+ userOrderCheckoutList.add(checkout);
|
|
|
+
|
|
|
+ List<UserOrderCheckout> courseCheckout = userOrderCheckoutList.stream().filter((in)-> in.getProductType().equals(ProductType.COURSE.key) && in.getParentId() == 0).collect(Collectors.toList());
|
|
|
+ Collection courseIds = Transform.getIds(courseCheckout, UserOrderCheckout.class, "productId");
|
|
|
+ CoursePackage coursePackage = coursePackageService.combineCourse(courseIds);
|
|
|
+ if(coursePackage != null){
|
|
|
+ List<Course> courseList = courseService.select(coursePackage.getCourseIds());
|
|
|
+ BigDecimal originMoney = BigDecimal.valueOf(0);
|
|
|
+ for(Course course : courseList){
|
|
|
+ originMoney = originMoney.add(course.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ UserOrderCheckout packageCheckout = UserOrderCheckout.builder()
|
|
|
+ .productType(ProductType.COURSE_PACKAGE.key)
|
|
|
+ .productId(coursePackage.getId())
|
|
|
+ .money(coursePackage.getPrice())
|
|
|
+ .originMoney(originMoney)
|
|
|
+ .build();
|
|
|
+ packageCheckout = userOrderCheckoutService.add(packageCheckout);
|
|
|
+
|
|
|
+ List<Integer> ids = Arrays.stream(coursePackage.getCourseIds()).collect(Collectors.toList());
|
|
|
+ for(UserOrderCheckout c:courseCheckout){
|
|
|
+ if (ids.contains(c.getProductId())){
|
|
|
+ if (c.getId() !=null && c.getId() > 0){
|
|
|
+ userOrderCheckoutService.edit(UserOrderCheckout.builder()
|
|
|
+ .id(c.getId())
|
|
|
+ .parentId(packageCheckout.getId())
|
|
|
+ .build());
|
|
|
+ }else{
|
|
|
+ c.setParentId(packageCheckout.getId());
|
|
|
+ userOrderCheckoutService.add(c);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return checkout;
|
|
|
+ }));
|
|
|
+ initCheckoutCallback.put(ProductType.COURSE_PACKAGE, ((checkout, userOrderCheckoutList)->{
|
|
|
+ for(UserOrderCheckout in: userOrderCheckoutList){
|
|
|
+ if (!in.getProductType().equals(ProductType.COURSE_PACKAGE.key)) continue;
|
|
|
+ if (in.getProductId().equals(checkout.getProductId())) return null;
|
|
|
+ }
|
|
|
+ CoursePackage coursePackage = coursePackageService.get(checkout.getProductId());
|
|
|
+ List<Course> courseList = courseService.select(coursePackage.getCourseIds());
|
|
|
+ Map<Integer, Course> courseMap = new HashMap<>();
|
|
|
+ for(Course course : courseList){
|
|
|
+ courseMap.put(course.getId(), course);
|
|
|
+ }
|
|
|
+ BigDecimal originMoney = BigDecimal.valueOf(0);
|
|
|
+ for(Course course : courseList){
|
|
|
+ originMoney = originMoney.add(course.getPrice());
|
|
|
+ }
|
|
|
+ checkout.setMoney(coursePackage.getPrice());
|
|
|
+ checkout.setOriginMoney(originMoney);
|
|
|
+ checkout = userOrderCheckoutService.add(checkout);
|
|
|
+
|
|
|
+
|
|
|
+ List<Integer> ids = Arrays.stream(coursePackage.getCourseIds()).collect(Collectors.toList());
|
|
|
+ List<UserOrderCheckout> courseCheckout = userOrderCheckoutList.stream().filter((in)-> in.getProductType().equals(ProductType.COURSE.key) && in.getParentId() == 0).collect(Collectors.toList());
|
|
|
+ for(UserOrderCheckout in : courseCheckout){
|
|
|
+ if (ids.contains(in.getProductId())){
|
|
|
+
|
|
|
+ userOrderCheckoutService.edit(UserOrderCheckout.builder()
|
|
|
+ .id(in.getId())
|
|
|
+ .parentId(checkout.getId())
|
|
|
+ .build());
|
|
|
+ ids.remove(in.getProductId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for(Integer id : ids){
|
|
|
+ Course course = courseMap.get(id);
|
|
|
+ userOrderCheckoutService.add(UserOrderCheckout.builder()
|
|
|
+ .parentId(checkout.getId())
|
|
|
+ .productType(ProductType.COURSE.key)
|
|
|
+ .productId(id)
|
|
|
+ .money(course.getPrice())
|
|
|
+ .originMoney(course.getPrice())
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }));
|
|
|
+ initCheckoutCallback.put(ProductType.DATA, ((checkout, userOrderCheckoutList)->{
|
|
|
+ for(UserOrderCheckout in: userOrderCheckoutList){
|
|
|
+ if (!in.getProductType().equals(ProductType.DATA.key)) continue;
|
|
|
+ if (in.getProductId().equals(checkout.getProductId())) return null;
|
|
|
+ }
|
|
|
+ CourseData courseData = courseDataService.get(checkout.getProductId());
|
|
|
+ checkout.setMoney(courseData.getPrice());
|
|
|
+ checkout.setOriginMoney(courseData.getPrice());
|
|
|
+ return checkout;
|
|
|
+ }));
|
|
|
+ initCheckoutCallback.put(ProductType.SERVICE, ((checkout, userOrderCheckoutList)->{
|
|
|
+ for(UserOrderCheckout in: userOrderCheckoutList){
|
|
|
+ if (!in.getProductType().equals(ProductType.SERVICE.key)) continue;
|
|
|
+ if (in.getService().equals(checkout.getService())){
|
|
|
+ checkout.setId(in.getId());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ BigDecimal money = BigDecimal.valueOf(toolsService.getServicePrice(checkout.getService(), checkout.getParam()));
|
|
|
+ checkout.setMoney(money);
|
|
|
+ checkout.setOriginMoney(money);
|
|
|
+ return checkout;
|
|
|
+ }));
|
|
|
+
|
|
|
+ removeCheckoutCallback.put(ProductType.COURSE, ((checkout, userOrderCheckoutList)->{
|
|
|
+
|
|
|
+ }));
|
|
|
+ removeCheckoutCallback.put(ProductType.COURSE_PACKAGE, ((checkout, userOrderCheckoutList)->{
|
|
|
+
|
|
|
+ }));
|
|
|
+ removeCheckoutCallback.put(ProductType.DATA, ((checkout, userOrderCheckoutList)->{
|
|
|
+
|
|
|
+ }));
|
|
|
+ removeCheckoutCallback.put(ProductType.SERVICE, ((checkout, userOrderCheckoutList)->{
|
|
|
+
|
|
|
+ }));
|
|
|
+
|
|
|
+ initOrderCallback.put(ProductType.SERVICE, ((order, userOrderCheckoutList) -> {
|
|
|
+
|
|
|
+ BigDecimal money = order.getMoney();
|
|
|
+ BigDecimal originMoney = order.getOriginMoney();
|
|
|
+ for(UserOrderCheckout checkout:userOrderCheckoutList){
|
|
|
+ money = money.add(checkout.getMoney());
|
|
|
+ originMoney = originMoney.add(checkout.getMoney());
|
|
|
+ }
|
|
|
+ order.setMoney(money);
|
|
|
+ order.setOriginMoney(originMoney);
|
|
|
+ }));
|
|
|
+ initOrderCallback.put(ProductType.DATA, ((order, userOrderCheckoutList) -> {
|
|
|
+
|
|
|
+ BigDecimal money = order.getMoney();
|
|
|
+ BigDecimal originMoney = order.getOriginMoney();
|
|
|
+ for(UserOrderCheckout checkout:userOrderCheckoutList){
|
|
|
+ money = money.add(checkout.getMoney());
|
|
|
+ originMoney = originMoney.add(checkout.getMoney());
|
|
|
+ }
|
|
|
+ order.setMoney(money);
|
|
|
+ order.setOriginMoney(originMoney);
|
|
|
+ }));
|
|
|
+ initOrderCallback.put(ProductType.COURSE, ((order, userOrderCheckoutList) -> {
|
|
|
+ BigDecimal money = order.getMoney();
|
|
|
+ BigDecimal originMoney = order.getOriginMoney();
|
|
|
+
|
|
|
+
|
|
|
+ List<UserOrderCheckout> courseCheckout = userOrderCheckoutList.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key) && checkout.getParentId() == 0).collect(Collectors.toList());
|
|
|
+ Collection courseIds = Transform.getIds(courseCheckout, UserOrderCheckout.class, "productId");
|
|
|
+ List<Course> courseList = courseService.select(courseIds);
|
|
|
+ Map<Integer, Course> courseMap = new HashMap<>();
|
|
|
+ for(Course course : courseList){
|
|
|
+ courseMap.put(course.getId(), course);
|
|
|
+ }
|
|
|
+ BigDecimal courseMoney = BigDecimal.valueOf(0);
|
|
|
+
|
|
|
+
|
|
|
+ List<UserOrderCheckout> videoCheckout = courseCheckout.stream().filter((checkout)-> courseMap.get(checkout.getProductId()).getCourseModule().equals(CourseModule.VIDEO.key)).collect(Collectors.toList());
|
|
|
+ BigDecimal videoMoney = BigDecimal.valueOf(0);
|
|
|
+ for(UserOrderCheckout checkout : videoCheckout){
|
|
|
+ videoMoney = videoMoney.add(checkout.getMoney());
|
|
|
+ }
|
|
|
+ int percent = toolsService.computeVideoMoney(courseCheckout);
|
|
|
+ if (percent < 100){
|
|
|
+ BigDecimal promoteVideoMoney = videoMoney.multiply(BigDecimal.valueOf(percent)).divide(BigDecimal.valueOf(100), BigDecimal.ROUND_HALF_UP);
|
|
|
+ courseMoney = courseMoney.add(promoteVideoMoney);
|
|
|
+ money = money.add(promoteVideoMoney);
|
|
|
+
|
|
|
+
|
|
|
+ JSONObject promoteVideo = new JSONObject();
|
|
|
+ JSONObject promote = order.getPromote();
|
|
|
+ promote.put("video", promoteVideo);
|
|
|
+ }else{
|
|
|
+ courseMoney = courseMoney.add(videoMoney);
|
|
|
+ money = money.add(videoMoney);
|
|
|
+ }
|
|
|
+ originMoney = originMoney.add(videoMoney);
|
|
|
+
|
|
|
+
|
|
|
+ List<UserOrderCheckout> vsCheckout = courseCheckout.stream().filter((checkout)-> courseMap.get(checkout.getProductId()).getCourseModule().equals(CourseModule.VS.key)).collect(Collectors.toList());
|
|
|
+ for(UserOrderCheckout checkout: vsCheckout){
|
|
|
+ courseMoney = courseMoney.add(checkout.getMoney());
|
|
|
+ money = money.add(checkout.getMoney());
|
|
|
+ originMoney = originMoney.add(checkout.getMoney());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<UserOrderCheckout> packageCheckout = userOrderCheckoutList.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
|
|
|
+ for(UserOrderCheckout checkout : packageCheckout){
|
|
|
+ courseMoney = courseMoney.add(checkout.getMoney());
|
|
|
+ money = money.add(checkout.getMoney());
|
|
|
+ originMoney = originMoney.add(checkout.getMoney());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ Integer ask = toolsService.getAskTime(courseMoney);
|
|
|
+ order.setAskTime(ask);
|
|
|
+
|
|
|
+ order.setMoney(money);
|
|
|
+ order.setOriginMoney(originMoney);
|
|
|
+ }));
|
|
|
+
|
|
|
+ initRecordCallback.put(ProductType.COURSE, (record -> {
|
|
|
+ Course course = courseService.get(record.getId());
|
|
|
+ CourseModule courseModule = CourseModule.ValueOf(course.getCourseModule());
|
|
|
+
|
|
|
+ Date startTime = new Date();
|
|
|
+ Date endTime = Tools.addDate(startTime, courseModule.expireDay);
|
|
|
+ record.setStartTime(startTime);
|
|
|
+ record.setEndTime(endTime);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ initRecordCallback.put(ProductType.COURSE_PACKAGE, (record->{
|
|
|
+
|
|
|
+ record.setIsUsed(1);
|
|
|
+ Date time = new Date();
|
|
|
+ record.setUseTime(time);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ initRecordCallback.put(ProductType.DATA, (record->{
|
|
|
+
|
|
|
+ record.setIsUsed(1);
|
|
|
+ Date time = new Date();
|
|
|
+ record.setUseTime(time);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ initRecordCallback.put(ProductType.SERVICE, (record->{
|
|
|
+ if(record.getService().equals(ServiceKey.VIP.key)){
|
|
|
+
|
|
|
+ record = useRecordCallback.get(ProductType.SERVICE).callback(record);
|
|
|
+ }else{
|
|
|
+ ServiceKey serviceKey = ServiceKey.ValueOf(record.getService());
|
|
|
+ Date startTime = new Date();
|
|
|
+ Date endTime = Tools.addMonth(startTime, serviceKey.expireDay);
|
|
|
+ record.setStartTime(startTime);
|
|
|
+ record.setEndTime(endTime);
|
|
|
+ }
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+
|
|
|
+ useRecordCallback.put(ProductType.COURSE, (record->{
|
|
|
+ record.setIsUsed(1);
|
|
|
+ Date time = new Date();
|
|
|
+ record.setUseTime(time);
|
|
|
+
|
|
|
+ Course course = courseService.get(record.getProductId());
|
|
|
+ Integer expireDay = 0;
|
|
|
+ if (course.getCourseModule().equals(CourseModule.VS.key)){
|
|
|
+
|
|
|
+ expireDay = courseExtendService.computeExpire(record.getNumber(), course);
|
|
|
+ }else{
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ Date startTime = time;
|
|
|
+ Date endTime = Tools.addDate(startTime, expireDay);
|
|
|
+ UserCourse userCourse = userCourseService.getCourse(record.getUserId(), record.getProductId());
|
|
|
+ if(userCourse == null){
|
|
|
+ userCourse = UserCourse.builder()
|
|
|
+ .userId(record.getUserId())
|
|
|
+ .recordId(record.getId())
|
|
|
+ .startTime(startTime)
|
|
|
+ .expireTime(endTime)
|
|
|
+ .build();
|
|
|
+ userCourse = userCourseService.add(userCourse);
|
|
|
+ }else{
|
|
|
+ if (userCourse.getExpireTime().before(time)){
|
|
|
+
|
|
|
+ userCourse.setStartTime(startTime);
|
|
|
+ userCourse.setExpireTime(endTime);
|
|
|
+ userCourse.setRecordId(record.getId());
|
|
|
+ }else{
|
|
|
+
|
|
|
+ throw new ParameterException("已开通当前课程");
|
|
|
+ }
|
|
|
+ userCourse = userCourseService.edit(userCourse);
|
|
|
+ }
|
|
|
+ record.setUseStartTime(startTime);
|
|
|
+ record.setUseEndTime(endTime);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ useRecordCallback.put(ProductType.COURSE_PACKAGE, (record->{
|
|
|
+
|
|
|
+ throw new ParameterException("套餐无需开通");
|
|
|
+ }));
|
|
|
+ useRecordCallback.put(ProductType.DATA, (record->{
|
|
|
+
|
|
|
+ throw new ParameterException("资料无需开通");
|
|
|
+ }));
|
|
|
+ useRecordCallback.put(ProductType.SERVICE, (record->{
|
|
|
+ record.setIsUsed(1);
|
|
|
+ Date time = new Date();
|
|
|
+ record.setUseTime(time);
|
|
|
+
|
|
|
+ ServiceKey serviceKey = ServiceKey.ValueOf(record.getService());
|
|
|
+ Integer expireDay = serviceKey.useExpireDay;
|
|
|
+ if(serviceKey == ServiceKey.VIP){
|
|
|
+ ServiceVipKey vipKey = ServiceVipKey.ValueOf(record.getParam());
|
|
|
+ expireDay = vipKey.useExpireDay;
|
|
|
+ }
|
|
|
+
|
|
|
+ Date startTime = time;
|
|
|
+ Date endTime = Tools.addDate(startTime, expireDay);
|
|
|
+ UserService userService = userServiceService.getService(record.getUserId(), serviceKey);
|
|
|
+ if (userService == null){
|
|
|
+ userService = UserService.builder()
|
|
|
+ .userId(record.getUserId())
|
|
|
+ .isSubscribe(record.getIsSubscribe())
|
|
|
+ .startTime(startTime)
|
|
|
+ .expireTime(endTime)
|
|
|
+ .build();
|
|
|
+ userService = userServiceService.add(userService);
|
|
|
+ }else{
|
|
|
+ if (userService.getExpireTime().before(time)){
|
|
|
+
|
|
|
+ userService.setStartTime(startTime);
|
|
|
+ userService.setExpireTime(endTime);
|
|
|
+ }else{
|
|
|
+ if (serviceKey == ServiceKey.QX_CAT){
|
|
|
+
|
|
|
+ throw new ParameterException("已开通当前服务");
|
|
|
+ }
|
|
|
+
|
|
|
+ startTime = userService.getExpireTime();
|
|
|
+ endTime = Tools.addDate(userService.getExpireTime(), expireDay);
|
|
|
+ userService.setExpireTime(endTime);
|
|
|
+ }
|
|
|
+ userService.setIsSubscribe(record.getIsSubscribe());
|
|
|
+ userService = userServiceService.edit(userService);
|
|
|
+ }
|
|
|
+ record.setUseStartTime(startTime);
|
|
|
+ record.setUseEndTime(endTime);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+
|
|
|
+ stopRecordCallback.put(ProductType.COURSE, (record->{
|
|
|
+ record.setIsUsed(1);
|
|
|
+ Date time = new Date();
|
|
|
+ record.setUseTime(time);
|
|
|
+
|
|
|
+ Course course = courseService.get(record.getProductId());
|
|
|
+ Integer expireDay = 0;
|
|
|
+ if (course.getCourseModule().equals(CourseModule.VS.key)){
|
|
|
+
|
|
|
+ expireDay = courseExtendService.computeExpire(record.getNumber(), course);
|
|
|
+ }else{
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ Date startTime = time;
|
|
|
+ Date endTime = Tools.addDate(startTime, expireDay);
|
|
|
+ UserCourse userCourse = userCourseService.getCourse(record.getUserId(), record.getProductId());
|
|
|
+ if(userCourse == null){
|
|
|
+ userCourse = UserCourse.builder()
|
|
|
+ .userId(record.getUserId())
|
|
|
+ .recordId(record.getId())
|
|
|
+ .startTime(startTime)
|
|
|
+ .expireTime(endTime)
|
|
|
+ .build();
|
|
|
+ userCourse = userCourseService.add(userCourse);
|
|
|
+ }else{
|
|
|
+ if (userCourse.getExpireTime().before(time)){
|
|
|
+
|
|
|
+ userCourse.setStartTime(startTime);
|
|
|
+ userCourse.setExpireTime(endTime);
|
|
|
+ userCourse.setRecordId(record.getId());
|
|
|
+ }else{
|
|
|
+
|
|
|
+ throw new ParameterException("已开通当前课程");
|
|
|
+ }
|
|
|
+ userCourse = userCourseService.edit(userCourse);
|
|
|
+ }
|
|
|
+ record.setUseStartTime(startTime);
|
|
|
+ record.setUseEndTime(endTime);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ stopRecordCallback.put(ProductType.COURSE_PACKAGE, (record->{
|
|
|
+
|
|
|
+ throw new ParameterException("套餐无需停用");
|
|
|
+ }));
|
|
|
+ stopRecordCallback.put(ProductType.DATA, (record->{
|
|
|
+
|
|
|
+ record.setIsStop(1);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ stopRecordCallback.put(ProductType.SERVICE, (record->{
|
|
|
+ record.setIsUsed(1);
|
|
|
+ Date time = new Date();
|
|
|
+ record.setUseTime(time);
|
|
|
+
|
|
|
+ ServiceKey serviceKey = ServiceKey.ValueOf(record.getService());
|
|
|
+ Integer expireDay = serviceKey.useExpireDay;
|
|
|
+ if(serviceKey == ServiceKey.VIP){
|
|
|
+ ServiceVipKey vipKey = ServiceVipKey.ValueOf(record.getParam());
|
|
|
+ expireDay = vipKey.useExpireDay;
|
|
|
+ }
|
|
|
+
|
|
|
+ Date startTime = time;
|
|
|
+ Date endTime = Tools.addDate(startTime, expireDay);
|
|
|
+ UserService userService = userServiceService.getService(record.getUserId(), serviceKey);
|
|
|
+ if (userService == null){
|
|
|
+ userService = UserService.builder()
|
|
|
+ .userId(record.getUserId())
|
|
|
+ .isSubscribe(record.getIsSubscribe())
|
|
|
+ .startTime(startTime)
|
|
|
+ .expireTime(endTime)
|
|
|
+ .build();
|
|
|
+ userService = userServiceService.add(userService);
|
|
|
+ }else{
|
|
|
+ if (userService.getExpireTime().before(time)){
|
|
|
+
|
|
|
+ userService.setStartTime(startTime);
|
|
|
+ userService.setExpireTime(endTime);
|
|
|
+ }else{
|
|
|
+ if (serviceKey == ServiceKey.QX_CAT){
|
|
|
+
|
|
|
+ throw new ParameterException("已开通当前服务");
|
|
|
+ }
|
|
|
+
|
|
|
+ startTime = userService.getExpireTime();
|
|
|
+ endTime = Tools.addDate(userService.getExpireTime(), expireDay);
|
|
|
+ userService.setExpireTime(endTime);
|
|
|
+ }
|
|
|
+ userService.setIsSubscribe(record.getIsSubscribe());
|
|
|
+ userService = userServiceService.edit(userService);
|
|
|
+ }
|
|
|
+ record.setUseStartTime(startTime);
|
|
|
+ record.setUseEndTime(endTime);
|
|
|
+ return record;
|
|
|
+ }));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 完成订单支付
|
|
|
+ * @param orderId
|
|
|
+ * @param userId
|
|
|
+ * @param payTime
|
|
|
+ * @param payMethod
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ private boolean payed(Integer orderId, Integer userId, Long payId, Date payTime, PayMethod payMethod, String transactionNo){
|
|
|
+ UserOrder userOrder = userOrderService.get(orderId);
|
|
|
+ if (userOrder == null) return false;
|
|
|
+ if (userOrder.getPayStatus() > 0) return false;
|
|
|
+ userOrder = userOrderService.edit(UserOrder.builder()
|
|
|
+ .id(userOrder.getId())
|
|
|
+ .payId(payId)
|
|
|
+ .payMethod(payMethod.key)
|
|
|
+ .payTime(payTime)
|
|
|
+ .transactionNo(transactionNo)
|
|
|
+ .payStatus(1)
|
|
|
+ .build());
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ List<UserOrderCheckout> checkoutList = userOrderCheckoutService.allByUser(userId, orderId);
|
|
|
+ userOrderCheckoutService.deleteByUser(userId, orderId);
|
|
|
+ for(UserOrderCheckout checkout : checkoutList){
|
|
|
+ UserOrderRecord record = Transform.convert(checkout, UserOrderRecord.class);
|
|
|
+ record.setSource(RecordSource.FromPayModule(payMethod).key);
|
|
|
+ InitRecord callback = initRecordCallback.get(ProductType.ValueOf(record.getProductType()));
|
|
|
+ callback.callback(record);
|
|
|
+ userOrderRecordService.add(record);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ usersService.accumulation(userOrder);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 添加购物车
|
|
|
+ * @param userId
|
|
|
+ * @param checkout
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public int addCheckout(Integer userId, UserOrderCheckout checkout){
|
|
|
+ List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(userId, 0);
|
|
|
+ InitCheckout callback = initCheckoutCallback.get(ProductType.ValueOf(checkout.getProductType()));
|
|
|
+ checkout = callback.callback(checkout, list);
|
|
|
+ if (checkout == null){
|
|
|
+
|
|
|
+ }else if(checkout.getId() > 0){
|
|
|
+ userOrderCheckoutService.edit(checkout);
|
|
|
+ }else{
|
|
|
+ userOrderCheckoutService.add(checkout);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return userOrderCheckoutService.allByUser(userId, 0).size();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 删除购物车
|
|
|
+ * @param checkoutId
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public int removeCheckout(Integer checkoutId, Integer userId){
|
|
|
+ UserOrderCheckout in = userOrderCheckoutService.get(checkoutId);
|
|
|
+ if (in == null){
|
|
|
+ throw new ParameterException("记录不存在");
|
|
|
+ }
|
|
|
+ if (!in.getUserId().equals(userId)){
|
|
|
+ throw new ParameterException("记录不存在");
|
|
|
+ }
|
|
|
+ if (in.getParentId() != null && in.getParentId() > 0){
|
|
|
+
|
|
|
+ throw new ParameterException("套餐内,不允许单独删除");
|
|
|
+ }
|
|
|
+ userOrderCheckoutService.delete(checkoutId);
|
|
|
+
|
|
|
+ List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(userId, 0);
|
|
|
+
|
|
|
+ for(UserOrderCheckout checkout: list){
|
|
|
+ if (checkout.getParentId()==null || checkout.getParentId() == 0) continue;
|
|
|
+ if (checkout.getParentId().equals(in.getId())){
|
|
|
+ userOrderCheckoutService.delete(checkout.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ RemoveCheckout callback = removeCheckoutCallback.get(ProductType.ValueOf(in.getProductType()));
|
|
|
+ callback.callback(in, list);
|
|
|
+
|
|
|
+
|
|
|
+ return userOrderCheckoutService.allByUser(userId, 0).size();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 根据购物车生成对应订单信息
|
|
|
+ * @param list
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public UserOrder preOrderWithCheckout(Integer userId, List<UserOrderCheckout> list){
|
|
|
+ UserOrder order = UserOrder.builder()
|
|
|
+ .userId(userId)
|
|
|
+ .originMoney(BigDecimal.valueOf(0))
|
|
|
+ .money(BigDecimal.valueOf(0))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ JSONObject promote = new JSONObject();
|
|
|
+ order.setPromote(promote);
|
|
|
+
|
|
|
+ JSONArray productTypes = new JSONArray();
|
|
|
+ order.setProductTypes(productTypes);
|
|
|
+
|
|
|
+ InitOrder callback;
|
|
|
+
|
|
|
+
|
|
|
+ List<UserOrderCheckout> courseCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key) || checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
|
|
|
+ callback = initOrderCallback.get(ProductType.COURSE);
|
|
|
+ callback.callback(order, courseCheckout);
|
|
|
+ if(courseCheckout.size() > 0){
|
|
|
+ productTypes.add(ProductType.COURSE.key);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<UserOrderCheckout> dataCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
|
|
|
+ callback = initOrderCallback.get(ProductType.DATA);
|
|
|
+ callback.callback(order, courseCheckout);
|
|
|
+ if (dataCheckout.size() > 0){
|
|
|
+ productTypes.add(ProductType.DATA.key);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<UserOrderCheckout> serviceCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
|
|
|
+ callback = initOrderCallback.get(ProductType.SERVICE);
|
|
|
+ callback.callback(order, courseCheckout);
|
|
|
+ if(serviceCheckout.size() > 0){
|
|
|
+ productTypes.add(ProductType.SERVICE.key);
|
|
|
+ }
|
|
|
+
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 支付购物车
|
|
|
+ * @param userId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public UserOrder makeOrder(Integer userId){
|
|
|
+ List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(userId, 0);
|
|
|
+ UserOrder order = preOrderWithCheckout(userId, list);
|
|
|
+ order = userOrderService.add(order);
|
|
|
+
|
|
|
+
|
|
|
+ userOrderCheckoutService.changeByUser(userId, 0, UserOrderCheckout.builder().orderId(order.getId()).build());
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 立即购买
|
|
|
+ * @param userId
|
|
|
+ * @param checkout
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public UserOrder makeOrderWithProduct(Integer userId, UserOrderCheckout checkout){
|
|
|
+ List<UserOrderCheckout> list = new ArrayList<UserOrderCheckout>(){{add(checkout);}};
|
|
|
+ UserOrder order = preOrderWithCheckout(userId, list);
|
|
|
+ order = userOrderService.add(order);
|
|
|
+ checkout.setOrderId(order.getId());
|
|
|
+ userOrderCheckoutService.add(checkout);
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 后台直接添加记录
|
|
|
+ * @param record
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public UserOrderRecord addRecord(UserOrderRecord record){
|
|
|
+ InitRecord callback = initRecordCallback.get(ProductType.ValueOf(record.getProductType()));
|
|
|
+ callback.callback(record);
|
|
|
+ return userOrderRecordService.add(record);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 开通记录
|
|
|
+ * @param userId
|
|
|
+ * @param recordId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public UserOrderRecord useRecord(Integer userId, Integer recordId){
|
|
|
+ UserOrderRecord in = userOrderRecordService.get(recordId);
|
|
|
+ if (in == null){
|
|
|
+ throw new ParameterException("记录不存在");
|
|
|
+ }
|
|
|
+ if (!in.getUserId().equals(userId)){
|
|
|
+ throw new ParameterException("记录不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ UseRecord callback = useRecordCallback.get(ProductType.ValueOf(in.getProductType()));
|
|
|
+ callback.callback(in);
|
|
|
+ return in;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void stopRecord(Integer recordId){
|
|
|
+ UserOrderRecord in = userOrderRecordService.get(recordId);
|
|
|
+ if (in == null){
|
|
|
+ throw new ParameterException("记录不存在");
|
|
|
+ }
|
|
|
+ if (in.getIsStop()> 0){
|
|
|
+ throw new ParameterException("已停用");
|
|
|
+ }
|
|
|
+
|
|
|
+ UseRecord callback = useRecordCallback.get(ProductType.ValueOf(in.getProductType()));
|
|
|
+ callback.callback(in);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 给用户邀请奖励: 7天vip
|
|
|
+ * @param userId
|
|
|
+ */
|
|
|
+ public void giveInvite(Integer userId){
|
|
|
+ UserOrderRecord record = UserOrderRecord.builder()
|
|
|
+ .userId(userId)
|
|
|
+ .service(ServiceKey.VIP.key)
|
|
|
+ .param(ServiceVipKey.DAY7.key)
|
|
|
+ .source(RecordSource.INVITE.key)
|
|
|
+ .build();
|
|
|
+ record = initRecordCallback.get(ProductType.SERVICE).callback(record);
|
|
|
+ userOrderRecordService.add(record);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 给用户备考奖励: 7天vip
|
|
|
+ * @param userId
|
|
|
+ */
|
|
|
+ public void givePrepare(Integer userId){
|
|
|
+ UserOrderRecord record = UserOrderRecord.builder()
|
|
|
+ .userId(userId)
|
|
|
+ .service(ServiceKey.VIP.key)
|
|
|
+ .param(ServiceVipKey.DAY7.key)
|
|
|
+ .source(RecordSource.PREPARE.key)
|
|
|
+ .build();
|
|
|
+ record = initRecordCallback.get(ProductType.SERVICE).callback(record);
|
|
|
+ userOrderRecordService.add(record);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 给用户实名认证奖励: 180天vip
|
|
|
+ * @param userId
|
|
|
+ */
|
|
|
+ public void giveReal(Integer userId){
|
|
|
+ UserOrderRecord record = UserOrderRecord.builder()
|
|
|
+ .userId(userId)
|
|
|
+ .service(ServiceKey.VIP.key)
|
|
|
+ .param(ServiceVipKey.MONTH6.key)
|
|
|
+ .source(RecordSource.REAL.key)
|
|
|
+ .build();
|
|
|
+ record = initRecordCallback.get(ProductType.SERVICE).callback(record);
|
|
|
+ userOrderRecordService.add(record);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|