package com.cyksj.web.controller.user; import cn.hutool.core.date.DateTime; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cyksj.common.annotation.NoSubmit; import com.cyksj.common.exception.BusinessRuntimeException; import com.cyksj.dto.Result; import com.cyksj.enums.GatewayApiCode; import com.cyksj.enums.GatewayResponse; import com.cyksj.mapper.OrderDonMapper; import com.cyksj.mapper.manage.coupon.CouponUserMapper; import com.cyksj.mapper.market.task.UserBindDetailMapper; import com.cyksj.model.dto.UserWhoami; import com.cyksj.model.entity.*; import com.cyksj.model.manage.views.GroupsRelationView; import com.cyksj.model.request.ExchangeCodeTicket; import com.cyksj.model.request.ReceiveBenefitsReq; import com.cyksj.model.request.WorkOrderReq; import com.cyksj.model.request.UserReq; import com.cyksj.model.views.RenewalView; import com.cyksj.model.views.UserAvailableGoodsTicketView; import com.cyksj.model.views.UserPersonalView; import com.cyksj.model.views.WorkOrderChatHistoryView; import com.cyksj.service.exchange.ExchangeCodeService; import com.cyksj.service.order.UserRealOrderBenefitsService; import com.cyksj.service.relation.GroupRelationFrontService; import com.cyksj.service.user.UserService; import com.cyksj.service.user.WorkOrderFrontService; import com.cyksj.web.util.StpUserUtil; import com.ejlchina.searcher.BeanSearcher; import com.ejlchina.searcher.SearchResult; import com.ejlchina.searcher.util.MapUtils; import lombok.RequiredArgsConstructor; import org.springframework.util.Assert; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; /** * @author chan * @date 2021/10/11 下午11:05 */ @RequestMapping("/applets/user") @RestController @RequiredArgsConstructor public class UserController { private final UserService userService; private final ExchangeCodeService exchangeCodeService; private final GroupRelationFrontService groupRelationFrontService; private final CouponUserMapper couponUserMapper; private final OrderDonMapper orderDonMapper; private final UserBindDetailMapper UserBindDetailMapper; private final UserRealOrderBenefitsService userRealOrderBenefitsService; private final BeanSearcher beanSearcher; private final WorkOrderFrontService workOrderFrontService; private final HttpServletRequest request; @GetMapping(value = "/wx/whoami") public Result whoami() { long userId = StpUserUtil.getLoginIdAsLong(); UserWhoami userWhoami = userService.whoami(userId); return GatewayResponse.SUCCESS.newBuilder().toResult(userWhoami); } /** * 兑换码兑换车票 */ @PostMapping("/get/ticket") public Result getTicketByExchangeCode(@RequestBody ExchangeCodeTicket exchangeCodeTicket) { Long userId = StpUserUtil.getLoginIdAsLong(); return exchangeCodeService.getTicketByExchangeCode(exchangeCodeTicket, userId); } /** * 个人中心详情 */ @GetMapping("/personal") public Result getPersonalView() { long userId = StpUserUtil.getLoginIdAsLong(); List ticket = groupRelationFrontService.getMyTicket(userId, false); UserPersonalView personalView = new UserPersonalView(); DateTime now = DateTime.now(); //车票 personalView.setNumOfTickets(ticket.size()); //优惠券 Integer couponSize = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class) .eq(CouponUser::getUserId, userId) .eq(CouponUser::getStatus, CouponUser.Status.unused) .le(CouponUser::getValidStartTime, now) .gt(CouponUser::getValidEndTime, now)); personalView.setNumOfCoupons(couponSize); //积分 User user = userService.getById(userId); personalView.setActivePoints(user.getActivePoints()); //推广积分 personalView.setPopularizePoints(user.getPoints()); OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class) .eq(OrderDon::getUserId, userId) .eq(OrderDon::getStatus, OrderDon.Status.noPayment).last("limit 1")); personalView.setIsNoPayment(orderDon != null ? true : false); UserBindDetail bindPhone = UserBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class) .eq(UserBindDetail::getUserId, userId).last("limit 1")); //手机号 if (bindPhone != null) { personalView.setPhone(bindPhone.getPhone()); } return GatewayResponse.SUCCESS.newBuilder().toResult(personalView); } /** * 用户已有实物权益 可选车票 */ @GetMapping("/get/available/benefits/tickets") public Result> getAvailableBenefitsTickets(Long orderId) { Long userId = StpUserUtil.getLoginIdAsLong(); List tickets = userRealOrderBenefitsService.getAvailableBenefitsTickets(userId, orderId); return GatewayResponse.SUCCESS.newBuilder().toResult(tickets); } /** * 用户领取实物权益 */ @PostMapping("/receive/benefits") public Result> receiveRealGoodsBenefits(@RequestBody List reqList) { List re = new ArrayList<>(); Long userId = StpUserUtil.getLoginIdAsLong(); reqList.forEach(req -> { Long benefitsId = req.getBenefitsId(), goodsId = req.getGoodsId(), skuId = req.getSkuId(), relationId = req.getRelationId(); Assert.notNull(benefitsId, "可获取的权益不存在"); Assert.notNull(goodsId, "请选择对应平台"); Assert.notNull(skuId, "请选择对应权益规格"); Assert.notNull(relationId, "请选择对应车票"); GroupsRelationView groupsRelationView = userRealOrderBenefitsService.receiveRealGoodsBenefits(userId, benefitsId, goodsId, skuId, relationId); re.add(groupsRelationView); }); return GatewayResponse.SUCCESS.newBuilder().toResult(re); } /** * 用户提交工单 */ @PostMapping("/workOrder/submit") @NoSubmit public Result submitWorkOrder(@RequestBody @Validated WorkOrderReq workOrderReq) { long userId = StpUserUtil.getLoginIdAsLong(); workOrderReq.setUserId(userId); workOrderFrontService.submitWorkOrder(workOrderReq); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 用户工单历史列表 */ @GetMapping("/workOrder/get") public Result> getWorkOrder() { long userId = StpUserUtil.getLoginIdAsLong(); SearchResult search = beanSearcher.search(WorkOrder.class, MapUtils.flatBuilder(request.getParameterMap()) .field(WorkOrder::getUserId, userId) .orderBy(WorkOrder::getId).desc() .onlySelect(WorkOrder::getId, WorkOrder::getTopic, WorkOrder::getStatus, WorkOrder::getCreatedTime) .build()); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 用户工单详情 */ @GetMapping("/workOrder/get/detail/{id}") public Result> getWorkOrderDetails(@PathVariable Long id) { long userId = StpUserUtil.getLoginIdAsLong(); SearchResult search = beanSearcher.search(WorkOrderChatHistoryView.class, MapUtils.builder() .field(WorkOrderChatHistoryView::getUserId, userId) .field(WorkOrderChatHistoryView::getWorkOrderId, id) .orderBy(WorkOrderChatHistoryView::getId).desc() .selectExclude(WorkOrderChatHistoryView::getReplyCustomerServiceId, WorkOrderChatHistoryView::getCustomer) .build()); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 工单状态查询 */ @GetMapping("/workOrder/get/status/{id}") public Result getWorkOrderStatus(@PathVariable Long id) { long userId = StpUserUtil.getLoginIdAsLong(); WorkOrder workOrder = beanSearcher.searchFirst(WorkOrder.class, MapUtils.builder() .field(WorkOrder::getUserId, userId) .field(WorkOrder::getId, id) .onlySelect(WorkOrder::getId, WorkOrder::getUserId, WorkOrder::getStatus) .build()); if (workOrder == null) { throw BusinessRuntimeException.getInstance("该工单不存在"); } return GatewayResponse.SUCCESS.newBuilder().toResult(workOrder); } /** * 用户回复客服 */ @PostMapping("/workOrder/reply") public Result userReplyWorkOrder(@RequestBody @Validated WorkOrderChatHistory history) { long userId = StpUserUtil.getLoginIdAsLong(); history.setUserId(userId); workOrderFrontService.replyCustomer(history); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 用户修改头像 */ @PutMapping("/put/headImg") public Result updateHeadImg(@RequestBody @Validated UserReq request) { long userId = StpUserUtil.getLoginIdAsLong(); User user = userService.getById(userId); if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID); user.setSex(request.getSex()); user.setHeadimgurl(request.getHeadImg()); userService.updateById(user); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 更新用户最后一次登录时间 */ @PutMapping("/update/lastTime") public Result updateLastTime() { long userId = StpUserUtil.getLoginIdAsLong(); User user = userService.getById(userId); if (user == null) { return GatewayResponse.SUCCESS.newBuilder().toResult(); } user.setLastTime(DateTime.now()); userService.updateById(user); return GatewayResponse.SUCCESS.newBuilder().toResult(); } }