package com.cyksj.web.controller.manage; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.support.ExcelTypeEnum; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cyksj.common.annotation.Log; import com.cyksj.common.annotation.NoSubmit; import com.cyksj.common.constant.Constant; import com.cyksj.common.exception.BusinessRuntimeException; import com.cyksj.common.util.StringUtil; import com.cyksj.dto.Result; import com.cyksj.enums.BusinessType; import com.cyksj.enums.GatewayResponse; import com.cyksj.mapper.OrderCommentMapper; import com.cyksj.mapper.RealGoodsInterestUserMapper; import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper; import com.cyksj.mapper.manage.coupon.CouponMapper; import com.cyksj.model.entity.*; import com.cyksj.model.excel.ExcelOrderDonData; import com.cyksj.model.excel.ExcelRealGoodsOrderData; import com.cyksj.model.excel.ExcelRealGoodsUserInterestData; import com.cyksj.model.excel.ExcelRealGoodsUserInterestHasPaymentData; import com.cyksj.model.manage.request.ReqSetLogisticsPost; import com.cyksj.model.manage.views.AccountView; import com.cyksj.model.manage.views.OrderDonView; import com.cyksj.model.request.RealGoodsServiceReq; import com.cyksj.model.request.UserRealGoodsInterestReq; import com.cyksj.model.views.*; import com.cyksj.service.mange.CmsOrderDonService; import com.cyksj.service.user.UserService; import com.cyksj.web.util.EasyExcelUtils; import com.ejlchina.searcher.BeanSearcher; import com.ejlchina.searcher.SearchResult; import com.ejlchina.searcher.param.Operator; import com.ejlchina.searcher.util.MapBuilder; import com.ejlchina.searcher.util.MapUtils; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * @author chan * @date 2021/10/12 下午11:05 */ @RequestMapping("/manage/order") @RestController @RequiredArgsConstructor public class CmsOrderController { private final HttpServletResponse response; private final HttpServletRequest request; private final CmsOrderDonService cmsOrderDonService; private final UserService userService; private final BeanSearcher beanSearcher; private final RealGoodsInterestUserMapper realGoodsInterestUserMapper; private final RealGoodsOrderHandleMapper realGoodsOrderHandleMapper; private final CouponMapper couponMapper; private final OrderCommentMapper orderCommentMapper; @GetMapping("/get") @SaCheckPermission("order:view") public Result> get() { SearchResult search = beanSearcher.search(OrderDonView.class, MapUtils.flatBuilder(request.getParameterMap()).build()); search.getDataList().forEach(data -> { if (data.getGoodsDonType() != null && Constant.realGoodsType.contains(data.getGoodsDonType())) { RealGoodsOrderHandle realGoodsOrderHandle = realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, data.getId()).last("limit 1")); if (realGoodsOrderHandle != null) { data.setBeforeServiceName(realGoodsOrderHandle.getBeforeServiceName()); data.setAfterServiceName(realGoodsOrderHandle.getAfterServiceName()); } } if (data.getCouponUserId() != 0) { data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId())); data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney()); } Optional.ofNullable(data.getGroupsId()).ifPresent(groupsId->{ AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGroupsId, groupsId).onlySelect(AccountView::getAccount).build()); Optional.ofNullable(accountView).ifPresent(account -> data.setGtAccount(account.getAccount())); }); }); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 用户退款订单列表 */ @GetMapping("/get/refund/list") public Result> getRefundOrderDonView() { SearchResult search = beanSearcher.search(RefundOrderDonView.class, MapUtils.flatBuilder(request.getParameterMap()) .build()); search.getDataList().forEach(data -> { Optional.ofNullable(userService.getById(data.getUserId())) .ifPresent(user -> data.setNickname(user.getNickname())); }); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 订单导出 */ @GetMapping("/export") @SaCheckPermission("order:export") @Log(module = "订单管理/导出订单", businessType = BusinessType.EXPORT, isSaveRequestData = true) public void exportOrders(HttpServletResponse response) { List list = beanSearcher.searchAll(ExcelOrderDonData.class, MapUtils.flatBuilder(request.getParameterMap()).build()); list.forEach(data -> { data.setMoney(data.getMoney().divide(BigDecimal.valueOf(100))); OrderDon.Type type = data.getType(); data.setTypeStr(type != null ? type.getDesc() : ""); OrderDon.Status status = data.getStatus(); data.setStatusStr(status != null ? status.getDesc() : ""); if (data.getChannelId() == null) { data.setChannel("自然流量渠道"); } if (data.getGoodsDonType() != null && Constant.realGoodsType.contains(data.getGoodsDonType())) { OrderDonTransportView transportView = beanSearcher.searchFirst(OrderDonTransportView.class, MapUtils.builder().field(OrderDonTransportView::getOrderId, data.getId()).build()); if (transportView != null) { data.setTransportStr(String.format("%s%s%s%s", transportView.getProvince(), transportView.getCity(), transportView.getDistrict(), transportView.getAddress())); data.setPhone(transportView.getPhone()); data.setReceiver(transportView.getReceiver()); data.setCodeCn(transportView.getCodeCn()); data.setTrackingNumber(transportView.getTrackingNumber()); } RealGoodsOrderHandle realGoodsOrderHandle = realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, data.getId()).last("limit 1")); if (realGoodsOrderHandle != null) { data.setBeforeServiceName(realGoodsOrderHandle.getBeforeServiceName()); data.setAfterServiceName(realGoodsOrderHandle.getAfterServiceName()); } } if (data.getCouponUserId() != 0) { data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId())); data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney().divide(BigDecimal.valueOf(100))); } }); EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelOrderDonData.class, list, "订单列表", "订单列表", ExcelTypeEnum.XLSX, null); } /** * 导出实物模板 订单excel */ @GetMapping("/export/realGoods") public void exportRealGoods(HttpServletResponse response) { List list = beanSearcher.searchAll(ExcelRealGoodsOrderData.class, MapUtils.flatBuilder(request.getParameterMap()) .field(ExcelOrderDonData::getGoodsDonType, Constant.realGoodsType).op(Operator.InList) .build()); list.forEach(data -> { data.setPayType("寄付现结"); if (data.getGoodsDonType() == Constant.realGoodsType.get(0)) { data.setRealGoodName("路由器"); } else if (data.getGoodsDonType() == Constant.realGoodsType.get(1)) { data.setRealGoodName("银河潮玩"); } }); EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelRealGoodsOrderData.class, list, "实物订单列表", "实物订单列表", ExcelTypeEnum.XLSX, null); } @PutMapping("/update/status") public Result upStatus(@RequestBody OrderDon orderDon){ cmsOrderDonService.update(Wrappers.lambdaUpdate(OrderDon.class).eq(OrderDon::getId,orderDon.getId()).set(OrderDon::getStatus,orderDon.getStatus())); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 编辑自定义订阅节点 */ @PutMapping("/update/subNode") public Result updateSubNode(@RequestBody OrderDon orderDon) { OrderDon en = cmsOrderDonService.getById(orderDon.getId()); if (en != null) { en.setSubNode(orderDon.getSubNode()); cmsOrderDonService.updateById(en); } return GatewayResponse.SUCCESS.newBuilder().toResult(); } @GetMapping("/get/transport/{orderId}") public Result getTransport(@PathVariable Long orderId){ // OrderDonTransport transport = cmsOrderDonService.getTransport(orderId); OrderDonTransportView transportView = beanSearcher.searchFirst(OrderDonTransportView.class, MapUtils.builder().field(OrderDonTransportView::getOrderId, orderId).build()); return GatewayResponse.SUCCESS.newBuilder().toResult(transportView); } @PostMapping("/post/setWaybill") public Result setWaybill(@RequestBody ReqSetLogisticsPost reqSetLogisticsPost){ OrderDonWaybill orderDonWaybill = cmsOrderDonService.setWaybill(reqSetLogisticsPost); return GatewayResponse.SUCCESS.newBuilder().toResult(orderDonWaybill); } /** * 用户购买实物商品意愿列表 */ @GetMapping("/get/realGooods/interest/users") @SaCheckPermission("interest:view") public Result getInterestUserList(RealGoodsInterestUser.Status interestStatus, HttpServletRequest request) { MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap()); SearchResult search; if (interestStatus == null) { builder.field(RealGoodsInterestUserView::getInterestStatus, "hasPayment").op(Operator.NotEqual); search = beanSearcher.search(RealGoodsInterestUserView.class, builder.build()); } else if (interestStatus != RealGoodsInterestUser.Status.hasPayment) { builder.field(RealGoodsInterestUserView::getInterestStatus, interestStatus.name()); search = beanSearcher.search(RealGoodsInterestUserView.class, builder.build()); } else { search = new SearchResult<>(); SearchResult search2 = beanSearcher.search(RealGoodsInterestUserHasPaymentView.class, builder.build()); search.setTotalCount(search2.getTotalCount()); List dataList = search.getDataList(); dataList.addAll(search2.getDataList()); } search.getDataList().forEach(data -> { Long goodsId = data.getGoodsId(); OrderDon order = cmsOrderDonService.getOne(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, data.getUserId()).eq(OrderDon::getGoodsId, goodsId).ne(OrderDon::getId, data.getId()).gt(OrderDon::getMoney, data.getMoney()).eq(OrderDon::getStatus, "close").last("limit 1")); if (order != null) { data.setOrderId(order.getId()); data.setSkuId(order.getSkuId()); data.setMoney(order.getMoney()); realGoodsInterestUserMapper.updateData(data.getId(), data.getSkuId(), data.getOrderCreatedTime(), data.getOrderId()); } }); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 修改订单状态 */ @PutMapping("/put/status/{orderId}") public Result updateOrderStatus(@PathVariable Long orderId) { OrderDon orderDon = cmsOrderDonService.getById(orderId); if (orderDon == null) { throw BusinessRuntimeException.getInstance("该订单不存在"); } if (orderDon.getStatus() == OrderDon.Status.complete) { throw BusinessRuntimeException.getInstance("该订单已是已完成状态"); } if (orderDon.getStatus() != OrderDon.Status.hasPayment) { throw BusinessRuntimeException.getInstance("该订单不是未支付状态"); } orderDon.setStatus(OrderDon.Status.complete); cmsOrderDonService.updateById(orderDon); return GatewayResponse.SUCCESS.newBuilder().toResult("修改订单状态成功"); } /** * 修改购买意愿记录 */ @PutMapping("/put/interest") public Result updateInterest(@RequestBody @Validated UserRealGoodsInterestReq req) { RealGoodsInterestUser realGoodsInterestUser = realGoodsInterestUserMapper.selectById(req.getId()); if (realGoodsInterestUser != null) { if (req.getStatus() != null) { realGoodsInterestUser.setInterestStatus(req.getStatus()); } if (req.getRemark() != null) { realGoodsInterestUser.setRemark(req.getRemark()); } realGoodsInterestUserMapper.updateById(realGoodsInterestUser); } return GatewayResponse.SUCCESS.newBuilder().toResult("修改成功"); } /** * 导出用户意愿列表 */ @GetMapping("/export/interest") public void exportInterest(RealGoodsInterestUser.Status interestStatus, HttpServletRequest request, HttpServletResponse response) { MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap()); List excelRealGoodsUserInterestData; if (interestStatus == null) { builder.field(RealGoodsInterestUserView::getInterestStatus, "hasPayment").op(Operator.NotEqual); excelRealGoodsUserInterestData = beanSearcher.searchAll(ExcelRealGoodsUserInterestData.class, builder.build()); } else { List excelRealGoodsUserInterestData2 = beanSearcher.searchAll(ExcelRealGoodsUserInterestHasPaymentData.class, builder.build()); excelRealGoodsUserInterestData = new ArrayList<>(excelRealGoodsUserInterestData2); } excelRealGoodsUserInterestData.forEach(data -> { Long goodsId = data.getGoodsId(); OrderDon order = cmsOrderDonService.getOne(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, data.getUserId()).eq(OrderDon::getGoodsId, goodsId).ne(OrderDon::getId, data.getId()).gt(OrderDon::getMoney, data.getMoney()).eq(OrderDon::getStatus, "close").last("limit 1")); if (order != null) { data.setOrderId(order.getId()); data.setSkuId(order.getSkuId()); data.setMoney(order.getMoney()); realGoodsInterestUserMapper.updateData(data.getId(), data.getSkuId(), data.getOrderCreatedTime(), data.getOrderId()); } data.setMoney(data.getMoney().divide(BigDecimal.valueOf(100))); }); EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelRealGoodsUserInterestHasPaymentData.class, excelRealGoodsUserInterestData, "用户意愿列表", "用户意愿列表", ExcelTypeEnum.XLSX, null); } /** * 实物订单配置售前售后客户 */ @PostMapping("/put/realGoods/service") @NoSubmit @Log(module = "订单管理/售前、售后客服", businessType = BusinessType.PUT, isSaveRequestData = true) public Result putRealGoodsService(@RequestBody @Validated RealGoodsServiceReq request) { OrderDon orderDon = cmsOrderDonService.getById(request.getOrderId()); if (orderDon == null || orderDon.getRelationId() != 0) { throw BusinessRuntimeException.getInstance("该订单不是实物订单"); } Boolean isBefore = false; Boolean isAfter = false; RealGoodsOrderHandle realGoodsOrderHandle = Optional.ofNullable(realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, request.getOrderId()).last("limit 1"))).orElse(new RealGoodsOrderHandle()); if (StringUtils.isNotBlank(request.getBeforeServiceName())) { realGoodsOrderHandle.setBeforeServiceName(request.getBeforeServiceName()); isBefore = true; } if (StringUtils.isNotBlank(request.getAfterServiceName())) { realGoodsOrderHandle.setAfterServiceName(request.getAfterServiceName()); isAfter = true; } if (realGoodsOrderHandle.getId() == null) { realGoodsOrderHandle.setOrderId(request.getOrderId()); realGoodsOrderHandleMapper.insert(realGoodsOrderHandle); } else { if (realGoodsOrderHandle.getBeforeOpNum() > 2) { throw BusinessRuntimeException.getInstance("售前客服已两次修改"); } if (realGoodsOrderHandle.getAfterOpNum() > 2) { throw BusinessRuntimeException.getInstance("售后客服已两次修改"); } if (isBefore) { realGoodsOrderHandle.setBeforeOpNum(realGoodsOrderHandle.getBeforeOpNum() + 1); } if (isAfter) { realGoodsOrderHandle.setAfterOpNum(realGoodsOrderHandle.getAfterOpNum() + 1); } realGoodsOrderHandleMapper.updateById(realGoodsOrderHandle); } return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功"); } /** * 新增平台评论 */ @PostMapping("/post/orderComment") public Result insertOrderComment(@RequestBody @Validated OrderComment orderComment) { if (StrUtil.isEmpty(orderComment.getHeadImgUrl())) { orderComment.setHeadImgUrl(Constant.DEFAULT_HEAD_IMG); } orderComment.setNickname(StringUtil.anonymity(orderComment.getNickname().toCharArray())); orderCommentMapper.insert(orderComment); return GatewayResponse.SUCCESS.newBuilder().toResult("新增成功"); } /** * 编辑平台评论 */ @PutMapping("/put/orderComment") public Result updateOrderComment(@RequestBody @Validated OrderComment orderComment) { orderCommentMapper.updateById(orderComment); return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功"); } /** * 删除平台评论 */ @DeleteMapping("/delete/orderComment/{id}") public Result deleteOrderCommentById(@PathVariable Long id) { orderCommentMapper.deleteById(id); return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功"); } /** * 平台评论列表 */ @GetMapping("/get/orderComment") public Result> getOrderCommentView() { SearchResult search = beanSearcher.search(OrderCommentView.class, MapUtils.flatBuilder(request.getParameterMap()).build()); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } }