|
@@ -0,0 +1,943 @@
|
|
|
|
+package com.gree.mall.contest.logic.order;
|
|
|
|
+
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
+import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
|
+import com.gree.mall.contest.bean.ExcelData;
|
|
|
|
+import com.gree.mall.contest.bean.admin.AdminUserCom;
|
|
|
|
+import com.gree.mall.contest.bean.order.BatchRemarkBean;
|
|
|
|
+import com.gree.mall.contest.bean.order.DeliverGoodsBean;
|
|
|
|
+import com.gree.mall.contest.bean.order.OrderDetailBean;
|
|
|
|
+import com.gree.mall.contest.bean.order.OrderDetailListBean;
|
|
|
|
+import com.gree.mall.contest.commonmapper.CoustomUserCouponMapper;
|
|
|
|
+import com.gree.mall.contest.commonmapper.CustomWebsitMapper;
|
|
|
|
+import com.gree.mall.contest.commonmapper.OrderMapper;
|
|
|
|
+import com.gree.mall.contest.constant.Constant;
|
|
|
|
+import com.gree.mall.contest.enums.OrderShareStatusEnum;
|
|
|
|
+import com.gree.mall.contest.enums.OrderStatusEnum;
|
|
|
|
+import com.gree.mall.contest.enums.RefundFlagEnum;
|
|
|
|
+import com.gree.mall.contest.exception.RemoteServiceException;
|
|
|
|
+import com.gree.mall.contest.logic.ExpressLogic;
|
|
|
|
+import com.gree.mall.contest.logic.StorageLogic;
|
|
|
|
+import com.gree.mall.contest.logic.common.CommonLogic;
|
|
|
|
+import com.gree.mall.contest.logic.common.WechatLogic;
|
|
|
|
+import com.gree.mall.contest.logic.user.MsgSubscriptLogic;
|
|
|
|
+import com.gree.mall.contest.logic.user.UserLogic;
|
|
|
|
+import com.gree.mall.contest.plus.entity.*;
|
|
|
|
+import com.gree.mall.contest.plus.service.*;
|
|
|
|
+import com.gree.mall.contest.utils.ArithUtils;
|
|
|
|
+import com.gree.mall.contest.utils.excel.ExcelUtils;
|
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.apache.poi.ss.usermodel.Cell;
|
|
|
|
+import org.apache.poi.ss.usermodel.CellType;
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
+import org.springframework.integration.redis.util.RedisLockRegistry;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
+
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
+import java.util.concurrent.locks.Lock;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+@Slf4j
|
|
|
|
+@RequiredArgsConstructor
|
|
|
|
+public class OrderLogic {
|
|
|
|
+
|
|
|
|
+ private final OrderShareLogic orderShareLogic;
|
|
|
|
+ private final StorageLogic storageLogic;
|
|
|
|
+ private final MsgSubscriptLogic msgSubscriptLogic;
|
|
|
|
+ private final UserLogic userLogic;
|
|
|
|
+ private final WechatLogic wechatLogic;
|
|
|
|
+ private final RedisLockRegistry redisLockRegistry;
|
|
|
|
+ private final CommentTagLogic commentTagLogic;
|
|
|
|
+ private final CommonLogic commonLogic;
|
|
|
|
+ private final GoodsService goodsService;
|
|
|
|
+ private final OrderInfoService orderInfoService;
|
|
|
|
+ private final OrderDetailService orderDetailService;
|
|
|
|
+ private final AdminUserService adminUserService;
|
|
|
|
+ private final OrderRefundCliaimsService orderRefundCliaimsService;
|
|
|
|
+ private final OrderShareService orderShareService;
|
|
|
|
+ private final OrderRefundService orderRefundService;
|
|
|
|
+ private final UserCouponService userCouponService;
|
|
|
|
+ private final CoustomUserCouponMapper coustomUserCouponMapper;
|
|
|
|
+ private final CustomWebsitMapper customWebsitMapper;
|
|
|
|
+ private final ExpressInfoService expressInfoService;
|
|
|
|
+ private final OrderRequestService orderRequestService;
|
|
|
|
+ private final UserService userService;
|
|
|
|
+ private final OrderMapper orderMapper;
|
|
|
|
+ private final ExpressLogic expressLogic;
|
|
|
|
+ private final AdminCompanyWechatService adminCompanyWechatService;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 订单列表
|
|
|
|
+ *
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public IPage<OrderDetailBean> list(HttpServletRequest request, String userId, String orderId, String productName, String userName, String phone,
|
|
|
|
+ String exchangeCode, String orderStatus, String startCreateTime, String endCreateTime, String startPayTime,
|
|
|
|
+ String endPayTime, String websitId,
|
|
|
|
+ Integer pageNum, Integer pageSize,
|
|
|
|
+ String isNegative, String abnormalDispatch, String workerOrderNo, String goodsId
|
|
|
|
+ ) {
|
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser(request);
|
|
|
|
+
|
|
|
|
+ List<String> orderIds = new ArrayList<>();
|
|
|
|
+ if (StringUtils.isNotEmpty(workerOrderNo)) {
|
|
|
|
+ List<OrderRequest> orderRequests = orderRequestService.lambdaQuery().eq(OrderRequest::getWorkerOrderNo, workerOrderNo).list();
|
|
|
|
+ orderIds = orderRequests.stream().map(OrderRequest::getOrderId).collect(Collectors.toList());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ IPage page = orderInfoService.lambdaQuery()
|
|
|
|
+ .in(CollectionUtil.isNotEmpty(adminUser.getCompanyWechatIds()), OrderInfo::getCompanyWechatId, adminUser.getCompanyWechatIds())
|
|
|
|
+ ////.//in(CollectionUtil.isNotEmpty(adminUser.getAdminWebsitIds()),OrderInfo::getWebsitId,adminUser.getAdminWebsitIds())
|
|
|
|
+ .eq(StringUtils.isNotEmpty(userId), OrderInfo::getUserId, userId)
|
|
|
|
+ .eq(StringUtils.isNotEmpty(goodsId), OrderInfo::getPromotionPackageGoodsId, goodsId)
|
|
|
|
+ .like(StringUtils.isNotEmpty(exchangeCode), OrderInfo::getExchangeCode, exchangeCode)
|
|
|
|
+ .like(StringUtils.isNotEmpty(orderId), OrderInfo::getOrderId, orderId)
|
|
|
|
+ .like(StringUtils.isNotEmpty(productName), OrderInfo::getOrderTitle, productName)
|
|
|
|
+ .in(CollectionUtil.isNotEmpty(orderIds), OrderInfo::getOrderId, orderIds)
|
|
|
|
+ .eq(StringUtils.isNotEmpty(websitId), OrderInfo::getWebsitId, websitId)
|
|
|
|
+ .and(StringUtils.isNotEmpty(userName), v -> v.like(OrderInfo::getUserName, userName).or().like(OrderInfo::getReceUserName, userName))
|
|
|
|
+ .and(StringUtils.isNotEmpty(phone), v -> v.like(OrderInfo::getPhone, phone).or().like(OrderInfo::getRecePhone, phone).or().like(OrderInfo::getWorkerPhone, phone))
|
|
|
|
+ // .in(!(adminWebsitBean.getType() && org.apache.commons.lang3.StringUtils.isEmpty(websitId)), OrderInfo::getWebsitNumber, websitNoList)
|
|
|
|
+ .eq(StringUtils.isNotEmpty(orderStatus), OrderInfo::getOrderStatus, orderStatus)
|
|
|
|
+ .between(StringUtils.isNotEmpty(startCreateTime) && StringUtils.isNotEmpty(endCreateTime), OrderInfo::getCreateTime, startCreateTime, endCreateTime + " 23:59:59")
|
|
|
|
+ .between(StringUtils.isNotEmpty(startPayTime) && StringUtils.isNotEmpty(endPayTime), OrderInfo::getPayTime, startPayTime, endPayTime + " 23:59:59")
|
|
|
|
+ .and(StringUtils.isNotEmpty(isNegative) && isNegative.trim().equals("2"),
|
|
|
|
+ v -> v.gt(OrderInfo::getCommentExpress, 2).gt(OrderInfo::getCommentService, 2).gt(OrderInfo::getCommentGoods, 2))
|
|
|
|
+ .and(StringUtils.isNotEmpty(isNegative) && isNegative.trim().equals("1"), v -> v
|
|
|
|
+ .gt(OrderInfo::getCommentExpress, 0)
|
|
|
|
+ .gt(OrderInfo::getCommentService, 0)
|
|
|
|
+ .gt(OrderInfo::getCommentGoods, 0)
|
|
|
|
+ .and(vv -> vv
|
|
|
|
+ .lt(OrderInfo::getCommentExpress, 3)
|
|
|
|
+ .or().lt(OrderInfo::getCommentService, 3)
|
|
|
|
+ .or().lt(OrderInfo::getCommentGoods, 3)
|
|
|
|
+ )
|
|
|
|
+ )
|
|
|
|
+ .and(StringUtils.isNotEmpty(isNegative) && isNegative.trim().equals("0"),
|
|
|
|
+ v -> v.eq(OrderInfo::getCommentExpress, 0).eq(OrderInfo::getCommentService, 0).eq(OrderInfo::getCommentGoods, 0))
|
|
|
|
+ .and(StringUtils.isNotEmpty(isNegative) && isNegative.trim().equals("3"),
|
|
|
|
+ v -> v.gt(OrderInfo::getCommentExpress, 0).gt(OrderInfo::getCommentService, 0).gt(OrderInfo::getCommentGoods, 0))
|
|
|
|
+ .orderByDesc(OrderInfo::getCreateTime)
|
|
|
|
+ .page(new Page<>(pageNum, pageSize));
|
|
|
|
+
|
|
|
|
+ List<OrderDetailBean> list = new ArrayList<>();
|
|
|
|
+ for (Object o : page.getRecords()) {
|
|
|
|
+ OrderInfo orderInfo = (OrderInfo) o;
|
|
|
|
+ OrderDetailBean orderDetailBean = new OrderDetailBean();
|
|
|
|
+ BeanUtils.copyProperties(orderInfo, orderDetailBean);
|
|
|
|
+ //查询订单详情
|
|
|
|
+ List<OrderDetail> orderDetails = orderDetailService.lambdaQuery().eq(OrderDetail::getOrderId, orderInfo.getOrderId()).list();
|
|
|
|
+ OrderRefund orderRefund = orderRefundService.lambdaQuery()
|
|
|
|
+ .eq(OrderRefund::getOrderId, orderInfo.getOrderId())
|
|
|
|
+ .ne(OrderRefund::getRemark, "").last("limit 1").one();
|
|
|
|
+
|
|
|
|
+ Long count = orderRequestService.lambdaQuery().eq(OrderRequest::getOrderId, orderInfo.getOrderId()).count();
|
|
|
|
+ orderDetailBean.setToWorkOrder(count > 0);
|
|
|
|
+ orderDetailBean.setOrderDetails(orderDetails);
|
|
|
|
+ orderDetailBean.setMerchantRemark(orderRefund == null ? "" : orderRefund.getRemark());
|
|
|
|
+ list.add(orderDetailBean);
|
|
|
|
+ }
|
|
|
|
+ page.setRecords(list);
|
|
|
|
+ return page;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<OrderDetailBean> list(HttpServletRequest request, String userId, String orderId, String productName, String userName, String phone, String orderStatus,
|
|
|
|
+ String startCreateTime, String endCreateTime, String startPayTime, String endPayTime, String websitId) {
|
|
|
|
+
|
|
|
|
+ List<OrderInfo> orderList = orderInfoService.lambdaQuery()
|
|
|
|
+ .eq(StringUtils.isNotEmpty(userId), OrderInfo::getUserId, userId)
|
|
|
|
+ .like(StringUtils.isNotEmpty(orderId), OrderInfo::getOrderId, orderId)
|
|
|
|
+ .like(StringUtils.isNotEmpty(productName), OrderInfo::getOrderTitle, productName)
|
|
|
|
+ .like(StringUtils.isNotEmpty(userName), OrderInfo::getUserName, userName)
|
|
|
|
+ .like(StringUtils.isNotEmpty(phone), OrderInfo::getPhone, phone)
|
|
|
|
+ .eq(StringUtils.isNotEmpty(orderStatus), OrderInfo::getOrderStatus, orderStatus)
|
|
|
|
+ .between(StringUtils.isNotEmpty(startCreateTime) && StringUtils.isNotEmpty(endCreateTime), OrderInfo::getCreateTime, startCreateTime, endCreateTime + " 23:59:59")
|
|
|
|
+ .between(StringUtils.isNotEmpty(startPayTime) && StringUtils.isNotEmpty(endPayTime), OrderInfo::getPayTime, startPayTime, endPayTime + " 23:59:59")
|
|
|
|
+ .orderByDesc(OrderInfo::getCreateTime)
|
|
|
|
+ .list();
|
|
|
|
+
|
|
|
|
+ List<OrderDetailBean> list = new ArrayList<>();
|
|
|
|
+ for (Object o : orderList) {
|
|
|
|
+ OrderInfo orderInfo = (OrderInfo) o;
|
|
|
|
+ OrderDetailBean orderDetailBean = new OrderDetailBean();
|
|
|
|
+ BeanUtils.copyProperties(orderInfo, orderDetailBean);
|
|
|
|
+ //查询订单详情
|
|
|
|
+ List<OrderDetail> orderDetails = orderDetailService.lambdaQuery().eq(OrderDetail::getOrderId, orderInfo.getOrderId()).list();
|
|
|
|
+ orderDetailBean.setOrderDetails(orderDetails);
|
|
|
|
+ list.add(orderDetailBean);
|
|
|
|
+ }
|
|
|
|
+ return list;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 订单备注
|
|
|
|
+ */
|
|
|
|
+ public void remark(String orderId, String remark) {
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .set(OrderInfo::getRemark, remark)
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId).update();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 取消订单
|
|
|
|
+ */
|
|
|
|
+ public void cancel(String orderId) throws RemoteServiceException, WxPayException {
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderId);
|
|
|
|
+ if (!orderInfo.getOrderStatus().equals(OrderStatusEnum.NOPAY.toString())) {
|
|
|
|
+ throw new RemoteServiceException("订单已支付,不可取消");
|
|
|
|
+ }
|
|
|
|
+// if(!orderInfo.getOrderStatus().equals(OrderStatusEnum.NOPAY.toString())) {
|
|
|
|
+//
|
|
|
|
+// log.info("【退款开始:】退款金额{}", orderInfo.getPayAmount().doubleValue());
|
|
|
|
+// wechatLogic.refund(orderInfo.getOrderId(), orderInfo.getOrderId()+"T", orderInfo.getPayAmount().doubleValue()
|
|
|
|
+// , orderInfo.getPayAmount().doubleValue());
|
|
|
|
+//
|
|
|
|
+// orderShareLogic.reloadAmount(orderId, null);
|
|
|
|
+// }
|
|
|
|
+ this.updateOrderStatus(orderId, OrderStatusEnum.CLOSE.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 确定收款
|
|
|
|
+ */
|
|
|
|
+ public void ackPay(String orderId) {
|
|
|
|
+ return;
|
|
|
|
+// this.updateOrderStatus(orderId, OrderStatusEnum.DFH.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 主动退款
|
|
|
|
+ */
|
|
|
|
+ @Transactional
|
|
|
|
+ public BigDecimal refund(String orderDetailId, int num, String refundPassword) throws Exception {
|
|
|
|
+ if (num < 1) {
|
|
|
|
+ throw new RemoteServiceException("退款数量不能小于1");
|
|
|
|
+ }
|
|
|
|
+ OrderDetail orderDetail = orderDetailService.getById(orderDetailId);
|
|
|
|
+ //1=非团购商品 2=团购商品
|
|
|
|
+ int flag = StringUtils.isNotEmpty(orderDetail.getPromotionGroupId()) ? 2 : 1;
|
|
|
|
+
|
|
|
|
+ String orderId = orderDetail.getOrderId();
|
|
|
|
+
|
|
|
|
+ Long count = orderShareService.lambdaQuery()
|
|
|
|
+ .eq(OrderShare::getOrderId, orderId)
|
|
|
|
+ .eq(OrderShare::getStatus, OrderShareStatusEnum.OVER.toString())
|
|
|
|
+ .count();
|
|
|
|
+
|
|
|
|
+ if (count > 0) {
|
|
|
|
+ throw new RemoteServiceException("已结算订单,不能退款");
|
|
|
|
+ }
|
|
|
|
+ if (num + orderDetail.getRefundNum() > orderDetail.getNum()) {
|
|
|
|
+ throw new RemoteServiceException("退款数量异常");
|
|
|
|
+ }
|
|
|
|
+ //退款的数量占比
|
|
|
|
+ double div = ArithUtils.div(num, orderDetail.getNum(), 4);
|
|
|
|
+ double mul = ArithUtils.mul(orderDetail.getShareAmount().doubleValue(), div, 2);
|
|
|
|
+ //退款的金额
|
|
|
|
+ BigDecimal totalShareAmount = BigDecimal.valueOf(mul);
|
|
|
|
+ //计算需要退款的金额
|
|
|
|
+ BigDecimal refundAmount = BigDecimal.valueOf(ArithUtils.mul(orderDetail.getPayAmount().doubleValue(), div, 2));
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderId);
|
|
|
|
+ if (orderInfo.getOrderStatus().equals(OrderStatusEnum.DFH.toString()) ||
|
|
|
|
+ (orderInfo.getOrderStatus().equals(OrderStatusEnum.REFUND.toString()) &&
|
|
|
|
+ StringUtils.isEmpty(orderInfo.getLogisticsNo()))) {//待发货状态退运费
|
|
|
|
+ BigDecimal refundFreight = BigDecimal.valueOf(ArithUtils.mul(orderDetail.getFreight().doubleValue(), div, 2));
|
|
|
|
+ if (refundFreight == null) {
|
|
|
|
+ refundFreight = new BigDecimal("0.00");
|
|
|
|
+ }
|
|
|
|
+ refundAmount = refundAmount.add(refundFreight);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ orderDetail.setRefundNum(orderDetail.getRefundNum() + num);
|
|
|
|
+ orderDetail.setRefundAmount(orderDetail.getRefundAmount().add(refundAmount));
|
|
|
|
+ orderDetail.setRefundTime(new Date());
|
|
|
|
+ orderDetail.setRefund(orderDetail.getNum() - orderDetail.getRefundNum() == 0);
|
|
|
|
+ orderDetail.updateById();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ int totalNum = orderInfo.getTotalNum();
|
|
|
|
+ List<OrderDetail> orderDetails = orderDetailService.lambdaQuery()
|
|
|
|
+ .eq(OrderDetail::getOrderId, orderId)
|
|
|
|
+ .list();
|
|
|
|
+ int refundNum = orderDetails.stream().filter(OrderDetail::getRefund).collect(Collectors.reducing(0, OrderDetail::getRefundNum, (i, j) -> i + j));
|
|
|
|
+ if (totalNum - refundNum == 0) {
|
|
|
|
+ String userCouponId = orderInfo.getUserCouponId();
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId)
|
|
|
|
+ .set(OrderInfo::getOrderStatus, OrderStatusEnum.CLOSE.toString())
|
|
|
|
+ .set(OrderInfo::getRefundFlag, RefundFlagEnum.ALL.toString())
|
|
|
|
+ .update();
|
|
|
|
+ if (StringUtils.isNotEmpty(userCouponId)) {
|
|
|
|
+ UserCoupon userCoupon = userCouponService.getById(orderInfo.getUserCouponId());
|
|
|
|
+ if (userCoupon.getSelfUse() != null && userCoupon.getSelfUse()) {
|
|
|
|
+ //todo sql处理,数量加一,删除指定记录
|
|
|
|
+ //coustomUserCouponMapper.increaseLeftTimes(userCoupon.getTransferor());
|
|
|
|
+ userCouponService.removeById(userCouponId);
|
|
|
|
+ } else {
|
|
|
|
+ userCouponService.lambdaUpdate()
|
|
|
|
+ .eq(UserCoupon::getId, userCouponId)
|
|
|
|
+ .set(UserCoupon::getStatus, false)
|
|
|
|
+ .update();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId)
|
|
|
|
+ .set(OrderInfo::getRefundFlag, RefundFlagEnum.PARTLY.toString())
|
|
|
|
+ .update();
|
|
|
|
+ }
|
|
|
|
+ log.info("【退款开始:】重置flag={}的结算金额,需要减掉的金额{},国补金额{}", flag, totalShareAmount.doubleValue(), orderInfo.getCouponMerchantContribute().doubleValue());
|
|
|
|
+ orderShareLogic.reloadAmount(orderId, totalShareAmount, flag);
|
|
|
|
+ log.info("【退款开始:】退款金额{}", refundAmount);
|
|
|
|
+
|
|
|
|
+ wechatLogic.refund(orderId, orderId + IdUtil.simpleUUID(), orderInfo.getPayAmount().doubleValue()
|
|
|
|
+ , refundAmount.doubleValue(), orderInfo.getCompanyWechatId());
|
|
|
|
+
|
|
|
|
+ return refundAmount;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 理赔列表
|
|
|
|
+ */
|
|
|
|
+ public List<OrderRefundCliaims> cliaimsList(String orderId) {
|
|
|
|
+ List<OrderRefundCliaims> list = orderRefundCliaimsService.lambdaQuery()
|
|
|
|
+ .eq(OrderRefundCliaims::getOrderId, orderId).orderByDesc(OrderRefundCliaims::getCreateTime).list();
|
|
|
|
+ return list;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 理赔
|
|
|
|
+ */
|
|
|
|
+ @Transactional
|
|
|
|
+ public BigDecimal refundCliaims(String orderDetailId, int num, BigDecimal refundAmount, String adminUserId,
|
|
|
|
+ String remark, String refundPassword) throws Exception {
|
|
|
|
+// if (num < 1) {
|
|
|
|
+// throw new RemoteServiceException("数量错误");
|
|
|
|
+// }
|
|
|
|
+ if (refundAmount.compareTo(new BigDecimal("0.00")) < 1) {
|
|
|
|
+ throw new RemoteServiceException("金额错误");
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isEmpty(remark)) {
|
|
|
|
+ throw new RemoteServiceException("请填写理赔原因");
|
|
|
|
+ }
|
|
|
|
+ AdminUser adminUser = adminUserService.getById(adminUserId);
|
|
|
|
+ OrderDetail orderDetail = orderDetailService.getById(orderDetailId);
|
|
|
|
+ String orderId = orderDetail.getOrderId();
|
|
|
|
+
|
|
|
|
+ if (orderDetail.getNum() < orderDetail.getRefundNum() + num) {
|
|
|
|
+ throw new RemoteServiceException("可理赔商品数量不足");
|
|
|
|
+ }
|
|
|
|
+ if (orderDetail.getPayAmount().add(orderDetail.getFreight()).doubleValue() < (orderDetail.getRefundAmount().add(refundAmount).doubleValue())) {
|
|
|
|
+ throw new RemoteServiceException("可理赔金额不足");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //退款的数量占比
|
|
|
|
+ double div = ArithUtils.div(num, orderDetail.getNum(), 4);
|
|
|
|
+ double mul = ArithUtils.mul(orderDetail.getShareAmount().doubleValue(), div, 2);
|
|
|
|
+ //退款的金额
|
|
|
|
+ BigDecimal totalShareAmount = BigDecimal.valueOf(mul);
|
|
|
|
+ //计算需要退款的金额
|
|
|
|
+ orderDetail.setRefundNum(orderDetail.getRefundNum() + num);
|
|
|
|
+ orderDetail.setRefundAmount(orderDetail.getRefundAmount().add(refundAmount));
|
|
|
|
+ orderDetail.setRefundTime(new Date());
|
|
|
|
+ orderDetail.setRefund(orderDetail.getNum() - orderDetail.getRefundNum() == 0);
|
|
|
|
+ orderDetail.updateById();
|
|
|
|
+
|
|
|
|
+ //记录理赔数据
|
|
|
|
+ OrderRefundCliaims orderRefundCliaims = new OrderRefundCliaims();
|
|
|
|
+ orderRefundCliaims.setCreateTime(new Date());
|
|
|
|
+ orderRefundCliaims.setRefundAmount(refundAmount);
|
|
|
|
+ orderRefundCliaims.setNum(num);
|
|
|
|
+ orderRefundCliaims.setOrderId(orderId);
|
|
|
|
+ orderRefundCliaims.setOrderDetailId(orderDetailId);
|
|
|
|
+ orderRefundCliaims.setGoodsId(orderDetail.getGoodsId());
|
|
|
|
+ orderRefundCliaims.setGoodsName(orderDetail.getGoodsName());
|
|
|
|
+ orderRefundCliaims.setGoodsSpecId(orderDetail.getGoodsSpecId());
|
|
|
|
+ orderRefundCliaims.setGoodsSpecName(orderDetail.getGoodsSpecName());
|
|
|
|
+ orderRefundCliaims.setGoodsSpecValue(orderDetail.getGoodsSpecValue());
|
|
|
|
+ orderRefundCliaims.setOperatorUser(adminUser.getUserName());
|
|
|
|
+ orderRefundCliaims.setRemark(remark);
|
|
|
|
+ orderRefundCliaims.insert();
|
|
|
|
+
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderDetail.getOrderId());
|
|
|
|
+ int totalNum = orderInfo.getTotalNum();
|
|
|
|
+ List<OrderDetail> orderDetails = orderDetailService
|
|
|
|
+ .lambdaQuery()
|
|
|
|
+ .eq(OrderDetail::getOrderId, orderId)
|
|
|
|
+ .list();
|
|
|
|
+ int refundNum = orderDetails.stream().filter(OrderDetail::getRefund).collect(Collectors.reducing(0, OrderDetail::getRefundNum, (i, j) -> i + j));
|
|
|
|
+ if (totalNum - refundNum == 0) {
|
|
|
|
+ String userCouponId = orderInfo.getUserCouponId();
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId)
|
|
|
|
+ .set(OrderInfo::getOrderStatus, OrderStatusEnum.CLOSE.toString())
|
|
|
|
+ .set(OrderInfo::getUserCouponId, "")
|
|
|
|
+ .set(OrderInfo::getRefundFlag, RefundFlagEnum.ALL.toString())
|
|
|
|
+ .update();
|
|
|
|
+ if (StringUtils.isNotEmpty(userCouponId)) {
|
|
|
|
+ UserCoupon userCoupon = userCouponService.getById(orderInfo.getUserCouponId());
|
|
|
|
+ if (userCoupon.getSelfUse() != null && userCoupon.getSelfUse()) {
|
|
|
|
+ //todo sql处理,数量加一,删除指定记录
|
|
|
|
+ coustomUserCouponMapper.increaseLeftTimes(userCoupon.getTransferor());
|
|
|
|
+ userCouponService.removeById(userCouponId);
|
|
|
|
+ } else {
|
|
|
|
+ userCouponService.lambdaUpdate()
|
|
|
|
+ .eq(UserCoupon::getId, userCouponId)
|
|
|
|
+ .set(UserCoupon::getStatus, false)
|
|
|
|
+ .update();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId)
|
|
|
|
+ .set(OrderInfo::getRefundFlag, RefundFlagEnum.PARTLY.toString())
|
|
|
|
+ .update();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //1=非团购商品 2=团购商品
|
|
|
|
+ if (totalShareAmount.doubleValue() > 0) {
|
|
|
|
+ int flag = StringUtils.isNotEmpty(orderDetail.getPromotionGroupId()) ? 2 : 1;
|
|
|
|
+ log.info("【退款开始:】重置结算,order_id={},flag={}金额,需要减掉的金额{}", orderInfo.getOrderId(), flag, totalShareAmount.doubleValue());
|
|
|
|
+ orderShareLogic.reloadAmount(orderId, totalShareAmount, flag);
|
|
|
|
+ }
|
|
|
|
+ log.info("【退款开始:】退款金额{},order_id={}", refundAmount, orderInfo.getOrderId());
|
|
|
|
+
|
|
|
|
+ wechatLogic.refund(orderId, orderId + IdUtil.simpleUUID(), orderInfo.getPayAmount().doubleValue()
|
|
|
|
+ , refundAmount.doubleValue(), orderInfo.getCompanyWechatId());
|
|
|
|
+
|
|
|
|
+ return refundAmount;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改价格
|
|
|
|
+ */
|
|
|
|
+ public void updatePrice(String orderId, BigDecimal price) throws RemoteServiceException {
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderId);
|
|
|
|
+ if (!orderInfo.getOrderStatus().equals(OrderStatusEnum.NOPAY.toString())) {
|
|
|
|
+ throw new RemoteServiceException("非待付款订单不可修改");
|
|
|
|
+ }
|
|
|
|
+ if (orderInfo.getPayAmount().doubleValue() < price.doubleValue()) {
|
|
|
|
+ throw new RemoteServiceException("不可将价格修改的更贵");
|
|
|
|
+ }
|
|
|
|
+ if (orderInfo.getPayAmount().doubleValue() < orderInfo.getFreight().doubleValue()) {
|
|
|
|
+ throw new RemoteServiceException("不可将价格修改的比运费小");
|
|
|
|
+ }
|
|
|
|
+ orderInfo.setPayAmount(price);
|
|
|
|
+ orderInfo.updateById();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改收货人信息
|
|
|
|
+ */
|
|
|
|
+ public void updateReceInfo(OrderInfo orderInfo) throws RemoteServiceException {
|
|
|
|
+ if (orderInfo.getOrderStatus().equals(OrderStatusEnum.OVER.toString())
|
|
|
|
+ || orderInfo.getOrderStatus().equals(OrderStatusEnum.OVER.toString())) {
|
|
|
|
+ throw new RemoteServiceException("已发货、已完成订单不可修改");
|
|
|
|
+ }
|
|
|
|
+ orderInfo.updateById();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量设置备注
|
|
|
|
+ */
|
|
|
|
+ public void batchRemark(BatchRemarkBean batchRemarkBean) throws RemoteServiceException {
|
|
|
|
+ if (CollectionUtil.isEmpty(batchRemarkBean.getOrderIds())) {
|
|
|
|
+ throw new RemoteServiceException("订单号不能为空");
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isEmpty(batchRemarkBean.getRemark())) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .set(OrderInfo::getRemark, batchRemarkBean.getRemark())
|
|
|
|
+ .in(OrderInfo::getOrderId, batchRemarkBean.getOrderIds())
|
|
|
|
+ .update();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 发货
|
|
|
|
+ */
|
|
|
|
+ @Transactional
|
|
|
|
+ public void deliverGoods(String orderId, String logisticsNo, String companyCode, String storageId, Boolean workOrder, Boolean exchange) throws Exception {
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderId);
|
|
|
|
+ final AdminCompanyWechat companyWechat = adminCompanyWechatService.getById(orderInfo.getCompanyWechatId());
|
|
|
|
+ User user = userLogic.getById(orderInfo.getUserId());
|
|
|
|
+ if (!orderInfo.getOrderStatus().equals(OrderStatusEnum.DFH.toString())) {
|
|
|
|
+ throw new RemoteServiceException("非待发货订单不可发货");
|
|
|
|
+ }
|
|
|
|
+ //发货商
|
|
|
|
+ Storage detail = storageLogic.detail(storageId);
|
|
|
|
+ String companyName = expressLogic.expressCompanyName(companyCode);
|
|
|
|
+ orderInfo.setLogisticsNo(logisticsNo);
|
|
|
|
+ orderInfo.setCompanyCode(companyCode);
|
|
|
|
+ orderInfo.setCompanyName(companyName);
|
|
|
|
+ orderInfo.setOrderStatus(OrderStatusEnum.YFH.toString());
|
|
|
|
+ orderInfo.setStorageName(detail.getStorageName());
|
|
|
|
+ orderInfo.setStorageAddress(detail.getStorageAddress());
|
|
|
|
+ orderInfo.setStoragePhone(detail.getStorageMobile());
|
|
|
|
+ orderInfo.setDeliverTime(new Date());
|
|
|
|
+ orderInfo.setWorkOrder(workOrder);
|
|
|
|
+ orderInfo.setExchangeOrder(exchange);
|
|
|
|
+ orderInfo.updateById();
|
|
|
|
+
|
|
|
|
+ orderShareLogic.updateOrderStatus(orderId, OrderStatusEnum.YFH.toString());
|
|
|
|
+
|
|
|
|
+ //发货通知
|
|
|
|
+ if (user != null) {
|
|
|
|
+ msgSubscriptLogic.sendFhNotice(user.getUserId(), user.getOpenId(), orderInfo.getOrderId(), orderInfo.getPayAmount()
|
|
|
|
+ , companyName, orderInfo.getLogisticsNo());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //@Transactional
|
|
|
|
+ public void deliverBatchGoods(HttpServletRequest request, MultipartFile file) throws Exception {
|
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser(request);
|
|
|
|
+
|
|
|
|
+ List<Object> datas = ExcelUtils.importExcel(file);
|
|
|
|
+ List<DeliverGoodsBean> deliverGoodsBeanList = new ArrayList<>();
|
|
|
|
+ for (Object object : datas) {
|
|
|
|
+ List<String> row = (List<String>) object;
|
|
|
|
+ DeliverGoodsBean deliverGoodsBean = new DeliverGoodsBean();
|
|
|
|
+ deliverGoodsBean.setOrderId(row.get(0));
|
|
|
|
+ deliverGoodsBean.setExpressCorp(row.get(1));
|
|
|
|
+ deliverGoodsBean.setLogisticsNo(row.get(2));
|
|
|
|
+ deliverGoodsBean.setWarehouse(row.get(3));
|
|
|
|
+ deliverGoodsBean.setSend("是".equals(row.get(4)));
|
|
|
|
+ deliverGoodsBean.setExchangeOrder("是".equals(row.get(5)));
|
|
|
|
+ deliverGoodsBeanList.add(deliverGoodsBean);
|
|
|
|
+ }
|
|
|
|
+ //预检查
|
|
|
|
+ String check = preCheck(adminUser, deliverGoodsBeanList);
|
|
|
|
+ if (StringUtils.isNotEmpty(check)) {
|
|
|
|
+ throw new RemoteServiceException(check);
|
|
|
|
+ }
|
|
|
|
+ for (DeliverGoodsBean deliverGoodsBean : deliverGoodsBeanList) {
|
|
|
|
+ Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.LOCK_ORDER + ":" + deliverGoodsBean.getOrderId());
|
|
|
|
+ try {
|
|
|
|
+ if (!obtain.tryLock(30, TimeUnit.SECONDS)) {
|
|
|
|
+ throw new RemoteServiceException("请勿重复操作发货,请稍后再试");
|
|
|
|
+ }
|
|
|
|
+ updateDeliverItem(adminUser, deliverGoodsBean);
|
|
|
|
+ } finally {
|
|
|
|
+ obtain.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String preCheck(AdminUserCom adminUser, List<DeliverGoodsBean> deliverGoodsBeanList) {
|
|
|
|
+ String loginCompanyWechatId = adminUser.getLoginCompanyWechatId();
|
|
|
|
+ if (StringUtils.isEmpty(loginCompanyWechatId)) {
|
|
|
|
+ throw new RemoteServiceException("无效微信企业id");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
|
+ int index = 0;
|
|
|
|
+ for (DeliverGoodsBean deliverGoodsBean : deliverGoodsBeanList) {
|
|
|
|
+ ++index;
|
|
|
|
+ String orderId = deliverGoodsBean.getOrderId();
|
|
|
|
+ if (StringUtils.isEmpty(orderId)) {
|
|
|
|
+ sb.append(String.format("第%d条数据订单号不能为空\n", index));
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.lambdaQuery()
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId)
|
|
|
|
+ .eq(OrderInfo::getOrderStatus, OrderStatusEnum.DFH.toString())
|
|
|
|
+ .one();
|
|
|
|
+
|
|
|
|
+ if (orderInfo == null) {
|
|
|
|
+ sb.append(String.format("第%d条数据订单号不正确或已发货,请检查\n", index));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Storage detail = storageLogic.detailByName(loginCompanyWechatId, deliverGoodsBean.getWarehouse().trim());
|
|
|
|
+ if (detail == null) {
|
|
|
|
+ sb.append(String.format("第%d条数据仓库出错,请检查\n", index));
|
|
|
|
+ }
|
|
|
|
+ ExpressCompany company = expressLogic.expressCompany(deliverGoodsBean.getExpressCorp().trim());
|
|
|
|
+ if (company == null) {
|
|
|
|
+ sb.append(String.format("第%d条数据物流公司出错,请检查\n", index));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return sb.toString();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void updateDeliverItem(AdminUserCom adminUserCom, DeliverGoodsBean deliverGoodsBean) throws Exception {
|
|
|
|
+ String orderId = deliverGoodsBean.getOrderId();
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.lambdaQuery()
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId)
|
|
|
|
+ .eq(OrderInfo::getOrderStatus, OrderStatusEnum.DFH.toString())
|
|
|
|
+ .one();
|
|
|
|
+ if (StringUtils.isEmpty(orderId)) {
|
|
|
|
+ throw new RemoteServiceException("订单号不能为空");
|
|
|
|
+ }
|
|
|
|
+ final AdminCompanyWechat companyWechat = adminCompanyWechatService.getById(orderInfo.getCompanyWechatId());
|
|
|
|
+
|
|
|
|
+ if (orderInfo == null) {
|
|
|
|
+ throw new RemoteServiceException(String.format("订单号:%s不正确或已发货,请检查", deliverGoodsBean.getOrderId()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Storage detail = storageLogic.detailByName(adminUserCom.getLoginCompanyWechatId(), deliverGoodsBean.getWarehouse().trim());
|
|
|
|
+ if (detail == null) {
|
|
|
|
+ throw new RemoteServiceException(String.format("订单号:%s仓库出错,请检查", deliverGoodsBean.getOrderId()));
|
|
|
|
+ }
|
|
|
|
+ ExpressCompany company = expressLogic.expressCompany(deliverGoodsBean.getExpressCorp().trim());
|
|
|
|
+ if (company == null) {
|
|
|
|
+ throw new RemoteServiceException(String.format("订单号:%s物流公司出错,请检查", deliverGoodsBean.getOrderId()));
|
|
|
|
+ }
|
|
|
|
+ orderInfo.setLogisticsNo(deliverGoodsBean.getLogisticsNo());
|
|
|
|
+ orderInfo.setCompanyCode(company.getCode());
|
|
|
|
+ orderInfo.setCompanyName(company.getName());
|
|
|
|
+ orderInfo.setOrderStatus(OrderStatusEnum.YFH.toString());
|
|
|
|
+ orderInfo.setStorageName(detail.getStorageName());
|
|
|
|
+ orderInfo.setStorageAddress(detail.getStorageAddress());
|
|
|
|
+ orderInfo.setStoragePhone(detail.getStorageMobile());
|
|
|
|
+ orderInfo.setDeliverTime(new Date());
|
|
|
|
+ orderInfo.setWorkOrder(deliverGoodsBean.getSend());
|
|
|
|
+ orderInfo.setExchangeOrder(deliverGoodsBean.getExchangeOrder());
|
|
|
|
+ orderInfo.updateById();
|
|
|
|
+
|
|
|
|
+ orderShareLogic.updateOrderStatus(orderId, OrderStatusEnum.YFH.toString());
|
|
|
|
+ if (orderInfo != null) {
|
|
|
|
+ User user = userLogic.getById(orderInfo.getUserId());
|
|
|
|
+ if (user != null) {
|
|
|
|
+ msgSubscriptLogic.sendFhNotice(user.getUserId(), user.getOpenId(), orderInfo.getOrderId(), orderInfo.getPayAmount()
|
|
|
|
+ , orderInfo.getCompanyName(), orderInfo.getLogisticsNo());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private String getStringValue(Cell cell) {
|
|
|
|
+ if (cell == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ CellType cellType = cell.getCellTypeEnum();
|
|
|
|
+ switch (cellType) {
|
|
|
|
+ case STRING:
|
|
|
|
+ return cell.getStringCellValue();
|
|
|
|
+ case NUMERIC:
|
|
|
|
+ double value = cell.getNumericCellValue();
|
|
|
|
+ return String.valueOf(Math.round(value));
|
|
|
|
+ case BOOLEAN:
|
|
|
|
+ return String.valueOf(cell.getBooleanCellValue());
|
|
|
|
+ default:
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 订单详情
|
|
|
|
+ */
|
|
|
|
+ public OrderDetailBean detail(String orderId) {
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderId);
|
|
|
|
+ //查询订单详情
|
|
|
|
+ List<OrderDetail> orderDetails = orderDetailService.lambdaQuery()
|
|
|
|
+ .eq(OrderDetail::getOrderId, orderInfo.getOrderId())
|
|
|
|
+ .list();
|
|
|
|
+ //已结算数量
|
|
|
|
+ Long count = orderShareService.lambdaQuery()
|
|
|
|
+ .eq(OrderShare::getOrderId, orderId)
|
|
|
|
+ .eq(OrderShare::getStatus, OrderShareStatusEnum.OVER.toString())
|
|
|
|
+ .count();
|
|
|
|
+ //组装数据
|
|
|
|
+ OrderDetailBean orderDetailBean = new OrderDetailBean();
|
|
|
|
+ BeanUtils.copyProperties(orderInfo, orderDetailBean);
|
|
|
|
+ orderDetailBean.setOrderDetails(orderDetails);
|
|
|
|
+ Boolean refundFlag = false;
|
|
|
|
+ if (count == 0) {
|
|
|
|
+ refundFlag = true;
|
|
|
|
+ }
|
|
|
|
+ orderDetailBean.setRefundAble(refundFlag);
|
|
|
|
+ //团长信息
|
|
|
|
+ if (StringUtils.isNotEmpty(orderInfo.getPromotionGroupUserId())) {
|
|
|
|
+ User user = userService.getById(orderInfo.getPromotionGroupUserId());
|
|
|
|
+ if (user != null) {
|
|
|
|
+ orderDetailBean.setPromotionGroupUserName(user.getNickName());
|
|
|
|
+ orderDetailBean.setPromotionGroupMobile(user.getMobile());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //查询订单评价
|
|
|
|
+ orderDetailBean.setOrderComment(commentTagLogic.getOrderComment(orderId));
|
|
|
|
+ orderDetailBean.setOrderCommentTags(commentTagLogic.getCommentTags(orderId));
|
|
|
|
+ orderDetailBean.setOrderCommentImgs(commonLogic.queryFileUrlsByObjId(orderId, Constant.Img.ORDER_COMMENT));
|
|
|
|
+ return orderDetailBean;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 是否显示评价
|
|
|
|
+ */
|
|
|
|
+ public void updateShowComment(String orderId, Boolean isShow) {
|
|
|
|
+ commentTagLogic.updateShow(orderId, isShow);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改订单状态,修改结算的订单状态
|
|
|
|
+ */
|
|
|
|
+ public void updateOrderStatus(String orderId, String orderStatus) {
|
|
|
|
+ orderInfoService.lambdaUpdate()
|
|
|
|
+ .set(OrderInfo::getOrderStatus, orderStatus)
|
|
|
|
+ .eq(OrderInfo::getOrderId, orderId).update();
|
|
|
|
+
|
|
|
|
+ orderShareLogic.updateOrderStatus(orderId, orderStatus);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询订单详情
|
|
|
|
+ */
|
|
|
|
+ public List<OrderDetail> queryOrderDetails(String orderId) {
|
|
|
|
+ List<OrderDetail> list = orderDetailService.lambdaQuery().in(OrderDetail::getOrderId, orderId).list();
|
|
|
|
+ return list;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 导出excel
|
|
|
|
+ *
|
|
|
|
+ * @param orderId
|
|
|
|
+ * @param orderStatus
|
|
|
|
+ */
|
|
|
|
+ public void export(HttpServletRequest request, HttpServletResponse response, String userId, String orderId, String productName, String userName, String phone, String orderStatus,
|
|
|
|
+ String startCreateTime, String endCreateTime, String startPayTime, String endPayTime, String websitId) throws Exception {
|
|
|
|
+ List<OrderDetailBean> list = list(request, userId, orderId, productName, userName, phone, orderStatus, startCreateTime, endCreateTime, startPayTime, endPayTime, websitId);
|
|
|
|
+// OrderDetailBean
|
|
|
|
+ String[] titles = {"订单号", "商品名称", "规格型号", "数量", "单位", "销售单价", "优惠后单价", "实际收款", "收货人姓名",
|
|
|
|
+ "手机号", "收货地址", "订单状态", "售后状态", "退款金额(小项)", "退款数量(小项)", "备注", "下单时间", "买家昵称", "购买渠道", "买家备注", "卖家备注", "网点", "业务员/网点", "分佣金额", "团长名称", "团长手机号"};
|
|
|
|
+ ExcelData excelData = new ExcelData();
|
|
|
|
+ List<List<Object>> rows = new ArrayList<>();
|
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ for (OrderDetailBean orderDetailBean : list) {
|
|
|
|
+
|
|
|
|
+ User user = null;
|
|
|
|
+ //查询团长
|
|
|
|
+ String promotionGroupUserId = orderDetailBean.getPromotionGroupUserId();
|
|
|
|
+ if (StringUtils.isNotEmpty(promotionGroupUserId)) {
|
|
|
|
+ user = userService.getById(promotionGroupUserId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (OrderDetail orderDetail : orderDetailBean.getOrderDetails()) {
|
|
|
|
+ List<Object> row = new ArrayList<>();
|
|
|
|
+ row.add(orderDetail.getOrderId());
|
|
|
|
+ row.add(orderDetail.getGoodsName());
|
|
|
|
+
|
|
|
|
+ row.add(trimStr(orderDetail.getGoodsSpecName(), "(", orderDetail.getGoodsSpecValue(), ")"));
|
|
|
|
+ row.add(orderDetail.getNum());
|
|
|
|
+ row.add("台");
|
|
|
|
+ row.add(orderDetail.getPrice());
|
|
|
|
+ row.add(orderDetail.getPayAmount().divide(new BigDecimal(orderDetail.getNum()), 2, BigDecimal.ROUND_HALF_UP));
|
|
|
|
+ row.add(orderDetail.getPayAmount());
|
|
|
|
+ row.add(orderDetailBean.getReceUserName());
|
|
|
|
+ row.add(orderDetailBean.getRecePhone());
|
|
|
|
+ row.add(trimStr(orderDetailBean.getProvince(), orderDetailBean.getCity(),
|
|
|
|
+ orderDetailBean.getArea(), orderDetailBean.getStreet(), orderDetailBean.getReceAddress(), orderDetailBean.getHouseNo()));
|
|
|
|
+ String orderStatusName = Enum.valueOf(OrderStatusEnum.class, orderDetailBean.getOrderStatus().trim().toUpperCase()).getName();
|
|
|
|
+ if (orderDetailBean.getOrderStatus().equals(OrderStatusEnum.REFUND.toString())) {
|
|
|
|
+ if (StringUtils.isNotEmpty(orderDetailBean.getLogisticsNo())) {
|
|
|
|
+ orderStatusName = OrderStatusEnum.YFH.getName();
|
|
|
|
+ } else {
|
|
|
|
+ orderStatusName = OrderStatusEnum.DFH.getName();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (orderDetailBean.getRefundFlag().equals(RefundFlagEnum.ALL.toString())) {
|
|
|
|
+ orderStatusName = OrderStatusEnum.CLOSE.getName();
|
|
|
|
+ }
|
|
|
|
+ row.add(orderStatusName);
|
|
|
|
+ String refundFlag = "";
|
|
|
|
+ if (orderDetailBean.getRefundFlag().equals(RefundFlagEnum.PARTLY.toString()) ||
|
|
|
|
+ orderDetailBean.getRefundFlag().equals(RefundFlagEnum.ING.toString())
|
|
|
|
+ ) {
|
|
|
|
+ if (orderDetail.getRefundNum() == 0) {
|
|
|
|
+ refundFlag = RefundFlagEnum.COMMONLY.getName();
|
|
|
|
+ } else {
|
|
|
|
+ refundFlag = orderDetail.getNum() - orderDetail.getRefundNum() > 0 ?
|
|
|
|
+ RefundFlagEnum.PARTLY.getName() : RefundFlagEnum.ALL.getName();
|
|
|
|
+ if (orderDetailBean.getRefundFlag().equals(RefundFlagEnum.ING.toString())) {
|
|
|
|
+ refundFlag = RefundFlagEnum.ING.getName();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ refundFlag = Enum.valueOf(RefundFlagEnum.class, orderDetailBean.getRefundFlag().trim().toUpperCase()).getName();
|
|
|
|
+ }
|
|
|
|
+ row.add(refundFlag);
|
|
|
|
+ row.add(orderDetail.getRefundAmount());
|
|
|
|
+ row.add(orderDetail.getRefundNum());
|
|
|
|
+// row.add(orderDetailBean.getRefundTotal());
|
|
|
|
+ row.add(orderDetailBean.getRemark());
|
|
|
|
+ row.add(simpleDateFormat.format(orderDetailBean.getCreateTime()));
|
|
|
|
+ row.add(orderDetailBean.getUserName());
|
|
|
|
+ row.add(orderDetailBean.getWorkerName());
|
|
|
|
+ row.add(orderDetailBean.getBuyerMsg());
|
|
|
|
+ row.add(orderDetailBean.getRemark());
|
|
|
|
+ row.add(orderDetailBean.getWebsitName());
|
|
|
|
+ row.add(trimStr(orderDetailBean.getWorkerName(), "\r\n", orderDetailBean.getWebsitName()));
|
|
|
|
+ row.add(orderDetail.getShareAmount());
|
|
|
|
+ row.add(orderDetailBean.getPromotionGroupUserId());
|
|
|
|
+ if (user != null) {
|
|
|
|
+ row.add(user.getNickName());
|
|
|
|
+ row.add(user.getMobile());
|
|
|
|
+ } else {
|
|
|
|
+ row.add("");
|
|
|
|
+ row.add("");
|
|
|
|
+ }
|
|
|
|
+ rows.add(row);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ String fileName = String.format("订单导出%s.xlsx", simpleDateFormat.format(new Date()));
|
|
|
|
+ excelData.setTitles(Arrays.asList(titles));
|
|
|
|
+ excelData.setName("订单");
|
|
|
|
+ excelData.setRows(rows);
|
|
|
|
+ ExcelUtils.exportExcel(request, response, fileName, excelData, -1, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 导出excel
|
|
|
|
+ */
|
|
|
|
+ public void export2(HttpServletRequest request, HttpServletResponse response,
|
|
|
|
+ String userId, String orderId, String productName, String userName,
|
|
|
|
+ String phone, String exchangeCode, String orderStatus,
|
|
|
|
+ String startCreateTime, String endCreateTime,
|
|
|
|
+ String startPayTime, String endPayTime, String promotionGroupUserName, String promotionGroupId,
|
|
|
|
+ String promotionGroupUserId, String websitId, String goodsId) throws Exception {
|
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser(request);
|
|
|
|
+ ExcelData excelData = new ExcelData();
|
|
|
|
+ String[] titles = {"订单号", "商品名称", "规格型号", "数量", "单位", "销售单价", "优惠后单价", "实际收款", "收货人姓名",
|
|
|
|
+ "手机号", "收货地址", "订单状态", "售后状态", "退款金额(小项)", "退款数量(小项)", "备注", "下单时间", "支付时间", "买家昵称", "购买渠道",
|
|
|
|
+ "买家备注", "卖家备注", "网点", "业务员/网点", "业务员手机号", "分佣金额", "团长名称", "团长手机号", "团购活动id",
|
|
|
|
+ "评价商品的星数(0未评价)", "评价服务的星数(0未评价)", "评价物流的星数(0未评价)", "信息编号", "商品类型", "网点名称", "是否已入驻企业微信",
|
|
|
|
+ "金蝶物料编号"};
|
|
|
|
+
|
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
+ String fileName = String.format("订单导出%s.xlsx", simpleDateFormat.format(new Date()));
|
|
|
|
+
|
|
|
|
+ List<OrderDetailListBean> orderDetailListBeanList = orderMapper.selectByQueryMsg(userId, orderId, productName, userName,
|
|
|
|
+ phone, exchangeCode, orderStatus,
|
|
|
|
+ startCreateTime, endCreateTime,
|
|
|
|
+ startPayTime, endPayTime, promotionGroupUserName, promotionGroupId, promotionGroupUserId, websitId, goodsId, adminUser.getCompanyWechatIds(), null);
|
|
|
|
+
|
|
|
|
+ List<List<Object>> rows = new ArrayList<>();
|
|
|
|
+ for (OrderDetailListBean orderDetailListBean : orderDetailListBeanList) {
|
|
|
|
+ List<Object> row = new ArrayList<>();
|
|
|
|
+ rows.add(row);
|
|
|
|
+
|
|
|
|
+ String goodsName = orderDetailListBean.getGoodsName();
|
|
|
|
+ if (orderDetailListBean.getPromotionPackageGoods() != null && orderDetailListBean.getPromotionPackageGoods()) {
|
|
|
|
+ goodsName = "套购:" + goodsName;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ row.add(orderDetailListBean.getOrderId());
|
|
|
|
+ row.add(goodsName);
|
|
|
|
+ row.add(orderDetailListBean.getGoodsSpecValue());
|
|
|
|
+ row.add(orderDetailListBean.getNum());
|
|
|
|
+ row.add("台");
|
|
|
|
+ row.add(orderDetailListBean.getPrice());
|
|
|
|
+ row.add(orderDetailListBean.getPayAmount().divide(new BigDecimal(orderDetailListBean.getNum()), 2, BigDecimal.ROUND_HALF_UP));
|
|
|
|
+ row.add(orderDetailListBean.getPayAmount());
|
|
|
|
+ row.add(orderDetailListBean.getReceUserName());
|
|
|
|
+ row.add(orderDetailListBean.getRecePhone());
|
|
|
|
+ row.add(orderDetailListBean.getAddress());
|
|
|
|
+
|
|
|
|
+ if (StringUtils.isNotEmpty(orderDetailListBean.getOrderStatus())) {
|
|
|
|
+ row.add(OrderStatusEnum.valueOf(orderDetailListBean.getOrderStatus()).getName());
|
|
|
|
+ } else {
|
|
|
|
+ row.add("");
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isNotEmpty(orderDetailListBean.getRefundFlag())) {
|
|
|
|
+ row.add(RefundFlagEnum.valueOf(orderDetailListBean.getRefundFlag()).getName());
|
|
|
|
+ } else {
|
|
|
|
+ row.add("");
|
|
|
|
+ }
|
|
|
|
+ row.add(orderDetailListBean.getRefundAmount());
|
|
|
|
+ row.add(orderDetailListBean.getRefundNum());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getRemark()) ? "" : orderDetailListBean.getRemark());
|
|
|
|
+ row.add(orderDetailListBean.getCreateTime() == null ? "" : simpleDateFormat.format(orderDetailListBean.getCreateTime()));
|
|
|
|
+ row.add(orderDetailListBean.getPayTime() == null ? "" : simpleDateFormat.format(orderDetailListBean.getPayTime()));
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getUserName()) ? "" : orderDetailListBean.getUserName());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getWorkerName()) ? "" : orderDetailListBean.getWorkerName());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getBuyerMsg()) ? "" : orderDetailListBean.getBuyerMsg());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getRemark()) ? "" : orderDetailListBean.getRemark());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getWebsitName()) ? "" : orderDetailListBean.getWebsitName());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getWorkerNameWithWebsitName()) ? "" : orderDetailListBean.getWorkerNameWithWebsitName());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getWorkerPhone()) ? "" : orderDetailListBean.getWorkerPhone());
|
|
|
|
+ row.add(orderDetailListBean.getShareAmount());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getNickName()) ? "" : orderDetailListBean.getNickName());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getMobile()) ? "" : orderDetailListBean.getMobile());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getPromotionGroupId()) ? "" : orderDetailListBean.getPromotionGroupId());
|
|
|
|
+ row.add(orderDetailListBean.getCommentGoods());
|
|
|
|
+ row.add(orderDetailListBean.getCommentService());
|
|
|
|
+ row.add(orderDetailListBean.getCommentExpress());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getWorkerOrderNo()) ? "" : orderDetailListBean.getWorkerOrderNo());
|
|
|
|
+ row.add(StringUtils.equals(orderDetailListBean.getWorkOrderType(), "INSTALL") ? "安装" : "维修");
|
|
|
|
+ row.add("");
|
|
|
|
+ row.add(orderDetailListBean.getIsAddCorp() != null && orderDetailListBean.getIsAddCorp() ? "是" : "否");
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getGoodsCode()) ? "" : orderDetailListBean.getGoodsCode());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getBuyerName()) ? "" : orderDetailListBean.getBuyerName());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getBuyerMobile()) ? "" : orderDetailListBean.getBuyerMobile());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getBuyerIdCard()) ? "" : orderDetailListBean.getBuyerIdCard());
|
|
|
|
+ row.add(Objects.isNull(orderDetailListBean.getCouponMerchantContribute()) ? BigDecimal.ZERO : orderDetailListBean.getCouponMerchantContribute());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getBarCode()) ? "" : orderDetailListBean.getBarCode());
|
|
|
|
+ row.add(StringUtils.isBlank(orderDetailListBean.getTransactionId()) ? "" : orderDetailListBean.getTransactionId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ excelData.setTitles(Arrays.asList(titles));
|
|
|
|
+ excelData.setName("订单");
|
|
|
|
+ excelData.setRows(rows);
|
|
|
|
+ ExcelUtils.exportExcel(request, response, fileName, excelData, -1, null);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String trimStr(String... str) {
|
|
|
|
+ StringBuffer sb = new StringBuffer("");
|
|
|
|
+ for (String s : str) {
|
|
|
|
+ if (s != null) {
|
|
|
|
+ sb.append(s);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return sb.toString();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改物流单号
|
|
|
|
+ */
|
|
|
|
+ public void updateExpress(String orderId,String logisticsNo,String companyCode) throws RemoteServiceException {
|
|
|
|
+ //查询物流公司
|
|
|
|
+ String company = expressLogic.expressCompanyName(companyCode);
|
|
|
|
+ OrderInfo orderInfo = orderInfoService.getById(orderId);
|
|
|
|
+ if(!orderInfo.getOrderStatus().equals(OrderStatusEnum.YFH.toString())){
|
|
|
|
+ throw new RemoteServiceException("非已发货订单不可修改物流单号");
|
|
|
|
+ }
|
|
|
|
+ orderInfo.setCompanyCode(companyCode);
|
|
|
|
+ orderInfo.setCompanyName(company);
|
|
|
|
+ orderInfo.setLogisticsNo(logisticsNo);
|
|
|
|
+ orderInfo.updateById();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查看物流
|
|
|
|
+ */
|
|
|
|
+ public List<ExpressInfo> queryExpressInfo(String logisticsNo){
|
|
|
|
+ List<ExpressInfo> list = expressInfoService.lambdaQuery().eq(ExpressInfo::getLogisticsNo, logisticsNo).list();
|
|
|
|
+ if (CollectionUtil.isNotEmpty(list)){
|
|
|
|
+ return list;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|