mirror of https://github.com/jeecgboot/jeecg-boot
Create YDTrackingNumberJob to retrieve local tracking numbers, and to update them in database, also set ready_for_shopify_sync
parent
f2c5040a4b
commit
3bb661f535
|
@ -0,0 +1,122 @@
|
||||||
|
package org.jeecg.modules.business.domain.job;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.http.HttpEntity;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
import org.codehaus.jettison.json.JSONArray;
|
||||||
|
import org.codehaus.jettison.json.JSONException;
|
||||||
|
import org.codehaus.jettison.json.JSONObject;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDRequest;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberData;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberRequestBody;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberResponse;
|
||||||
|
import org.jeecg.modules.business.service.IPlatformOrderService;
|
||||||
|
import org.quartz.Job;
|
||||||
|
import org.quartz.JobDataMap;
|
||||||
|
import org.quartz.JobExecutionContext;
|
||||||
|
import org.quartz.JobExecutionException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class YDTrackingNumberJob implements Job {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IPlatformOrderService platformOrderService;
|
||||||
|
|
||||||
|
private static final Integer DEFAULT_NUMBER_OF_THREADS = 10;
|
||||||
|
|
||||||
|
private final static String APP_TOKEN = "y553qci626dds5d6lcughy3ogicvfaxmh";
|
||||||
|
private final static String APP_KEY = "ynpoeds5511hg791mmksg6xccqxhax11j16eqz1itylq7whijki20egl0nmyql5h9";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(JobExecutionContext context) throws JobExecutionException {
|
||||||
|
List<String> shops = new ArrayList<>();
|
||||||
|
Map<String, List<String>> transportersByShop = new HashMap<>();
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||||
|
JobDataMap jobDataMap = context.getMergedJobDataMap();
|
||||||
|
String parameter = ((String) jobDataMap.get("parameter"));
|
||||||
|
if (parameter != null) {
|
||||||
|
try {
|
||||||
|
JSONObject jsonObject = new JSONObject(parameter);
|
||||||
|
if (!jsonObject.isNull("transportersByShop")) {
|
||||||
|
JSONArray transportersByShopArray = jsonObject.getJSONArray("transportersByShop");
|
||||||
|
for (int i = 0; i < transportersByShopArray.length(); i++) {
|
||||||
|
JSONObject object = transportersByShopArray.getJSONObject((i));
|
||||||
|
if (!object.isNull("shop")) {
|
||||||
|
String shopCode = object.getString("shop");
|
||||||
|
shops.add(shopCode);
|
||||||
|
if (!object.isNull("transporters")) {
|
||||||
|
JSONArray transportersArray = object.getJSONArray("transporters");
|
||||||
|
List<String> transporters = new ArrayList<>();
|
||||||
|
for (int j = 0; j < transportersArray.length(); j++) {
|
||||||
|
transporters.add(transportersArray.getString(j));
|
||||||
|
}
|
||||||
|
transportersByShop.put(shopCode, transporters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
log.error("Error while parsing parameter as JSON, falling back to default parameters.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("Starting to retrieve local tracking numbers");
|
||||||
|
List<YDTrackingNumberData> localTrackingNumbers = new ArrayList<>();
|
||||||
|
List<String> platformOrderIds = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, List<String>> entry : transportersByShop.entrySet()) {
|
||||||
|
platformOrderIds.addAll(platformOrderService.fetchShippedOrdersFromShopAndTransporters(entry.getKey(), entry.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<YDRequest> ydRequests = new ArrayList<>();
|
||||||
|
platformOrderIds.forEach(platformOrderId -> {
|
||||||
|
YDTrackingNumberRequestBody ydParcelTraceRequestBody = new YDTrackingNumberRequestBody(platformOrderId);
|
||||||
|
YDRequest ydRequest = new YDRequest(APP_TOKEN, APP_KEY, ydParcelTraceRequestBody);
|
||||||
|
ydRequests.add(ydRequest);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
ExecutorService executor = Executors.newFixedThreadPool(DEFAULT_NUMBER_OF_THREADS);
|
||||||
|
List<CompletableFuture<Boolean>> futures = ydRequests.stream()
|
||||||
|
.map(request -> CompletableFuture.supplyAsync(() -> {
|
||||||
|
boolean success = false;
|
||||||
|
HttpEntity entity = request.send().getEntity();
|
||||||
|
try {
|
||||||
|
// String of the response
|
||||||
|
String responseString = EntityUtils.toString(entity, "UTF-8");
|
||||||
|
YDTrackingNumberResponse ydResponse = mapper.readValue(responseString, YDTrackingNumberResponse.class);
|
||||||
|
if (ydResponse.getTrackingNumberData().getLocalTrackingNumber() != null &&
|
||||||
|
!ydResponse.getTrackingNumberData().getLocalTrackingNumber().isEmpty()) {
|
||||||
|
localTrackingNumbers.add(ydResponse.getTrackingNumberData());
|
||||||
|
}
|
||||||
|
success = true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error while parsing response into String", e);
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}, executor))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
List<Boolean> results = futures.stream().map(CompletableFuture::join).collect(Collectors.toList());
|
||||||
|
long nbSuccesses = results.stream().filter(b -> b).count();
|
||||||
|
log.info("{}/{} local tracking numbers have been retrieved.", nbSuccesses, ydRequests.size());
|
||||||
|
|
||||||
|
log.info("Started updating {} local tracking numbers", localTrackingNumbers.size());
|
||||||
|
platformOrderService.updateLocalTrackingNumber(localTrackingNumbers);
|
||||||
|
log.info("Ended updating local tracking numbers for the following orders : {}", localTrackingNumbers.stream()
|
||||||
|
.map(YDTrackingNumberData::getPlatformOrderId)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package org.jeecg.modules.business.mapper;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order;
|
import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberData;
|
||||||
import org.jeecg.modules.business.entity.PlatformOrder;
|
import org.jeecg.modules.business.entity.PlatformOrder;
|
||||||
import org.jeecg.modules.business.entity.PlatformOrderShopSync;
|
import org.jeecg.modules.business.entity.PlatformOrderShopSync;
|
||||||
import org.jeecg.modules.business.vo.OrderKpi;
|
import org.jeecg.modules.business.vo.OrderKpi;
|
||||||
|
@ -233,4 +234,8 @@ public interface PlatformOrderMapper extends BaseMapper<PlatformOrder> {
|
||||||
|
|
||||||
List<String> findReadyAbnormalOrdersWithSkus(@Param("skus") List<String> skus);
|
List<String> findReadyAbnormalOrdersWithSkus(@Param("skus") List<String> skus);
|
||||||
void updateShopifySynced(@Param("platformOrderIds") Collection<String> platformOrderIds);
|
void updateShopifySynced(@Param("platformOrderIds") Collection<String> platformOrderIds);
|
||||||
|
|
||||||
|
List<String> fetchShippedOrdersFromShopAndTransporters(@Param("shopCode")String shopCode, @Param("transporters") List<String> transporters);
|
||||||
|
|
||||||
|
void updateLocalTrackingNumber(@Param("data") List<YDTrackingNumberData> data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1074,4 +1074,38 @@
|
||||||
#{platformOrderId}
|
#{platformOrderId}
|
||||||
</foreach>
|
</foreach>
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
|
<select id="fetchShippedOrdersFromShopAndTransporters" resultType="java.lang.String">
|
||||||
|
SELECT platform_order_id
|
||||||
|
FROM platform_order po join shop s ON po.shop_id = s.id
|
||||||
|
WHERE erp_code = #{shopCode}
|
||||||
|
AND erp_status = 3
|
||||||
|
AND shopify_synced = 0
|
||||||
|
AND logistic_channel_name IN
|
||||||
|
<foreach
|
||||||
|
collection="transporters"
|
||||||
|
separator=","
|
||||||
|
open="("
|
||||||
|
close=")"
|
||||||
|
index="index"
|
||||||
|
item="transporter">
|
||||||
|
#{transporter}
|
||||||
|
</foreach>
|
||||||
|
;
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<update id="updateLocalTrackingNumber">
|
||||||
|
UPDATE platform_order
|
||||||
|
SET ready_for_shopify_sync = 1,
|
||||||
|
local_tracking_number =
|
||||||
|
case platform_order_id
|
||||||
|
<foreach collection="data" separator=" " open="" close="" index="index" item="item">
|
||||||
|
when #{item.platformOrderId} then #{item.localTrackingNumber}
|
||||||
|
</foreach>
|
||||||
|
end
|
||||||
|
where platform_order_id in
|
||||||
|
<foreach collection="data" separator="," open="(" close=")" index="index" item="item">
|
||||||
|
#{item.platformOrderId}
|
||||||
|
</foreach>
|
||||||
|
</update>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.jeecg.modules.business.service;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.jeecg.modules.business.controller.UserException;
|
import org.jeecg.modules.business.controller.UserException;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberData;
|
||||||
import org.jeecg.modules.business.entity.*;
|
import org.jeecg.modules.business.entity.*;
|
||||||
import org.jeecg.modules.business.vo.PlatformOrderOption;
|
import org.jeecg.modules.business.vo.PlatformOrderOption;
|
||||||
import org.jeecg.modules.business.vo.PlatformOrderQuantity;
|
import org.jeecg.modules.business.vo.PlatformOrderQuantity;
|
||||||
|
@ -256,4 +257,8 @@ public interface IPlatformOrderService extends IService<PlatformOrder> {
|
||||||
|
|
||||||
List<String> findReadyAbnormalOrdersWithSkus(List<String> skus);
|
List<String> findReadyAbnormalOrdersWithSkus(List<String> skus);
|
||||||
void updateShopifySynced(Collection<String> platformOrderIds);
|
void updateShopifySynced(Collection<String> platformOrderIds);
|
||||||
|
|
||||||
|
List<String> fetchShippedOrdersFromShopAndTransporters(String shopCode, List<String> transporters);
|
||||||
|
|
||||||
|
void updateLocalTrackingNumber(List<YDTrackingNumberData> data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jeecg.modules.business.controller.UserException;
|
import org.jeecg.modules.business.controller.UserException;
|
||||||
|
import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberData;
|
||||||
import org.jeecg.modules.business.entity.*;
|
import org.jeecg.modules.business.entity.*;
|
||||||
import org.jeecg.modules.business.mapper.ExchangeRatesMapper;
|
import org.jeecg.modules.business.mapper.ExchangeRatesMapper;
|
||||||
import org.jeecg.modules.business.mapper.PlatformOrderContentMapper;
|
import org.jeecg.modules.business.mapper.PlatformOrderContentMapper;
|
||||||
|
@ -520,8 +521,19 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
|
||||||
public List<String> findReadyAbnormalOrdersWithSkus(List<String> skus) {
|
public List<String> findReadyAbnormalOrdersWithSkus(List<String> skus) {
|
||||||
return platformOrderMap.findReadyAbnormalOrdersWithSkus(skus);
|
return platformOrderMap.findReadyAbnormalOrdersWithSkus(skus);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateShopifySynced(Collection<String> platformOrderIds) {
|
public void updateShopifySynced(Collection<String> platformOrderIds) {
|
||||||
platformOrderMap.updateShopifySynced(platformOrderIds);
|
platformOrderMap.updateShopifySynced(platformOrderIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> fetchShippedOrdersFromShopAndTransporters(String shopCode, List<String> transporters) {
|
||||||
|
return platformOrderMap.fetchShippedOrdersFromShopAndTransporters(shopCode, transporters);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateLocalTrackingNumber(List<YDTrackingNumberData> data) {
|
||||||
|
platformOrderMap.updateLocalTrackingNumber(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue