提交 3a7382f6 authored 作者: 吕本才's avatar 吕本才

修改采集订单代码,

将代码还原到job服务中
上级 317fb63c
...@@ -108,7 +108,10 @@ ...@@ -108,7 +108,10 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.larksuite.oapi</groupId>
<artifactId>oapi-sdk</artifactId>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
......
package com.sfa.job.controller.finance; package com.sfa.job.controller.finance;
import cn.hutool.core.date.DateUtil;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto; import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import com.link.bi.service.FinanceOrderService;
import com.sfa.common.core.web.controller.BaseController; import com.sfa.common.core.web.controller.BaseController;
import com.sfa.job.service.order.FinanceOrderSyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -15,17 +17,22 @@ import java.util.Date; ...@@ -15,17 +17,22 @@ import java.util.Date;
* *
* @author ruoyi * @author ruoyi
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("/finance/order") @RequestMapping("/finance/order")
public class FinanceOrderDetailSyncController extends BaseController { public class FinanceOrderDetailSyncController extends BaseController {
@Autowired @Autowired
private FinanceOrderService orderService; private FinanceOrderSyncService syncService;
@GetMapping("/syncWandiantongOrderDeatail") @GetMapping("/syncWandiantongOrderDeatail")
public FinanceSyncOrderDetailDto syncWandiantongOrderDeatail(Date startTime, Date endTime) { public FinanceSyncOrderDetailDto syncWandiantongOrderDeatail(Date startTime, Date endTime) {
log.info("接口开始同步-旺店通订单明细api接口数据");
// 可以传参开始时间和结束时间,用于补充特定时间的数据采集 // 可以传参开始时间和结束时间,用于补充特定时间的数据采集
FinanceSyncOrderDetailDto syncWdtOrderDetailDto = orderService.syncWandiantongOrder(startTime, endTime, 1); FinanceSyncOrderDetailDto detailDto = syncService.syncWangdiantongOrder(startTime, endTime, 1);
return syncWdtOrderDetailDto; log.info("接口结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
return detailDto;
} }
......
package com.sfa.job.service.order;
import com.baomidou.mybatisplus.extension.service.IService;
import com.link.bi.domain.entity.FinanceOrder;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import java.util.Date;
public interface FinanceOrderSyncService extends IService<FinanceOrder> {
FinanceSyncOrderDetailDto syncWangdiantongOrder(Date startTime, Date endTime, Integer syncType);
}
package com.sfa.job.service.order.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.link.bi.domain.dao.IFinanceOrderDao;
import com.link.bi.domain.entity.*;
import com.link.bi.domain.mapper.FinanceOrderMapper;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import com.link.bi.service.*;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.core.utils.DateUtils;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.sfa.job.util.WangdiantongUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
* 旺店通订单Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
@DS("bi")
@Slf4j
@Service
public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper, FinanceOrder> implements FinanceOrderSyncService {
@Autowired
IFinanceOrderDao orderDao;
@Autowired
WangdiantongUtil wangdiantongUtil;
@Autowired
FinanceOrderDetailService detailService;
@Autowired
FinanceBaseProductService baseProductService;
@Autowired
FinanceBaseZbjTypeService baseZbjTypeService;
@Autowired
CollectOrderLogInfoService collectOrderLogInfoService;
@Autowired
IProductService productService;
/**
* 多线程调用此方法
* @param startTime
* @param endTime
*/
@Transactional(rollbackFor = Exception.class)
@Override
public FinanceSyncOrderDetailDto syncWangdiantongOrder(Date startTime, Date endTime, Integer syncType) {
FinanceSyncOrderDetailDto detailDto = new FinanceSyncOrderDetailDto();
String batchNo = syncType + DateUtils.dateTimeNow() + Thread.currentThread().getId();
try {
if (ObjectUtils.isEmpty(startTime)) {
// 查询最新的采集时间
Date date = collectOrderLogInfoService.selectLatest(syncType);
if (ObjectUtils.isNotEmpty(date)) {
startTime = date;
} else {
// 默认上个月的第一天 00:00:00
startTime = DateUtil.beginOfDay(DateUtil.beginOfMonth(DateUtil.lastMonth()));
}
// 调用查询旺店通接口api 获取最新日期前的一个小时
startTime = DateUtils.addMinutes(startTime, -3);
}
if (ObjectUtils.isEmpty(endTime)) {
endTime = DateUtils.addMinutes(startTime, 60);
}
log.info("查询订单参数:开始时间{},结束时间{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime));
List<FinanceOrder> orders = wangdiantongUtil.queryWithDetail(startTime, endTime);
if (ObjectUtils.isEmpty(orders)) {
throw new ServiceException("旺店通没有查询到订单数据");
}
// 基础数据 直播间分类数据+成本、规格、口味
Map<String, FinanceBaseProduct> baseProductMap = baseProductService.selectBaseProduct();
Map<String, String> baseZbjType = baseZbjTypeService.selectBaseZbjType();
// 系列
Map<String, String> prodSeries = productService.selectProdSeries();
// 入库订单表
log.info("开始插入订单数据,数量:{}", orders.size());
Date finalStartTime = startTime;
Date finalEndTime = endTime;
orders.forEach(order -> {
order.setBatchNo(batchNo);
order.setStartTime(finalStartTime);
order.setEndTime(finalEndTime);
order.setSyncType(syncType);
});
this.saveOrUpdateBatch(orders);
List<FinanceOrderDetail> mergeList = new ArrayList<>();
// 用于同一个订单号,来赋值直播间信息
Map<String, FinanceOrderDetail> orderZbj = new HashMap<>();
// 入库订单明细表
for (FinanceOrder order : orders) {
List<FinanceOrderDetail> orderDetails = order.getDetailList();
orderDetails.forEach(orderDetail -> {
orderDetail.setSeries(prodSeries.get(orderDetail.getGoodsNo()));
orderDetail.setTradeStatus(order.getTradeStatus());
orderDetail.setShopNo(order.getShopNo());
orderDetail.setShopName(order.getShopName());
orderDetail.setShopRemark(order.getShopRemark());
orderDetail.setReceivable(order.getReceivable());
orderDetail.setReceiverArea(order.getReceiverArea());
orderDetail.setConsignTime(order.getConsignTime());
orderDetail.setTradeTime(order.getTradeTime());
orderDetail.setBatchNo(batchNo);
orderDetail.setTradeNo(order.getTradeNo());
// 计算分销信息
orderDetail.setFenxiaoNick(orderDetail.getFenxiaoNick(order));
orderDetail.setFenxiaoId(orderDetail.getFenxiaoId(order, orderDetail.getTradeId()));
orderDetail.setFenxiaoName(orderDetail.getFenxiaoName(order, orderDetail.getTradeId()));
orderDetail.setStartTime(finalStartTime);
orderDetail.setEndTime(finalEndTime);
orderDetail.setSyncType(syncType);
// 如果存在相同的
FinanceOrderDetail sameDetail = orderZbj.get(orderDetail.getSrcTid());
orderDetail.setZbjName(orderDetail.getZbjName(orderDetail.getRemark(), sameDetail));
orderDetail.setZbjId(orderDetail.getZbjId(orderDetail.getRemark(), sameDetail));
orderDetail.setZbjZbId(orderDetail.getZbjZbId(orderDetail.getFenxiaoId(), orderDetail.getRemark(), sameDetail));
orderDetail.setZbjSaleType(orderDetail.getZbjSaleType(orderDetail.getRemark(), sameDetail));
// 确定分销商类型
orderDetail.setZbjQdType(orderDetail.getZbjQdType(orderDetail.getFenxiaoId(), orderDetail.getZbjZbId(), baseZbjType));
if (ObjectUtils.isNotEmpty(orderDetail.getZbjName())) {
orderZbj.put(orderDetail.getSrcTid(), orderDetail);
}
orderDetail.setFlavorErp(ObjectUtils.isNotEmpty(baseProductMap.get(orderDetail.getGoodsNo())) ? baseProductMap.get(orderDetail.getGoodsNo()).getFlavor() : "");
orderDetail.setSpecNameErp(ObjectUtils.isNotEmpty(baseProductMap.get(orderDetail.getGoodsNo())) ? baseProductMap.get(orderDetail.getGoodsNo()).getSpec() : "");
orderDetail.setActualCost(ObjectUtils.isNotEmpty(baseProductMap.get(orderDetail.getGoodsNo())) ? baseProductMap.get(orderDetail.getGoodsNo()).getActualCost() : new BigDecimal(0));
orderDetail.setStandardCost(ObjectUtils.isNotEmpty(baseProductMap.get(orderDetail.getGoodsNo())) ? baseProductMap.get(orderDetail.getGoodsNo()).getStandardCost() : new BigDecimal(0));
});
mergeList.addAll(orderDetails);
}
log.info("开始插入订单详情数据,数量:{}", mergeList.size());
// 批量插入
detailService.saveOrUpdateBatch(mergeList);
detailDto.setOrders(orders);
detailDto.setOrderCount(orders.size());
detailDto.setOrderDetailCount(mergeList.size());
detailDto.setOrderDetails(mergeList);
detailDto.setStartTime(startTime);
detailDto.setEndTime(endTime);
detailDto.setBatchNo(batchNo);
log.info("完成插入订单和订单详情数据,开始时间{},结束时间{},订单数量:{},详情数量:{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), orders.size(), mergeList.size());
CollectOrderLogInfo collectOrderLogInfo = new CollectOrderLogInfo();
collectOrderLogInfo.setSyncType(syncType);
collectOrderLogInfo.setOrderCount(orders.size());
collectOrderLogInfo.setOrderDetailCount(mergeList.size());
collectOrderLogInfo.setBatchNo(batchNo);
collectOrderLogInfo.setLatestTime(endTime);
collectOrderLogInfoService.save(collectOrderLogInfo);
} catch (Exception e) {
log.error(e.getMessage(), e);
// 记录错误日志表 collect_error_info
CollectErrorInfo errorInfo =new CollectErrorInfo();
errorInfo.setBatchNo(batchNo);
errorInfo.setType("");
errorInfo.setErrorMsg(e.getMessage());
errorInfo.setEndTime(endTime);
errorInfo.setStartTime(startTime);
errorInfo.setCollectTime(new Date());
// ????
throw e;
}
return detailDto;
}
}
package com.sfa.job.util;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.util.DateUtils;
import com.lark.oapi.okhttp.*;
import com.link.bi.domain.entity.FinanceOrder;
import com.sfa.common.core.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;
import java.util.*;
@Slf4j
@Component
public class WangdiantongUtil {
/**
* 卖家账号/接口账号/盐/接口名称
*/
public List<FinanceOrder> queryWithDetail(Date startTime, Date endTime) {
List<FinanceOrder> orderAllList = new ArrayList<>();
try {
int total = 0;
int size = 0;
int page_no = 0;
do {
String url = "http://wdt.wangdian.cn/openapi";
String sid = "wxl3";
String key = "wxl3-ota";
String salt = "78784988049166748bfdc83273ebb990";
String appsecret = "c65bd645bbed704bb7982037f9b948e3";
String method = "sales.TradeQuery.queryWithDetail";
String v = "1.0";
HashMap<String, Object> params = new HashMap<>();
params.put("start_time", DateUtils.format(startTime));
params.put("end_time", DateUtils.format(endTime));
// params.put("status", "110");
// params.put("time_type", 2);
List<HashMap<String, Object>> paramsList = Arrays.asList(params);
String signParams = appsecret + "body" + JSONObject.toJSONString(paramsList) + "calc_total1" + "key" + key
+ "method" + method + "page_no"+ page_no + "page_size200" + "salt" + salt + "sid" + sid +
"timestamp" + (System.currentTimeMillis() / 1000 - 1325347200) + "v" + v + appsecret;
String sign = DigestUtils.md5DigestAsHex(signParams.toString().getBytes());
log.debug(signParams);
log.debug(sign);
StringBuilder urlParams = new StringBuilder()
.append("sid=").append(sid)
.append("&key=").append(key)
.append("&salt=").append(salt)
.append("&method=").append(method)
.append("&v=").append(v)
.append("&timestamp=").append(System.currentTimeMillis() / 1000 - 1325347200)
.append("&sign=").append(sign)
.append("&page_size=").append(200)
.append("&page_no=").append(page_no)
.append("&calc_total=").append(1);
log.info("查询订单数据url:" + url + "?" + urlParams);
RequestBody body = RequestBody.create(MediaType.get("application/json"), JSONObject.toJSONString(paramsList));
Request urlRequestBuild = new Request.Builder().url(url + "?" + urlParams).post(body).build();
OkHttpClient client = new OkHttpClient();
Response execute = client.newCall(urlRequestBuild).execute();
JSONObject responseJson = JSONObject.parseObject(execute.body().string());
JSONObject dataR = responseJson.getJSONObject("data");
JSONObject messageJson = responseJson.getJSONObject("message");
if(ObjectUtils.isNotEmpty(messageJson)){
log.error("访问旺店通接口错误"+messageJson.toString());
throw new ServiceException("访问旺店通接口错误"+messageJson.toString());
}
Integer totalCount = dataR.getInteger("total_count");
JSONArray order = dataR.getJSONArray("order");
total = totalCount;
log.info("当前时间段{}-{},总条数totalCount:{}", DateUtils.format(startTime), DateUtils.format(endTime),totalCount);
log.info("当前时间段{}-{},查询返回的order条数:{}", DateUtils.format(startTime),DateUtils.format(endTime), order.size());
List<FinanceOrder> orders = JSONArray.parseArray(order.toString(), FinanceOrder.class, JSONReader.Feature.SupportSmartMatch);
orderAllList.addAll(orders);
size = orderAllList.size();
page_no ++;
} while ( size < total);
return orderAllList;
} catch (Exception e) {
// 记录异常日志
log.error("异常信息:{}"+e.getMessage(),e);
return orderAllList;
}
}
}
package com.sfa.job.xxljob.order; package com.sfa.job.xxljob.order;
import cn.hutool.core.date.DateUtil;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto; import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import com.link.bi.service.FinanceOrderDetailService; import com.sfa.job.service.order.FinanceOrderSyncService;
import com.link.bi.service.FinanceOrderService;
import com.xxl.job.core.context.XxlJobContext; import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -19,9 +19,7 @@ import org.springframework.stereotype.Component; ...@@ -19,9 +19,7 @@ import org.springframework.stereotype.Component;
public class FinanceOrderTask { public class FinanceOrderTask {
@Autowired @Autowired
FinanceOrderDetailService orderDetailService; FinanceOrderSyncService financeOrderSyncService;
@Autowired
FinanceOrderService orderService;
/** /**
* 同步部门数据 * 同步部门数据
...@@ -36,12 +34,14 @@ public class FinanceOrderTask { ...@@ -36,12 +34,14 @@ public class FinanceOrderTask {
// 简单模拟分片处理,这里输出每个分片的信息 // 简单模拟分片处理,这里输出每个分片的信息
System.out.println("分片总数: " + shardingTotalCount + ", 当前分片: " + shardingItem); System.out.println("分片总数: " + shardingTotalCount + ", 当前分片: " + shardingItem);
log.info("开始同步-旺店通订单明细api接口数据"); log.info("xxl-job开始同步-旺店通订单明细api接口数据");
// 定时任务不设定开始时间和结束时间 // 定时任务不设定开始时间和结束时间
FinanceSyncOrderDetailDto syncWdtOrderDetailDto = orderService.syncWandiantongOrder(null, null,0); FinanceSyncOrderDetailDto detailDto = financeOrderSyncService.syncWangdiantongOrder(null, null,0);
log.info("结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条", syncWdtOrderDetailDto.getOrderCount(),syncWdtOrderDetailDto.getOrderDetailCount()); log.info("xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}",
return syncWdtOrderDetailDto; detailDto.getOrderCount(),detailDto.getOrderDetailCount(),detailDto.getBatchNo(),
DateUtil.formatDateTime(detailDto.getStartTime()),DateUtil.formatDateTime(detailDto.getEndTime()) );
return detailDto;
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论