wangchaoxu 1 year ago
commit 3d228eb82e

@ -5,7 +5,7 @@ curl --location --request POST 'localhost:8080/base/cloud/spi' \
--data-raw '{
"appId":"7264840234423027259",
"authId":"4463798",
"method":"testTime",
"method":"RefreshTokenTimer",
"data":"{\"moveShopSettingId\":6}"
}'

@ -6,11 +6,63 @@ import java.util.Map;
@Data
public class ResultDTO {
public final static String SUCCESS = "success";
public final static String FAIL = "fail";
private String result;
private String reason;
private String code;
private String message;
private Map<String, Object> data;
public boolean isSuccess() {
return "success".equals(result);
}
public static ResultDTO success() {
ResultDTO result = new ResultDTO();
result.setResult(SUCCESS);
result.setReason("成功");
result.setCode(SUCCESS);
result.setMessage("成功");
return result;
}
public static ResultDTO success(Map<String, Object> data) {
ResultDTO result = new ResultDTO();
result.setResult(SUCCESS);
result.setReason("成功");
result.setCode(SUCCESS);
result.setMessage("成功");
result.setData(data);
return result;
}
public static ResultDTO fail() {
ResultDTO result = new ResultDTO();
result.setResult(FAIL);
result.setReason("失败");
result.setCode(FAIL);
result.setMessage("失败");
return result;
}
public static ResultDTO fail(String message) {
ResultDTO result = new ResultDTO();
result.setResult(FAIL);
result.setReason(message);
result.setCode(FAIL);
result.setMessage(message);
return result;
}
public static ResultDTO fail(String code, String message) {
ResultDTO result = new ResultDTO();
result.setResult(FAIL);
result.setReason(message);
result.setCode(code);
result.setMessage(message);
return result;
}
}

