package com.cyksj.web.controller.user; import cn.hutool.core.date.DateTime; import cn.hutool.core.util.StrUtil; 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.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.UserReq; import com.cyksj.model.request.WorkOrderReq; import com.cyksj.model.views.*; import com.cyksj.service.corp.CorpInteractiveReaderFrontService; import com.cyksj.service.corp.CropChatService; import com.cyksj.service.exchange.ExchangeCodeService; import com.cyksj.service.order.UserRealOrderBenefitsService; 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.param.Operator; 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 CouponUserMapper couponUserMapper; private final OrderDonMapper orderDonMapper; private final UserRealOrderBenefitsService userRealOrderBenefitsService; private final BeanSearcher beanSearcher; private final WorkOrderFrontService workOrderFrontService; private final HttpServletRequest request; private final CropChatService cropChatService; private final CorpInteractiveReaderFrontService corpInteractiveReaderFrontService; @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 userIds = userService.getRelationUserIdList(userId, null); Number ticketNum = beanSearcher.searchCount(UserTicketView.class, MapUtils.builder() .field(UserTicketView::getUserId, userIds).op(Operator.InList) .field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList) .build()); UserPersonalView personalView = new UserPersonalView(); DateTime now = DateTime.now(); //车票 personalView.setNumOfTickets(ticketNum.intValue()); //优惠券 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()); personalView.setBalance(user.getBalance()); 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); 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(UserWorkOrderView.class, MapUtils.flatBuilder(request.getParameterMap()) .field(UserWorkOrderView::getUserId, userId) .orderBy(UserWorkOrderView::getCreatedTime).desc() .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("/update/userInfo") public Result updateHeadImg(@RequestBody UserReq request) { long userId = StpUserUtil.getLoginIdAsLong(); User user = userService.getById(userId); if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID); Boolean isFlag = false; if (StrUtil.isNotBlank(request.getNickname())) { if (request.getNickname().length() > 32) { throw BusinessRuntimeException.getInstance("名称过长"); } user.setNickname(request.getNickname()); isFlag = true; } if (request.getSex() != null) { user.setSex(request.getSex()); isFlag = true; } if (StrUtil.isNotBlank(request.getHeadimgurl())) { user.setHeadimgurl(request.getHeadimgurl()); isFlag = true; } if (isFlag) { 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(); } /** * 查看用户所有余额 */ @GetMapping("/get/balance") public Result getUserBalance() { long userId = StpUserUtil.getLoginIdAsLong(); User user = userService.getOne(Wrappers.lambdaQuery(User.class) .eq(User::getId, userId) .select(User::getNickname, User::getBalance) .last("limit 1")); return GatewayResponse.SUCCESS.newBuilder().toResult(user); } /** * 获取群聊二维码 */ @GetMapping("/get/corp/ChatCode/{goodsId}") public Result getCorpChatCode(@PathVariable Long goodsId) throws Exception { long userId = StpUserUtil.getLoginIdAsLong(); //获取对应产品的企业微信客户群 String qrCode = cropChatService.getCropWxChatGroupByGoodsId(goodsId); return GatewayResponse.SUCCESS.newBuilder().toResult(qrCode); } /** * 获取奈飞客服活码弹窗 */ @GetMapping("/get/corp/serviceCode/{goodsId}") public Result getCorpServiceCode(@PathVariable Long goodsId) { long userId = StpUserUtil.getLoginIdAsLong(); String qrCode = cropChatService.getCorpServiceCode(goodsId); return GatewayResponse.SUCCESS.newBuilder().toResult(qrCode); } /** * 点击雷达链接 */ @PostMapping("/click/reader/{radarId}") public Result clickInteractiveReader(@PathVariable Long radarId) throws Exception { long userId = StpUserUtil.getLoginIdAsLong(); corpInteractiveReaderFrontService.clickReader(userId, radarId); return GatewayResponse.SUCCESS.newBuilder().toResult(); } }