提交 9a09838f authored 作者: 吕本才's avatar 吕本才

1、增加财务订单明细数据采集处理、bi显示接口

上级 a1da99b6
package com.link.bi.config;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Data
@Configuration
public class ThreadPoolConfig {
private int maxPoolSize = 20;
private int corePoolSize = 5;
private int queueCapacity = 20;
@Bean
public Executor customThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("CustomThreadPool-");
executor.initialize();
return executor;
}
}
package com.link.bi.controller.query;
import com.github.pagehelper.PageInfo;
import com.link.bi.pojo.request.FinanceCostVo;
import com.link.bi.service.FinanceOrderDetailService;
import com.sfa.common.core.web.controller.BaseController;
import com.sfa.common.security.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 财务bi分析
*
* @author admin
* @date 2024-12-19
*/
@RestController
@RequestMapping("/finance")
public class FinanceOrderQueryController extends BaseController {
@Autowired
private FinanceOrderDetailService detailService;
/**
* 财务成本聚合查询
*/
@RequiresPermissions("bi:finance:list")
@GetMapping("/cost/list")
public PageInfo selectBiFinanceCostList(FinanceCostVo financeCostVo) {
return detailService.selectBiFinanceCostList(financeCostVo);
}
/**
* 财务成本聚合查询
*/
@RequiresPermissions("bi:finance:list")
@GetMapping("/cost/detail/list")
public PageInfo selectBiFinanceCostDetailList(FinanceCostVo financeCostVo) {
return detailService.selectBiFinanceCostDetailList(financeCostVo);
}
}
package com.link.bi.domain.dao;
/**
* @author : lvbencai
* @date : 2025年01月07日10:04:25
* @describe : 财务需要的订单DAO
*/
public interface IFinanceBaseProductDao {
}
package com.link.bi.domain.dao;
/**
* @author : lvbencai
* @date : 2025年01月14日
* @describe : 财务抖音直播间类型DAO
*/
public interface IFinanceBaseZbjTypeDao {
}
package com.link.bi.domain.dao;
import java.util.Date;
/**
* @author : lvbencai
* @date : 2025年01月07日10:04:25
* @describe : 财务需要的订单DAO
*/
public interface IFinanceOrderDao {
Date selectOrderLatest(Integer syncType);
}
package com.link.bi.domain.dao;
import com.github.pagehelper.PageInfo;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.wq.FinanceCostWq;
/**
* @author : lvbencai
* @date : 2025年01月07日10:04:25
* @describe : 财务需要的订单明细DAO
*/
public interface IFinanceOrderDetailDao {
PageInfo<FinanceOrderDetail> selectBiFinanceCostList(FinanceCostWq qw);
PageInfo<FinanceOrderDetail> selectBiFinanceCostDetailList(FinanceCostWq qw);
}
package com.link.bi.domain.dao.impl;
import com.link.bi.domain.dao.IFinanceBaseProductDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author : lvbencai
* @date : 2025-01-14 17:00:00
* @describe :财务抖音订单数据 商品的信息DAO
*/
@Slf4j
@Service
public class FinanceBaseProductDaoImpl implements IFinanceBaseProductDao {
}
package com.link.bi.domain.dao.impl;
import com.link.bi.domain.dao.IFinanceBaseZbjTypeDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author : lvbencai
* @date : 2025-01-14 17:30:00
* @describe : 财务抖音订单明细中,直播间类型
*/
@Slf4j
@Service
public class FinanceBaseZbjTypeDaoImpl implements IFinanceBaseZbjTypeDao {
}
package com.link.bi.domain.dao.impl;
import com.baomidou.dynamic.datasource.annotation.Slave;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.link.bi.domain.dao.IFinanceOrderDao;
import com.link.bi.domain.entity.FinanceOrder;
import com.link.bi.domain.mapper.FinanceOrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author : lvbencai
* @date : 2025-01-14 17:31:05
* @describe : 财务抖音订单数据
*/
@Slf4j
@Service
public class FinanceOrderDaoImpl implements IFinanceOrderDao {
@Autowired
private FinanceOrderMapper orderMapper;
@Slave
public Date selectOrderLatest(Integer syncType) {
// 查询最新发货日期
List<FinanceOrder> objects = orderMapper.selectList(
new LambdaQueryWrapper<FinanceOrder>()
// 默认查询xxljob自动同步时间
.eq(FinanceOrder::getSyncType,syncType)
.orderByDesc(FinanceOrder::getModified)
.last("LIMIT 1"));
if(ObjectUtils.isNotEmpty(objects)){
// 最新的数据日期
return objects.get(0).getModified();
}else{
// 默认上个月的第一天 00:00:00
return DateUtils.addMonths(new Date(),-1);
}
}
}
package com.link.bi.domain.dao.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.link.bi.domain.dao.IFinanceOrderDetailDao;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.mapper.FinanceOrderDetailMapper;
import com.link.bi.domain.wq.FinanceCostWq;
import com.sfa.common.core.web.page.TableSupport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : lvbencai
* @date : 2024-12-10 16
* @describe : 旺店通订单明细
*/
@Slf4j
@Service
public class FinanceOrderDetailDaoImpl implements IFinanceOrderDetailDao {
@Autowired
FinanceOrderDetailMapper detailMapper;
/**
* 查询分页数据
* @param wq
* @return
*/
@Override
public PageInfo<FinanceOrderDetail> selectBiFinanceCostList(FinanceCostWq wq) {
// 查询分页数据
Page<Object> objectPage = TableSupport.pageI();
PageHelper.startPage((int) objectPage.getCurrent(), (int) objectPage.getSize());
List<FinanceOrderDetail> financeOrderDetails = detailMapper.selectBiFinanceCostList( wq);
PageInfo<FinanceOrderDetail> pageInfo = new PageInfo<>(financeOrderDetails);
return pageInfo;
}
@Override
public PageInfo<FinanceOrderDetail> selectBiFinanceCostDetailList(FinanceCostWq wq) {
// 查询分页数据
Page<Object> objectPage = TableSupport.pageI();
PageHelper.startPage((int) objectPage.getCurrent(), (int) objectPage.getSize());
List<FinanceOrderDetail> financeOrderDetails = detailMapper.selectBiFinanceCostDetailList( wq);
PageInfo<FinanceOrderDetail> pageInfo = new PageInfo<>(financeOrderDetails);
return pageInfo;
}
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Map;
/**
* CollectErrorInfo 类表示采集错误记录,与数据库表 market_bi.collect_error_info 相对应。
* 包含了采集错误记录的各种信息,如唯一键、入参信息、类型、采集时间、删除标志、创建和更新的用户及时间等。
*/
@TableName(value ="collect_error_info")
@Data
public class CollectErrorInfo {
/**
* 唯一键,自动递增
*/
private Long ceiId;
/**
* 入参信息,存储为 JSON 格式
*/
private Map<String, Object> param;
/**
* 类型,如 xxljob、影刀等
*/
private String type;
/**
* 采集时间
*/
private LocalDateTime collectTime;
/**
* 是否删除标志,'0' 表示未删除,'1' 表示已删除
*/
private char delFlag;
/**
* 创建者
*/
private String createBy;
/**
* 创建人 UserID
*/
private Long createUserId;
/**
* 创建时间,默认为当前时间
*/
private LocalDateTime createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 修改人 UserID
*/
private Long updateUserId;
/**
* 更新时间,自动更新为当前时间
*/
private LocalDateTime updateTime;
/**
* 采集批次
*/
private String batchNo;
/**
* 本批次采集开始时间
*/
private LocalDateTime startTime;
/**
* 本批次采集结束时间
*/
private LocalDateTime endTime;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.math.BigDecimal;
/**
* finance_base_product 表对应的 料号基本信息表。
* 主要字段实际成本、标准成本、规格、口味
* @author lvbcai
* @date 2025年01月07日10:04:25
*/
@Data
public class FinanceBaseProduct {
// 唯一标识主键
@TableId(type = IdType.AUTO)
private int fbpId;
// 料号
private String prdCode;
// 品名
private String prdName;
// 规格
private String prdBarCode;
// 实际成本
private BigDecimal actualCost;
// 标准成本
private BigDecimal standardCost;
// 一级分类
private String firstCategory;
// 二级分类
private String secondCategory;
// 规格
private String spec;
// 口味
private String flavor;
// 产品分类编码
private String productClassificationCode;
// 产品分类
private String productClassification;
// 主分群码(重复字段,可根据实际需求调整)
private String mainGroupCode;
// 主分群码名称
private String mainGroupName;
// 料件类别(重复字段,可根据实际需求调整)
private String materialType;
// 料件类别描述
private String materialTypeName;
// 基础单位
private String basicUnit;
// 生命周期状态
private String lifeCycleStatus;
// 生命周期
private String lifeCycle;
}
package com.link.bi.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.time.LocalDateTime;
/**
* finance_base_zbj_type 表对应的直播间分类细腻系表。
* 主要字段直播间渠道类型、分销商名称
* @author lvbcai
* @date 2025年01月07日10:04:25
*/
@Data
public class FinanceBaseZbjType {
// 唯一键
@TableId(type = IdType.AUTO)
private long fbztId;
// 分销商名称
private String fenxiaoName;
// 直播间渠道类型 有分销商id,不是以上几类的,统一为达人 没有分销商id的,默认为商城
private String zbjQdType;
// 采集批次
private String batchNo;
// 备注
private String remark;
// 是否删除标志 0 未删除 1 已删除
private char delFlag;
// 创建者
private String createBy;
// 创建人 UserID
private Long createUserId;
// 创建时间
private LocalDateTime createTime;
// 更新者
private String updateBy;
// 修改人 UserID
private Long updateUserId;
// 更新时间
private LocalDateTime updateTime;
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceBaseProduct;
public interface FinanceBaseProductMapper extends BaseMapper<FinanceBaseProduct> {
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceBaseZbjType;
public interface FinanceBaseZbjTypeMapper extends BaseMapper<FinanceBaseZbjType> {
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.wq.FinanceCostWq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface FinanceOrderDetailMapper extends BaseMapper<FinanceOrderDetail> {
List<FinanceOrderDetail> selectBiFinanceCostList(@Param(value = "wq") FinanceCostWq wq);
List<FinanceOrderDetail> selectBiFinanceCostDetailList(@Param(value = "wq") FinanceCostWq wq);
}
package com.link.bi.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.link.bi.domain.entity.FinanceOrder;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceOrderMapper extends BaseMapper<FinanceOrder> {
}
package com.link.bi.domain.wq;
import lombok.Data;
/**
* @author : liqiulin
* @date : 2024-11-22 17
* @describe :
*/
@Data
public class FinanceCostWq {
// 入参 查询类型
private String type;
// 入参 查询值
private String value;
}
package com.link.bi.pojo.request;
import lombok.Data;
import java.util.Date;
@Data
public class FinanceCostVo {
// 入参 查询类型
private String type;
// 入参 查询值
private String value;
// 入参 分页当前页
private String pageNum;
// 入参 分页大小
private String pageSize;
// 入参 时间开始时间
private Date startDate;
// 入参 时间结束时间
private Date endDate;
}
package com.link.bi.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
/**
* 财务订单明细聚合查询DTO
* @date : 2025-01-15 15:30:05
* @author : lvbencai
*/
@Data
public class FinanceBiListDto {
// 主播渠道类型--来自备注字段
private String zbjQdType;
// 货品名称
private String goodsName;
// 货品编号
private String goodsNo;
// ERP规格名称 --来自T100的定义
private String specNameErp;
// ERP口味 --来自T100的定义
private String flavorErp;
private BigDecimal shareAmountSum;
private BigDecimal actualCostSum;
private BigDecimal standardCostSum;
// 查询类型
private String queryType;
// 实际成本毛利
// private BigDecimal actualCostGrossProfitSum;
// 标准成本毛利
// private BigDecimal standardCostGrossProfitSum;
}
package com.link.bi.pojo.response;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 财务聚合后查看的详情信息,来自订单明细DTO
* @date : 2025-01-15 17:01:00
* @author : lvbencai
*/
@Data
public class FinanceOrderDetailListDto {
// 订单编号
private String tradeNo;
// 店铺名称
private String shopName;
// 原始单号
private String srcTid;
// 原始子单号
private String srcOid;
// 订单状态
private int tradeStatus;
// 交易时间
private String tradeTime;
// 付款时间
private Date payTime;
// 发货时间
private Date consignTime;
// 省市县(收货地区)
private String receiverArea;
// 备注
private String remark;
// 应收金额
private BigDecimal receivable;
// 货品编号
private String goodsNo;
// 货品名称
private String goodsName;
// 规格名称
private String specName;
// 分类(货品类型)
private int goodsType;
// 数量
private BigDecimal num;
// 优惠
private BigDecimal discount;
// 分摊后总价
private BigDecimal shareAmount;
// 组合装编码
private String suiteNo;
// 组合装名称
private String suiteName;
// 组合装数量
private BigDecimal suiteNum;
// 赠品方式
private int giftType;
// 分销商名称
private String fenxiaoName;
// 分销商编号
private String fenxiaoId;
// 平台货品名称
private String apiGoodsName;
}
package com.link.bi.pojo.response;
import com.link.bi.domain.entity.FinanceOrder;
import com.link.bi.domain.entity.FinanceOrderDetail;
import lombok.Data;
import java.util.List;
/**
* 财务同步旺店通订单明细DTO
*/
@Data
public class FinanceSyncOrderDetailDto {
private Integer orderCount;
private Integer orderDetailCount;
private List<FinanceOrder> orders;
private List<FinanceOrderDetail> orderDetails;
}
package com.link.bi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.link.bi.domain.entity.FinanceBaseProduct;
import java.util.Map;
public interface FinanceBaseProductService extends IService<FinanceBaseProduct> {
Map<String,FinanceBaseProduct> selectBaseProduct();
}
package com.link.bi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.link.bi.domain.entity.FinanceBaseZbjType;
import java.util.Map;
public interface FinanceBaseZbjTypeService extends IService<FinanceBaseZbjType> {
Map<String,String> selectBaseZbjType();
}
package com.link.bi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.pojo.request.FinanceCostVo;
import com.link.bi.pojo.response.FinanceBiListDto;
import com.link.bi.pojo.response.FinanceOrderDetailListDto;
public interface FinanceOrderDetailService extends IService<FinanceOrderDetail> {
PageInfo<FinanceBiListDto> selectBiFinanceCostList(FinanceCostVo financeCostVo);
PageInfo<FinanceOrderDetailListDto> selectBiFinanceCostDetailList(FinanceCostVo financeCostVo);
}
package com.link.bi.service;
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 FinanceOrderService extends IService<FinanceOrder> {
Date selectLatest(Integer syncType);
FinanceSyncOrderDetailDto syncWandiantongOrder(Date startTime, Date endTime, Integer syncType);
}
package com.link.bi.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.link.bi.domain.entity.FinanceBaseProduct;
import com.link.bi.domain.mapper.FinanceBaseProductMapper;
import com.link.bi.service.FinanceBaseProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 旺店通订单Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
@DS("bi")
@Slf4j
@Service
public class FinanceBaseProductServiceImpl extends ServiceImpl<FinanceBaseProductMapper, FinanceBaseProduct> implements FinanceBaseProductService {
@Override
public Map<String, FinanceBaseProduct> selectBaseProduct() {
// 查询所有商品
List<FinanceBaseProduct> list = list();
// 以料号为key,商品对象为value,放入map中
Map<String, FinanceBaseProduct> map = list.stream()
.collect(HashMap::new, (k, v) -> k.put(v.getPrdCode(), v), HashMap::putAll);
return map;
}
}
package com.link.bi.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.link.bi.domain.entity.FinanceBaseZbjType;
import com.link.bi.domain.mapper.FinanceBaseZbjTypeMapper;
import com.link.bi.service.FinanceBaseZbjTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 旺店通订单Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
@DS("bi")
@Slf4j
@Service
public class FinanceBaseZbjTypeServiceImpl extends ServiceImpl<FinanceBaseZbjTypeMapper, FinanceBaseZbjType> implements FinanceBaseZbjTypeService {
@Override
public Map<String, String> selectBaseZbjType() {
List<FinanceBaseZbjType> list = list();
// 以fenxiaoName为key,直播间渠道类型为value,放入map中
Map<String, String> map = list.stream()
.collect(HashMap::new, (k, v) -> k.put(v.getFenxiaoName(), v.getZbjQdType()), HashMap::putAll);
return map;
}
}
package com.link.bi.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageInfo;
import com.link.bi.domain.dao.IFinanceOrderDetailDao;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.mapper.FinanceOrderDetailMapper;
import com.link.bi.domain.wq.FinanceCostWq;
import com.link.bi.pojo.request.FinanceCostVo;
import com.link.bi.pojo.response.FinanceBiListDto;
import com.link.bi.pojo.response.FinanceOrderDetailListDto;
import com.link.bi.service.FinanceOrderDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
/**
* 旺店通订单明细Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
// 指定不同的数据源
//@DS("bi")
@Slf4j
@Service
public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetailMapper, FinanceOrderDetail> implements FinanceOrderDetailService {
@Autowired
IFinanceOrderDetailDao detailDao;
// @Autowired
// WangdiantongOrderService wangdiantongOrderService;
// private static final int CORE_POOL_SIZE = 5; // 核心线程数
// private static final int MAX_POOL_SIZE = 10; // 最大线程数
// private static final int KEEP_ALIVE_TIME = 60; // 线程空闲时间
//
// private ExecutorService executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
// @Autowired
// private Executor customThreadPool;
// @Autowired
// private ThreadPoolConfig threadPoolConfig;
@Override
public PageInfo<FinanceBiListDto> selectBiFinanceCostList(FinanceCostVo financeCostVo) {
FinanceCostWq qw = new FinanceCostWq();
BeanUtils.copyProperties(financeCostVo, qw);
PageInfo<FinanceOrderDetail> orderDetailPageInfo = detailDao.selectBiFinanceCostList(qw);
PageInfo<FinanceBiListDto> pageInfo = new PageInfo<>();
BeanUtils.copyProperties(orderDetailPageInfo, pageInfo);
pageInfo.setList(orderDetailPageInfo.getList().stream().map(item -> {
FinanceBiListDto dto = new FinanceBiListDto();
BeanUtils.copyProperties(item, dto);
return dto;
}).collect(Collectors.toList()));
return pageInfo;
}
@Override
public PageInfo<FinanceOrderDetailListDto> selectBiFinanceCostDetailList(FinanceCostVo financeCostVo) {
FinanceCostWq qw = new FinanceCostWq();
BeanUtils.copyProperties(financeCostVo, qw);
PageInfo<FinanceOrderDetail> financeOrderDetailPageInfo = detailDao.selectBiFinanceCostDetailList(qw);
PageInfo<FinanceOrderDetailListDto> pageInfo = new PageInfo<>();
BeanUtils.copyProperties(financeOrderDetailPageInfo, pageInfo);
pageInfo.setList(financeOrderDetailPageInfo.getList().stream().map(item -> {
FinanceOrderDetailListDto dto = new FinanceOrderDetailListDto();
BeanUtils.copyProperties(item, dto);
return dto;
}).collect(Collectors.toList()));
return pageInfo;
}
/**
* 采集旺店通接口订单明细数据
*
* @param startTime
* @param endTime
*/
// @Override
// public void syncWandiantongOrderDetail(Date startTime, Date endTime) {
// try {
// wangdiantongOrderService.dealOrders(startTime,endTime);
// 计算时间间隔
// long intervalMillis = endTime.getTime() - startTime.getTime();
// 计算每个线程处理的时、间间隔
// long threadIntervalMillis = intervalMillis / threadPoolConfig.getMaxPoolSize();
// List<Future<List<WangdiantongOrder>>> futures = new ArrayList<>();
// ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) customThreadPool;
// 创建并提交线程任务
// List<Callable<List<WangdiantongOrder>>> tasks = new ArrayList<>();
// for (int i = 0; i < threadPoolConfig.getCorePoolSize(); i++) {
// Date threadStartTime = new Date(startTime.getTime() + i * threadIntervalMillis);
// Date threadEndTime = new Date(threadStartTime.getTime() + threadIntervalMillis);
// Callable<List<WangdiantongOrder>> task = () -> dealOrders(threadStartTime, threadEndTime);
// tasks.add(task);
// }
// List<List<WangdiantongOrder>> results = new ArrayList<>();
// List<Future<List<WangdiantongOrder>>> futures = ((ThreadPoolTaskExecutor) customThreadPool).getThreadPoolExecutor().invokeAll(tasks);
// for (Future<List<WangdiantongOrder>> future : futures) {
// results.add(future.get());
// }
// log.info("多线程共处理了{}条数据", results.size());
// } catch (Exception e) {
// log.error(e.getMessage(), e);
// }
// }
}
package com.link.bi.service.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.FinanceBaseProduct;
import com.link.bi.domain.entity.FinanceOrder;
import com.link.bi.domain.entity.FinanceOrderDetail;
import com.link.bi.domain.mapper.FinanceOrderMapper;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import com.link.bi.service.FinanceBaseProductService;
import com.link.bi.service.FinanceBaseZbjTypeService;
import com.link.bi.service.FinanceOrderDetailService;
import com.link.bi.service.FinanceOrderService;
import com.sfa.common.core.exception.ServiceException;
import com.sfa.common.core.utils.DateUtils;
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 FinanceOrderServiceImpl extends ServiceImpl<FinanceOrderMapper, FinanceOrder> implements FinanceOrderService {
@Autowired
IFinanceOrderDao orderDao;
@Autowired
WangdiantongUtil wangdiantongUtil;
@Autowired
FinanceOrderDetailService detailService;
@Autowired
FinanceBaseProductService baseProductService;
@Autowired
FinanceBaseZbjTypeService baseZbjTypeService;
/**
* 查询最新修改日期
*
* @return
*/
@Override
public Date selectLatest(Integer syncType) {
// 查询最新发货日期
Date date = orderDao.selectOrderLatest(syncType);
return date;
}
/**
* 多线程调用此方法
*
* @param startTime
* @param endTime
*/
// @DS("bi")
@Transactional(rollbackFor = Exception.class)
@Override
public FinanceSyncOrderDetailDto syncWandiantongOrder(Date startTime, Date endTime, Integer syncType) {
FinanceSyncOrderDetailDto detailDto = new FinanceSyncOrderDetailDto();
String batchNo = DateUtils.dateTimeNow() + "-" + Thread.currentThread().getId();
try {
if (ObjectUtils.isEmpty(startTime)) {
// 查询最新的采集时间
Date date = this.selectLatest(syncType);
// 调用查询旺店通接口api 获取最新日期前的一个小时
startTime = DateUtils.addMinutes(date, -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();
// 入库订单表
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.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);
log.info("完成插入订单和订单详情数据,开始时间{},结束时间{},订单数量:{},详情数量:{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), orders.size(), mergeList.size());
} catch (Exception e) {
log.error(e.getMessage(), e);
// TODO 记录错误日志表 collect_error_info
throw e;
}
return detailDto;
}
}
package com.link.bi.service.impl;
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;
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论