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

1、尝试将代码放到job微服务

上级 3a7382f6
......@@ -124,11 +124,6 @@
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<!-- RuoYi wangxiaolu-link-module-bi -->
<dependency>
<groupId>com.wangxiaolu.sfa</groupId>
<artifactId>wangxiaolu-link-module-bi</artifactId>
</dependency>
</dependencies>
......
package com.sfa.job;
import com.sfa.common.security.annotation.EnableCustomConfig;
import com.sfa.common.security.annotation.EnableRyFeignClients;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.sfa.common.security.annotation.EnableCustomConfig;
import com.sfa.common.security.annotation.EnableRyFeignClients;
import org.springframework.context.annotation.ComponentScan;
/**
* 定时任务
......@@ -15,8 +14,7 @@ import org.springframework.context.annotation.ComponentScan;
@EnableCustomConfig
@EnableRyFeignClients
@SpringBootApplication
@ComponentScan(value = {"com.sfa.job","com.link.bi.domain.*","com.link.bi.service.*","com.link.bi.pojo.*"})
@MapperScan({"com.sfa.job.domain.job.mapper","com.sfa.job.domain.system.mapper","com.link.bi.domain.mapper"})
@MapperScan({"com.sfa.job.domain.job.mapper","com.sfa.job.domain.system.mapper","com.sfa.job.domain.order.mapper"})
public class SfaJobApplication
{
public static void main(String[] args) {
......
package com.sfa.job.controller.finance;
import cn.hutool.core.date.DateUtil;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.common.core.web.controller.BaseController;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.CollectErrorInfo;
public interface CollectErrorInfoDao {
// 插入一条记录
void insert(CollectErrorInfo collectErrorInfo);
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.CollectOrderLogInfo;
import java.util.Date;
public interface CollectOrderLogInfoDao {
// 插入一条记录
void insert(CollectOrderLogInfo collectOrderLogInfo);
Date selectOrderSyncLatest(Integer syncType);
}
package com.sfa.job.domain.order.dao;
import com.sfa.job.domain.order.entity.PrdInfo;
import java.util.List;
/**
* @author : liqiulin
* @date : 2024-11-22 16
* @describe :
*/
public interface IProductDao {
List<PrdInfo> selectProdSeries();
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.sfa.job.domain.order.dao.CollectErrorInfoDao;
import com.sfa.job.domain.order.entity.CollectErrorInfo;
import com.sfa.job.domain.order.mapper.CollectErrorInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@DS("Bi")
@Repository
public class CollectErrorInfoDaoImpl implements CollectErrorInfoDao {
@Autowired
private CollectErrorInfoMapper collectErrorInfoMapper;
@Override
public void insert(CollectErrorInfo collectErrorInfo) {
collectErrorInfoMapper.insert(collectErrorInfo);
}
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sfa.job.domain.order.dao.CollectOrderLogInfoDao;
import com.sfa.job.domain.order.entity.CollectOrderLogInfo;
import com.sfa.job.domain.order.mapper.CollectOrderLogInfoMapper;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@DS("Bi")
@Repository
public class CollectOrderLogInfoDaoImpl implements CollectOrderLogInfoDao {
@Autowired
private CollectOrderLogInfoMapper logInfoMapper;
@Override
public void insert(CollectOrderLogInfo collectOrderLogInfo) {
logInfoMapper.insert(collectOrderLogInfo);
}
@Override
public Date selectOrderSyncLatest(Integer syncType) {
// 查询最新发货日期
List<CollectOrderLogInfo> orderList = logInfoMapper.selectList(
new LambdaQueryWrapper<CollectOrderLogInfo>()
// 默认查询xxljob自动同步时间
.eq(CollectOrderLogInfo::getSyncType,syncType)
.eq(CollectOrderLogInfo::getDelFlag,0)
.orderByDesc(CollectOrderLogInfo::getUpdateTime)
.last("LIMIT 1"));
if(ObjectUtils.isNotEmpty(orderList)){
// 最新的数据日期
return orderList.get(0).getLatestTime();
}
return null;
}
}
package com.sfa.job.domain.order.dao.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sfa.job.domain.order.entity.FinanceBaseZbjType;
import com.sfa.job.domain.order.mapper.FinanceBaseZbjTypeMapper;
import com.sfa.job.service.order.FinanceBaseZbjTypeService;
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")
@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.sfa.job.domain.order.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sfa.job.domain.order.dao.IProductDao;
import com.sfa.job.domain.order.entity.PrdInfo;
import com.sfa.job.domain.order.mapper.PrdInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author : liqiulin
* @date : 2024-11-22 16
* @describe :
*/
@Service
public class ProductDaoImpl implements IProductDao {
@Autowired
PrdInfoMapper prdInfoMapper;
@Override
public List<PrdInfo> selectProdSeries() {
List<PrdInfo> prdInfos = prdInfoMapper.selectList(
new LambdaQueryWrapper<PrdInfo>()
.select(PrdInfo::getSeries, PrdInfo::getPrdCode, PrdInfo::getPrdName)
.groupBy(PrdInfo::getSeries, PrdInfo::getPrdCode, PrdInfo::getPrdName));
return prdInfos;
}
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
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 Date 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 Date startTime;
/**
* 本批次采集结束时间
*/
private Date endTime;
/**
* 错误信息
*/
private String errorMsg;
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 采集订单日志信息
*
* @TableName collect_order_log_info
* @author lvbencai
* @date 2025-01-16 22:58:38
* @description
*/
@Data
@TableName("collect_order_log_info")
public class CollectOrderLogInfo implements Serializable {
/**
* 唯一键,用于唯一标识采集订单日志信息记录
*/
@TableId(value = "cli_id",type= IdType.AUTO)
private Long cliId;
/**
* 采集订单的数量,存储为字符串,长度不超过 20 个字符
*/
//@TableField("order_count")
private Integer orderCount;
/**
* 采集订单的详细数量,存储为字符串,长度不超过 20 个字符
*/
//@TableField("order_detail_count")
private Integer orderDetailCount;
/**
* 采集批次信息,可存储长度不超过 30 个字符,使用 utf8mb4 字符集和 utf8mb4_0900_ai_ci 校对规则
*/
//@TableField("batch_no")
private String batchNo;
/**
* 采集的最新时间,代表上一次采集的结束时间,存储为日期时间类型
*/
//@TableField("latest_time")
private Date latestTime;
/**
* 是否删除的标志,'0' 表示未删除,'1' 表示已删除,使用 utf8mb3 字符集和 utf8mb3_general_ci 校对规则
*/
//@TableField("del_flag")
private String delFlag;
/**
* 创建者信息,存储为长度不超过 20 个字符的字符串
*/
//@TableField("create_by")
private String createBy;
/**
* 创建人的用户 ID,存储为长整型
*/
//@TableField("create_user_id")
private Long createUserId;
/**
* 创建时间,存储为日期时间类型,使用数据库的当前时间作为默认值
*/
//@TableField("create_time")
private Date createTime;
/**
* 更新者信息,存储为长度不超过 20 个字符的字符串
*/
//@TableField("update_by")
private String updateBy;
/**
* 修改人的用户 ID,存储为长整型
*/
//@TableField("update_user_id")
private Long updateUserId;
/**
* 更新时间,存储为日期时间类型,更新时自动更新为当前时间
*/
//@TableField("update_time")
private Date updateTime;
private Integer syncType;
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.math.BigDecimal;
/**
* finance_base_product 表对应的 料号基本信息表。
* 主要字段实际成本、标准成本、规格、口味
* @author lvbencai
* @date 2025年01月07日10:04:25
*/
@Data
public class FinanceBaseProduct {
// 唯一标识主键
@TableId(type = IdType.AUTO)
private Integer 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 series;
// 产品分类编码
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.sfa.job.domain.order.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.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sfa.common.core.web.domain.BaseDo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 来自旺店通的订单
*
* @author 吕本才
* @date 2025年01月07日10:04:25
*/
@TableName(value = "finance_order")
@Data
public class FinanceOrder extends BaseDo {
// 订单唯一键
@TableId(type = IdType.NONE)
private Long tradeId;
// 订单编号(旺店通系统订单号)
private String tradeNo;
// 平台ID(请点击平台代码表查看对应关系)
private Integer platformId;
// 仓库类型:
// 1、普通仓库,大于1为委外仓库(如京东仓储,物流宝等),如订单无仓库的话,则不返回该字段
private Integer warehouseType;
// 原始单号(平台订单号),如果有多个,以","分隔,且以增序排列,不重复,过长将被裁剪
private String srcTids;
// 平台支付帐号, (仅自有平台及线下平台返回,其他平台均不返回)
private String payAccount;
// 订单状态:
// 4 线下退款
// 5已取消
// 6 待转预订单(待审核)
// 7 待转已完成
// 10未付款
// 12待尾款
// 15等未付
// 16延时审核
// 19预订单前处理
// 20 审核前处理
// 21自流转待发货
// 23 异常订单
// 24 换货预订单
// 25 待处理预订单
// 27待分配预订单
// 30待客审
// 35待财审
// 40审核中
// 55已审核
// 95已发货
// 96 成本确认(待录入计划成本,订单结算时有货品无计划成本)
// 101 已过账
// 110已完成
private Integer tradeStatus;
// 订单类型:
// 1、网店销售
// 2、线下订单
// 3、售后换货
// 4、批发业务
// 7、现款销售
// 8、分销订单
// 101、自定义类型一
// 102、自定义类型二
// 103、自定义类型三
// 104、自定义类型四
// 105、自定义类型五
// 106、自定义类型六
// 107、自定义类型七
// 108、自定义类型八
// 109、自定义类型九
// 110、自定义类型十
// (与ERP中自定义类型的映射关系,点击链接查看)
private Integer tradeType;
// 发货条件:
// 1、款到发货
// 2、货到付款(包含部分货到付款)
// 3、分期付款
// 4、挂账
private Integer deliveryTerm;
// 京东几环(淘宝模糊化后的买家昵称)
private String receiverRing;
// 冻结原因
private String freezeReason;
// 退款状态:
// 0、无退款
// 1、申请退款
// 2、部分退款
// 3、全部退款
private Integer refundStatus;
// 分销类别:
// 0、非分销订单
// 1、代销
// 2、经销
private Integer fenxiaoType;
// 分销商昵称
private String fenxiaoNick;
// 下单时间(毫秒级时间戳,例如:1631861379000)
private String tradeTime;
// 付款时间,例如:2020-10-19 00:00:00
private String payTime;
// 发货时间,订单未发货不返回该字段(毫秒级时间戳,例如:1631861379000)
private Date consignTime;
// 客户网名(淘宝ouid,淘系平台不返回), (仅自有平台及线下平台返回,其他平台均不返回)
private String buyerNick;
// 收货人/收件人, (仅自有平台及线下平台返回,其他平台均不返回)
private String receiverName;
// 省份id,可参考城市代码表
private Integer receiverProvince;
// 城市id,可参考城市代码表
private Integer receiverCity;
// 地区id,可参考城市代码表
private Integer receiverDistrict;
// 收件人地址, (仅自有平台及线下平台返回,其他平台均不返回)
private String receiverAddress;
// 手机,(仅自有平台及线下平台返回,其他平台均不返回)
private String receiverMobile;
// 固话, (仅自有平台及线下平台返回,其他平台均不返回)
private String receiverTelno;
// 邮编
private String receiverZip;
// 地区
private String receiverArea;
// 大头笔
private String receiverDtb;
// 异常订单原因(位运算):
// 2、修改地址
// 4、修改发票
// 8、更换仓库
// 16、修改备注
// 32、更换货品
// 128、拦截赠品
// 256、拦截换货
// 512、买家留言变化
// 1024、拦截平台已发货
private Integer badReason;
// 物流单号
private String logisticsNo;
// 买家留言
private String buyerMessage;
// 客服备注
private String csRemark;
// 标旗(1 红、2 黄、3 绿、4 蓝、5 紫 )
private Integer remarkFlag;
// 打印备注
private String printRemark;
// 货品种类数
private BigDecimal goodsTypeCount;
// 货品总量
private BigDecimal goodsCount;
// 总货款(折前总额)
private BigDecimal goodsAmount;
// 邮费(买家支付邮费)
private BigDecimal postAmount;
// 其他费用
private BigDecimal otherAmount;
// 优惠
private BigDecimal discount;
// 应收
private BigDecimal receivable;
// COD金额(货到付款金额)
private BigDecimal codAmount;
// 买家COD费用
private BigDecimal extCodFee;
// 货品预估成本
private BigDecimal goodsCost;
// 预估邮资成本
private BigDecimal postCost;
// 预估重量(kg)
private BigDecimal weight;
// 预估毛利
private BigDecimal profit;
// 税额
private BigDecimal tax;
// 税率
private BigDecimal taxRate;
// 佣金
private BigDecimal commission;
// 发票类型:
// 0:不需要
// 1:普通发票
// 2:增值税普通发票
// 3:增值税专用发票
private Integer invoiceType;
// 发票抬头
private String invoiceTitle;
// 发票内容
private String invoiceContent;
// 业务员
private String salesmanName;
// 审核人
private String checkerName;
// 财审人
private String fcheckerName;
// 签出人
private String checkouterName;
// 出库单号(系统产生的出库单号)
private String stockoutNo;
// 标记名称
private String flagName;
// 订单来源:
// 1、API抓单
// 2、手工建单
// 3、导入
// 4、复制订单
// 5、接口推送
// 6、补发订单
// 7、PDA选货开单
// 8、分销补发订单
private Integer tradeFrom;
// 货品商家编码,多种货品为空,组合装时为组合装编码
private String singleSpecNo;
// 原始货品数量
private BigDecimal rawGoodsCount;
// 原始货品种类数
private Integer rawGoodsTypeCount;
// 币种
private String currency;
// 发票ID(自增生成),0代表没有发票或已取消/已冲红
private Integer invoiceId;
// 版本号
private Integer versionId;
// 修改时间,例如:2020-10-19 00:00:00
private Date modified;
// 递交时间(毫秒级时间戳,例如:1631861379000)
private String created;
// 审核时间
private String checkTime;
// 证件类别
private Integer id_cardType;
// 店铺编号
private String shopNo;
// 店铺名称
private String shopName;
// 店铺备注
private String shopRemark;
// 仓库编号,如订单无仓库的话,则不返回该字段
private String warehouseNo;
// 客户姓名
private String customerName;
// 客户编码
private String customerNo;
// 物流公司名称
private String logisticsName;
// 物流公司编号
private String logisticsCode;
// 物流类型名称
private String logisticsTypeName;
// 送货时间,例如:2020-10-19 00:00:00
private String toDeliverTime;
// 计划发货时间
private String delayToTime;
// 最晚发货时间
private String estimateConsignTime;
// 店铺id
private Integer shopId;
// 仓库id
private Integer warehouseId;
// 体积
private BigDecimal volume;
// 订单标签
private String tradeLabel;
// 订单掩码
// 1:使用智选物流
// 2:货品标签
// 4:预订单自动激活失败
// 16:订单货品指定批次
// 32:平台自动流转仓库
// 64:部分发货
// 128:全部发货
// 256:优先占用
// 512:待分配转审核失败或订单审核失败
// 1024:催未付款订单短信发送标记
// 2048:拆分
// 在判断的时候使用&运算
private Integer tradeMask;
// 店铺平台id
private Integer shopPlatformId;
// 子平台id
private Integer subPlatformId;
// 包装
private String packageName;
// 包装id
private Integer packageId;
// 包装成本
private BigDecimal packageCost;
// 已付
private BigDecimal paid;
// 大件类型
// 1:普通套件
// 2:独立套件
// 3:分组单发,未使用
// -1:非单发件 取子单中的最大值
private Integer largeType;
// 赠品标记
// 1:自动赠送
// 2:手工赠送
// 4:回购赠送
// 8:平台赠送
// (注意:如果是3,则表示既有自动赠送也有手工赠送“1+2”)
private Integer giftMask;
// 客户id
private Integer customerId;
// 其他成本
private BigDecimal otherCost;
// 不可合并拆分
private boolean isSealed;
// 客户类型(0:普通客户;1:分销商;2:线下批发)
private Integer customerType;
// 物流公司id
private Integer logisticsId;
// 取消原因
private String cancelReason;
// 驳回原因
private String revertReason;
// 订单标签mask
private String newTradeLabel;
// 分销原始单号(无长度限制)
private String fenxiaoTid;
// 批次号
private String batchNo;
// 采集开始时间
private Date startTime;
// 采集结束时间
private Date endTime;
// 同步类型,接口为1手动同步,0 xxljob自动同步,
private Integer syncType;
// 订单明细
@TableField(exist = false)
private List<FinanceOrderDetail> detailList;
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sfa.common.core.web.domain.BaseDo;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 旺店通订单明细表 wangdiantong_order_detail
*/
@TableName(value = "finance_order_detail")
@Data
public class FinanceOrderDetail extends BaseDo {
// 订单唯一键
private Long tradeId;
// 订单明细唯一键
@TableId(type = IdType.NONE)
private Long recId;
// 平台ID
private Integer platformId;
// 原始子单号
private String srcOid;
// 原始单号
private String srcTid;
// 赠品方式 0、非赠品
// 1、自动赠送 2、手工赠送 4、周期购赠送 8、平台赠送 32、阶梯满赠 64、CRM追加赠送 128 主品
private Integer giftType;
// 0:未付款 1:部分付款 2:已付款(原始订单的支付状态)
private Integer payStatus;
// 退款状态:
// 0、无退款
// 1、取消退款
// 2、申请退款
// 3、待退款
// 4、待还原
// 5、退款成功
// 6、已退(未付款关闭,未付款的取消了)
private Integer refundStatus;
// 退款模式:
// 1、担保
// 2、非担保
// 3、在线非担保
private Integer guaranteeMode;
// 如果没有对应的原始单明细,则返回0.
// 平台状态:
// 10、未确认
// 20、待尾款
// 30、待发货
// 40、部分发货
// 50、已发货
// 60、已签收
// 70、已完成
// 80、已退款
// 90、已关闭
private Integer platformStatus;
// 发货条件:1、款到发货 2、货到付款(包含部分货到付款)
// 3、分期付款
private Integer deliveryTerm;
// 数量
private BigDecimal num;
// 标价,手工新建时使用货品属性中的“零售价”
private BigDecimal price;
// 售后退款数量
private BigDecimal refundNum;
// 成交价,原始单折扣及分摊之后的价格
private BigDecimal orderPrice;
// 分摊后价格,进入ERP后再次调整的价格,默认值与order_price一致
private BigDecimal sharePrice;
// 手工调整价,正数为加价,负数为减价,暂未处理
private BigDecimal adjust;
// 优惠
private BigDecimal discount;
// 分摊后总价=share_price*num
private BigDecimal shareAmount;
// 税率
private BigDecimal taxRate;
// 货品名称
private String goodsName;
// 货品编号
private String goodsNo;
// 规格名称
private String specName;
// 商家编码
private String specNo;
// 规格码
private String specCode;
// 组合装编码
private String suiteNo;
// 如果是组合装拆分的,此为组合装名称
private String suiteName;
// 组合装数量,不受拆分合并影响
private BigDecimal suiteNum;
// 组合装分摊后总价
private BigDecimal suiteAmount;
// 组合装优惠
private BigDecimal suiteDiscount;
// 平台货品名称
private String apiGoodsName;
// 平台规格名称
private String apiSpecName;
// 平台货品id
private String apiGoodsId;
// 平台规格id
private String apiSpecId;
// 货品id(系统货品主键)
private Integer goodsId;
// 单品id(系统单品主键)
private Integer specId;
// 佣金
private BigDecimal commission;
// 货品类型
// 1销售商品
// 2原材料
// 3包装
// 4周转材料
// 5虚拟商品
// 6固定资产
// 0其它
private Integer goodsType;
// 订单内部来源:
// 0:无来源
// 1:手机
// 2:聚划算
// 32:开具电子发票
// 2048:当日达
// 4096:次日达
// 8192:承诺时效
// 2097152:区域零售
// 4194304:拼多多厂家代打
// 8388608:周期购
// 1048576:预售单
// 33554432:前N有礼
// 524288:天猫物流升级
// 64:按需配送
// 256:承诺结构化/QIC
// 16384:商仓鸟配
private Integer fromMask;
// 子单备注
private String remark;
// 修改时间(毫秒级时间戳,例如:1631861379000)
private String modified;
// 创建时间(毫秒级时间戳,例如:1631861379000)
private String created;
// 自定义属性1
private String prop1;
// 自定义属性2
private String prop2;
// 货品重量(子单预估货品总重量)
private BigDecimal weight;
// 图片路径
private String imgUrl;
// 实发数量(此数量为发货数量,删除操作等于将此值设置为0)
private BigDecimal actualNum;
// 条码
private String barcode;
// 已付
private BigDecimal paid;
// 组合装id
private Integer suiteId;
// bind_oid
private String bindOid;
// 打印组合装
// 0:组合装明细
// 1:组合装及明细
// 2:组合装
private Integer printSuiteMode;
// 1:天猫物流升级-顺丰配送
// 2:需要回传
// 4:天猫物流升级-按需配送
// 8:天猫物流升级-承诺发货时效
// 16:天猫物流升级-承诺达时效
// 32:天猫物流升级-预售下沉
// 64:天猫物流升级-预计到货时效
// 128:天猫物流升级-配送线路异常
// 1024:定金链接
// 2048:补款链接
// 4096:确认收货
// (mask类型值. 在判断的时候使用&运算)
private Integer flag;
// 库存保留情况
// 0:未保留(取消的订单或完成)
// 1:无库存记录
// 2:未付款
// 3:已保留待审核
// 4:待发货
// 5:预订单库存
private Integer stockState;
// 平台已发货
private boolean isConsigned;
// 是否付款
private Integer isReceived;
// 平台类目主键
private Integer cid;
// 最后更新时间,DateTime格式
private Date modifiedDate;
// 创建时间,DateTime格式
private String createdDate;
// 分摊邮费
private BigDecimal sharePostPrice;
// 发票内容
private String invoiceContent;
// 支付时间,DateTime格式,取自原始订单支付时间
private Date payTime;
// 货品简称
private String shortName;
// 分销商昵称
private String fenxiaoNick;
// 分销商id
private String fenxiaoId;
// 分销商name
private String fenxiaoName;
// 批次号
private String batchNo;
// 采集开始时间
private Date startTime;
// 采集结束时间
private Date endTime;
// 2025年01月13日新增字段
private String tradeNo;
// 店铺编号
private String shopNo;
// 店铺名称
private String shopName;
// 店铺备注
private String shopRemark;
// 交易状态
private Integer tradeStatus;
// 交易时间
private String tradeTime;
// 发货时间,订单未发货不返回该字段(毫秒级时间戳,例如:1631861379000)
private Date consignTime;
// 收货地区
private String receiverArea;
// 主播名称--来自备注字段
private String zbjName;
// 主播ID--来自备注字段
private String zbjId;
// 主播直播ID--来自备注字段
private String zbjZbId;
// 主播销售类型--来自备注字段
private String zbjSaleType;
// 主播渠道类型--来自备注字段
private String zbjQdType;
// 应收金额
private BigDecimal receivable;
// ERP规格名称 --来自T100的定义
private String specNameErp;
// ERP口味 --来自T100的定义
private String flavorErp;
// 同步类型,接口为1手动同步,0 xxljob自动同步,
private Integer syncType;
// 实际成本
private BigDecimal actualCost;
// 标准成本
private BigDecimal standardCost;
@TableField(exist = false)
private BigDecimal shareAmountSum;
@TableField(exist = false)
private BigDecimal actualCostSum;
@TableField(exist = false)
private BigDecimal standardCostSum;
@TableField(exist = false)
private BigDecimal shareAmountDiffSum;
@TableField(exist = false)
private String queryType;
// 系列
private String series;
/**
* 是否删除标志0未删除1已删除
*/
private String delFlag;
public String getFenxiaoId(FinanceOrder order, Long tradeId) {
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(order.getFenxiaoNick())) {
String id = extractDistributorId(order.getFenxiaoNick());
return id;
}
return "";
}
/**
* 从输入字符串中提取分销商 ID
*
* @param input 包含分销商 ID 的字符串
* @return 提取出的分销商 ID,如果未找到则返回空字符串
*/
public String extractDistributorId(String input) {
// 使用正则表达式匹配id
Pattern pattern = Pattern.compile("id:(\\d+);");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
public String extractDistributorName(String input) {
// 使用正则表达式匹配逗号后面的字符
Pattern pattern = Pattern.compile(";(.*)】");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
/**
* 根据订单和交易 ID 获取分销商名称
*
* @param order 订单
* @param tradeId 交易 ID
* @return 分销商名称,如果未找到则返回空字符串
*/
public String getFenxiaoName(FinanceOrder order, Long tradeId) {
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(order.getFenxiaoNick())) {
String id = extractDistributorName(order.getFenxiaoNick());
return id;
}
return "";
}
public String getFenxiaoNick(FinanceOrder order) {
return order.getFenxiaoNick();
}
public String extractByRegex(String input, String regex) {
// 使用正则表达式匹配逗号后面的字符
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
public String getZbjName(String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjName())) {
return sameDetail.getZbjName();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("直播")) {
return extractByRegex(remark, "“【直播】”([^;;]*)");
}
return null;
}
public String getZbjId(String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjId())) {
return sameDetail.getZbjId();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("直播间id")) {
return extractByRegex(remark, "直播间id:([^;;]\\d+)");
}
return null;
}
/**
* 根据分销商和remark备注信息获取主播Id
* @param fenxiaoId
* @param remark
* @param sameDetail
* @return
*/
public String getZbjZbId(String fenxiaoId, String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(fenxiaoId)) {
return fenxiaoId;
}
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjZbId())) {
return sameDetail.getZbjZbId();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("主播id")) {
return extractByRegex(remark, "主播id:([^;;]\\d+)");
}
return null;
}
public String getZbjSaleType(String remark, FinanceOrderDetail sameDetail) {
if (ObjectUtils.isNotEmpty(sameDetail) && ObjectUtils.isNotEmpty(sameDetail.getZbjSaleType())) {
return sameDetail.getZbjSaleType();
}
// 如果不为空,解析出
if (ObjectUtils.isNotEmpty(remark) && remark.contains("销售类型:")) {
return extractByRegex(remark, "销售类型:([^;;]*);");
}
return null;
}
public String getZbjQdType(String fenxiaoId, String zbjZbId, Map<String, String> baseZbjType) {
if (ObjectUtils.isNotEmpty(fenxiaoId)) {
zbjZbId = fenxiaoId;
}
String zbjType = baseZbjType.get(zbjZbId);
if (ObjectUtils.isNotEmpty(zbjZbId) && ObjectUtils.isEmpty(zbjType)) {
return baseZbjType.get("其他分销名称");
}
return zbjType;
}
}
package com.sfa.job.domain.order.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 商品-管理表
* @TableName pro_info
*/
@TableName(value ="prd_info")
@Data
public class PrdInfo implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Integer prdId;
/**
* 商品编码
*/
private String prdCode;
/**
* 商品名称
*/
private String prdName;
/**
* 商品系列
*/
private Integer seriesId;
/**
* 商品系列
*/
private String series;
/**
* 商品规格-69码
*/
private String prdSpec;
/**
* 销售状态:1:在售,0:停售
*/
private Integer saleStatus;
/**
* 0:正常;1:删除
*/
private Integer status;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.CollectErrorInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CollectErrorInfoMapper extends BaseMapper<CollectErrorInfo> {
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.CollectOrderLogInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CollectOrderLogInfoMapper extends BaseMapper<CollectOrderLogInfo> {
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.FinanceBaseProduct;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceBaseProductMapper extends BaseMapper<FinanceBaseProduct> {
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.FinanceBaseZbjType;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceBaseZbjTypeMapper extends BaseMapper<FinanceBaseZbjType> {
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceOrderDetailMapper extends BaseMapper<FinanceOrderDetail> {
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.FinanceOrder;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FinanceOrderMapper extends BaseMapper<FinanceOrder> {
}
package com.sfa.job.domain.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sfa.job.domain.order.entity.PrdInfo;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @author a02200059
* @description 针对表【prd_info(商品-管理表)】的数据库操作Mapper
* @createDate 2024-11-22 16:48:35
* @Entity com.link.bi.domain.entity.PrdInfo
*/
@Repository
@Mapper
public interface PrdInfoMapper extends BaseMapper<PrdInfo> {
}
package com.sfa.job.pojo.response;
import com.sfa.job.domain.order.entity.FinanceOrder;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 财务同步旺店通返回数据Dto
*/
@Data
public class FinanceSyncOrderDetailDto {
private Integer orderCount;
private Integer orderDetailCount;
private List<FinanceOrder> orders;
private List<FinanceOrderDetail> orderDetails;
private Date startTime;
private Date endTime;
private Integer syncType;
private String batchNo;
}
package com.sfa.job.service.order;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sfa.job.domain.order.entity.FinanceBaseProduct;
import java.util.Map;
public interface FinanceBaseProductService extends IService<FinanceBaseProduct> {
Map<String, FinanceBaseProduct> selectBaseProduct();
}
package com.sfa.job.service.order;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sfa.job.domain.order.entity.FinanceBaseZbjType;
import java.util.Map;
public interface FinanceBaseZbjTypeService extends IService<FinanceBaseZbjType> {
Map<String,String> selectBaseZbjType();
}
package com.sfa.job.service.order;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
public interface FinanceOrderDetailService extends IService<FinanceOrderDetail> {
}
......@@ -2,8 +2,8 @@ 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 com.sfa.job.domain.order.entity.FinanceOrder;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import java.util.Date;
......
package com.sfa.job.service.order.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sfa.job.domain.order.entity.FinanceBaseProduct;
import com.sfa.job.domain.order.mapper.FinanceBaseProductMapper;
import com.sfa.job.service.order.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.sfa.job.service.order.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sfa.job.domain.order.entity.FinanceOrderDetail;
import com.sfa.job.domain.order.mapper.FinanceOrderDetailMapper;
import com.sfa.job.service.order.FinanceOrderDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 旺店通订单明细Service业务层处理
*
* @author lvbencai
* @date 2025年01月07日17:00:16
*/
// 指定不同的数据源
//@DS("bi")
@Slf4j
@Service
public class FinanceOrderDetailServiceImpl extends ServiceImpl<FinanceOrderDetailMapper, FinanceOrderDetail> implements FinanceOrderDetailService {
}
package com.sfa.job.service.order.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONReader;
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.domain.order.dao.CollectErrorInfoDao;
import com.sfa.job.domain.order.dao.CollectOrderLogInfoDao;
import com.sfa.job.domain.order.dao.IProductDao;
import com.sfa.job.domain.order.entity.*;
import com.sfa.job.domain.order.mapper.FinanceOrderMapper;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.service.order.FinanceBaseProductService;
import com.sfa.job.service.order.FinanceBaseZbjTypeService;
import com.sfa.job.service.order.FinanceOrderDetailService;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.sfa.job.util.WangdiantongUtil;
import com.xxl.job.core.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -31,8 +37,6 @@ import java.util.*;
@Slf4j
@Service
public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper, FinanceOrder> implements FinanceOrderSyncService {
@Autowired
IFinanceOrderDao orderDao;
@Autowired
WangdiantongUtil wangdiantongUtil;
......@@ -43,9 +47,11 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
@Autowired
FinanceBaseZbjTypeService baseZbjTypeService;
@Autowired
CollectOrderLogInfoService collectOrderLogInfoService;
CollectOrderLogInfoDao orderLogInfoDao;
@Autowired
CollectErrorInfoDao errorInfoDao;
@Autowired
IProductService productService;
IProductDao productDao;
/**
* 多线程调用此方法
* @param startTime
......@@ -59,33 +65,49 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
try {
if (ObjectUtils.isEmpty(startTime)) {
// 查询最新的采集时间
Date date = collectOrderLogInfoService.selectLatest(syncType);
Date date = orderLogInfoDao.selectOrderSyncLatest(syncType);
if (ObjectUtils.isNotEmpty(date)) {
startTime = date;
} else {
// 默认上个月的第一天 00:00:00
startTime = DateUtil.beginOfDay(DateUtil.beginOfMonth(DateUtil.lastMonth()));
startTime = cn.hutool.core.date.DateUtil.beginOfDay(cn.hutool.core.date.DateUtil.beginOfMonth(cn.hutool.core.date.DateUtil.lastMonth()));
}
// 调用查询旺店通接口api 获取最新日期前的一个小时
startTime = DateUtils.addMinutes(startTime, -3);
}else{
// 调用查询旺店通接口api 获取最新日期前的一个小时
Date currentLatest = DateUtils.addHours(new Date(), -2);
if (currentLatest.compareTo(startTime) < 0) {
throw new ServiceException("开始时间不能大于当前时间");
}
}
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)) {
JSONArray orderAllArray = wangdiantongUtil.queryWithDetail(startTime, endTime);
if (ObjectUtils.isEmpty(orderAllArray)) {
throw new ServiceException("旺店通没有查询到订单数据");
}
//转化成orderList
// List<FinanceOrder> orders = orderAllArray.toJavaList(FinanceOrder.class);
List<FinanceOrder> orders = JSONArray.parseArray(orderAllArray.toString(), FinanceOrder.class, JSONReader.Feature.SupportSmartMatch);
// 基础数据 直播间分类数据+成本、规格、口味
Map<String, FinanceBaseProduct> baseProductMap = baseProductService.selectBaseProduct();
Map<String, String> baseZbjType = baseZbjTypeService.selectBaseZbjType();
// 系列
Map<String, String> prodSeries = productService.selectProdSeries();
List<PrdInfo> prdInfos = productDao.selectProdSeries();
// 转换成map
Map<String, String> prodSeriesMap = new HashMap<>();
prdInfos.stream().forEach(prdInfo -> {
prodSeriesMap.put(prdInfo.getPrdCode(), prdInfo.getPrdName());
});
// 入库订单表
log.info("开始插入订单数据,数量:{}", orders.size());
log.info("开始插入订单数据,数量:{}", orderAllArray.size());
Date finalStartTime = startTime;
Date finalEndTime = endTime;
orders.forEach(order -> {
......@@ -103,8 +125,8 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
// 入库订单明细表
for (FinanceOrder order : orders) {
List<FinanceOrderDetail> orderDetails = order.getDetailList();
orderDetails.forEach(orderDetail -> {
orderDetail.setSeries(prodSeries.get(orderDetail.getGoodsNo()));
for (FinanceOrderDetail orderDetail : orderDetails) {
orderDetail.setSeries(prodSeriesMap.get(orderDetail.getGoodsNo()));
orderDetail.setTradeStatus(order.getTradeStatus());
orderDetail.setShopNo(order.getShopNo());
......@@ -137,9 +159,9 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
}
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));
});
orderDetail.setActualCost(ObjectUtils.isNotEmpty(baseProductMap.get(orderDetail.getGoodsNo())) ? baseProductMap.get(orderDetail.getGoodsNo()).getActualCost() : order.getGoodsCost().divide( order.getGoodsTypeCount()).setScale(4, BigDecimal.ROUND_HALF_UP));
orderDetail.setStandardCost(ObjectUtils.isNotEmpty(baseProductMap.get(orderDetail.getGoodsNo())) ? baseProductMap.get(orderDetail.getGoodsNo()).getStandardCost() : order.getGoodsCost().divide( order.getGoodsTypeCount()).setScale(4, BigDecimal.ROUND_HALF_UP));
}
mergeList.addAll(orderDetails);
}
log.info("开始插入订单详情数据,数量:{}", mergeList.size());
......@@ -154,7 +176,7 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
detailDto.setEndTime(endTime);
detailDto.setBatchNo(batchNo);
log.info("完成插入订单和订单详情数据,开始时间{},结束时间{},订单数量:{},详情数量:{}", DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), orders.size(), mergeList.size());
log.info("插入订单和订单详情完成,批次{}开始时间{},结束时间{},订单数量:{},详情数量:{}",batchNo, DateUtil.formatDateTime(startTime), DateUtil.formatDateTime(endTime), orders.size(), mergeList.size());
CollectOrderLogInfo collectOrderLogInfo = new CollectOrderLogInfo();
collectOrderLogInfo.setSyncType(syncType);
......@@ -162,7 +184,7 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
collectOrderLogInfo.setOrderDetailCount(mergeList.size());
collectOrderLogInfo.setBatchNo(batchNo);
collectOrderLogInfo.setLatestTime(endTime);
collectOrderLogInfoService.save(collectOrderLogInfo);
orderLogInfoDao.insert(collectOrderLogInfo);
} catch (Exception e) {
log.error(e.getMessage(), e);
// 记录错误日志表 collect_error_info
......@@ -173,8 +195,7 @@ public class FinanceOrderSyncServiceImpl extends ServiceImpl<FinanceOrderMapper,
errorInfo.setEndTime(endTime);
errorInfo.setStartTime(startTime);
errorInfo.setCollectTime(new Date());
// ????
errorInfoDao.insert(errorInfo);
throw e;
}
return detailDto;
......
......@@ -2,17 +2,18 @@ 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.*;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Component
......@@ -21,9 +22,9 @@ public class WangdiantongUtil {
/**
* 卖家账号/接口账号/盐/接口名称
*/
public List<FinanceOrder> queryWithDetail(Date startTime, Date endTime) {
List<FinanceOrder> orderAllList = new ArrayList<>();
public JSONArray queryWithDetail(Date startTime, Date endTime) {
// List<FinanceOrder> orderAllList = new ArrayList<>();
JSONArray allArray = new JSONArray();
try {
int total = 0;
int size = 0;
......@@ -78,22 +79,19 @@ public class WangdiantongUtil {
throw new ServiceException("访问旺店通接口错误"+messageJson.toString());
}
Integer totalCount = dataR.getInteger("total_count");
JSONArray order = dataR.getJSONArray("order");
JSONArray orderJsonArray = 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();
allArray.addAll(orderJsonArray);
size = allArray.size();
page_no ++;
log.info("当前时间段{}-{},查询返回的order条数:{},总条数totalCount:{},page_no:{}", DateUtils.format(startTime),DateUtils.format(endTime), orderJsonArray.size(),totalCount,page_no);
} while ( size < total);
return orderAllList;
return allArray;
} catch (Exception e) {
// 记录异常日志
log.error("异常信息:{}"+e.getMessage(),e);
return orderAllList;
return allArray;
}
}
}
package com.sfa.job.xxljob.order;
import cn.hutool.core.date.DateUtil;
import com.link.bi.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.pojo.response.FinanceSyncOrderDetailDto;
import com.sfa.job.service.order.FinanceOrderSyncService;
import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.handler.annotation.XxlJob;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论