@ -211,6 +211,7 @@ public class TblConst {
public static final String shop_1688_cg_auth = "shop_1688_cg_auth";
public static final String op_order_delay_outstorage_buffer = "op_order_delay_outstorage_buffer";
public static final String op_order_delay_outstorage_queue = "op_order_delay_outstorage_queue";
public static final String shop_dy_cloud_push_info = "shop_dy_cloud_push_info";
public static final String shop_dy_cloud_push_subscribe_queue = "shop_dy_cloud_push_subscribe_queue";

@ -0,0 +1,12 @@
package com.ms.api.exception;
import lombok.Data;
@Data
public class DeliveryNotReceivedException extends RuntimeException {
private Long shipTimestamp;
public DeliveryNotReceivedException(String message, Long shipTimestamp) {
super(message);
this.shipTimestamp = shipTimestamp;
}
}

@ -21,4 +21,5 @@ public interface DistributionOrderService {
void closeSourceOrderAndCancelRelatePurchaseOrder(Long shopId, String orderId, String purchaseOrderSn);
String getDsPurchaseOrderPayUrl(Long shopId, GetDsPurchaseOrderPayUrlRequestDTO request);
void processDsMessage(Long dsMessageId);
void purchaseDelayOutstorage(Long shopId, String orderId);
}

@ -8,6 +8,9 @@ import com.ms.api.dto.dsapi.response.*;
import java.util.List;
/**
* @author elf
*/
public interface DsApiService {
GetPlatformShopPurchaseSettingResponseDTO getPlatformShopPurchaseSetting(String userId, String platform);
BatchCreateDistributionOrdersResponseDTO batchCreateDistributionOrders(Long shopId, BatchCreateDistributionOrdersRequestDTO request);

@ -1,11 +1,13 @@
package com.ms.api.service;
import com.ms.api.dto.dsorder.DsMessageDTO;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.dal.entity.DsMessage;
import com.ms.dal.entity.DsMessageConsumerQueue;
import org.springframework.lang.Nullable;
/**
*
* @author elf
*/
public interface DsMessageService {
@ -30,4 +32,6 @@ public interface DsMessageService {
DsMessage add(Long shopId, Long platformPushMsgId, String bizId, String bizType, String data);
void addDsMessage(Long shopId, Long platformPushMsgId, String bizId, String bizType, String data);
void clearDsMessageQueue(DsMessageConsumerQueue queue, ResultDTO result);
}

@ -31,7 +31,7 @@ public interface OpOrderChildLogisticsService {
OpOrderChildLogistics getByChildOrderIdAndLogistics(String childOrderId, String companyCode, String trackingNo);
OpOrderChildLogistics saveByOpPackageOrderChild(OpPackageOrderChild child, Long shopId, String companyCode, String waybillCode, String logisticsName);
OpOrderChildLogistics saveByOpPackageOrderChild(String orderId, String childOrderId, Long shopId, Integer shippedNum, String companyCode, String waybillCode, String logisticsName);
int deleteByChildOrderIdsAndLogistics(List<String> childOrderIds, String companyCode, String trackingNo);
}

@ -2,6 +2,8 @@ package com.ms.api.service;
import com.ms.dal.entity.OpOrderDelayOutstorageBuffer;
import java.util.Date;
/**
*
*/
@ -18,4 +20,6 @@ public interface OpOrderDelayOutstorageBufferService {
int updateByPrimaryKeySelective(OpOrderDelayOutstorageBuffer record);
int updateByPrimaryKey(OpOrderDelayOutstorageBuffer record);
OpOrderDelayOutstorageBuffer save(Long shopId, String orderId, Date shipTime);
}

@ -1,5 +1,6 @@
package com.ms.api.service;
import com.ms.api.common.ApiResult;
import com.ms.dal.entity.OpOrderDelayOutstorageQueue;
/**
@ -18,4 +19,8 @@ public interface OpOrderDelayOutstorageQueueService {
int updateByPrimaryKeySelective(OpOrderDelayOutstorageQueue record);
int updateByPrimaryKey(OpOrderDelayOutstorageQueue record);
public ApiResult moveBufferToSolidRedisQueue(Integer maxQueueCount);
OpOrderDelayOutstorageQueue lockSolidRedisQueue(Long timerLockId, boolean isAdminSelf);
}

@ -8,6 +8,7 @@ import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.api.dto.move.SearchMoveProductItemRequestDTO;
import com.ms.api.dto.order.SearchOutstorageLogListRequestDTO;
import com.ms.dal.entity.MicroMoveProductItem;
import com.ms.dal.entity.OpOrder;
import com.ms.dal.entity.OpOrderOutstorageHistory;
import com.ms.dal.entity.PurchaseOrder;
@ -35,4 +36,6 @@ public interface OpOrderOutstorageHistoryService {
Pager<OpOrderOutstorageHistory> searchOutstorageLogList(SearchOutstorageLogListRequestDTO condition);
void addOrderOutstorageHistory(Long shopId, List<String> orderIds, Integer logisticsId, String waybillCode, String outstorageSource, int isUpdateOrderLogistics, ResultDTO outstorageRet);
void addHistoryByOrder(OpOrder opOrder, Integer logisticsId, String waybillCode, String outstorageSource, int isUpdateOrderLogistics, ResultDTO outstorageRet);
}

@ -1,6 +1,7 @@
package com.ms.api.service;
import com.doudian.open.api.order_logisticsAddMultiPack.data.OrderLogisticsAddMultiPackData;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.api.dto.order.OrderMultiPackageOutstorageDTO;
import com.ms.dal.entity.OpOrder;
import com.ms.dal.entity.PurchaseOrder;
@ -11,7 +12,7 @@ import java.util.List;
* @author elf
*/
public interface OutstorageService {
OrderLogisticsAddMultiPackData orderMultiPackageOutstorage(String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList);
OrderLogisticsAddMultiPackData orderMultiPackageOutstorage(Long shopId, String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList, String accessToken, String outStorageSource);
ResultDTO orderMultiPackageOutstorage(String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList);
ResultDTO orderMultiPackageOutstorage(OpOrder opOrder, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList, String outStorageSource);
void dsPurchaseAutoOutStorage(OpOrder opOrder, PurchaseOrder purchaseOrder);
}

@ -15,6 +15,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.DateUtils;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
@ -46,7 +47,6 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
private PurchaseOrderDsEncryptService purchaseOrderDsEncryptService;
private PurchaseOrderCustomService purchaseOrderCustomService;
private DsMessageService dsMessageService;
private OpPackageService opPackageService;
private OutstorageService outstorageService;
@Override
@ -345,24 +345,29 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
}
private void processCreateDsOrderFailure(Long shopId, BatchCreateDistributionOrdersResponseDTO response) {
HashMap<String, String> sourceOrderIdAndPayFailReason = new HashMap<>();
HashMap<String, String> sourceOrderIdAndPayFailReasonMap = buildSourceOrderIdAndPayFailReasonMap(response);
List<PurchaseOrder> purchaseOrders = purchaseOrderService.getListByPlatformAndPurchaseOrderSns(PurchaseOrderConst.PURCHASE_PLATFORM1688, new ArrayList<>(sourceOrderIdAndPayFailReasonMap.keySet()));
Map<String, Long> sourceOrderIdAndPurchaseOrderIdMap = purchaseOrders.stream().collect(Collectors.toMap(PurchaseOrder::getPurchaseOrderSn, PurchaseOrder::getPurchaseOrderId));
for (Map.Entry<String, String> entry: sourceOrderIdAndPayFailReasonMap.entrySet()) {
Long purchaseOrderId = sourceOrderIdAndPurchaseOrderIdMap.get(entry.getKey());
savePurchaseOrderPayFailReason(shopId, purchaseOrderId, entry.getValue());
}
}
private static HashMap<String, String> buildSourceOrderIdAndPayFailReasonMap(BatchCreateDistributionOrdersResponseDTO response) {
HashMap<String, String> sourceOrderIdAndPayFailReasonMap = new HashMap<>();
for (DsSuccessRetDTO successRet: response.getSuccessList()) {
Map<String, DsPayRetDTO> sourceOrderIdAndPayRetMap = successRet.getPayRet();
for (Map.Entry<String, DsPayRetDTO> entry: sourceOrderIdAndPayRetMap.entrySet()) {
if (!entry.getValue().getReason().isEmpty()) {
continue;
}
sourceOrderIdAndPayFailReason.put(entry.getKey(), entry.getValue().getReason());
sourceOrderIdAndPayFailReasonMap.put(entry.getKey(), entry.getValue().getReason());
}
}
List<PurchaseOrder> purchaseOrders = purchaseOrderService.getListByPlatformAndPurchaseOrderSns(PurchaseOrderConst.PURCHASE_PLATFORM1688, new ArrayList<>(sourceOrderIdAndPayFailReason.keySet()));
Map<String, Long> sourceOrderIdAndPurchaseOrderIdMap = purchaseOrders.stream().collect(Collectors.toMap(PurchaseOrder::getPurchaseOrderSn, PurchaseOrder::getPurchaseOrderId));
for (Map.Entry<String, String> entry: sourceOrderIdAndPayFailReason.entrySet()) {
Long purchaseOrderId = sourceOrderIdAndPurchaseOrderIdMap.get(entry.getKey());
savePurchaseOrderPayFailReason(shopId, purchaseOrderId, entry.getValue());
}
return sourceOrderIdAndPayFailReasonMap;
}
private void savePurchaseOrderPayFailReason(Long shopId, Long purchaseOrderId, String payFailReason) {
@ -811,16 +816,13 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
needCancelPurchaseOrderIds.add(purchaseOrder.getPurchaseOrderId());
}
if (currentPurchaseOrderItemCancelNum > 0) {
PurchaseOrderCancelLog log = getPurchaseOrderCancelLog(opOrder, purchaseOrder);
PurchaseOrderCancelLog log = buildPurchaseOrderCancelLog(opOrder, null, purchaseOrder);
purchaseOrderCancelLogs.add(log);
}
}
for (PurchaseOrderItemDTO itemDto: purchaseOrderDto.getItems()) {
realPurchaseNumMap.put(itemDto.getSkuId(), itemDto.getPurchaseNum());
if (skuIdAndOpOrderChildMap.get(itemDto.getSkuId()).getChildOrderId() == null) {
continue;
}
// TODO purchasePlatform1688DS opOrderOutstorageCheckBuffer
}
@ -908,20 +910,6 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
return log;
}
private static PurchaseOrderCancelLog getPurchaseOrderCancelLog(OpOrder opOrder, PurchaseOrder purchaseOrder) {
PurchaseOrderCancelLog log = new PurchaseOrderCancelLog();
log.setShopId(opOrder.getShopId());
log.setOrderId(opOrder.getOrderId());
log.setPurchaseOrderSn(purchaseOrder.getPurchaseOrderSn());
log.setPurchaseOrderId(purchaseOrder.getPurchaseOrderId());
log.setSource(null);
log.setOperateShopId(opOrder.getShopId());
log.setOperateIp("");
log.setGmtCreate(new Date());
log.setGmtModified(new Date());
return log;
}
private PurchaseOrder buildPurchaseOrderByDto(PurchaseOrderDTO purchaseOrderDto, PurchaseOrder oldPurchaseOrder, OpOrder opOrder) {
PurchaseOrder purchaseOrder = oldPurchaseOrder;
if (purchaseOrder == null) {
@ -1013,27 +1001,6 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
return isRepeat;
}
private List<OpPackage> getOrderPurchaseItemsOldPackageInfo(PurchaseOrder purchaseOrder) {
List<PurchaseOrderItem> purchaseOrderItems = purchaseOrderItemService.getRelatePurchaseOrderItemsByPurchaseOrderId(purchaseOrder.getPurchaseOrderId());
List<Long> skuIds = purchaseOrderItems.stream().map(PurchaseOrderItem::getSkuId).collect(Collectors.toList());
List<String> orderIds = new ArrayList<>();
orderIds.add(purchaseOrder.getOrderId());
List<OpOrderChild> opOrderChildList = opOrderChildService.getListByOrderIdsAndSkuIds(orderIds, skuIds);
Set<String> currentChildOrderIds = opOrderChildList.stream().map(OpOrderChild::getChildOrderId).collect(Collectors.toSet());
HashMap<Long, OpPackage> packageIdAndPackageMap = opPackageService.getOpPackageIdAndPackageMapByOrderIds(orderIds);
for (Map.Entry<Long, OpPackage> item: packageIdAndPackageMap.entrySet()) {
Long packageId = item.getKey();
OpPackage opPackage = item.getValue();
Set<String> packageChildOrderIds = opPackage.getChildren().stream().map(OpPackageOrderChild::getChildOrderId).collect(Collectors.toSet());
Set<String> intersectionSet = new HashSet<>(packageChildOrderIds);
intersectionSet.retainAll(currentChildOrderIds);
if (intersectionSet.isEmpty()) {
packageIdAndPackageMap.remove(packageId);
}
}
return new ArrayList<>(packageIdAndPackageMap.values());
}
@Override
public GetPurchaseOrderItemsAndSourceItemsResponseDTO getSourceSkuInfos(Long shopId, List<OrderItemDTO> orderItems) {
Stream<String> orderIdsStream = orderItems.stream().map(OrderItemDTO::getOrderId);
@ -1093,7 +1060,7 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
if (!skuIds.isEmpty()) {
cancelPurchaseOrderByOrderId(shopId, orderId, source);
} else {
cancelPurchaseOrderItem(shopId, orderId, skuIds, source);
cancelPurchaseOrderItem(opOrder, skuIds, source);
}
buildAndUpdateNewPurchaseOrderRemark(opOrder);
}
@ -1123,7 +1090,9 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
purchaseOrderCancelLogService.insertSelective(log);
}
private void cancelPurchaseOrderItem(Long shopId, String orderId, List<Long> skuIds, String source) {
private void cancelPurchaseOrderItem(OpOrder opOrder, List<Long> skuIds, String source) {
Long shopId = opOrder.getShopId();
String orderId = opOrder.getOrderId();
List<OpOrderChild> opOrderChildren = opOrderChildService.getChildrenByOrderId(orderId, true);
List<Long> childSkuIds = opOrderChildren.stream().map(OpOrderChild::getSkuId).collect(Collectors.toList());
for (Long skuId: skuIds) {
@ -1149,16 +1118,7 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
cancelPurchaseOrderItemCount ++;
}
if (cancelPurchaseOrderItemCount > 0) {
PurchaseOrderCancelLog log = new PurchaseOrderCancelLog();
log.setShopId(shopId);
log.setOrderId(orderId);
log.setPurchaseOrderSn(purchaseOrder.getPurchaseOrderSn());
log.setPurchaseOrderId(purchaseOrder.getPurchaseOrderId());
log.setSource(source);
log.setOperateShopId(shopId);
log.setOperateIp("");
log.setGmtCreate(new Date());
log.setGmtModified(new Date());
PurchaseOrderCancelLog log = buildPurchaseOrderCancelLog(opOrder, source, purchaseOrder);
logs.add(log);
}
if (cancelPurchaseOrderItemCount == purchaseOrder.getItems().size()) {
@ -1386,16 +1346,7 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
cancelPurchaseOrderItemCount ++;
}
if (cancelPurchaseOrderItemCount > 0) {
PurchaseOrderCancelLog log = new PurchaseOrderCancelLog();
log.setShopId(opOrder.getShopId());
log.setOrderId(opOrder.getOrderId());
log.setPurchaseOrderId(purchaseOrder.getPurchaseOrderId());
log.setPurchaseOrderSn(purchaseOrder.getPurchaseOrderSn());
log.setSource(source);
log.setOperateShopId(0L);
log.setOperateIp("");
log.setGmtCreate(new Date());
log.setGmtModified(new Date());
PurchaseOrderCancelLog log = buildPurchaseOrderCancelLog(opOrder, source, purchaseOrder);
purchaseOrderCancelLogs.add(log);
}
@ -1424,6 +1375,20 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
opOrderDsService.updateOpOrderDsFilterStatus(opOrder.getOrderId(), "1688DS");
}
private static PurchaseOrderCancelLog buildPurchaseOrderCancelLog(OpOrder opOrder, String source, PurchaseOrder purchaseOrder) {
PurchaseOrderCancelLog log = new PurchaseOrderCancelLog();
log.setShopId(opOrder.getShopId());
log.setOrderId(opOrder.getOrderId());
log.setPurchaseOrderId(purchaseOrder.getPurchaseOrderId());
log.setPurchaseOrderSn(purchaseOrder.getPurchaseOrderSn());
log.setSource(source);
log.setOperateShopId(opOrder.getShopId());
log.setOperateIp("");
log.setGmtCreate(new Date());
log.setGmtModified(new Date());
return log;
}
private void dsUpdatePurchaseOrder(OpOrder opOrder, PurchaseOrderDTO dto) {
if (opOrder == null) {
throw new RuntimeException("订单不存在");
@ -1435,4 +1400,24 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
updatePurchaseOrderInfo(dto, dbPurchaseOrder, opOrder);
dsPurchaseOrderOutStorageAndUpdateRemark(dto, opOrder, dbPurchaseOrder);
}
@Override
public void purchaseDelayOutstorage(Long shopId, String orderId) {
boolean hasFailRet = false;
List<PurchaseOrder> purchaseOrders = purchaseOrderService.getListByOrderId(shopId, orderId, StatusConst.normal, true);
if (!purchaseOrders.isEmpty()) {
OpOrder opOrder = opOrderService.selectByOrderId(orderId);
for (PurchaseOrder purchaseOrder: purchaseOrders) {
try {
outstorageService.dsPurchaseAutoOutStorage(opOrder, purchaseOrder);
} catch (RuntimeException e) {
hasFailRet = true;
}
outstorageService.dsPurchaseAutoOutStorage(opOrder, purchaseOrder);
}
}
if (hasFailRet) {
throw new RuntimeException("'部分出库失败,请检查日志'");
}
}
}

@ -6,7 +6,7 @@ import com.ms.api.dto.dsapi.response.*;
import com.ms.api.service.DsApiService;
import com.ms.api.tool.DsJsonRequestTemplate;
import com.ms.api.tool.SecurityTool;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
@ -14,9 +14,12 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author elf
*/
@Service
@AllArgsConstructor
public class DsApiServiceImpl implements DsApiService {
@Autowired
private DsJsonRequestTemplate dsJsonRequestTemplate;
@Override
@ -39,8 +42,6 @@ public class DsApiServiceImpl implements DsApiService {
}
}
String resp = execute("/order/batchCreateDistributionOrders", objectToMap(request));
// String resp = "{\"result\":\"success\",\"successCount\":1,\"failCount\":0,\"successList\":[{\"result\":\"success\",\"data\":{\"success\":true,\"totalSuccessAmount\":6500,\"orderId\":\"3507894290302847640\",\"postFee\":1500,\"mutilOrders\":null},\"createAlibabaOrderLogId\":960,\"platformOrderIds\":[\"6921501275308365608\"],\"isEncryptOrder\":1,\"isSupportEncryptOrder\":1,\"isUseManualConsignee\":0,\"flow\":\"fenxiao\",\"includeSplitJxhy\":false,\"sourceOrderIds\":[\"3507894290302847640\"],\"payRet\":{\"3507894290302847640\":{\"result\":\"fail\",\"code\":\"NO_SIGN_UP_ERROR\",\"reason\":\"\\u672a\\u7b7e\\u7ea6\\u6216\\u672a\\u7ed1\\u5b9a\"}},\"platformOrderId\":\"6921501275308365608\",\"relatePurchaseOrderInfos\":[{\"platformOrderId\":\"6921501275308365608\",\"purchasePlatform\":\"1688DS\",\"purchaseOrderSn\":\"3507894290302847640\",\"purchaseOrderBuyer\":\"goufx_ms\",\"purchaseOrderSeller\":\"\\u798f\\u5dde\\u67cf\\u4e3a\\u5546\\u8d38\\u6709\\u9650\\u516c\\u53f8\",\"purchaseOrderPayment\":\"65\",\"purchaseOrderFullname\":\"\\u53f6*\",\"purchaseOrderMobile\":\"1********51\",\"purchaseOrderFullAddress\":\"\\u7518\\u8083\\u7701 \\u5609\\u5cea\\u5173\\u5e02 \\u94a2\\u57ce\\u8857\\u9053 \\u8fce\\u5bbe*\\u8def****-*\\u53f7****\",\"purchaseOrderStartTime\":\"2023-09-05 16:57:29\",\"platformPushStatus\":\"wait\",\"purchaseOrderLogisticsName\":\"\",\"purchaseOrderWaybillCode\":\"\",\"purchaseOrderStatus\":\"wait_pay\",\"purchaseOrderFlow\":\"fenxiao\",\"alibabaOrderStatus\":\"waitbuyerpay\",\"isUseManualConsignee\":0,\"isDsEncryptOrder\":\"1\",\"isSupportEncryptOrder\":\"1\",\"logisticsIsAccept\":false,\"items\":[{\"skuId\":\"1759603409502271\",\"wareId\":\"3603667784447454901\",\"purchaseNum\":\"1\",\"purchasePrice\":\"50\",\"sourceItemId\":\"714710164290\"}],\"mergePurchasePlatformOrderIds\":null}]}],\"errorList\":null,\"lockSourceItems\":[{\"createPurchaseOrderLockSkuId\":\"1432\",\"createPurchaseOrderLockId\":\"20000973\",\"sourceItemId\":\"714710164290\",\"sourceSkuId\":\"5255522619991\",\"createPurchaseOrderLogId\":\"1017\",\"sourceOrderId\":\"3507894290302847640\",\"sourceNum\":null,\"reqId\":null,\"status\":\"lock\",\"gmtCreate\":\"2023-09-05 16:57:28\",\"gmtModified\":\"2023-09-05 16:57:29\",\"platformOrderId\":\"6921501275308365608\",\"platformItemId\":\"3603667784447454901\",\"platformSkuId\":\"1759603409502271\"}]}";
// String resp = "{\"result\":\"success\",\"successCount\":1,\"failCount\":0,\"successList\":[{\"result\":\"success\",\"data\":{\"success\":true,\"totalSuccessAmount\":6500,\"orderId\":\"3510731197203847640\",\"postFee\":1500,\"mutilOrders\":null},\"createAlibabaOrderLogId\":965,\"platformOrderIds\":[\"6921501275308365608\"],\"isEncryptOrder\":1,\"isSupportEncryptOrder\":1,\"isUseManualConsignee\":0,\"flow\":\"fenxiao\",\"includeSplitJxhy\":false,\"sourceOrderIds\":[\"3510731197203847640\"],\"payRet\":{\"3510731197203847640\":{\"result\":\"fail\",\"code\":\"NO_SIGN_UP_ERROR\",\"reason\":\"\\u672a\\u7b7e\\u7ea6\\u6216\\u672a\\u7ed1\\u5b9a\"}},\"platformOrderId\":\"6921501275308365608\",\"relatePurchaseOrderInfos\":[{\"platformOrderId\":\"6921501275308365608\",\"purchasePlatform\":\"1688DS\",\"purchaseOrderSn\":\"3510731197203847640\",\"purchaseOrderBuyer\":\"goufx_ms\",\"purchaseOrderSeller\":\"\\u798f\\u5dde\\u67cf\\u4e3a\\u5546\\u8d38\\u6709\\u9650\\u516c\\u53f8\",\"purchaseOrderPayment\":\"65\",\"purchaseOrderFullname\":\"\\u53f6*\",\"purchaseOrderMobile\":\"1********51\",\"purchaseOrderFullAddress\":\"\\u7518\\u8083\\u7701 \\u5609\\u5cea\\u5173\\u5e02 \\u94a2\\u57ce\\u8857\\u9053 \\u8fce\\u5bbe*\\u8def****-*\\u53f7****\",\"purchaseOrderStartTime\":\"2023-09-07 09:50:55\",\"platformPushStatus\":\"wait\",\"purchaseOrderLogisticsName\":\"\",\"purchaseOrderWaybillCode\":\"\",\"purchaseOrderStatus\":\"wait_pay\",\"purchaseOrderFlow\":\"fenxiao\",\"alibabaOrderStatus\":\"waitbuyerpay\",\"isUseManualConsignee\":0,\"isDsEncryptOrder\":\"1\",\"isSupportEncryptOrder\":\"1\",\"logisticsIsAccept\":false,\"items\":[{\"skuId\":\"1759603409502271\",\"wareId\":\"3603667784447454901\",\"purchaseNum\":\"1\",\"purchasePrice\":\"50\",\"sourceItemId\":\"714710164290\"}],\"mergePurchasePlatformOrderIds\":null}]}],\"errorList\":null,\"lockSourceItems\":[{\"createPurchaseOrderLockSkuId\":\"1439\",\"createPurchaseOrderLockId\":\"20000980\",\"sourceItemId\":\"714710164290\",\"sourceSkuId\":\"5255522619991\",\"createPurchaseOrderLogId\":\"1022\",\"sourceOrderId\":\"3510731197203847640\",\"sourceNum\":null,\"reqId\":null,\"status\":\"lock\",\"gmtCreate\":\"2023-09-07 09:50:54\",\"gmtModified\":\"2023-09-07 09:50:55\",\"platformOrderId\":\"6921501275308365608\",\"platformItemId\":\"3603667784447454901\",\"platformSkuId\":\"1759603409502271\"}]}";
return JSON.parseObject(resp, BatchCreateDistributionOrdersResponseDTO.class);
}

@ -6,16 +6,14 @@ import cn.hutool.core.util.StrUtil;
import com.ms.api.common.ApiResult;
import com.ms.api.consts.RedisKeyConst;
import com.ms.api.consts.TblConst;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.dal.entity.DsMessageConsumerBuffer;
import com.ms.dal.entity.DsMessageConsumerQueue;
import com.ms.api.service.DsMessageConsumerQueueService;
import com.ms.dal.entity.OpOrderRsyncPageQueue;
import com.ms.dal.entity.OpOrderRsyncQueue;
import com.ms.dal.mapper.DsMessageConsumerBufferMapper;
import com.ms.dal.mapper.DsMessageConsumerQueueMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
@ -28,8 +26,9 @@ import java.util.Date;
import java.util.List;
/**
*
* @author elf
*/
@Service
@Slf4j
@ -80,7 +79,7 @@ public class DsMessageConsumerQueueServiceImpl implements DsMessageConsumerQueue
return ApiResult.fail("队列数已满。");
}
ApiResult result = new ApiResult<>();
ApiResult result;
int needMoveQueueCount = maxQueueCount - queueCount;
Long startBufferId = 0L;

@ -2,15 +2,16 @@ package com.ms.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.ms.api.consts.DsMessageConst;
import com.ms.api.dto.dsorder.DsMessageDTO;
import com.ms.api.dto.dsorder.PurchaseOrderCancelMessageDTO;
import com.ms.api.dto.dsorder.PurchaseOrderChangeMessageDTO;
import com.ms.api.dto.dsorder.PurchaseOrderRelateMessageDTO;
import com.ms.api.consts.StatusConst;
import com.ms.api.dto.dsorder.*;
import com.ms.api.service.DsMessageConsumerBufferService;
import com.ms.api.service.DsMessageConsumerQueueService;
import com.ms.api.tool.CommonTool;
import com.ms.dal.entity.DsMessage;
import com.ms.api.service.DsMessageService;
import com.ms.dal.entity.DsMessageConsumerQueue;
import com.ms.dal.mapper.DsMessageMapper;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.AllArgsConstructor;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -19,18 +20,12 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
/**
*
*/
@Service
@AllArgsConstructor
public class DsMessageServiceImpl implements DsMessageService{
@Autowired
private DsMessageMapper dsMessageMapper;
@Autowired
private DsMessageConsumerBufferService dsMessageConsumerBufferService;
private DsMessageConsumerQueueService dsMessageConsumerQueueService;
@Override
public int deleteByPrimaryKey(Long id) {
@ -124,6 +119,23 @@ public class DsMessageServiceImpl implements DsMessageService{
DsMessage dsMessage = add(shopId, platformPushMsgId, bizId, bizType, data);
dsMessageConsumerBufferService.addBuffer(shopId, dsMessage.getDsMessageId(), null);
}
@Override
@Transactional
public void clearDsMessageQueue(DsMessageConsumerQueue queue, ResultDTO result) {
boolean isDelay = false;
if (result.getData().containsKey("code")) {
isDelay = ((String) result.getData().get("code")).equals(StatusConst.delay);
}
if (isDelay) {
int randomNum = CommonTool.getRandom(2, 5);
Date gmtExec = new Date(new Date().getTime() + randomNum * 1000L);
dsMessageConsumerBufferService.addBuffer(queue.getShopId(), queue.getDsMessageId(), gmtExec);
} else {
dsMessageMapper.updateStatus(queue.getDsMessageId(), result.getResult(), result.getReason());
}
dsMessageConsumerQueueService.deleteByPrimaryKey(queue.getDsMessageConsumerQueueId());
}
}

@ -93,20 +93,21 @@ public class OpOrderChildLogisticsServiceImpl implements OpOrderChildLogisticsSe
}
@Override
public OpOrderChildLogistics saveByOpPackageOrderChild(OpPackageOrderChild child, Long shopId, String companyCode, String waybillCode, String logisticsName) {
OpOrderChildLogistics childLogistics = getByChildOrderIdAndLogistics(child.getChildOrderId(), companyCode, waybillCode);
public OpOrderChildLogistics saveByOpPackageOrderChild(String orderId, String childOrderId, Long shopId, Integer shippedNum, String companyCode, String waybillCode, String logisticsName) {
OpOrderChildLogistics childLogistics = getByChildOrderIdAndLogistics(childOrderId, companyCode, waybillCode);
if (childLogistics == null) {
childLogistics = new OpOrderChildLogistics();
childLogistics.setShopId(shopId);
childLogistics.setOrderId(child.getOrderId());
childLogistics.setChildOrderId(child.getChildOrderId());
childLogistics.setOrderId(orderId);
childLogistics.setChildOrderId(childOrderId);
childLogistics.setCompanyCode(companyCode);
childLogistics.setCompanyName(logisticsName);
childLogistics.setTrackingNo(waybillCode);
childLogistics.setGmtCreate(new Date());
childLogistics.setShippedNum(Long.valueOf(child.getShippedNum()));
childLogistics.setShippedNum(Long.valueOf(shippedNum));
} else {
childLogistics.setShippedNum(childLogistics.getShippedNum() + Long.valueOf(child.getShippedNum())); // TODO 自增
childLogistics.setShippedNum(childLogistics.getShippedNum() + Long.valueOf(shippedNum)); // TODO 自增
}
childLogistics.setGmtShipTime(new Date());
childLogistics.setCompanyCode(companyCode);

@ -6,6 +6,8 @@ import com.ms.dal.mapper.OpOrderDelayOutstorageBufferMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
*
@ -46,6 +48,25 @@ public class OpOrderDelayOutstorageBufferServiceImpl implements OpOrderDelayOuts
return opOrderDelayOutstorageBufferMapper.updateByPrimaryKey(record);
}
@Override
public OpOrderDelayOutstorageBuffer save(Long shopId, String orderId, Date shipTime) {
OpOrderDelayOutstorageBuffer buffer = opOrderDelayOutstorageBufferMapper.getByOrderId(orderId);
if (buffer == null) {
buffer = new OpOrderDelayOutstorageBuffer();
buffer.setShopId(shopId);
buffer.setOrderId(orderId);
buffer.setTryTimes(0);
buffer.setGmtExec(shipTime);
buffer.setGmtCreate(new Date());
}
buffer.setGmtModified(new Date());
if (buffer.getOpOrderDelayOutstorageBufferId() > 0) {
opOrderDelayOutstorageBufferMapper.updateByPrimaryKeySelective(buffer);
} else {
opOrderDelayOutstorageBufferMapper.insertSelective(buffer);
}
return buffer;
}
}

