package com.cyksj.web.controller.manage; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; 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.IoKit; import com.cyksj.common.util.Xmls; import com.cyksj.dto.Result; import com.cyksj.enums.BusinessType; import com.cyksj.enums.GatewayResponse; import com.cyksj.mapper.GoodsDonSkuMapper; import com.cyksj.mapper.GroupsRelationMapper; import com.cyksj.mapper.OrderCommentMapper; import com.cyksj.mapper.RealGoodsInterestUserMapper; import com.cyksj.mapper.channel.ChannelPopularizeMapper; 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.excel.merge.RealGoodsOrderLineStrategy; import com.cyksj.model.manage.request.ReqSetLogisticsPost; import com.cyksj.model.manage.views.AccountView; import com.cyksj.model.manage.views.OrderDonBackView; import com.cyksj.model.request.*; import com.cyksj.model.views.*; import com.cyksj.service.mange.CmsOrderDonService; import com.cyksj.service.order.OrderDonCommentService; 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 lombok.extern.slf4j.Slf4j; 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.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; /** * @author chan * @date 2021/10/12 下午11:05 */ @Slf4j @RequestMapping("/manage/order") @RestController @RequiredArgsConstructor public class CmsOrderController { 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; private final OrderDonCommentService orderDonCommentService; private final GoodsDonSkuMapper skuMapper; private final ChannelPopularizeMapper channelPopularizeMapper; private final GroupsRelationMapper relationMapper; @GetMapping("/get") @SaCheckPermission("order:view") public Result> get(Long channelId, String account, String showId, Long acId) { MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap()); if (channelId != null) { List popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId); builder.field(OrderDonBackView::getPopularizeId, popularizeIds).op(Operator.InList); } if (StrUtil.isNotBlank(account)) { GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class) .eq(GroupsRelation::getAccount, account).last("limit 1")); if (relation != null) { builder.field(OrderDonBackView::getRelationId, relation.getId()); } else { builder.field(OrderDonBackView::getRelationId).op(Operator.IsNull); } } if (StrUtil.isNotBlank(showId)) { builder.field(OrderDonBackView::getUserId, userService.getUserIdByShowId(showId)); } String conditionSql = StrUtil.EMPTY; if (acId != null) { conditionSql += String.format(" o.user_id in (select user_id from corp_user where ac_id = %s)", acId); } if (StrUtil.isNotBlank(conditionSql)) { builder.put("condition", conditionSql); } SearchResult search = beanSearcher.search(OrderDonBackView.class, builder.build()); search.getDataList().forEach(data -> { if (data.getPopularizeId() != null) { Optional.ofNullable(channelPopularizeMapper.selectChannelByPid(data.getPopularizeId())) .ifPresent(channelName -> data.setChannel(channelName)); } 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(relationMapper.selectById(data.getRelationId())) .ifPresent(relation -> { data.setAccount(relation.getAccount()); AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGroupsId, relation.getGroupsId()).onlySelect(AccountView::getAccount).build()); Optional.ofNullable(accountView).ifPresent(view -> data.setGtAccount(view.getAccount())); }); Optional.ofNullable(skuMapper.selectById(data.getSkuId())) .ifPresent(sku -> { data.setSpecVal(sku.getSpecVal()); data.setMonths(sku.getMonths()); data.setDays(sku.getDays()); }); }); 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) throws IOException { List list = beanSearcher.searchAll(ExcelRealGoodsOrderData.class, MapUtils.flatBuilder(request.getParameterMap()) .field(ExcelOrderDonData::getGoodsDonType, Constant.realGoodsType).op(Operator.InList) .build()); AtomicInteger index = new AtomicInteger(1); list.forEach(data -> { data.setPayType("寄付现结"); if (data.getGoodsDonType() == Constant.realGoodsType.get(0)) { data.setRealGoodName("路由器"); } else if (data.getGoodsDonType() == Constant.realGoodsType.get(1)) { data.setRealGoodName("银河潮玩"); } data.setIndex(index.getAndIncrement()); }); if (CollUtil.isEmpty(list)) { throw BusinessRuntimeException.getInstance("导出数据为空"); } response.setContentType("application/x-download"); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + new String("实物订单列表".getBytes("utf-8"), "ISO-8859-1") + ExcelTypeEnum.XLS.getValue()); EasyExcel.write(response.getOutputStream()) .head(ExcelRealGoodsOrderData.class) //设置合并单元格策略 .registerWriteHandler(new RealGoodsOrderLineStrategy()) .excelType(ExcelTypeEnum.XLS) .sheet("实物订单列表") //设置头部标题从那行开始 .relativeHeadRowIndex(2) .doWrite(list); } @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); } if (orderComment.getCommentTime() == null) { orderComment.setCommentTime(DateTime.now().toDateStr()); } orderComment.setVerifyStatus(OrderComment.VerifyStatus.success); orderCommentMapper.insert(orderComment); return GatewayResponse.SUCCESS.newBuilder().toResult("新增成功"); } /** * 编辑平台评论 */ @PutMapping("/put/orderComment") public Result updateOrderComment(@RequestBody @Validated OrderComment orderComment) { if (orderComment.getCommentTime() == null) { orderComment.setCommentTime(DateTime.now().toDateStr()); } if (orderComment.getVerifyStatus() == null) { orderComment.setVerifyStatus(OrderComment.VerifyStatus.success); } 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); } /** * 评论审核 */ @PutMapping("/put/orderComment/status") @NoSubmit public Result updateOrderCommentStatus(@RequestBody OrderComment orderCommentReq) throws Exception { orderDonCommentService.verifyCommentStatus(orderCommentReq.getId(), orderCommentReq.getVerifyStatus()); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 配置订单平台评价列表 */ @PostMapping("/post/orderComment/reward/config") public Result saveOrUpdateOrderCommentConfig(@RequestBody List configs) { orderDonCommentService.saveOrUpdateOrderCommentConfig(configs); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 获取配置 订单平台评价 */ @GetMapping("/get/orderComment/reward/config") public Result> getOrderCommentRewardConfig() { List views = beanSearcher.searchAll(OrderCommentRewardConfigView.class, MapUtils.builder() .orderBy(OrderCommentRewardConfigView::getGoodsId).desc() .build()); return GatewayResponse.SUCCESS.newBuilder().toResult(views); } /** * 踢出车队 */ @PutMapping("/kickOut") @NoSubmit public Result kickOut(@RequestBody @Validated ClickOutReq req) { long adminId = StpUtil.getLoginIdAsLong(); cmsOrderDonService.kickOutRelationId(adminId, req); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 踢出车队列表 */ @GetMapping("/get/kickOut/list") public Result> getKickOutList() { SearchResult search = beanSearcher.search(UserKickOutView.class, MapUtils.flatBuilder(request.getParameterMap()).build()); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 客服修改订单来源 */ @PutMapping("/update/order/source") public Result updateOrderSource(@RequestBody OrderDon orderDon) { Long id = orderDon.getId(); String labelSource = orderDon.getLabelSource(); cmsOrderDonService.update(null, Wrappers.lambdaUpdate(OrderDon.class) .set(OrderDon::getLabelSource, labelSource) .eq(OrderDon::getId, id)); realGoodsOrderHandleMapper.update(null, Wrappers.lambdaUpdate(RealGoodsOrderHandle.class) .set(RealGoodsOrderHandle::getLabelSource, labelSource) .eq(RealGoodsOrderHandle::getOrderId, id)); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 设置实物订单电视机类型 */ @PutMapping("/update/order/tvType") public Result updateOrderTvType(@RequestBody OrderDon orderDon) { Integer tvType = orderDon.getTvType(); Long id = orderDon.getId(); cmsOrderDonService.update(null, Wrappers.lambdaUpdate(OrderDon.class) .set(OrderDon::getTvType, tvType) .eq(OrderDon::getId, id)); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 订单统一退款 */ @PostMapping("/unified/refund") @Log(module = "订单管理/统一退款", businessType = BusinessType.PUT, isSaveRequestData = true) public Result unifiedRefund(@RequestBody @Validated OrderRefundReq refundReq) throws Exception { cmsOrderDonService.unifiedRefund(refundReq); return GatewayResponse.SUCCESS.newBuilder().toResult("退款成功"); } /** * 微信退款回调 */ @PostMapping("/wx/refund/notify") public void wxRefundNotify(HttpServletRequest request, HttpServletResponse response) throws Exception { String xml = IoKit.toString(request.getInputStream()); log.info("=== 退款成功的回调: \n {}", xml); // 解析xml Map map = Xmls.toMap(xml); // 退款失败 if (!StrUtil.equals("SUCCESS", map.get("return_code"))) { throw BusinessRuntimeException.getInstance("退款失败."); } cmsOrderDonService.wxRefundNotify(map); String toWechatXmlResponse = ""; OutputStream out = null; try { out = response.getOutputStream(); IoKit.write(toWechatXmlResponse, out); } catch (Throwable e) { throw BusinessRuntimeException.getInstance(e == null ? null : e.getMessage()); } finally { IoKit.close(out); } } /** * 更换用户车票 */ @PutMapping("/put/sameSpec/empty/relation") public Result changeRelation(@RequestBody @Validated ChangeRelationReq req) throws Exception { cmsOrderDonService.changeRelation(req); return GatewayResponse.SUCCESS.newBuilder().toResult(); } /** * 多余车位的空账号 */ @GetMapping("/get/sameSpec/empty/relation") public Result> getSameSpecEmptyRelation(Long skuId, Long groupsId, Long relationId, Boolean isNormal) { MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap()) .field(EmptyGroupsRelationView::getStatus, GroupsTrips.Status.down.name()).op(Operator.NotEqual) .field(EmptyGroupsRelationView::getSkuId, skuId).orderBy(EmptyGroupsRelationView::getAvailableNum) .desc(); Date expiryTime = null; if (relationId != null) { GroupsRelation relation = relationMapper.selectById(relationId); if (relation != null) expiryTime = relation.getExpiryTime(); } if (groupsId != null) { builder.field(EmptyGroupsRelationView::getGroupsId, groupsId).op(Operator.NotEqual); } if (isNormal != null && isNormal) { builder.put("account_id", String.format("gt.account_id not in (select account_id from work_order where sku_id = %s and account_id is not null)", skuId)); } if (expiryTime != null) { builder.field(AccountView::getExpiryTime, expiryTime).op(Operator.GreaterEqual); builder.orderBy(AccountView::getExpiryTime).asc(); } GoodsDonSku sku = skuMapper.selectById(skuId); if (!Constant.AI_goodsIds.contains(sku.getGoodsId())) { builder.field(EmptyGroupsRelationView::getAvailableNum, 0).op(Operator.GreaterThan); } SearchResult search = beanSearcher.search(EmptyGroupsRelationView.class, builder.build()); return GatewayResponse.SUCCESS.newBuilder().toResult(search); } /** * 订单补差价,补差价退款到余额 */ @PutMapping("/refund/price/differ") @Log(module = "订单管理/订单补差价", businessType = BusinessType.PUT, isSaveRequestData = true) public Result refundPriceDiffer(@RequestBody OrderRefundReq orderRefundReq) throws Exception { cmsOrderDonService.refundPriceDiffer(orderRefundReq); return GatewayResponse.SUCCESS.newBuilder().toResult(); } }