From e8f8d89a4248cd4d0a7138cc2e5a36ea9b136699 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Tue, 11 Feb 2025 17:03:01 +0800
Subject: [PATCH] feat(mall): 添加订单一键发货和取消发货功能
---
src/main/resources/templates/index.html | 2
src/test/java/cc/mrbird/febs/AgentTest.java | 119 -------
src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java | 5
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java | 108 +++++++
src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java | 4
src/main/java/com/best/javaSdk/ClientService.java | 17 +
src/main/java/com/best/javaSdk/ClientParamEnum.java | 34 ++
src/main/java/com/best/javaSdk/ClientServiceImpl.java | 63 ++++
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java | 6
src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java | 24 +
src/main/java/com/best/javaSdk/ClientParamService.java | 39 ++
src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java | 74 ++--
src/main/resources/templates/febs/views/modules/order/orderList.html | 201 ++++++++++++++
src/main/resources/templates/febs/views/modules/system/sender.html | 97 ++++++
14 files changed, 638 insertions(+), 155 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
index 4f00b80..e9cf56c 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -1,11 +1,15 @@
package cc.mrbird.febs.common.enumerates;
-import lombok.Data;
import lombok.Getter;
@Getter
public enum DataDictionaryEnum {
+ // 发货人
+ SENDER_NAME("SENDER_SET", "NAME"),
+ SENDER_MOBILE("SENDER_SET", "MOBILE"),
+ SENDER_ADDRESS("SENDER_SET", "ADDRESS"),
+
// 发票的通知回调路径
FP_CALLBACK_URL("FP_CALLBACK_URL", "FP_CALLBACK_URL"),
//微信订阅模板ID,
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java
index 437def5..efb8e51 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallOrderController.java
@@ -135,6 +135,30 @@
}
/**
+ * 订单列表-取消发货
+ *
+ * @param id
+ * @return
+ */
+ @GetMapping("cancelDeliver/{id}")
+ @ControllerEndpoint(operation = "订单列表-取消发货", exceptionMessage = "操作失败")
+ public FebsResponse cancelDeliver(@NotNull(message = "{required}") @PathVariable Long id) {
+ return adminMallOrderService.cancelDeliver(id);
+ }
+
+ /**
+ * 订单列表-一键发货
+ *
+ * @param id
+ * @return
+ */
+ @GetMapping("deliverPdfGoods/{id}")
+ @ControllerEndpoint(operation = "订单列表-一键发货", exceptionMessage = "操作失败")
+ public FebsResponse deliverPdfGoods(@NotNull(message = "{required}") @PathVariable Long id) {
+ return adminMallOrderService.deliverPdfGoods(id);
+ }
+
+ /**
* 订单退款-列表
*
* @param mallOrderRefundDto
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
index 93e3249..318b86c 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewSystemController.java
@@ -124,4 +124,9 @@
public String kefu() {
return FebsUtil.view("modules/system/kefu");
}
+
+ @GetMapping("sender")
+ public String sender() {
+ return FebsUtil.view("modules/system/sender");
+ }
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java
index bae0b6e..dc50e64 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallOrderService.java
@@ -76,4 +76,8 @@
IPage<AdminGoodsStatisticsVo> goodsStatistics(MallOrderItem mallOrderItem, QueryRequest request);
FebsResponse deliverGoodsUpdate(DeliverGoodsDto deliverGoodsDto);
+
+ FebsResponse deliverPdfGoods(Long id);
+
+ FebsResponse cancelDeliver(Long id);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java
index 0f87fc5..2f6a777 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallOrderService.java
@@ -2,10 +2,8 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
-import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
-import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
-import cc.mrbird.febs.common.enumerates.OrderDeliveryStateEnum;
-import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.enumerates.*;
+import cc.mrbird.febs.common.utils.ValidateEntityUtils;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -19,12 +17,19 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.best.javaSdk.ClientParamEnum;
+import com.best.javaSdk.ClientParamService;
+import com.best.javaSdk.kdCancelOrderNotify.request.KdCancelOrderNotifyReq;
+import com.best.javaSdk.kdCancelOrderNotify.response.KdCancelOrderNotifyRsp;
+import com.best.javaSdk.kdCreateWaybillOrderPdfNotify.request.*;
+import com.best.javaSdk.kdCreateWaybillOrderPdfNotify.response.KdCreateWaybillOrderPdfNotifyRsp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.List;
@Slf4j
@@ -490,6 +495,101 @@
}
@Override
+ public FebsResponse deliverPdfGoods(Long id) {
+ MallOrderInfo mallOrderInfo = ValidateEntityUtils.ensureColumnReturnEntity(id, MallOrderInfo::getId, mallOrderInfoMapper::selectOne, "订单不存在");
+ ValidateEntityUtils.ensureEqual(mallOrderInfo.getStatus(), OrderStatusEnum.WAIT_SHIPPING.getValue(), "订单不是待发货状态");
+ KdCreateWaybillOrderPdfNotifyReq kdCreateWaybillOrderPdfNotifyReq = new KdCreateWaybillOrderPdfNotifyReq();
+
+ MallMember mallMember = ValidateEntityUtils.ensureColumnReturnEntity(mallOrderInfo.getMemberId(), MallMember::getId, mallMemberMapper::selectOne, "会员不存在");
+
+ kdCreateWaybillOrderPdfNotifyReq.setTxLogisticId(mallOrderInfo.getOrderNo());
+ kdCreateWaybillOrderPdfNotifyReq.setServiceType("1");//服务类型(0-线下下单,1-线上下单)
+ kdCreateWaybillOrderPdfNotifyReq.setSpecial("1");
+
+ //发货人信息
+ Sender sender = new Sender();
+ sender.setName(dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.SENDER_NAME.getType(),
+ DataDictionaryEnum.SENDER_NAME.getCode()
+ ).getValue());
+ sender.setMobile(dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.SENDER_MOBILE.getType(),
+ DataDictionaryEnum.SENDER_MOBILE.getCode()
+ ).getValue());
+ sender.setAddress(dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.SENDER_ADDRESS.getType(),
+ DataDictionaryEnum.SENDER_ADDRESS.getCode()
+ ).getValue());
+ kdCreateWaybillOrderPdfNotifyReq.setSender(sender);
+
+ //收件人
+ Receiver receiver = new Receiver();
+ receiver.setName(mallMember.getRealName());
+ receiver.setMobile(mallMember.getPhone());
+ receiver.setAddress(mallOrderInfo.getAddress());
+ kdCreateWaybillOrderPdfNotifyReq.setReceiver(receiver);
+
+ //包裹
+ Items items = new Items();
+ ArrayList<Item> itemList = new ArrayList<>();
+ List<MallOrderItem> mallOrderItemList = ValidateEntityUtils
+ .ensureColumnReturnEntityList(id, MallOrderItem::getOrderId, mallOrderItemMapper::selectList, "订单不存在");
+ StringBuffer itemName = new StringBuffer();
+ itemName.append("商品:");
+ mallOrderItemList.forEach(mallOrderItem -> {
+ itemName.append(mallOrderItem.getGoodsName()+"-"+mallOrderItem.getSkuName());
+ });
+ Item item = new Item();
+ item.setItemName(itemName.toString());
+ itemList.add(item);
+ items.setItem(itemList);
+ kdCreateWaybillOrderPdfNotifyReq.setItems(items);
+
+ kdCreateWaybillOrderPdfNotifyReq.setPiece(1);
+ KdCreateWaybillOrderPdfNotifyRsp pdfOrder = ClientParamService.getInstance(ClientParamEnum.TEST.name()).createPdfOrder(kdCreateWaybillOrderPdfNotifyReq);
+
+ ValidateEntityUtils.ensureEqual(pdfOrder.getResult(), true, "一键发货失败,创建PDF电子面单异常");
+ //更新发货状态
+ mallOrderInfoMapper.updateOrderStateAndDeliveryState(
+ mallOrderInfo.getId(),
+ OrderStatusEnum.WAIT_FINISH.getValue(),
+ OrderDeliveryStateEnum.DELIVERY_ING.getValue());
+
+ MallExpressInfo mallExpressInfo = new MallExpressInfo();
+ mallExpressInfo.setMemberId(mallOrderInfo.getMemberId());
+ mallExpressInfo.setOrderId(mallOrderInfo.getId());
+ mallExpressInfo.setExpressNo(pdfOrder.getMailNo());
+ mallExpressInfo.setExpressCom("Best Logistic");
+ mallExpressInfo.setExpressCode("Best Logistic");
+ mallExpressInfoMapper.insert(mallExpressInfo);
+
+ return new FebsResponse().success().data(pdfOrder);
+ }
+
+ @Override
+ public FebsResponse cancelDeliver(Long id) {
+
+ MallOrderInfo mallOrderInfo = ValidateEntityUtils.ensureColumnReturnEntity(id, MallOrderInfo::getId, mallOrderInfoMapper::selectOne, "订单不存在");
+ ValidateEntityUtils.ensureEqual(mallOrderInfo.getStatus(), OrderStatusEnum.WAIT_FINISH.getValue(), "订单不是待收货状态");
+
+ KdCancelOrderNotifyReq kdCancelOrderNotifyReq = new KdCancelOrderNotifyReq();
+ kdCancelOrderNotifyReq.setTxLogisticId(mallOrderInfo.getOrderNo());
+ kdCancelOrderNotifyReq.setReason("Don't want to buy");
+ KdCancelOrderNotifyRsp kdCancelOrderNotifyRsp = ClientParamService.getInstance(ClientParamEnum.TEST.name()).cancelOrder(kdCancelOrderNotifyReq);
+ ValidateEntityUtils.ensureEqual(kdCancelOrderNotifyRsp.getResult(), true, "取消发货失败");
+
+ //更新发货状态
+ mallOrderInfoMapper.updateOrderStateAndDeliveryState(
+ mallOrderInfo.getId(),
+ OrderStatusEnum.WAIT_SHIPPING.getValue(),
+ OrderDeliveryStateEnum.DELIVERY_WAIT.getValue());
+
+ List<MallExpressInfo> mallExpressInfoList = ValidateEntityUtils.ensureColumnReturnEntityList(mallOrderInfo.getId(), MallExpressInfo::getOrderId, mallExpressInfoMapper::selectList, "未查询到物流信息");
+ mallExpressInfoList.forEach(mallExpressInfo -> mallExpressInfoMapper.deleteById(mallExpressInfo.getId()));
+ return new FebsResponse().success().message("取消发货成功,请重新发货");
+ }
+
+ @Override
public void deliverGoodsByOrderNo(DeliverGoodsDto deliverGoodsDto) {
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectByOrderNo(deliverGoodsDto.getOrderNo());
if (mallOrderInfo == null) {
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
index b890d8d..d70d969 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
@@ -11,15 +11,13 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
-import com.best.javaSdk.Client;
-import com.best.javaSdk.kdTraceQuery.request.KdTraceQueryReq;
-import com.best.javaSdk.kdTraceQuery.request.MailNos;
+import com.best.javaSdk.ClientParamEnum;
+import com.best.javaSdk.ClientParamService;
import com.best.javaSdk.kdTraceQuery.response.KdTraceQueryRsp;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -107,39 +105,43 @@
dataDictionaryCustomMapper.insert(dic);
}
+// @Override
+// public KdTraceQueryRsp checkTraceInfo(ApiCheckTraceInfoDto checkTraceInfoDto) {
+// /**
+// * 正式环境
+// * MY_LEADING 生产环境参数
+// * partnerID : MY_LEADING
+// * partnerKey : ER5DFRT320D4ed6FAFs3G410Fs977
+// * Endpoint :http://sgp-seaedi.800best.com/Malaysia/kdapi/api/process
+// */
+// String url = "http://sgp-seaedi.800best.com/Malaysia/kdapi/api/process";
+// String partnerID = "MY_LEADING";
+// String partnerKey = "ER5DFRT320D4ed6FAFs3G410Fs977";
+// String format = "JSON";
+// /**
+// * 测试环境
+// * 测试物流编号 66660451238000
+// */
+//// String url = "http://sea-edi-hxtest.800best.com/Malaysia/kdapi/api/process";
+//// String partnerID = "M_TEST";
+//// String partnerKey = "TEST12345";
+//// String format = "JSON";
+//
+// Client client = new Client(url, partnerID, partnerKey, format);
+//
+// KdTraceQueryReq tdTraceQueryReq = new KdTraceQueryReq();
+// MailNos mailNos = new MailNos();
+// List<String> mailNo = new ArrayList<>();
+// mailNo.add(checkTraceInfoDto.getTraceNo());
+// mailNos.setMailNo(mailNo);
+// tdTraceQueryReq.setMailNos(mailNos);
+// tdTraceQueryReq.setLangType("zh-CN");
+//
+// KdTraceQueryRsp kdTraceQueryRsp = client.executed(tdTraceQueryReq);
+// return kdTraceQueryRsp;
+// }
@Override
public KdTraceQueryRsp checkTraceInfo(ApiCheckTraceInfoDto checkTraceInfoDto) {
- /**
- * 正式环境
- * MY_LEADING 生产环境参数
- * partnerID : MY_LEADING
- * partnerKey : ER5DFRT320D4ed6FAFs3G410Fs977
- * Endpoint :http://sgp-seaedi.800best.com/Malaysia/kdapi/api/proces
- */
- String url = "http://sgp-seaedi.800best.com/Malaysia/kdapi/api/process";
- String partnerID = "MY_LEADING";
- String partnerKey = "ER5DFRT320D4ed6FAFs3G410Fs977";
- String format = "JSON";
- /**
- * 测试环境
- * 测试物流编号 66660451238000
- */
-// String url = "http://sea-edi-hxtest.800best.com/Malaysia/kdapi/api/process";
-// String partnerID = "M_TEST";
-// String partnerKey = "TEST12345";
-// String format = "JSON";
-
- Client client = new Client(url, partnerID, partnerKey, format);
-
- KdTraceQueryReq tdTraceQueryReq = new KdTraceQueryReq();
- MailNos mailNos = new MailNos();
- List<String> mailNo = new ArrayList<>();
- mailNo.add(checkTraceInfoDto.getTraceNo());
- mailNos.setMailNo(mailNo);
- tdTraceQueryReq.setMailNos(mailNos);
- tdTraceQueryReq.setLangType("zh-CN");
-
- KdTraceQueryRsp kdTraceQueryRsp = client.executed(tdTraceQueryReq);
- return kdTraceQueryRsp;
+ return ClientParamService.getInstance(ClientParamEnum.PRD.name()).checkTraceInfo(checkTraceInfoDto);
}
}
diff --git a/src/main/java/com/best/javaSdk/ClientParamEnum.java b/src/main/java/com/best/javaSdk/ClientParamEnum.java
new file mode 100644
index 0000000..5303819
--- /dev/null
+++ b/src/main/java/com/best/javaSdk/ClientParamEnum.java
@@ -0,0 +1,34 @@
+package com.best.javaSdk;
+
+import lombok.Getter;
+
+@Getter
+public enum ClientParamEnum {
+
+ TEST(
+ "http://sea-edi-hxtest.800best.com/Malaysia/kdapi/api/process",
+ "M_TEST",
+ "TEST12345",
+ "JSON"
+ ),
+
+ PRD(
+ "http://sgp-seaedi.800best.com/Malaysia/kdapi/api/process",
+ "MY_LEADING",
+ "ER5DFRT320D4ed6FAFs3G410Fs977",
+ "JSON"
+ );
+
+ private String url;
+ private String partnerID;
+ private String partnerKey;
+ private String messageFormat;
+
+ ClientParamEnum(String url, String partnerID, String partnerKey, String messageFormat) {
+ this.url = url;
+ this.partnerID = partnerID;
+ this.partnerKey = partnerKey;
+ this.messageFormat = messageFormat;
+ }
+
+}
diff --git a/src/main/java/com/best/javaSdk/ClientParamService.java b/src/main/java/com/best/javaSdk/ClientParamService.java
new file mode 100644
index 0000000..b8b18ad
--- /dev/null
+++ b/src/main/java/com/best/javaSdk/ClientParamService.java
@@ -0,0 +1,39 @@
+package com.best.javaSdk;
+
+import cc.mrbird.febs.common.exception.FebsException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class ClientParamService {
+
+ private final static Map<String, ClientServiceImpl> client_map = new HashMap<>();
+
+ static {
+ for (ClientParamEnum clientParamEnum : ClientParamEnum.values()) {
+ client_map.put(
+ clientParamEnum.name(),
+ new ClientServiceImpl(
+ clientParamEnum.getUrl(),
+ clientParamEnum.getPartnerID(),
+ clientParamEnum.getPartnerKey(),
+ clientParamEnum.getMessageFormat()));
+ }
+ }
+
+ private ClientParamService() {
+ }
+
+ public final static ClientParamService INSTANCE = new ClientParamService();
+
+ public static ClientService getInstance(String type) {
+ ClientServiceImpl clientService = client_map.get(type);
+ if (clientService == null) {
+ throw new FebsException("参数错误");
+ }
+
+ return clientService;
+ }
+}
diff --git a/src/main/java/com/best/javaSdk/ClientService.java b/src/main/java/com/best/javaSdk/ClientService.java
new file mode 100644
index 0000000..62fafdb
--- /dev/null
+++ b/src/main/java/com/best/javaSdk/ClientService.java
@@ -0,0 +1,17 @@
+package com.best.javaSdk;
+
+import cc.mrbird.febs.mall.dto.ApiCheckTraceInfoDto;
+import com.best.javaSdk.kdCancelOrderNotify.request.KdCancelOrderNotifyReq;
+import com.best.javaSdk.kdCancelOrderNotify.response.KdCancelOrderNotifyRsp;
+import com.best.javaSdk.kdCreateWaybillOrderPdfNotify.request.KdCreateWaybillOrderPdfNotifyReq;
+import com.best.javaSdk.kdCreateWaybillOrderPdfNotify.response.KdCreateWaybillOrderPdfNotifyRsp;
+import com.best.javaSdk.kdTraceQuery.response.KdTraceQueryRsp;
+
+public interface ClientService {
+
+ KdTraceQueryRsp checkTraceInfo(ApiCheckTraceInfoDto checkTraceInfoDto);
+
+ KdCreateWaybillOrderPdfNotifyRsp createPdfOrder(KdCreateWaybillOrderPdfNotifyReq kdCreateWaybillOrderPdfNotifyReq);
+
+ KdCancelOrderNotifyRsp cancelOrder(KdCancelOrderNotifyReq kdCancelOrderNotifyReq);
+}
diff --git a/src/main/java/com/best/javaSdk/ClientServiceImpl.java b/src/main/java/com/best/javaSdk/ClientServiceImpl.java
new file mode 100644
index 0000000..82d195d
--- /dev/null
+++ b/src/main/java/com/best/javaSdk/ClientServiceImpl.java
@@ -0,0 +1,63 @@
+package com.best.javaSdk;
+
+import cc.mrbird.febs.mall.dto.ApiCheckTraceInfoDto;
+import cn.hutool.json.JSONUtil;
+import com.best.javaSdk.kdCancelOrderNotify.request.KdCancelOrderNotifyReq;
+import com.best.javaSdk.kdCancelOrderNotify.response.KdCancelOrderNotifyRsp;
+import com.best.javaSdk.kdCreateWaybillOrderPdfNotify.request.KdCreateWaybillOrderPdfNotifyReq;
+import com.best.javaSdk.kdCreateWaybillOrderPdfNotify.response.KdCreateWaybillOrderPdfNotifyRsp;
+import com.best.javaSdk.kdTraceQuery.request.KdTraceQueryReq;
+import com.best.javaSdk.kdTraceQuery.request.MailNos;
+import com.best.javaSdk.kdTraceQuery.response.KdTraceQueryRsp;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+public class ClientServiceImpl implements ClientService{
+
+ private Client client;
+ private String url;
+ private String partnerID;
+ private String partnerKey;
+ private String messageFormat;
+
+ public ClientServiceImpl(String url, String partnerID, String partnerKey, String messageFormat) {
+ this.url = url;
+ this.partnerID = partnerID;
+ this.partnerKey = partnerKey;
+ this.messageFormat = messageFormat;
+
+ client = new Client(url, partnerID, partnerKey, messageFormat);
+ }
+
+ @Override
+ public KdTraceQueryRsp checkTraceInfo(ApiCheckTraceInfoDto checkTraceInfoDto) {
+ KdTraceQueryReq tdTraceQueryReq = new KdTraceQueryReq();
+ MailNos mailNos = new MailNos();
+ List<String> mailNo = new ArrayList<>();
+ mailNo.add(checkTraceInfoDto.getTraceNo());
+ mailNos.setMailNo(mailNo);
+ tdTraceQueryReq.setMailNos(mailNos);
+ tdTraceQueryReq.setLangType("zh-CN");
+ KdTraceQueryRsp kdTraceQueryRsp = client.executed(tdTraceQueryReq);
+ return kdTraceQueryRsp;
+ }
+
+ @Override
+ public KdCreateWaybillOrderPdfNotifyRsp createPdfOrder(KdCreateWaybillOrderPdfNotifyReq kdCreateWaybillOrderPdfNotifyReq) {
+ KdCreateWaybillOrderPdfNotifyRsp executed = client.executed(kdCreateWaybillOrderPdfNotifyReq);
+ log.info("executed:{}", JSONUtil.parseObj(executed));
+ return executed;
+ }
+
+ @Override
+ public KdCancelOrderNotifyRsp cancelOrder(KdCancelOrderNotifyReq kdCancelOrderNotifyReq) {
+ KdCancelOrderNotifyRsp executed = client.executed(kdCancelOrderNotifyReq);
+ log.info("executed:{}", JSONUtil.parseObj(executed));
+ return executed;
+ }
+
+
+}
diff --git a/src/main/resources/templates/febs/views/modules/order/orderList.html b/src/main/resources/templates/febs/views/modules/order/orderList.html
index c2dbb7e..ee8d91e 100644
--- a/src/main/resources/templates/febs/views/modules/order/orderList.html
+++ b/src/main/resources/templates/febs/views/modules/order/orderList.html
@@ -356,6 +356,16 @@
cancelOrder(data.id);
});
}
+ if (layEvent === 'deliverPdfGoods') {
+ febs.modal.confirm('一键发货', '确认一键发货?', function () {
+ deliverPdfGoods(data.id);
+ });
+ }
+ if (layEvent === 'cancelDeliver') {
+ febs.modal.confirm('取消发货', '确认取消发货?', function () {
+ cancelDeliver(data.id);
+ });
+ }
if (layEvent === 'seePayImage') {
var t = $view.find('#seePayImage'+data.id+'');
//页面层
@@ -373,12 +383,195 @@
}
});
+ function cancelDeliver(id) {
+ febs.get(ctx + 'admin/order/cancelDeliver/' + id, null, function (data) {
+ febs.alert.success(data.message);
+ $query.click();
+ });
+ }
+
function cancelOrder(id) {
febs.get(ctx + 'admin/order/cancelOrder/' + id, null, function () {
febs.alert.success('操作成功');
$query.click();
});
}
+
+ function deliverPdfGoods(id) {
+ febs.get(ctx + 'admin/order/deliverPdfGoods/' + id, null, function (e) {
+ if (e.code == 200) {
+ // 创建弹层容器
+ const content = `
+ <div style="position:relative;min-height:500px">
+ <div id="pdfContainer" style="margin:20px auto;max-width:800px"></div>
+ <div class="layui-form" style="text-align:center;margin-top:20px">
+ <button class="layui-btn layui-btn-normal" onclick="printPdf()">打印</button>
+ </div>
+ </div>
+ `;
+
+ // 显示弹层
+ const index = layer.open({
+ type: 1,
+ title: "电子面单",
+ content: content,
+ area: ['90%', '90%'],
+ success: function() {
+ // 渲染PDF
+ renderPdf(e.data.pdfStream);
+ }
+ });
+ // 存储当前PDF数据
+ window.currentPDF = e.data.pdfStream;
+ } else {
+ febs.alert.warn(e.message);
+ }
+ });
+ $query.click();
+ }
+
+ // PDF渲染函数
+ function renderPdf(base64Data) {
+ // 清理容器
+ const container = document.getElementById('pdfContainer');
+ container.innerHTML = '';
+
+ // Base64转Blob
+ const byteCharacters = atob(base64Data);
+ const byteNumbers = new Array(byteCharacters.length);
+ for (let i = 0; i < byteCharacters.length; i++) {
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
+ }
+ const byteArray = new Uint8Array(byteNumbers);
+ const blob = new Blob([byteArray], {type: 'application/pdf'});
+
+ // 生成临时URL
+ const url = URL.createObjectURL(blob);
+
+ // 使用PDF.js渲染
+ pdfjsLib.getDocument(url).promise.then(pdf => {
+ // 循环渲染所有页面
+ for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
+ pdf.getPage(pageNum).then(page => {
+ const scale = 1.5;
+ const viewport = page.getViewport({scale: scale});
+ const canvas = document.createElement('canvas');
+ const context = canvas.getContext('2d');
+ canvas.height = viewport.height;
+ canvas.width = viewport.width;
+
+ // 创建页面容器
+ const pageDiv = document.createElement('div');
+ pageDiv.className = 'pdf-page';
+ pageDiv.style.margin = '10px 0';
+ container.appendChild(pageDiv);
+
+ // 渲染到Canvas
+ page.render({
+ canvasContext: context,
+ viewport: viewport
+ }).promise.then(() => {
+ pageDiv.appendChild(canvas);
+ });
+ });
+ }
+ });
+ }
+
+ // 打印函数
+ window.printPdf = function() {
+ let base64Image = window.currentPDF;
+ const printWindow = window.open('', '_blank');
+ printWindow.document.write(`
+ <html>
+ <head>
+ <title>电子面单打印</title>
+ <style>
+ body { margin: 0; padding: 20px }
+ canvas {
+ width: 100%!important;
+ height: auto!important;
+ page-break-after: always;
+ }
+ </style>
+ </head>
+ <body>
+ <iframe src="data:application/pdf;base64,`+base64Image+`" width="100%" height="100%"></iframe>
+ </body>
+ </html>
+ `);
+ printWindow.document.close();
+ printWindow.onload = function() {
+ printWindow.print();
+ printWindow.close();
+ }
+ }
+
+ // function deliverPdfGoods(id) {
+ // febs.get(ctx + 'admin/order/deliverPdfGoods/' + id, null, function (e) {
+ // if(e.code == 200){
+ // console.info(e.data);
+ // console.info(e.data.pdfStream);
+ // console.info(e.data.result);
+ // layer.open({
+ // type: 1,
+ // title: "电子面单",
+ // skin: 'layui-layer-rim', //加上边框
+ // area: ['100%', '100%'], //宽高
+ // shadeClose: true, //开启遮罩关闭
+ // end: function (index, layero) {
+ // return false;
+ // },
+ // content: '<div class="layui-card-body" id="pdfViewer"></div>'
+ // });
+ // if(e.data.pdfStream === null){
+ //
+ // renderPdf(e.data.pdfStreamList);
+ // }
+ // renderPdf(e.data.pdfStream);
+ // }else{
+ // febs.alert.warn(e.message);
+ // }
+ // $query.click();
+ // });
+ // }
+
+ // 渲染 PDF 到页面
+ // function renderPdf(base64Data) {
+ // // Base64 转 Blob
+ // const byteCharacters = atob(base64Data);
+ // const byteNumbers = new Array(byteCharacters.length);
+ // for (let i = 0; i < byteCharacters.length; i++) {
+ // byteNumbers[i] = byteCharacters.charCodeAt(i);
+ // }
+ // const byteArray = new Uint8Array(byteNumbers);
+ // const blob = new Blob([byteArray], {type: 'application/pdf'});
+ //
+ // // 生成临时 URL
+ // const url = URL.createObjectURL(blob);
+ //
+ // // 使用 PDF.js 渲染
+ // pdfjsLib.getDocument(url).promise.then(function(pdf) {
+ // pdf.getPage(1).then(function(page) {
+ // const scale = 1.5;
+ // const viewport = page.getViewport({scale: scale});
+ // const canvas = document.createElement('canvas');
+ // const context = canvas.getContext('2d');
+ // canvas.height = viewport.height;
+ // canvas.width = viewport.width;
+ //
+ // // 将 PDF 页面渲染到 Canvas
+ // page.render({
+ // canvasContext: context,
+ // viewport: viewport
+ // }).promise.then(function() {
+ // $('#pdfViewer').html(canvas);
+ // });
+ // });
+ // }).catch(function(error) {
+ // layer.msg('PDF渲染失败: ' + error.message, {icon: 2});
+ // });
+ // }
// 查询按钮
$query.on('click', function () {
@@ -456,11 +649,13 @@
{title: '操作',
templet: function (d) {
if(d.status === 2){
- return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
- +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
+ return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverPdfGoods" shiro:hasPermission="user:update">一键发货</button>'
+ +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
+ // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deliverGoods" shiro:hasPermission="user:update">发货</button>'
}else if(d.status === 3){
return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
- +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="updateDeliver" shiro:hasPermission="user:update">修改物流信息</button>'
+ +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelDeliver" shiro:hasPermission="user:update">取消发货</button>'
+ // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="updateDeliver" shiro:hasPermission="user:update">修改物流信息</button>'
}else{
return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="seeOrder" shiro:hasPermission="user:update">详情</button>'
}
diff --git a/src/main/resources/templates/febs/views/modules/system/sender.html b/src/main/resources/templates/febs/views/modules/system/sender.html
new file mode 100644
index 0000000..e8ee3b0
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/system/sender.html
@@ -0,0 +1,97 @@
+<div class="layui-fluid layui-anim febs-anim" id="sender-setting" lay-title="发货地址">
+ <div class="layui-row layui-col-space8 febs-container">
+ <form class="layui-form" action="" lay-filter="sender-setting-form">
+ <div class="layui-card">
+ <div class="layui-card-body flex" id="cardBodySender">
+
+ </div>
+
+ <div class="layui-card-footer">
+ <button class="layui-btn layui-btn-normal save-btn" lay-submit="" lay-filter="sender-setting-form-submit" id="submit">保存</button>
+ </div>
+ </div>
+ </form>
+ </div>
+</div>
+<style>
+ .layui-form-label {
+ width: 120px;
+ }
+
+ .layui-form-item .layui-input-block {
+ margin-left: 150px;
+ }
+
+ .layui-table-form .layui-form-item {
+ margin-bottom: 20px !important;
+ }
+ .flex{
+ display: flex;
+ flex-wrap: wrap;
+ }
+ .save-btn{
+ display: block;
+ margin: 0 auto;
+ }
+ .layui-upload-list{
+ height: 200px;
+ }
+</style>
+<script type="text/html" id="senderOperate">
+ {{# layui.each(d, function(index, item){ }}
+ <div class="layui-form-item">
+ <label class="layui-form-label febs-form-item-require">{{item.description}}:</label>
+ <input type="text" lay-verify="required" name="{{item.code}}"
+ autoComplete="off" value="{{item.value}}" class="layui-input">
+ </div>
+ {{# }) }}
+</script>
+<script data-th-inline="javascript" type="text/javascript">
+ layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree', 'laytpl', 'upload'], function () {
+ var $ = layui.jquery,
+ febs = layui.febs,
+ form = layui.form,
+ validate = layui.validate
+ , templateHtml = senderOperate.innerHTML
+ , $cardBodySender = $("#cardBodySender")
+ , laytpl = layui.laytpl
+ , upload = layui.upload
+ , $view = $('#sender-setting');
+
+ form.verify(validate);
+ form.render();
+
+ dicDataReq("SENDER_SET");
+ function dicDataReq(type) {
+ $cardBodySender.empty();
+ $.get(ctx + 'admin/common/findDicByType/' + type, function (r) {
+ if (r.code === 200) {
+ var data = r.data;
+ laytpl(templateHtml).render(data, function(html) {
+ $cardBodySender.append(html);
+ })
+ }
+ });
+ }
+
+ form.on('submit(sender-setting-form-submit)', function (data) {
+ $.ajax({
+ 'url':ctx + 'admin/system/bonusSystemSetting',
+ 'type':'post',
+ 'dataType':'json',
+ 'headers' : {'Content-Type' : 'application/json;charset=utf-8'},
+ 'traditional': true,
+ 'data':JSON.stringify(data.field),
+ 'success':function (data) {
+ if (data.code == 200) {
+ febs.alert.success(data.message);
+ }
+ },
+ 'error':function () {
+ febs.alert.warn('服务器繁忙');
+ }
+ })
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index e3e3270..0b3a980 100644
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -25,7 +25,7 @@
<!-- <script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>-->
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-6.17.0.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/wangeditor@latest/dist/wangEditor.min.js" ></script>
-
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.6.347/pdf.min.js"></script>
<style type="text/css">
::-webkit-scrollbar {
height: 20px !important;
diff --git a/src/test/java/cc/mrbird/febs/AgentTest.java b/src/test/java/cc/mrbird/febs/AgentTest.java
index b3cf218..38d8b6f 100644
--- a/src/test/java/cc/mrbird/febs/AgentTest.java
+++ b/src/test/java/cc/mrbird/febs/AgentTest.java
@@ -1,127 +1,26 @@
package cc.mrbird.febs;
-import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
-import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
-import cc.mrbird.febs.mall.entity.*;
-import cc.mrbird.febs.mall.mapper.*;
-import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
-import cc.mrbird.febs.pay.model.RefundStatus;
-import cc.mrbird.febs.pay.util.FiuuRefundUtil;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cc.mrbird.febs.mall.dto.ApiCheckTraceInfoDto;
+import cn.hutool.json.JSONUtil;
+import com.best.javaSdk.ClientParamEnum;
+import com.best.javaSdk.ClientParamService;
+import com.best.javaSdk.kdTraceQuery.response.KdTraceQueryRsp;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-
-import java.util.List;
@Slf4j
@SpringBootTest
public class AgentTest {
- @Autowired
- private MallActivityMapper mallActivityMapper;
-
- @Autowired
- private MallRefundMapper mallRefundMapper;
-
- @Autowired
- private MallOrderInfoMapper mallOrderInfoMapper;
-
- @Autowired
- private MallOrderItemMapper mallOrderItemMapper;
-
- @Autowired
- private MallGoodsSkuMapper mallGoodsSkuMapper;
-
- @Autowired
- private MallGoodsMapper mallGoodsMapper;
-
- @Autowired
- private FiuuRefundUtil fiuuRefundUtil;
-
- @Autowired
- private IMallMoneyFlowService mallMoneyFlowService;
@Test
public void refundJob() {
- LambdaQueryWrapper<MallRefundEntity> mallOrderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>();
- mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getState, 3);
- mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getType, 1);
- List<MallRefundEntity> mallRefundEntities = mallRefundMapper.selectList(mallOrderRefundLambdaQueryWrapper);
- if(CollUtil.isEmpty(mallRefundEntities)){
- return;
- }
- mallRefundEntities.forEach(mallRefundEntity -> {
- processRefund(mallRefundEntity);
- });
+ ApiCheckTraceInfoDto apiCheckTraceInfoDto = new ApiCheckTraceInfoDto();
+ apiCheckTraceInfoDto.setTraceNo("60850712015414");
+ KdTraceQueryRsp traceQueryRsp = ClientParamService.getInstance(ClientParamEnum.PRD.name()).checkTraceInfo(apiCheckTraceInfoDto);
+ log.info("traceQueryRsp:{}", JSONUtil.parseObj(traceQueryRsp));
}
- private void processRefund(MallRefundEntity mallRefundEntity) {
- try {
- MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(mallRefundEntity.getOrderId());
- MallOrderItem mallOrderItem = mallOrderItemMapper.selectById(mallRefundEntity.getItemId());
- MallGoodsSku mallGoodsSku = mallGoodsSkuMapper.selectById(mallOrderItem.getSkuId());
- String txnId = mallOrderInfo.getPayOrderNo();
- RefundStatus status = fiuuRefundUtil.pollRefundStatus(txnId);
-
- switch (status.getStatus()) {
- case "success":
- updateOnSuccess(mallRefundEntity, mallOrderInfo, mallOrderItem, mallGoodsSku);
- break;
- case "rejected":
- updateOnRejected(mallRefundEntity, mallOrderItem);
- break;
- default:
- log.warn("未知状态:{}", status.getStatus());
- }
- } catch (Exception e) {
- log.error("处理退款失败: {}", e.getMessage(), e);
- }
- }
-
- private void updateOnSuccess(MallRefundEntity mallRefundEntity, MallOrderInfo mallOrderInfo, MallOrderItem mallOrderItem, MallGoodsSku mallGoodsSku) {
- mallOrderItem.setState(3);
- mallOrderItemMapper.updateById(mallOrderItem);
-
- MallGoods mallGoods = mallGoodsMapper.selectById(mallOrderItem.getGoodsId());
- mallGoods.setStock(mallGoods.getStock() + mallOrderItem.getCnt());
- mallGoods.setVolume(mallGoods.getVolume() - mallOrderItem.getCnt());
- mallGoodsMapper.updateById(mallGoods);
-
- mallGoodsSku.setStock(mallGoodsSku.getStock() + mallOrderItem.getCnt());
- mallGoodsSku.setSkuVolume(mallGoodsSku.getSkuVolume() - mallOrderItem.getCnt());
- mallGoodsSkuMapper.updateById(mallGoodsSku);
-
- mallRefundEntity.setState(1);
- mallRefundEntity.setUpdatedTime(DateUtil.date());
- mallRefundMapper.updateById(mallRefundEntity);
-
- mallMoneyFlowService.addMoneyFlow(
- mallOrderInfo.getMemberId(),
- mallRefundEntity.getAmount(),
- MoneyFlowTypeEnum.WECHAT_REFUND.getValue(),
- mallOrderInfo.getOrderNo(),
- FlowTypeEnum.WECHAT.getValue(),
- "FIUU退款",
- 2);
-
- List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByNotInStateAndOrderId(3, mallRefundEntity.getOrderId());
- if (CollUtil.isEmpty(mallOrderItemList)) {
- MallOrderInfo mallOrderRefund = mallOrderInfoMapper.selectById(mallRefundEntity.getOrderId());
- mallOrderRefund.setStatus(6);
- mallOrderInfoMapper.updateById(mallOrderRefund);
- }
- }
-
- private void updateOnRejected(MallRefundEntity mallRefundEntity, MallOrderItem mallOrderItem) {
- mallOrderItem.setState(1);
- mallOrderItemMapper.updateById(mallOrderItem);
-
- mallRefundEntity.setState(2);
- mallRefundMapper.updateById(mallRefundEntity);
- }
}
--
Gitblit v1.9.1