@ -1,19 +1,40 @@
package com.ms.api.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ms.api.common.ApiResult;
import com.ms.api.consts.RedisKeyConst;
import com.ms.api.consts.TblConst;
import com.ms.dal.entity.OpOrderDelayOutstorageBuffer;
import com.ms.dal.entity.OpOrderDelayOutstorageQueue;
import com.ms.api.service.OpOrderDelayOutstorageQueueService;
import com.ms.dal.mapper.OpOrderDelayOutstorageBufferMapper;
import com.ms.dal.mapper.OpOrderDelayOutstorageQueueMapper;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
*
*/
@Service
@AllArgsConstructor
public class OpOrderDelayOutstorageQueueServiceImpl implements OpOrderDelayOutstorageQueueService{
@Autowired
private final DataSourceTransactionManager dataSourceTransactionManager;
private final TransactionDefinition transactionDefinition;
private final RedisTemplate<String, String> redisTemplate;
private OpOrderDelayOutstorageBufferMapper opOrderDelayOutstorageBufferMapper;
private OpOrderDelayOutstorageQueueMapper opOrderDelayOutstorageQueueMapper;
@Override
@ -46,6 +67,101 @@ public class OpOrderDelayOutstorageQueueServiceImpl implements OpOrderDelayOutst
return opOrderDelayOutstorageQueueMapper.updateByPrimaryKey(record);
}
@Override
public ApiResult moveBufferToSolidRedisQueue(Integer maxQueueCount) {
Integer queueCount = opOrderDelayOutstorageQueueMapper.getCurrentQueueCount();
if (queueCount > maxQueueCount) {
return ApiResult.fail("队列数已满。");
}
ApiResult result = new ApiResult<>();
int needMoveQueueCount = maxQueueCount - queueCount;
Long startBufferId = 0L;
int limit = 100;
while (true) {
if (needMoveQueueCount <= 0) {
result = ApiResult.fail("没有需要move的buffer");
break;
}
List<OpOrderDelayOutstorageQueue> queues = new ArrayList<>();
List<Long> deleteBufferIds = new ArrayList<>();
List<OpOrderDelayOutstorageBuffer> buffers = opOrderDelayOutstorageBufferMapper.getListPrimaryKeyBiggerThan(startBufferId, limit);
for (OpOrderDelayOutstorageBuffer buffer: buffers) {
startBufferId = buffer.getOpOrderDelayOutstorageBufferId();
deleteBufferIds.add(buffer.getOpOrderDelayOutstorageBufferId());
OpOrderDelayOutstorageQueue queue = new OpOrderDelayOutstorageQueue();
queue.setOrderId(buffer.getOrderId());
queue.setShopId(buffer.getShopId());
queue.setGmtLocked(null);
queue.setGmtCreate(new Date());
queue.setGmtModified(new Date());
queues.add(queue);
}
Long startQueueId = null;
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
try {
if (ObjectUtil.isNotEmpty(queues)) {
OpOrderDelayOutstorageQueue temp = queues.get(0);
opOrderDelayOutstorageQueueMapper.insert(temp);
startQueueId = temp.getOpOrderDelayOutstorageQueueId();
queues = CollectionUtil.sub(queues, 1, queues.size());
opOrderDelayOutstorageQueueMapper.insertBatch(queues);
}
if (ObjectUtil.isNotEmpty(deleteBufferIds)) {
opOrderDelayOutstorageBufferMapper.deleteByIdList(deleteBufferIds);
}
dataSourceTransactionManager.commit(transactionStatus);
} catch (Exception e) {
dataSourceTransactionManager.rollback(transactionStatus);
result = ApiResult.fail("提交数据异常");
break;
}
if (ObjectUtil.isNotNull(startQueueId)) {
int addQueueCount = queues.size();
int queueIdLoop = 0;
for (Long queueId = startQueueId; queueId < (addQueueCount + startQueueId); queueId++) {
OpOrderDelayOutstorageQueue queueData = queues.get(queueIdLoop);
String queueRedisKey = RedisKeyConst.getQueueRedisKey(TblConst.ds_message_consumer_queue, false);
redisTemplate.opsForList().leftPush(queueRedisKey, queueId.toString());
queueIdLoop++;
}
}
needMoveQueueCount -= deleteBufferIds.size();
if (needMoveQueueCount <= 0 || buffers.size() < limit) {
result = ApiResult.fail("move buffer 完成");
break;
}
}
return result;
}
@Override
public OpOrderDelayOutstorageQueue lockSolidRedisQueue(Long timerLockId, boolean isAdminSelf) {
String queueRedisKey = RedisKeyConst.getQueueRedisKey(TblConst.op_order_delay_outstorage_queue, isAdminSelf);
String queueIdRedis = redisTemplate.opsForList().rightPop(queueRedisKey);
if (StrUtil.isBlank(queueIdRedis)) {
return null;
}
OpOrderDelayOutstorageQueue row = opOrderDelayOutstorageQueueMapper.queryFirstRowByQueueId(queueIdRedis);
if (ObjectUtil.isEmpty(row)) {
return null;
}
Date date = new Date();
row.setLocked(timerLockId);
row.setHostname("");
row.setGmtLastHeartbeat(date);
row.setGmtModified(date);
row.setGmtLocked(date);
int affectRows = opOrderDelayOutstorageQueueMapper.updateByPrimaryKey(row);
if (affectRows == 1) {
return row;
}
return null;
}
}

@ -1,9 +1,6 @@
package com.ms.api.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.ms.api.common.Pager;
@ -11,6 +8,7 @@ import com.ms.api.consts.StatusConst;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.api.dto.order.SearchOutstorageLogListRequestDTO;
import com.ms.dal.entity.MicroMoveProductItem;
import com.ms.dal.entity.OpOrder;
import com.ms.dal.entity.OpOrderOutstorageHistory;
import com.ms.api.service.OpOrderOutstorageHistoryService;
import com.ms.dal.mapper.OpOrderOutstorageHistoryMapper;
@ -116,6 +114,12 @@ public class OpOrderOutstorageHistoryServiceImpl implements OpOrderOutstorageHis
opOrderOutstorageHistoryMapper.insertSelective(log);
}
}
@Override
public void addHistoryByOrder(OpOrder opOrder, Integer logisticsId, String waybillCode, String outstorageSource, int isUpdateOrderLogistics, ResultDTO outstorageRet) {
List<String> orderIds = Collections.singletonList(opOrder.getOrderId());
addOrderOutstorageHistory(opOrder.getShopId(), orderIds, logisticsId, waybillCode, outstorageSource, isUpdateOrderLogistics, outstorageRet);
}
}

