提交 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.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.link.bi.domain.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;
// 分销商id
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;
/** 是否删除标志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;
}
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.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;
}
}
}
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.link.bi.domain.mapper.FinanceOrderDetailMapper">
<!-- 根据 聚合类型和值 查询聚合记录 -->
<select id="selectBiFinanceCostList" resultMap="BaseResultMap">
select
<if test="wq.zbjDdType!= null and wq.zbjDdType!= '' ">
zbj_qd_type,
</if>
<if test="wq.goodsName!= null and wq.goodsName!= '' ">
goods_no,goods_name,
</if>
<if test="wq.specName!= null and wq.specName!= '' ">
spec_name_erp,
</if>
<if test="wq.flavor!= null and wq.flavor!= '' ">
flavor_erp,
</if>
<if test="wq.series!= null and wq.series!= '' ">
series,
</if>
sum(share_amount) as share_amount_sum,
sum(actual_cost) as actual_cost_sum,
sum(standard_cost) as standard_cost_sum
from finance_order_detail fod
<where>
<if test="wq.zbjDdType!= null and wq.zbjDdType!= '' ">
and fod.zbj_qd_type= #{wq.zbjDdType}
</if>
<if test="wq.goodsName!= null and wq.goodsName!= '' ">
and fod.goods_name like concat('%', #{wq.goodsName}, '%')
</if>
<if test="wq.specName!= null and wq.specName!= '' ">
and fod.spec_name_erp= #{wq.specName}
</if>
<if test="wq.flavor!= null and wq.flavor!= '' ">
and fod.flavor_erp= #{wq.flavor}
</if>
<if test="wq.series!= null and wq.series!= '' ">
and fod.series= #{wq.series}
</if>
</where>
<if test="wq.zbjDdType!= null and wq.zbjDdType!= '' ">
group by zbj_qd_type
</if>
<if test="wq.goodsName!= null and wq.goodsName!= '' ">
group by goods_no ,goods_name
</if>
<if test="wq.specName!= null and wq.specName!= '' ">
group by spec_name_erp
</if>
<if test="wq.flavor!= null and wq.flavor!= '' ">
group by flavor_erp
</if>
<if test="wq.series!= null and wq.series!= '' ">
group by series
</if>
</select>
<!-- 根据 类型和聚合的值 查询详情记录 -->
<select id="selectBiFinanceCostDetailList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from finance_order_detail fod
<where>
<if test="wq.zbjDdType!= null and wq.zbjDdType!= '' ">
and fod.zbj_qd_type= #{wq.zbjDdType}
</if>
<if test="wq.goodsName!= null and wq.goodsName!= '' ">
and fod.goods_name like concat('%', #{wq.goodsName}, '%')
</if>
<if test="wq.specName!= null and wq.specName!= '' ">
and fod.spec_name_erp= #{wq.specName}
</if>
<if test="wq.flavor!= null and wq.flavor!= '' ">
and fod.flavor_erp= #{wq.flavor}
</if>
<if test="wq.series!= null and wq.series!= '' ">
and fod.series= #{wq.series}
</if>
</where>
</select>
<!-- 根据 rec_id 查询单条记录 -->
<select id="selectByRecId" resultMap="BaseResultMap">
select trade_no,
trade_id,
rec_id,
platform_id,
src_oid,
src_tid,
gift_type,
pay_status,
refund_status,
guarantee_mode,
platform_status,
delivery_term,
num,
price,
refund_num,
order_price,
share_price,
adjust,
discount,
share_amount,
tax_rate,
goods_name,
goods_no,
spec_name,
spec_no,
spec_code,
suite_no,
suite_name,
suite_num,
suite_amount,
suite_discount,
api_goods_name,
api_spec_name,
api_goods_id,
api_spec_id,
goods_id,
spec_id,
commission,
goods_type,
from_mask,
remark,
modified,
created,
prop1,
prop2,
weight,
img_url,
actual_num,
barcode,
paid,
suite_id,
bind_oid,
print_suite_mode,
flag,
stock_state,
is_consigned,
is_received,
cid,
modified_date,
created_date,
share_post_price,
invoice_content,
pay_time,
short_name,
fenxiao_nick,
fenxiao_id,
fenxiao_name,
batch_no,
del_flag,
create_by,
create_user_id,
create_time,
update_by,
update_user_id,
update_time,
start_time,
end_time,
shop_no,
shop_name,
shop_remark,
trade_status,
trade_time,
consign_time,
receiver_area,
zbj_name,
zbj_id,
zbj_zb_id,
zbj_sale_type,
zbj_qd_type,
receivable,
spec_name_erp,
flavor_erp,
sync_type,
actual_cost,
standard_cost
from finance_order_detail
where rec_id = #{recId}
</select>
<!-- 根据 rec_id 删除记录 -->
<delete id="deleteByRecId" parameterType="java.lang.Long">
delete
from finance_order_detail
where rec_id = #{recId}
</delete>
<sql id="Base_Column_List">
trade_no
,shop_name,src_tid,src_oid,trade_status,trade_time,pay_time,consign_time,receiver_area,
remark,receivable,goods_no,goods_name,spec_name,goods_type,num,discount,share_amount,suite_no,
suite_name,suite_num,gift_type,fenxiao_name,fenxiao_id,api_goods_name
</sql>
<!-- 通用查询结果映射 -->
<resultMap id="BaseResultMap" type="com.link.bi.domain.entity.FinanceOrderDetail">
<id column="rec_id" property="recId" jdbcType="BIGINT"/>
<result column="trade_no" property="tradeNo" jdbcType="VARCHAR"/>
<result column="trade_id" property="tradeId" jdbcType="BIGINT"/>
<result column="platform_id" property="platformId" jdbcType="INTEGER"/>
<result column="src_oid" property="srcOid" jdbcType="VARCHAR"/>
<result column="src_tid" property="srcTid" jdbcType="VARCHAR"/>
<result column="gift_type" property="giftType" jdbcType="INTEGER"/>
<result column="pay_status" property="payStatus" jdbcType="INTEGER"/>
<result column="refund_status" property="refundStatus" jdbcType="INTEGER"/>
<result column="guarantee_mode" property="guaranteeMode" jdbcType="INTEGER"/>
<result column="platform_status" property="platformStatus" jdbcType="INTEGER"/>
<result column="delivery_term" property="deliveryTerm" jdbcType="INTEGER"/>
<result column="num" property="num" jdbcType="DECIMAL"/>
<result column="price" property="price" jdbcType="DECIMAL"/>
<result column="refund_num" property="refundNum" jdbcType="DECIMAL"/>
<result column="order_price" property="orderPrice" jdbcType="DECIMAL"/>
<result column="share_price" property="sharePrice" jdbcType="DECIMAL"/>
<result column="adjust" property="adjust" jdbcType="DECIMAL"/>
<result column="discount" property="discount" jdbcType="DECIMAL"/>
<result column="share_amount" property="shareAmount" jdbcType="DECIMAL"/>
<result column="tax_rate" property="taxRate" jdbcType="DECIMAL"/>
<result column="goods_name" property="goodsName" jdbcType="VARCHAR"/>
<result column="goods_no" property="goodsNo" jdbcType="VARCHAR"/>
<result column="spec_name" property="specName" jdbcType="VARCHAR"/>
<result column="spec_no" property="specNo" jdbcType="VARCHAR"/>
<result column="spec_code" property="specCode" jdbcType="VARCHAR"/>
<result column="suite_no" property="suiteNo" jdbcType="VARCHAR"/>
<result column="suite_name" property="suiteName" jdbcType="VARCHAR"/>
<result column="suite_num" property="suiteNum" jdbcType="DECIMAL"/>
<result column="suite_amount" property="suiteAmount" jdbcType="DECIMAL"/>
<result column="suite_discount" property="suiteDiscount" jdbcType="DECIMAL"/>
<result column="api_goods_name" property="apiGoodsName" jdbcType="VARCHAR"/>
<result column="api_spec_name" property="apiSpecName" jdbcType="VARCHAR"/>
<result column="api_goods_id" property="apiGoodsId" jdbcType="VARCHAR"/>
<result column="api_spec_id" property="apiSpecId" jdbcType="VARCHAR"/>
<result column="goods_id" property="goodsId" jdbcType="INTEGER"/>
<result column="spec_id" property="specId" jdbcType="INTEGER"/>
<result column="commission" property="commission" jdbcType="DECIMAL"/>
<result column="goods_type" property="goodsType" jdbcType="INTEGER"/>
<result column="from_mask" property="fromMask" jdbcType="INTEGER"/>
<result column="remark" property="remark" jdbcType="VARCHAR"/>
<result column="modified" property="modified" jdbcType="VARCHAR"/>
<result column="created" property="created" jdbcType="VARCHAR"/>
<result column="prop1" property="prop1" jdbcType="VARCHAR"/>
<result column="prop2" property="prop2" jdbcType="VARCHAR"/>
<result column="weight" property="weight" jdbcType="DECIMAL"/>
<result column="actual_num" property="actualNum" jdbcType="DECIMAL"/>
<result column="barcode" property="barcode" jdbcType="VARCHAR"/>
<result column="paid" property="paid" jdbcType="DECIMAL"/>
<result column="suite_id" property="suiteId" jdbcType="INTEGER"/>
<result column="bind_oid" property="bindOid" jdbcType="VARCHAR"/>
<result column="print_suite_mode" property="printSuiteMode" jdbcType="INTEGER"/>
<result column="flag" property="flag" jdbcType="INTEGER"/>
<result column="stock_state" property="stockState" jdbcType="INTEGER"/>
<result column="is_consigned" property="isConsigned" jdbcType="TINYINT"/>
<result column="is_received" property="isReceived" jdbcType="INTEGER"/>
<result column="cid" property="cid" jdbcType="INTEGER"/>
<result column="modified_date" property="modifiedDate" jdbcType="VARCHAR"/>
<result column="created_date" property="createdDate" jdbcType="VARCHAR"/>
<result column="share_post_price" property="sharePostPrice" jdbcType="DECIMAL"/>
<result column="invoice_content" property="invoiceContent" jdbcType="VARCHAR"/>
<result column="pay_time" property="payTime" jdbcType="VARCHAR"/>
<result column="short_name" property="shortName" jdbcType="VARCHAR"/>
<result column="fenxiao_nick" property="fenxiaoNick" jdbcType="VARCHAR"/>
<result column="fenxiao_id" property="fenxiaoId" jdbcType="VARCHAR"/>
<result column="fenxiao_name" property="fenxiaoName" jdbcType="VARCHAR"/>
<result column="batch_no" property="batchNo" jdbcType="VARCHAR"/>
<result column="del_flag" property="delFlag" jdbcType="CHAR"/>
<result column="create_by" property="createBy" jdbcType="VARCHAR"/>
<result column="create_user_id" property="createUserId" jdbcType="BIGINT"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="update_by" property="updateBy" jdbcType="VARCHAR"/>
<result column="update_user_id" property="updateUserId" jdbcType="BIGINT"/>
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
<result column="start_time" property="startTime" jdbcType="TIMESTAMP"/>
<result column="end_time" property="endTime" jdbcType="TIMESTAMP"/>
<result column="shop_no" property="shopNo" jdbcType="VARCHAR"/>
<result column="shop_name" property="shopName" jdbcType="VARCHAR"/>
<result column="shop_remark" property="shopRemark" jdbcType="VARCHAR"/>
<result column="trade_status" property="tradeStatus" jdbcType="INTEGER"/>
<result column="trade_time" property="tradeTime" jdbcType="VARCHAR"/>
<result column="consign_time" property="consignTime" jdbcType="TIMESTAMP"/>
<result column="receiver_area" property="receiverArea" jdbcType="VARCHAR"/>
<result column="zbj_name" property="zbjName" jdbcType="VARCHAR"/>
<result column="zbj_id" property="zbjId" jdbcType="VARCHAR"/>
<result column="zbj_zb_id" property="zbjZbId" jdbcType="VARCHAR"/>
<result column="zbj_sale_type" property="zbjSaleType" jdbcType="VARCHAR"/>
<result column="zbj_qd_type" property="zbjQdType" jdbcType="VARCHAR"/>
<result column="receivable" property="receivable" jdbcType="DECIMAL"/>
<result column="spec_name_erp" property="specNameErp" jdbcType="VARCHAR"/>
<result column="flavor_erp" property="flavorErp" jdbcType="VARCHAR"/>
<result column="sync_type" property="syncType" jdbcType="TINYINT"/>
<result column="actual_cost" property="actualCost" jdbcType="DECIMAL"/>
<result column="standard_cost" property="standardCost" jdbcType="DECIMAL"/>
<result column="share_amount_sum" property="shareAmountSum" jdbcType="DECIMAL"/>
<result column="actual_cost_sum" property="actualCostSum" jdbcType="DECIMAL"/>
<result column="standard_cost_sum" property="standardCostSum" jdbcType="DECIMAL"/>
<result column="share_amount_diff_sum" property="shareAmountDiffSum" jdbcType="DECIMAL"/>
<result column="query_type" property="queryType" jdbcType="VARCHAR"/>
</resultMap>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论