OrderFlowService.java 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. package com.qxgmat.service.extend;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.nuliji.tools.Tools;
  5. import com.nuliji.tools.Transform;
  6. import com.nuliji.tools.exception.ParameterException;
  7. import com.qxgmat.data.constants.enums.ServiceKey;
  8. import com.qxgmat.data.constants.enums.ServiceVipKey;
  9. import com.qxgmat.data.constants.enums.module.CourseModule;
  10. import com.qxgmat.data.constants.enums.module.ProductType;
  11. import com.qxgmat.data.constants.enums.trade.PayChannel;
  12. import com.qxgmat.data.constants.enums.trade.PayMethod;
  13. import com.qxgmat.data.constants.enums.trade.PayModule;
  14. import com.qxgmat.data.constants.enums.trade.RecordSource;
  15. import com.qxgmat.data.dao.entity.*;
  16. import com.qxgmat.service.UserServiceService;
  17. import com.qxgmat.service.UsersService;
  18. import com.qxgmat.service.annotation.*;
  19. import com.qxgmat.service.inline.*;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import javax.annotation.Resource;
  23. import java.math.BigDecimal;
  24. import java.util.*;
  25. import java.util.stream.Collectors;
  26. @Service
  27. public class OrderFlowService {
  28. @Resource
  29. private ToolsService toolsService;
  30. @Resource
  31. private CourseService courseService;
  32. @Resource
  33. private CourseExtendService courseExtendService;
  34. @Resource
  35. private CoursePackageService coursePackageService;
  36. @Resource
  37. private CourseDataService courseDataService;
  38. @Resource
  39. private UserCourseService userCourseService;
  40. @Resource
  41. private UserServiceService userServiceService;
  42. @Resource
  43. private UserOrderService userOrderService;
  44. @Resource
  45. private UserOrderCheckoutService userOrderCheckoutService;
  46. @Resource
  47. private UserOrderRecordService userOrderRecordService;
  48. @Resource
  49. private UserCourseDataSubscribeService userCourseDataSubscribeService;
  50. @Resource
  51. private UsersService usersService;
  52. @Resource
  53. private ExaminationService examinationService;
  54. @Resource
  55. private MessageExtendService messageExtendService;
  56. @Resource
  57. private TextbookService textbookService;
  58. private TradeService tradeService;
  59. @Resource
  60. private void registerTrade(TradeService tradeService) {
  61. this.tradeService = tradeService;
  62. this.tradeService.register(PayModule.ORDER, (obj)->{
  63. Pay pay = (Pay)obj;
  64. Integer userId = pay.getUserId();
  65. Integer orderId = pay.getModuleExtend();
  66. return this.payed(orderId, userId, pay.getId(), pay.getPayTime(), PayMethod.FromChannel(PayChannel.ValueOf(pay.getChannel())), pay.getTransactionNo());
  67. });
  68. }
  69. private Map<ProductType, InitCheckout> initCheckoutCallback = new HashMap<>();
  70. private Map<ProductType, ChangeCheckout> changeCheckoutCallback = new HashMap<>();
  71. private Map<ProductType, RemoveCheckout> removeCheckoutCallback = new HashMap<>();
  72. private Map<ProductType, InitOrder> initOrderCallback = new HashMap<>();
  73. private Map<ProductType, InitRecord> initRecordCallback = new HashMap<>();
  74. private Map<ProductType, UseRecord> useRecordCallback = new HashMap<>();
  75. private Map<ProductType, StopRecord> stopRecordCallback = new HashMap<>();
  76. public OrderFlowService(){
  77. initCheckoutCallback.put(ProductType.COURSE, ((checkout, userOrderCheckoutList) -> {
  78. // 判断课程是否已经存在
  79. UserOrderCheckout tmp=null;
  80. for(UserOrderCheckout in: userOrderCheckoutList){
  81. if (!in.getProductType().equals(ProductType.COURSE.key)) continue;
  82. if (in.getProductId().equals(checkout.getProductId())){
  83. tmp = in;
  84. break;
  85. }
  86. }
  87. Course mainCourse = courseService.get(checkout.getProductId());
  88. // 判断是否是1v1课程
  89. if (mainCourse.getCourseModule().equals(CourseModule.VS.key)){
  90. if (tmp != null){
  91. // 累加课时
  92. checkout.setId(tmp.getId());
  93. checkout.setNumber(tmp.getNumber() + checkout.getNumber());
  94. if (mainCourse.getMaxNumber() < checkout.getNumber()){
  95. checkout.setNumber(mainCourse.getMaxNumber());
  96. }
  97. }else{
  98. if (mainCourse.getMinNumber() > checkout.getNumber()){
  99. checkout.setNumber(mainCourse.getMinNumber());
  100. }
  101. }
  102. checkout.setOriginMoney(mainCourse.getPrice().multiply(BigDecimal.valueOf(checkout.getNumber())));
  103. int percent = toolsService.computeVsMoney(checkout);
  104. checkout.setMoney(checkout.getOriginMoney().multiply(BigDecimal.valueOf(percent)).divide(BigDecimal.valueOf(100), BigDecimal.ROUND_HALF_UP));
  105. // 设定有效期
  106. checkout.setExpireDays(mainCourse.getExpireDays());
  107. checkout.setUseExpireDays(courseExtendService.computeExpire(checkout.getNumber(), mainCourse));
  108. return checkout;
  109. }else{
  110. // 课程已添加,无需添加
  111. if(tmp != null){
  112. return null;
  113. }
  114. // 设定有效期信息
  115. checkout.setExpireDays(mainCourse.getExpireDays());
  116. checkout.setUseExpireDays(courseExtendService.computeExpire(mainCourse));
  117. }
  118. // 填充金额
  119. checkout.setMoney(mainCourse.getPrice());
  120. checkout.setOriginMoney(mainCourse.getPrice());
  121. // 先加入列表,统一处理
  122. userOrderCheckoutList.add(checkout);
  123. // 判断是否符合套餐情况: 剩余的独立课程
  124. List<UserOrderCheckout> courseCheckout = userOrderCheckoutList.stream().filter((in)-> in.getProductType().equals(ProductType.COURSE.key) && (in.getParentId() ==null || in.getParentId()==0)).collect(Collectors.toList());
  125. Collection courseIds = Transform.getIds(courseCheckout, UserOrderCheckout.class, "productId");
  126. CoursePackage coursePackage = coursePackageService.combineCourse(courseIds);
  127. if(coursePackage != null){
  128. List<Course> courseList = courseService.select(coursePackage.getCourseIds());
  129. BigDecimal originMoney = BigDecimal.valueOf(0);
  130. for(Course course : courseList){
  131. originMoney = originMoney.add(course.getPrice());
  132. }
  133. // 加入套餐: 无需进入course_package的初始化流程
  134. UserOrderCheckout packageCheckout = UserOrderCheckout.builder()
  135. .productType(ProductType.COURSE_PACKAGE.key)
  136. .productId(coursePackage.getId())
  137. .money(coursePackage.getPrice())
  138. .originMoney(originMoney)
  139. .build();
  140. packageCheckout = userOrderCheckoutService.add(packageCheckout);
  141. // 绑定所属
  142. List<Integer> ids = Arrays.stream(coursePackage.getCourseIds()).collect(Collectors.toList());
  143. for(UserOrderCheckout c:courseCheckout){
  144. if (ids.contains(c.getProductId())){
  145. if (c.getId() !=null && c.getId() > 0){
  146. userOrderCheckoutService.edit(UserOrderCheckout.builder()
  147. .id(c.getId())
  148. .parentId(packageCheckout.getId())
  149. .build());
  150. }else{
  151. c.setParentId(packageCheckout.getId());
  152. userOrderCheckoutService.add(c);
  153. }
  154. }
  155. }
  156. return null;
  157. }
  158. // 正常添加
  159. return checkout;
  160. }));
  161. initCheckoutCallback.put(ProductType.COURSE_PACKAGE, ((checkout, userOrderCheckoutList)->{
  162. for(UserOrderCheckout in: userOrderCheckoutList){
  163. if (!in.getProductType().equals(ProductType.COURSE_PACKAGE.key)) continue;
  164. if (in.getProductId().equals(checkout.getProductId())) return null;
  165. }
  166. CoursePackage coursePackage = coursePackageService.get(checkout.getProductId());
  167. List<Course> courseList = courseService.select(coursePackage.getCourseIds());
  168. Map<Integer, Course> courseMap = new HashMap<>();
  169. for(Course course : courseList){
  170. courseMap.put(course.getId(), course);
  171. }
  172. BigDecimal originMoney = BigDecimal.valueOf(0);
  173. for(Course course : courseList){
  174. originMoney = originMoney.add(course.getPrice());
  175. }
  176. checkout.setMoney(coursePackage.getPrice());
  177. checkout.setOriginMoney(originMoney);
  178. checkout = userOrderCheckoutService.add(checkout);
  179. // 转移课程包含的独立课程
  180. List<Integer> ids = Arrays.stream(coursePackage.getCourseIds()).collect(Collectors.toList());
  181. List<UserOrderCheckout> courseCheckout = userOrderCheckoutList.stream().filter((in)-> in.getProductType().equals(ProductType.COURSE.key) && in.getParentId() == 0).collect(Collectors.toList());
  182. for(UserOrderCheckout in : courseCheckout){
  183. if (ids.contains(in.getProductId())){
  184. in.setParentId(checkout.getId());
  185. // 转移该购物车记录
  186. userOrderCheckoutService.edit(UserOrderCheckout.builder()
  187. .id(in.getId())
  188. .parentId(checkout.getId())
  189. .build());
  190. ids.remove(in.getProductId());
  191. }
  192. }
  193. // 添加还未添加的课程记录
  194. for(Integer id : ids){
  195. UserOrderCheckout tmp = UserOrderCheckout.builder()
  196. .parentId(checkout.getId())
  197. .productType(ProductType.COURSE.key)
  198. .productId(id)
  199. .build();
  200. // 获取有效期和金额
  201. initCheckoutCallback.get(ProductType.COURSE).callback(tmp, userOrderCheckoutList);
  202. userOrderCheckoutService.add(tmp);
  203. }
  204. return null;
  205. }));
  206. initCheckoutCallback.put(ProductType.DATA, ((checkout, userOrderCheckoutList)->{
  207. for(UserOrderCheckout in: userOrderCheckoutList){
  208. if (!in.getProductType().equals(ProductType.DATA.key)) continue;
  209. if (in.getProductId().equals(checkout.getProductId())) return null;
  210. }
  211. CourseData courseData = courseDataService.get(checkout.getProductId());
  212. checkout.setMoney(courseData.getPrice());
  213. checkout.setOriginMoney(courseData.getPrice());
  214. return checkout;
  215. }));
  216. initCheckoutCallback.put(ProductType.SERVICE, ((checkout, userOrderCheckoutList)->{
  217. for(UserOrderCheckout in: userOrderCheckoutList){
  218. if (!in.getProductType().equals(ProductType.SERVICE.key)) continue;
  219. if (in.getService().equals(checkout.getService())){
  220. checkout.setId(in.getId());
  221. break;
  222. }
  223. }
  224. BigDecimal money = BigDecimal.valueOf(toolsService.getServicePrice(checkout.getService(), checkout.getParam()));
  225. checkout.setOriginMoney(money);
  226. ServiceKey serviceKey = ServiceKey.ValueOf(checkout.getService());
  227. Integer useExpireDay = serviceKey.useExpireDay;
  228. Integer expireDay = serviceKey.expireDay;
  229. if(serviceKey == ServiceKey.VIP){
  230. ServiceVipKey vipKey = ServiceVipKey.ValueOf(checkout.getParam());
  231. useExpireDay = vipKey.useExpireDay;
  232. }
  233. checkout.setExpireDays(expireDay);
  234. checkout.setUseExpireDays(useExpireDay);
  235. if (serviceKey == ServiceKey.TEXTBOOK){
  236. // 是否存在半价机经券
  237. User user = usersService.get(checkout.getUserId());
  238. checkout.setMoney(user.getTextbookHalf() > 0 ? money.divide(BigDecimal.valueOf(2), BigDecimal.ROUND_HALF_UP):money);
  239. }else{
  240. checkout.setMoney(money);
  241. }
  242. return checkout;
  243. }));
  244. changeCheckoutCallback.put(ProductType.COURSE, ((originCheckout, checkout)->{
  245. Course mainCourse = courseService.get(originCheckout.getProductId());
  246. // 判断是否是1v1课程
  247. if (mainCourse.getCourseModule().equals(CourseModule.VS.key)){
  248. if (mainCourse.getMaxNumber() < checkout.getNumber()){
  249. throw new ParameterException("超过最大购买上限");
  250. }
  251. if (mainCourse.getMinNumber() > checkout.getNumber()){
  252. throw new ParameterException("超过最小购买下限");
  253. }
  254. checkout.setOriginMoney(mainCourse.getPrice().multiply(BigDecimal.valueOf(checkout.getNumber())));
  255. int percent = toolsService.computeVsMoney(checkout);
  256. checkout.setMoney(checkout.getOriginMoney().multiply(BigDecimal.valueOf(percent)).divide(BigDecimal.valueOf(100), BigDecimal.ROUND_HALF_UP));
  257. // 设定有效期
  258. checkout.setExpireDays(mainCourse.getExpireDays());
  259. checkout.setUseExpireDays(courseExtendService.computeExpire(checkout.getNumber(), mainCourse));
  260. return checkout;
  261. }else{
  262. // 无法修改
  263. throw new ParameterException("记录无法修改");
  264. }
  265. }));
  266. removeCheckoutCallback.put(ProductType.COURSE, ((checkout, userOrderCheckoutList)->{
  267. // 子项目不允许参数,则无需处理
  268. }));
  269. removeCheckoutCallback.put(ProductType.COURSE_PACKAGE, ((checkout, userOrderCheckoutList)->{
  270. // 删除对应子项目
  271. }));
  272. removeCheckoutCallback.put(ProductType.DATA, ((checkout, userOrderCheckoutList)->{
  273. // miss
  274. }));
  275. removeCheckoutCallback.put(ProductType.SERVICE, ((checkout, userOrderCheckoutList)->{
  276. // miss
  277. }));
  278. initOrderCallback.put(ProductType.SERVICE, ((order, userOrderCheckoutList) -> {
  279. // 累计金额
  280. BigDecimal money = order.getMoney();
  281. BigDecimal originMoney = order.getOriginMoney();
  282. for(UserOrderCheckout checkout:userOrderCheckoutList){
  283. ServiceKey serviceKey = ServiceKey.ValueOf(checkout.getService());
  284. if (serviceKey == ServiceKey.TEXTBOOK){
  285. // 是否存在半价机经券
  286. if (!checkout.getMoney().equals(checkout.getOriginMoney())){
  287. JSONObject info = new JSONObject();
  288. info.put("originMoney", originMoney);
  289. info.put("money", money);
  290. info.put("key", "textbook-half");
  291. info.put("message", "半价机经券");
  292. JSONArray promote = order.getPromote();
  293. promote.add(info);
  294. }
  295. }
  296. money = money.add(checkout.getMoney());
  297. originMoney = originMoney.add(checkout.getMoney());
  298. }
  299. order.setMoney(money);
  300. order.setOriginMoney(originMoney);
  301. }));
  302. initOrderCallback.put(ProductType.DATA, ((order, userOrderCheckoutList) -> {
  303. // 累计金额
  304. BigDecimal money = order.getMoney();
  305. BigDecimal originMoney = order.getOriginMoney();
  306. for(UserOrderCheckout checkout:userOrderCheckoutList){
  307. money = money.add(checkout.getMoney());
  308. originMoney = originMoney.add(checkout.getMoney());
  309. }
  310. order.setMoney(money);
  311. order.setOriginMoney(originMoney);
  312. }));
  313. initOrderCallback.put(ProductType.COURSE, ((order, userOrderCheckoutList) -> {
  314. BigDecimal money = order.getMoney();
  315. BigDecimal originMoney = order.getOriginMoney();
  316. Integer vsNumber = 0;
  317. // 独立课程信息: 排除套餐内的
  318. List<UserOrderCheckout> courseCheckout = userOrderCheckoutList.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key) && checkout.getParentId() == 0).collect(Collectors.toList());
  319. Collection courseIds = Transform.getIds(courseCheckout, UserOrderCheckout.class, "productId");
  320. List<Course> courseList = courseService.select(courseIds);
  321. Map<Integer, Course> courseMap = new HashMap<>();
  322. for(Course course : courseList){
  323. courseMap.put(course.getId(), course);
  324. }
  325. BigDecimal courseMoney = BigDecimal.valueOf(0);
  326. // 视频课程优惠
  327. List<UserOrderCheckout> videoCheckout = courseCheckout.stream().filter((checkout)-> courseMap.get(checkout.getProductId()).getCourseModule().equals(CourseModule.VIDEO.key)).collect(Collectors.toList());
  328. BigDecimal videoMoney = BigDecimal.valueOf(0);
  329. BigDecimal videoOriginMoney = BigDecimal.valueOf(0);
  330. for(UserOrderCheckout checkout : videoCheckout){
  331. videoMoney = videoMoney.add(checkout.getMoney());
  332. videoOriginMoney = videoOriginMoney.add(checkout.getOriginMoney());
  333. }
  334. int percent = toolsService.computeVideoMoney(courseCheckout);
  335. if (percent < 100){
  336. BigDecimal promoteVideoMoney = videoMoney.multiply(BigDecimal.valueOf(percent)).divide(BigDecimal.valueOf(100), BigDecimal.ROUND_HALF_UP);
  337. courseMoney = courseMoney.add(promoteVideoMoney);
  338. money = money.add(promoteVideoMoney);
  339. // 添加视频优惠记录
  340. JSONObject info = new JSONObject();
  341. info.put("originMoney", videoMoney);
  342. info.put("money", promoteVideoMoney);
  343. info.put("message", toolsService.videoMoneyMessage());
  344. info.put("key", "video");
  345. JSONArray promote = order.getPromote();
  346. promote.add(info);
  347. }else{
  348. courseMoney = courseMoney.add(videoMoney);
  349. money = money.add(videoMoney);
  350. }
  351. originMoney = originMoney.add(videoOriginMoney);
  352. BigDecimal vsMoney = BigDecimal.valueOf(0);
  353. // 1v1课程优惠: 添加时计算
  354. List<UserOrderCheckout> vsCheckout = courseCheckout.stream().filter((checkout)-> courseMap.get(checkout.getProductId()).getCourseModule().equals(CourseModule.VS.key)).collect(Collectors.toList());
  355. for(UserOrderCheckout checkout: vsCheckout){
  356. vsMoney = vsMoney.add(checkout.getMoney());
  357. money = money.add(checkout.getMoney());
  358. originMoney = originMoney.add(checkout.getOriginMoney());
  359. vsNumber += checkout.getNumber();
  360. if(!money.equals(originMoney)){
  361. // 添加1v1优惠记录
  362. JSONObject info = new JSONObject();
  363. info.put("originMoney", originMoney);
  364. info.put("money", money);
  365. info.put("message", toolsService.vsMoneyMessage());
  366. info.put("key", "vs");
  367. JSONArray promote = order.getPromote();
  368. promote.add(info);
  369. }
  370. }
  371. // 套餐费用: 添加时计算
  372. List<UserOrderCheckout> packageCheckout = userOrderCheckoutList.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
  373. for(UserOrderCheckout checkout : packageCheckout){
  374. courseMoney = courseMoney.add(checkout.getMoney());
  375. money = money.add(checkout.getMoney());
  376. originMoney = originMoney.add(checkout.getOriginMoney());
  377. // 套餐优惠记录 - 不参与总价,单独展示逻辑
  378. }
  379. // 满金额处理
  380. // 回复时长: 总金额
  381. JSONObject askInfo = toolsService.getAskTime(courseMoney.add(vsMoney));
  382. if(askInfo != null) order.setAskTime(askInfo.getIntValue("hour") * 3600);
  383. // 1v1辅导:视频课程金额
  384. JSONObject vsVideoMoney = toolsService.getVsVideoMoney(courseMoney);
  385. // 满课时处理:vs课时
  386. JSONObject vsVsNumber = toolsService.getVsVsNumber(vsNumber);
  387. JSONArray gift = order.getGift();
  388. if (askInfo!=null && askInfo.getIntValue("money") > 0){
  389. // 因为存在默认最低值,金额超过限额,才写入赠送
  390. JSONObject info = new JSONObject();
  391. info.put("key", "ask");
  392. info.put("money", askInfo.getIntValue("money"));
  393. info.put("hour", askInfo.getIntValue("hour"));
  394. info.put("message", toolsService.askTimeMessage().replace("{}", askInfo.getInteger("hour").toString()));
  395. gift.add(info);
  396. }
  397. // vsVsNumber与vsVideoMoney
  398. if(vsVsNumber != null){
  399. JSONObject info = new JSONObject();
  400. info.put("key", "vs");
  401. info.put("from", "vsNumber");
  402. info.put("number", vsVsNumber.getIntValue("number"));
  403. info.put("value", vsVsNumber.getIntValue("value"));
  404. info.put("message", toolsService.vsVsNumberMessage().replace("{}", vsVsNumber.getInteger("value").toString()));
  405. gift.add(info);
  406. }else if (vsVideoMoney != null){
  407. JSONObject info = new JSONObject();
  408. info.put("key", "vs");
  409. info.put("from", "videoMoney");
  410. info.put("money", vsVideoMoney.getIntValue("money"));
  411. info.put("value", vsVideoMoney.getIntValue("value"));
  412. info.put("message", toolsService.vsVideoMoneyMessage().replace("{}", vsVideoMoney.getInteger("value").toString()));
  413. gift.add(info);
  414. }
  415. order.setMoney(money);
  416. order.setOriginMoney(originMoney);
  417. // 课程金额进行开票处理
  418. order.setInvoiceMoney(courseMoney.add(vsMoney));
  419. }));
  420. initRecordCallback.put(ProductType.COURSE, ((order, record) -> {
  421. Course course = courseService.get(record.getProductId());
  422. // 记录销售数量
  423. courseService.accumulation(course.getId(), 0, record.getParentId() == null || record.getProductId() ==0 ? 1:0, record.getParentId() != null && record.getProductId() != 0 ? 1:0);
  424. CourseModule courseModule = CourseModule.ValueOf(course.getCourseModule());
  425. // 小班课程不会存在记录,在线视频和1v1授课都有有效期
  426. Date startTime = new Date();
  427. Date endTime = Tools.addDate(startTime, record.getExpireDays());
  428. record.setStartTime(startTime);
  429. record.setEndTime(endTime);
  430. // 绑定订单的回复时长
  431. record.setAskTime(order.getAskTime());
  432. // 计算vs课程编号
  433. if (courseModule == CourseModule.VS){
  434. Integer no = userOrderRecordService.maxVsNo(order.getUserId());
  435. record.setVsNo(no+1);
  436. }
  437. return record;
  438. }));
  439. initRecordCallback.put(ProductType.COURSE_PACKAGE, ((order, record)->{
  440. // 资料无需开启,也没有有效期
  441. record.setIsUsed(1);
  442. Date time = new Date();
  443. record.setUseTime(time);
  444. // 处理套餐赠送
  445. CoursePackage coursePackage = coursePackageService.get(record.getProductId());
  446. // 记录销售数量
  447. coursePackageService.accumulation(coursePackage.getId(), 1);
  448. InitRecord callback = initRecordCallback.get(ProductType.SERVICE);
  449. JSONObject gift = coursePackage.getGift();
  450. Integer qxCat = gift.getInteger(ServiceKey.QX_CAT.key);
  451. if (qxCat != null && qxCat > 0){
  452. // 添加cat
  453. UserOrderRecord giftRecord = UserOrderRecord.builder()
  454. .orderId(order.getId())
  455. .userId(order.getUserId())
  456. .productType(ProductType.SERVICE.key)
  457. .service(ServiceKey.QX_CAT.key)
  458. .source(RecordSource.GIFT_COURSE.key)
  459. .build();
  460. callback.callback(order, giftRecord);
  461. userOrderRecordService.add(giftRecord);
  462. }
  463. Integer textbook = gift.getInteger(ServiceKey.TEXTBOOK.key);
  464. if (textbook != null && textbook > 0){
  465. // 添加text
  466. UserOrderRecord giftRecord = UserOrderRecord.builder()
  467. .orderId(order.getId())
  468. .userId(order.getUserId())
  469. .productType(ProductType.SERVICE.key)
  470. .service(ServiceKey.TEXTBOOK.key)
  471. .source(RecordSource.GIFT_COURSE.key)
  472. .build();
  473. callback.callback(order, giftRecord);
  474. userOrderRecordService.add(giftRecord);
  475. }
  476. String vip = gift.getString(ServiceKey.VIP.key);
  477. ServiceVipKey vipKey = ServiceVipKey.ValueOf(vip);
  478. if (vipKey != null){
  479. // 添加vip,并开通
  480. UserOrderRecord giftRecord = UserOrderRecord.builder()
  481. .orderId(order.getId())
  482. .userId(order.getUserId())
  483. .productType(ProductType.SERVICE.key)
  484. .service(ServiceKey.VIP.key)
  485. .param(vipKey.key)
  486. .source(RecordSource.GIFT_COURSE.key)
  487. .build();
  488. callback.callback(order, giftRecord);
  489. userOrderRecordService.add(giftRecord);
  490. }
  491. return record;
  492. }));
  493. initRecordCallback.put(ProductType.DATA, ((order, record)->{
  494. // 资料无需开启,也没有有效期
  495. record.setIsUsed(1);
  496. record.setIsSubscribe(1);
  497. Date time = new Date();
  498. record.setUseTime(time);
  499. // 电子资料自动订阅
  500. UserCourseDataSubscribe subscribe = userCourseDataSubscribeService.getByData(record.getUserId(), record.getProductId());
  501. if (subscribe == null){
  502. userCourseDataSubscribeService.add(UserCourseDataSubscribe.builder()
  503. .userId(record.getUserId())
  504. .dataId(record.getProductId())
  505. .build());
  506. }
  507. // 记录销售数量
  508. courseDataService.accumulation(record.getProductId(), 1, 0);
  509. return record;
  510. }));
  511. initRecordCallback.put(ProductType.SERVICE, ((order, record)->{
  512. if(record.getService().equals(ServiceKey.VIP.key)){
  513. // VIP直接开通
  514. record = useRecordCallback.get(ProductType.SERVICE).callback(record);
  515. record.setProductType(ProductType.SERVICE.key);
  516. }else{
  517. ServiceKey serviceKey = ServiceKey.ValueOf(record.getService());
  518. Date startTime = new Date();
  519. Date endTime = Tools.addMonth(startTime, record.getExpireDays());
  520. record.setStartTime(startTime);
  521. record.setEndTime(endTime);
  522. // 如果使用半价优惠券,则扣除
  523. if (serviceKey == ServiceKey.TEXTBOOK){
  524. User user = usersService.get(record.getUserId());
  525. if (user.getTextbookHalf() == 0) {
  526. // todo 支付存在问题
  527. }
  528. usersService.edit(User.builder().id(user.getId()).textbookHalf(user.getTextbookHalf() - 1).build());
  529. }
  530. }
  531. return record;
  532. }));
  533. useRecordCallback.put(ProductType.COURSE, (record->{
  534. record.setIsUsed(1);
  535. Date time = new Date();
  536. record.setUseTime(time);
  537. Course course = courseService.get(record.getProductId());
  538. Integer expireDay = record.getUseExpireDays();
  539. if (course.getCourseModule().equals(CourseModule.ONLINE.key)){
  540. // 小班课程,无需更新有效时间
  541. return record;
  542. }
  543. Date startTime = time;
  544. Date endTime = null;
  545. if(expireDay > 0){
  546. // 设置结束有效期
  547. endTime = Tools.addDate(startTime, expireDay);
  548. }
  549. if (course.getCourseModule().equals(CourseModule.VIDEO.key)){
  550. UserCourse userCourse = userCourseService.getCourseBase(record.getUserId(), record.getProductId());
  551. if(userCourse == null){
  552. userCourse = UserCourse.builder()
  553. .userId(record.getUserId())
  554. .courseId(course.getId())
  555. .recordId(record.getId())
  556. .startTime(startTime)
  557. .expireTime(endTime)
  558. .build();
  559. userCourse = userCourseService.add(userCourse);
  560. }else{
  561. if (userCourse.getExpireTime().before(time)){
  562. // 已到期 - 续期
  563. userCourse.setStartTime(startTime);
  564. userCourse.setExpireTime(endTime);
  565. userCourse.setRecordId(record.getId());
  566. }else{
  567. // 未到期 - 报错
  568. throw new ParameterException("已开通当前课程");
  569. }
  570. userCourse = userCourseService.edit(userCourse);
  571. }
  572. }
  573. record.setUseStartTime(startTime);
  574. if (endTime!=null )record.setUseEndTime(endTime);
  575. return record;
  576. }));
  577. useRecordCallback.put(ProductType.COURSE_PACKAGE, (record->{
  578. // miss
  579. throw new ParameterException("套餐无需开通");
  580. }));
  581. useRecordCallback.put(ProductType.DATA, (record->{
  582. // miss
  583. throw new ParameterException("资料无需开通");
  584. }));
  585. useRecordCallback.put(ProductType.SERVICE, (record->{
  586. record.setIsUsed(1);
  587. Date time = new Date();
  588. record.setUseTime(time);
  589. ServiceKey serviceKey = ServiceKey.ValueOf(record.getService());
  590. Integer expireDay = record.getUseExpireDays();
  591. Date startTime = time;
  592. Date endTime = null;
  593. if(expireDay > 0){
  594. // 设置结束有效期
  595. endTime = Tools.addDate(startTime, expireDay);
  596. }
  597. UserService userService = userServiceService.getServiceBase(record.getUserId(), serviceKey);
  598. if (userService == null){
  599. userService = UserService.builder()
  600. .userId(record.getUserId())
  601. .service(serviceKey.key)
  602. .isSubscribe(record.getIsSubscribe())
  603. .isReset(0)
  604. .startTime(startTime)
  605. .expireTime(endTime)
  606. .build();
  607. userService = userServiceService.add(userService);
  608. }else{
  609. if (serviceKey == ServiceKey.QX_CAT){
  610. // cat逻辑独立
  611. if (userService.getExpireTime().after(time)){
  612. // 有效期内
  613. if (userService.getIsReset() == 0) throw new ParameterException("已开通当前服务");
  614. // 第二次还未做完
  615. if (userService.getIsReset() == 1 && examinationService.isFinishCat(record.getUserId())) throw new ParameterException("已开通当前服务");
  616. }
  617. // 重置
  618. examinationService.resetCat(record.getUserId(), true);
  619. userService.setIsReset(0);
  620. }else if (userService.getExpireTime() != null && userService.getExpireTime().before(time)){
  621. // 已到期 - 续期
  622. userService.setStartTime(startTime);
  623. userService.setExpireTime(endTime);
  624. }else{
  625. // 未到期 - 延长有效期
  626. startTime = userService.getExpireTime();
  627. if (expireDay > 0){
  628. endTime = Tools.addDate(userService.getExpireTime(), expireDay);
  629. userService.setExpireTime(endTime);
  630. }
  631. }
  632. userService.setIsSubscribe(record.getIsSubscribe());
  633. userService = userServiceService.edit(userService);
  634. }
  635. if (serviceKey == ServiceKey.TEXTBOOK){
  636. // // 自动报名: 使用机经的后10天所在月份
  637. // textbookService.enroll(record.getUserId(), Tools.addDate(new Date(), 10));
  638. // 重置机经页面tips
  639. usersService.edit(User.builder().id(record.getUserId()).textbookTips(0).build());
  640. }
  641. record.setUseStartTime(startTime);
  642. if (endTime!=null )record.setUseEndTime(endTime);
  643. return record;
  644. }));
  645. stopRecordCallback.put(ProductType.COURSE, (record->{
  646. record.setIsStop(1);
  647. if (record.getIsUsed() == 0) return record;
  648. if (record.getUseEndTime().before(new Date())) return record;
  649. UserCourse userCourse = userCourseService.getCourseBase(record.getUserId(), record.getProductId());
  650. if(userCourse != null){
  651. userCourse.setExpireTime(new Date());
  652. userCourse = userCourseService.edit(userCourse);
  653. }
  654. return record;
  655. }));
  656. stopRecordCallback.put(ProductType.COURSE_PACKAGE, (record->{
  657. // miss
  658. throw new ParameterException("套餐无需停用");
  659. }));
  660. stopRecordCallback.put(ProductType.DATA, (record->{
  661. // 停用后无法查看
  662. record.setIsStop(1);
  663. return record;
  664. }));
  665. stopRecordCallback.put(ProductType.SERVICE, (record->{
  666. record.setIsStop(1);
  667. if (record.getIsUsed() == 0) return record;
  668. if (record.getUseEndTime().before(new Date())) return record;
  669. ServiceKey serviceKey = ServiceKey.ValueOf(record.getService());
  670. UserService userService = userServiceService.getServiceBase(record.getUserId(), serviceKey);
  671. if (userService != null){
  672. userService.setExpireTime(new Date());
  673. userService = userServiceService.edit(userService);
  674. }
  675. return record;
  676. }));
  677. }
  678. /**
  679. * 完成订单支付
  680. * @param orderId
  681. * @param userId
  682. * @param payTime
  683. * @param payMethod
  684. * @return
  685. */
  686. @Transactional
  687. public boolean payed(Integer orderId, Integer userId, Long payId, Date payTime, PayMethod payMethod, String transactionNo){
  688. UserOrder userOrder = userOrderService.get(orderId);
  689. if (userOrder == null) return false;
  690. if (userOrder.getPayStatus() > 0) return false;
  691. userOrderService.edit(UserOrder.builder()
  692. .id(userOrder.getId())
  693. .payId(payId)
  694. .payMethod(payMethod.key)
  695. .payTime(payTime)
  696. .transactionNo(transactionNo)
  697. .payStatus(1)
  698. .build());
  699. userOrder.setPayId(payId);
  700. userOrder.setPayMethod(payMethod.key);
  701. userOrder.setPayTime(payTime);
  702. userOrder.setTransactionNo(transactionNo);
  703. userOrder.setPayStatus(1);
  704. // 转换购物车记录为购买记录
  705. List<UserOrderCheckout> checkoutList = userOrderCheckoutService.allByUser(userId, orderId);
  706. List<UserOrderCheckout> pList = checkoutList.stream().filter((checkout)-> checkout.getParentId() == 0).collect(Collectors.toList());
  707. List<UserOrderCheckout> cList = checkoutList.stream().filter((checkout)-> checkout.getParentId() > 0).collect(Collectors.toList());
  708. Map<Integer, Integer> pMap = new HashMap<>();
  709. for(UserOrderCheckout checkout : pList){
  710. UserOrderRecord record = Transform.convert(checkout, UserOrderRecord.class);
  711. record.setSource(RecordSource.FromPayModule(payMethod).key);
  712. InitRecord callback = initRecordCallback.get(ProductType.ValueOf(record.getProductType()));
  713. callback.callback(userOrder, record);
  714. record = userOrderRecordService.add(record);
  715. // 建立新旧id关系
  716. pMap.put(checkout.getId(), record.getId());
  717. }
  718. for(UserOrderCheckout checkout : cList){
  719. UserOrderRecord record = Transform.convert(checkout, UserOrderRecord.class);
  720. // 记录parentid
  721. record.setParentId(pMap.get(checkout.getParentId()));
  722. record.setSource(RecordSource.FromPayModule(payMethod).key);
  723. InitRecord callback = initRecordCallback.get(ProductType.ValueOf(record.getProductType()));
  724. callback.callback(userOrder, record);
  725. userOrderRecordService.add(record);
  726. }
  727. JSONArray gift = userOrder.getGift();
  728. if (gift != null){
  729. for(Object infoO : gift){
  730. JSONObject info = (JSONObject)infoO;
  731. if(info.get("key").equals("vs")){
  732. // 添加赠送课时
  733. Integer courseId = info.getInteger("courseId");
  734. if(courseId != null){
  735. UserOrderRecord record = UserOrderRecord.builder()
  736. .orderId(userOrder.getId())
  737. .userId(userOrder.getUserId())
  738. // 赠品不出现在订单详细列表中
  739. .parentId(Integer.MAX_VALUE)
  740. .productType(ProductType.COURSE.key)
  741. .productId(courseId)
  742. .number(info.getIntValue("number"))
  743. .source(RecordSource.GIFT_COURSE.key)
  744. .build();
  745. InitRecord callback = initRecordCallback.get(ProductType.ValueOf(record.getProductType()));
  746. callback.callback(userOrder, record);
  747. userOrderRecordService.add(record);
  748. }
  749. }
  750. }
  751. }
  752. userOrderCheckoutService.deleteByUser(userId, orderId);
  753. // 累加用户支付信息
  754. usersService.accumulation(userOrder.getUserId(), userOrder.getMoney());
  755. // 发送通知
  756. User user = usersService.get(userId);
  757. if (user.getIsCourse() == 0 && userOrder.getProductTypes().contains(ProductType.COURSE.key)){
  758. // 设定标志
  759. usersService.edit(User.builder().id(userOrder.getUserId()).isCourse(1).build());
  760. }
  761. List<UserOrderRecord> recordList = userOrderRecordService.allByUser(user.getId(), userOrder.getId());
  762. messageExtendService.sendPayed(user, userOrder, recordList);
  763. return true;
  764. }
  765. /**
  766. * 添加购物车
  767. * @param userId
  768. * @param checkout
  769. * @return
  770. */
  771. @Transactional
  772. public int addCheckout(Integer userId, UserOrderCheckout checkout){
  773. List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(userId, 0);
  774. InitCheckout callback = initCheckoutCallback.get(ProductType.ValueOf(checkout.getProductType()));
  775. checkout = callback.callback(checkout, list);
  776. if (checkout == null) {
  777. // 无需操作
  778. }else if(checkout.getId() != null && checkout.getId() > 0){
  779. userOrderCheckoutService.edit(checkout);
  780. }else{
  781. userOrderCheckoutService.add(checkout);
  782. }
  783. // 计算购物车数量
  784. return userOrderCheckoutService.allByUser(userId, 0).size();
  785. }
  786. /**
  787. * 修改购物车
  788. * @param userId
  789. * @param checkout
  790. * @return
  791. */
  792. @Transactional
  793. public int changeCheckout(Integer userId, UserOrderCheckout checkout){
  794. UserOrderCheckout in = userOrderCheckoutService.get(checkout.getId());
  795. ChangeCheckout callback = changeCheckoutCallback.get(ProductType.ValueOf(in.getProductType()));
  796. if (callback == null){
  797. throw new ParameterException("无法修改记录");
  798. }
  799. checkout = callback.callback(in, checkout);
  800. if (checkout == null){
  801. // 无需操作
  802. }else{
  803. userOrderCheckoutService.edit(checkout);
  804. }
  805. // 计算购物车数量
  806. return userOrderCheckoutService.allByUser(userId, 0).size();
  807. }
  808. /**
  809. * 删除购物车
  810. * @param checkoutId
  811. * @param userId
  812. * @return
  813. */
  814. @Transactional
  815. public int removeCheckout(Integer checkoutId, Integer userId){
  816. UserOrderCheckout in = userOrderCheckoutService.get(checkoutId);
  817. if (in == null){
  818. throw new ParameterException("记录不存在");
  819. }
  820. if (!in.getUserId().equals(userId)){
  821. throw new ParameterException("记录不存在");
  822. }
  823. if (in.getParentId() != null && in.getParentId() > 0){
  824. // 如果能删除子项目,要处理删除父项目,转移其他子项目
  825. throw new ParameterException("套餐内,不允许单独删除");
  826. }
  827. userOrderCheckoutService.delete(checkoutId);
  828. List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(userId, 0);
  829. // 删除子项目
  830. for(UserOrderCheckout checkout: list){
  831. if (checkout.getParentId()==null || checkout.getParentId() == 0) continue;
  832. if (checkout.getParentId().equals(in.getId())){
  833. userOrderCheckoutService.delete(checkout.getId());
  834. }
  835. }
  836. RemoveCheckout callback = removeCheckoutCallback.get(ProductType.ValueOf(in.getProductType()));
  837. callback.callback(in, list);
  838. // 计算购物车数量
  839. return userOrderCheckoutService.allByUser(userId, 0).size();
  840. }
  841. /**
  842. * 根据购物车生成对应订单信息
  843. * @param list
  844. * @return
  845. */
  846. public UserOrder preOrderWithCheckout(Integer userId, List<UserOrderCheckout> list){
  847. UserOrder order = UserOrder.builder()
  848. .userId(userId)
  849. .originMoney(BigDecimal.valueOf(0))
  850. .money(BigDecimal.valueOf(0))
  851. .build();
  852. // 记录订单优惠
  853. JSONArray promote = new JSONArray();
  854. order.setPromote(promote);
  855. // 记录订单类型
  856. JSONArray productTypes = new JSONArray();
  857. order.setProductTypes(productTypes);
  858. // 记录赠品信息
  859. JSONArray gift = new JSONArray();
  860. order.setGift(gift);
  861. InitOrder callback;
  862. // 课程: 并包含套餐
  863. List<UserOrderCheckout> courseCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key) || checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
  864. if(courseCheckout.size() > 0){
  865. callback = initOrderCallback.get(ProductType.COURSE);
  866. callback.callback(order, courseCheckout);
  867. productTypes.add(ProductType.COURSE.key);
  868. }
  869. // 资料
  870. List<UserOrderCheckout> dataCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
  871. if (dataCheckout.size() > 0){
  872. callback = initOrderCallback.get(ProductType.DATA);
  873. callback.callback(order, dataCheckout);
  874. productTypes.add(ProductType.DATA.key);
  875. }
  876. // 服务
  877. List<UserOrderCheckout> serviceCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
  878. if(serviceCheckout.size() > 0){
  879. callback = initOrderCallback.get(ProductType.SERVICE);
  880. callback.callback(order, serviceCheckout);
  881. productTypes.add(ProductType.SERVICE.key);
  882. }
  883. return order;
  884. }
  885. /**
  886. * 支付购物车
  887. * @param userId
  888. * @return
  889. */
  890. @Transactional
  891. public UserOrder makeOrder(Integer userId, Integer courseId){
  892. List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(userId, 0);
  893. UserOrder order = preOrderWithCheckout(userId, list);
  894. // 保存课程赠送选择: 付款后添加
  895. JSONArray gift = order.getGift();
  896. for(Object infoO:gift){
  897. JSONObject info = (JSONObject)infoO;
  898. if(info.getString("key").equals("vs")){
  899. info.put("courseId", courseId);
  900. }
  901. }
  902. order = userOrderService.add(order);
  903. // 转移购物车信息
  904. userOrderCheckoutService.changeByUser(userId, 0, UserOrderCheckout.builder().orderId(order.getId()).build());
  905. return order;
  906. }
  907. /**
  908. * 立即购买
  909. * @param userId
  910. * @param checkout
  911. * @return
  912. */
  913. @Transactional
  914. public UserOrder makeOrderWithSpeed(Integer userId, UserOrderCheckout checkout){
  915. List<UserOrderCheckout> list = new ArrayList<>();
  916. checkout.setUserId(userId);
  917. InitCheckout callback = initCheckoutCallback.get(ProductType.ValueOf(checkout.getProductType()));
  918. checkout = callback.callback(checkout, list);
  919. if (checkout == null){
  920. throw new ParameterException("创建失败");
  921. }
  922. list.add(checkout);
  923. UserOrder order = preOrderWithCheckout(userId, list);
  924. order.setIsSpeed(1);
  925. order = userOrderService.add(order);
  926. checkout.setOrderId(order.getId());
  927. if(checkout.getId() != null && checkout.getId() > 0){
  928. userOrderCheckoutService.edit(checkout);
  929. }else{
  930. userOrderCheckoutService.add(checkout);
  931. }
  932. return order;
  933. }
  934. /**
  935. * 后台直接添加记录
  936. * @param record
  937. * @return
  938. */
  939. @Transactional
  940. public UserOrderRecord addRecord(UserOrderRecord record){
  941. if (record.getExpireDays() == null) record.setExpireDays(0);
  942. if (record.getUseExpireDays() == null) record.setUseExpireDays(0);
  943. InitRecord callback = initRecordCallback.get(ProductType.ValueOf(record.getProductType()));
  944. // 虚拟order
  945. callback.callback(UserOrder.builder().build(), record);
  946. return userOrderRecordService.add(record);
  947. }
  948. /**
  949. * 开通记录
  950. * @param userId
  951. * @param recordId
  952. * @return
  953. */
  954. @Transactional
  955. public UserOrderRecord useRecord(Integer userId, Integer recordId){
  956. UserOrderRecord in = userOrderRecordService.get(recordId);
  957. if (in == null){
  958. throw new ParameterException("记录不存在");
  959. }
  960. if (!in.getUserId().equals(userId)){
  961. throw new ParameterException("记录不存在");
  962. }
  963. UseRecord callback = useRecordCallback.get(ProductType.ValueOf(in.getProductType()));
  964. callback.callback(in);
  965. return in;
  966. }
  967. public void stopRecord(Integer recordId){
  968. UserOrderRecord in = userOrderRecordService.get(recordId);
  969. if (in == null){
  970. throw new ParameterException("记录不存在");
  971. }
  972. if (in.getIsStop()> 0){
  973. throw new ParameterException("已停用");
  974. }
  975. UseRecord callback = useRecordCallback.get(ProductType.ValueOf(in.getProductType()));
  976. callback.callback(in);
  977. }
  978. /**
  979. * 给用户邀请奖励: 7天vip
  980. * @param user
  981. */
  982. public void giveInvite(User user){
  983. UserOrderRecord record = UserOrderRecord.builder()
  984. .userId(user.getId())
  985. .productType(ProductType.SERVICE.key)
  986. .service(ServiceKey.VIP.key)
  987. .param(ServiceVipKey.DAY7.key)
  988. .source(RecordSource.INVITE.key)
  989. .expireDays(0)
  990. .useExpireDays(ServiceVipKey.DAY7.useExpireDay)
  991. .build();
  992. // 虚拟order
  993. record = initRecordCallback.get(ProductType.SERVICE).callback(UserOrder.builder().build(), record);
  994. userOrderRecordService.add(record);
  995. messageExtendService.sendInviteSuccess(user, record);
  996. }
  997. /**
  998. * 给用户备考奖励: 7天vip
  999. * @param user
  1000. */
  1001. public void givePrepare(User user){
  1002. UserOrderRecord record = UserOrderRecord.builder()
  1003. .userId(user.getId())
  1004. .productType(ProductType.SERVICE.key)
  1005. .service(ServiceKey.VIP.key)
  1006. .param(ServiceVipKey.DAY7.key)
  1007. .source(RecordSource.PREPARE.key)
  1008. .expireDays(0)
  1009. .useExpireDays(ServiceVipKey.DAY7.useExpireDay)
  1010. .build();
  1011. // 虚拟order
  1012. record = initRecordCallback.get(ProductType.SERVICE).callback(UserOrder.builder().build(), record);
  1013. userOrderRecordService.add(record);
  1014. messageExtendService.sendPrepare(user, record);
  1015. }
  1016. /**
  1017. * 给用户实名认证奖励: 180天vip
  1018. * @param user
  1019. */
  1020. public void giveReal(User user){
  1021. UserOrderRecord record = UserOrderRecord.builder()
  1022. .userId(user.getId())
  1023. .productType(ProductType.SERVICE.key)
  1024. .service(ServiceKey.VIP.key)
  1025. .param(ServiceVipKey.MONTH3.key)
  1026. .source(RecordSource.REAL.key)
  1027. .expireDays(0)
  1028. .useExpireDays(ServiceVipKey.MONTH3.useExpireDay)
  1029. .build();
  1030. // 虚拟order
  1031. record = initRecordCallback.get(ProductType.SERVICE).callback(UserOrder.builder().build(), record);
  1032. userOrderRecordService.add(record);
  1033. messageExtendService.sendReal(user, record);
  1034. }
  1035. /**
  1036. * 反馈奖励:7天vip
  1037. * @param userId
  1038. */
  1039. public UserOrderRecord giveAction(Integer userId){
  1040. UserOrderRecord record = UserOrderRecord.builder()
  1041. .userId(userId)
  1042. .productType(ProductType.SERVICE.key)
  1043. .service(ServiceKey.VIP.key)
  1044. .param(ServiceVipKey.DAY7.key)
  1045. .source(RecordSource.GIFT_ACTION.key)
  1046. .expireDays(0)
  1047. .useExpireDays(ServiceVipKey.DAY7.useExpireDay)
  1048. .build();
  1049. // 虚拟order
  1050. record = initRecordCallback.get(ProductType.SERVICE).callback(UserOrder.builder().build(), record);
  1051. userOrderRecordService.add(record);
  1052. return record;
  1053. }
  1054. }