|
@@ -0,0 +1,356 @@
|
|
|
|
+package com.caimei.service.impl;
|
|
|
|
+
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
|
+import com.caimei.mapper.OrderMapper;
|
|
|
|
+import com.caimei.mapper.OrderSubmitMapper;
|
|
|
|
+import com.caimei.model.ResponseJson;
|
|
|
|
+import com.caimei.model.po.CmPayShopRecordPo;
|
|
|
|
+import com.caimei.model.po.UserPo;
|
|
|
|
+import com.caimei.model.po.UserSearchHistoryPo;
|
|
|
|
+import com.caimei.model.vo.*;
|
|
|
|
+import com.caimei.service.OrderService;
|
|
|
|
+import com.caimei.util.MathUtil;
|
|
|
|
+import com.caimei.util.ProductUtils;
|
|
|
|
+import com.github.pagehelper.PageHelper;
|
|
|
|
+import com.github.pagehelper.PageInfo;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Description
|
|
|
|
+ *
|
|
|
|
+ * @author : plf
|
|
|
|
+ * @date : 2021/3/26
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+@Service
|
|
|
|
+public class OrderServiceImpl implements OrderService {
|
|
|
|
+ @Resource
|
|
|
|
+ private OrderMapper orderMapper;
|
|
|
|
+ @Resource
|
|
|
|
+ private OrderSubmitMapper orderSubmitMapper;
|
|
|
|
+ @Value("${caimei.oldapi}")
|
|
|
|
+ private String domain;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<PageInfo<OrderVo>> getOrderList(Integer orderState, Integer userId, Integer pageNum, Integer pageSize) {
|
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
|
+ List<OrderVo> orderList = orderMapper.findOrderList(userId, orderState);
|
|
|
|
+ getOrderData(orderList);
|
|
|
|
+ PageInfo<OrderVo> pageData = new PageInfo<>(orderList);
|
|
|
|
+ return ResponseJson.success(pageData);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 主订单下信息
|
|
|
|
+ */
|
|
|
|
+ private void getOrderData(List<OrderVo> orderList) {
|
|
|
|
+ for (OrderVo order : orderList) {
|
|
|
|
+ //111,待付待收待发
|
|
|
|
+ if ("11".equals(order.getStatus()) && "1".equals(order.getPayStatus())) {
|
|
|
|
+ order.setStatus("111");
|
|
|
|
+ }
|
|
|
|
+ //判断交易全退情况下,是否发过货,77,交易全退可以查看物流
|
|
|
|
+ List<LogisticsBatchVo> batchList = orderMapper.findLogistics(order.getOrderId());
|
|
|
|
+ if ("7".equals(order.getStatus()) && batchList != null && batchList.size() > 0) {
|
|
|
|
+ order.setStatus("77");
|
|
|
|
+ }
|
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(order.getOrderId());
|
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
|
+ List<OrderProductVo> orderProductList = orderMapper.findOrderProduct(shopOrder.getShopOrderId());
|
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
|
+ orderProduct.setProductImage(ProductUtils.getImageURL("product", orderProduct.getProductImage(), 0, domain));
|
|
|
|
+ //不含税可开票商品,单价/折后单价=税前单价+税费
|
|
|
|
+ if ("0".equals(orderProduct.getIncludedTax()) && ("1".equals(orderProduct.getInvoiceType()) || "2".equals(orderProduct.getInvoiceType()))) {
|
|
|
|
+ BigDecimal valueTax = MathUtil.div(MathUtil.mul(orderProduct.getPrice(), orderProduct.getTaxRate()), 100);
|
|
|
|
+ orderProduct.setPrice(MathUtil.add(orderProduct.getPrice(), valueTax));
|
|
|
|
+ orderProduct.setDiscountPrice(MathUtil.add(orderProduct.getPrice(), orderProduct.getAddedValueTax()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ shopOrder.setOrderProductList(orderProductList);
|
|
|
|
+ shopOrder.setShopLogo(ProductUtils.getImageURL("shopLogo", shopOrder.getShopLogo(), 0, domain));
|
|
|
|
+ }
|
|
|
|
+ //过滤运费商品
|
|
|
|
+ shopOrderList.removeIf(shopOrderVo -> shopOrderVo.getShopId() == 998);
|
|
|
|
+ order.setShopOrderList(shopOrderList);
|
|
|
|
+ //设置付款金额
|
|
|
|
+ getDiscernReceipt(order);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<Map<String, Object>> getOrderDetail(Integer orderId) {
|
|
|
|
+ Map<String, Object> map = new HashMap<>(6);
|
|
|
|
+ //收货地址
|
|
|
|
+ UserInfoVo userInfo = orderMapper.findUserInfo(orderId);
|
|
|
|
+ //订单信息,运费
|
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
|
+ if (order == null) {
|
|
|
|
+ return ResponseJson.error("该订单已删除", null);
|
|
|
|
+ }
|
|
|
|
+ order.setOrderMark("#" + order.getOrderId() + "#");
|
|
|
|
+ //111,待付待收待发
|
|
|
|
+ if ("11".equals(order.getStatus()) && "1".equals(order.getPayStatus())) {
|
|
|
|
+ order.setStatus("111");
|
|
|
|
+ }
|
|
|
|
+ //判断交易全退情况下,是否发过货,77,交易全退可以查看物流
|
|
|
|
+ List<LogisticsBatchVo> batchList = orderMapper.findLogistics(orderId);
|
|
|
|
+ if ("7".equals(order.getStatus()) && batchList != null && batchList.size() > 0) {
|
|
|
|
+ order.setStatus("77");
|
|
|
|
+ }
|
|
|
|
+ //商品信息
|
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(orderId);
|
|
|
|
+ BigDecimal expensesOfTaxation = new BigDecimal(0);
|
|
|
|
+ int returnedNumTotal = 0;
|
|
|
|
+ int actualCancelNumTotal = 0;
|
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
|
+ List<OrderProductVo> orderProductList = orderMapper.findOrderProduct(shopOrder.getShopOrderId());
|
|
|
|
+ for (OrderProductVo orderProduct : orderProductList) {
|
|
|
|
+ //运费
|
|
|
|
+ if (shopOrder.getShopId() == 998) {
|
|
|
|
+ order.setFreight(orderProduct.getPrice1());
|
|
|
|
+ }
|
|
|
|
+ //总税费
|
|
|
|
+ expensesOfTaxation = expensesOfTaxation.add(orderProduct.getTotalAddedValueTax());
|
|
|
|
+ orderProduct.setProductImage(ProductUtils.getImageURL("product", orderProduct.getProductImage(), 0, domain));
|
|
|
|
+ //已发货数量
|
|
|
|
+ orderProduct.setShipmentsNum(orderProduct.getNum() + orderProduct.getPresentNum() - orderProduct.getNotOutStore());
|
|
|
|
+ //已退货数量
|
|
|
|
+ Integer returnedNum = orderMapper.returnedPurchase(orderProduct.getShopOrderId(), orderProduct.getProductId());
|
|
|
|
+ returnedNum = null != returnedNum ? returnedNum : 0;
|
|
|
|
+ returnedNumTotal += returnedNum;
|
|
|
|
+ orderProduct.setReturnedNum(returnedNum);
|
|
|
|
+ //已取消发货数量
|
|
|
|
+ Integer actualCancelNum = orderMapper.actualCancelNum(orderProduct.getShopOrderId(), orderProduct.getProductId());
|
|
|
|
+ actualCancelNum = null != actualCancelNum ? actualCancelNum : 0;
|
|
|
|
+ actualCancelNumTotal += actualCancelNum;
|
|
|
|
+ orderProduct.setActualCancelNum(actualCancelNum);
|
|
|
|
+ //判断商品价格是否含税
|
|
|
|
+ if ("1".equals(orderProduct.getIncludedTax()) || ("0".equals(orderProduct.getIncludedTax()) && ("1".equals(orderProduct.getInvoiceType()) || "2".equals(orderProduct.getInvoiceType())))) {
|
|
|
|
+ orderProduct.setIncludedTaxFlag("2");
|
|
|
|
+ } else if (orderProduct.getIncludedTax() != null && "0".equals(orderProduct.getIncludedTax()) && "3".equals(orderProduct.getInvoiceType())) {
|
|
|
|
+ orderProduct.setIncludedTaxFlag("1");
|
|
|
|
+ } else {
|
|
|
|
+ orderProduct.setIncludedTaxFlag("3");
|
|
|
|
+ }
|
|
|
|
+ //不含税可开票商品,单价/折后单价在原基础上加上税费
|
|
|
|
+ if ("0".equals(orderProduct.getIncludedTax()) && ("1".equals(orderProduct.getInvoiceType()) || "2".equals(orderProduct.getInvoiceType()))) {
|
|
|
|
+ //计算单价的税费
|
|
|
|
+ BigDecimal valueTax = MathUtil.div(MathUtil.mul(orderProduct.getPrice(), orderProduct.getTaxRate()), 100);
|
|
|
|
+ orderProduct.setPrice(MathUtil.add(orderProduct.getPrice(), valueTax));
|
|
|
|
+ orderProduct.setDiscountPrice(MathUtil.add(orderProduct.getDiscountPrice(), orderProduct.getAddedValueTax()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ shopOrder.setOrderProductList(orderProductList);
|
|
|
|
+ shopOrder.setShopLogo(ProductUtils.getImageURL("shopLogo", shopOrder.getShopLogo(), 0, domain));
|
|
|
|
+ }
|
|
|
|
+ order.setExpensesOfTaxation(expensesOfTaxation);
|
|
|
|
+ order.setReturnedNum(returnedNumTotal);
|
|
|
|
+ order.setActualCancelNum(actualCancelNumTotal);
|
|
|
|
+ //删除运费商品
|
|
|
|
+ shopOrderList.removeIf(student -> 998 == student.getShopId());
|
|
|
|
+ List<DiscernReceiptVo> discernReceiptList = getDiscernReceipt(order);
|
|
|
|
+ //退款总金额
|
|
|
|
+ BigDecimal returnedPurchaseFee = orderMapper.findReturnedPurchase(order.getOrderId());
|
|
|
|
+ order.setReturnedPurchaseFee(returnedPurchaseFee);
|
|
|
|
+ map.put("order", order);
|
|
|
|
+ map.put("userInfo", userInfo);
|
|
|
|
+ map.put("shopOrderList", shopOrderList);
|
|
|
|
+ map.put("discernReceiptList", discernReceiptList);
|
|
|
|
+ return ResponseJson.success(map);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<List<LogisticsBatchVo>> logistics(Integer orderId) {
|
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
|
+ if (order == null) {
|
|
|
|
+ return ResponseJson.error("订单已删除", null);
|
|
|
|
+ }
|
|
|
|
+ List<LogisticsBatchVo> batchList = orderMapper.findLogistics(orderId);
|
|
|
|
+ for (LogisticsBatchVo batch : batchList) {
|
|
|
|
+ List<ShopOrderVo> shopOrderList = orderMapper.findAllShopOrder(orderId);
|
|
|
|
+ for (ShopOrderVo shopOrder : shopOrderList) {
|
|
|
|
+ List<LogisticsRecordVo> logisticsRecordList = orderMapper.findLogisticsRecord(shopOrder.getShopOrderId(), batch.getId());
|
|
|
|
+ for (LogisticsRecordVo logisticsRecord : logisticsRecordList) {
|
|
|
|
+ logisticsRecord.setImage(ProductUtils.getImageURL("product", logisticsRecord.getImage(), 0, domain));
|
|
|
|
+ }
|
|
|
|
+ shopOrder.setLogisticsRecordList(logisticsRecordList);
|
|
|
|
+ shopOrder.setShopLogo(ProductUtils.getImageURL("shopLogo", shopOrder.getShopLogo(), 0, domain));
|
|
|
|
+ }
|
|
|
|
+ //物流信息
|
|
|
|
+ List<LogisticsInformationVo> logisticsInfoList = orderMapper.findLogisticsInfo(batch.getId());
|
|
|
|
+ for (LogisticsInformationVo logisticsInfo : logisticsInfoList) {
|
|
|
|
+ List<RouterVo> routers = JSONArray.parseArray(logisticsInfo.getInfo(), RouterVo.class);
|
|
|
|
+ logisticsInfo.setRouterList(routers);
|
|
|
|
+ }
|
|
|
|
+ batch.setLogisticsInformationList(logisticsInfoList);
|
|
|
|
+ batch.setShopOrderList(shopOrderList);
|
|
|
|
+ }
|
|
|
|
+ return ResponseJson.success(batchList);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<String> affirmCargo(Integer orderId) {
|
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
|
+ if (order == null) {
|
|
|
|
+ return ResponseJson.error("订单不存在", null);
|
|
|
|
+ }
|
|
|
|
+ if ("33".equals(order.getStatus()) && "3".equals(order.getPayStatus())) {
|
|
|
|
+ //已付款供应商,订单完成
|
|
|
|
+ order.setStatus("5");
|
|
|
|
+ orderMapper.updateOrderStatus(order);
|
|
|
|
+ orderMapper.updateLogisticsBatch(orderId);
|
|
|
|
+ } else if ("33".equals(order.getStatus())) {
|
|
|
|
+ //交易完成
|
|
|
|
+ order.setStatus("4");
|
|
|
|
+ orderMapper.updateOrderStatus(order);
|
|
|
|
+ orderMapper.updateLogisticsBatch(orderId);
|
|
|
|
+ } else {
|
|
|
|
+ return ResponseJson.error("订单异常", null);
|
|
|
|
+ }
|
|
|
|
+ return ResponseJson.success("");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
+ public ResponseJson<String> deleteOrder(Integer orderId) {
|
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
|
+ if (order == null) {
|
|
|
|
+ return ResponseJson.error("订单不存在", null);
|
|
|
|
+ }
|
|
|
|
+ if (!("6".equals(order.getStatus()))) {
|
|
|
|
+ return ResponseJson.error("订单异常", null);
|
|
|
|
+ }
|
|
|
|
+ orderMapper.deleteOrder(orderId);
|
|
|
|
+ //逻辑删除子订单
|
|
|
|
+ orderMapper.deleteShopOrder(orderId);
|
|
|
|
+ //逻辑删除收款记录
|
|
|
|
+ List<DiscernReceiptVo> discernReceipt = orderMapper.findDiscernReceipt(orderId);
|
|
|
|
+ if (discernReceipt != null && discernReceipt.size() > 0) {
|
|
|
|
+ orderMapper.deleteReceiptOrderRelation(orderId);
|
|
|
|
+ for (DiscernReceiptVo receipt : discernReceipt) {
|
|
|
|
+ orderMapper.deleteDiscernReceipt(receipt.getId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ String[] shopOrderIds = order.getShopOrderIds().split(",");
|
|
|
|
+ //逻辑删除付款记录
|
|
|
|
+ for (String shopOrderId : shopOrderIds) {
|
|
|
|
+ if (StringUtils.isNotBlank(shopOrderId)) {
|
|
|
|
+ List<CmPayShopRecordPo> payShopRecordList = orderMapper.findPayShopRecord(Integer.valueOf(shopOrderId));
|
|
|
|
+ if (payShopRecordList != null && payShopRecordList.size() > 0) {
|
|
|
|
+ orderMapper.deletePayShopRecord(Integer.valueOf(shopOrderId));
|
|
|
|
+ for (CmPayShopRecordPo payShopRecord : payShopRecordList) {
|
|
|
|
+ orderMapper.updatePayShop(payShopRecord.getPayShopID());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return ResponseJson.success(null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<String> cancelOrder(Integer orderId) {
|
|
|
|
+ OrderVo order = orderMapper.findOrder(orderId);
|
|
|
|
+ if (order == null) {
|
|
|
|
+ return ResponseJson.error("订单不存在", null);
|
|
|
|
+ }
|
|
|
|
+ if (!("11".equals(order.getStatus()) || "0".equals(order.getStatus()))) {
|
|
|
|
+ return ResponseJson.error("订单异常", null);
|
|
|
|
+ }
|
|
|
|
+ order.setStatus("6");
|
|
|
|
+ orderMapper.cancelOrder(orderId);
|
|
|
|
+ return ResponseJson.success(null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<PageInfo<OrderVo>> searchOrder(String searchWord, Integer userId, Integer pageNum, Integer pageSize) {
|
|
|
|
+ //保存并删除大于10条的历史记录
|
|
|
|
+ UserSearchHistoryPo historyRecord = new UserSearchHistoryPo();
|
|
|
|
+ historyRecord.setUserId(userId.longValue());
|
|
|
|
+ historyRecord.setSearchDate(new Date());
|
|
|
|
+ historyRecord.setSearchWord(searchWord);
|
|
|
|
+ historyRecord.setDelFlag("0");
|
|
|
|
+ Long recordId = orderMapper.getHistoryIdByWord(userId, searchWord);
|
|
|
|
+ if (recordId != null && recordId > 0L) {
|
|
|
|
+ historyRecord.setId(recordId);
|
|
|
|
+ orderMapper.updateHistoryById(historyRecord);
|
|
|
|
+ } else {
|
|
|
|
+ orderMapper.insertHistory(historyRecord);
|
|
|
|
+ }
|
|
|
|
+ orderMapper.deleteHistoryByUserId(userId);
|
|
|
|
+
|
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
|
+ List<OrderVo> orderList = orderMapper.searchOrder(searchWord, userId);
|
|
|
|
+
|
|
|
|
+ //获取主订单数据
|
|
|
|
+ getOrderData(orderList);
|
|
|
|
+
|
|
|
|
+ PageInfo<OrderVo> pageData = new PageInfo<>(orderList);
|
|
|
|
+ return ResponseJson.success(pageData);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<List<String>> getSearchHistory(Integer userId) {
|
|
|
|
+ List<String> searchHistoryList = orderMapper.getSearchHistoryList(userId);
|
|
|
|
+ return ResponseJson.success(searchHistoryList);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<String> deleteSearchHistory(Integer userId) {
|
|
|
|
+ orderMapper.deleteSearchHistory(userId);
|
|
|
|
+ return ResponseJson.success(null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<Map<String, Object>> orderTotal(Integer userId) {
|
|
|
|
+ Map<String, Object> map = new HashMap<>(5);
|
|
|
|
+ //待付款数量
|
|
|
|
+ Integer paymentCount = orderMapper.findOrderCount(userId, 1);
|
|
|
|
+ paymentCount = paymentCount == null ? 0 : paymentCount;
|
|
|
|
+ map.put("paymentCount", paymentCount);
|
|
|
|
+ //待发货数量
|
|
|
|
+ Integer waitShipmentsCount = orderMapper.findOrderCount(userId, 2);
|
|
|
|
+ waitShipmentsCount = waitShipmentsCount == null ? 0 : waitShipmentsCount;
|
|
|
|
+ map.put("waitShipmentsCount", waitShipmentsCount);
|
|
|
|
+ //已发货数量
|
|
|
|
+ Integer shipmentsCount = orderMapper.findOrderCount(userId, 3);
|
|
|
|
+ shipmentsCount = shipmentsCount == null ? 0 : shipmentsCount;
|
|
|
|
+ map.put("shipmentsCount", shipmentsCount);
|
|
|
|
+ //退货款数量
|
|
|
|
+ Integer salesReturnCount = orderMapper.findOrderCount(userId, 4);
|
|
|
|
+ salesReturnCount = salesReturnCount == null ? 0 : salesReturnCount;
|
|
|
|
+ map.put("salesReturnCount", salesReturnCount);
|
|
|
|
+ return ResponseJson.success(map);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 支付金额,待付金额
|
|
|
|
+ */
|
|
|
|
+ public List<DiscernReceiptVo> getDiscernReceipt(OrderVo order) {
|
|
|
|
+ //支付记录
|
|
|
|
+ List<DiscernReceiptVo> discernReceiptList = orderMapper.findDiscernReceipt(order.getOrderId());
|
|
|
|
+ BigDecimal receiptAmount = BigDecimal.ZERO;
|
|
|
|
+ //订单款
|
|
|
|
+ if (discernReceiptList != null && discernReceiptList.size() > 0) {
|
|
|
|
+ for (DiscernReceiptVo discernReceipt : discernReceiptList) {
|
|
|
|
+ receiptAmount = receiptAmount.add(discernReceipt.getAssociateAmount());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //待付总金额
|
|
|
|
+ order.setPendingPayments(MathUtil.sub(order.getPayableAmount(), receiptAmount));
|
|
|
|
+ //支付总金额
|
|
|
|
+ order.setReceiptAmount(receiptAmount);
|
|
|
|
+ return discernReceiptList;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|