123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- package com.qxgmat.controller.api;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.github.pagehelper.Page;
- import com.nuliji.tools.PageMessage;
- import com.nuliji.tools.Response;
- import com.nuliji.tools.ResponseHelp;
- import com.nuliji.tools.Transform;
- import com.nuliji.tools.exception.ParameterException;
- import com.nuliji.tools.pay.data.PayResponseData;
- import com.qxgmat.data.constants.enums.ServiceKey;
- import com.qxgmat.data.constants.enums.SettingKey;
- import com.qxgmat.data.constants.enums.module.ProductType;
- import com.qxgmat.data.constants.enums.status.DirectionStatus;
- import com.qxgmat.data.constants.enums.trade.PayChannel;
- import com.qxgmat.data.constants.enums.trade.PayModule;
- import com.qxgmat.data.dao.entity.*;
- import com.qxgmat.dto.extend.CourseDataExtendDto;
- import com.qxgmat.dto.extend.CourseExtendDto;
- import com.qxgmat.dto.extend.CoursePackageExtendDto;
- import com.qxgmat.dto.extend.UserOrderRecordExtendDto;
- import com.qxgmat.dto.request.*;
- import com.qxgmat.dto.response.UserOrderDetailDto;
- import com.qxgmat.dto.response.UserOrderRecordListDto;
- import com.qxgmat.help.ShiroHelp;
- import com.qxgmat.service.extend.OrderFlowService;
- import com.qxgmat.service.extend.TradeService;
- import com.qxgmat.service.inline.*;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiOperation;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.MediaType;
- import org.springframework.validation.annotation.Validated;
- import org.springframework.web.bind.annotation.*;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- import java.math.BigDecimal;
- import java.util.*;
- import java.util.stream.Collectors;
- @RestController
- @RequestMapping("/api/order")
- @Api(tags = "订单接口", description = "订单相关接口", produces = MediaType.APPLICATION_JSON_VALUE)
- public class OrderController {
- @Autowired
- private ShiroHelp shiroHelp;
- @Autowired
- private SettingService settingService;
- @Autowired
- private TradeService tradeService;
- @Autowired
- private PayService payService;
- @Autowired
- private OrderFlowService orderFlowService;
- @Autowired
- private UserOrderService userOrderService;
- @Autowired
- private UserOrderRecordService userOrderRecordService;
- @Autowired
- private UserOrderCheckoutService userOrderCheckoutService;
- @Autowired
- private CourseService courseService;
- @Autowired
- private CoursePackageService coursePackageService;
- @Autowired
- private CourseDataService courseDataService;
- @Autowired
- private UserInvoiceService userInvoiceService;
- @RequestMapping(value = "/checkout/all", method = RequestMethod.GET)
- @ApiOperation(value = "全部购物车", notes = "全部购物车", httpMethod = "GET")
- public Response<UserOrderDetailDto> allCheckout(HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- //
- List<UserOrderCheckout> list = userOrderCheckoutService.allByUser(user.getId(), 0);
- UserOrder order = orderFlowService.preOrderWithCheckout(user.getId(), list);
- List<UserOrderRecordExtendDto> dtos = Transform.convert(list, UserOrderRecordExtendDto.class);
- return ResponseHelp.success(detail(user.getId(), order, dtos));
- }
- @RequestMapping(value = "/checkout/add", method = RequestMethod.POST)
- @ApiOperation(value = "添加购物车", notes = "添加购物车", httpMethod = "POST")
- public Response<Integer> addCheckout(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) {
- User user = (User) shiroHelp.getLoginUser();
- UserOrderCheckout checkout = Transform.dtoToEntity(dto);
- int number = orderFlowService.addCheckout(user.getId(), checkout);
- return ResponseHelp.success(number);
- }
- @RequestMapping(value = "/checkout/delete", method = RequestMethod.DELETE)
- @ApiOperation(value = "删除购物车", notes = "删除购物车", httpMethod = "DELETE")
- public Response<Integer> deleteCheckout(@RequestParam int checkoutId, HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- int number = orderFlowService.removeCheckout(checkoutId, user.getId());
- return ResponseHelp.success(number);
- }
- @RequestMapping(value = "/pay/confirm", method = RequestMethod.POST)
- @ApiOperation(value = "确认支付:创建订单", notes = "创建订单", httpMethod = "POST")
- public Response<UserOrderDetailDto> confirmPay(@RequestBody @Validated OrderConfirmDto dto, HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- UserOrder order = orderFlowService.makeOrder(user.getId(), dto.getCourseId());
- return ResponseHelp.success(detail(user.getId(), order, null));
- }
- @RequestMapping(value = "/pay/speed", method = RequestMethod.POST)
- @ApiOperation(value = "确认支付:单条记录创建订单", notes = "单条记录创建订单", httpMethod = "POST")
- public Response<UserOrderDetailDto> speedPay(@RequestBody @Validated RecordAddDto dto, HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- UserOrderCheckout checkout = Transform.dtoToEntity(dto);
- UserOrder order = orderFlowService.makeOrderWithSpeed(user.getId(), checkout);
- return ResponseHelp.success(detail(user.getId(), order, null));
- }
- @RequestMapping(value = "/pay/wechat_qr", method = RequestMethod.POST)
- @ApiOperation(value = "通过微信二维码支付", notes = "通过微信二维码支付", httpMethod = "POST")
- public Response<PayResponseData> wechatQr(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- UserOrder order = userOrderService.get(dto.getOrderId());
- if (order == null) {
- throw new ParameterException("订单不存在");
- }
- if (!order.getUserId().equals(user.getId())){
- throw new ParameterException("订单不存在");
- }
- PayResponseData data = tradeService.pay(user.getId(), "", "", PayModule.ORDER, order.getId(), BigDecimal.valueOf(0), PayChannel.WECHAT_QR, request);
- return ResponseHelp.success(data);
- }
- @RequestMapping(value = "/pay/wechat_js", method = RequestMethod.POST)
- @ApiOperation(value = "通过微信内支付", notes = "通过微信内支付", httpMethod = "POST")
- public Response<PayResponseData> wechatJs(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- UserOrder order = userOrderService.get(dto.getOrderId());
- if (order == null) {
- throw new ParameterException("订单不存在");
- }
- if (!order.getUserId().equals(user.getId())){
- throw new ParameterException("订单不存在");
- }
- PayResponseData data = tradeService.pay(user.getId(), "", "", PayModule.ORDER, order.getId(), BigDecimal.valueOf(0), PayChannel.WECHAT_JS, request);
- return ResponseHelp.success(data);
- }
- @RequestMapping(value = "/pay/alipay_qr", method = RequestMethod.POST)
- @ApiOperation(value = "通过支付宝二维码支付", notes = "通过支付宝二维码支付", httpMethod = "POST")
- public Response<PayResponseData> alipayQr(@RequestBody @Validated PayOrderDto dto, HttpServletRequest request) throws Exception {
- User user = (User) shiroHelp.getLoginUser();
- UserOrder order = userOrderService.get(dto.getOrderId());
- if (order == null) {
- throw new ParameterException("订单不存在");
- }
- if (!order.getUserId().equals(user.getId())){
- throw new ParameterException("订单不存在");
- }
- PayResponseData data = tradeService.pay(user.getId(), "", "", PayModule.ORDER, order.getId(), BigDecimal.valueOf(0), PayChannel.ALIPAY_QR, request);
- return ResponseHelp.success(data);
- }
- @RequestMapping(value = "/pay/query", method = RequestMethod.GET)
- @ApiOperation(value = "支付结果查询", notes = "支付结果查询", httpMethod = "GET")
- public Response<Boolean> response(
- @RequestParam(required = true, name="id") Long orderId
- ) {
- User user = (User) shiroHelp.getLoginUser();
- UserOrder order = userOrderService.get(orderId);
- if (order == null) {
- throw new ParameterException("订单不存在");
- }
- if (!order.getUserId().equals(user.getId())){
- throw new ParameterException("支付信息不存在");
- }
- return ResponseHelp.success(order.getPayStatus() > 0);
- }
- @RequestMapping(value = "/list", method = RequestMethod.GET)
- @ApiOperation(value = "获取订单列表", notes = "获取订单列表", httpMethod = "GET")
- public Response<PageMessage<UserOrderDetailDto>> listOrder(
- @RequestParam(required = false, defaultValue = "1") int page,
- @RequestParam(required = false, defaultValue = "100") int size,
- @RequestParam(required = false, defaultValue = "id") String order,
- @RequestParam(required = false, defaultValue = "desc") String direction,
- HttpSession session) {
- User user = (User) shiroHelp.getLoginUser();
- Page<UserOrder> p = userOrderService.list(page, size, user.getId(), order, DirectionStatus.ValueOf(direction));
- Map<Integer, UserOrder> map = new HashMap<>();
- List<UserOrderDetailDto> pr = Transform.convert(p, UserOrderDetailDto.class);
- Collection orderIds = Transform.getIds(p, UserOrder.class, "id");
- List<UserOrderRecord> recordList = userOrderRecordService.allByUser(user.getId(), orderIds).stream().filter(row->row.getParentId()==0).collect(Collectors.toList());
- List<UserOrderRecordListDto> records = Transform.convert(recordList, UserOrderRecordListDto.class);
- Map<Object, List<UserOrderRecordListDto>> recordMap = Transform.getMapList(records, UserOrderRecordListDto.class, "orderId");
- Transform.combine(pr, recordMap, UserOrderDetailDto.class, "id", "checkouts");
- // 绑定服务
- Map<Object, JSONObject> serviceList = new HashMap<Object, JSONObject>(){{
- Setting vipSetting = settingService.getByKey(SettingKey.SERVICE_VIP);
- put(ServiceKey.VIP.key, vipSetting.getValue());
- Setting textbookSetting = settingService.getByKey(SettingKey.SERVICE_TEXTBOOK);
- put(ServiceKey.TEXTBOOK.key, textbookSetting.getValue());
- Setting qxCatSetting = settingService.getByKey(SettingKey.SERVICE_QX_CAT);
- put(ServiceKey.QX_CAT.key, qxCatSetting.getValue());
- }};
- List<UserOrderRecordListDto> prService = records.stream().filter((row)-> row.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
- Transform.combine(prService, serviceList, UserOrderRecordListDto.class, "service", "serviceInfo");
- // 绑定课程
- List<UserOrderRecordListDto> prCourse = records.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
- Collection courseIds = Transform.getIds(prCourse, UserOrderRecordListDto.class, "productId");
- List<Course> courseList = courseService.select(courseIds);
- Transform.combine(prCourse, courseList, UserOrderRecordListDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
- // 绑定资料
- List<UserOrderRecordListDto> prData = records.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
- Collection dataIds = Transform.getIds(prData, UserOrderRecordListDto.class, "productId");
- List<CourseData> dataList = courseDataService.select(dataIds);
- Transform.combine(prData, dataList, UserOrderRecordListDto.class, "productId", "data", CourseData.class, "id", CourseDataExtendDto.class);
- // 绑定发票
- List<UserInvoice> userInvoiceList = userInvoiceService.listByOrder(user.getId(), orderIds);
- Map invoiceMap = Transform.getMap(userInvoiceList, UserInvoice.class, "orderId", "id");
- for(UserOrderDetailDto dto : pr){
- dto.setHasInvoice(invoiceMap.containsKey(dto.getId()));
- UserOrder userOrder = map.get(dto.getId());
- JSONArray value = userOrder.getProductTypes();
- if (value.contains(ProductType.COURSE.key)){
- dto.setCanInvoice(true);
- }
- }
- return ResponseHelp.success(pr, page, size, p.getTotal());
- }
- @RequestMapping(value = "/detail", method = RequestMethod.GET)
- @ApiOperation(value = "获取订单记录", notes = "获取订单记录", httpMethod = "GET")
- public Response<UserOrderDetailDto> getOrder(
- @RequestParam(required = true) Integer id
- ) {
- User user = (User) shiroHelp.getLoginUser();
- UserOrder order = userOrderService.get(id);
- if (!order.getUserId().equals(user.getId())){
- throw new ParameterException("记录不存在");
- }
- List<UserOrderRecord> list = userOrderRecordService.allByUser(user.getId(), id);
- List<UserOrderRecordExtendDto> dtos = Transform.convert(list, UserOrderRecordExtendDto.class);
- return ResponseHelp.success(detail(user.getId(), order, dtos));
- }
- @RequestMapping(value = "/record/list", method = RequestMethod.GET)
- @ApiOperation(value = "获取订单记录列表", notes = "获取订单记录列表", httpMethod = "GET")
- public Response<PageMessage<UserOrderRecordListDto>> listRecord(
- @RequestParam(required = false, defaultValue = "1") int page,
- @RequestParam(required = false, defaultValue = "100") int size,
- @RequestParam(required = false) String productType,
- @RequestParam(required = false) Integer productId,
- @RequestParam(required = false) String service,
- @RequestParam(required = false) Boolean isUsed,
- @RequestParam(required = false) Boolean isExpire,
- @RequestParam(required = false) Boolean filterChildren,
- @RequestParam(required = false, defaultValue = "id") String order,
- @RequestParam(required = false, defaultValue = "desc") String direction,
- HttpSession session) {
- User user = (User) shiroHelp.getLoginUser();
- Page<UserOrderRecord> p = userOrderRecordService.list(page, size, user.getId(), ProductType.ValueOf(productType), productId, ServiceKey.ValueOf(service), isUsed, isExpire, filterChildren, order, DirectionStatus.ValueOf(direction));
- List<UserOrderRecordListDto> pr = Transform.convert(p, UserOrderRecordListDto.class);
- // 绑定服务
- Map<Object, JSONObject> serviceList = new HashMap<Object, JSONObject>(){{
- Setting vipSetting = settingService.getByKey(SettingKey.SERVICE_VIP);
- put(ServiceKey.VIP.key, vipSetting.getValue());
- Setting textbookSetting = settingService.getByKey(SettingKey.SERVICE_TEXTBOOK);
- put(ServiceKey.TEXTBOOK.key, textbookSetting.getValue());
- Setting qxCatSetting = settingService.getByKey(SettingKey.SERVICE_QX_CAT);
- put(ServiceKey.QX_CAT.key, qxCatSetting.getValue());
- }};
- List<UserOrderRecordListDto> prService = pr.stream().filter((row)-> row.getProductType().equals(ProductType.SERVICE.key)).collect(Collectors.toList());
- Transform.combine(prService, serviceList, UserOrderRecordListDto.class, "service", "serviceInfo");
- // 绑定课程
- List<UserOrderRecordListDto> prCourse = pr.stream().filter((row)-> row.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
- Collection courseIds = Transform.getIds(prCourse, UserOrderRecordListDto.class, "productId");
- List<Course> courseList = courseService.select(courseIds);
- Transform.combine(prCourse, courseList, UserOrderRecordListDto.class, "productId", "course", Course.class, "id", CourseExtendDto.class);
- // 绑定资料
- List<UserOrderRecordListDto> prData = pr.stream().filter((row)-> row.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
- Collection dataIds = Transform.getIds(prData, UserOrderRecordListDto.class, "productId");
- List<CourseData> dataList = courseDataService.select(dataIds);
- Transform.combine(prData, dataList, UserOrderRecordListDto.class, "productId", "data", CourseData.class, "id", CourseDataExtendDto.class);
- return ResponseHelp.success(pr, page, size, p.getTotal());
- }
- @RequestMapping(value = "/record/detail", method = RequestMethod.GET)
- @ApiOperation(value = "获取订单记录详情", notes = "获取订单记录", httpMethod = "GET")
- public Response<UserOrderRecord> getOrderRecord(
- @RequestParam(required = true) Integer id
- ) {
- User user = (User) shiroHelp.getLoginUser();
- UserOrderRecord record = userOrderRecordService.get(id);
- if (!record.getUserId().equals(user.getId())){
- throw new ParameterException("记录不存在");
- }
- // todo
- return ResponseHelp.success(record);
- }
- @RequestMapping(value = "/record/use", method = RequestMethod.POST)
- @ApiOperation(value = "开通", notes = "开通", httpMethod = "POST")
- public Response<UserOrderRecord> useRecord(@RequestBody @Validated RecordUseDto dto) {
- User user = (User) shiroHelp.getLoginUser();
- UserOrderRecord record = orderFlowService.useRecord(user.getId(), dto.getRecordId());
- return ResponseHelp.success(record);
- }
- @RequestMapping(value = "/invoice/open", method = RequestMethod.POST)
- @ApiOperation(value = "申请发票", notes = "申请发票", httpMethod = "POST")
- public Response<Boolean> openInvoice(@RequestBody @Validated OrderInvoiceDto dto) {
- User user = (User) shiroHelp.getLoginUser();
- UserInvoice userInvoice = Transform.dtoToEntity(dto);
- UserInvoice in = userInvoiceService.getByOrder(user.getId(), userInvoice.getOrderId());
- if (in != null) {
- throw new ParameterException("该订单已开发票");
- }
- UserOrder order = userOrderService.get(userInvoice.getOrderId());
- JSONArray value = order.getProductTypes();
- if (!value.contains(ProductType.COURSE.key)){
- throw new ParameterException("该订单无法开发票");
- }
- userInvoice.setUserId(user.getId());
- userInvoiceService.add(userInvoice);
- return ResponseHelp.success(true);
- }
- /**
- * 统一处理订单以及完整购物车返回信息
- * @param userId
- * @param order
- * @param list
- * @return
- */
- public UserOrderDetailDto detail(Integer userId, UserOrder order, List<UserOrderRecordExtendDto> list) {
- UserOrderDetailDto dto = Transform.convert(order, UserOrderDetailDto.class);
- if (list == null){
- list = Transform.convert(userOrderCheckoutService.allByUser(userId, order.getId()), UserOrderRecordExtendDto.class);
- }
- dto.setCheckouts(list);
- // 获取所有课程信息
- List<UserOrderRecordExtendDto> courseCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE.key)).collect(Collectors.toList());
- Collection courseIds = Transform.getIds(courseCheckout, UserOrderRecordExtendDto.class, "productId");
- List<Course> courseList = courseService.select(courseIds);
- dto.setCourses(Transform.convert(courseList, CourseExtendDto.class));
- // 获取所有资料信息
- List<UserOrderRecordExtendDto> dataCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.DATA.key)).collect(Collectors.toList());
- Collection dataIds = Transform.getIds(dataCheckout, UserOrderRecordExtendDto.class, "productId");
- List<CourseData> dataList = courseDataService.select(dataIds);
- dto.setDatas(Transform.convert(dataList, CourseDataExtendDto.class));
- // 获取所有套餐信息
- List<UserOrderRecordExtendDto> packageCheckout = list.stream().filter((checkout)-> checkout.getProductType().equals(ProductType.COURSE_PACKAGE.key)).collect(Collectors.toList());
- Collection packageIds = Transform.getIds(packageCheckout, UserOrderRecordExtendDto.class, "productId");
- List<CoursePackage> packageList = coursePackageService.select(packageIds);
- dto.setPackages(Transform.convert(packageList, CoursePackageExtendDto.class));
- // 发票
- UserInvoice invoice = userInvoiceService.getByOrder(userId, order.getId());
- dto.setHasInvoice(invoice != null);
- if (courseCheckout.size() > 0){
- dto.setCanInvoice(true);
- }
- return dto;
- }
- }
|