@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.doudian.open.api.order_logisticsAddMultiPack.OrderLogisticsAddMultiPackRequest;
import com.doudian.open.api.order_logisticsAddMultiPack.OrderLogisticsAddMultiPackResponse;
import com.doudian.open.api.order_logisticsAddMultiPack.data.OrderLogisticsAddMultiPackData;
import com.doudian.open.api.order_logisticsAddMultiPack.param.OrderLogisticsAddMultiPackParam;
import com.doudian.open.api.order_logisticsAddMultiPack.param.PackListItem;
import com.doudian.open.api.order_logisticsAddMultiPack.param.ShippedOrderInfoItem;
@ -18,7 +17,9 @@ import com.ms.api.dto.dsorder.DeliverInfoDTO;
import com.ms.api.dto.dsorder.OrderPackageInfoDTO;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.api.dto.order.OrderMultiPackageOutstorageDTO;
import com.ms.api.exception.DeliveryNotReceivedException;
import com.ms.api.service.*;
import com.ms.api.tool.OrderTool;
import com.ms.api.tool.PurchaseTool;
import com.ms.dal.bo.OpLogisticsBO;
import com.ms.dal.bo.OpLogisticsPlatformBO;
@ -44,7 +45,6 @@ public class OutstorageServiceImpl implements OutstorageService {
private OpOrderService opOrderService;
private OpOrderDsService opOrderDsService;
private ShopService shopService;
private OpLogisticsService opLogisticsService;
private OpLogisticsPlatformService opLogisticsPlatformService;
private OpOrderOutstorageHistoryService opOrderOutstorageHistoryService;
@ -57,21 +57,20 @@ public class OutstorageServiceImpl implements OutstorageService {
private OpOrderChildLogisticsService opOrderChildLogisticsService;
private PurchaseOrderTagService purchaseOrderTagService;
private PurchaseOrderItemService purchaseOrderItemService;
private OpOrderDelayOutstorageBufferService opOrderDelayOutstorageBufferService;
@Override
public OrderLogisticsAddMultiPackData orderMultiPackageOutstorage(String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList) {
public ResultDTO orderMultiPackageOutstorage(String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList) {
if (StrUtil.isEmpty(orderId) || CollectionUtil.isEmpty(packageList)) {
throw new RuntimeException("参数错误");
}
OpOrder order = opOrderService.selectByOrderId(orderId);
Shop shop = shopService.getDetailById(order.getShopId());
return orderMultiPackageOutstorage(shop.getShopId(), orderId, packageList, shop.getAccessToken(), LogisticsConst.outstorageSourcePurchaseManualSend);
return orderMultiPackageOutstorage(order, packageList, LogisticsConst.outstorageSourcePurchaseManualSend);
}
@Override
public OrderLogisticsAddMultiPackData orderMultiPackageOutstorage(Long shopId, String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList, String accessToken, String outStorageSource) {
public ResultDTO orderMultiPackageOutstorage(OpOrder opOrder, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList, String outStorageSource) {
List<String> logisticsIds = packageList.stream().map(OrderMultiPackageOutstorageDTO.PackageInfoDTO::getLogisticsId).collect(Collectors.toList());
Map<Long, OpLogisticsBO> logisticsBOMap = getDdLogisticsListByLogisticsIds(logisticsIds);
@ -86,20 +85,21 @@ public class OutstorageServiceImpl implements OutstorageService {
packageInfoDTO.setCompany(opLogisticsBO.getLogisticsName());
}
// 保存操作数据,暂时不做
// saveOrderMultiPackageOutstorageResult(shopId, orderId, packageList, packData, outStorageSource);
ResultDTO result = orderLogisticsAddMultiPackToDd(opOrder.getOrderId(), packageList);
saveOrderMultiPackageOutstorageResult(opOrder, packageList, result, outStorageSource);
return orderLogisticsAddMultiPackToDd(orderId, packageList);
return result;
}
public OrderLogisticsAddMultiPackData orderLogisticsAddMultiPackToDd(String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList) {
public ResultDTO orderLogisticsAddMultiPackToDd(String orderId, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList) {
if (StrUtil.isEmpty(orderId) || CollectionUtil.isEmpty(packageList)) {
throw new RuntimeException("参数错误");
return ResultDTO.fail("参数错误");
}
Boolean check = checkCanOutStorage(Collections.singletonList(orderId), packageList);
if (!check) {
throw new RuntimeException("检测失败");
try {
checkCanOutStorage(Collections.singletonList(orderId), packageList);
} catch (RuntimeException e) {
return ResultDTO.fail(e.getMessage());
}
List<PackListItem> itemList = new ArrayList<>();
@ -116,7 +116,6 @@ public class OutstorageServiceImpl implements OutstorageService {
infoItems.add(infoItem);
});
}
itemList.add(item);
});
@ -126,14 +125,17 @@ public class OutstorageServiceImpl implements OutstorageService {
param.setRequestId(UUID.randomUUID().toString());
param.setPackList(itemList);
request.setParam(param);
OrderLogisticsAddMultiPackResponse response = request.execute();
if (!response.isSuccess()) {
throw new RuntimeException(response.getSubMsg());
}
return response.getData();
Map<String, Object> data = new HashMap<>();
data.put("packList", response.getData().getPackList());
return ResultDTO.success(data);
}
private Boolean checkCanOutStorage(List<String> orderIds, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList) {
private void checkCanOutStorage(List<String> orderIds, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList) {
if (CollectionUtil.isEmpty(orderIds)) {
throw new RuntimeException("发货接口调用参数错误");
}
@ -167,7 +169,7 @@ public class OutstorageServiceImpl implements OutstorageService {
}
if (CollectionUtil.isEmpty(goingOrderIdList)) {
return true;
return;
}
if (CollectionUtil.isNotEmpty(packageList)) {
@ -192,8 +194,26 @@ public class OutstorageServiceImpl implements OutstorageService {
}
}
private void saveOrderMultiPackageOutstorageResult() {
private void saveOrderMultiPackageOutstorageResult(OpOrder opOrder, List<OrderMultiPackageOutstorageDTO.PackageInfoDTO> packageList, ResultDTO result, String source) {
if (!result.isSuccess()) {
for (OrderMultiPackageOutstorageDTO.PackageInfoDTO packageInfo: packageList) {
opOrderOutstorageHistoryService.addHistoryByOrder(opOrder, Integer.valueOf(packageInfo.getLogisticsId()), packageInfo.getLogisticsCode(), source, 0, result);
}
return;
}
for (OrderMultiPackageOutstorageDTO.PackageInfoDTO packageInfo: packageList) {
String ddPackId = OrderTool.buildDdPackId(packageInfo.getCompanyCode(), packageInfo.getWaybillCode());
OpPackage newPackage = opPackageService.save(opOrder.getShopId(), ddPackId, packageInfo.getCompanyCode(), packageInfo.getWaybillCode());
OpPackageOrder newPackageOrder = opPackageOrderService.saveByOpPackage(newPackage, opOrder.getOrderId());
for (OrderMultiPackageOutstorageDTO.ShippedOrderInfo shippedOrderInfo: packageInfo.getShippedOrderInfo()) {
opOrderChildLogisticsService.saveByOpPackageOrderChild(opOrder.getOrderId(), shippedOrderInfo.getShippedOrderId(), opOrder.getShopId(), shippedOrderInfo.getShippedNum(), packageInfo.getCompanyCode(), packageInfo.getWaybillCode(), packageInfo.getLogisticsName());
opPackageOrderChildService.save(newPackage.getOpPackageId(), shippedOrderInfo.getShippedOrderId(), opOrder.getOrderId(), shippedOrderInfo.getShippedNum());
}
opOrderOutstorageHistoryService.addHistoryByOrder(opOrder, Integer.valueOf(packageInfo.getLogisticsId()), packageInfo.getLogisticsCode(), source, 0, result);
}
updateOrderStatusAfterPackageSend(Collections.singletonList(opOrder.getOrderId()));
}
private Map<Long, OpLogisticsBO> getDdLogisticsListByLogisticsIds(List<String> logisticsIds) {
@ -222,13 +242,24 @@ public class OutstorageServiceImpl implements OutstorageService {
}
private void dsOrderOutStorage(OpOrder opOrder, PurchaseOrder purchaseOrder, DsPurchaseSetting dsPurchaseSetting) {
Long nearExpShipTime = checkDsPurchaseAutoOutStorage(opOrder, purchaseOrder, dsPurchaseSetting);
Long nearExpShipTime;
try {
nearExpShipTime = checkDsPurchaseAutoOutStorage(opOrder, purchaseOrder, dsPurchaseSetting);
} catch (DeliveryNotReceivedException e) {
opOrderDelayOutstorageBufferService.save(opOrder.getShopId(), opOrder.getOrderId(), new Date(e.getShipTimestamp() * 1000));
throw e;
} catch (RuntimeException e) {
System.out.println(e.getMessage());
throw e;
}
boolean isShipAfterLogisticsAccept= dsPurchaseSetting.getDeliveryTimeType().equals(PurchaseOrderConst.DELIVERY_TIME_TYPE_LOGISTICS_ACCEPT) && nearExpShipTime != null;
List<PurchaseOrder> purchaseOrders = new ArrayList<>();
purchaseOrders.add(purchaseOrder);
OrderPackageInfoDTO orderPackageInfoDTO = packOrderDeliveryInfos(opOrder, purchaseOrders, isShipAfterLogisticsAccept, false, false);
orderMultiPackageOutstorage(opOrder.getShopId(), opOrder.getOrderId(), orderPackageInfoDTO.getPackageList(), "", LogisticsConst.outstorageSourceDsAuto);
opOrderDsService.updateOpOrderDsOrderStatus(opOrder);
ResultDTO result = orderMultiPackageOutstorage(opOrder, orderPackageInfoDTO.getPackageList(), LogisticsConst.outstorageSourceDsAuto);
if (result.isSuccess()) {
opOrderDsService.updateOpOrderDsOrderStatus(opOrder);
}
}
private Long checkDsPurchaseAutoOutStorage(OpOrder opOrder, PurchaseOrder purchaseOrder, DsPurchaseSetting dsPurchaseSetting) {
@ -239,11 +270,12 @@ public class OutstorageServiceImpl implements OutstorageService {
return null;
case PurchaseOrderConst.DELIVERY_TIME_TYPE_LOGISTICS_ACCEPT:
if (purchaseOrder.getLogisticsIsAccept() == 1 && opOrder.getGmtExpShipTime() != null) {
long nearExpShipTime = (opOrder.getGmtExpShipTime().getTime() - (new Date()).getTime()) / 1000;
long shipTimestamp = opOrder.getGmtExpShipTime().getTime();
long nearExpShipTime = (shipTimestamp - (new Date()).getTime()) / 1000;
if (nearExpShipTime <= 3600) {
return nearExpShipTime;
} else {
throw new RuntimeException("快递未揽收");
throw new DeliveryNotReceivedException("快递未揽收", shipTimestamp/1000 - 3600);
}
} else {
return null;
@ -295,26 +327,46 @@ public class OutstorageServiceImpl implements OutstorageService {
}
}
List<String> errorMessages = new ArrayList<>();
boolean hasProcessOutstorage = false;
if (!newPackages.isEmpty()) {
Long nearExpShipTime = checkDsPurchaseAutoOutStorage(opOrder, purchaseOrder, dsPurchaseSetting);
orderMultiPackageOutstorage(opOrder.getShopId(), opOrder.getOrderId(), new ArrayList<>(newPackages.values()), "", LogisticsConst.outstorageSourceDsAuto);
opOrderDsService.updateOpOrderDsOrderStatus(opOrder);
try {
checkDsPurchaseAutoOutStorage(opOrder, purchaseOrder, dsPurchaseSetting);
} catch (DeliveryNotReceivedException e) {
opOrderDelayOutstorageBufferService.save(opOrder.getShopId(), opOrder.getOrderId(), new Date(e.getShipTimestamp() * 1000));
errorMessages.add(e.getMessage());
} catch (RuntimeException e) {
errorMessages.add(e.getMessage());
}
ResultDTO result = orderMultiPackageOutstorage(opOrder, new ArrayList<>(newPackages.values()), LogisticsConst.outstorageSourceDsAuto);
if (result.isSuccess()) {
opOrderDsService.updateOpOrderDsOrderStatus(opOrder);
} else {
errorMessages.add(result.getMessage());
}
}
if (!needUpdateDdPackIds.isEmpty() && dsPurchaseSetting.getIsPurchaseLogisticsUpdateToPlatform() > 0 && !dsPurchaseSetting.getDeliveryTimeType().equals(PurchaseOrderConst.DELIVERY_TIME_TYPE_DISABLED)) {
for (OpPackage opPackage: currentHasSentPackages) {
if (needUpdateDdPackIds.contains(opPackage.getDdPackId())) {
hasProcessOutstorage = true;
doUpdateLogistics(opOrder, opPackage.getDdPackId(), orderPackageInfoDTO.getDeliveryInfo(), LogisticsConst.outstorageSourceDsLogisticsChangeUpdate);
try {
doUpdateLogistics(opOrder, opPackage.getDdPackId(), orderPackageInfoDTO.getDeliveryInfo(), LogisticsConst.outstorageSourceDsLogisticsChangeUpdate);
} catch (RuntimeException e) {
errorMessages.add("包裹:" + opPackage.getDdPackId() + ",失败原因:" + e.getMessage());
}
}
}
}
if (!hasProcessOutstorage) {
String failCode = (!newPackages.isEmpty() || !needUpdateDdPackIds.isEmpty()) ? "needAddHistory" : "";
// String failCode = (!newPackages.isEmpty() || !needUpdateDdPackIds.isEmpty()) ? "needAddHistory" : "";
throw new RuntimeException("没有达到发货或者更新物流信息条件" + (errorMessages.isEmpty() ? "" : "" + String.join(";", errorMessages)));
}
if (!errorMessages.isEmpty()) {
throw new RuntimeException(String.join(";", errorMessages));
}
}
public void doUpdateLogistics(OpOrder opOrder, String ddPackId, DeliverInfoDTO deliverInfo, String outStorageSource) {
@ -330,10 +382,12 @@ public class OutstorageServiceImpl implements OutstorageService {
}
String packId = oldPackageExt == null || StringUtils.isBlank(oldPackageExt.getDeliveryId()) ? ddPackId : oldPackageExt.getDeliveryId();
logisticsEditByPackToDd(opOrder.getOrderId(), packId, companyCode, waybillCode);
ResultDTO outstorageRet = new ResultDTO();
ResultDTO result = logisticsEditByPackToDd(opOrder.getOrderId(), packId, companyCode, waybillCode);
if (!result.isSuccess()) {
throw new RuntimeException(result.getMessage());
}
String newDdPackId = (companyCode + "_" + waybillCode).toLowerCase();
String newDdPackId = OrderTool.buildDdPackId (companyCode, waybillCode);
if (newDdPackId.equals(ddPackId)) {
return;
}
@ -365,17 +419,17 @@ public class OutstorageServiceImpl implements OutstorageService {
List<String> childOrderIds = new ArrayList<>();
for (OpPackageOrderChild packageOrderChild: oldPackageOrderChildren) {
childOrderIds.add(packageOrderChild.getChildOrderId());
opOrderChildLogisticsService.saveByOpPackageOrderChild(packageOrderChild, opOrder.getShopId(), companyCode, waybillCode, logisticsName);
opOrderChildLogisticsService.saveByOpPackageOrderChild(packageOrderChild.getOrderId(), packageOrderChild.getChildOrderId(), opOrder.getShopId(), packageOrderChild.getShippedNum(), companyCode, waybillCode, logisticsName);
opPackageOrderChildService.save(newPackage.getOpPackageId(), packageOrderChild.getChildOrderId(), opOrder.getOrderId(), packageOrderChild.getShippedNum());
}
opOrderChildLogisticsService.deleteByChildOrderIdsAndLogistics(childOrderIds, oldPackage.getCompanyCode(), oldPackage.getLogisticsCode());
List<String> orderIds = new ArrayList<>();
orderIds.add(opOrder.getOrderId());
opOrderOutstorageHistoryService.addOrderOutstorageHistory(opOrder.getShopId(), orderIds, logisticsId, waybillCode, outStorageSource, 1, outstorageRet);
opOrderOutstorageHistoryService.addOrderOutstorageHistory(opOrder.getShopId(), orderIds, logisticsId, waybillCode, outStorageSource, 1, result);
updateOrderStatusAfterPackageSend(orderIds);
}
private void logisticsEditByPackToDd(String orderId, String packId, String companyCode, String logisticsCode) {
private ResultDTO logisticsEditByPackToDd(String orderId, String packId, String companyCode, String logisticsCode) {
OrderLogisticsEditByPackRequest request = new OrderLogisticsEditByPackRequest();
OrderLogisticsEditByPackParam param = new OrderLogisticsEditByPackParam();
param.setOrderId(orderId);
@ -386,25 +440,14 @@ public class OutstorageServiceImpl implements OutstorageService {
request.execute();
OrderLogisticsEditByPackResponse response = request.execute();
if (!response.isSuccess()) {
throw new RuntimeException(response.getSubMsg());
return ResultDTO.fail(response.getMsg());
}
return ResultDTO.success();
}
private void updateOrderStatusAfterPackageSend(List<String> orderIds) {
List<OpOrderChild> children = opOrderChildService.getListByOrderIds(orderIds);
Map<String, Map<String, Integer>> orderIdAndChildOrderIdAndComboNumMap = new HashMap<>();
for (OpOrderChild child: children) {
Map<String, Integer> childOrderIdAndComboNumMap = new HashMap<>();
if (orderIdAndChildOrderIdAndComboNumMap.containsKey(child.getOrderId())) {
childOrderIdAndComboNumMap = orderIdAndChildOrderIdAndComboNumMap.get(child.getOrderId());
}
if (childOrderIdAndComboNumMap.containsKey(child.getChildOrderId())) {
childOrderIdAndComboNumMap.put(child.getChildOrderId(), childOrderIdAndComboNumMap.get(child.getChildOrderId()) + child.getComboNum());
} else {
childOrderIdAndComboNumMap.put(child.getChildOrderId(), child.getComboNum());
}
orderIdAndChildOrderIdAndComboNumMap.put(child.getOrderId(), childOrderIdAndComboNumMap);
}
Map<String, Map<String, Integer>> orderIdAndChildOrderIdAndComboNumMap = buildOrderIdAndChildOrderIdAndComboNumMap(children);
List<OpOrderChildLogistics> childLogisticsRows = opOrderChildLogisticsService.getListByOrderIds(orderIds);
Map<String, Map<String, Integer>> orderIdAndChildOrderIdAndShippedNumMap = new HashMap<>();
@ -453,6 +496,23 @@ public class OutstorageServiceImpl implements OutstorageService {
}
}
private static Map<String, Map<String, Integer>> buildOrderIdAndChildOrderIdAndComboNumMap(List<OpOrderChild> children) {
Map<String, Map<String, Integer>> orderIdAndChildOrderIdAndComboNumMap = new HashMap<>();
for (OpOrderChild child: children) {
Map<String, Integer> childOrderIdAndComboNumMap = new HashMap<>();
if (orderIdAndChildOrderIdAndComboNumMap.containsKey(child.getOrderId())) {
childOrderIdAndComboNumMap = orderIdAndChildOrderIdAndComboNumMap.get(child.getOrderId());
}
if (childOrderIdAndComboNumMap.containsKey(child.getChildOrderId())) {
childOrderIdAndComboNumMap.put(child.getChildOrderId(), childOrderIdAndComboNumMap.get(child.getChildOrderId()) + child.getComboNum());
} else {
childOrderIdAndComboNumMap.put(child.getChildOrderId(), child.getComboNum());
}
orderIdAndChildOrderIdAndComboNumMap.put(child.getOrderId(), childOrderIdAndComboNumMap);
}
return orderIdAndChildOrderIdAndComboNumMap;
}
private OrderPackageInfoDTO packOrderDeliveryInfos(OpOrder opOrder, List<PurchaseOrder> purchaseOrders, boolean isShipAfterLogisticsAccept, boolean isUpdateDelivery, boolean isIgnoreOrderStatus) {
if (purchaseOrders.isEmpty()) {
throw new RuntimeException("没有需要出库的采购单");

@ -11,32 +11,29 @@ import com.ms.api.common.SPIBaseService;
import com.ms.api.dto.dsorder.DsMessageCallbackRequestDTO;
import com.ms.api.service.DsMessageService;
import com.ms.api.tool.CommonTool;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 1688
* @author elf
*/
@ExtensionService("dsMessageCallback")
@Slf4j
@AllArgsConstructor
public class DsMessageCallbackService extends SPIBaseService implements ExtensionServiceHandler<DsMessageCallbackRequestDTO, Ret> {
@Autowired
private DsMessageService dsMessageService;
@Override
public BaseResponse<Ret> handle(BaseRequest<DsMessageCallbackRequestDTO> req) {
initHandle(req);
// ----参数校验----
DsMessageCallbackRequestDTO request = req.getData();
log.info("receive callback: " + JSON.toJSONString(request));
dsMessageService.addDsMessage(request.getShopId(), request.getPlatformPushMsgId(), request.getBizId(), request.getBizType(), request.getData());
// ----逻辑校验----
// ----业务处理----
// ----结果返回----
return R.ok(CommonTool.successResult());
try {
initHandle(req);
DsMessageCallbackRequestDTO request = req.getData();
log.info("receive callback: " + JSON.toJSONString(request));
dsMessageService.addDsMessage(request.getShopId(), request.getPlatformPushMsgId(), request.getBizId(), request.getBizType(), request.getData());
return R.ok(CommonTool.successResult());
} catch (RuntimeException e) {
return R.ok(Ret.fail(e.getMessage()));
}
}
}

@ -14,6 +14,7 @@ import com.jinritemai.cloud.base.api.ExtensionServiceHandler;
import com.ms.api.common.R;
import com.ms.api.common.Ret;
import com.ms.api.common.SPIBaseService;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.api.dto.order.OrderMultiPackageOutstorageDTO;
import com.ms.api.service.OutstorageService;
import com.ms.api.service.PurchaseOrderService;
@ -46,16 +47,16 @@ public class OrderMultiPackageOutstorageService extends SPIBaseService implement
// ----逻辑校验----
// ----业务处理----
OrderLogisticsAddMultiPackData packData = null;
ResultDTO result = null;
try {
packData = outstorageService.orderMultiPackageOutstorage(fields.getOrderId(), fields.getPackageList());
result = outstorageService.orderMultiPackageOutstorage(fields.getOrderId(), fields.getPackageList());
} catch (RuntimeException exception) {
return R.fail(exception.getLocalizedMessage());
}
// ----结果返回----
Map retData = new HashMap();
retData.put("packList", packData.getPackList());
retData.put("packList", result.getData());
return BaseResponse.<Ret>builder()
.success(true)
.message("success")

@ -0,0 +1,68 @@
package com.ms.api.task;
import com.ms.api.common.TaskBaseService;
import com.ms.api.service.OpOrderDelayOutstorageQueueService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.Executor;
/**
* @author elf
*/
@Configuration
@Component
@Slf4j
public class DelayOutstorageMoveBufferTaskService extends TaskBaseService {
@Autowired
private OpOrderDelayOutstorageQueueService opOrderDelayOutstorageQueueService;
@Bean(name = "delayOutstorageMoveBufferTaskPool")
@Override
public Executor getAsyncExecutor() {
return super.getAsyncExecutor();
}
@Resource(name = "delayOutstorageMoveBufferTaskPool")
protected Executor taskPool;
@Async("delayOutstorageMoveBufferTaskPool")
@Override
public void runTask() {
super.runTask();
}
@Override
public int getCorePoolSiz() {
return 3;
}
@Override
public String getTaskExecutorName() {
return "delayOutstorageMoveBufferTaskPool";
}
@Override
protected Executor getTaskPool() {
return null;
}
@Override
public Object getTask() {
return null;
}
@Override
public Object processTask(Object params) {
return opOrderDelayOutstorageQueueService.moveBufferToSolidRedisQueue(2000);
}
@Override
public void clearTask(Object params) {
}
}

@ -0,0 +1,78 @@
package com.ms.api.task;
import com.ms.api.common.TaskBaseService;
import com.ms.api.service.DistributionOrderService;
import com.ms.api.service.OpOrderDelayOutstorageQueueService;
import com.ms.dal.entity.OpOrderDelayOutstorageQueue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.Executor;
/**
* @author elf
*/
@Configuration
@Component
@Slf4j
public class DelayOutstorageProcessTaskService extends TaskBaseService {
@Autowired
private OpOrderDelayOutstorageQueueService opOrderDelayOutstorageQueueService;
@Autowired
private DistributionOrderService distributionOrderService;
@Bean(name = "delayOutstorageProcessTaskPool")
@Override
public Executor getAsyncExecutor() {
return super.getAsyncExecutor();
}
@Resource(name = "delayOutstorageProcessTaskPool")
protected Executor taskPool;
@Async("delayOutstorageProcessTaskPool")
@Override
public void runTask() {
super.runTask();
}
@Override
public int getCorePoolSiz() {
return 3;
}
@Override
public String getTaskExecutorName() {
return "delayOutstorageProcessTaskPool";
}
@Override
protected Executor getTaskPool() {
return null;
}
@Override
public Object getTask() {
Long timerLockId = 0L;
return opOrderDelayOutstorageQueueService.lockSolidRedisQueue(timerLockId, false);
}
@Override
public Object processTask(Object params) {
OpOrderDelayOutstorageQueue queue = (OpOrderDelayOutstorageQueue)params;
distributionOrderService.purchaseDelayOutstorage(queue.getShopId(), queue.getOrderId());
return null;
}
@Override
public void clearTask(Object params) {
OpOrderDelayOutstorageQueue queue = (OpOrderDelayOutstorageQueue)params;
opOrderDelayOutstorageQueueService.deleteByPrimaryKey(queue.getOpOrderDelayOutstorageQueueId());
}
}

@ -1,18 +1,26 @@
package com.ms.api.task;
import com.ms.api.common.TaskBaseService;
import com.ms.api.dto.dsorder.ResultDTO;
import com.ms.api.service.DistributionOrderService;
import com.ms.api.service.DsMessageConsumerQueueService;
import com.ms.api.service.DsMessageService;
import com.ms.dal.entity.DoudianMsgParseQueue;
import com.ms.dal.entity.DsMessageConsumerQueue;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
/**
* @author elf
*/
@Configuration
@Component
@Slf4j
@ -23,6 +31,34 @@ public class DsMessageConsumeMsgTaskService extends TaskBaseService {
@Autowired
private DistributionOrderService distributionOrderService;
@Autowired
private DsMessageService dsMessageService;
@Bean(name = "dsMessageConsumeMsgTaskPool")
@Override
public Executor getAsyncExecutor() {
return super.getAsyncExecutor();
}
@Resource(name = "dsMessageConsumeMsgTaskPool")
protected Executor taskPool;
@Async("dsMessageConsumeMsgTaskPool")
@Override
public void runTask() {
super.runTask();
}
@Override
public int getCorePoolSiz() {
return 3;
}
@Override
public String getTaskExecutorName() {
return "dsMessageConsumeMsgTaskPool";
}
@Override
protected Executor getTaskPool() {
return null;
@ -31,20 +67,28 @@ public class DsMessageConsumeMsgTaskService extends TaskBaseService {
@Override
public Object getTask() {
Long timerLockId = 0L;
DsMessageConsumerQueue queue = dsMessageConsumerQueueService.lockSolidRedisQueue(timerLockId, false);
return queue;
return dsMessageConsumerQueueService.lockSolidRedisQueue(timerLockId, false);
}
@Override
public Object processTask(Object params) {
if (params == null) {
return false;
Map<String, Object> res = new HashMap<>();
res.put("queue", params);
try {
distributionOrderService.processDsMessage(((DsMessageConsumerQueue)params).getDsMessageId());
res.put("processResult", ResultDTO.success());
} catch (RuntimeException e) {
res.put("processResult", ResultDTO.fail(e.getMessage()));
}
distributionOrderService.processDsMessage(((DsMessageConsumerQueue)params).getDsMessageId());
return true;
return res;
}
@Override
@SuppressWarnings("unchecked")
public void clearTask(Object params) {
Map<String, Object> res = (Map<String, Object>)params;
DsMessageConsumerQueue queue = (DsMessageConsumerQueue)res.get("queue");
ResultDTO processResult = (ResultDTO)res.get("processResult");
dsMessageService.clearDsMessageQueue(queue, processResult);
}
}

@ -2,14 +2,20 @@ package com.ms.api.task;
import com.ms.api.common.TaskBaseService;
import com.ms.api.service.DsMessageConsumerQueueService;
import com.ms.api.service.DsMessageService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.Executor;
/**
* @author elf
*/
@Configuration
@Component
@Slf4j
@ -17,6 +23,31 @@ public class DsMessageMoveBufferTaskService extends TaskBaseService {
@Autowired
private DsMessageConsumerQueueService dsMessageConsumerQueueService;
@Bean(name = "dsMessageMoveBufferTaskPool")
@Override
public Executor getAsyncExecutor() {
return super.getAsyncExecutor();
}
@Resource(name = "dsMessageMoveBufferTaskPool")
protected Executor taskPool;
@Async("dsMessageMoveBufferTaskPool")
@Override
public void runTask() {
super.runTask();
}
@Override
public int getCorePoolSiz() {
return 3;
}
@Override
public String getTaskExecutorName() {
return "dsMessageMoveBufferTaskPool";
}
@Override
protected Executor getTaskPool() {
return null;
@ -24,16 +55,15 @@ public class DsMessageMoveBufferTaskService extends TaskBaseService {
@Override
public Object getTask() {
return null;
return true;
}
@Override
public Object processTask(Object params) {
return dsMessageConsumerQueueService.moveBufferToSolidRedisQueue(2000);
return dsMessageConsumerQueueService.moveBufferToSolidRedisQueue(2000);
}
@Override
public void clearTask(Object params) {
}
}

@ -115,16 +115,19 @@ public class RefreshTokenTimerTaskService extends TaskBaseService {
if (ObjectUtil.isEmpty(newAccessToken)) {
E.throwMSException("获取accessToken失败");
}
if (ObjectUtil.isEmpty(newAccessToken)) {
if (newAccessToken.equals(oldAccessToken)) {
log.info("accessToken无需更新");
Map result = new HashMap();
result.put("msg", "accessToken无需更新");
return R.ok(Ret.success());
return true;
}
shop.setExpiresIn(newExpires.toString());
shop.setRefreshToken(SecurityTool.encodeByAES(newRefreshToken));
shop.setAccessToken(SecurityTool.encodeByAES(newAccessToken));
shop.setGmtExpire(new Date(TimeTool.getDateTimeBySeconds(new Long(newExpires).intValue())));
shop.setGmtModified(new Date(TimeTool.getDateTimeBySeconds(0)));
log.info("oldAccessToken:"+oldAccessToken);
log.info("newAccessToken"+newAccessToken);
shop.setGmtExpire(DateUtil.parseDateTime(TimeTool.getDateTimeBySeconds(new Long(newExpires).intValue())));
shop.setGmtModified(DateUtil.parseDateTime(TimeTool.getDateTimeBySeconds(0)));
shopService.updateByPrimaryKey(shop);
}
return true;

@ -581,4 +581,19 @@ public class CommonTool {
System.out.println(splitWithComma("6921394317136631525|6921399584322230185|6921393247513351270|6921412710844995353"));
}
public static int getRandom(int x, int y) {
int num = -1;
//两个数在合法范围内,并不限制输入的数哪个更大一些
if (x < 0 || y < 0) {
return num;
} else {
int max = Math.max(x, y);
int min = Math.min(x, y);
int mid = max - min;//求差
//产生随机数
num = (int) (Math.random() * (mid + 1)) + min;
}
return num;
}
}

@ -93,4 +93,8 @@ public class OrderTool {
opOrderEncrypt.getDetailIndex()
)));
}
public static String buildDdPackId(String companyCode, String waybillCode) {
return (companyCode + "_" + waybillCode).toLowerCase();
}
}

@ -13,7 +13,7 @@ public class OpOrderDelayOutstorageBuffer implements Serializable {
/**
*
*/
private Integer opOrderDelayOutstorageBufferId;
private Long opOrderDelayOutstorageBufferId;
/**
*

@ -13,7 +13,7 @@ public class OpOrderDelayOutstorageQueue implements Serializable {
/**
*
*/
private Integer opOrderDelayOutstorageQueueId;
private Long opOrderDelayOutstorageQueueId;
/**
*
@ -38,7 +38,7 @@ public class OpOrderDelayOutstorageQueue implements Serializable {
/**
*
*/
private Integer locked;
private Long locked;
/**
*

@ -24,4 +24,6 @@ public interface DsMessageMapper {
int updateByPrimaryKey(DsMessage record);
DsMessage getNewestDsMessage(@Param("bizId") String bizId, @Param("bizType") String bizType, @Param("curPlatformPushMsgId") Long curPlatformPushMsgId, @Param("curGmtCreate") String curGmtCreate, @Param("purchaseOrderSn") @Nullable String purchaseOrderSn);
int updateStatus(@Param("dsMessageId")Long dsMessageId, @Param("result")String result, @Param("reason")String reason);
}

@ -1,7 +1,11 @@
package com.ms.dal.mapper;
import com.ms.dal.entity.DsMessageConsumerBuffer;
import com.ms.dal.entity.OpOrderDelayOutstorageBuffer;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Entity com.ms.dal.entity.OpOrderDelayOutstorageBuffer
@ -23,4 +27,9 @@ public interface OpOrderDelayOutstorageBufferMapper {
int updateByPrimaryKey(OpOrderDelayOutstorageBuffer record);
OpOrderDelayOutstorageBuffer getByOrderId(@Param("orderId") String orderId);
List<OpOrderDelayOutstorageBuffer> getListPrimaryKeyBiggerThan(@Param("id") Long id, @Param("limit") Integer limit);
void deleteByIdList(@Param("deleteBufferIds") List<Long> deleteBufferIds);
}

@ -1,7 +1,11 @@
package com.ms.dal.mapper;
import com.ms.dal.entity.DsMessageConsumerQueue;
import com.ms.dal.entity.OpOrderDelayOutstorageQueue;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Entity com.ms.dal.entity.OpOrderDelayOutstorageQueue
@ -23,4 +27,9 @@ public interface OpOrderDelayOutstorageQueueMapper {
int updateByPrimaryKey(OpOrderDelayOutstorageQueue record);
int getCurrentQueueCount();
int insertBatch(List<OpOrderDelayOutstorageQueue> queues);
OpOrderDelayOutstorageQueue queryFirstRowByQueueId(@Param("queueId") String queueId);
}

@ -28,7 +28,7 @@
select
<include refid="Base_Column_List" />
from ds_message_consumer_buffer
where ds_message_consumer_buffer_id > #{dsMessageConsumerBufferId,jdbcType=BIGINT}
where ds_message_consumer_buffer_id > #{id,jdbcType=BIGINT}
limit #{limit}
</select>
<delete id="deleteByIdList">

@ -137,4 +137,12 @@
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
where ds_message_id = #{dsMessageId,jdbcType=BIGINT}
</update>
<update id="updateStatus">
update ds_message
set
status = #{status,jdbcType=VARCHAR},
reason = #{reason,jdbcType=VARCHAR},
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
where ds_message_id = #{dsMessageId,jdbcType=BIGINT}
</update>
</mapper>

@ -5,7 +5,7 @@
<mapper namespace="com.ms.dal.mapper.OpOrderDelayOutstorageBufferMapper">
<resultMap id="BaseResultMap" type="com.ms.dal.entity.OpOrderDelayOutstorageBuffer">
<id property="opOrderDelayOutstorageBufferId" column="op_order_delay_outstorage_buffer_id" jdbcType="INTEGER"/>
<id property="opOrderDelayOutstorageBufferId" column="op_order_delay_outstorage_buffer_id" jdbcType="BIGINT"/>
<result property="shopId" column="shop_id" jdbcType="BIGINT"/>
<result property="orderId" column="order_id" jdbcType="VARCHAR"/>
<result property="gmtExec" column="gmt_exec" jdbcType="TIMESTAMP"/>
@ -24,19 +24,31 @@
select
<include refid="Base_Column_List" />
from op_order_delay_outstorage_buffer
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=INTEGER}
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=BIGINT}
</select>
<select id="getByOrderId" resultType="com.ms.dal.entity.OpOrderDelayOutstorageBuffer">
select
<include refid="Base_Column_List" />
from op_order_delay_outstorage_buffer
where order_id = #{orderId,jdbcType=VARCHAR}
</select>
<select id="getListPrimaryKeyBiggerThan" resultType="com.ms.dal.entity.OpOrderDelayOutstorageBuffer">
select
<include refid="Base_Column_List" />
from op_order_delay_outstorage_buffer
where op_order_delay_outstorage_buffer_id > #{id,jdbcType=BIGINT}
limit #{limit}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete from op_order_delay_outstorage_buffer
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=INTEGER}
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=BIGINT}
</delete>
<insert id="insert" keyColumn="op_order_delay_outstorage_buffer_id" keyProperty="opOrderDelayOutstorageBufferId" parameterType="com.ms.dal.entity.OpOrderDelayOutstorageBuffer" useGeneratedKeys="true">
insert into op_order_delay_outstorage_buffer
( op_order_delay_outstorage_buffer_id,shop_id,order_id
,gmt_exec,try_times,gmt_create
,gmt_modified)
values (#{opOrderDelayOutstorageBufferId,jdbcType=INTEGER},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
values (#{opOrderDelayOutstorageBufferId,jdbcType=BIGINT},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{gmtCreate,jdbcType=TIMESTAMP}
,#{gmtModified,jdbcType=TIMESTAMP})
</insert>
@ -46,7 +58,7 @@
( op_order_delay_outstorage_buffer_id,shop_id,order_id
,gmt_exec,try_times,gmt_create
,gmt_modified)
values (#{opOrderDelayOutstorageBufferId,jdbcType=INTEGER},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
values (#{opOrderDelayOutstorageBufferId,jdbcType=BIGINT},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{gmtCreate,jdbcType=TIMESTAMP}
,#{gmtModified,jdbcType=TIMESTAMP})
ON DUPLICATE KEY UPDATE
@ -68,7 +80,7 @@
<if test="gmtModified != null">gmt_modified,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="opOrderDelayOutstorageBufferId != null">#{opOrderDelayOutstorageBufferId,jdbcType=INTEGER},</if>
<if test="opOrderDelayOutstorageBufferId != null">#{opOrderDelayOutstorageBufferId,jdbcType=BIGINT},</if>
<if test="shopId != null">#{shopId,jdbcType=BIGINT},</if>
<if test="orderId != null">#{orderId,jdbcType=VARCHAR},</if>
<if test="gmtExec != null">#{gmtExec,jdbcType=TIMESTAMP},</if>
@ -99,7 +111,7 @@
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP},
</if>
</set>
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=INTEGER}
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=BIGINT}
</update>
<update id="updateByPrimaryKey" parameterType="com.ms.dal.entity.OpOrderDelayOutstorageBuffer">
update op_order_delay_outstorage_buffer
@ -110,6 +122,6 @@
try_times = #{tryTimes,jdbcType=INTEGER},
gmt_create = #{gmtCreate,jdbcType=TIMESTAMP},
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=INTEGER}
where op_order_delay_outstorage_buffer_id = #{opOrderDelayOutstorageBufferId,jdbcType=BIGINT}
</update>
</mapper>

@ -5,12 +5,12 @@
<mapper namespace="com.ms.dal.mapper.OpOrderDelayOutstorageQueueMapper">
<resultMap id="BaseResultMap" type="com.ms.dal.entity.OpOrderDelayOutstorageQueue">
<id property="opOrderDelayOutstorageQueueId" column="op_order_delay_outstorage_queue_id" jdbcType="INTEGER"/>
<id property="opOrderDelayOutstorageQueueId" column="op_order_delay_outstorage_queue_id" jdbcType="BIGINT"/>
<result property="shopId" column="shop_id" jdbcType="BIGINT"/>
<result property="orderId" column="order_id" jdbcType="VARCHAR"/>
<result property="gmtExec" column="gmt_exec" jdbcType="TIMESTAMP"/>
<result property="tryTimes" column="try_times" jdbcType="INTEGER"/>
<result property="locked" column="locked" jdbcType="INTEGER"/>
<result property="locked" column="locked" jdbcType="BIGINT"/>
<result property="gmtLocked" column="gmt_locked" jdbcType="TIMESTAMP"/>
<result property="hostname" column="hostname" jdbcType="VARCHAR"/>
<result property="gmtLastHeartbeat" column="gmt_last_heartbeat" jdbcType="TIMESTAMP"/>
@ -29,12 +29,18 @@
select
<include refid="Base_Column_List" />
from op_order_delay_outstorage_queue
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=INTEGER}
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=BIGINT}
</select>
<select id="getCurrentQueueCount" resultType="java.lang.Integer">
select count(*) from op_order_delay_outstorage_queue
</select>
<select id="queryFirstRowByQueueId" resultType="com.ms.dal.entity.OpOrderDelayOutstorageQueue">
select * from op_order_delay_outstorage_queue where `locked` = 0 and op_order_delay_outstorage_queue_id = #{queueId}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete from op_order_delay_outstorage_queue
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=INTEGER}
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=BIGINT}
</delete>
<insert id="insert" keyColumn="op_order_delay_outstorage_queue_id" keyProperty="opOrderDelayOutstorageQueueId" parameterType="com.ms.dal.entity.OpOrderDelayOutstorageQueue" useGeneratedKeys="true">
insert into op_order_delay_outstorage_queue
@ -42,8 +48,8 @@
,gmt_exec,try_times,locked
,gmt_locked,hostname,gmt_last_heartbeat
,gmt_create,gmt_modified)
values (#{opOrderDelayOutstorageQueueId,jdbcType=INTEGER},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{locked,jdbcType=INTEGER}
values (#{opOrderDelayOutstorageQueueId,jdbcType=BIGINT},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{locked,jdbcType=BIGINT}
,#{gmtLocked,jdbcType=TIMESTAMP},#{hostname,jdbcType=VARCHAR},#{gmtLastHeartbeat,jdbcType=TIMESTAMP}
,#{gmtCreate,jdbcType=TIMESTAMP},#{gmtModified,jdbcType=TIMESTAMP})
</insert>
@ -54,8 +60,8 @@
,gmt_exec,try_times,locked
,gmt_locked,hostname,gmt_last_heartbeat
,gmt_create,gmt_modified)
values (#{opOrderDelayOutstorageQueueId,jdbcType=INTEGER},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{locked,jdbcType=INTEGER}
values (#{opOrderDelayOutstorageQueueId,jdbcType=BIGINT},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{locked,jdbcType=BIGINT}
,#{gmtLocked,jdbcType=TIMESTAMP},#{hostname,jdbcType=VARCHAR},#{gmtLastHeartbeat,jdbcType=TIMESTAMP}
,#{gmtCreate,jdbcType=TIMESTAMP},#{gmtModified,jdbcType=TIMESTAMP})
ON DUPLICATE KEY UPDATE
@ -63,7 +69,7 @@
order_id = #{orderId,jdbcType=VARCHAR},
gmt_exec = #{gmtExec,jdbcType=TIMESTAMP},
try_times = #{tryTimes,jdbcType=INTEGER},
locked = #{locked,jdbcType=INTEGER},
locked = #{locked,jdbcType=BIGINT},
gmt_locked = #{gmtLocked,jdbcType=TIMESTAMP},
hostname = #{hostname,jdbcType=VARCHAR},
gmt_last_heartbeat = #{gmtLastHeartbeat,jdbcType=TIMESTAMP},
@ -85,12 +91,12 @@
<if test="gmtModified != null">gmt_modified,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="opOrderDelayOutstorageQueueId != null">#{opOrderDelayOutstorageQueueId,jdbcType=INTEGER},</if>
<if test="opOrderDelayOutstorageQueueId != null">#{opOrderDelayOutstorageQueueId,jdbcType=BIGINT},</if>
<if test="shopId != null">#{shopId,jdbcType=BIGINT},</if>
<if test="orderId != null">#{orderId,jdbcType=VARCHAR},</if>
<if test="gmtExec != null">#{gmtExec,jdbcType=TIMESTAMP},</if>
<if test="tryTimes != null">#{tryTimes,jdbcType=INTEGER},</if>
<if test="locked != null">#{locked,jdbcType=INTEGER},</if>
<if test="locked != null">#{locked,jdbcType=BIGINT},</if>
<if test="gmtLocked != null">#{gmtLocked,jdbcType=TIMESTAMP},</if>
<if test="hostname != null">#{hostname,jdbcType=VARCHAR},</if>
<if test="gmtLastHeartbeat != null">#{gmtLastHeartbeat,jdbcType=TIMESTAMP},</if>
@ -98,6 +104,21 @@
<if test="gmtModified != null">#{gmtModified,jdbcType=TIMESTAMP},</if>
</trim>
</insert>
<insert id="insertBatch" useGeneratedKeys="true" keyColumn="op_order_delay_outstorage_queue_id" keyProperty="opOrderDelayOutstorageQueueId" >
insert into op_order_delay_outstorage_queue
( op_order_delay_outstorage_queue_id,shop_id,order_id
,gmt_exec,try_times,locked
,gmt_locked,hostname,gmt_last_heartbeat
,gmt_create,gmt_modified)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{opOrderDelayOutstorageQueueId,jdbcType=BIGINT},#{shopId,jdbcType=BIGINT},#{orderId,jdbcType=VARCHAR}
,#{gmtExec,jdbcType=TIMESTAMP},#{tryTimes,jdbcType=INTEGER},#{locked,jdbcType=BIGINT}
,#{gmtLocked,jdbcType=TIMESTAMP},#{hostname,jdbcType=VARCHAR},#{gmtLastHeartbeat,jdbcType=TIMESTAMP}
,#{gmtCreate,jdbcType=TIMESTAMP},#{gmtModified,jdbcType=TIMESTAMP}
)
</foreach>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.ms.dal.entity.OpOrderDelayOutstorageQueue">
update op_order_delay_outstorage_queue
<set>
@ -114,7 +135,7 @@
try_times = #{tryTimes,jdbcType=INTEGER},
</if>
<if test="locked != null">
locked = #{locked,jdbcType=INTEGER},
locked = #{locked,jdbcType=BIGINT},
</if>
<if test="gmtLocked != null">
gmt_locked = #{gmtLocked,jdbcType=TIMESTAMP},
@ -132,7 +153,7 @@
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP},
</if>
</set>
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=INTEGER}
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=BIGINT}
</update>
<update id="updateByPrimaryKey" parameterType="com.ms.dal.entity.OpOrderDelayOutstorageQueue">
update op_order_delay_outstorage_queue
@ -141,12 +162,12 @@
order_id = #{orderId,jdbcType=VARCHAR},
gmt_exec = #{gmtExec,jdbcType=TIMESTAMP},
try_times = #{tryTimes,jdbcType=INTEGER},
locked = #{locked,jdbcType=INTEGER},
locked = #{locked,jdbcType=BIGINT},
gmt_locked = #{gmtLocked,jdbcType=TIMESTAMP},
hostname = #{hostname,jdbcType=VARCHAR},
gmt_last_heartbeat = #{gmtLastHeartbeat,jdbcType=TIMESTAMP},
gmt_create = #{gmtCreate,jdbcType=TIMESTAMP},
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=INTEGER}
where op_order_delay_outstorage_queue_id = #{opOrderDelayOutstorageQueueId,jdbcType=BIGINT}
</update>
</mapper>

@ -151,10 +151,10 @@
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
where shop_id = #{shopId,jdbcType=BIGINT}
</update>
<select id="getExpiresTokenShops" parameterType="java.lang.Long" resultMap="BaseResultMap">
<select id="getExpiresTokenShops" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from shop
where gmt_expire &lt; #{gmtExpireStart,jdbcType=TIMESTAMP} and gmt_expire &gt; #{gmtExpireEnd,jdbcType=TIMESTAMP}
where gmt_expire &lt; #{gmtExpireStart} and gmt_expire &gt; #{gmtExpireEnd}
</select>
</mapper>

@ -142,21 +142,6 @@ public class Test {
// System.out.println(m.group(2));
// System.out.println(m.find());
// System.out.println(m.group(2));
System.out.println(buildRemarkTplHtml("[{\"content\":\"#采购平台#\",\"name\":\"purchase_platform_2\",\"type\":\"field\"},{\"content\":\"#\",\"type\":\"text\"},{\"content\":\"#采购单号#\",\"name\":\"purchase_order_sn\",\"type\":\"field\"},{\"content\":\"#\",\"type\":\"text\"},{\"content\":\"#快递及运单号#\",\"name\":\"logistics_info\",\"type\":\"field\"},{\"content\":\"#\",\"type\":\"text\"},{\"content\":\"#采购账号#\",\"name\":\"purchase_order_buyer\",\"type\":\"field\"}]\n"));
}
private static String buildRemarkTplHtml(String remarkTpl) {
List<RemarkTplTagDTO> remarkTplTags = JSON.parseArray(remarkTpl, RemarkTplTagDTO.class);
StringBuilder remarkTplHtml = new StringBuilder();
for (RemarkTplTagDTO tag: remarkTplTags) {
if ("field".equals(tag.getType())) {
remarkTplHtml.append("<span data-field=\"").append(tag.getName()).append("\">").append(tag.getContent()).append("</span>");
} else if("text".equals(tag.getType())) {
remarkTplHtml.append(tag.getContent());
}
}
return remarkTplHtml.toString();
}
public void go()

Loading…
Cancel
Save